低価格FPGAでも文字認識AIの学習は可能なのかFPGAにニューラルネットワークを実装する(4)(2/2 ページ)

» 2024年04月16日 07時00分 公開
[今岡通博MONOist]
前のページへ 1|2       

学習ロジックに関するコード記述

 30〜33行目は学習ロジックに関する記述となります。アルゴリズム自体は、連載第2回で紹介したC言語で示した学習モデルをそのままVerilogに書き換えた感じですので、その内容説明も同記事をご参照ください。ここでC言語で書いたコードと決定的に異なるのは、C言語でコンパイルしたコードはCPUで逐次実行されるのに対し、FPGAの場合は同じForループのように見えますが33行目の式は並列実行可能なロジックに展開される点です。

 リスト1に挙げたコメントにはないのですが、このソースコードをリポジトリに更新する際に書いたコメントが以下のリスト3の通りです。

The learning logic was changed to nobloking assignment.
リスト3 

 33行目ですが、今回のコードの改訂では学習データ(links)に値を代入する式をノンブロッキングに変更しました。これは、左側から右側への代入を“=”から“<=”に変えることで、ブロッキング代入からノンブロッキング代入に変更できるからです。

 Verilogでは、for文で記述されたループ文はシンセサイザー(C言語でいうコンパイラのようなもの)でfor文の内側の33行目の式は、今回の場合ですと525行の式に展開されます。その式の代入をノンブロッキングに変更すると525行ある式が全て同時に実行されます。

 これはFPGAを使う上で大きなメリットの一つなのです。これはC言語によるコードを用いるコンピュータではできない芸当ですよね。

使い方と実行

 最後に、今回書いたコードの検証をFPGAの実機で試しておきましょう。

 図1は、PCとつなげたFPGA開発環境からUSB経由で生成したビットストリームをFPGAにダウンロードして、図1の左側にあるUSBコネクター上側の白いタクトスイッチを押したときのものです。いわゆる検証用の入力サンプルですね。学習データの“D”を2カ所ほどドット改変しており、neuro.vの19行目で設定されたビット列をLEDドットマトリクスに表示しています。

図1 図1 推論させるサンプル文字

 次の図2は先ほどのサンプル入力文字を推論させた結果です。きちんと学習で使った“D”に収束していますよね。

図2 図2 推論結果として出てきた文字

本連載の読者の皆さんはお気付きかもしれませんが、前回に比べてLEDドットマトリックスのLEDの色が黄色(アンバーかもしれない)に変わって、サイズも大きくなってませんか。いや実は、筆者の妻にこのデモを見せたところ「こっちが好き」という意見だったので、こちらを使うことにしました。

 図3はランダムなビット列で入力文字を生成した例です。

図3 図3 ランダムな設定で生成した入力文字

 図4は、学習によって覚えさせた4文字のどれにも到達しなかった結果となる失敗例です。ですが、機械学習において推論が成功しなかったことが分かるか否かはとても重要な知見だと思っています。

図4 図4 ランダムな入力文字に対する推論の例

おわりに

 冒頭でも紹介した通り、今回も学習時のノイズ混入実験にトライしています。これは、ニューラルネットワークを基本とする深層学習において、ある種のノイズを用いてAIシステムに誤判断させるという敵対的手法の一つです。これらについては、今回の記事を執筆するまでに得られた知見ではそれを原稿に収めるところまでは至りませんでした。次回以降、進捗があれば紹介したいと思います。

⇒MONOist編集部へのご意見はこちらまで

前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.