量子化とはなにか?
そして、どのような部分がQuantizeできるのか? Quantizeで認識精度がどう変わるか? Quantizeしたニューラルネットをどのようにして学習させるかという問題が出てくる。
次のグラフは、CIFAR-10というイメージのデータセットの認識をFP32で計算した場合(左)とEfficieraのQuantize(右)で行った場合の認識率を示すものであるが、Efficieraのw1a2という少ないビット数でも認識率の低下は1.4ポイントと僅かである。
しかし、何時もうまく行くわけではなく、もっとたくさんの画像を含むImageNetの場合は、w1a2のquantizeでは精度が10.9ポイントと大きく低下してしまう。
これに対しては、次の図のように畳み込み層のフィルタのチャネルを倍増するという方法を取った。チャネル数を倍増するとハードウェア量は倍増するがActivationとWeightの両方のビット数を倍増して演算精度を高めるよりコストの増加は小さい。
次の棒グラフは、 CIFAR-10の認識率の比較であるが、精度がFP32の場合は94.9%に対してw1a2の場合は93.5%であったが、チャネル数を128に倍増すると94.4%に改善した。
そして、55.8%と大幅に認識率が低下したImageNetであるが、チャネル数を倍増すると64.7%とFP32に対して2ポイントの差まで回復した。
QuantizeでActivationやWeightを切り詰めると認識精度はほとんどの場合、低下する。この低下は小さい場合もあるが、許容できない大きな低下が起こる場合もある。このような時には、フィルタのチャネル数を倍増するというのは多くの場合、有効な手段である。
Weightの学習は通常、FP32などでの学習を行い、その結果をQuantizeするという方法と、最初からQuantizeを考慮した学習を行うという方法が考えられる。前者は簡単にできるが、非常に少ないビット数のニューラルネットの場合にはうまく行かない。
非常に少ないビット数の場合の学習は、まず、WeightをQuantizeする。そして畳み込み層の前にQuantizeを追加する。
簡単のためにQuantizeされたWeightは-1と+1だとすると、次の右側の図のようなQuantize関数を適用する。
Activationは1と0にQuantizeするとすると、次の図のようなステップ関数のQuantize関数をそれぞれの畳み込み層の前に入れる。
入力から認識結果を計算するフォワードステップはこれで良いが、Weightの学習のために誤差を出力から入力に逆伝搬する場合は伝達関数の微分が必要になる。しかし、ステップ関数は入力=0では微分ができず、それ以外のところでは出力が0となってしまい、うまく働かない。
そこで、LeapMindでは、逆方向伝搬のステップでは、ステップ関数の代わりに入力が1を超えると出力が1で止まってしまうClipped ReLUという関数を使うことにした。次の図の左側のグラフがCReLUで、右側のグラフはCReLUの微分である。
また、最近では1bitのActivationやWeightを使う2値化ニューラルネットの論文も多くなってきているが、最初と最後の畳み込み層はQuantizeすると誤差が大きくなるので、これらの層はQuantizeされていない論文が多い。また、Quantizeするのは畳み込み層だけで、その他の部分はFP32を使っている論文が多い。
最初の畳み込み層はQuantizeの影響が大きく、次のグラフに見られるように、12.13ポイントも認識率が低下してしまう。
しかし、最初の畳み込み層をQuantizeしないで実行するとなると、次の図のように、この層の実行時間だけで40%以上の時間を使ってしまう。
そこで、LeapMindでは、言語理解で使われているWord Embeddingという方法にヒントを得て、ランダムに初期化されたベクトルを埋め込む手法を考案した。このやり方をLeapMindではPixel Embeddingと名付けた。
次のグラフは左が入力を単純にQuantizeした場合、中央がFP32で計算した場合、右がLeapMindのPixel Embedingを行った場合の認識精度を示す。単純量子化では12.1ポイントの低下であるが、Pixel Embeddingで1.3ポイントの低下まで回復している。
次のグラフは上記の3つのケースの実行時間を比べたもので、最初の畳み込みをFP32で行うと279.4ms掛かるが、LeapMindのPixel Embeddingを使ってw1a2で計算すると160.8msで終わる。処理時間的にはPixel Embeddingには3.3msしかかかっていない。
非常に少ないビット数のQuantizeを行う場合は、Quantization向けの学習を行うことが非常に重要である。しかし、非常に少ないビット数でも必要に応じてチャネル数の倍増などを行えばFP32での計算に近い認識精度を達成することができる。最初の畳み込み層への入力のQuantizeは認識率の低下が大きいが、Pixel Embeddingを使うことで精度低下を抑えてFP32での計算に近い精度を達成することができる。
次の表にEfficieraアクセラレータの仕様の一覧を示す。Efficieraは1024個、あるいは4096個の積和演算器を搭載する。計算精度は1bit、2bitと16bitの整数が使えると書かれている。1bit/2bit精度の積和なら4096個、16bit整数の積和なら1024個ということではないかと思われる。
対応するニューラルネットは、現状、CNN(Convolutional Neural Net)だけで、フレームワークもTensorFlowだけである。そして、LeapMindのSDKが提供される。