« FPGAのLUTで作るバイナリニューラルネットのアーキテクチャ考察 | トップページ | LUT型のネットワーク考察のその後(途中経過) »

2018年8月 9日 (木)

続・FPGAのLUTで作るバイナリニューラルネットのアーキテクチャ考察

 備忘録程度にその後の解析を少し追記しておきます。
 まず、現状の範囲だと認識率は95%程度で頭打ち感が出てきたので、少し解析モードに入っています。
 
 なお、パラメータを変えて流すのを繰り返しつつ、都度、気まぐれにいろいろなログコードを埋めて観測しているので、以降のデータの観測条件はバラバラです。認識率も高くないケースでのログを使っていますが、傾向はあまり変ら無そうなので ご了承ください。(気が向いたらちゃんと計測しなおしますが、その前ににコードのリファクタリングがやりたい...)。
 
 まずは、初期乱数(接続とLUTの結線)とネットのアーキテクチャの依存度を見るために、同じネットを別乱数で初期化して複数種類並走させて、結果を統合できるようにしました。
(実は結構大改造でしたが)。
 2本並走させた場合が下記です。
Photo
 最初の方は統合結果が上回っていたので、ちょっと期待したのですが、長時間流しても結局近いところに収束しました。
 認識できていない10%部分の大きな削減にはならず、要するにネット1が間違えるものはネット2も間違えると言う状況で、統合に大きな意味はなさそうに思います。
 2並走させるのも途中で接続の無いネットを作ったのと同じなので、それよりは普通に接続のあるネットの幅を倍にしたほうがよさそうです。
 
 エラー状況を見たかったので、ざっと今ログを吐かせるコードを埋めて流してみました。
 
 Error_matrix
 
 横軸が期待値で、奥行き方向に予測結果です。
 
 5を3とか9を4とかに誤認識するケースが多いようです。
 このあたりは人間が画像を見ても思うところはなんとなくあるので、難しいところなのかもしれません。
 
 あとはその他のアプローチとして、今、元データにランダムにネガポジ反転を掛けた物を試しています。これは問題なく学習しています。
 人間もネガポジ反転しても問題なく数値は認識できますし、画素間が同じか否かと言う観点で見るなら、XOR系はFPGA的には得意な範疇なのかもしれません。
 
 その他にも、学習データにランダムノイズ画像を混ぜて、期待値は10個の出力のどれも0になるのを期待するという形で学習に混ぜてみました。
 今のところ特に変化は見られていませんが、将来、CNN的に画面内を探索させる場合に、「無反応」という反応も必要なので、混ぜても影響なく無視して学習くれたと言うのがまずは安心材料かもしれません。
 
 で、次ステップとして、多値のネットワークも併用しながら学習させたいのですが、如何せん、既存のツールにLUT的なネットを混ぜ込むには、データの保存フォーマットからして整合性が無いので、いろいろと厄介な気がしています。
 
 勉強もかねて、バイナリ系とアナログ系が混在できる評価環境を自作するのもありかなと思い始めているところです。
 先が長いので、少しづつ暇を見つけて進めていければと思います。
 
 あと、おまけですが、完全に飽和したように見えて、途中で急に少し跳ね上がったケースがありました。少し興味深い挙動だったので、張っておきます。
Photo_2
 この手の最適化では局所解の存在は悩ましいところなのですが、こういうの見てしまうと、どこで打ち切っていいのかと。
 
 
 最後に、学習自体のFPGA化ですが、これも予測に対して10倍程度の回路使ってよければ少なくとも今の方式のままならハードウェア化出来そうには思っています。
 LUTの書き換えはシフトレジスタで可能だし、各層でモニタ対象のノードの結果だけ最終段までスルーする回路をつけるのは規模的にそれほど無茶でも無さそうです。
 BRAMに入る範囲で、バッチサイズを決めて、回してる間に次のバッチをCPUなりで準備すればいい感じには収まりそうな予感です。
 まあ、アプリや学習方式が固まってから考えればよい話なので、まずは技術的な限界点が見えてきてからかなと。

« FPGAのLUTで作るバイナリニューラルネットのアーキテクチャ考察 | トップページ | LUT型のネットワーク考察のその後(途中経過) »

FPGA」カテゴリの記事

Deep Learning」カテゴリの記事

コメント

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

トラックバック

« FPGAのLUTで作るバイナリニューラルネットのアーキテクチャ考察 | トップページ | LUT型のネットワーク考察のその後(途中経過) »