前のセクション「Hugging FaceのTransformersを使ったファインチューニング」では、ファインチューニングの手法とBERTモデルの具体例を紹介しました。
トレーニングデータの準備と前処理
LLM(大規模言語モデル)のファインチューニングでは、適切なトレーニングデータの準備と前処理が欠かせません。データの品質はモデルのパフォーマンスに直結します。このセクションでは、テキストデータのクレンジング、トークナイゼーション、そして効率的なデータ準備の方法について解説します。
| 前処理ステップ | 目的 | 代表的なツール |
|---|---|---|
| クレンジング | HTMLタグ・記号・重複空白を除去 | re、BeautifulSoup |
| 正規化 | 全角/半角・大文字/小文字を統一 | unicodedata |
| トークナイゼーション | モデルが扱える単位に分割 | transformers.Tokenizer |
| バッチ整形 | 長さを揃え、padding/truncation を適用 | datasets.map |
データクレンジング
まずはデータクレンジングです。テキストデータには、不要な空白、特殊文字、HTMLタグなどが含まれていることが多いため、これらを取り除く処理が必要です。以下は、Pythonを使った簡単なクレンジングの例です。
import re
# テキストのクレンジング関数
def clean_text(text):
text = re.sub(r"<.*?>", "", text) # HTMLタグの削除
text = re.sub(r"[^a-zA-Z0-9\s]", "", text) # 特殊文字の削除
text = re.sub(r"\s+", " ", text) # 複数の空白を一つに
return text.strip()
# 使用例
sample_text = "Hello, world!
This is a sample text."
cleaned_text = clean_text(sample_text)
print(cleaned_text) # 出力: "Hello world This is a sample text"
トークナイゼーション
次に、トークナイゼーションです。これは、テキストをモデルが扱える形式に変換する工程です。Hugging FaceのTransformersライブラリを使うと、少ないコードでトークナイゼーションを行えます。
from transformers import BertTokenizer
# BERT用のトークナイザーの読み込み
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
# サンプルテキストのトークナイゼーション
text = "Hello, this is a sample text for tokenization."
tokens = tokenizer.tokenize(text)
input_ids = tokenizer.encode(text, add_special_tokens=True)
print("Tokens:", tokens)
print("Input IDs:", input_ids)
データセットの準備
トレーニングデータをモデルに入力する前に、データセットを整える必要があります。Hugging Faceのdatasetsライブラリを使えば、効率的にデータセットを準備できます。
from datasets import load_dataset
# IMDbデータセットの読み込み
dataset = load_dataset("imdb")
# データの前処理関数
def preprocess(data):
text = clean_text(data["text"])
tokens = tokenizer(text, truncation=True, padding="max_length")
return tokens
# データのトークナイズ
train_data = dataset["train"].map(preprocess, batched=True)
test_data = dataset["test"].map(preprocess, batched=True)
# データ形式の確認
print(train_data[0])
ひとことで言うと
クレンジング → 正規化 → トークナイゼーション → バッチ整形の順で整えることで、モデルにとって扱いやすい入力になり、学習の安定性と精度が上がります。
データ前処理のポイント
- データの多様性: データセットに多様なトピックや文脈が含まれていると、モデルの汎用性が高まります。
- データのバランス: クラスが偏っている場合、モデルが偏った予測をしてしまうことがあるため、クラス間のバランスを整えることが大切です。
- 効率的なバッチ処理: 大規模データセットでは、バッチ処理を活用することでトレーニングが効率化します。