2019年 05月 22日
tiny-dnn アクセラレータの誤差逆伝搬の計算方法
Zynq (Arm CPU 内蔵の FPGA) 上でオープンソースの tiny-dnn を使った MNIST の学習をしています。
tiny-dnn を改変し、計算に時間のかかる畳み込みをプログラマブルロジック(PL)に作ったアクセラレータで並列に計算し、その他は PS 中の CPU で tiny-dnn をそのまま計算します。
今回は進捗じゃなくて、tiny-dnn アクセラレータで使っている誤差逆伝搬の計算方法を紹介します。
自分でも見るたびに毎回悩むので…
書いてある内容は github と一緒です。
あまりちゃんと調べずに自分で考えた方法なのですが、これって実はよく知られた方法ですかね?
さらにもっと良い方法があるなら教えてください。
また、今はアクセラレータ側で並べ替えていますが、いずれ CPU 側で並べ替えるように変更したいと思っています。
では本題。
ハードウェアに計算させるなら、順方向だろうが逆方向だろうが同じような手順で計算させたいですよね。
padding に関してもちょっとだけあるのですが今は置いておくとして…
ウェイトデータを工夫すれば、順方向の畳み込みと同じような計算で逆方向の誤差伝搬を計算できます。
下の絵を見ればわかると思いますが、
1. カーネル内のデータを逆順にする
2. 入力チャネルと出力チャネルをシャッフルする
たんに計算順を変えただけなので説明不要ですよね。
ちなみに、stride!=1 の事は考えていません。
by tom01h
| 2019-05-22 21:04