微調整におけるデータ品質の処理

データクリーニング

Posted by LuochuanAD on March 15, 2026 本文总阅读量

背景

微調モデルの性能 = 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の増分ベクトル更新戦略」

https://strictfrog.com/ja/2026-03-14-%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%81%AE%E5%A2%97%E5%88%86%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E6%9B%B4%E6%96%B0%E6%88%A6%E7%95%A5/

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におけるシンプルなデータ準備と前処理」:

https://strictfrog.com/ja/2026-03-15-%E5%BE%AE%E8%AA%BF%E6%95%B4%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E7%B0%A1%E5%8D%98%E3%81%AA%E3%83%87%E3%83%BC%E3%82%BF%E6%BA%96%E5%82%99%E3%81%A8%E5%89%8D%E5%87%A6%E7%90%86/

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 プロレベルに近い