背景
微調モデルの性能 = 70% データ構造設計 + 20% データ品質 + 10% トレーニングパラメータ
この記事はデータ品質、つまりデータクリーニングについてのみ説明します。
完全なデータクリーニングパイプライン
原データ
↓
フォーマット統一
↓
簡易重複除去
↓
意味的重複除去
↓
ノイズフィルタリング
↓
長さ制御
↓
言語フィルタリング
↓
意味類似度検出
↓
困惑度フィルタリング
↓
最終SFTデータ
データクリーニング
1 重複除去
実データには多くの重複データが含まれる
方法1: 簡易テキスト重複除去
seen = set()
clean_data = []
for item in data:
text = item["messages"][0]["content"]
if text not in seen:
seen.add(text)
clean_data.append(item)
方法2:意味的重複除去
異なる表現でも同じ意味の質問が多い:
What is Python?
Explain Python.
Tell me about Python language.
embedding類似度で重複除去が可能です。
例:
- OpenAI embedding
- Hugging Face sentence-transformers
アプローチ:
embeddingを計算
↓
cosine similarity
↓
>0.9 の場合は削除
以下の記事も参考にしてください:「Embeddingの増分ベクトル更新戦略」
2 ノイズデータ除去
方法1: 簡単ルール:キーワードベース
bad_words = ["I don't know", "Sorry", "Maybe"]
def is_bad(text):
for w in bad_words:
if w in text:
return True
return False
方法2: 空回答の削除
3 フォーマット統一
複数のデータソースのフォーマットを、統一したJSONフォーマットに変換する。
以下の記事では、AlpacaのフォーマットをSFTのデータ構造に変換しています。
「Fine-tuningにおけるシンプルなデータ準備と前処理」:
4 長さ制御
多くのトレーニングフレームワークは、トークン数を4096未満に制限しています。
tokenizerを使った計測:
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
tokens = tokenizer.encode(text)
if len(tokens) > 4096:
continue
5 言語フィルタリング
トレーニング対象が中国語であれば、英語や日本語など別言語は除外する必要があります。
6 意味品質フィルタリング
例:質問と回答のミスマッチ
Q: What is Python?
A: Tokyo is the capital of Japan.
対策:類似度微調整モデルを利用し関連度スコアを算出する。
7 困惑度フィルタリング(Perplexity Filtering)
アプローチ:
言語モデルで困惑度(Perplexity)を計算。
困惑度が高ければ、
テキストの品質が低いと判断。
例:asdlfjlasdjflのような文は削除対象となる。
よく使われるモデル:
- GPT-2
- KenLM
8 対話の完全性チェック
マルチターン対話データの場合:
user
assistant
user
assistant
の流れが守られている必要があります。
以下のようなケースはNGです:
user
user
assistant
assistant
チェック方法:
roles = [m["role"] for m in messages]
for i in range(len(roles)-1):
if roles[i] == roles[i+1]:
return False
9 データ品質スコアリング
| 項目 | 意味 |
|---|---|
| 意味適合 | Q/Aの関連性 |
| 言語品質 | 文法の正確さ |
| 長さ適正 | 過度に長くない |
| 多様性 | 異なるトピック |
スコアは0〜1で評価し、0.6未満は削除対象。
def score_data(question, answer):
prompt = f"""
Rate the quality of this QA pair from 0-1.
Q: {question}
A: {answer}
Only output a number.
"""
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role":"user","content":prompt}]
)
return int(response.choices[0].message.content)
データ規模の目安
例:
原データ 100万
↓
クリーニング後 10万
↓
最終トレーニング 5万
| 最終トレーニング | 効果 |
|---|---|
| 1000 | 軽微な改善 |
| 5000 | 明確な改善 |
| 10000 | 良好な結果 |
| 50000 | プロレベルに近い |