XNOR-Netが二値化ニューラルネットの性能を大きく改善する

XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks が出てきた。Abstractを読むと、「This results in 58x faster convolutional operations」とか「XNOR-Nets offer the possibility of running state-of-the-art networks on CPUs (rather than GPUs) in real-time」とか、ワクワクするようなことが書いてある。というわけで中身もザッと読んでみた。

XNOR-NetとBinaryNet、BDNNの違い

XNOR-Netは、既存のBinaryNetやBDNNとほぼ同じであるが、新しいテクニックとして、スケーリング係数が導入される。

スケーリング係数の導入は簡単である。入力を$\bm{x}$, 重み行列を$\bm{W}$とし、それを二値化したものを$\bm{B}$とする。スケーリング係数を$\alpha$とすると、これらの関係は次の式で表される。

$$\alpha^* , \bm{B}^* = \text{argmin}_{\alpha, \bm{B}} || \bm{W} - \alpha \bm{B} ||^2 $$

なんか微分とかして計算すると、$\bm{B}^* = \text{sign} (\bm{W})$となり、$\alpha^* = \frac{1}{n} ||\bm{W}||_{l1}$となる。

入力値も二値化する場合、入力テンソル側にもスケーリング係数が増えるが、話はほぼ同じである。

convolutionの場合には、単純にスケーリング係数を計算すると、入力テンソルのスケーリング係数の計算量がかなり大きくなってしまうが、これは効率化できる。チャンネル方向にあらかじめ平均をとっておけばよい。

なぜXNOR-Netなのか

BinaryNetは、MNISTやCIFAR-10ではstate of the artに近い性能を発揮できていたが、ImageNetに対してはそううまくはいかなかった、というのが彼らの実験結果である。ネットワーク構造としてAlexNetを用いた場合、Full PrecisionではTop-5 accuracyが80.2であるのに対し、BinaryNetでは50.42と、大幅に精度が下がってしまう。XNOR-Netを用いると、Top-5 accuracyは69.2となり、11ポイント程度の低下で抑えられる。Full Precisionと比べるとまだまだ差は大きいが、30ポイント低下と比べるならば、だいぶよい結果になっている。また、重みだけを二値化する場合、精度の低下は3ポイント程度に抑えられる。

なぜ58倍も速くなるのか

ほとんど同じ手法であるにもかかわらず、BinaryNetで7倍の高速化だったのがXNOR-Netで58倍になっているのは、XNOR-NetがCPU実装で速度比較しているからだろう。GPUだともともと並列度が高く効率のよい処理をしているので、そこまで劇的に速くならないのだと考えられる。(7倍の高速化は十分に劇的ではあるが。)

ただ、58倍というのはSSE命令などを使わない場合の話であって、Broadwell以降のIntel CPUであれば、8つの積和演算を同時に実行できるはずなので、ここまで大きな差はつかないのではないか。

感想

重みだけを二値化するのであれば、ImageNetのような難しいタスクであっても、かなりの精度が出せることが示された。しかし、重みだけを二値化するのでは、それほど高速になるわけではなく、実用上はそれほど大きなインパクトはない。やはり、入力値の二値化が必要であるが、この場合には性能低下がまだ無視できないレベルであり、今のところは未解決問題である。

しかし、ここ数ヶ月の二値化業界の進展の速さを見ていると、後1年ぐらいしたら問題が解決できていても不思議ではない、と期待してしまう。

参考文献

このエントリーをはてなブックマークに追加

Latest articles