AI・機械学習
上級
Contrastive Search(コントラスティブサーチ)(コントラスティブサーチ)
LLMデコーディングにおいて次トークンの確率(モデルスコア)と既生成トークンとの類似度(degeneration penaltyを差し引いた値)を組み合わせて選択する手法。繰り返し・退化現象を抑制し、一貫性と多様性を両立する。
0 回閲覧
0 いいね
2026/6/7 更新
関連タグ
contrastive-search
degeneration
decoding-strategy
llm-inference
Contrastive Searchとは
Contrastive Search(Su et al., NeurIPS 2022)はLLMの自己回帰生成における「退化問題(degeneration)」を解決するデコーディング手法です。退化問題とは、生成テキストが繰り返しや意味のないループに陥る現象です。
退化問題の仕組み
グリーディデコーディングやbeam searchでは、モデルが自信を持つトークンを繰り返し選ぶため、同じフレーズが何度も出現します。
悪い例(greedy decoding):
"The cat sat on the mat. The cat sat on the mat. The cat sat on the..."
top-k/top-pサンプリングは多様性を上げますが、一貫性が失われる場合があります。
Contrastive Searchの仕組み
スコアリング関数
Contrastive Searchは次のスコアで各候補トークンを評価します:
score(x) = (1-α) × p(x|context) - α × degeneration_penalty(x)
ここで:
p(x|context): モデルが予測する確率(高いほど良い)degeneration_penalty(x): 過去トークンとの最大コサイン類似度(低いほど良い)α: バランスパラメータ(推奨 0.6)
degeneration penaltyの詳細
def compute_degeneration_penalty(x, past_tokens):
"""過去トークンとの最大類似度を計算"""
h_x = hidden_state(x) # 候補トークンの隠れ状態
similarities = [cosine_similarity(h_x, h_j) for h_j in past_tokens]
return max(similarities) # 最も類似した過去トークンとの類似度
候補トークンの隠れ状態が過去のトークンと類似しているほど、スコアが下がります。これにより繰り返しが自然に抑制されます。
パラメータ
α(penalty_alpha)
- α = 0.0: 純粋にモデル確率のみ(greedy decodingに近い)
- α = 0.6: 推奨値(一貫性と多様性のバランス)
- α = 1.0: 純粋にdegeneration penaltyのみ(非実用的)
top-k
候補トークンの絞り込みに使用(通常k=5〜8)。
Hugging Faceでの使用
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("gpt2-xl")
model = AutoModelForCausalLM.from_pretrained("gpt2-xl")
input_ids = tokenizer("A stunning image", return_tensors="pt").input_ids
# Contrastive Search
output = model.generate(
input_ids,
penalty_alpha=0.6, # α値
top_k=4, # 候補数
max_new_tokens=200,
)
print(tokenizer.decode(output[0]))
他デコーディング手法との比較
| 手法 | 一貫性 | 多様性 | 繰り返し | 速度 |
|---|---|---|---|---|
| Greedy | 高 | 低 | 多い | 速い |
| Beam Search | 高 | 低 | 中 | 遅い |
| top-p (p=0.9) | 中 | 高 | 少ない | 速い |
| Contrastive Search | 高 | 高 | 少ない | 中 |
まとめ
Contrastive SearchはNeurIPS 2022で発表されたデコーディング手法で、理論的に退化問題を解決します。Hugging Face Transformersにpenalty_alphaパラメータとして実装されており、長文生成・要約・ストーリー生成などで特に効果的です。2025年時点でもローカルLLM実行環境での長文品質向上に活用されています。