見出し画像

ChatGPTの出力結果が毎回異なる理由

ChatGPTに同じプロンプトを入力しても、毎回同じ出力にはなりません。これは、ChatGPTが多様な文章を生成できるようにランダム性を取り入れているからですが、実は、それだけではありません。

また、画像生成AIでも、同一のプロンプト、同一のシード値などを使用しているにも関わらず、生成された画像が同じものにならないことがあります。

この問題に関して、MathematicaWolfram 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=0の場合の出力結果

これでも実際の桃太郎の話とはだいぶ違いますが、常識的な文章になっています。
次にTemperature=1の場合を見てみます。

むかしむかしあるところに、おじいさんとおばあさんが住んでいました。
おじいさんとおばあさんは、子供時代を共に過ごした親友でした。彼らは、毎日一緒に朝から晩まで話しをし、おいしいものを食べ、夕方は芝生を散歩しました。
たまには、おじいさんは弦を弾いておばあさんと踊りました。一緒にきょうだいたちと笑いながら、遊んだり、芝生で花を見たりと、日々を楽しみました。
朝から夜まで、思い出のタップルを楽しんでいま

Temperature=1の場合の出力結果

少し自由な文章になりました。最後の「タップル」という言葉が不穏です。
最後にTemperature=2の場合を見てみます。

むかしむかしあるところに、
{「 明都子は七筷のエックス220 98--na14 ​、くיעのマechiness34 Veign 330亮 342ああpolomerpefhge435 spahgo 」 } (www30 』duensent 300 nm 156 epx efi 435 polaracerskm 77884 })0644ト71803の魔法使いが≒ 21 !=da12 423)71911 42)0 422 賔たニ haki 550っm 23まddmt

Temperature=2の場合の出力結果

このように、Temperatureの値が大きすぎると、文章が崩壊します。Temperatureは原則として、1以下に抑えておいた方がよいようです。

ここで、もう一度Temperature=0に戻して文章を生成します。

むかしむかしあるところに、おじいさんとおばあさんが住んでいました。
おじいさんは山へいつも植物を採集に行き、おばあさんは家で料理をしたり、洗濯をしたりしていました。
おじいさんとおばあさんは、子供たちに話をしたり、歌を歌ったりして、楽しい時間を過ごしていました。
夕方になると、おじいさんとおばあさんは、子供たちと一緒に庭で遊んだり、星を見たりして、楽しい時間を過ごしました。
おじいさんとおばあ

(再掲)前回の出力
むかしむかしあるところに、おじいさんとおばあさんが住んでいました。
おじいさんは山へいつも植物を採集に行き、おばあさんは家で料理をしていました。夜はおじいさんが話し言葉を聞かせ、おばあさんが歌を歌っていました。
おじいさんとおばあさんは子供たちに話し言葉や歌を教え、自然を大切にしていました。子供たちはおじいさんとおばあさんの話を聞き、自然を大切にするようになりました。おじ

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に対して、これらの計算結果はいつも同じになります。しかし、コンピューター上の限られた精度の浮動小数点数の計算では、以下のように等しくならないことがあります。

入力 {(0.6+0.8)+0.3}-{0.6+(0.8+0.3)}=
出力 -2.22045×10^(-16)

コンピューターによる浮動小数点数の計算結果

そして、こうしたわずかな誤差が存在するということは、GPUの演算順序が問題になり得ることを意味しています。個々の演算レベルでは、その影響は小さいですが、これがNNの分岐点にぶつかると、Tenperature=0で動作している場合でも、結果的に別のトークン(単語)が生成され、最終的に全く別の文章が生成されるという連鎖的な結果が発生する可能性があります。

これは、LLMが実行されるたびに同じことを行うことは期待できないことを意味しており、多くの場合、とても厄介なことです。

また、画像生成AIもNNを利用しているため、単語を一つずつ追加して文章を生成するLLMほどではありませんが、同一のハードウェア、同一のプロンプト、同一のシード値などを使用していても、生成される画像が変化する可能性があります。


4.GPT-4モデルの場合の比較

OpenAIのPlaygroundでChatモードgpt-4モデルを使用して、Temperature=0の場合に「「むかしむかしあるところに、」の続きを書いてください。」と入力して、生成される文章に変化があるかどうか試してみました。

むかしむかし、あるところに、おじいさんとおばあさんが住んでいました。二人はとても仲良く暮らしていましたが、子どもがいないことが唯一の心残りでした。
ある日、おじいさんは山へ柴刈りに、おばあさんは川へ洗濯に行きました。おばあさんが川で洗濯をしていると、流れてきた桃が目に入りました。おばあさんは桃を拾って、おじいさんと一緒に食べようと思い、家に持ち帰りました。
夕方、おじいさんが帰ってきて、二人で桃を食べようと切り開くと、中から元気な男の子が現れました。おじいさんとおばあさんは驚きましたが、男の子は「私は桃から生まれたので、桃太郎と名付けてください」と言いました。
おじいさんとおばあさんは、桃太郎を自分たちの子どもとして育てることにしました。桃太郎はすくすくと育ち、力持ちで勇敢な青年になりました。
ある日、桃太郎は「鬼が住む鬼ヶ島で人々を苦しめていると聞きました。私は鬼ヶ島へ行って鬼を退治し、人々を助けたいです」とおじいさんとおばあさんに告げました。おじいさんとおばあさんは心配しましたが、桃太郎の決意を受け入れ、持たせるものを用意しました。
桃太郎は旅に出ると、途中で

1回目の出力結果

むかしむかしあるところに、おじいさんとおばあさんが住んでいました。二人はとても仲良く暮らしていましたが、子どもがいないことが唯一の心残りでした。
ある日、おじいさんは山へ柴刈りに、おばあさんは川へ洗濯に行きました。おばあさんが川で洗濯をしていると、流れてきた桃が目に入りました。おばあさんは桃を拾って、おじいさんと一緒に食べようと思い、家に持ち帰りました。
夕方、おじいさんが帰ってきて、二人で桃を食べようと切り開くと、中から元気な男の子が現れました。おじいさんとおばあさんは驚きましたが、男の子は「私は桃から生まれたので、桃太郎と名付けてください」と言いました。
おじいさんとおばあさんは桃太郎を自分たちの子どもとして育てることにしました。桃太郎はすくすくと育ち、やがて立派な青年になりました。
ある日、桃太郎はおじいさんとおばあさんに、「この国を苦しめている鬼を退治しに行きたい」と言いました。おじいさんとおばあさんは心配しましたが、桃太郎の決意を受け入れ、持たせるものを用意しました。
桃太郎は旅に出ると、途中で犬、猿、キジに出会いました。彼らは桃太郎について行くことにし、一緒に鬼退治に向

2回目の出力結果

1回目も2回目もほとんど変わりませんが、後半の以下の部分が変更されています。

【1回目】ある日、桃太郎は「鬼が住む鬼ヶ島で人々を苦しめていると聞きました。私は鬼ヶ島へ行って鬼を退治し、人々を助けたいです」とおじいさんとおばあさんに告げました。
【2回目】ある日、桃太郎はおじいさんとおばあさんに、「この国を苦しめている鬼を退治しに行きたい」と言いました。

1回目出力と2回目出力の比較

gpt-4モデルでも、やはりTemperature=0の場合に、生成される文章の一部が変わることがあるというのが分かります。

また、gpt-4モデルの方が、元々の桃太郎の物語の内容に忠実であるということも分かります。これは、gpt-3.5よりもgpt-4の方が精度が増していることに関係があるのでしょう。


この記事が参加している募集

AIとやってみた

この記事が気に入ったらサポートをしてみませんか?