AI・機械学習
中級

Frequency Penalty / Presence Penalty(フリクエンシーペナルティ)

LLMのテキスト生成で同じトークンの繰り返しを抑制するパラメータ。Frequency Penaltyは既出トークンの出現回数に比例してペナルティを課し、Presence Penaltyは出現の有無に基づいて一律のペナルティを課す。両者を組み合わせることで自然で多様な出力を実現する。

0 回閲覧
0 いいね

Frequency Penalty / Presence Penalty とは

Frequency Penalty と Presence Penalty は、LLM のテキスト生成において同じトークンや表現の繰り返しを抑制するためのパラメータである。Temperature や Top-p がサンプリングの「ランダム性」を制御するのに対し、これらは「反復の抑制」に特化している。

動作原理の違い

Frequency Penalty(頻度ペナルティ)

生成済みテキスト中にトークンが出現した回数に比例してペナルティを課す。同じ単語を繰り返すほどペナルティが増大し、3回目の出現は2回目よりさらに強く抑制される。

  • ペナルティ計算: logit -= frequency_penalty × token_count
  • 値の範囲: -2.0 〜 2.0(OpenAI API)
  • 正の値: 繰り返しを抑制
  • 負の値: 繰り返しを促進(特殊用途)
  • 0: ペナルティなし

Presence Penalty(存在ペナルティ)

トークンが生成済みテキスト中に1回でも出現したかどうかに基づいて一律のペナルティを課す。出現回数に関係なく、「使ったか使っていないか」の二値判定である。

  • ペナルティ計算: logit -= presence_penalty × (1 if token_appeared else 0)
  • 値の範囲: -2.0 〜 2.0(OpenAI API)
  • 正の値: 新しいトピックへの展開を促す
  • 0: ペナルティなし

比較表

特性Frequency PenaltyPresence Penalty
ペナルティ基準出現回数に比例出現の有無(二値)
効果同一単語の連続使用を強く抑制新トピック・新語彙の導入を促進
適用対象単語レベルの繰り返し防止テーマレベルの多様化
典型的な使用値0.0〜1.00.0〜1.0

ユースケース別の推奨設定

ユースケースFrequencyPresence理由
コード生成0.00.0変数名やキーワードの繰り返しは正常
記事執筆0.3〜0.50.2〜0.4適度な語彙の多様性を確保
ブレインストーミング0.20.8〜1.2新しいアイデアの導入を促進
要約0.0〜0.20.0原文の用語を維持する必要がある
創作0.5〜0.80.3〜0.5表現の多様性と自然さの両立
チャットボット0.30.3自然な会話で同じフレーズを避ける

主要 API での対応状況

APIFrequency PenaltyPresence Penalty範囲
OpenAI GPT-4ofrequency_penaltypresence_penalty-2.0〜2.0
Anthropic Claude×(未対応)×(未対応)—
Google Geminifrequency_penaltypresence_penalty-2.0〜2.0
Cohere Command R+frequency_penaltypresence_penalty0.0〜1.0
llama.cpprepeat_penalty—0.0〜任意

Anthropic Claude API は Frequency/Presence Penalty パラメータを提供していない。代わりに Temperature と Top-p の調整でテキストの多様性を制御するアプローチを採用している。

Repetition Penalty との関係

ローカル LLM ランタイム(llama.cpp、Ollama、LM Studio)では repeat_penalty というパラメータが使われることが多い。これは Frequency Penalty に近い概念だが、直近 N トークン(repeat_last_n)のウィンドウ内でのみ適用される点が異なる。

  • repeat_penalty=1.0: ペナルティなし
  • repeat_penalty=1.1: 軽い繰り返し抑制(多くのモデルのデフォルト)
  • repeat_penalty=1.3: 強い繰り返し抑制

FAQ

Q1: Frequency Penalty と Presence Penalty は同時に使うべきですか?

A1: 併用可能で、OpenAI のドキュメントでも同時使用を想定している。一般的には両方を 0.0〜0.5 程度の控えめな値で設定し、出力を確認しながら調整する。

Q2: ペナルティを強くしすぎるとどうなりますか?

A2: 1.0 を超えると、一般的な接続詞や助詞までも抑制され、文法的に不自然な文章になる。特に日本語では助詞(は・が・の等)の繰り返しが必然的に多いため、高すぎるペナルティは文章を破壊する。

Q3: コード生成でペナルティを使ってもいいですか?

A3: 基本的には 0.0 を推奨する。コードでは変数名・関数名・キーワード(if, for, return 等)の繰り返しが正常な構造であり、ペナルティを課すと不正なコードが生成されるリスクがある。