量子化とはなにか?

そして、どのような部分がQuantizeできるのか? Quantizeで認識精度がどう変わるか? Quantizeしたニューラルネットをどのようにして学習させるかという問題が出てくる。

  • Efficiera

    大幅にビット数を切り詰めるといっても、どこが切り詰められるのか? 切り詰めにより、精度はどう変わるか? 切り詰めたニューラルネットの学習はどうやって行うのか? などの問題が出てくる

次のグラフは、CIFAR-10というイメージのデータセットの認識をFP32で計算した場合(左)とEfficieraのQuantize(右)で行った場合の認識率を示すものであるが、Efficieraのw1a2という少ないビット数でも認識率の低下は1.4ポイントと僅かである。

  • Efficiera

    CIFAR-10イメージデータベースの認識の場合はw1a2に切り詰めても認識率の低下は1.4ptとわずかである

しかし、何時もうまく行くわけではなく、もっとたくさんの画像を含むImageNetの場合は、w1a2のquantizeでは精度が10.9ポイントと大きく低下してしまう。

  • Efficiera

    ImageNetという大きなイメージデータベースの認識の場合は、Quantizeすると10.9ptと大幅に認識率が低下してしまった

これに対しては、次の図のように畳み込み層のフィルタのチャネルを倍増するという方法を取った。チャネル数を倍増するとハードウェア量は倍増するがActivationとWeightの両方のビット数を倍増して演算精度を高めるよりコストの増加は小さい。

  • Efficiera

    ImageNetでの精度低下に対しては、ここに名前を挙げた論文で提案されているフィルタのチャネル数を増やす方法を取った

次の棒グラフは、 CIFAR-10の認識率の比較であるが、精度がFP32の場合は94.9%に対してw1a2の場合は93.5%であったが、チャネル数を128に倍増すると94.4%に改善した。

  • Efficiera

    CIFARの認識精度。左からFP32での計算、w1a2の計算、w1a2でフィルタのチャネル数を倍増した計算の3つのケースの認識精度

そして、55.8%と大幅に認識率が低下したImageNetであるが、チャネル数を倍増すると64.7%とFP32に対して2ポイントの差まで回復した。

QuantizeでActivationやWeightを切り詰めると認識精度はほとんどの場合、低下する。この低下は小さい場合もあるが、許容できない大きな低下が起こる場合もある。このような時には、フィルタのチャネル数を倍増するというのは多くの場合、有効な手段である。

  • Efficiera

    ImageNetの認識率の比較。左からFP32、w1a2量子化、w1a2でチャネル数倍増の結果。w1a2では10.9pt低下したが、チャネル数倍増で2pt低下まで回復した

Weightの学習は通常、FP32などでの学習を行い、その結果をQuantizeするという方法と、最初からQuantizeを考慮した学習を行うという方法が考えられる。前者は簡単にできるが、非常に少ないビット数のニューラルネットの場合にはうまく行かない。

  • Efficiera

    ビット数の非常に少ないニューラルネットの場合は、FP32での学習結果のビット数を切り詰めるという方法ではうまく行かない。低精度用の学習を使う必要がある

非常に少ないビット数の場合の学習は、まず、WeightをQuantizeする。そして畳み込み層の前にQuantizeを追加する。

  • Efficiera

    WeightのQuantizeを行う場合は、左側の通常の学習の処理の前にWeightをQuantizeする処理を追加した右側の図のようにする

簡単のためにQuantizeされたWeightは-1と+1だとすると、次の右側の図のようなQuantize関数を適用する。

  • Efficiera

    WeightのQuantizeは入力が負なら-1、正なら+1を出力する関数を適用する

Activationは1と0にQuantizeするとすると、次の図のようなステップ関数のQuantize関数をそれぞれの畳み込み層の前に入れる。

  • Efficiera

    ActivationのQuantizeは入力から出力に向かうフォワード方向の計算では、それぞれの畳み込み関数の前にステップ関数を入れる

入力から認識結果を計算するフォワードステップはこれで良いが、Weightの学習のために誤差を出力から入力に逆伝搬する場合は伝達関数の微分が必要になる。しかし、ステップ関数は入力=0では微分ができず、それ以外のところでは出力が0となってしまい、うまく働かない。

  • Efficiera

    ステップ関数の微分は入力が0では値が定義されず、0以外の点では微分は0になってしまいうまく学習ができない

そこで、LeapMindでは、逆方向伝搬のステップでは、ステップ関数の代わりに入力が1を超えると出力が1で止まってしまうClipped ReLUという関数を使うことにした。次の図の左側のグラフがCReLUで、右側のグラフはCReLUの微分である。

  • Efficiera

    ステップ関数ではうまくいかないので、LeapMindでは代わりにClipped ReLU関数を使っている。この左側グラフがCReLU、右側のグラフはCRえLUの微分である

また、最近では1bitのActivationやWeightを使う2値化ニューラルネットの論文も多くなってきているが、最初と最後の畳み込み層はQuantizeすると誤差が大きくなるので、これらの層はQuantizeされていない論文が多い。また、Quantizeするのは畳み込み層だけで、その他の部分はFP32を使っている論文が多い。

  • Efficiera

    2値化ニューラルネットの論文は増えてきているが、最初と最後の畳み込み層は量子化されていない論文が多い。また、量子化は畳み込み層だけで、その他の層はFP32を使っているという論文も多い

最初の畳み込み層はQuantizeの影響が大きく、次のグラフに見られるように、12.13ポイントも認識率が低下してしまう。

  • Efficiera

    最初の畳み込み層をFP32で計算すると認識率は55.85ポイントであるが、Quantizeすると12.13ポイントも認識精度が低下してしまう

しかし、最初の畳み込み層をQuantizeしないで実行するとなると、次の図のように、この層の実行時間だけで40%以上の時間を使ってしまう。

  • Efficiera

    最初の畳み込み層の計算をQuantize無しで計算すると、その層だけで120ms掛かってしまい、全体の実行時間が279.4msと長くなってしまう

そこで、LeapMindでは、言語理解で使われているWord Embeddingという方法にヒントを得て、ランダムに初期化されたベクトルを埋め込む手法を考案した。このやり方をLeapMindではPixel Embeddingと名付けた。

  • Efficiera

    Pixel Embeddingは、ピクセル値を低次元のdense表現に変換する

次のグラフは左が入力を単純にQuantizeした場合、中央がFP32で計算した場合、右がLeapMindのPixel Embedingを行った場合の認識精度を示す。単純量子化では12.1ポイントの低下であるが、Pixel Embeddingで1.3ポイントの低下まで回復している。

  • Efficiera

    左から、単純Quantize、FP32での計算、Pixel Embeddingを適用した場合の認識率。Pixel Embeddingを適用するとFP32の計算と比較して1.3ポイントの精度低下でおさまっている

次のグラフは上記の3つのケースの実行時間を比べたもので、最初の畳み込みをFP32で行うと279.4ms掛かるが、LeapMindのPixel Embeddingを使ってw1a2で計算すると160.8msで終わる。処理時間的にはPixel Embeddingには3.3msしかかかっていない。

  • Efficiera

    FP32で最初の畳み込み層の計算を行うと279.4ms掛かるが、最初の畳み込み層をPixel Embeddingを使って低精度で計算すると160.8msで済む

非常に少ないビット数のQuantizeを行う場合は、Quantization向けの学習を行うことが非常に重要である。しかし、非常に少ないビット数でも必要に応じてチャネル数の倍増などを行えばFP32での計算に近い認識精度を達成することができる。最初の畳み込み層への入力のQuantizeは認識率の低下が大きいが、Pixel Embeddingを使うことで精度低下を抑えてFP32での計算に近い精度を達成することができる。

  • Efficiera

    量子化の結論。学習を行うときは、低ビット精度向けの学習方法を使うことが重要である。非常に少ないビット数のネットワークでも、チャネル数を倍増するなどの方法と組み合わせると、FP32での計算に近い精度を得ることができる。最初の畳み込み層の低ビット精度化は難しいが、LeapMindが考案したPixel Embeddingを使えば高い精度が得られる

次の表にEfficieraアクセラレータの仕様の一覧を示す。Efficieraは1024個、あるいは4096個の積和演算器を搭載する。計算精度は1bit、2bitと16bitの整数が使えると書かれている。1bit/2bit精度の積和なら4096個、16bit整数の積和なら1024個ということではないかと思われる。

対応するニューラルネットは、現状、CNN(Convolutional Neural Net)だけで、フレームワークもTensorFlowだけである。そして、LeapMindのSDKが提供される。

  • Efficiera

    Efficieraの仕様(ただし、製品版では変わることがあり得る)。データサイズは1bit、2bitと16bitの整数で、サイクル当たり1024積和演算あるいは4096積和演算が行なえる。サポートされているのは畳み込みニューラルネットだけである