FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Computer Architecture 6th Editionの7章"Domain-Specific Architecture" を読む (7.3章 DNNのニューロン・トレーニングと推論)

ヘネパタ第6版こと、"Computer Architecture 6th Edition" では、第7章でドメイン固有アーキテクチャの章が新設された。 これを機会に、しっかり読んでいこう。

Computer Architecture, Sixth Edition: A Quantitative Approach (The Morgan Kaufmann Series in Computer Architecture and Design)

Computer Architecture, Sixth Edition: A Quantitative Approach (The Morgan Kaufmann Series in Computer Architecture and Design)

7.3章はがっつりディープニューラルネットワークの内容だ。用語集も入っている。これを機にしっかり勉強しよう。

目次

これは著者が読んだ内容をまとめているだけなので、誤訳、理解不足により誤っている可能性があります!鵜呑みにしないようにお願いします。


7.3 例 : ディープニューラルネットワーク

人工知能(Artificial Intelligent:AI)は次世代のコンピューティングの次なるビッグウェーブであるだけでなく、人類の歴史の大きなターニングポイントかもしれない...知能の進化は、データ、ニューラルネットワーク、そして計算パワーによって起きるのかもしれない。 IntelはAIに投資している... 我々は、AIの普及と発展に必要な最新のアクセラレータを開発した。

人工知能は正規の切り替わりをまたいで、ドラマティックな返り咲きをした。 人工知能を、多くのロジカルループとして「組み立てる」代わりに、議論の焦点は人工知能を通過させるサンプルデータから、「マシンラーニング(Machine Learning)」へと移り変わった。 学習に必要なデータの量は考えていたものよりも非常に多くのものが必要であった。 今世紀のウェアハウススケールコンピューティング(Warehouse Scale Computing: WSC)により、数十億のユーザと彼らのスマートフォンから、十分な量のデータがインターネット上で見つかったペタバイトの情報を収納して格納し、十分なデータ量を提供している。 私たちはこの非常に多くのデータから学習を行うのに必要な計算の量を低く見積もった。 しかし、GPUというWSCのサーバに組み込まれている単精度浮動小数点の計算コストが非常に高い計算機を使うことにより、十分な計算量を提供できるようになった。

機械学習の一部分であるDNNと呼ばれる領域は、過去5年間でAI分野のスターということが出来る。 DNNは例えば言語翻訳の能力を向上させ、過去10年間の進歩に比べて、さらに進歩を遂げている(Tung, 2016; Lews-Kraus, 2016); DNNに切り替えることにより、過去5年間で達成している画像認識のエラー率は26%から3.5%に減少した(Krizhevsky et al., 2012, Szegedy et al, 2015; He et al., 2016); そして2016年には、DNNは囲碁の分野において初めて人間を倒すことが出来るプログラムを生成することが出来るようになった(Silver et al., 2016)。 多くのこれらの技術がクラウドで実行されているが、第1章で述べたように、これらはスマートフォン上でGoogle翻訳を実行することが出来る。 2017年には、新しい重要なDNNの研究結果が毎週発表されるようになっている。

本章に書かれていること以上に、DNNについて興味を持った読者は TensorFlowのチュートリアルをダウンロードして実行してみるべきだ (TensorFlow Tutorials, 2016)。そこまで野心的でない場合でも、DNNの無料のオンラインテキストを読んでみることをお勧めする。

DNNのニューロン

DNNは脳のニューロンからインスパイアされている。 人工ニューロンはデータ値と「重み(weights)」もしくは「パラメータ(parameters)」を掛け合わせたものを加算し、それを非線形関数に通して結果を出力する。 これから見ていくように、人工ニューロンはファンインとファンアウトが大きい。

画像認識のためのDNNでは、入力値は画像のピクセルであり、ピクセル値は重みが欠けられる。 多くの非線形関数が施行されたが、現在広く使われているのはf(x)=max(x, 0)というシンプルなものであり、これはxが負数であれば0となり、整数であればxそのものの値が返される。 この関数はRectifier Linearユニットもしくは ReLUという複雑な関数名で呼ばれている。

人工ニューロンクラスタは、入力値のそれぞれ異なる場所を処理し、クラスタの出力は次の人工ニューロンクラスタの入力値となる。 入力レイヤと出力レイヤの間のレイヤは「隠しレイヤ(hidden layer)」と呼ばれる。 画像処理のためには、各レイヤは異なるタイプの形を認識するレイヤと考えることが出来、エッジや角度などを認識する低レベルのレイヤから、目や鼻を認識する高レベルのレイヤへと進んでいく。 もし画像処理アプリケーションが、犬が移っている画像を認識する場合は、最後のレイヤの出力は0から1までの確率の値で表現されるか、どの犬の品種であるかを示す確率のリストとして表現される。

DNNではレイヤの数により名前が付けられる。 データ数と計算能力が低い時代には、ニューラルネットワークの層数は比較的浅かった。 図7.5は際k人のDNNのレイヤ数、重みの量およびフェッチされる重みあたりの演算量が示されている。 2017年では、いくつかのDNNは150のレイヤ数を持っている。

名前 DNNレイヤ 重みの数 演算量/重み
MLP0 5 20M 200
MLP1 4 5M 168
LSTM0 58 52M 64
LSTM1 56 34M 96
CNN0 16 8M 2888
CNN1 89 100M 1750

トレーニング v.s. 推論

前章までの議論は、既にプロダクションレベルに入っているDNNについての議論であった。 DNNの開発はニューラルネットワークアーキテクチャ; レイヤの数とその型、各レイヤの次元とデータのサイズを決めることから始まる。 専門家は多くの新しいニューラルネットワークアーキテクチャを開発するが、ほとんどの、実際にニューラルネットワークを使用する人は、既存の類似の問題に対するニューラルネットワークと同様のネットワークを選択することになる(例えば、図7.5)。

一度ニューラルネットワークの形を選択すると、次のステップでは、ニューラルネットワークグラフの各エッジの重みを決めていくことになる。 重みによって、モデルの挙動が決定される。ニューラルアーキテクチャの選択に依存して、単一のモデルで数千から何億個もの重みを決めていく必要が生じる(図7.5を参照のこと)。 トレーニングは、これらの重みをチューニングするためのプロセスであり、DNNが複雑な関数を近似するためにコストのかかる処理である (例えば、画像からその画像内のオブジェクトをマッピングする処理など)。

この開発フェーズは一般的に「トレーニング(training)」あるいは「学習(learning)」と呼ばれ、一方でプロダクションフェーズは多くの名前で呼ばれている「推論(inference)」「予測(prediction)」「scoring(採点)」「実装(implementation)」「評価(evaluation)」「実行(running)」「テスト(testing)」である。 殆どのDNNは「教師あり学習(supervised learning)」と呼ばれる、データがあらかじめ処理されており正しいラベルを取得することのできるデータ群を使って訓練が実行される。 したがって、ImageNet DNNのコンペティションではトレーニングセットは120万枚の画像と各画像は1000カテゴリに渡ってラベルが振り分けられている(Russakovsky et al., 2015)。 いくつかのラベルは非常に詳細に記述されており、例えば犬や猫の種類まで記述されている。 優勝者は、別に用意された50,000毎もの画像をDNNに通して、最も低い誤認識率を得られるかによって決定される。

ニューラルネットワークの重みづけは、トレーニングセットを使用してニューラルネットワーク内の「バックワード(backward)」処理を繰り返すことによって設定される。 この処理のことを「バックプロパゲーション(backpropagation)」と呼ばれる。 例えば、トレーニングセット内で犬の種類について情報が得られれば、DNN内でこの画像が何であるかが分かり、今後より正確な答えが出せるようにDNN内の重みが調整される。 驚いたことに、トレーニングプロセスの最初に重みを最初にランダム値で設定すべきであり、トレーニングセット内で誤認識率が十分に小さくなるまで繰り返して学習させるべきである。

数学が好きな読者のために説明すると、学習の目標は入力値が複数レイヤのニューラルネットワークアーキテクチャを通して正しい出力値にマッピングさせることである。 バックプロパゲーションは「誤差のバックプロパゲーション(back propagation of errors)」の略である。 バックプロパゲーションはすべての重みについて、入力値の勾配を計算し重みを更新することで、誤認識率を最小化させるためのアルゴリズムである。 DNNにおいてもっとも有名な最適化アルゴリズムは「確率的勾配降下法(stochastic gradient descent)」である。 このアルゴリズムによって、バックプロパゲーションによって得られた降下の勾配を最大化するような重みを比例的に設定する。 より詳細に学びたい読者はNielsen(2016)もしくはTensorFlowのチュートリアル(2016)を参照されたい。

図7.6に示すように、トレーニングには数週間を要する場合がある。 推論フェーズは、データあたりで100ms程度であり、数百万分の一の時間である。 トレーニングは、一回の推論操作に対して非常に多くの時間がかかるが、推論のための全体の計算時間はDNNを使用するユーザの数の積となり、DNNをどの程度使用するかに依存している。

トレーニングが終了すると、あなたはあなたが使用したトレーニングセットが実際に推論を実行するデータを代表したものである事を願ってDNNをデプロイする。 あなたのDNNは非常に人気があり、あなたが開発に費やした時間よりもはるかに多くの時間ユーザに使用される!

図7.6 いくつかのDNNにおけるトレーニングセットの大きさ及びトレーニングに必要な時間(landola, 2016)

データタイプ 問題領域 ベンチマークトレーニング セットのサイズ DNNアーキテクチャ ハードウェア トレーニングの時間
text[1] 単語の推論 (word2vec) 1000億単語 (Wikipedia) 2レイヤ skip gram 1 NVIDIA Titan X GPU 6.2時間
audio[2] 音声認識 2000時間の音声 (Fisher Corpus) 11レイヤ RNN 1 NVIDIA K1200 GPU 3.5日
images[3] 画像分類 100万画像 (ImageNet) 22レイヤ CNN 1 NVIDIA K20 GPU 3週間
video[4] アクティビティ認識 100万動画 (Sports-1M) 8レイヤ CNN 10 NVIDIA GPU 1ヶ月

トレーニングデータセットの無いタスクというものも存在する。例えば、現実世界のイベントにおいて未来を予測するようなタスクである。 ここでは言及しないが「強化学習(reinforcement learning(RL)」という有名なアルゴリズムが2017年には使用されるようになっている。 トレーニングセットによって学習する方式の代わりに、RLは現実世界において動作し、報酬関数と呼ばれる、あるアクションから状況が良くなるか悪くなるかを決定する関数から信号を受け取る。

急速に変化するフィールドにおいて予測をすることは難しいが、3種類のDNNが2017年には主流になっている: 「多層パーセプトロン(MultiLayer Perceptron:MLP)」、「畳み込みニューラルネットワーク(Convolutional Neural Networks: CNNs)」、「再帰ニューラルネットワーク(Recurrent Neural Networks: RNNs)」である。 これらはすべて教師あり学習であり、トレーニングセットに依存するものである。

あけましておめでとうございます 2018

あけましておめでとうございます。本年も、「FPGA開発日記」をよろしくおねがい致します。

f:id:msyksphinz:20171231133926p:plain:w300

昨年は、

など、様々なことに手を出した一年でした。

今年の目標として、

  • 引き続きRISC-Vをベースとしたエコシステムの勉強。自分でOSSへの貢献をしていきたい。
  • Vivado-HLSを使って、いろんなシステムを作っていきたい。ディープラーニングなども、Vivado HLSを使って勉強していきたい。
  • ディープラーニングなどの理解を深め、RISC-Vエコシステムとの連携にも挑戦していきたい
  • モバイルアプリケーションやVoice Kitを活用して、面白いものを作っていきたい。
  • より多くの人に出会いたい。去年はRISC-Vを通じて多くの人々と知り合えた。今年も、RISC-Vと言わず、様々なことにチャレンジして、コミュニティを広げていきたい。

去年の目標も継続しているけども!

頑張っていきたいと思います。よろしくお願いします。

年末だしブログの情報を回収してワードクラウドを作ろう2017

年末年始なので、今年一年はどうだったかな、ということでまとめてみよう。

今年の元旦には、こんな目標を立てていたのだった。

msyksphinz.hatenablog.com

  • ZedBoardを用いて、RISC-VとARMの連携など(オペレーティングシステム、ソフトウェアスタックも含む)
  • Vivado-HLSを使った実装の発展
  • TensorFlowなどの理解を深める
  • モバイルアプリケーションの開発に挑戦してみたい

あれれ!ほとんど出来て無いじゃないの!

  • ZedBoardを用いて、RISC-VとARMの連携など(オペレーティングシステム、ソフトウェアスタックも含む) → RISC-Vのエコシステムの理解は進んだ。発表も2件行った。
  • Vivado-HLSを使った実装の発展 → × 全然できていない。
  • TensorFlowなどの理解を深める → ディープラーニングについての理解は進んだ。C言語での実装もやってみた。
  • モバイルアプリケーションの開発に挑戦してみたい → × 全然できていない。

ブログの記事数

今年は、この記事を含めて349記事を書いた。去年が308記事なのでかなり伸びている。今年はどうしたんだ?暇か?

Jan Feb Mar Apr Mar Jun Jul Aug Sep Oct Nov Dec Total
2017 27 21 30 24 33 30 30 29 29 31 33 32 349
2016 32 31 22 28 25 20 23 19 23 30 29 26 308
2015 20 27 17 6 28 29 35 31 44 31 34 27 329

このブログ自身のこと

11月から12月にかけて、 RISC-V WorkshopやRISC-V メニーコア、Design Solution ForumやRISC-V Day 2017 での発表を行わせていただき、様々な方とお話しすることが出来た。

  • 2016/01/01のフォロワー数: 5
  • 2016/12/31のフォロワー数: 86
  • 2017/12/31のフォロワー数: 292

なんじゃこりゃ!すごい増加だ。さらに、今年のブログのアクセス数をグラフにしてみた。

f:id:msyksphinz:20171230234957p:plain

2017年12月はすごい事になっている。やはりRISC-Vに注目が集まった年であるということが出来る。

12月のAdvent-Calendarチャレンジ

12月はAdvent-Calendarに苦しんだ月だった。ただ皆さんのご協力のおかげで無事に完走。ありがとうございます。

qiita.com

2017年のワードクラウド

今回はPythonを使って、今年1年のタイトル一覧を使って、MeCabを使ってワードクラウドを作った。 へんな文字が出てくるので、filterで処理して切り落としている。

f:id:msyksphinz:20171230235513p:plain

github.com

mecab_wordlist = mecab_analysis(text.decode('utf-8'))
mecab_wordlist = filter(lambda x: unicode(x, 'utf-8') != unicode('みる', 'utf-8'), mecab_wordlist)
mecab_wordlist = filter(lambda x: unicode(x, 'utf-8') != unicode('やっ', 'utf-8'), mecab_wordlist)
mecab_wordlist = filter(lambda x: unicode(x, 'utf-8') != unicode('する', 'utf-8'), mecab_wordlist)

というわけで、来年もよろしくお願いします。

Design Solution Forum とRISC-V Tokyo 2017 の発表資料を公開しました

今年開催されたRISC-Vに関係するイベント、 "Design Solution Forum 2017" および "RISC-V Tokyo 2017" で使用した発表資料を公開しようと思います。

Design Solution Forumについては既に登録者限定で公開されているけど、特に隠す必要はないので公開してしまう。

RISC-V Tokyo 2017の資料については、開催後に riscv.tokyo にアップロードされると聞いていたのだけれども、一向にそんな感じがしないので勝手に公開してしまえ、という感じ。 まあ riscv.org でもワークショップの全資料が公開されているからいいんじゃないでしょうか。

RISC-V Tokyo 2017 の資料については日本語版と英語版があり、両方公開します。 たぶん英語版はサブディスプレイで表示してあったと思う。英語の正しさについては、かなり無保証...

注意事項としては、最初の自己紹介の部分は不要なので削除している、バックアップスライドも削除している。

また、資料内の細かい点として、RoCCを使ったアクセラレータの性能測定では、

  • Design Solution Forum 2017: Dot Product Accelerator で4倍以上高速化
  • RISC-V Tokyo 2017: Dot Product Accelerator で8倍以上高速化

と差分があるけども、Design Solution Forumの時は対象データを64-bit整数、RISC-V Tokyoの時は対象データを32-bit整数として2-way SIMDとしたのでこのような差が出ている。

あまり大したことは書いていませんが、興味がある方はご覧になってみてください。

さわって分かるオープンソースプロセッサ「RISC-V」の世界 (Design Solution Forum 2017)

RISC-V オープンソース ハードウェア 概説 (RISC-V Tokyo 2017)

RISC-V オープンソース ハードウェア 概説 英語版 (RISC-V Tokyo 2017)

f:id:msyksphinz:20171227232154p:plain

RISC-Vの連載をInterface誌に寄稿しました(2018年2月号から)

CQ出版のInterface誌2018年2月号から、RISC-Vについて連載を寄稿しました。タイトルは、「オープンソースCPU「RISC-V」の研究」です。

結構な文章と図を寄稿したのだけれども、紙面の都合上で連載になったらしい。何回続くのかはわかりませんが、ゆっくりとお付き合いいただければ。

ちなみに今月号は歴史と登場の背景なので、技術的にはあまり面白くない。本当はCPUと特許の歴史とかもっと調べて深堀したいんだけどなあ。 SuperHモトローラの話とか、すごく面白そうだ。

ちなみにストーリーとしては、大きく分けて

  1. RISC-Vについて
  2. RISC-Vの仕様について
  3. HiFive1を使ってみる
  4. Rocket-Chipを使ってみる

という感じで寄稿したはず。まあ、どのように編集されるかは、編集者さんにお任せしているので、良く分かりません。

f:id:msyksphinz:20171226225250p:plain

学生の頃、CQ出版に寄稿すると言えばかなりのレジェンドであると聞かされていたので、まさか自分がこのように原稿を書くことになるとは思っていなかった。 これで少しでもレジェンドに近づけるかなあ。

まだまだ自分はひよっこだし、文章力もいまいちなので、読みにくい部分はあると思いますがよろしくお願いします。

あと、何か月も連載しているとあらかじめ提出した原稿が古くなるので、その辺は随時更新していかなければならないし、このブログを通じて小話のようなものも書いていければ良いかなと思う。 特にこういうStep by Stepの話って、何か月も引っ張るような話でもないけど、まあ特集じゃないので文章を省略する必要もないしじっくり解説できる。 内容的に古くなったら更新していけばいいし、新しいネタがあればちょいちょい突っ込んでいけばいいかもしれない。

というわけで、みなさんバシバシ買ってください!

「半導体・ハードウェア開発 2017」Advent Calendarが終了しました

qiita.com

12/01から始めた「半導体・ハードウェア開発 2017」Advent Calendar、全ての日でエントリが埋まり、無事に終了しました。

まずはご協力頂いた皆様、どうもありがとうございました。皆様のご協力がなければ、25日全てを埋めることは不可能でした。改めて感謝致します。

25日の日程のうち、私は10日を担当しました。途中で仕事が忙しくなって結構苦しくなりましたが、何とか完走できてよかった。 ご協力してくださる方は非常にうれしかったですが、やはり去年のAdvent Calendarにも書いてくださった方が多いですね。 そういう意味では、私自身あまり進化していないかもしれない。。来年もやるかどうかは微妙ですね。

  • 終結果(2017/12/26 0:00時点)
    • カレンダー数 : 593
    • 25日完遂カレンダー数 : 230/ 593
    • 購読者数ランキング 114 / 230

ランキングで言うと非常に中途半端ですが、でも593カレンダーのうち完遂できたのはわずかに230カレンダーですので、その中で114位というのはかなり頑張った方だと思っています。

平日は夜中に頑張れますが、休日は別の用事もあったりして苦手で、他の方が支援して下さったのはありがたかったです。

今年はRISC-Vが徐々に知名度が上がってきたかなと思います。RISC-V関係のイベントで2件発表もさせてもらいました。 が、RISC-Vだけではネタもあまりないので、今年は少し範囲を広げた、という次第です。

やはり、去年と比べて機械学習や高位合成、などの話題が増えた、という印象ですね。

Google Voice Kitを使ってみる(3. 音声→文字を認識するアプリケーションの作成)

Google Voice Kitを使ってみる、続き。 前回、アプリケーションが動作するようになったので、自分で音声認識のプログラムなどを作ってみたい。

以下のサイトを参考にして、プログラムを作成した。ちなみ、Google Speech APIを使用するために課金の情報を入力する必要がある。 1年間の無料評価ライセンスがあるのでそれを使用しているが、1年間の間にちゃんとしっかり活用しないとなあ。。。

aiyprojects.withgoogle.com

  • /home/pi/src/motion.py
#!/usr/bin/env python3

import aiy.audio
import aiy.cloudspeech
import aiy.voicehat

def main():
    '''Start voice recognition when motion is detected.'''
    button = aiy.voicehat.get_button() 
    recognizer = aiy.cloudspeech.get_recognizer()
    recognizer.expect_phrase('repeat after me')
    aiy.audio.get_recorder().start()
    while True:
        print('Press the button and speak')
        button.wait_for_press() 
        print('Listening ...') 
        text = recognizer.recognize()  # 音声認識を実行する。
        print(text)
        aiy.audio.say('You said ')
        aiy.audio.say(text)

if __name__ == '__main__':
    main()

サンプルプログラムにはaiy.audio.say('You said ', text)と書いてあるが、実行中にエラーメッセージが出てしまうので修正しなければならなかった。

Press the button and speak
Listening ...
repeat after me
Unknown language: repeat after me
Valid languages:
en-US
en-GB
de-DE
es-ES
fr-FR
it-IT

Usage: pico2wave <words>
  -w, --wave=filename.wav     Write output to this WAV file (extension SHOULD be .wav)
  -l, --lang=lang             Language (default: "en-US")

Help options:
  -?, --help                  Show this help message
      --usage                 Display brief usage message
Traceback (most recent call last):
  File "./src/motion.py", line 22, in <module>
    main()
  File "./src/motion.py", line 19, in main
    aiy.audio.say('You said ', text)

これを実行して、音声認識を実行する。

$ ./src/motion.py 
Press the button and speak
Listening ...
what time is it now     # 認識結果
Press the button and speak
Listening ...

ある程度きちんと認識できる。ただし、"Turn on the light", "Turn off the light" の「ターン」の発音が下手くそすぎて認識されない。 スマートフォンGoogleに喋らせるとうまく認識するので、これは日本人の発音の問題かなあ。 日本語のAPIがきちんと使えるようになればいいのだが。

f:id:msyksphinz:20171224232547p:plain

アプリケーション実行中はボタンのLEDが点灯する。格好いい。

関連記事