<   2017年 09月 ( 19 )   > この月の画像一覧

XNOR-Net は構造が複雑すぎるのであきらめた。
また、テスト時の Batch Naormalization に train_flg=False のつけ忘れを修正した。
BNN の精度低下の原因を探ってみる。ウェイトとアクティベーションを別々に2値化してみた。
左が実数ウェイトで右がバイナリウェイト、上が実数アクティベーションで下がバイナリアクティベーション。
バイナリアクティベーションの影響が大きいみたい。
f0054075_21281782.pngf0054075_21291372.png

f0054075_21331655.pngf0054075_21343658.png

それではということで、アクティベーションだけを Ternary (-1,0,+1の3値)化してみた。左右は上と同じ。
f0054075_21394575.pngf0054075_21400688.png

良いような変わらないような、微妙な感じです。テスト時の認識精度をまとめてみました。
f0054075_21414750.png

[PR]
by tom01h | 2017-09-28 23:24 | Trackback | Comments(0)

量子コンピュータ

今の流行は量子アニーリングかもしれませんが、たぶんもっと古くからある量子ゲートの本です。量子の話はなかなかイメージし辛いですが、なんとなしに良く分かるように説明されています。
しかし、このサイズの本で横書きにすごい違和感。いや、横書きじゃなくて後ろから読むことに…
f0054075_22444461.jpg

[PR]
by tom01h | 2017-09-26 22:45 | 本・映画など | Trackback | Comments(0)

Binary Weight Network

XNOR-Net の論文 に従い、ウェイトを2値{-1,1}化する Binary Weight Network を実装してみました。
大雑把に言うと実数のウェイトが正または0の時にバイナリウェイトを+1として、負の時は-1とします。ただし、実数のウェイトの各要素の絶対値の平均でスケーリングします。順伝搬、逆伝搬はバイナリウェイトを使って計算し、パラメータの更新時だけは実数のウェイトを使います。
ただし論文にある通り、1層目と出力層は2値化しません。また、値だけを2値化していてデータ型は2値化していないので、シミュレーションは速くなりません。
まずは比較用にベースになるネット。これは昨日の最終形です。
f0054075_18454297.png
Binary Weight Network では、2~3% ほど認識精度が低下してるように見えます。ちなみに、XNOR-Net では Pooling 層の位置を変更するのですが、BWNで試してみても学習が遅くなるだけで認識精度は変わりませんでした。
f0054075_17051075.png
じゃあ、スケーリングの効果はいかほどなんでしょうか?スケーリングなしで試してみました。たぶんこれが Binary Connect の Deterministic binalization なんだと思います。
結果としては、スケーリングの効果なし。実装間違っているのかなぁ?
f0054075_17142205.png
んじゃ、スケーリングなしでアクティベーションも2値化したらどうなるのでしょうか。Binary Neural Network がこれなんだと思いますが… さすがにだいぶ認識精度が下がりました。
f0054075_17172556.png

スケーリングを導入した XNOR-Net になるとどこまで回復するのでしょうか?スケーリングの求め方がとっても難しそうなのでまた後日。
しかし、畳み込みを2値化しても BatchNormalization を使っていては… と思ったら、BNN の論文になんか書いてあります。読んでみるか…

[PR]
by tom01h | 2017-09-24 22:53 | Trackback | Comments(0)
いろいろと試しています。
まずネットの構造は大体決まって、

3層の畳み込み層と2層の全結合層(出力層含め)。
畳み込み層のカーネルサイズは3×3で、パディングとストライドはどちらも1。チャンネル数は順に32,32,64。
畳み込み層の後には BatchNormalization と サイズ2、ストライド2のMaxPooling がある。
つまり、層毎に縦横のサイズが半分になる。
全結合の隠れ層の数は512で後にはやはり、BatchNomalization がある。
こんな感じの結果が出てます。
f0054075_13364425.png
BatchNormalization はいろいろと覚えておかないといけないので無しで試してみた。全然だめだ。
f0054075_13380578.png
なら、BatchNormalization の β と γ を固定した簡易版を作って試した見た。これで良いみたいな感じです。
f0054075_13393528.png
よく考えてみると、BatchNormalization を使うときはバイアスは要らないって書いていたのを思い出したので、バイアス削除。
f0054075_13405052.png

これをスタート地点にしてみようと思うのだが、ゼロから作る Deep Learning の畳み込み用の BatchNormalization の実装間違ってませんか? 入力を4次元で N, C, H, W とすると、N の平均と分散しかとってないですよね。ここ とか見るとN,H,W 全部の平均と分散を取っているように見えるけど… どっちが正しいの?

[追記]
N,H,W 全部の平均と分散を取るように変更してみました。これで覚えておくパラメータがだいぶ減るはずです。そして肝心の認識精度は… 上がってるじゃん。パラメータ数が減って過学習が抑えられたのかな?良いことづくめじゃん。
f0054075_18454297.png
GitHub 更新しました。

[PR]
by tom01h | 2017-09-23 13:45 | 本・映画など | Trackback | Comments(0)

CuPy を使いたい

PyCUDA が役に立ちそうもないので、Chainer のおまけ?の CuPy を試してみた。
こっちの方がインストールが簡単みたいです。
ここら辺のソフトはどんどん新しくなっているので、ちょっと古い情報だと Windows では使えないとか書いてあって惑わされます。
で、import cupy as cp って書いて、 np. を cp. に書き換えていくだけで動いた。
でも、高速化するためには dtype=np.float32 も付けた方が良いみたいです。
そして、2倍以上に高速化されたっぽいです。
よく10倍以上とか書いているけどそこまではいかず。ネットが小さすぎるんでしょうかね?

[PR]
by tom01h | 2017-09-21 23:52 | PCとか | Trackback | Comments(0)

PyCUDAを使いたい

dot演算で行列積を求めてくれないっぽいです。
役に立ちそうにありません。


DeepLearing の勉強を始めたし、別にこのために買ったんじゃなかったんだけど、GPUを使えるようにしたい。
正直排熱とか心配なんだけど、やっぱりこのままでは時間がかかりすぎる。

ちょっと古い情報でバージョン違いとかあるみたいだけど ここ を参考にした。
なんで Visual Studio とか必要なんだろう?ってただなんだ、今時すごいね。
んで、pip install しようと思ったら…

error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools
えぇ~~っ、Visual Studio は最新版使っちゃダメなんじゃん。っていうか、コンパイル済みのPyCUDAとかないの?
くそぅ。毎日毎日何ギガバイトも…
で、やっぱり上手く行かない
fatal error LNK1158: cannot run ‘rc.exe’
こんな方法で良いの?で、とりあえずインストールできたみたい。

[PR]
by tom01h | 2017-09-20 23:23 | PCとか | Trackback | Comments(0)
8章は読み物でした。
で、7章の実験の続き。やっぱり CIFAR-10 は全データを使わないとちゃんと学習できないのかな?
覚悟を決めてやってみた。頑張ったのはコンピュータですけどね。
ネットワークの拡張としては、
  • 畳み込み層を3層にしてチャンネル数を32にする
  • 全結合層のニューロン数を256にする
その前に、どれだけ学習させればよいのかわからないので、「詳解 ディープラーニング」に載っていた Early Stopping を導入しました。しばらく(今回は5エポック)の間、test accuracy の最高値を更新できなければ学習を打ち切ります。
左が畳み込み1で右が畳み込み3、上が全結合層100ニューロンで下が256です。
f0054075_13594527.pngf0054075_00060031.png

f0054075_15283483.pngf0054075_14003658.png

とにかく時間がかかって大変でした。特に右上の学習の進みがとっても遅かったようです。出口付近のネットが貧弱だとこうなるのかなぁ?もう少しいろいろ試してみたいけど…

[PR]
by tom01h | 2017-09-19 00:26 | 本・映画など | Trackback | Comments(0)
Boothで求めた部分積を足しこむ際に符号拡張をばぼる話です。
ここにあげた例ではデータ長が短すぎて有難さがわからないのですが、符号拡張をさぼる手法があります。名前は知りません。
まずは、今までの例ではありがたみどころか説明さえできないので、前回の符号あり乗算の例を無駄に符号拡張します。
赤字が符号拡張です。実際の乗算器では、もっとたくさん符号拡張が必要になります。
f0054075_15224965.png
これをさぼるには…
最下位の部分積とそれ以外ではルールが違うのですが、Sを部分積の符号とすると
最下位は "~S,S,S" を上位ビットに拡張
それ以外は "1,~S" を上位ビットに拡張
上の例だと
f0054075_15233438.png
では、最下位の部分積とそれ以外の部分積の場合で、本来の符号拡張との差を見てみます。
f0054075_15244723.png
ここで、n-1個目の部分積までの差分の総和が{1,1,…,1,0,0}と仮定したときの n個目の部分積までの差分の総和を求めてみます。
部分積は 2bit ずれるのに注意です。
f0054075_15253740.png
n個目の部分積までの差分の総和も{1,1,…,1,0,0}になり、最下位も同様なので、帰納法で証明されたことに… なるんだよね?
つまり、桁あふれ分だけに差が出てくるので、まぁ良いかってことです。
Verilog にするとあまり差が出ないのですが、Github を更新しました。

[PR]
by tom01h | 2017-09-18 18:20 | 論理設計の話 | Trackback | Comments(0)
休み休みで時間がかかりましたが、やっとCNNまで読み進みました。
で、サンプルを実行してみる。すごく時間がかかります。コメントで、少ないデータでやってみろとあるので、この先は少ないデータでやってみます。若干過学習の気がありますが…
左がオリジナルで、右がBatchNormalizationを追加したもの。すげぇ。
f0054075_16115760.pngf0054075_16160147.png

MNISTだと精度が飽和しちゃってつまらないので、CIFAR-10 に挑戦したいと思います。
dataset/mnist.py の真似をするために、ダウンロードしてきたデータは CIFAR-10 binary version です。小さくて見難いけど、こんなデータです。
f0054075_21045260.png
んで、まぁ、いろいろ試行錯誤で出来ました。Githubに置いておくので、参考にしてください。
結果は… 過学習ですか?
f0054075_20594534.png

[PR]
by tom01h | 2017-09-17 23:09 | 本・映画など | Trackback | Comments(0)

符号付き乗算器の話

前回は符号なしの話でしたが、Boothの良いところは、そのままで符号付きの乗算ができるところです。
たぶん、2,3を-2,-1にするのが、4の補数(?で良いの?)と相性が良いのかな?
まずは、入力の2進数を4進数と、冗長表現に変換するところまで。符号付きと符号なしだとこんな感じ。4の補数の4進数は3で符号拡張するので良いんだよね?
f0054075_10151286.png
このBoothを使って乗算します。Boothと2進が混ざってカオスですが…
f0054075_13233924.png
つまり、符号拡張さえちゃんとやれば、Boothの乗算は符号について難しい事を考えずに済みます。
これまでの話を Verilog で記述しました。Verilatorで検証することを前提に、テストベンチはC++で記述しています。32bitの符号あり、符号なしの乗算に対応しています。テストベンチは符号ありにしか対応していませんが…
Verilatorが使える環境前提ですが、
mul/ の下で make を実行すると sim/Vmul_0 が出来ます。
sim/Vmul_0 を引数なしで実行すると、ランダムで生成した入力を使った乗算を 1000 回実行します。
好きな回数で実行する場合は、引数を1個与えます。
好きな値をかけるには、引数を2個与えます。
引数は10進数ですが、結果の表示は16進数なので、バグの再現実行が面倒くさいです。
今度こそ符号拡張をさぼる手法の話をしたいと思います。

[PR]
by tom01h | 2017-09-16 22:06 | 論理設計の話 | Trackback | Comments(0)