LUT-Networkの為の学習方法アイデアメモ
先日、LUT-Networkでの回帰をやってみましたが、もともと観測すると1か0に確定するだけで、その確率を扱っているだけなので、多値が扱えないなんて事はまったく無いと思っています。
で、今日急にお風呂の中でLUT-Networkの学習を効率化できるかもしれないアルゴリズム思いついたのでTwitterには書きましたが、ここにもメモしておきます。
入力も出力も確率変数としてテーブル引きモデル書けそうな気がします。
6つの入力がそれぞれある確率分布をもった一般的な確率変数の場合、テーブル引き後の出力の確率分布を求めるのは困難です。しかし、バイナリ化を前提とすると、0か1しかないわけですから、1になる確率だけをスカラ変数として扱えばよく、単精度浮動小数などの多値で管理すればよい筈です。ここまでは普通のネットでも同じ考え方の筈です。
(もちろん0になる確率は 「 1 -(0になる確率)」 です)
というのを前提に入出力も64個あるテーブルも、観測するまで0か1が確定せず、その確率分布だけ分かってる変数として扱えば、LUTのモデルもそのまま立式できそうな気がしてきました。
その場合、64個あるテーブルのそれぞれが引かれる確率が求まるはずで、、出力が 1 になる確率もそこから一意に求める式が立つはずです。で、式が立てば微分できるはずです
テーブル0 を引く確率 (1-X0) * (1-x1) * .... (1 - X5)
テーブル1 を引く確率 X0 * (1-x1) * .... (1 - X5)
...
テーブル63を引く確率 X0 * X1* ... X5
のように64個ある各テーブルの引かれる確率が求まります。
その後、各テーブルの1になる確率を掛けて総和を取れば出力が1になる確率が求まります。
LUT一個分にしては、ちょっと大きな式になりますが、今のμMLP方式より小さくなるはずですし、微分できるから当然逆伝播も記述できるはずです。
課題としては、LUTを最後、確率変数ではなく、0か1に固定しないといけないため、学習時点では誤差が最小化するように正則化を書けながら進めないと多分うまく行かないだろうと点です。ただこれはバイナリネット全般に言えることで、今、BatchNormalizationなどがバイナリネットにおいて非常に重要な位置にあるのと本質的には同じなので、なんとかなりそうな気もしています。
これがうまく行くと forward 演算で 0/1 にバイナライズしながら入力を変調して何度も実行して確率的に計算している箇所を多値を使って一気に高速化できる可能性が出てくる気がしてきます。
上記計算は、多分CUDAとかの1SMに収まる程度と思いますし、今開発中の BinaryBrain で実験するにはもってこいだったりもします。
余談ですが、BinaryBrainのねらい目は、TensorFlow や Chainer や Torch や Caffe なんかの汎用的なプラットフォームが取りこぼしていそうな、FPGA向けバイナリネットに限定した特殊計算のプラットフォームです。
Spartan/Artix/Cyclone クラスや、場合によっては Lattice とかMicrosemi (Actel)も候補で、お気軽にAIっぽいことをやれるレンジを狙いたいなと思っています。
バイナリ系は学習の計算もメモリ配置も特殊なので汎用の学習プラットフォームに同じポリシーで共存し難い部分がありまして、ましてや特化してGPUで高速学習をチューニングとかあまりな筈です。PC用のGPUを1日程度ぶん回して廉価FPGA 1個規模ぐらいが学習できるぐらいがレンジとして狙っているところです。
« バイナリLUT-Networkで回帰問題をやってみる | トップページ | 祝! LUT-NetworkのLUTモデルの逆伝播学習動作 »
「FPGA」カテゴリの記事
- LUT-Networkの蒸留とMobileNet風構成とセマンティックセグメンテーション(2020.03.09)
- LUT-Networkの蒸留(Distillation)について(2019.12.29)
- FPGAでのDNN(Deep Neural Network)の整理(LUT-Netまとめ)(2019.12.15)
- LUT-NetのFPGAリソースについて(2019.12.08)
- MNIST認識のリアルタイム動作環境更新(2019.09.02)
「Deep Learning」カテゴリの記事
- Deep Learning の開発フロー(2020.03.23)
- LUT-Networkの蒸留とMobileNet風構成とセマンティックセグメンテーション(2020.03.09)
- LUT-Networkの蒸留(Distillation)について(2019.12.29)
- FPGAでのDNN(Deep Neural Network)の整理(LUT-Netまとめ)(2019.12.15)
- LUT-NetのFPGAリソースについて(2019.12.08)
この記事へのコメントは終了しました。
« バイナリLUT-Networkで回帰問題をやってみる | トップページ | 祝! LUT-NetworkのLUTモデルの逆伝播学習動作 »
コメント