9-03 Affine1,2層目の行列乗算

■Affine1層目は演算量が多いので工夫が要る

 Affine1層目の入力画像は要素数
1024の配列なので、図9-15のようにX0〜1023をメモリ(ROM)に格納します。ROMのアドレス幅は10ビット、各値の範囲は0〜255なのでデータ幅は8ビットになります。


●複数のROMで重みの行列を構成する

 W7は要素数
1024×50の行列であり、同図のように50個のROMに格納されます。縦の列がそれぞれアドレス幅10ビットのROM、それらを50個まとめあげて1個のROMにするので、全体のアドレス幅は10+6=16ビットになります。
 またデータの範囲は-256〜255なのでデータ幅は9ビットになります。2の補数で表現するので最上位は符号ビットです。


 図9-15 Affine1層目は入力が1×1024で重み係数が1024×50


●パイプライン化するとAffine1層がペースメーカーになってしまう

 重み係数は
1024×50なので、行列乗算を1個の乗算器でまかなうとすると50kサイクルかかります。
 ひるがえって畳み込み1層目〜6層目はどうだったでしょうか。ここにあるように各層
7.1〜9.8kサイクルで終わっています。今後パイプライン化することを考えると、このままではAffine1層目が全体の足を引っ張ってしまいます。

●7つのグループに分けて並列動作させる

 Affine1層目の係数は図9-15のように、要素数1024のROM50個からなります。これら50個を8個づつ、7つのグループに分け、
7並列で演算することを考えます(図9-16)。

 同図において最初のグループではROM_W7_00〜07が、8対1マルチプレクサで選択され乗算器に入力されます。その後は累積器、ReLUなどの回路を通ってZ_WR_DATA_00となり出力されます。

 次のグループはROM_W7_08〜15、その次はROM_W7_16〜23、・・・最後はROM_W7_48〜49、これだけはROMの数が2個のグループです。


 図9-16 乗算器7個、7並列で高速化

 7並列にすることにより、Affine1層目は1024×8=8kサイクル程度で終了します。これならパイプライン化の足かせになることはありません。
 上図の回路は「第1部畳み込みニューラルネットワーク」の2層目と似ているのでそちらを参考にすると良いでしょう。


■Affine2層目は演算が少なくて時間がかからない

 Affine2層目の入力画像は要素数
50の配列なので、図9-17のようにX0〜49をメモリ(ROM)に格納します。ROMのアドレス幅は6ビット、データ幅は8ビットになります。


●複数のROMで重みの行列を構成する

 W8は要素数
50×10の行列であり、同図のように10個のROMに格納されます。縦の列がそれぞれアドレス幅6ビットのROM、それらを10個まとめあげて1個のROMにするので、全体のアドレス幅は6+4=10ビットになります。
 重み係数は50×10なので、行列乗算を1個の乗算器でまかなうとしても500サイクル程度で済みます。したがってAffine2層目は並列化の必要はありません。


 図9-17 Affine2層目は入力が1×50で重み係数が50×10


 Affine2層目の結果は判定回路(SoftMax関数に相当)に入力され、0〜9の判定が行われます。この辺りの回路は「第1部畳み込みニューラルネットワーク」の3層目と似ているのでそちらを参考にすると良いでしょう。


目次へ戻る