HuggingFace Transformers 4.17 : Get Started : クイック・ツアー (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 04/09/2022 (v4.17.0)
* 本ページは、HuggingFace Transformers の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Web: www.classcat.com ; ClassCatJP
HuggingFace Transformers 4.17 : Get Started : クイック・ツアー
Get up and running with Transformers! 素早い推論のために pipeline() を利用して始めましょう、そしてテキスト, ビジョン, or 音声タスクを解決するために AutoClass で事前訓練済みモデルと tokenizer を素早くロードしましょう。
Pipeline
与えられたタスクに対して事前訓練済みモデルを使用するためには pipeline() が最も簡単な方法です。
pipeline() は多くの一般的なタスクを out of the box にサポートします :
テキスト :
- センチメント分析 : 与えられたテキストの両極性 (= polarity) を分類する。
- テキスト生成 (in English) : 与えられた入力からテキストを生成する。
- 固有表現認識 (NER) : 各単語をそれが表すエンティティ (person, date, location 等) でラベル付けします
- 質問応答 : あるコンテキストと質問が与えられたとき、コンテキストから答えを抽出します。
- マスクされたテキストを埋める (Fill-mask) : マスクされた単語を含むテキストが与えられたとき、ブランクを埋めます。
- 要約 : テキストか文書の長いシークエンスの要約を生成します。
- 翻訳 : テキストを別の言語に翻訳します。
- 特徴抽出 : テキストのテンソル表現を作成します。
画像 :
- 画像分類 : 画像を分類する。
- 画像セグメンテーション : 画像の総てのピクセルを分類する。
- 物体検出 : 画像内の物体を検出する。
音声 :
- 音声分類 : 与えられた音声のセグメントにラベルを割り当てる。
- 自動発話認識 (ASR) : 音声データをテキストに文字起こしする。
pipeline() と関連タスクの詳細は、ここ でドキュメントを参照してください。
パイプラインの使用方法
以下のサンプルでは、センチメント分析のために pipeline() を利用ます。
まだインストールしていない場合には、以下の依存性をインストールしてください :
pip install torch
pip install torch
pipeline() をインポートして完了させたいタスクを指定します :
from transformers import pipeline
classifier = pipeline("sentiment-analysis")
pipeline はセンチメント分析のためのデフォルトの事前訓練済みモデルと tokenzier をダウンロードしてキャッシュします。そしてターゲットテキストで分類器を使用できます :
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() はまたデータセット全体に対してイテレートすることもできます。🤗 データセット・ライブラリをインストールすることから始めます :
pip install datasets
解決したいタスクと使用したいモデルで pipeline() を作成します。テンソルを CUDA デバイスに置くためにデバイスパラメータを 0 に設定します :
from transformers import pipeline
speech_recognizer = pipeline("automatic-speech-recognition", model="facebook/wav2vec2-base-960h", device=0)
次に、イテレートしたいデータセット (詳細は 🤗 Datasets クイックスタート 参照) をロードします。例えば、SUPERB データセットをロードしましょう :
import datasets
dataset = datasets.load_dataset("superb", name="asr", split="test")
データセット全体をパイプラインに渡すことができます :
files = dataset["file"]
speech_recognizer(files[:4])
[{'text': 'HE HOPED THERE WOULD BE STEW FOR DINNER TURNIPS AND CARROTS AND BRUISED POTATOES AND FAT MUTTON PIECES TO BE LADLED OUT IN THICK PEPPERED FLOWER FAT AND SAUCE'}, {'text': 'STUFFERED INTO YOU HIS BELLY COUNSELLED HIM'}, {'text': 'AFTER EARLY NIGHTFALL THE YELLOW LAMPS WOULD LIGHT UP HERE AND THERE THE SQUALID QUARTER OF THE BROTHELS'}, {'text': 'HO BERTIE ANY GOOD IN YOUR MIND'}]
(音声やビジョンでのような) 入力が大きい大規模なデータセットについては、総ての入力をメモリにロードするリストの代わりに generator を渡すことを望むでしょう。詳細は パイプライン・ドキュメント を見てください。
パイプラインで別のモデルと tokenizer を使用する
pipeline() は モデルハブ から任意のモデルを提供できるので、他のユースケースに pipeline() を適応させることは容易です。例えば、フランス語テキストを扱えるモデルを望む場合、適切なモデルのためにフィルタリングするためにモデルハブでタグを使用します。フィルタリングされたトップの結果はセンチメント分析のために再調整されたマルチリンガル BERT モデル を返します。Great, let’s use this model!
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)
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}]
貴方のユースケースのためのモデルを見つけられない場合、貴方のデータで事前訓練済みモデルを再調整する必要があります。その方法を学習するには 再調整チュートリアル を見てください。最後に、事前訓練済みモデルを再調整した後には、NLP を皆のために民主化するためにそれをモデルハブでコミュニティと共有する (ここ のチュートリアル参照) ことを考えてください!🤗
AutoClass
内部的には、AutoModelForSequenceClassification と AutoTokenizer クラスは pipeline() を駆動するために一緒に動作しています。AutoClass は事前訓練済みモデルのアーキテクチャををその名前かパスから自動的に取得するショートカットです。タスクのための適切な AutoClass と関連するトークナイザーを AutoTokenizer で選択する必要があるだけです。
サンプルに戻り 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 : どのトークンが注目されるべきかを示す。
丁度 pipeline() のように、トークナイザーは入力のリストを受け取ります。更に、トークナイザーはまた均一な長さのバッチを返すためにテキストをパディングして切り詰めます :
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",
)
トークン化の詳細は 前処理 チュートリアルを読んでください。
AutoModel
🤗 Transformers は事前訓練済みインスタンスをロードする単純で統一された方法を提供します。これは、AutoTokenizer をロードするように AutoModel をロードできることを意味します。唯一の違いはタスクに対して正しい AutoModel を選択することです。テキスト – or シークエンス – 分類を行なっていますので、AutoModelForSequenceClassification をロードします。TensorFlow の同値は単純に TFAutoModelForSequenceClassification です :
from transformers import AutoModelForSequenceClassification
model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
pt_model = AutoModelForSequenceClassification.from_pretrained(model_name)
from transformers import TFAutoModelForSequenceClassification
model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
tf_model = TFAutoModelForSequenceClassification.from_pretrained(model_name)
これで前処理した入力のバッチをモデルに直接渡すことができます。PyTorch モデルを使用している場合には、** を追加することで辞書をアンパックしてください。TensorFlow については、辞書キーを直接テンソルに渡してください。
pt_outputs = pt_model(**pt_batch)
tf_outputs = tf_model(tf_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=)
import tensorflow as tf
tf_predictions = tf.nn.softmax(tf_outputs.logits, axis=-1)
print(tf_predictions)
tf.Tensor( [[0.00206 0.00177 0.01155 0.21209 0.77253] [0.20842 0.18262 0.19693 0.1755 0.23652]], shape=(2, 5), dtype=float32)
総ての 🤗 Transformers モデルは (PyTorch or TensorFlow) は (softmax のような) 最終的な活性化関数の前にテンソルを出力します、最後の活性化関数は損失と融合されることが多いからです。
モデルは標準的な torch.nn.Module or a tf.keras.Model ですので、通常の訓練ループでそれらを使用できます。けれども、より簡単にするため、 🤗 Transformers は PyTorch のために Trainer クラスを提供しています、これは分散訓練, 混合精度, 等のための機能を追加します。TensorFlow については、Keras からの fit メソッドを利用できます。詳細は 訓練チュートリアル を参照してください。
🤗 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)
tf_save_directory = "./tf_save_pretrained"
tokenizer.save_pretrained(tf_save_directory)
tf_model.save_pretrained(tf_save_directory)
モデルを再度利用する準備ができたときには、それを PreTrainedModel.from_pretrained() で再ロードします :
pt_model = AutoModelForSequenceClassification.from_pretrained("./pt_save_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)
以上