ChatGPTの出力結果が毎回異なる理由
ChatGPTに同じプロンプトを入力しても、毎回同じ出力にはなりません。これは、ChatGPTが多様な文章を生成できるようにランダム性を取り入れているからですが、実は、それだけではありません。
また、画像生成AIでも、同一のプロンプト、同一のシード値などを使用しているにも関わらず、生成された画像が同じものにならないことがあります。
この問題に関して、MathematicaやWolfram Alphaの開発者であるStephen Wolfram氏が書いたブログ記事に面白い内容が書かれていましたので、これを参考に、解説していきたいと思います。
1.ChatGPTへのランダム性の導入
ChatGPTのベースとなっている大規模言語モデル(LLM)では、これまでに入力・生成されたテキストに続く次の単語(トークン)を予測して追加していくことによって文章を生成しています。
単語の選択は確率に基づいて行われますが、最も確率の高い単語だけを選んでいくと、単調でつまらない文章になりがちです。したがって、LLMでは、ランダム性を取り入れて、時々低い確率の単語も選ぶことによって、変化に富んだ面白い文章を生み出しています。
多くのLLMでは、どの程度低い確率の単語を使用するのかというランダム性をコントロールするためにTemperatureというパラメータを使用しています。ChatGPTの場合、Temperatureの範囲は0から2までであり、Temperature=0の場合は最も高い確率の単語のみを選ぶように固定され、Temperatureの値が大きくなると、低い確率の単語を選ぶことが多くなります。
実際に、OpenAIのPlaygroundでComplete(補完)モードのtext-davinci-003モデルを使用して、Temperatureの違いによる文章生成の変化を実験してみましょう。Temperatureを0,1,2と変化させ、「むかしむかしあるところに、」と入力して、生成される文章の変化を観察します。
最初にTemperature=0の場合です。
これでも実際の桃太郎の話とはだいぶ違いますが、常識的な文章になっています。
次にTemperature=1の場合を見てみます。
少し自由な文章になりました。最後の「タップル」という言葉が不穏です。
最後にTemperature=2の場合を見てみます。
このように、Temperatureの値が大きすぎると、文章が崩壊します。Temperatureは原則として、1以下に抑えておいた方がよいようです。
ここで、もう一度Temperature=0に戻して文章を生成します。
最初の方は同じですが、2文目の「おばあさんは家で料理をしていました。」の部分が「おばあさんは家で料理をしたり、洗濯をしたりしていました。」に変わっています。
さらに、一箇所でも変更になると、LLMは、その変更を前提として、次に来る単語を予測することになるので、どんどん文章がズレていきます。しかし、変更後の文章でも、Temperature=0でそれほど表現や発想の飛躍はないため内容は似ています。
Temperature=0の場合は、最も確率の高い単語のみを選択するので、同じ文章が出力されるように思いますが、実際には、このように、毎回少し変化します。これはなぜでしょうか?
2.LLMの出力結果が決定論的でない理由
Wolfram氏は、自分の開発したWolfram AlphaやWolfram言語をChatGPTのプラグインとして提供していますが、それ以外に、Wolfram言語の中に大規模言語モデル(LLM)の機能を導入しようとしています。
そのLLMの機能(LLM関数)を説明する記事の中に、LLMの出力結果が、同じ条件なら毎回同じ結果を繰り返すような決定論的なものにならない理由が書かれていました。これを参考にして、LLMの出力結果が変化する理由について解説します。
現在のニューラルネットワーク(NN)は、近似値で計算を行っているため、その数値の丸め誤差がNNの判断に影響を与えることがあります。丸め誤差とは、長い桁数の小数を扱う際に、これを一定の桁数で表すためにある桁以降の値を捨ててしまうことにより生じる誤差のことで、コンピューターによる浮動小数点型の数値計算などでよく現れます。
例えば、0.1234という数値について、小数点第4位以下を切り捨てて丸めると、数値は0.123となり、0.0004の丸め誤差が生じます。
特に、NNの場合は、特定の数値付近で出力値が大きく変化する活性化関数を適用することによって、数値的に近い入力値でも結果が大きく分かれる場合があり、丸め誤差の影響が大きくなります。
このため、端数処理方法の異なるハードウェアを持つサーバーで計算処理が行われると、LLMの出力結果が異なることがあります。
しかし、それだけではなく、同じ端数処理方法を持つ同じハードウェアを使用していても、出力結果が異なる場合があるのです。
3.同じハードウェアの場合
同じ端数処理方法を持つ同じハードウェアを使用する場合なら、丸め誤差も同じになるはずであり、出力結果に差は出ないような気がします。しかし、実際には、そのような場合でも、出力結果が異なる場合があります。
ニューラルネットワーク(NN)上の評価では、並列処理が可能な演算が沢山あります。そして、GPUを使用する場合には、これらの演算を一定数並列処理できるユニットが存在します。しかし、どの演算をいつ行うかは、GPUの詳細状態や履歴に依存するため、リアルタイムで精緻に最適化されるのが一般的です。つまり、様々なケースで、異なる順序で処理が行われる可能性があります。
例えば、あるときは、(a + b) + cの順序で計算することになり、あるときは、a + (b + c)の順序で計算することになります。
もちろん、標準的な数学では、普通の数a,b,cに対して、これらの計算結果はいつも同じになります。しかし、コンピューター上の限られた精度の浮動小数点数の計算では、以下のように等しくならないことがあります。
そして、こうしたわずかな誤差が存在するということは、GPUの演算順序が問題になり得ることを意味しています。個々の演算レベルでは、その影響は小さいですが、これがNNの分岐点にぶつかると、Tenperature=0で動作している場合でも、結果的に別のトークン(単語)が生成され、最終的に全く別の文章が生成されるという連鎖的な結果が発生する可能性があります。
これは、LLMが実行されるたびに同じことを行うことは期待できないことを意味しており、多くの場合、とても厄介なことです。
また、画像生成AIもNNを利用しているため、単語を一つずつ追加して文章を生成するLLMほどではありませんが、同一のハードウェア、同一のプロンプト、同一のシード値などを使用していても、生成される画像が変化する可能性があります。
4.GPT-4モデルの場合の比較
OpenAIのPlaygroundでChatモードのgpt-4モデルを使用して、Temperature=0の場合に「「むかしむかしあるところに、」の続きを書いてください。」と入力して、生成される文章に変化があるかどうか試してみました。
1回目も2回目もほとんど変わりませんが、後半の以下の部分が変更されています。
gpt-4モデルでも、やはりTemperature=0の場合に、生成される文章の一部が変わることがあるというのが分かります。
また、gpt-4モデルの方が、元々の桃太郎の物語の内容に忠実であるということも分かります。これは、gpt-3.5よりもgpt-4の方が精度が増していることに関係があるのでしょう。
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?