モデル圧縮技術の「二値化」について勉強してみた。

はじめに

はじめまして。Business Divisionの杉本です。
今年の3月末からLeapMindにJoinし、主に営業を担当しております。

お客様から、ディープラーニングをカメラに組み込みたい、家電に組み込みたい、既存の検査機器に組み込みたい、といったお話を多く伺います。

カメラや家電といったあらゆる機器の中にディープラーニングを組み込むことを考えた場合、非常に限られたリソースの中で動作させる必要があります。

ところが、従来のディープラーニングのモデルはサイズが大きいため、モデルのサイズを小さくしなければ組み込むことが出来ないケースがほとんどです。

そこで、モデルのサイズを小さくする「モデル圧縮技術」が必要となります。

今回は、モデル圧縮技術の中でもホットな技術の1つである「二値化」について論文もご紹介しながらお伝えします。

ディープラーニングの推論環境について

二値化について説明する前に、まずはディープラーニングについて簡単におさらいをします。

ディープラーニングには学習と推論のフェーズがあります。

学習と推論について噛み砕いて理解するために、猫か犬かを判別するケースを考えてみます。猫か犬かを判別するために画像を入力し、猫か犬かを判別するモデルを構築(=学習)します。そして、未知の画像(学習用の画像とは別の画像)を与えた時に、その画像が猫か犬かを判断する(=推論)こととなります。

(※ディープラーニングに関しての説明は「ディープラーニング(deep-learning)とは?【入門編】」を参照ください)

学習については多大な計算量が必要となるため、クラウドサーバーもしくはGPUで行われるケースが多いです。
推論についてもGPUやクラウドを利用するケースが多くあげられます。

GPUを利用するメリットとして処理速度が早いことがあげられますが、一方で消費電力が大きいことが課題です。
そのため、例えば消費電力が限られたカメラの中やドローンの中でディープラーニングモデルの推論を実行することは難しくなります。

また、クラウドでディープラーニングを動作させる場合、インターネット環境さえあれば場所を選びません。
一方で例えばトンネルの中といった非インターネット環境では利用することができず、またインターネットを介して情報のやり取りが発生するため、レスポンスが遅くなります。

これら従来のディープラーニングの推論環境とは別の選択肢の1つとして近年注目を集めているのが「FPGA」というデバイスです。

FPGAとは「Field-Programmable Gate Array」の略であり、任意の論理機能を実装できることに強みがあります。プログラムに特化した回路を設計できること、且つ、回路を何度も書き換え可能であることに特徴があります。
また、FPGAは低消費電力で動作させることが可能になります。
さらに、非インターネット環境でも利用することが可能です。

そんなFPGAですが、メモリ容量として非常に限られているため、通常のディープラーニングモデルだとサイズが大きくFPGA上で動作しません。

そのため、FPGA上で動作するには冒頭でも触れた「モデル圧縮技術」が必要です。

今回は、モデル圧縮技術の中でも「二値化」に関する論文「Binarized Neural Networks」(以下、BNNs)を紹介します。

まず、簡単に従来のディープラーニングの構造について触れながら、紹介論文における工夫したポイントをお伝えします。

ディープラーニングの構造とBNNsでの工夫

ディープラーニングで扱うパラメータとしては2つあります。

1つは入力に対する重み、もう1つは活性化関数に通された出力となります。
活性化関数はにはシグモイド関数やReLU関数がよく利用されます。(図1参照)
(ここでいう重みとはそれぞれの入力に対しての係数であり、入力に対して重みを掛け合わせ、その入力の値を増減させるもの)
ディープラーニングの特徴はこの演算を複数階層に渡って行われることにあります。(図2参照)

GPUやクラウドでディープラーニングを扱う場合、活性化関数の出力が32ビット(浮動小数点)で表現されており、モデルのサイズが大きくなります。

そのため、容量が限られたFPGA上ではサイズが大きすぎるため、動作させることが難しくなります。
紹介論文では重みと活性化関数の出力が二値化(-1,+1)されるように処理をする手法を提案しています。(図3参照)
この手法を用いて重みと活性化関数の出力を二値化させて推論させることで、メモリー使用量を減らしています。
また、二値化させることで算術演算をビット演算に置き換えることが可能となり、計算量は少なくなります。結果として電力効率を向上させることにつながっています。

本手法を用いることで重みと活性化関数の出力を32ビットから1ビットにできただけでなく、精度はほぼ低下せず、同水準となっています。
具体的には、MNIST、CIFAR-10、SVHNのデータセットを用いて本手法に基づく性能評価を行った結果、二値化する前の手法と比べても精度は同等となっています。

さらに、MNISTでは、classificationにおいて精度を担保しながらも処理が7倍早くなるという実験結果となっています。

 

 

図1:ニューラルネットワークの構造_1

 

図2:ニューラルネットワークの構造_2

 

図3:従来手法とBNNsの比較

論文のまとめと所感

本論文でのポイントは重みや活性化関数の出力を二値化させことにあります。
※二値化させてどのように学習させるかについてもメソッドがあるため、別の機会にお伝えできればと思っております。

これにより得られるメリットは、
①32ビットではなく1ビットとなるため、メモリ使用量が少なくなること。
②二値化することでそれまで算術演算であったものがビット演算に置き換わり、計算量が削減されること
です。

このようにモデルのサイズを小さくし、計算量を削減させるという二値化の手法を用いることで、FPGAといった限られたメモリ容量の中でも、ディープラーニングを動作させることを可能にしています。

最後に

今回のBlog記事ではディープラーニングの推論環境と圧縮技術である二値化について触れました。
FPGAのようなメモリが制限された中で、ディープラーニングを動作させるためには様々な手法や技術があり、今回はその中の1つに触れたに過ぎません。

今後のBlog記事で他の手法についても述べていきたいと考えておりますので引き続きお付き合いください。

BNNsを実装するのは難しい。しかし、使ってみたい。そんなときは・・・?

この記事を読んでいただいた方の中にはディープラーニングを用いた課題解決を考えている方も多いと思います。
例えば・・・
・不良品判定システムにディープラーニング技術を取り入れて、精度をあげたい。
・既存製品にディープラーニング技術を組み込んで、付加価値をあげたい。
・ディープラーニングでなにができるのか実証実験を簡単に行いたい。

仮に、ディープラーニングを自社内で実装し、機器に組み込む場合、技術を正確に理解する必要があるため、非常にハードルは高く、気軽に試すことは難しい状況でした。

ただ、非エンジニアの私でも、たった1日で簡単にモデル構築を行うことができるソリューションがあります。

それが弊社で提供している組込みディープラーニングモデル構築ソリューション「DeLTA-Lite」になります。

DeLTA-Liteを用いることで ”プログラミング不要で” ディープラーニングのモデル構築からエッジデバイスへの実装までを簡単に行うことが可能です。
詳しい情報はぜひ、こちらのサイトをご覧ください。

以上、杉本でした。

<参考文献>
ゼロから作るDeep Learning――Pythonで学ぶディープラーニングの理論と実装(斎藤 康毅 著)

 

杉本 直樹

Posted by 杉本 直樹

Leave a reply

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です