本章では、LLMが問題を解決する際の固有の計算能力について議論します。モデルが多くの難しい問題を分析し、どのように「考える」かは非常に示唆に富んでいます。
前の章:
例1
エミリーは3つのリンゴと2つのオレンジを買いました。各オレンジの価格は2ドルで、合計金額は13ドルです。リンゴの価格はいくらですか?
これは非常に簡単な数学の問題です。ここで、モデルが以下のように2つの異なる回答を出したと仮定します。それぞれ左側と右側にあります。この2つの答えはどちらも正しい結果を導き出しました、つまり3しかし、その中の一つの答えはアシスタントにとって明らかに優れている一方で、もう一方は非常に悪い答えです。

データラベラーはトレーニング例として一つを選択する必要があります。その場合、一つの答えが非常に悪いとされ、もう一方は許容できるものとされます。間違った答えを使用すると、モデルは数学的な計算において非常に悪くパフォーマンスを発揮し、不良な結果を引き起こす可能性があります。
この問題のポイントは、モデルがトレーニングや推論を行う際に、常に次のように動作することを認識し、覚えておくことです:左から右への一方向のトークン列として処理される計算を行います。トークン列は左から右へと進化し、次のトークンを生成するたびに、これまでのすべてのトークンがニューラルネットワークに入力され、そのネットワークが計算を行います。次のトークンの確率分布。
この計算プロセスでは、入力されたトークンがニューラルネットワークに送られ、多数のニューロンによる演算を含む一連の計算が実行され、最終的に次のトークンの確率分布が出力されます。
ここで理解すべき重要な点は、数学的にはこのプロセスにおいて計算層の数が有限であるということです。以下の例では3層ですが、現代の最先端のニューラルネットワークでは約100層しかし、どのような場合でも、前のトークン列から次のトークンの確率を導出するために実行される計算の層数は常に有限です。

各トークンの計算量はほぼ一定ですが、これは完全には正しいとは言えません。なぜなら、入力されるトークンの数が増えれば、ニューラルネットワークのフォワードパス(forward pass)の計算コストも増加しますが、その増加は顕著ではありません。したがって、序列内の各トークンに対して、おおよそ一定の計算量があると考えるのが良い理解方法です。
この計算量はあまり大きくならないはずです。なぜなら、モデルの層数は有限だからです。縦方向に見ても、計算する層数はそれほど多くないので、単一のフォワードプロパゲーションでは任意の複雑な計算を実行することはできません。これは、モデルの推論と計算プロセスが複数のトークンに分散されなければならないことを意味します。なぜなら、単一のトークンは限られた計算リソースしか消費しないからです
特定のトークンを生成する際にモデルが大量の計算を完了することを期待することはできませんトークンごとの計算量は固定であり、モデルの層数によって制限されます。したがって、私たちは複数のトークン間で計算負荷を分散させる必要がありますモデルに段階的に推論を行わせ、特定のトークンで全ての計算を完了することを期待しないようにします。これが先ほどの例で、ある答えが他の答えよりもずっと劣っている理由です。

モデルが左から右へと順番にトークンを生成しなければならないことを想像してください。それは次々と出力する必要があります“The answer is ”(答えは)、その後は“$”(ドル記号)、その後すぐにこの重要な位置必要があります全体の数学的な計算プロセスを圧縮するに一つのトークン(下の図における18)においては、つまり正しい答え「3」を直接出力します。

問題は、モデルが出力した瞬間です“3”このトークンが出ると、その後のトークンはただ答えに対する後続の説明、しかしこれは実際の計算プロセスではなく、事後の補足。言い換えれば、モデルが「3」を生成した時点で答えはすでに決まっており、その後のテキストは既知の答えに基づいて展開されているだけですモデルが実際に数学的な計算を行う方法には影響しません。
もし訓練データがモデルに推論プロセスを経ずに最終的な答えを直接出力させる場合、それは実際的にはモデルを推測するように答えを導き出すのではなく計算答えこれは推論プロセスでは機能しません、なぜなら各トークンは限られた計算量しか使用できません。
それがなぜです右側の答えは明らかに優れています。——それは計算プロセスを分散させ、一つのトークンに一括して圧縮するのではなく段階的に処理します。右側の答えでは、モデルが最終的な答えを段階的に導き出しています:
オレンジの合計価格は4ドルです。 合計金額13ドル - オレンジの価格4ドル = 9ドル 9ドルを3個のリンゴで割ると、1個あたり3ドルです。
この段階的な推論方法は、各トークンが相対的に単純な計算を実行するだけでよく、すべての推論を一気に行う必要がないようにします。これはモデルの計算制限に適合するだけでなく、推論プロセスで正しい答えを導き出すのがより容易になります。
もしモデルが訓練中に一度にすべての内容を計算するその場合、推論時に複雑な計算を実行できない可能性が高いです。なぜなら各トークンが実行できる計算は制限されているからです。したがって、正しい訓練方法は、モデルに推論プロセスを複数のトークンに分散させることです。これにより、推論時に正しい計算を実行できるようになります。
これはプロンプト設計時に重要ですが、通常の状況ではユーザーがこの問題を明示的に考慮する必要はありません。なぜなら、OpenAIのアノテーターがデータアノテーションの際に最適化を行っており、ChatGPTが数学の問題に答える際には徐々に答えを導き出すように設定されているからです。答えを直接与える代わりに、例えば、まず変数を定義し、方程式をリストアップし、段階的に解いていきますこれを行う目的は人間に説明することではなく、むしろモデル自身が推論を行うのを助ける。もしモデルがこれらの中間ステップを自ら生成できない場合、正しい答え「3」を導き出すことはできません。
例2
もし大規模言語モデル(LLM)に直接答えを出し、推論を許さない場合がある。例えば、同じ数学の問題を提供するが、モデルに単一のトークンで答えることを要求するつまり、答えを直接出力し、余分な計算を行わないでください。
この簡単な問題に対して、モデルは成功裏に一度の順伝播(forward pass)で正しい答えを出しました。しかし、この答えは実際には2つのトークンから成っています。なぜならドル記号も$
独立したトークンだからです。そのため、厳密に言えば、それは完全に要求通りには動作していませんでした。単一のトークン内での完了は依然として一度のフォワードパス正しい答えを導き出しました。
しかし、この結果は単純な数字に限定されます。難易度を上げてみると、例えばエミリーは23個のリンゴと177個のオレンジを買いましたこうすることで、問題の計算量が増えました。モデルに再び要求しました単一のトークン内で回答するようにその結果、モデルは「5」と答えました——この答えは間違っています。

どうしてこんなことが起こるのでしょうか?問題が複雑になると、モデルが一度のフォワードプロパゲーションですべての計算を完了できなくなります。言い換えれば、単一のトークン内で全ての数学的演算を完了できないため、最終的に計算誤差が発生するのです。
キャンセルするとき単一トークン制限、モデルに通常の方法で問題を解かせる場合、それは一連の中間計算、例えば:

オレンジの合計価格を計算する リンゴの合計価格を計算する 一つのリンゴの価格を計算する
これら中間の計算ステップモデルにとって、各トークンの計算量は比較的小さいです。そのため、正しい答えを正確に導き出せます。7しかし、もし一度のフォワードプロパゲーションで要求される場合、内でのすべての計算を完了すると、モデルの能力を超えてしまい、計算上の誤差が生じます。
なぜモデルの暗算は信頼できないのでしょうか?
実際の応用では、モデルの暗算能力を完全に信用することはできません。特に数字が大きくなるとその傾向が強くなります。なぜならニューラルネットワークは本質的に数学的な計算を実行するのに適していないからです。それは単にパターン認識を通じて近似的な推論を行っているに過ぎません。
より信頼性の高い方法は、モデルにコードを呼び出させることで計算を完了させることです。例えば、モデルに心算能力ではなく Python コードを使用させて計算を行わせることができます。モデルがPythonコードを生成して計算を実行し、そのコードの正確性はモデルの「心算」よりも信頼性があります。

モデルは本質的にテキスト予測システムであり、Python インタプリタは数学的計算を専門に行うツールです。LLMがプログラムを記述し、コンピュータがプログラムを実行し、その後LLMが演算結果にアクセスします。モデルに自分で計算させるよりも、Python コードを呼び出すようにすべきです。その方が結果がより正確になるからです。
例3
同じ理由により、モデルはカウントにおいても性能が悪いです。
例えば、モデルに一連の点(「.」)を提供して、「次に何個の点がありますか?」と尋ねます。
モデルは直接単一のトークン内で点の数を計算しようとしますが、しばしば誤った答えを出します。

なぜですか?なぜならそれは、すべての計算を一度のフォワードプロパゲーションで完了しなければなりませんしかし単一のトークン内の計算能力は限られていますそしてそれらの下位のトークンIDを通じて処理されます。したがって、点の数を正確に数えることはできません

もし別の方法を採用すれば、それをPythonコードで実現させるには、モデルはこのようなコードを生成します:

この場合、モデルのタスクは単に入力をコピーすることです、その後、Pythonインタプリタを呼び出して実行します。len(dots)
点の数を計算します。これはモデルに直接数えさせるよりもはるかに信頼性がありますなぜなら、Pythonインタプリタは確定的な計算を行うからです。確定的な計算モデルのニューラルネットワークによる推論は不安定です。