SimpleTransformers:トランスフォーマーを簡単に
紹介
オープンソースライブラリであるHugging Face Transformersは、事前にトレーニングされた何千ものモデルの1つの場所です。APIの設計は見事な構想からなっており、実装が簡単です。ただし、まだある程度の複雑さがあり、素晴らしい機能を果たすには、いくつかの技術的なノウハウが必要です。
Simple Transformersを入力すると、複雑さが解消され、モデルのトレーニングやTransformerモデルアーキテクチャの実験など、重要なことに取り掛かることができます。それはあなたがすべての複雑なセットアップ、定型コード、および他のすべての一般的な不快感を回避するのに役立ちます、
- モデルを1行で初期化します
- 次のトレーニング
- 3行目で評価します。
この簡単なレポートでは、HuggingFaceとSimpleTransformersの両方を使用して、IMDBデータセットに感情分類子を構築します。次に、SimpleTransformersを使用して小さなプロジェクトを実行します。
抱きしめる顔の道
このセクションでは、Hugging FaceAPIを使用して単純な感情分類子を構築しようとします。IMDBデータセットを使用して、DistilBERTモデルを微調整します。
GoogleColabでお試しください →\rightarrow
Hugging Face Transformersを使用すると、数行のコードで感情分類子を構築できます。しかし、特にTransformersを使い始めたばかりの人にとっては、いくつかの落とし穴があります。
1. インポート
トランスモデルが異なれば、必要なインポートも異なります。Hugging Faceは、PyTorchとTensorFlowの2つのディープラーニングフレームワークをサポートしています。TFプレフィックスは、TensorFlow固有のインポートで使用されます。
from transformers import DistilBertTokenizerFast
from transformers import TFDistilBertForSequenceClassification, TFTrainer, TFTrainingArguments
感情分類子には、主にトークナイザー、モデル、およびトレーナーが必要です。
2. トークナイザー
トークン化は、NLPで最も一般的な前処理タスクの1つです。文が与えられると、タスクはそれをトークンと呼ばれる断片に切り刻むことです。トランスフォーマーでさえ、トークン化するために入力が必要です。ただし、トランスフォーマーが異な���ば、必要なトークン化モジュールも異なるため、適切なモジュールをインポートする必要があります。
tokenizer = DistilBertTokenizerFast.from_pretrained('distilbert-base-uncased')
train_encodings = tokenizer(train_texts, truncation=True, padding=True)
val_encodings = tokenizer(val_texts, truncation=True, padding=True)
test_encodings = tokenizer(test_texts, truncation=True, padding=True)
3. トレーニング引数
Hugging Faceは、シンプルでありながら完全なトレーニングおよび評価インターフェイスを備えています。TrainingArguments
またはTFTrainingArguments
を使用すると、さまざまなトレーニングオプションを提供でき、ロギング、勾配累積、混合精度などの組み込み機能を利用できます。さまざまなトレーニングの議論について詳しく知るためには、こちらをご覧ください。
training_args = TFTrainingArguments(
output_dir='./results',
num_train_epochs=3,
per_device_train_batch_size=16,
per_device_eval_batch_size=64,
warmup_steps=500,
weight_decay=0.01,
logging_dir='./logs',
logging_steps=10,
)
4. モデルの取得
単純なHuggingFace APIを使用して、事前にトレーニングされたトランスフォーマーモデルをダウンロードできます。ただし、正しいモジュールをインポートする必要があります。
model = TFDistilBertForSequenceClassification.from_pretrained("distilbert-base-uncased")
5. トレーニング
Trainer
またはTFTrainer
APIは、ダウンストリームタスクでトランスフォーマーモデルをトレーニングおよび評価するためのインターフェースを提供します。
trainer = TFTrainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=val_dataset
)
trainer.train()
Hugging Faceには、ウェイトとバイアスの統合が付属しています。trainer.train()
は、W&Bダッシュボードでトレーニングしている間、すべてのメトリックを自動的にログに記録します。以下は、感情分類子のトレーニング中に記録されたグラフです。
シンプルなトランスフォーマーウェイ
Simple Transformersは、HuggingFaceセクションで見た複雑さをすべて回避します。Simple Transformersは、Hugging Face APIをさらに抽象化して、Transformerモデルを迅速にトレーニングおよび評価します。すべてのダウンストリームの微調整タスクでは、3行のコードのみが必要です。SimpleTransformersを使用して感情分類器を構築しましょう。
GoogleColabでSimpleTransformerを微調整 →\rightarrow
Simple Transformers Thilina Rajapakseの作成者によるこの投稿では、 SimpleTransformersが初心者に優しいことを意味していることを理解してください。
1. 輸入
Simple Transformersの使用は、1行のインポートと同じくらい簡単です。ダウンストリームタスクごとに、インポートされるモジュールが1つあります。たとえば、コードスニペットに示されているインポートは、テキスト分類に必要なすべてです。
from simpletransformers.classification import ClassificationModel
2. トレーニングの議論
トレーニング引数を提供するには、辞書train_argsが必要です。ここで利用可能なすべての引数を確認してください。
train_args={
'num_train_epochs': 3,
'train_batch_size': 16,
'eval_batch_size': 64,
'warmup_steps': 500,
'weight_decay': 0.01,
'logging_steps': 10,
'learning_rate': 5e-5,
'fp16': False,
'wandb_project': 'gallery',
"wandb_kwargs": {'entity': 'wandb'}
}
3. タスク固有のモデルの初期化
必要なのは、タスク固有のモデルを初期化することだけです。ここでは分類を行っているため、ClassificationModel
を初期化する必要があります。事前にトレーニングされたモデルを使用するために正しいモジュールをインポートする必要があるHuggingFaceとは異なり、Simple Transformersでは、モデルの名前を引数として渡すだけです。train_argsを渡すことができます。トークナイザーを初期化する必要がないことに注意してくださ
い。Simple Transformerは、正しいトークン化を自動的に適用します。ただし、トークナイザーの名前を指定することもできます。
model = ClassificationModel('distilbert', 'distilbert-base-uncased', use_cuda=True, cuda_device=0, args=train_args)
4. トレーニング
モデルのトレーニングは、データセットをmodel.train_model
に渡すのと同じくらい簡単です。最初に適切なトークン化を適用してから、モデルをトレーニングします。Simple Transformersには、Weights and Biasesの統合が付属しており、すべてのトレーニング指標が自動的にログに記録されます。
model.train_model(train_df)
研修の結果を以下に示します。
テストドライブのためのSimpleTransformersの使用
この単純なプロジェクトでは、SimpleTransformersを使用してマルチクラス分類モデルを構築します。Stack Overflowに投稿された数千のプログラミングの質問を含む、このブログ投稿に最初に投稿されたこのデータセットを使用します。これらの各質問には、1つのタグ(Python、CSharp、JavaScript、またはJava)があります。タスクは、入力された質問をタグに分類することです。
GoogleColabで実験を試してください →\rightarrow
これはマルチクラス分類の問題なので、同じことを反映するようにモデルを初期化しましょう。num_labels
引数に注意してください。
# labels
LABELS = ['csharp', 'java', 'javascript', 'python']
# initialize model
model = ClassificationModel('distilbert', 'distilbert-base-cased', num_labels=4, use_cuda=True, cuda_device=0, args=train_args)
モデルのトレーニングは、model.train_model()
を呼び出すのと同じくらい簡単です。研修の結果を以下に示します。
結語
Simple Transformersにサポートが組み込まれているNLPタスクは他にもたくさんあります。それらのいくつかは次のとおりです。
- トークンの分類
- 質疑応答
- 言語モデリング
- 言語生成
Simple Transformersで何ができるかについて詳しくは、Ayush Chaurasia による一般的なNLPアプリケーションでのSimple Transformersの使用をご覧ください。
Simple Transformersを通じたTransformersの使用に関するこの短いチュートリアルが気に入りますか。
Simple Transformersを通じたTransformersの使用に関するこの短いチュートリアルが気に入りますか。