世界を動かす技術を、日本語で。

LLM推論における非決定性の克服

概要

  • LLM(大規模言語モデル)推論の再現性 は科学的進歩の基盤だが、現実には困難
  • 推論の非決定性 は「並列処理+浮動小数点演算」説だけでは説明しきれない
  • 浮動小数点の非結合性 が根本原因だが、それ自体は非決定性の直接要因ではない
  • 多くのGPUカーネルは決定的 に設計されており、推論の非決定性は他の要因による
  • LLM推論で本当に再現性を得るには、より深い理解と工夫が必要

LLM推論の非決定性の本質

  • LLM(大規模言語モデル)推論 では、同じ質問を複数回しても 異なる結果 が返る現象
  • サンプリング処理 により確率的にトークンが選ばれるため、これは自然な挙動
  • temperatureを0に設定 しても、APIやOSS推論ライブラリ(vLLM、SGLang等)で 完全な決定性は得られない 現実
  • 「並列処理+浮動小数点」仮説 がよく語られるが、これだけでは 全てを説明できない
  • 同じデータで同じ行列積を繰り返しても、GPU上でビット単位で一致する結果 が得られる事例も存在

浮動小数点演算の非結合性

  • 浮動小数点数 では、加算の順序によって 結果が異なる(非結合性)
  • 有限の精度と丸め誤差 のため、$(a + b) + c \neq a + (b + c)$ となる現象
  • 異なるスケール(指数)の値を加算 すると、情報の一部が失われる(丸め)
  • 加算順序の違い で、同じ配列を何通りもの結果にできる実例
  • この性質自体は非決定性の根本原因 だが、なぜ順序が変わるかは別の問題

カーネル実装と加算順序

  • 並列処理+浮動小数点仮説 は「atomic add(アトミック加算)」の存在を前提
  • atomic add はコアの終了順に依存し、 毎回異なる結果 になることがある
  • LLMのforward pass では、通常 atomic addは使われていない
  • バッチ並列性ツリー型リダクション 等の工夫で、 決定的な計算が可能
  • scatter_addやFlashAttention backward など一部の操作を除き、 forward passは決定的

LLM推論の再現性獲得のために

  • forward passが決定的 であっても、 API利用者視点では非決定的に見える 理由の存在
  • 本質的な非決定性の要因 は、カーネルの実装や要求のタイミング、外部要因など多岐
  • 本当に再現性のある推論 を得るには、 推論エンジンやシステム全体の設計理解 が必須
  • 決定的なアルゴリズムと環境制御 による再現性確保の重要性
  • LLM推論の再現性 は、単なる浮動小数点演算や並列処理だけでは語りきれない複雑な問題

Hackerたちの意見

完全に閉じた個別の入力-出力ペアの「理論的」非決定性を修正しても、同じ入力が異なる前提コンテキストによって異なる結果を出す「実用的」非決定性の2つの問題は解決しないよね。あと、少し変形した入力が正しく変形された結果を出さない問題もあるし。これらが解決されるまで、閉じたシステムの非決定性は、ルックアップテーブルで十分な場合を除いて、あまり役に立たないと思う。テストしていない入力について「正しい」ユニットテストや評価セットを使って何かを証明することはできないよ。

これ、バグの再現にめっちゃ役立つね。

「全く同じ入力だけど、異なる前提コンテキストがある」というものは存在しないよ。前提コンテキストは入力なんだから!もし特定の入力プロンプトに対して、コンテキストに関係なく全く同じ出力が得られるなら、それはコンテキストが無視されていることを意味する。つまり、セッションがどのコンテキストも維持していないのと同じで、各プロンプトが新しい空のコンテキストにあることになる。人々が求めているのは、例えば「意味が全く同じのプロンプトの異なる言い回しが出力に何も変化をもたらさない」こととか、「前のコンテキストが、コンテキストとの相互作用がない方法で応答を変えない」ことだと思う。例えば、「2 + 2は何?」というプロンプトが与えられたら、答えは常に同じであるべき。ただし、コンテキストが「2 + 2は5だ」と指示する場合を除いて。こういう要件は、これらのLLMが何であるかを誤解していることを示しているよ。

「あまり役に立たない」と言ったところまでは同意してたけど、それって「完全に問題を解決しない」って意味だったの?

同じ入力が異なる前提の文脈によって異なる結果を出す場合 なんでこれが問題なの?もし「前提の文脈」が異なる結果を引き起こさないなら、単に文脈を無視すればいいじゃん。なんでそれが必要なの?ツールがそう働くとは思わないよ(挿入モードに切り替えた後、vimが入力に対して違う反応をするのを期待してる)。知性がそう働くとも思えないし。これは最も極端な確認バイアスの形に聞こえるね。

非決定性の理由は実装に依存することもあるよね。例えば、GPT-2のソースコードでは(他のモデルバージョンは確認してないけど)、GUIで温度を設定しても0にはならず、「エプシロン」(0より少し大きい非常に小さい値)になるんだ。これはゼロ除算エラーを避けるためで、理にかなってる。多くのアプリケーションでは、非決定性は「無駄」を意味することがある。特に法律、金融、規制の分野では、もしメソッドが決定的でないなら、それを使うのは違法になるかもしれないし、望ましくないフォローアップの要件が生じることもある(例えば、人間に見せる全ての画面を保存しておかないと、特定のユーザーが特定の瞬間に何が起こったかを再構築できない)。

超面白い!知らない人のために言うと、これはミラ・ムラティ(OpenAIの前CTO)が始めた会社だよ。

高品質なブログスタイルの研究ディスカッションが大好き!最近、Anthropicがこの分野をリードしていて、広がっていくのを見るのは素晴らしいね。OpenAIも、RL研究の頃はこれをやってたよね。

自然言語は曖昧なんだよね。そうあるべきだと思う。ここで「円を四角にする方法を考えようとして、なぜ円が四角であるべきかを議論する」というアプローチは間違ってると思う。こういう議論は、最終的には言語における曖昧さやランダム性を受け入れる方法をより良く理解することに変わっていくし、小さなプロト文法を超えた他の大きなサブパターンでさらに形作られていくと思う。

そうだけど、決定論と曖昧さは違うよ。決定論ってのは、同じ入力に対して必ず同じ出力が必要ってことだからね。同じモデルに同じ質問をしたら、決定的に同じ答えが返ってくるべきだと思う。もし同じ質問を少し違う言い方で聞いたら、少し違う答えが返ってくるのが普通だよね。

会社の名前にはまだイライラしてる。これらのスキームの背後にある理由は何なんだろう?伝説的な会社の特性が新しいベンチャーにうつることを期待してるの?次のベストなベンチャーをPARCって名付けるだけで、ネットワーキングに革命が起きるって思ってるのかな。

1994年に閉鎖された「Thinking Machines」って会社のこと言ってるの?調べるのにちょっと時間かかったけど、あんまり有名じゃないから理由にはならないみたいだね。ただのいい名前(しかも比較的分かりやすい)だと思う。

その考えは、無料のマーケティングみたいなもので、商標が生まれた理由と同じだね。

これ、結構知られてることだと思ってたんだけど(少なくともJAX/XLAの世界ではね)。何度もこの問題にぶつかって、バッチのバリアンスについて説明されたこともあるよ:https://github.com/google-deepmind/penzai/issues/82 と https://github.com/jax-ml/jax/issues/20047#issuecomment-1975...

「Thinking Machinesの他の人たちと協力して」って、もしあなたが十分に年を取っていれば、80年代後半のダニー・ヒリスのThinking Machinesを覚えてるかも。別の名前を選んでほしかったな(これは懐かしさから言ってるんだけど、80年代後半にMITのAIラボで赤いLEDが光るキューブの前にいたから)。ファインマンもその件で素晴らしい仕事をしてたよ:https://longnow.org/ideas/richard-feynman-and-the-connection... アメリカでは、「THINKING MACHINES」の商標はThinking Machines Corporation(ヒリスが共同設立した会社)が所有していて、彼個人のものじゃなかったんだ。その登録は1998年から1999年にかけてキャンセルされた。USPTOの報告によると、その会社自体は1994年に破産して、資産は散逸した(例えば、サン・マイクロシステムズ、後のオラクルに)。2025年にはAmira Muratiが設立したThinking Machines Lab Inc.が「THINKING MACHINES」の新しい商標申請を出してるよ。

彼らの名前を見るたびにこの間違いをしちゃう。

Twitterでの面白い議論があったよ: https://x.com/thinkymachines/status/1965826369721623001 どうやら埋もれている重要な点は、オンポリシーRLがトレーニングとサンプリングの結果がビット単位で同じであることによって解放されるってことみたい。専門家じゃないけど、これによってラボがやってるRLトレーニングのデプロイメントとトレーニングの整合性について、より強い保証が得られるんじゃないかな。ビッグマスの例はちょっと理解できてないけど。彼らはオフポリシーRLVRがオフポリシーの補正を必要とすることを示していて、それが発散を避けるけど、ノイズの多い報酬を生むから最適じゃないって言ってる。そして「サンプラーとトレーナーの数値の不一致を修正したから、オンポリシーRLができるようになった、見て、どれだけ良くなったか」って言ってる。これが意図的に異なるトレーナー/サンプラーの設定を使った人工的な例なのか、それとも彼らの修正なしではトレーナーとサンプラーの間で同じ数値を持つのが実際に不可能なのかは、ちょっと分からないな(同じバッチサイズを使っても、アトミックじゃなくても、ね)。

他の人も指摘してるけど、こういう現象はAIインフラの分野で多くの人に知られてるよね。新しい発見ってわけじゃない。でもこの記事は基本的な戦略をうまく説明してると思う。個人的には、集団やマルチノードの設定についての議論があればよかったな。マルチノードの削減集団で、低いパフォーマンスペナルティで決定論を得る方法を示してほしかった。