Positの構造
Positの数は、次のような構造になっている。Signが1bitあるのはIEEE 754 floatと同じであるが、regimeというfloatには無いビット欄がある。そして、exponentとfractionはfloatとほぼ同じで、exponentは2進で、fractionにはヒドンビットがある。しかし、exponentにはバイアスが無く、exponentの符号はregimeビットのrの0/1で表現する。
数値表現の構造としては、まず、exponentがesビットある。しかし、必ず、esビットの長さがあるとは限らず、exponentが0の場合は0bitになるというように、exponentのビット数は可変である。
Regimeビットは同じrというビットがn個続き、rの否定のビットが出てくると終わりを示すという構造になっている。そして、rの0/1で+nと-nを表す。冗長な表現のようであるが、regimeに必要なビットは多くても5ビット程度でそれほど多くは無い。そして、regimeは2esが単位で、esビットで表すexponentの上位にnが付いているという形になる。
このような構造であるので、regimeに多くのビットを必要とする非常に大きい、あるいは非常に小さい数ではfractionのビット数が減り、精度が低下することになる。一方、regimeビットが少なくて済む0付近の数はfractionに多くのビットを使えるので、精度の高い表現ができる。これはマシンラーニングなどの計算には嬉しい特徴である。
次の図は、477/134217728≈3.55393×10-6をPositで表現した例である。まず、signが0であるので正の数である。そして、regimeは0001であり、0の連続であるので負の数、1が出る前の0の連続は3個であるので、regime=-3である。es=3の数であるので、exponentのビット数は3で、regimeの単位は(2の(2のes乗))であり256となる。従ってregimeの部分が表す数は256-3である。そして、exponentは101なので、この部分は25となる。
Fractionは左端に小数点があり、その上位にヒドンビットの1があるという形式であるので1+221/256を表している。
結果として、このPosit数は、477/134217728≈3.55393×10-6である。
次の図の円の内側は普通の数値で、円の外側はPositで表現したビット列である。Positを使うことにより、(16bit以下の長さでは、)floatに比べてダイナミックレンジも精度も改善されている。
また、Positでは半数の数ではregimeには2ビットしか使っておらず、fractionに使えるビット数が多い。
次の表は8ビットから64ビットの形式でのFloatとPositのダイナミックレンジを比較したものである。16bitのIEEE float(FP16)はダイナミックレンジが小さく、Googleはbfloat、IntelはFlexpointを作った。しかし、Positを使えばダイナミックレンジが広く、4倍以上の精度が得られる。
MLの学習に最適なPosit16
次の図は16ビットでのFloatとPositのダイナミックレンジと精度の比較である。16ビットのPositはダイナミックレンジが広く、0付近の数値の精度が高く、信号処理にも向いている。
次の表は5種のイメージ認識を4つの数値表現で行った場合の結果を比較したもので、表の欄の数値は、正しく分類された比率を示している。Float16とBfloatは最初の2つのケースではなんとか分類できているが、その他の4つのケースでは大半が誤分類となっている。一方、Posit16は倍のビット数のFloat32と大差ない成績になっている。
また、FacebookのJohnson氏は、Positを使うことによってfloat16やbfloatに比べて消費エネルギーを1/9に低減できたと報告しているという。
部分的に精度を上げるQuire
科学技術計算などでは精度が不足する場合があるが、それを解決するため、PositではQuireというメカニズムがあるとGustafson教授は述べた。 Quireはビット長の長いレジスタで、内積計算などで多数の小さい値を足す場合でも計算の中間結果の格納にQuireを使えば桁落ちを起こすことが無い。Quireを使うとより精度の高い内積計算ができるし、掛け算のオーバフローやアンダフローを起こすことも無いという。 歴史的に精度の高い計算はスポット的に使用されてきたが、プログラマとしては全部を高精度にしてしまう方が簡単で、そちらに偏ってしまっている。しかし、必要なところだけQuireを使う方が効率の良い計算ができる。 カールスルーへ大学はコンパイラで自動的にQuireを使う方法を発明した。その特許が最近、期限が切れて自由に使えるようになった。この方法を使えばプログラマに負担を掛けることなく高精度の計算を行うことができる。
QuireのサイズはPositのビット数の2乗の半分で、32bitのPositでは512bitが必要となる。
Gustafson教授はIEEE floatからPositへの移行には10年掛かると見ている。また、移行ではなく両方のモードをサポートするのが一般的になるかも知れない。しかし、時間がたてばPositがデフォールトになる。
この移行は文字がASCIIからUnicodeに変わったような移行で、逐次実行から並列実行に変わったのとは異なり、移行はずっと容易である。
まとめであるが、Positの使用により、HPCでの数値の標準サイズを32ビットに戻すことができる。また、累積計算を誤差なく行うことができ、ダイナミックレンジも広いので、マシンラーニングの学習も16ビットで行える。
Quireの使用はコンパイラやライブラリ作成で隠され、アプリケーションプログラマの負担にはならない。と述べて発表を締めくくった。
HPCやマシンラーニングの学習に必要な計算が現在の半分のビット数で行えるようになれば、消費電力の削減だけでもかなり大きい。また、必要なトランジスタ数が減り、より多くの演算器をGPUチップに詰め込むことができるようになる。ということで、Positは面白い可能性を秘めている。