LLMのアウトプットの温度感を調整する Temperature、TopK、TopPについて
はじめに
はじめまして。Kouchと申します。
実は最近GoogleCloudのSkills Boostというサービスで生成AIについて勉強しておりまして、その中で生成AIの温度感について興味を持ち、調べてみました。
こちらの記事では、
- LLMの仕組み(ざっくり)
- 各種パラメーターの説明
- 実際にGoogle AI Studioで試してみる
- まとめ
このような順番でご説明していこうと思います!
前提:そもそもLLMはどのようにして言語を出力しているのか
ざっくりとした説明になりますが、LLMは
「今までの文章の文脈から、次の単語の候補を予測し、その中から単語を一つ選ぶ」
ということを繰り返すことによって、長い文章を生成しています。
スマホの単語予測と同じ仕組み
実はこの仕組みとかなり似ている体験を、僕たちは毎日やっています。
スマホでテキストを打った時に、次の単語の予測が出ますよね。
例えば今僕のスマホで「よろしく」というテキストを打つと
- 「お願いします」
- 「おねがいします」
- 「お願い」
- 「😀」
などの候補が出てきました。
これは、『「よろしく」の後にはどうせ「お願いします」って言うでしょ?』とキーボードが予測を立ててくれているので、僕たちはゼロからフリック入力しなくても、予測した単語を押すだけで単語が入力されるわけですね。
LLMの場合
ChatGPTやGeminiなどのLLMの場合は、事前学習を膨大な回数行うことで、スマホの予測変換よりもはるかに高い精度で次の単語を予測することができます。
(GPTのPは「事前学習された」を意味するPre-TrainedのPですね)
なので、僕たちがGPTに送ったプロンプトに対して、自然な言語としてアウトプットされるわけですね。
LLMで次の単語が決まる仕組み
一定のランダム性があるから「クリエイティブ」になれる
ここで面白いのは、LLMにおいては「次の単語が確率分布に従って、ランダムに決められる」ということです。
ここがランダム性が全くない場合、LLMは常に一番「あり得そう」な単語を出力してくれるわけです。
そうすると、決まりきった定型文のような返答しかしなくなるので、固定的なアウトプットになります。(後ほど実際にGoogle AI Studioでテストしてみましょう)
次の単語が決まる仕組み
例えば、
「日本の戦国武将で有名なのは」
という文字列があったとします。これに対して、LLMの中では次の単語の候補とその確率が列挙されています。
実際のところはわかりませんが、単純化した具体例としてこんな形にしてみましょう。
- 「織田信長」 50%
- 「豊臣秀吉」 20%
- 「徳川家康」 10%
- 「上杉謙信」 8%
(さらにリストが続く)
LLMが事前学習をした中で、webの記事や本などの文章を大量に読みまくり、「次の単語はこれだろ」という候補の一覧を持っているわけですね。
そして、この候補の中からどれを選ぶのか?をコントロールするパラメーターとしてTemperature、TopK、TopPの3つのパラメーターがあります。
Temperature
これは「単語のばらつき度合」を表しています。
ChatGPTなどでは0~2で定義されており
- 0の時は「最有力候補(例だと織田信長)がかなり選ばれやすくなる」
- 2の時は「ニッチな候補(例だと上杉謙信)も選ばれやすくなる」
という出力の温度感をコントロールできます。
(Google AI Studioは、0〜1までを採用しています。)
TopK、TopP
これは、「選ばれうる単語の候補を絞る度合」を表しています。
TopKは単語候補の個数を指定します。
例えば、TopKが2の場合は、上位2つである「織田信長」「豊臣秀吉」のみが候補になります。
TopPは単語候補を上から並べた場合の累積確率を指定します。
例えば、TopPが0.80の場合は、確率の高い順番に足していき、0.80になるまでを候補にします。
上記の例だと「織田信長」(50%)「豊臣秀吉」(20%)「徳川家康」(10%)の割合が足して0.80になるので、この3つの候補のみになります。
TopKは単純に順位で切ってしまうので、確率分布を無視した不自然な文章が形成される可能性があります。
なので、TopPの方が使われやすいようです。
(Google AI StudioでもTopPが採用されています。)
Google AI Studioとは
今回はGoogle AI Studioを使ってこれらのパラメーターをいじった時にアウトプットがどう変化するのかを実験してみます。
Google AI StudioはGeminiの生成AIモデルに対して、APIを介する必要なくwebで完結したGUI上でパラメーターを変化させることができるサービスです。

アウトプットをいじってみよう
では、ここから実際にGoogle AI Studioを使って上記パラメーターをいじってみましょう。
GUI上でTemperatureとTopPをいじることができます。

ここでは
東京で遊ぶとしたら、何して遊ぶのがおすすめ?
3行くらいで教えて
この質問でテストをしてみましょう
Temperature低、TopP低
- Temperature: 0
- TopP: 0
1回目

2回目

3回目

1文目は3回とも全て同じですね。
2文目以降は語尾や細かい表現は違いますが、渋谷、原宿、歌舞伎町、六本木の4つのスポットについてほとんど同じことを言っています。
Temperature高、TopP高
- Temperature: 1
- TopP: 1
1回目

2回目

3回目

前回の渋谷、原宿、歌舞伎町、六本木の4つの候補だけではなく、下北沢や新宿御苑など、新しい場所も提案してくれていますね!
さらに、3回同じプロンプトを与えてみても、フォーマットも、口調も、おすすめの場所も全て違いますね。
実際にTemperatureやTopPによってLLMの出力をコントロールできることがわかりましたね!
パラメーターのまとめ
- Temperatureが大きいほど、確率分布のランダム性が上げる
- TopP/TopKが大きいほど、採用される候補の数が増える
つまり、
Temperature、TopP/TopKが大きいほど、ランダム性が高く、珍しい単語まで出力される可能性がある
→ クリエイティブな文章が生成される可能性が高い。ブレストや創作などに向いている。
逆に、Temperature、TopP/TopKが小さい場合は、ランダム性が低く、決まりきったアウトプットになりがち
→ 冒険はしないけど、安定した文章が生成される可能性が高い。カスタマーサクセスや翻訳などに向いている。
なので、どちらがいいというよりは、組み込むプロダクトの用途によって使い分けるという形になります。
ChatGPTなどのLLMでは、APIのパラメーターでTemperatureやTopPを指定できることが多いです。
このようなパラメーターを駆使して、より目的に沿ったLLMのアウトプットを生成させましょう!
Discussion