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に多くのビットを使えるので、精度の高い表現ができる。これはマシンラーニングなどの計算には嬉しい特徴である。

  • Posit

    Positの構造。RegimeというIEEE 754にはないビットがある。符号1bitは固定であるが、それ以外は表す数値によりビット数が変わる。exponentとfractionはIEEE 754とほぼ同じでヒドンビットを持つが、exponentにはバイアスがない (出典;Beating Floating Point at its Own Game: Posit Arithmetic John L. Gustafson, Isaac Yonemoto,DOI: 10.14529/jsfi170206)

次の図は、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

    477/134217728≈3.55393×10-6をPositで表現した例 (出典:Beating Floating Point at its Own Game: Posit Arithmetic, John L. Gustafson, Isaac Yonemoto, DOI: 10.14529/jsfi170206)

次の図の円の内側は普通の数値で、円の外側はPositで表現したビット列である。Positを使うことにより、(16bit以下の長さでは、)floatに比べてダイナミックレンジも精度も改善されている。

また、Positでは半数の数ではregimeには2ビットしか使っておらず、fractionに使えるビット数が多い。

  • Posit

    PositとFloatとの比較。左の円は5bitのPositで表現できる数値に点が打ってある。内側が分数による数値の表現で、外側はPosit表現のビット列。Positでは(0付近では)27bitがFractionに使えるが、Floatではexponentのビットが多く、Fractionに使えるのは23ビットで精度が低くなる

次の表は8ビットから64ビットの形式でのFloatとPositのダイナミックレンジを比較したものである。16bitのIEEE float(FP16)はダイナミックレンジが小さく、Googleはbfloat、IntelはFlexpointを作った。しかし、Positを使えばダイナミックレンジが広く、4倍以上の精度が得られる。

  • Posit

    IEEE floatとPositのダイナミックレンジの比較。32bit以上の場合はFloatの方がダイナミックレンジが広いが、16bitの場合はPositの方がダイナミックレンジが広い

MLの学習に最適なPosit16

次の図は16ビットでのFloatとPositのダイナミックレンジと精度の比較である。16ビットのPositはダイナミックレンジが広く、0付近の数値の精度が高く、信号処理にも向いている。

  • Posit

    16ビットのFloatとPositのダイナミックレンジと精度の比較。16ビットのPositはダイナミックレンジが広く、0付近の数値の精度が高く信号処理にも向いている

次の表は5種のイメージ認識を4つの数値表現で行った場合の結果を比較したもので、表の欄の数値は、正しく分類された比率を示している。Float16とBfloatは最初の2つのケースではなんとか分類できているが、その他の4つのケースでは大半が誤分類となっている。一方、Posit16は倍のビット数のFloat32と大差ない成績になっている。

また、FacebookのJohnson氏は、Positを使うことによってfloat16やbfloatに比べて消費エネルギーを1/9に低減できたと報告しているという。

  • Posit

    5つのマシンラーニングのテストをFloat32、Float16、Bfloat、Posit16で実行した結果。それぞれの欄は正しく分類された比率を示す。Float16とBfloatは最初の2つ以外のテストではうまく分類できなかった。Posit16は倍のビット数を使うFloat32と大差ない成績である。また、FacebookのJohnson氏は、PositはFloat16やBfloatと比べてエネルギー効率が9倍に改善と報告

部分的に精度を上げるQuire

科学技術計算などでは精度が不足する場合があるが、それを解決するため、PositではQuireというメカニズムがあるとGustafson教授は述べた。 Quireはビット長の長いレジスタで、内積計算などで多数の小さい値を足す場合でも計算の中間結果の格納にQuireを使えば桁落ちを起こすことが無い。Quireを使うとより精度の高い内積計算ができるし、掛け算のオーバフローやアンダフローを起こすことも無いという。 歴史的に精度の高い計算はスポット的に使用されてきたが、プログラマとしては全部を高精度にしてしまう方が簡単で、そちらに偏ってしまっている。しかし、必要なところだけQuireを使う方が効率の良い計算ができる。 カールスルーへ大学はコンパイラで自動的にQuireを使う方法を発明した。その特許が最近、期限が切れて自由に使えるようになった。この方法を使えばプログラマに負担を掛けることなく高精度の計算を行うことができる。

  • Posit

    歴史的には高精度の計算はスポット的に使われてきた。カールスルーエ大学は自動的にQuireを使う方法を考案した。その特許の期限が切れたので、コンパイラでQuireを使うコードが生成できる

QuireのサイズはPositのビット数の2乗の半分で、32bitのPositでは512bitが必要となる。

  • Posit

    標準的なサイズのPosit演算の中間結果を格納するQuireに必要なビット数。32ビットのPositの場合、Quireは512ビットの長さが必要

Gustafson教授はIEEE floatからPositへの移行には10年掛かると見ている。また、移行ではなく両方のモードをサポートするのが一般的になるかも知れない。しかし、時間がたてばPositがデフォールトになる。

この移行は文字がASCIIからUnicodeに変わったような移行で、逐次実行から並列実行に変わったのとは異なり、移行はずっと容易である。

  • Posit

    Gustafson教授はFloatからPositへの移行には10年掛かるが、いずれはPositが標準になるという。この移行はASCIIからUnicodeへの移行のようなもので、難しくないという

まとめであるが、Positの使用により、HPCでの数値の標準サイズを32ビットに戻すことができる。また、累積計算を誤差なく行うことができ、ダイナミックレンジも広いので、マシンラーニングの学習も16ビットで行える。

Quireの使用はコンパイラやライブラリ作成で隠され、アプリケーションプログラマの負担にはならない。と述べて発表を締めくくった。

  • Posit

    Positを使えばHPCの計算を32bitに戻すことができる。また、マシンラーニングの学習を16ビットで行うことができる。Quireの使用もコンパイラやライブラリの作成時に行われアプリケーションプログラマの負担にはならない

HPCやマシンラーニングの学習に必要な計算が現在の半分のビット数で行えるようになれば、消費電力の削減だけでもかなり大きい。また、必要なトランジスタ数が減り、より多くの演算器をGPUチップに詰め込むことができるようになる。ということで、Positは面白い可能性を秘めている。