前回のおさらいと今回のテーマ
こんにちは!前回は、Transformerモデルの実装について解説しました。TransformerはSelf-Attentionを活用した革新的なアーキテクチャで、自然言語処理(NLP)の分野で大きな成果を上げています。
今回は、そのTransformerをベースとしたBERT(Bidirectional Encoder Representations from Transformers)のファインチューニングについて解説します。BERTは事前学習済みモデルとして広く使われており、その学習済みの知識を生かして、特定のNLPタスクに適用することができます。この記事では、BERTの基本概念、ファインチューニングの手順、および具体的な実装方法を説明します。
BERTとは?
1. BERTの基本概念
BERT(Bidirectional Encoder Representations from Transformers)は、Googleが開発した言語モデルで、Transformerのエンコーダ部分に基づいています。BERTは双方向のTransformerアーキテクチャを用いることで、文脈の前後を同時に考慮して単語の意味を捉えることができます。この双方向性により、従来の片方向的なモデルに比べて、より高度な自然言語理解が可能になります。
BERTは大規模なコーパスを使って事前学習され、以下の2つの主要な学習タスクに基づいています。
- マスク付き言語モデル(Masked Language Model, MLM):入力テキストの一部の単語をマスクして、その単語を予測します。
- 次文予測(Next Sentence Prediction, NSP):ある文が次の文として適切かどうかを予測します。
2. ファインチューニングとは?
ファインチューニングは、事前学習済みのBERTモデルを特定のタスクに適用するために、追加の学習を行うことです。BERTは一般的な言語知識を学習しているため、ファインチューニングによって、その知識を特定のタスク(例えば、感情分析、質問応答、文書分類)に適用できるようになります。
BERTのファインチューニングの手順
BERTのファインチューニングは、以下の手順で進めます。
- 事前学習済みBERTモデルのロード:Hugging FaceのTransformersライブラリなどを使用して、事前学習済みのBERTモデルをロードします。
- 入力データの前処理:テキストデータをBERTが受け入れられる形式(トークナイゼーションやパディング)に変換します。
- モデルの構築:BERTに追加の分類層を接続して、特定のタスクに対応させます。
- ファインチューニングの実行:ファインチューニングを行い、モデルを特定のタスクに適応させます。
- 評価:テストデータを用いて、モデルの性能を評価します。
以下で、具体的な実装例を示します。
BERTのファインチューニングの実装
今回は、Hugging FaceのTransformersライブラリを使用して、IMDb映画レビューの感情分析を行います。
1. 事前準備
まず、必要なライブラリをインストールします。
pip install transformers
pip install torch
pip install tensorflow
2. 事前学習済みBERTモデルのロード
BERTモデルとトークナイザーをロードします。
from transformers import BertTokenizer, TFBertForSequenceClassification
# BERTのトークナイザーとモデルをロード
model_name = "bert-base-uncased"
tokenizer = BertTokenizer.from_pretrained(model_name)
model = TFBertForSequenceClassification.from_pretrained(model_name, num_labels=2)
このコードでは、事前学習済みのbert-base-uncased
モデルをロードし、2クラス分類用の設定にしています。
3. データの前処理
テキストデータをBERTに入力するための形式に変換します。
from tensorflow.keras.preprocessing.sequence import pad_sequences
import tensorflow as tf
def preprocess_texts(texts, tokenizer, max_len=128):
# トークン化
input_ids = [tokenizer.encode(text, add_special_tokens=True, max_length=max_len, truncation=True) for text in texts]
# パディング
input_ids = pad_sequences(input_ids, maxlen=max_len, dtype="long", truncating="post", padding="post")
# Attentionマスクを作成
attention_masks = [[float(i > 0) for i in seq] for seq in input_ids]
return input_ids, attention_masks
# サンプルデータ
texts = ["I love this movie!", "This movie was terrible..."]
# テキストの前処理
input_ids, attention_masks = preprocess_texts(texts, tokenizer)
ここでは、テキストをトークナイゼーションし、BERTの入力形式であるinput_ids
とattention_masks
を作成しています。
4. モデルのファインチューニング
ファインチューニング用にデータを準備し、モデルを訓練します。
from sklearn.model_selection import train_test_split
# データの分割
X_train, X_val, y_train, y_val = train_test_split(input_ids, labels, test_size=0.2, random_state=42)
train_masks, val_masks = train_test_split(attention_masks, test_size=0.2, random_state=42)
# TensorFlowデータセットの作成
train_dataset = tf.data.Dataset.from_tensor_slices(({"input_ids": X_train, "attention_mask": train_masks}, y_train)).batch(32)
val_dataset = tf.data.Dataset.from_tensor_slices(({"input_ids": X_val, "attention_mask": val_masks}, y_val)).batch(32)
# モデルのコンパイル
optimizer = tf.keras.optimizers.Adam(learning_rate=2e-5)
model.compile(optimizer=optimizer, loss=model.compute_loss, metrics=["accuracy"])
# モデルの訓練
history = model.fit(train_dataset, epochs=3, validation_data=val_dataset)
ここでは、データをトレーニングセットと検証セットに分割し、バッチ化してTensorFlowのデータセットとして準備しています。その後、BERTモデルをコンパイルし、ファインチューニングを行っています。
5. モデルの評価
最後に、テストデータを使ってモデルの性能を評価します。
# テストデータの前処理
test_texts = ["The movie was fantastic!", "I didn't like the film."]
test_ids, test_masks = preprocess_texts(test_texts, tokenizer)
# 予測
predictions = model.predict({"input_ids": test_ids, "attention_mask": test_masks})
predicted_labels = tf.argmax(predictions.logits, axis=1).numpy()
# 結果の表示
for text, label in zip(test_texts, predicted_labels):
print(f"Text: {text} => Sentiment: {'Positive' if label == 1 else 'Negative'}")
このコードでは、新しいテキストに対する感情を予測し、その結果を表示します。
BERTファインチューニングのポイント
1. 学習率の設定
ファインチューニング時の学習率は、非常に小さく設定するのが一般的です。事前学習済みモデルに対して急激な学習を行うと、過学習やモデルの劣化が生じる可能性があるため、通常は2e-5
から5e-5
の範囲で調整します。
2. エポック数の調整
エポック数が多すぎると過学習する可能性があるため、少数(例えば、3から5程度)で試行するのが一般的です。タスクの複雑さやデータセットの大きさに応じて調整しましょう。
3. データの拡張と正規化
データが少ない場合は、データ拡張を行うことが効果的です。また、テキストの正規化(不要な文字の削除や表記の統一)も重要です。
まとめ
今回は、BERTのファインチューニングについて、基本的な手順と実装方法を解説しました。事前学習済みのBERTモデルを特定のタ
スクに適用することで、少量のデータでも高精度なモデルを構築することが可能です。次回は、文書の潜在的なトピックを抽出する手法であるトピックモデル(LDA)の基本について解説します。
次回予告
次回は、トピックモデル(LDA)の基本について解説します。LDAを使って文書内の潜在的なトピックを抽出する方法を学びましょう。
注釈
- ファインチューニング:事前学習済みモデルを特定タスクに適用するために追加の学習を行う手法。
- マスク付き言語モデル(MLM):テキストの一部の単語をマスクし、それを予測することで言語モデルを学習する手法。
- 次文予測(NSP):2つの文が連続しているかどうかを判定するタスク。
コメント