« 続・FPGAのLUTで作るバイナリニューラルネットのアーキテクチャ考察 | トップページ | LUT-Netの力技での学習部分について »

2018年9月 2日 (日)

LUT型のネットワーク考察のその後(途中経過)

このところひたすらLUT型の演算ネットワークにはまっています。

ちょっとした思いつきからスタートした事ですが、やる程に面白みと期待が増して行きつつ、やることはどんどん増えている印象です。
まず今回のアイデアであるLUT型のネットワークノードを整理しておきます。
 
-----
[メリット]
  • 「FPGAのLUTのモデルは1ノードで多次元のXORが解ける点で積和のみのニューロと根本的に異なるモデルである」
  • 「積和と同じ結果を出す状態も包含しており、入力数を置いておけば、Predictionの記述手法としては従来の積和型ニューロの上位互換である」
  • 「力技(Brute-force)で学習させた限り、少ないLUT数である程度の認識が実際に出来た」
  • 「FPGAにそのままマッピングできる点で、非常に高速&コンパクトに実装できる」
[デメリット]
  • 「誤差逆伝播のような大規模ネットワークの学習方法が確立できていない(力技だとNP問題になりかねない)」
  • 入力数の限界が4~6程度である」
  • 連続体としてモデル化すると実装規模が爆発的に肥大化する(バイナリでないと評価困難)」
  • 「FPGA以外のデバイスで実行すると非効率」
-----
 
 まず、メリットについて確認しておきます。
 下記はNMIST画像を784-720-240-80 (LUT数:1040個)のLUT層で力技で学習させた時の状況です。
 各LUTで統計を取りつつ、結果が良化する方向にLUT内のテーブルのbitを変えていくという事を繰り返しています。
 
Lut
 
 力技のわりに、比較的短時間で学習していますし、消費リソースを考えれば費用対効果としては十分に高い認識率を示しているのではないかと思います(比較対象がないので断言できないですが)。
 実際、いろいろな試行錯誤の過程では90%を超える認識率も達成できていますし、実際にRTL化して合成したところXC7Z020-1CLG400Cで、400MHz以上の速度条件で配置配線まで出来ています。
 まだ未検証ですが、LUT内のテーブルの各bitに対する学習なので、各ノードは積和モデル以外の形状にもなっている可能性が高く、それが高密度化に寄与している可能性があると考えられます。
 
 そこで、なんとかこのモデルの活用を最終ゴールに据えた上で、既存のディープラーニング等の技術を活用して、ある程度大規模なもをを学習可能な状態に出来ないものかと考え始めたわけです。
 既存のディープラーニングの状況と言えば
  • 「入力ノードに重みをつけた積和のモデルで多層の学習方法が実証されており、日々さらなる効率化に向けて新しいネットが提案されているホットな状況」
  • 「XNOR-Netなど、ネットのバイナリ化の道も見え始めている」
 という状況で、バイナリ化の成功が非常に期待が持てるところですし、実際に、XNOR-NetなどをFPGA化すると非常に効率が良いとの事です。
 しかしながら、XNOR-NETと言えど、既存の積和型のバイナリ化なので、実装視点で見た場合に以下の課題が考えられます。
  • 「6個以上の入力を持つノードは、実際は6入力LUTなどが多段で合成される(高速化の妨げ)」
  • 「LUTの持つ多彩な表現力が積和の結果の写像の範囲でしか使われない(実装密度向上の妨げ)」
 というFPGAへの実装時にまだまだ性能向上の余地があるのではないかとも思えるわけです。
 ここで、今回のLUT型モデルのアイデアへの積和型モデルのディープラーニングの適用への課題は大きく2つです。
  • 6入力などの限定されたネット構造にマッピングしたい(テンソル構造の破壊)」
  • 「6次元XORにも対応できるLUTの持つ高い表現力を活かして高密度化したい」
 課題に対するアプローチは、道筋は大きく3種類出てきます。
  1. 「6入力モデルの従来ネットワークを作り学習させ、それを2値化後にLUT特有の上位モデルで追加学習を行う」
  2. 「従来モデルで深い学習をさせ、それを教師に層単位など深くない範囲で力技学習で高密度なLUTモデルを学習させる」
  3. 「LUTモデルのアナログモデルのまま深い学習が出来る逆伝播モデルを確立する」
 などが思いつくところです。
 理想は3番目ですが、非常に先が長そうなので(思うところはあるのですが)、後に回して、まずは従来の積和モデルのニューロ素子の入力を6個などに限定して学習可能かを確かめていきたいと思います。
 下記は6入力に限定したニューロ、すなわち層内が全結線ではない層を積み重ねた場合の誤差逆伝播によるMNISTの学習の過程です。
 6
 
 
 実装にはまだ色々課題もありますが、6入力素子の集合体でちゃんと誤差逆伝播による学習が進行することが示せました。
 もともと層間を全結合するのは、モデルをテンソルで記述できて、数式としても見通しがよく、CPUやGPUにとっても演算効率が良いという部分があります。
 入力数を限定すると、各ノードのインプットのアクセスがランダムアクセスになるので、CPU/GPUの演算割り当てやメモリに優しくなく、演算効率が大きく低下するのは事実です。が、だからと言って、学習しなくなるわけではないということが実際に確認できたのはまずは安心材料かと思います。
 ここで、従来の浮動小数点積和ニューロの値を2値化して、FPGAのLUTテーブルにしたいわけですが、ネット自体はForwardもBackwardも単精度浮動小数点の多値ですので本来は工夫が必要です。
 ただ、まだそこまで手が回っていないので、まずは味見でそのまま2値化してみたのが下記です。
 Acc
 
 real_netと書かれている行が、単精度浮動小数での6入力積和+sigmoid というモデル(ReLU はLUTとモデルが合わないので)で、bin_netが内部のWeightを単純2値化して写し取った評価結果です。無学習だと精度は0.1ですので、性能は置いておいて「写す」ことで多少なりの特性のコピーは出来るようです。ここでは同じ6入力モデルを作ればパラメータ移植の可能性があることを示せたのでまずは良かったと思います。
 
 ただし、流石に何の工夫も無くもまともな性能は出ないようです。
 XNOR-Netなどでは、バイナリ化するのを前提に、量子化時の誤差が最小化するように工夫して学習を進めているようなのでそういったテクニックの入力数限定版が必要になりそうです。また Batch Normalizationの存在なども大きく関わってくる可能性があります。
 そもそも入力数を限定してしまうと、CNNなどの畳み込み層が1層で記述できないので、多層構造の畳み込みを行う必要があり、これもまた従来にないアーキテクチャにする必要がありそうです。
 本当にまだまだ先が長いです。
 
 実際、ここに至るまで、ネットの組み換えや評価が出来るフレームワークを作るほうに時間を取られていたりもします。コードは github 上に上げながら開発を進めています。
 
------------
(おまけ)
 ちなみに、LUTモデルの連続体モデルについては、N入力に対して、N次元の状態変数(テーブル)を内部に持つ素子のモデルを考えています。
 簡単のために2入力で2次元を考えると、例えばXORに相当する内部のテーブルは以下のようになります。
 
Xor
 ノードへの2入力(x, y) はインデックスとして機能し、出力はテーブルを引いた結果を出力します。
 この場合、誤差の逆伝播を考えると、テーブルの形状を変更するという方向と、入力の(x, y)をテーブルの勾配に従って移動させると言う2つの方法がありますので、それぞれに対して誤差伝播適用の可能性があります(勾配が定義できるモデルを仮定することが非常に重要と思います)
 ただし、テーブルの適用自体が、例えば6入力LUTの場合、各軸をINT8で256階調にしても 256^6 = 281,474,976,710,656 個のテーブルになるので、現実的にPCにテーブルを持たせるのは困難です。2値まで縮退しているので 2^6 = 64個のテーブルで済んでいるわけで、多値モデルで学習させて最後に予測のみバイナリで実装するという手は容易ではなさそうです。
 

« 続・FPGAのLUTで作るバイナリニューラルネットのアーキテクチャ考察 | トップページ | LUT-Netの力技での学習部分について »

FPGA」カテゴリの記事

Deep Learning」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: LUT型のネットワーク考察のその後(途中経過):

« 続・FPGAのLUTで作るバイナリニューラルネットのアーキテクチャ考察 | トップページ | LUT-Netの力技での学習部分について »