同じ質問を二度投げると、違う答えが返ってきます。仕事で使っていると、これが困る場面があります。
不具合ではありません。そういう作りになっています。
次の単語を確率で選んでいる
言語モデルは文章を一語ずつ書いていきます。そのたびに、次に来る候補すべてに確率を割り当てている。
「今日はいい」の次なら、「天気」が高く、「日」がそれに続き、「机」はほぼゼロ、といった具合です。
ここで、いちばん確率の高い語を必ず選べば、答えは毎回同じになります。実際そういう設定も用意されています。
それをやらないのは、常に最上位を選ぶと文章が壊れるからです。
確率が高い語だけを選ぶと、文章が壊れる
2019年に公開された論文が、この現象を扱っています。Ari Holtzman氏らによる The Curious Case of Neural Text Degeneration。
確率を最大化する方式で文章を作らせると、出てくるのは平板で、奇妙に繰り返しの多い文章だったと報告されています。同じ言い回しに入り込み、そこから抜け出せなくなる状態。
人が書いた文章と機械が書いた文章では、確率の分布に驚くほどの違いがあった、とも述べられています。人は必ずしも最も確からしい語を選ばない、ということ。
論文が提案したのが、核サンプリングと呼ばれる方法です。確率分布のうち信頼できる上位の塊からだけ選び、当てにならない裾を切り落とす。多様さを保ちつつ、破綻は避ける。そういう狙い。
この考え方が、いま多くのサービスで top_p という名前で使われています。
温度という設定
もうひとつ、揺れの幅を決める設定があります。温度と呼ばれる値です。
やっているのは、確率の分布を平らにするか尖らせるかの調整。
| 温度 | 何が起きるか | 向いている仕事 |
|---|---|---|
| 0に近い | 上位の語に集中する。ほぼ毎回同じ答えになる | 分類、抽出、書式の変換 |
| 中くらい | そこそこ揺れる。標準の設定 | 説明、要約、下書き |
| 高い | 下位の語も選ばれやすくなる。破綻もしやすい | 案出し、言い換えの候補集め |
対話型の画面から使っている場合、この値は触れないことがほとんどです。設定を変えられるのはAPI経由のときになります。
温度を0にしても完全には揃わない
ここは誤解されやすいところです。温度を最小にしても、答えが毎回一致する保証はありません。
計算の順序や実行環境の違いで、ごくわずかな差が出ます。確率が拮抗している場面では、その差が選ばれる語をひっくり返してしまう。
加えて、提供側がモデルを更新すれば挙動は変わります。昨日と同じ答えが今日も返る前提で仕組みを組むと、ある日いきなり壊れます。
なぜ揺れを残しておくのか
確実さが欲しい仕事から見ると、揺れは邪魔でしかありません。それでも既定では揺れる設定になっています。
理由は、人が書く文章がそもそも揺れているからです。論文が測ったのは、人の文章における確率の分布でした。人は毎回いちばん無難な語を選ぶわけではなく、意外な語を混ぜている。その揺らぎこそが、文章を文章らしくしているらしい。
確率の高い語だけを拾い続けると、当たり障りのない言い回しが積み重なり、同じ形が繰り返され、読めたものではなくなります。揺れを消すと自然さも消える、という関係にあります。
この事情は、記事や説明文を書かせるときに効いてきます。硬く固定した設定で書かせた文章は、読んだときにどこか平板です。文章を書かせるなら、揺れは残しておいたほうがよい。
再現したいときの手段
どうしても同じ結果を得たい場面はあります。試験や、比較の実験をするときです。
サービスによっては seed という値を指定できます。乱数の出発点を固定するもので、同じ seed と同じ入力なら、同じ出力に近づきます。
ただし提供側も、完全な再現は保証していないのが普通です。あくまで近づくという性質のもので、比較実験の条件を揃える用途に使うのが現実的でしょう。
検証の記録を残すなら、出力そのものを保存しておくほうが確実です。あとから同じ出力を作り直せる前提には立たないほうが安全です。
揺れを実務でどう扱うか
設定をいじるより効くのが、出力の形を縛ることです。
「はい」か「いいえ」で答えさせる。決められた選択肢から選ばせる。JSONの形を指定して埋めさせる。取り得る答えの幅を狭めれば、揺れる余地そのものが小さくなる。
逆に、自由に文章を書かせる仕事で揺れを消そうとするのは筋が悪い。毎回まったく同じ文章が欲しいなら、それはAIではなくテンプレートの仕事です。
検査を組み込む方法もあります。同じ入力を3回処理させて、答えが割れたら人に回す。揺れを消すのではなく、揺れたことを検知して拾う設計です。手間はかかりますが、間違いが致命的になる仕事では有効でしょう。
出典
確率最大化による文章の劣化と、核サンプリングについての記述は、下記の論文に基づきます。temperature・top_pパラメータの仕様は、OpenAIの公式APIリファレンスで確認しました。

