HuggingFace Transformers 4.29 : Get Started : クイック・ツアー

HuggingFace Transformers 4.29 : Get Started : クイック・ツアー (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 05/21/2023 (v4.29.1)

* 本ページは、HuggingFace Transformers の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

クラスキャット 人工知能 研究開発支援サービス

クラスキャット は人工知能・テレワークに関する各種サービスを提供しています。お気軽にご相談ください :

◆ 人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。スケジュール
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

  • 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
  • sales-info@classcat.com  ;  Web: www.classcat.com  ;   ClassCatJP

 

HuggingFace Transformers 4.29 : Get Started : クイック・ツアー

Get up and running with Transformers! 貴方が開発者であろうとヘビーユーザであろうと、このクイックツアーは始めるのに役立ち、推論のために pipeline() を使う方法、AutoClass で事前訓練済みモデルとプリプロセッサをどのようにロードするか、そして PyTorch か TensorFlow でモデルをどのように素早く訓練するかを示します。あなたが初心者であるならば、ここで紹介されるコンセプトの詳細な說明のためにチュートリアルや コース を次に確認することを勧めます。

始める前に、すべての必要なライブラリがインストールされていることを確認してください :

!pip install transformers datasets

好みの機械学習フレームワークをインストールする必要もあります :

pip install torch

pip install tensorflow

 

パイプライン

pipeline() は推論用の事前訓練済みモデルを利用する最も簡単で早い方法です。様々なモダリティに渡る多くのタスクに対して pipeline() をそのまま利用できます、それらの幾つかは以下のテーブルで示されます :

利用可能なタスクの完全なリストについては、パイプライン API リファレンス を確認してください。

 

  • (パイプライン識別子) pipeline(task=“sentiment-analysis”) – (モダリティ) NLP – (タスク) テキスト分類 : 与えられたテキストのシークエンスにラベルを割り当てる

  • pipeline(task=“text-generation”) – NLP – テキスト生成 : プロンプトが与えられたときテキストを生成する

  • pipeline(task=“summarization”) – NLP – 要約 : テキストのシークエンスかドキュメントの要約を生成する

  • pipeline(task=“image-classification”) – コンピュータビジョン – 画像分類 : 画像にラベルを割り当てる

  • pipeline(task=“image-segmentation”) – コンピュータビジョン – 画像セグメンテーション : 画像の各個別のピクセルにラベルを割り当てる (セマンティック, パノラマ (panoptic), インスタンスセグメンテーションをサポート)

  • pipeline(task=“object-detection”) – コンピュータビジョン – 物体検出 : 画像のオブジェクトの境界ボックスとクラスを予測する

  • pipeline(task=“audio-classification”) – 音声 – 音声分類 : 音声データにラベルを割り当てる

  • pipeline(task=“automatic-speech-recognition”) – 音声 – 自動発話認識 : 発話をテキストに文字起こしする。

  • pipeline(task=“vqa”) – マルチモーダル – 視覚的質問応答 (Visual question answering) : 画像と質問が与えられたとき、画像について質問に答える

  • pipeline(task=“document-question-answering”) – マルチモーダル – 文書質問応答 : 画像と質問が与えられたとき、文書について質問に答える

  • pipeline(task=“image-to-text”) – マルチモーダル – 画像キャプショニング : 与えられた画像に対するキャプションを生成する

 
pipeline() のインスタンスを作成してそれをそのために使用したいタスクを指定することから始めましょう。このガイドでは、例としてセンチメント分析のために pipeline() を使用します :

from transformers import pipeline

classifier = pipeline("sentiment-analysis")

pipeline はセンチメント分析のためのデフォルトの事前訓練済みモデルとトークナイザーをダウンロードしてキャッシュします。そしてターゲットテキストで分類器を使用できます :

classifier("We are very happy to show you the 🤗 Transformers library.")
[{'label': 'POSITIVE', 'score': 0.9998}]

一つ以上の入力を持つ場合、入力をリストとして辞書のリストを返す pipeline() に渡します :

results = classifier(["We are very happy to show you the 🤗 Transformers library.", "We hope you don't hate it."])
for result in results:
    print(f"label: {result['label']}, with score: {round(result['score'], 4)}")
label: POSITIVE, with score: 0.9998
label: NEGATIVE, with score: 0.5309

pipeline() はまた貴方が好む任意のタスクについてデータセット全体に対してイテレートできます。
このサンプルのために、タスクとして自動発話認識を選択しましょう :

import torch
from transformers import pipeline

speech_recognizer = pipeline("automatic-speech-recognition", model="facebook/wav2vec2-base-960h") 

イテレートしたいデータセット (詳細は 🤗 Datasets クイックスタート 参照) をロードします。例えば、MInDS-14 データセットをロードしましょう :

from datasets import load_dataset, Audio

dataset = load_dataset("PolyAI/minds14", name="en-US", split="train")

データセットのサンプリングレートが facebook/wav2vec2-base-960h がその上で訓練されたサンプリングレートに一致していることを確かにする必要があります :

dataset = dataset.cast_column("audio", Audio(sampling_rate=speech_recognizer.feature_extractor.sampling_rate))

“audio” カラムを呼び出すとき音声ファイルは自動的にロードされて再サンプリングされます。最初の 4 つのサンプルから raw waveform 配列を抽出してそれをリストとしてパイプラインに渡します :

result = speech_recognizer(dataset[:4]["audio"])
print([d["text"] for d in result])

(音声やビジョンでのような) 入力が大きい大規模なデータセットについては、総ての入力をメモリにロードするリストの代わりに generator を渡すことを望むでしょう。詳細は パイプライン API リファレンス を見てください。

 

パイプラインで別のモデルとトークナイザーを利用する

pipeline() は ハブ から任意のモデルを供給できるので、他のユースケースに pipeline() を適応させることは簡単です。例えば、フランス語テキストを扱えるモデルを望む場合、適切なモデルに対してフィルタリングするためにハブでタグを使用します。フィルタリングされたトップの結果はセンチメント分析のために再調整されたマルチリンガル BERT モデル を返し、貴方はフランス語テキストのために利用できます :

model_name = "nlptown/bert-base-multilingual-uncased-sentiment"

 

事前訓練済みモデルと関連するトークナイザーをロードするために AutoModelForSequenceClassification と AutoTokenizer を使用します (AutoClass の詳細は次のセクション) :

from transformers import AutoTokenizer, AutoModelForSequenceClassification

model = AutoModelForSequenceClassification.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)

 

事前訓練済みモデルと関連するトークナイザーをロードするために TFAutoModelForSequenceClassification と AutoTokenizer を使用します (TFAutoClass の詳細は次のセクション) :

from transformers import AutoTokenizer, TFAutoModelForSequenceClassification

model = TFAutoModelForSequenceClassification.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)

 
そして pipeline() でモデルとトークナイザーを指定して、フランス語テキストに分類器を適用できます :

classifier = pipeline("sentiment-analysis", model=model, tokenizer=tokenizer)
classifier("Nous sommes très heureux de vous présenter la bibliothèque 🤗 Transformers.")
[{'label': '5 stars', 'score': 0.7273}]

貴方のユースケースのためのモデルを見つけられない場合、貴方のデータで事前訓練済みモデルを再調整する必要があります。その方法を学習するには 再調整チュートリアル を見てください。最後に、事前訓練済みモデルを再調整した後には、機械学習をすべての人に民主化するためにそのモデルをハブでコミュニティと 共有する ことを考えてください!🤗

 

AutoClass

内部的には、AutoModelForSequenceClassificationAutoTokenizer クラスは上記で使用した pipeline() を駆動するために一緒に動作しています。AutoClass は事前訓練済みモデルのアーキテクチャをその名前かパスから自動的に取得するショートカットです。タスクのための適切な AutoClass と関連する前処理クラスを選択する必要があるだけです。

前のセクションからのサンプルに戻り pipeline() の結果を複製するために AutoClass をどのように使用できるかを見ましょう。

 

AutoTokenizer

トークナイザーはモデルへの入力としてテキストを数値の配列に前処理する役割を負います。単語を分割する方法や単語を分割するレベルを含む、トークン化プロセスを規定する複数のルールがあります (トークン化については トークナイザー要約 で更に学習してください)。覚えておくべき最も重要なことは、モデルがそれで事前訓練されたトークン化ルールを使用していることを確実にするために同じモデル名でトークナイザーをインスタンス化する必要があることです。

AutoTokenizer でトークナイザーをロードします :

from transformers import AutoTokenizer

model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
tokenizer = AutoTokenizer.from_pretrained(model_name)

テキストをトークナイザーに渡します :

encoding = tokenizer("We are very happy to show you the 🤗 Transformers library.")
print(encoding)
{'input_ids': [101, 11312, 10320, 12495, 19308, 10114, 11391, 10855, 10103, 100, 58263, 13299, 119, 102],
 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}

トークナイザーは以下を含む辞書を返します :

  • input_ids : トークンの数値表現。
  • atttention_mask : どのトークンが注目されるべきかを示す。

トークナイザーはまた入力のリストを受け取ることができて、そして均一な長さのバッチを返すためにテキストをパディングして切り詰めます :

pt_batch = tokenizer(
    ["We are very happy to show you the 🤗 Transformers library.", "We hope you don't hate it."],
    padding=True,
    truncation=True,
    max_length=512,
    return_tensors="pt",
)

tf_batch = tokenizer(
    ["We are very happy to show you the 🤗 Transformers library.", "We hope you don't hate it."],
    padding=True,
    truncation=True,
    max_length=512,
    return_tensors="tf",
)

トークン化の詳細と、画像, 音声とマルチモーダル入力を前処理する AutoImageProcessor, AutoFeatureExtractorAutoProcessor を使用する方法については 前処理 チュートリアルを確認してください。

 

AutoModel

🤗 Transformers は事前訓練済みインスタンスをロードする単純で統一された方法を提供します。これは、AutoTokenizer をロードするように AutoModel をロードできることを意味します。唯一の違いはタスクに対して正しい AutoModel を選択することです。テキスト (or シークエンス) 分類に対しては、AutoModelForSequenceClassification をロードする必要があります :

from transformers import AutoModelForSequenceClassification

model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
pt_model = AutoModelForSequenceClassification.from_pretrained(model_name)

AutoModel クラスによりサポートされるタスクについては タスク概要 をご覧ください。

 
これで前処理した入力のバッチをモデルに直接渡すことができます。** を追加して辞書をアンパックする必要があるだけです :

pt_outputs = pt_model(**pt_batch)

モデルは logits 属性内で最後の活性を出力します。確率を取得するためには softmax 関数を logits に適用します :

from torch import nn

pt_predictions = nn.functional.softmax(pt_outputs.logits, dim=-1)
print(pt_predictions)
tensor([[0.0021, 0.0018, 0.0115, 0.2121, 0.7725],
        [0.2084, 0.1826, 0.1969, 0.1755, 0.2365]], grad_fn=<SoftmaxBackward0>)

 

🤗 Transformers は事前訓練済みインスタンスをロードする単純で統一された方法を提供します。これは、AutoTokenizer をロードするように TFAutoModel をロードできることを意味します。唯一の違いはタスクに対して正しい TFAutoModel を選択することです。テキスト (or シークエンス) 分類に対しては、TFAutoModelForSequenceClassification をロードする必要があります :

from transformers import TFAutoModelForSequenceClassification

model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
tf_model = TFAutoModelForSequenceClassification.from_pretrained(model_name)

AutoModel クラスによりサポートされるタスクについては タスク概要 をご覧ください。

 
これで前処理した入力のバッチをテンソルへの直接的な辞書キーを渡すことでモデルに直接渡すことができます。

tf_outputs = tf_model(tf_batch)

モデルは logits 属性内で最後の活性を出力します。確率を取得するためには softmax 関数を logits に適用します :

import tensorflow as tf

tf_predictions = tf.nn.softmax(tf_outputs.logits, axis=-1)
tf_predictions

総ての 🤗 Transformers モデルは (PyTorch or TensorFlow) は (softmax のような) 最終的な活性化関数の前にテンソルを出力します、最後の活性化関数は損失と融合されることが多いからです。🤗 Transformers モデル出力は特殊なデータクラスですから、それらの属性は IDE で自動補完されます。モデル出力はタプルか辞書のようにも動作します (e.g. 整数, スライス, 文字列でインデックスできます)、その場合には None の属性は無視されます。

 

モデルのセーブ

モデルが再調整されたら、PreTrainedModel.save_pretrained() を使用してそれをそのトークナイザーと共にセーブできます :

pt_save_directory = "./pt_save_pretrained"
tokenizer.save_pretrained(pt_save_directory)
pt_model.save_pretrained(pt_save_directory)

モデルを再度利用する準備ができたら、それを PreTrainedModel.from_pretrained() で再ロードします :

pt_model = AutoModelForSequenceClassification.from_pretrained("./pt_save_pretrained")

 

モデルが再調整されたら、TFPreTrainedModel.save_pretrained() を使用してそれをそのトークナイザーと共にセーブできます :

tf_save_directory = "./tf_save_pretrained"
tokenizer.save_pretrained(tf_save_directory)
tf_model.save_pretrained(tf_save_directory)

モデルを再度利用する準備ができたときには、それを TFPreTrainedModel.from_pretrained() で再ロードします :

tf_model = TFAutoModelForSequenceClassification.from_pretrained("./tf_save_pretrained")

 
一つの特にクールな 🤗 Transformers の機能はモデルをセーブしてそれを PyTorch か TensorFlow モデルのいずれかとして再ロードする機能です。from_pt or from_tf パラメータはモデルを一つのフレームワークから他方に変換できます :

from transformers import AutoModel

tokenizer = AutoTokenizer.from_pretrained(tf_save_directory)
pt_model = AutoModelForSequenceClassification.from_pretrained(tf_save_directory, from_tf=True)

from transformers import TFAutoModel

tokenizer = AutoTokenizer.from_pretrained(pt_save_directory)
tf_model = TFAutoModelForSequenceClassification.from_pretrained(pt_save_directory, from_pt=True)

 

以上