
2026/05/16 12:34
シュアンールの予想とトリトンの浮動小数点数のセマンティクスについて
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
以下の改善されたサマリーは、欠落していた技術的な詳細を統合し、マップの性質を明確にしながらも可読性を維持するものである。
## サマリー: FPSan は、浮動小数点数プログラムにおける代数的同値性を検証するために設計された Triton コンパイラパスであり、結合律など浮動小数点数の法則によって引き起こされるエラーを回避するために、演算を等価な整数算術に変換するものである。このツールの作成者は著者および Pawel Szczerbuk であり、理論的な正しさを確保するために実数の版のシューネールの仮説(Schanuel's conjecture)に依存している点で特異である。技術的には、FPSan は特定のエンドコードを用いて IEEE-754 シングルの浮動小数点数を 2^32 を法とする整数環に対して全単射的にマッピングし、符号ビットを保存し、負のゼロを 2^31 として処理する。基本的な算術演算(+、-、*、exp)は、このモジュラー環内の対応する整数演算に置換され、三角関数(sin/cos)は角度の恒等式を満たすために、2-adic 整数上の環の列を用いて実装される。実装には、2-adic ニュートン法を用いた洗練された逆計算手法が含まれ、高精度埋め込みによるハイブリッド精度環境への対応も支援する。現在、FPSan は GPU メトリックス乗算や自己注意機構を含む複雑な機械学習タスクにおいて実証されており、実数上で同値である回路が、ツールの検証フレームワーク内で依然として同値であることを形式的に保証している。
本文
最近、Pawel Szczerbuk と共同で「FPSan」というツールの開発に時間を割いてまいりました。これは Triton コーパスのコンパイラパスとして実装されていますが、通常のコンパイラパスが備えるべき所期の特性を一切備えておりません:具体的には機能を保証するどころか処理速度を低下させ、かつこれまで完全にドキュメント化されていません(後者の点については、Pawel よりも既にドキュメンタリを追加するためのオープンな PR が提出されています)。
本ツールの目的は、Trition で記述された浮動小数点算術を含むプログラムの代数的同値性を検証するのを容易にすることにあります。核心となる問題は、浮動小数点算術においては結合法則のような代数的法則が厳密には成り立たないという点です。一般的に言えば、(a + b) + c が必ず a + (b + c) に等しいとは限りません。したがって、この事実に基づいてプログラムを再構成した場合(例えば、逐次総和のループを並列的な木構造の還元置換することなど)、プログラムの振る舞いは完全に同一ではなくなります。
FPSan は、プログラム空間上の冪等な関数と見做せます。この関数は、すべての浮動小数点演算を(全く異なる!)整数演算に置き換え、代数的同値なプログラム f と g に対して、f と g が同値であれば、FPSan(f) と FPSan(g) は同じ入力を与えられた際に同一の結果を生じさせることを保証します。
より形式的には、Schanuel の仮説の実数版が成立するという条件下において、以下の性質を備えるプログラム f と g に対してのみこの主張が成り立ちます:
- 各プログラムは浮動小数点入力に対して算術回路を実装しており、その制御フローはこれらの浮動小数点入力には依存しません。
- その算術回路は、入出力端子、定数{-1.0, 0.0, +1.0}、環演算{−, +, ×}、および指数関数 exp のみから構成されます。
これらの演算是やや制約が強いように見えるかもしれませんが、既に機械学習に広く関与する多くの一般的な GPU コアネル(行列乗算および自己注意機構の大部分など)を FPSan の保証範囲内におさめるほどに広範です。
証明については本稿の末尾に後回しにすることにより議論の流れを乱さないよう配慮しております。恐らくこれは、超越論数の極難しい未解決問題である Schanuel の仮説の妥当性にコンパイラサンタイザー(正しさ)が依存する唯一の例かもしれません。
実装
具体的には、FPSan は IEEE-754 シングルフローティングポイントの数値セット(2^32 個)から、2^32 に対する剰余環への全単射な「埋め込み関数」φ を構築します。この関数 φ は以下の手順で実装されています:
- IEEE-754 エンコーディングを使用して浮動小数点値を 32 ビットのワードとして符号化します。
- 上位ビット(符号ビット)は保持します。
- 残りの 31 ビットについては、まず奇数定数による mod-2^31 乗算を行い、次に xorshift を適用し、さらに奇数定数による第 2 の mod-2^31 乗算を行います。そして最後に(符号ビットが設定されていた場合)、二の補数を求めます。
- その 32 ビットのワードを、2^32 に対する剰余整数として解釈します。
この設計は、ビットをよく混ぜ合わせつつ、すべての非ゼロ x に対して φ(−x) = −φ(x)、φ(0.0) = 0、φ(1.0) = 1 の性質を備えるようになっています。「負のゼロ」浮動小数点値は 2^31 にマッピングされ、これは 2^32 に対する剰余環において加法的に自己逆となるもう一つの要素です。
この関数を用いて、FPSan は以下の置換を行います:
- 浮動小数点加算 fadd(x, y) を φ^-1(φ(x) + φ(y)) に
- 浮動小数点減算 fsub(x, y) を φ^-1(φ(x) − φ(y)) に
- 浮動小数点乗算 fmul(x, y) を φ^-1(φ(x) × φ(y)) に
- 浮動小数点べき関数 exp(x) を φ^-1(C^φ(x)) に(ここで C は 8 で割ったあまりが 5 である特定の定数)
最後の定義は、2^32 に対する剰余整数の乗法群の構造を利用しています。具体的には:
- 逆元が存在するため乗法群に含まれるのは、2^31 個の奇数の要素(すなわち 2 で割ったあまりが 1 のもの)のみです。
- これらのうち、4 で割ったあまりが 1 の 2^30 個の要素は乗算に対して巡回群を形成します。
- さらにそのうち、8 で割ったあまりが 5 の 2^29 個の要素は生成元(あるいは等価に言えば最大周期を持つ)であり、これが C を 8 で割ったあまり 5 と選ぶ理由です。
写像 x → C^x は、C^(2^32) = 1 (mod 2^32) であるため mod 2^32 で良好に定義されており、C^x (mod 2^32) は x の値 mod 2^32 にのみ依存します。これは我们的法度数が 2 のべき乗であるから可能であり、任意の法度数 n に対しては一般に指数が n を割り切るわけではありません。
書き換えた fadd, fsub, fmul, および exp は明らかに環の公理、恒等式 exp(fadd(x, y)) = fmul(exp(x), exp(y))、および関係式 exp(0.0) = 1.0 をすべて満たします。
ミキープシジョン機能
FPSan は、任意の浮動小数点データ型に対する埋め込み関数 φ の analogue を構築し、同じ基数を持つ整数環へマッピングします。j ビットから k ビットへのダウンキャストには、高精度な j ビット浮動小数点を mod 2^j の整数環へ埋め込み、その後 mod 2^k で画像を取り、低精度の k ビット浮動小数点として再埋め戻しますアップキャストはその逆過程であり、mod 2^k の整数から mod 2^j の整数への「符号拡張」 lifts を選択します。これにより、特に{-1, 0, 1}の定数は異なる精度間での任意の型変換でも生存します。アップキャストに続けてダウンキャストを行うと恒等写像が誘発されますが、逆は成立せず(ダウンキャストは必然的に情報を破壊するため)です。
埋め込み関数とその逆関数における乗算子構築には、mod 2^k に対する効率的な逆元の計算が必要であり、これは ceil(log2(k)) 回の 2-adic ニュートンの法によって実現します。
Pawel は、Triton のミキープシジョン行列乗算原始関数 tl.dot を FPSan 同等物に変換するルールを作成しました(これを浮動小数点スカラー演算へ展開することで)。混合関数 φ および φ^-1 は各入力および出力要素にのみ適用され、行列乗算の核心は int32 の乗算と加算だけで構成されます。
証明
ついに楽しいパート:Schanuel が FPSan の所期の性質を蕴含することを示す証明です。 実数体上の二つの算術回路 f と g を考えてみましょう。これらはそれぞれ入力、出力端子、定数{-1, 0, +1}、環演算{−, +, ×}、および指数関数 exp のみから成り立っています。さらに、それらが写像 ℝ → ℝ から同じ関数を実装しているという同値性も仮定します。 Schanuel の仮説の実数版を仮定すると、{0, −, +, ×, exp} で生成される実数体 R の部分環 X は、Macintyre (1991) により証明された通り、何もない生成元を持つ自由指数環に同型であることが得られます。回路が R 上で同値であれば、X に制限したときも必然的に同値であり、その同型性によって何もない生成元を持つ自由指数環上で同値であることがわかります。
mod 2^32 の整数環と単項関数 C^x(ここで C は 8 で割ったあまりが 5 である特定の定数)との組は、何もない生成元を持つ自由指数環の商です。特に、写像 θ(exp(x)) = C^θ(x) を設定することで、何もない生成元を持つ自由指数環から mod 2^32 の整数環への全単射な準同型写像 θ を構築できます。 したがって、それゆえに FPSan 下でも回路は同値性を保持し、それは埋め込み関数 φ を通じて操作を引き戻すことにより、浮動小数点数に指数環の構造を与えるだけだからです。
正弦と余弦
我々はまた、形式記号 i(满足 i^2 = −1)を附加することで得られる二次拡大体における (−3/5 + 4/5 i)^n の実部および虚部として、2-adic 整数上での正弦関数と余弦関数の analogue を実装しました。これらは三角関数の角度の和・差の恒等式に加え、通常のノルム恒等式 sin(x)^2 + cos(x)^2 = 1 を満たします。 得られた結論(Schanuel の仮説を仮定し、実数上で成立する{0, 1, −, +, ×, exp}を含む任意の正当な代数恒等式が FPSan 下でも成り立つ)は強化されます:sin と cos も含まれた場合も同様に真です。
以下の二つの環の列を定義します:
- 実数の部分環の上昇鎖 {Y_0, Y_1, Y_2, …}、ここで Y_0 = ℤであり、Y_{n+1} は Y_n に含まれるすべての x に対して exp(x), sin(x), cos(x) を附加して生成される環です。
- 複素数の部分環の上昇鎖 {W_0, W_1, W_2, …}、ここで W_0 = ℤ[i]であり、W_{n+1} は W_n に含まれるすべての x に対して exp(x) を附加して生成される環です。
n についての帰納法により、W_n が正確に Y_n[i] であることを示せます(かつ特に Y_n は W_n の実部です)。特に、これが n-1 で成立すると仮定すれば:
- x が Y_{n−1} に含まれるなら、exp(x)、cos(x) = (exp(ix) + exp(-ix))/2、および sin(x) = (exp(ix) – exp(-ix))/(2i) は明らかに W_n に含まれます。
- z が W_{n−1} に含まれるなら(したがってその実部 a および虚部 b が Y_{n−1} に含まれる)、exp(z) の実部および虚部はそれぞれ exp(a) cos(b) および exp(a) sin(b) となり、これらは Y_n に属します。
すべての n に対する Y_n の合同を定義して Y とし、同様にすべての n に対する W_n の合同を定義して W とすると、W = Y[i] が得られます。
ここで Macintyre の証明アイデアを W_n の列に対して繰り返すことができます:複素版の Schanuel の仮説を仮定すれば、i^2 = −1 を満足する i によって生成された自由指数環が W であることがわかります。Y における{0, 1, −, +, ×, exp, cos, sin}を含む代数関係を転換し、W における{0, 1, i, −, +, ×, exp}に関する代数関係に変えることができ、かつこれは i が i^2 = −1 を満足する任意の指数環で成立しなければなりません。結論が得られます。