用語集 · コンピューティング
浮動小数点数
別名:Floating point、float32、float64、32-bit、single precision、double precision、rounding error、FP32、単精度、倍精度、丸め誤差、浮動小数点
コンピュータが実数を保存する方法です。決まった桁数の有効数字と指数で表すので、計算結果はどれもわずかに丸められます。
コンピュータは、ほとんどの実数を正確には保存できません。科学的記数法の のように、決まった桁数の有効数字と指数を持つだけです。32ビットの数(単精度、float32)は10進で約7桁、64ビットの数(倍精度、float64)は約16桁の有効数字を持ちます。
足し算のたびに、収まる中で最も近い数に丸められます。そのため、同じ計算を違う順番で行う2つのプログラムは、最後の数桁が異なる結果を出すことがあります。シミュレーションでは、このごく小さな差が時間とともに大きくなります。倒れかけた鉛筆をちょっとつつくと、落ちる場所が変わるのと同じです。ですから、2台のマシンで「同じ」物理というのは、丸めの範囲内で同じという意味であって、ビット単位で同じという意味ではありません。
GPUは32ビットで最も速く動きます。データセンター向けGPUの多くは、ニューラルネットワーク向けに低い精度(16ビット以下)を売りにしていますが、物理シミュレーションの役には立ちません。
このプロジェクトでは
CPUのシミュレータは64ビットで、GPU上のMuJoCo Warpは32ビットで計算します。レンタルGPUで学習するでは、新しい質量行列の分解を、同じエピソードで標準のものと照らし合わせました。関節角は1〜5ステップ後で100万分の1ラジアンまで、10ステップ後で5e-5まで一致しました。一方、標準のランの初期状態を100万分の1だけずらしただけで、1ステップ後にはすでに3e-4ずれました。つまり、2つは32ビットで可能な限り近く一致しています。
2人のファイターと視覚では、GPU環境をtorch.compileでコンパイルしたところ、プロジェクトのnumpy定数(np.radians(4.0) など)が64ビットの配列になり、一部の報酬と観測が元に戻すまで64ビットで出てきました。同じ記事では、CPUの学習器のネットワーク計算に16ビットのbfloat16も試しています。