(57)【特許請求の範囲】
【請求項１】
入力データを格納する第一メモリと、
前記第一メモリに格納された前記入力データと重みとに対して畳み込み演算を行う畳み込み演算回路と、
前記畳み込み演算回路の畳み込み演算出力データを格納する第二メモリと、
前記第二メモリに格納された前記畳み込み演算出力データに対して量子化演算を行う量子化演算回路と、
を備え、
前記量子化演算回路の量子化演算出力データは、前記第一メモリに格納されて、
前記第一メモリに格納された前記量子化演算出力データは、前記畳み込み演算回路に前記入力データとして入力され、
前記第一メモリと、前記畳み込み演算回路と、前記第二メモリと、前記畳み込み演算回路とは、ループ状に形成されている、
ニューラルネットワーク回路。
【請求項２】
前記畳み込み演算回路は、前記畳み込み演算回路用の命令コマンドに基づき、前記第一メモリから前記入力データを読み出し、前記畳み込み演算出力データを前記第二メモリに書き込み、
前記量子化演算回路は、前記量子化演算回路用の命令コマンドに基づき、前記第二メモリから前記畳み込み演算出力データを読み出し、前記量子化演算出力データを前記第一メモリに書き込む、
請求項１に記載のニューラルネットワーク回路。
【請求項３】
前記入力データは、第一部分テンソルと第二部分テンソルとに分解され、
前記畳み込み演算回路における前記第一部分テンソルに対する前記畳み込み演算と、前記量子化演算回路における前記第二部分テンソルに対する前記量子化演算と、は並列に実行される、
請求項１または請求項２に記載のニューラルネットワーク回路。
【請求項４】
前記畳み込み演算回路は、前記第一メモリに格納された前記入力データに対してレイヤ２Ｍ−１（Ｍは自然数）の前記畳み込み演算を行い、前記レイヤ２Ｍ−１の前記畳み込み演算出力データを前記第二メモリに格納し、
前記量子化演算回路は、前記第二メモリに格納された前記レイヤ２Ｍ−１の前記畳み込み演算出力データに対してレイヤ２Ｍの前記量子化演算を行い、前記レイヤ２Ｍの前記量子化演算出力データを前記第一メモリに格納し、
前記畳み込み演算回路は、前記第一メモリに格納された前記レイヤ２Ｍの前記量子化演算出力データを前記入力データとしてレイヤ２Ｍ＋１の前記畳み込み演算を行い、レイヤ２Ｍ＋１の前記畳み込み演算出力データを前記第二メモリに格納する、
請求項１または請求項２に記載のニューラルネットワーク回路。
【請求項５】
前記入力データは、第一部分テンソルと第二部分テンソルとに分解され、
前記第一部分テンソルに対応する前記レイヤ２Ｍ＋１の前記畳み込み演算と、前記第二部分テンソルに対応する前記レイヤ２Ｍの前記量子化演算と、は並列に実施される、
請求項４に記載のニューラルネットワーク回路。
【請求項６】
前記畳み込み演算回路は、
前記入力データと前記重みとを積和演算する乗算器と、
前記乗算器の積和演算結果を累積加算するアキュムレータ回路と、
を有する、
請求項１から請求項５のいずれか一項に記載のニューラルネットワーク回路。
【請求項７】
前記乗算器は、前記入力データと前記重みとを反転器およびセレクタにより乗算する
請求項６に記載のニューラルネットワーク回路。
【請求項８】
前記入力データは、ベクトルデータであり、
前記重みは、マトリクスデータである、
請求項１から請求項７のいずれか一項に記載のニューラルネットワーク回路。
【請求項９】
前記入力データの各要素は、２ビットであり、
前記重みの各要素は、１ビットである、
請求項１から請求項８のいずれか一項に記載のニューラルネットワーク回路。
【請求項１０】
前記量子化演算回路は、前記畳み込み演算出力データを正規化する回路をさらに有する、
請求項１から請求項９のいずれか一項に記載のニューラルネットワーク回路。
【請求項１１】
前記量子化演算回路は、プーリングの演算を実施する回路をさらに有する、
請求項１から請求項９のいずれか一項に記載のニューラルネットワーク回路。
【請求項１２】
前記量子化演算回路は、活性化関数の演算を実施する回路をさらに有する、
請求項１から請求項９のいずれか一項に記載のニューラルネットワーク回路。
【請求項１３】
前記第一メモリに前記入力データを転送するＤＭＡコントローラをさらに有する、
請求項１に記載のニューラルネットワーク回路。
【請求項１４】
前記第二メモリは、ランダムアクセス可能かつ書き換え可能なメモリである、
請求項１に記載のニューラルネットワーク回路。
【請求項１５】
前記ＤＭＡコントローラによる前記第一メモリに対する書き込みを制限する第一ライトセマフォと、
前記畳み込み演算回路による前記第一メモリからの読み出しを制限する第一リードセマフォと、
を有する、
請求項１３に記載のニューラルネットワーク回路。
【請求項１６】
前記畳み込み演算回路による前記第二メモリに対する書き込みを制限する第二ライトセマフォと、
前記量子化演算回路による前記第二メモリからの読み出しを制限する第二リードセマフォと、
を有する、
請求項１に記載のニューラルネットワーク回路。
【請求項１７】
前記量子化演算回路による前記第一メモリに対する書き込みを制限する第三ライトセマフォと、
前記畳み込み演算回路による前記第一メモリからの読み出しを制限する第三リードセマフォと、
を有する、
請求項１に記載のニューラルネットワーク回路。
【請求項１８】
入力データを格納する第一メモリと、
前記第一メモリに格納された前記入力データと重みとに対して畳み込み演算を行う畳み込み演算回路と、
前記畳み込み演算回路の畳み込み演算出力データを格納する第二メモリと、
前記第二メモリに格納された前記畳み込み演算出力データに対して量子化演算を行う量子化演算回路と、
を備え、
前記量子化演算回路の量子化演算出力データは、前記第一メモリに格納されて、
前記第一メモリに格納された前記量子化演算出力データは、前記畳み込み演算回路に前記入力データとして入力され、
前記畳み込み演算回路は、前記第一メモリに格納された前記入力データに対してレイヤ２Ｍ−１（Ｍは自然数）の前記畳み込み演算を行い、前記レイヤ２Ｍ−１の前記畳み込み演算出力データを前記第二メモリに格納し、
前記量子化演算回路は、前記第二メモリに格納された前記レイヤ２Ｍ−１の前記畳み込み演算出力データに対してレイヤ２Ｍの前記量子化演算を行い、前記レイヤ２Ｍの前記量子化演算出力データを前記第一メモリに格納し、
前記畳み込み演算回路は、前記第一メモリに格納された前記レイヤ２Ｍの前記量子化演算出力データを前記入力データとしてレイヤ２Ｍ＋１の前記畳み込み演算を行い、レイヤ２Ｍ＋１の前記畳み込み演算出力データを前記第二メモリに格納し、
前記入力データは、第一部分テンソルと第二部分テンソルとに分解され、
前記第一部分テンソルに対応する前記レイヤ２Ｍ＋１の前記畳み込み演算と、前記第二部分テンソルに対応する前記レイヤ２Ｍの前記量子化演算と、は並列に実施される、
ニューラルネットワーク回路。
【請求項１９】
請求項１から請求項１８のいずれか一項に記載のニューラルネットワーク回路を含み、バッテリーによって駆動するエッジデバイス。
【請求項２０】
プロセッサをさらに備え、
前記プロセッサは前記ニューラルネットワーク回路の入力層または出力層における少なくとも一部の演算を行う、
請求項１９に記載のエッジデバイス。
【請求項２１】
第一メモリ領域と第二メモリ領域とを用いて畳み込み演算と量子化演算とを行うニューラルネットワーク演算方法であって、
前記第一メモリ領域に格納された入力データに対してレイヤ２Ｍ−１（Ｍは自然数）の前記畳み込み演算を行い、前記レイヤ２Ｍ−１の畳み込み演算出力データを前記第二メモリ領域に格納し、
前記第二メモリ領域に格納された前記レイヤ２Ｍ−１の前記畳み込み演算出力データに対してレイヤ２Ｍの前記量子化演算を行い、前記レイヤ２Ｍの量子化演算出力データを前記第一メモリ領域に格納し、
前記第一メモリ領域に格納された前記レイヤ２Ｍの前記量子化演算出力データを前記入力データとしてレイヤ２Ｍ＋１の前記畳み込み演算を行い、レイヤ２Ｍ＋１の前記畳み込み演算出力データを前記第二メモリ領域に格納し、
前記入力データを、第一部分テンソルと第二部分テンソルとに分解し、
前記第一部分テンソルに対応する前記レイヤ２Ｍ＋１の前記畳み込み演算と、前記第二部分テンソルに対応する前記レイヤ２Ｍの前記量子化演算と、を並列に実施する、
ニューラルネットワーク演算方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ニューラルネットワーク回路、エッジデバイスおよびニューラルネットワーク演算方法に関する。
【背景技術】
【０００２】
近年、畳み込みニューラルネットワーク（Ｃｏｎｖｏｌｕｔｉｏｎａｌ  Ｎｅｕｒａｌ  Ｎｅｔｗｏｒｋ：ＣＮＮ）が画像認識等のモデルとして用いられている。畳み込みニューラルネットワークは、畳み込み層やプーリング層を有する多層構造であり、畳み込み演算等の多数の演算を必要とする。畳み込みニューラルネットワークによる演算を高速化する演算手法が様々考案されている（特許文献１など）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１８−０７７８２９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
一方で、ＩｏＴ機器などの組み込み機器においても畳み込みニューラルネットワークを利用した画像認識等を実現することが望まれている。組み込み機器においては、特許文献1等に記載された大規模な専用回路を組み込むことは難しい。また、ＣＰＵやメモリ等のハードウェアリソースが限られた組み込み機器においては、畳み込みニューラルネットワークの十分な演算性能をソフトウェアのみにより実現することは難しい。
【０００５】
上記事情を踏まえ、本発明は、ＩｏＴ機器などの組み込み機器に組み込み可能かつ高性能なニューラルネットワーク回路、エッジデバイスおよびニューラルネットワーク演算方法を提供することを目的とする。
【課題を解決するための手段】
【０００６】
上記課題を解決するために、この発明は以下の手段を提案している。
本発明の第一の態様に係るニューラルネットワーク回路は、入力データを格納する第一メモリと、前記第一メモリに格納された前記入力データと重みとに対して畳み込み演算を行う畳み込み演算回路と、前記畳み込み演算回路の畳み込み演算出力データを格納する第二メモリと、前記第二メモリに格納された前記畳み込み演算出力データに対して量子化演算を行う量子化演算回路と、を備え、前記量子化演算回路の量子化演算出力データは、前記第一メモリに格納されて、前記第一メモリに格納された前記量子化演算出力データは、前記畳み込み演算回路に前記入力データとして入力され、前記第一メモリと、前記畳み込み演算回路と、前記第二メモリと、前記畳み込み演算回路とは、ループ状に形成されている。
本発明の第二の態様に係るエッジデバイスは、上記ニューラルネットワーク回路を含み、バッテリーによって駆動する。
【０００７】
本発明の第三の態様に係るニューラルネットワーク演算方法は、第一メモリ領域と第二メモリ領域とを用いて畳み込み演算と量子化演算とを行うニューラルネットワーク演算方法であって、前記第一メモリ領域に格納された入力データに対してレイヤ２Ｍ−１（Ｍは自然数）の前記畳み込み演算を行い、前記レイヤ２Ｍ−１の畳み込み演算出力データを前記第二メモリ領域に格納し、前記第二メモリ領域に格納された前記レイヤ２Ｍ−１の前記畳み込み演算出力データに対してレイヤ２Ｍの前記量子化演算を行い、前記レイヤ２Ｍの量子化演算出力データを前記第一メモリ領域に格納し、前記第一メモリ領域に格納された前記レイヤ２Ｍの前記量子化演算出力データを前記入力データとしてレイヤ２Ｍ＋１の前記畳み込み演算を行い、レイヤ２Ｍ＋１の前記畳み込み演算出力データを前記第二メモリ領域に格納し、前記入力データを、第一部分テンソルと第二部分テンソルとに分解し、前記第一部分テンソルに対応する前記レイヤ２Ｍ＋１の前記畳み込み演算と、前記第二部分テンソルに対応する前記レイヤ２Ｍの前記量子化演算と、を並列に実施する。
【発明の効果】
【０００８】
本発明のニューラルネットワーク回路、エッジデバイスおよびニューラルネットワーク演算方法は、ＩｏＴ機器などの組み込み機器に組み込み可能かつ高性能である。
【図面の簡単な説明】
【０００９】
【図１】畳み込みニューラルネットワークを示す図である。
【図２】畳み込み層が行う畳み込み演算を説明する図である。
【図３】畳み込み演算のデータの展開を説明する図である。
【図４】第一実施形態に係るニューラルネットワーク回路の全体構成を示す図である。
【図５】同ニューラルネットワーク回路の動作例を示すタイミングチャートである。
【図６】同ニューラルネットワーク回路の他の動作例を示すタイミングチャートである。
【図７】同ニューラルネットワーク回路のＤＭＡＣの内部ブロック図である。
【図８】同ＤＭＡＣの制御回路のステート遷移図である。
【図９】同ニューラルネットワーク回路の畳み込み演算回路の内部ブロック図である。
【図１０】同畳み込み演算回路の乗算器の内部ブロック図である。
【図１１】同乗算器の積和演算ユニットの内部ブロック図である。
【図１２】同畳み込み演算回路のアキュムレータ回路の内部ブロック図である。
【図１３】同アキュムレータ回路のアキュムレータユニットの内部ブロック図である。
【図１４】同ニューラルネットワーク回路の量子化演算回路の内部ブロック図である。
【図１５】同量子化演算回路のベクトル演算回路と量子化回路の内部ブロック図である。
【図１６】演算ユニットのブロック図である。
【図１７】同量子化回路のベクトル量子化ユニットの内部ブロック図である。
【図１８】セマフォによる同ニューラルネットワーク回路の制御を説明する図である。
【図１９】第一データフローのタイミングチャートである。
【図２０】第二データフローのタイミングチャートである。
【発明を実施するための形態】
【００１０】
（第一実施形態）
本発明の第一実施形態について、図１から図２０を参照して説明する。
図１は、畳み込みニューラルネットワーク２００（以下、「ＣＮＮ２００」という）を示す図である。第一実施形態に係るニューラルネットワーク回路１００（以下、「ＮＮ回路１００」という）が行う演算は、推論時に使用する学習済みのＣＮＮ２００の少なくとも一部である。
【００１１】
［ＣＮＮ２００］
ＣＮＮ２００は、畳み込み演算を行う畳み込み層２１０と、量子化演算を行う量子化演算層２２０と、出力層２３０と、を含む多層構造のネットワークである。ＣＮＮ２００の少なくとも一部において、畳み込み層２１０と量子化演算層２２０とが交互に連結されている。ＣＮＮ２００は、画像認識や動画認識に広く使われるモデルである。ＣＮＮ２００は、全結合層などの他の機能を有する層（レイヤ）をさらに有してもよい。
【００１２】
図２は、畳み込み層２１０が行う畳み込み演算を説明する図である。
畳み込み層２１０は、入力データａに対して重みｗを用いた畳み込み演算を行う。畳み込み層２１０は、入力データａと重みｗとを入力とする積和演算を行う。
【００１３】
畳み込み層２１０への入力データａ（アクティベーションデータ、特徴マップともいう）は、画像データ等の多次元データである。本実施形態において、入力データａは、要素（ｘ，ｙ，ｃ）からなる３次元テンソルである。ＣＮＮ２００の畳み込み層２１０は、低ビットの入力データａに対して畳み込み演算を行う。本実施形態において、入力データａの要素は、２ビットの符号なし整数（０，１，２，３）である。入力データａの要素は、例えば、４ビットや８ビット符号なし整数でもよい。
【００１４】
ＣＮＮ２００に入力される入力データが、例えば３２ビットの浮動小数点型など、畳み込み層２１０への入力データａと形式が異なる場合、ＣＮＮ２００は畳み込み層２１０の前に型変換や量子化を行う入力層をさらに有してもよい。
【００１５】
畳み込み層２１０の重みｗ（フィルタ、カーネルともいう）は、学習可能なパラメータである要素を有する多次元データである。本実施形態において、重みｗは、要素（ｉ，ｊ，ｃ，ｄ）からなる４次元テンソルである。重みｗは、要素（ｉ，ｊ，ｃ）からなる３次元テンソル（以降、「重みｗｏ」という）をｄ個有している。学習済みのＣＮＮ２００における重みｗは、学習済みのデータである。ＣＮＮ２００の畳み込み層２１０は、低ビットの重みｗを用いて畳み込み演算を行う。本実施形態において、重みｗの要素は、１ビットの符号付整数（０，１）であり、値「０」は＋１を表し、値「１」は−１を表す。
【００１６】
畳み込み層２１０は、式１に示す畳み込み演算を行い、出力データｆを出力する。式１において、ｓはストライドを示す。図２において点線で示された領域は、入力データａに対して重みｗｏが適用される領域ａｏ（以降、「適用領域ａｏ」という）の一つを示している。適用領域ａｏの要素は、（ｘ＋ｉ，ｙ＋ｊ，ｃ）で表される。
【００１７】
【数１】
0006896306.tif 000002
【００１８】
量子化演算層２２０は、畳み込み層２１０が出力する畳み込み演算の出力に対して量子化などを実施する。量子化演算層２２０は、プーリング層２２１と、Ｂａｔｃｈ  Ｎｏｒｍａｌｉｚａｔｉｏｎ層２２２と、活性化関数層２２３と、量子化層２２４と、を有する。
【００１９】
プーリング層２２１は、畳み込み層２１０が出力する畳み込み演算の出力データｆに対して平均プーリング（式２）やＭＡＸプーリング（式３）などの演算を実施して、畳み込み層２１０の出力データｆを圧縮する。式２および式３において、ｕは入力テンソルを示し、ｖは出力テンソルを示し、Ｔはプーリング領域の大きさを示す。式３において、ｍａｘはＴに含まれるｉとｊの組み合わせに対するｕの最大値を出力する関数である。
【００２０】
【数２】
0006896306.tif 000003
【００２１】
【数３】
0006896306.tif 000004
【００２２】
Ｂａｔｃｈ  Ｎｏｒｍａｌｉｚａｔｉｏｎ層２２２は、量子化演算層２２０やプーリング層２２１の出力データに対して、例えば式４に示すような演算によりデータ分布の正規化を行う。式４において、ｕは入力テンソルを示し、ｖは出力テンソルを示し、αはスケールを示し、βはバイアスを示す。学習済みのＣＮＮ２００において、αおよびβは学習済みの定数ベクトルである。
【００２３】
【数４】
0006896306.tif 000005
【００２４】
活性化関数層２２３は、量子化演算層２２０やプーリング層２２１やＢａｔｃｈ  Ｎｏｒｍａｌｉｚａｔｉｏｎ層２２２の出力に対してＲｅＬＵ（式５）などの活性化関数の演算を行う。式５において、ｕは入力テンソルであり、ｖは出力テンソルである。式５において、ｍａｘは引数のうち最も大きい数値を出力する関数である。
【００２５】
【数５】
0006896306.tif 000006
【００２６】
量子化層２２４は、量子化パラメータに基づいて、プーリング層２２１や活性化関数層２２３の出力に対して例えば式６に示すような量子化を行う。式６に示す量子化は、入力テンソルｕを２ビットにビット削減している。式６において、ｑ(ｃ)は量子化パラメータのベクトルである。学習済みのＣＮＮ２００において、ｑ(ｃ)は学習済みの定数ベクトルである。式６における不等式「≦」は「＜」であってもよい。
【００２７】
【数６】
0006896306.tif 000007
【００２８】
出力層２３０は、恒等関数やソフトマックス関数等によりＣＮＮ２００の結果を出力する層である。出力層２３０の前段のレイヤは、畳み込み層２１０であってもよいし、量子化演算層２２０であってもよい。
【００２９】
ＣＮＮ２００は、量子化された量子化層２２４の出力データが、畳み込み層２１０に入力されるため、量子化を行わない他の畳み込みニューラルネットワークと比較して、畳み込み層２１０の畳み込み演算の負荷が小さい。
【００３０】
［畳み込み演算の分割］
ＮＮ回路１００は、畳み込み層２１０の畳み込み演算（式１）を分割して演算する。なお、ＮＮ回路１００は、畳み込み層２１０の畳み込み演算（式１）を分割せずに演算することもできる。
【００３１】
畳み込み演算の分割において、式１における変数ｃは、式７に示すように、サイズＢｃのブロックで分割される。また、式１における変数ｄは、式８に示すように、サイズＢｄのブロックで分割される。式７において、ｃｏはオフセットであり、ｃｉは０から(Ｂｃ−１)までのインデックスである。式８において、ｄｏはオフセットであり、ｄｉは０から(Ｂｄ−１)までのインデックスである。なお、サイズＢｃとサイズＢｄは同じであってもよい。
【００３２】
【数７】
0006896306.tif 000008
【００３３】
【数８】
0006896306.tif 000009
【００３４】
式１における入力データａ（ｘ＋ｉ，ｙ＋ｊ，ｃ）は、サイズＢｃにより分割され、分割された入力データａ（ｘ＋ｉ，ｙ＋ｊ，ｃｏ）で表される。以降の説明において、分割された入力データａを「分割入力データａ」ともいう。
【００３５】
式１における重みｗ（ｉ，ｊ，ｃ，ｄ）は、サイズＢｃおよびＢｄにより分割され、分割された重みｗ（ｉ，ｊ，ｃｏ，ｄｏ）で表される。以降の説明において、分割された重みｗを「分割重みｗ」ともいう。
【００３６】
サイズＢｄにより分割された出力データｆ（ｘ，ｙ，ｄｏ）は、式９により求まる。分割された出力データｆ（ｘ，ｙ，ｄｏ）を組み合わせることで、最終的な出力データｆ（ｘ，ｙ，ｄ）を算出できる。
【００３７】
【数９】
0006896306.tif 000010
【００３８】
［畳み込み演算のデータの展開］
ＮＮ回路１００は、畳み込み層２１０の畳み込み演算における入力データａおよび重みｗを展開して畳み込み演算を行う。
【００３９】
図３は、畳み込み演算のデータの展開を説明する図である。
分割入力データａ（ｘ＋ｉ、ｙ＋ｊ、ｃｏ）は、Ｂｃ個の要素を持つベクトルデータに展開される。分割入力データａの要素は、ｃｉでインデックスされる（０≦ｃｉ＜Ｂｃ）。以降の説明において、ｉ，ｊごとにベクトルデータに展開された分割入力データａを「入力ベクトルＡ」ともいう。入力ベクトルＡは、分割入力データａ（ｘ＋ｉ、ｙ＋ｊ、ｃｏ×Ｂｃ）から分割入力データａ（ｘ＋ｉ、ｙ＋ｊ、ｃｏ×Ｂｃ＋（Ｂｃ−１））までを要素とする。
【００４０】
分割重みｗ（ｉ，ｊ，ｃｏ、ｄｏ）は、Ｂｃ×Ｂｄ個の要素を持つマトリクスデータに展開される。マトリクスデータに展開された分割重みｗの要素は、ｃｉとｄｉでインデックスされる（０≦ｄｉ＜Ｂｄ）。以降の説明において、ｉ，ｊごとにマトリクスデータに展開された分割重みｗを「重みマトリクスＷ」ともいう。重みマトリクスＷは、分割重みｗ（ｉ，ｊ，ｃｏ×Ｂｃ、ｄｏ×Ｂｄ）から分割重みｗ（ｉ，ｊ，ｃｏ×Ｂｃ＋（Ｂｃ−１）、ｄｏ×Ｂｄ＋（Ｂｄ−１））までを要素とする。
【００４１】
入力ベクトルＡと重みマトリクスＷとを乗算することで、ベクトルデータが算出される。ｉ，ｊ，ｃｏごとに算出されたベクトルデータを３次元テンソルに整形することで、出力データｆ（ｘ，ｙ，ｄｏ）を得ることができる。このようなデータの展開を行うことで、畳み込み層２１０の畳み込み演算を、ベクトルデータとマトリクスデータとの乗算により実施できる。
【００４２】
［ＮＮ回路１００］
図４は、本実施形態に係るＮＮ回路１００の全体構成を示す図である。
ＮＮ回路１００は、第一メモリ１と、第二メモリ２と、ＤＭＡコントローラ３（以下、「ＤＭＡＣ３」ともいう）と、畳み込み演算回路４と、量子化演算回路５と、コントローラ６と、を備える。ＮＮ回路１００は、第一メモリ１および第二メモリ２を介して、畳み込み演算回路４と量子化演算回路５とがループ状に形成されていることを特徴とする。
【００４３】
第一メモリ１は、例えばＳＲＡＭ（Ｓｔａｔｉｃ  ＲＡＭ）などで構成された揮発性のメモリ等の書き換え可能なメモリである。第一メモリ１には、ＤＭＡＣ３やコントローラ６を介してデータの書き込みおよび読み出しが行われる。第一メモリ１は、畳み込み演算回路４の入力ポートと接続されており、畳み込み演算回路４は第一メモリ１からデータを読み出すことができる。また、第一メモリ１は、量子化演算回路５の出力ポートと接続されており、量子化演算回路５は第一メモリ１にデータを書き込むことができる。外部ホストＣＰＵは、第一メモリ１に対するデータの書き込みや読み出しにより、ＮＮ回路１００に対するデータの入出力を行うことができる。
【００４４】
第二メモリ２は、例えばＳＲＡＭ（Ｓｔａｔｉｃ  ＲＡＭ）などで構成された揮発性のメモリ等の書き換え可能なメモリである。第二メモリ２には、ＤＭＡＣ３やコントローラ６を介してデータの書き込みおよび読み出しが行われる。第二メモリ２は、量子化演算回路５の入力ポートと接続されており、量子化演算回路５は第二メモリ２からデータを読み出すことができる。また、第二メモリ２は、畳み込み演算回路４の出力ポートと接続されており、畳み込み演算回路４は第二メモリ２にデータを書き込むことができる。外部ホストＣＰＵは、第二メモリ２に対するデータの書き込みや読み出しにより、ＮＮ回路１００に対するデータの入出力を行うことができる。
【００４５】
ＤＭＡＣ３は、外部バスＥＢに接続されており、ＤＲＡＭなどの外部メモリと第一メモリ１との間のデータ転送を行う。また、ＤＭＡＣ３は、ＤＲＡＭなどの外部メモリと第二メモリ２との間のデータ転送を行う。また、ＤＭＡＣ３は、ＤＲＡＭなどの外部メモリと畳み込み演算回路４との間のデータ転送を行う。また、ＤＭＡＣ３は、ＤＲＡＭなどの外部メモリと量子化演算回路５との間のデータ転送を行う。
【００４６】
畳み込み演算回路４は、学習済みのＣＮＮ２００の畳み込み層２１０における畳み込み演算を行う回路である。第一メモリ１に格納された入力データａを読み出し、入力データａに対して畳み込み演算を実施する。畳み込み演算回路４は、畳み込み演算の出力データｆ（以降、「畳み込み演算出力データ」ともいう）を第二メモリ２に書き込む。
【００４７】
量子化演算回路５は、学習済みのＣＮＮ２００の量子化演算層２２０における量子化演算の少なくとも一部を行う回路である。第二メモリ２に格納された畳み込み演算の出力データｆを読み出し、畳み込み演算の出力データｆに対して量子化演算（プーリング、Ｂａｔｃｈ  Ｎｏｒｍａｌｉｚａｔｉｏｎ、活性化関数、および量子化のうち少なくとも量子化を含む演算）を行う。量子化演算回路５は、量子化演算の出力データ（以降、「量子化演算出力データ」ともいう）を第一メモリ１に書き込む。
【００４８】
コントローラ６は、外部バスＥＢに接続されており、外部のホストＣＰＵのスレーブとして動作する。コントローラ６は、パラメータレジスタや状態レジスタを含むレジスタ６１を有している。パラメータレジスタは、ＮＮ回路１００の動作を制御するレジスタである。状態レジスタはセマフォＳを含むＮＮ回路１００の状態を示すレジスタである。外部ホストＣＰＵは、コントローラ６を経由して、レジスタ６１にアクセスできる。
【００４９】
コントローラ６は、内部バスＩＢを介して、第一メモリ１と、第二メモリ２と、ＤＭＡＣ３と、畳み込み演算回路４と、量子化演算回路５と、接続されている。外部ホストＣＰＵは、コントローラ６を経由して、各ブロックに対してアクセスできる。例えば、外部ホストＣＰＵは、コントローラ６を経由して、ＤＭＡＣ３や畳み込み演算回路４や量子化演算回路５に対する命令を指示することができる。また、ＤＭＡＣ３や畳み込み演算回路４や量子化演算回路５は、内部バスＩＢを介して、コントローラ６が有する状態レジスタ（セマフォＳを含む）を更新できる。状態レジスタ（セマフォＳを含む）は、ＤＭＡＣ３や畳み込み演算回路４や量子化演算回路５と専用配線により更新させるように構成されていてもよい。
【００５０】
ＮＮ回路１００は、第一メモリ１や第二メモリ２等を有するため、ＤＲＡＭなどの外部メモリからのＤＭＡＣ３によるデータ転送において、重複するデータのデータ転送の回数を低減できる。これにより、メモリアクセスにより発生する消費電力を大幅に低減することができる。
【００５１】
［ＮＮ回路１００の動作例１］
図５は、ＮＮ回路１００の動作例を示すタイミングチャートである。
ＤＭＡＣ３は、レイヤ１の入力データａを第一メモリ１に格納する。ＤＭＡＣ３は、畳み込み演算回路４が行う畳み込み演算の順序にあわせて、レイヤ１の入力データａを分割して第一メモリ１に転送してもよい。
【００５２】
畳み込み演算回路４は、第一メモリ１に格納されたレイヤ１の入力データａを読み出す。畳み込み演算回路４は、レイヤ１の入力データａに対して図１に示すレイヤ１の畳み込み演算を行う。レイヤ１の畳み込み演算の出力データｆは、第二メモリ２に格納される。
【００５３】
量子化演算回路５は、第二メモリ２に格納されたレイヤ１の出力データｆを読み出す。量子化演算回路５は、レイヤ１の出力データｆに対してレイヤ２の量子化演算を行う。レイヤ２の量子化演算の出力データは、第一メモリ１に格納される。
【００５４】
畳み込み演算回路４は、第一メモリ１に格納されたレイヤ２の量子化演算の出力データを読み出す。畳み込み演算回路４は、レイヤ２の量子化演算の出力データを入力データａとしてレイヤ３の畳み込み演算を行う。レイヤ３の畳み込み演算の出力データｆは、第二メモリ２に格納される。
【００５５】
畳み込み演算回路４は、第一メモリ１に格納されたレイヤ２Ｍ−２（Ｍは自然数）の量子化演算の出力データを読み出す。畳み込み演算回路４は、レイヤ２Ｍ−２の量子化演算の出力データを入力データａとしてレイヤ２Ｍ−１の畳み込み演算を行う。レイヤ２Ｍ−１の畳み込み演算の出力データｆは、第二メモリ２に格納される。
【００５６】
量子化演算回路５は、第二メモリ２に格納されたレイヤ２Ｍ−１の出力データｆを読み出す。量子化演算回路５は、２Ｍ−１レイヤの出力データｆに対してレイヤ２Ｍの量子化演算を行う。レイヤ２Ｍの量子化演算の出力データは、第一メモリ１に格納される。
【００５７】
畳み込み演算回路４は、第一メモリ１に格納されたレイヤ２Ｍの量子化演算の出力データを読み出す。畳み込み演算回路４は、レイヤ２Ｍの量子化演算の出力データを入力データａとしてレイヤ２Ｍ＋１の畳み込み演算を行う。レイヤ２Ｍ＋１の畳み込み演算の出力データｆは、第二メモリ２に格納される。
【００５８】
畳み込み演算回路４と量子化演算回路５とが交互に演算を行い、図１に示すＣＮＮ２００の演算を進めていく。ＮＮ回路１００は、畳み込み演算回路４が時分割によりレイヤ２Ｍ−１の畳み込み演算とレイヤ２Ｍ＋１を実施する。また、ＮＮ回路１００は、量子化演算回路５が時分割によりレイヤ２Ｍ−２の畳み込み演算とレイヤ２Ｍを実施する。そのため、ＮＮ回路１００は、レイヤごとに別々の畳み込み演算回路４と量子化演算回路５を実装する場合と比較して、回路規模が著しく小さい。
【００５９】
ＮＮ回路１００は、複数のレイヤの多層構造であるＣＮＮ２００の演算を、ループ状に形成された回路により演算する。ＮＮ回路１００は、ループ状の回路構成により、ハードウェア資源を効率的に利用できる。なお、ＮＮ回路１００は、ループ状に回路を形成するために、各レイヤで変化する畳み込み演算回路４や量子化演算回路５におけるパラメータは適宜更新される。
【００６０】
ＣＮＮ２００の演算にＮＮ回路１００により実施できない演算が含まれる場合、ＮＮ回路１００は外部ホストＣＰＵなどの外部演算デバイスに中間データを転送する。外部演算デバイスが中間データに対して演算を行った後、外部演算デバイスによる演算結果は第一メモリ１や第二メモリ２に入力される。ＮＮ回路１００は、外部演算デバイスによる演算結果に対する演算を再開する。
【００６１】
［ＮＮ回路１００の動作例２］
図６は、ＮＮ回路１００の他の動作例を示すタイミングチャートである。
ＮＮ回路１００は、入力データａを部分テンソルに分割して、時分割により部分テンソルに対する演算を行ってもよい。部分テンソルへの分割方法や分割数は特に限定されない。
【００６２】
図６は、入力データａを二つの部分テンソルに分解した場合の動作例を示している。分解された部分テンソルを、「第一部分テンソルａ1」、「第二部分テンソルａ2」とする。例えば、レイヤ２Ｍ−１の畳み込み演算は、第一部分テンソルａ1に対応する畳み込み演算（図６において、「レイヤ２Ｍ−１（ａ1）」と表記）と、第二部分テンソルａ2に対応する畳み込み演算（図６において、「レイヤ２Ｍ−１（ａ2）」と表記）と、に分解される。
【００６３】
第一部分テンソルａ1に対応する畳み込み演算および量子化演算と、第二部分テンソルａ2に対応する畳み込み演算および量子化演算とは、図６に示すように、独立して実施することができる。
【００６４】
畳み込み演算回路４は、第一部分テンソルａ1に対応するレイヤ２Ｍ−１の畳み込み演算（図６において、レイヤ２Ｍ−１（ａ1）で示す演算）を行う。その後、畳み込み演算回路４は、第二部分テンソルａ２に対応するレイヤ２Ｍ−１の畳み込み演算（図６において、レイヤ２Ｍ−１（ａ２）で示す演算）を行う。また、量子化演算回路５は、第一部分テンソルａ1に対応するレイヤ２Ｍの量子化演算（図６において、レイヤ２Ｍ（ａ1）で示す演算）を行う。このように、ＮＮ回路１００は、第二部分テンソルａ２に対応するレイヤ２Ｍ−１の畳み込み演算と、第一部分テンソルａ1に対応するレイヤ２Ｍの量子化演算と、を並列に実施できる。
【００６５】
次に、畳み込み演算回路４は、第一部分テンソルａ1に対応するレイヤ２Ｍ＋１の畳み込み演算（図６において、レイヤ２Ｍ＋１（ａ1）で示す演算）を行う。また、量子化演算回路５は、第二部分テンソルａ２に対応するレイヤ２Ｍの量子化演算（図６において、レイヤ２Ｍ（ａ２）で示す演算）を行う。このように、ＮＮ回路１００は、第一部分テンソルａ1に対応するレイヤ２Ｍ＋１の畳み込み演算と、第二部分テンソルａ２に対応するレイヤ２Ｍの量子化演算と、を並列に実施できる。
【００６６】
入力データａを部分テンソルに分割することで、ＮＮ回路１００は畳み込み演算回路４と量子化演算回路５とを並列して動作させることができる。その結果、畳み込み演算回路４と量子化演算回路５が待機する時間が削減され、ＮＮ回路１００の演算処理効率が向上する。図６に示す動作例において分割数は２であったが、分割数が２より大きい場合も同様に、ＮＮ回路１００は畳み込み演算回路４と量子化演算回路５とを並列して動作させることができる。
【００６７】
なお、部分テンソルに対する演算方法としては、同一レイヤにおける部分テンソルの演算を畳み込み演算回路４または量子化演算回路５で行った後に次のレイヤにおける部分テンソルの演算を行う例（方法１）を示したが、演算方法はこれに限られない。ＮＮ回路１００は、複数レイヤにおける一部の部分テンソルの演算をした後に残部の部分テンソルの演算をしてもよい（方法２）。また、ＮＮ回路１００は、方法１と方法２とを組み合わせて部分テンソルを演算してもよい。
【００６８】
次に、ＮＮ回路１００の各構成に関して詳しく説明する。
【００６９】
［ＤＭＡＣ３］
図７は、ＤＭＡＣ３の内部ブロック図である。
ＤＭＡＣ３は、データ転送回路３１と、ステートコントローラ３２と、を有する。ＤＭＡＣ３は、データ転送回路３１に対する専用のステートコントローラ３２を有しており、命令コマンドが入力されると、外部のコントローラを必要とせずにＤＭＡデータ転送を実施できる。
【００７０】
データ転送回路３１は、外部バスＥＢに接続されており、ＤＲＡＭなどの外部メモリと第一メモリ１との間のＤＭＡデータ転送を行う。また、データ転送回路３１は、ＤＲＡＭなどの外部メモリと第二メモリ２との間のＤＭＡデータ転送を行う。また、データ転送回路３１は、ＤＲＡＭなどの外部メモリと畳み込み演算回路４との間のデータ転送を行う。また、データ転送回路３１は、ＤＲＡＭなどの外部メモリと量子化演算回路５との間のデータ転送を行う。データ転送回路３１のＤＭＡチャンネル数は限定されない。例えば、第一メモリ１と第二メモリ２のそれぞれに専用のＤＭＡチャンネルを有していてもよい。
【００７１】
ステートコントローラ３２は、データ転送回路３１のステートを制御する。また、ステートコントローラ３２は、内部バスＩＢを介してコントローラ６と接続されている。ステートコントローラ３２は、命令キュー３３と制御回路３４とを有する。
【００７２】
命令キュー３３は、ＤＭＡＣ３用の命令コマンドＣ３が格納されるキューであり、例えばＦＩＦＯメモリで構成される。命令キュー３３には、内部バスＩＢ経由で１つ以上の命令コマンドＣ３が書き込まれる。
【００７３】
制御回路３４は、命令コマンドＣ３をデコードし、命令コマンドＣ３に基づいて順次データ転送回路３１を制御するステートマシンである。制御回路３４は、論理回路により実装されていてもよいし、ソフトウェアによって制御されるＣＰＵによって実装されていてもよい。
【００７４】
図８は、制御回路３４のステート遷移図である。
制御回路３４は、命令キュー３３に命令コマンドＣ３が入力されると（Ｎｏｔ  ｅｍｐｔｙ）、アイドルステートＳ１からデコードステートＳ２に遷移する。
【００７５】
制御回路３４は、デコードステートＳ２において、命令キュー３３から出力される命令コマンドＣ３をデコードする。また、制御回路３４は、コントローラ６のレジスタ６１に格納されたセマフォＳを読み出し、命令コマンドＣ３において指示されたデータ転送回路３１の動作を実行可能であるかを判定する。実行不能である場合（Ｎｏｔ  ｒｅａｄｙ）、制御回路３４は実行可能となるまで待つ（Ｗａｉｔ）。実行可能である場合（ｒｅａｄｙ）、制御回路３４はデコードステートＳ２から実行ステートＳ３に遷移する。
【００７６】
制御回路３４は、実行ステートＳ３において、データ転送回路３１を制御して、データ転送回路３１に命令コマンドＣ３において指示された動作を実施させる。制御回路３４は、データ転送回路３１の動作が終わると、命令キュー３３から実行を終えた命令コマンドＣ３を取り除くとともに、コントローラ６のレジスタ６１に格納されたセマフォＳを更新する。制御回路３４は、命令キュー３３に命令がある場合（Ｎｏｔ  ｅｍｐｔｙ）、実行ステートＳ３からデコードステートＳ２に遷移する。制御回路３４は、命令キュー３３に命令がない場合（ｅｍｐｔｙ）、実行ステートＳ３からアイドルステートＳ１に遷移する。
【００７７】
［畳み込み演算回路４］
図９は、畳み込み演算回路４の内部ブロック図である。
畳み込み演算回路４は、重みメモリ４１と、乗算器４２と、アキュムレータ回路４３と、ステートコントローラ４４と、を有する。畳み込み演算回路４は、乗算器４２およびアキュムレータ回路４３に対する専用のステートコントローラ４４を有しており、命令コマンドが入力されると、外部のコントローラを必要とせずに畳み込み演算を実施できる。
【００７８】
重みメモリ４１は、畳み込み演算に用いる重みＷが格納されるメモリであり、例えばＳＲＡＭ（Ｓｔａｔｉｃ  ＲＡＭ）などで構成された揮発性のメモリ等の書き換え可能なメモリである。ＤＭＡＣ３は、ＤＭＡ転送により、畳み込み演算に必要な重みＷを重みメモリ４１に書き込む。
【００７９】
図１０は、乗算器４２の内部ブロック図である。
乗算器４２は、入力ベクトルＡと重みマトリクスＷとを乗算する。入力ベクトルＡは、上述したように、分割入力データａ（ｘ＋ｉ、ｙ＋ｊ、ｃｏ）が展開されたＢｃ個の要素を持つベクトルデータである。また、重みマトリクスＷは、分割重みｗ（ｉ，ｊ，ｃｏ、ｄｏ）が展開されたＢｃ×Ｂｄ個の要素を持つマトリクスデータである。乗算器４２は、Ｂｃ×Ｂｄ個の積和演算ユニット４７を有し、入力ベクトルＡと重みマトリクスＷとを乗算を並列して実施できる。
【００８０】
乗算器４２は、乗算に必要な入力ベクトルＡと重みマトリクスＷを、第一メモリ１および重みメモリ４１から読み出して乗算を実施する。乗算器４２は、Ｂｄ個の積和演算結果Ｏ（ｄｉ）を出力する。
【００８１】
図１１は、積和演算ユニット４７の内部ブロック図である。
積和演算ユニット４７は、入力ベクトルＡの要素Ａ（ｃｉ）と、重みマトリクスＷの要素Ｗ（ｃｉ，ｄｉ）との乗算を実施する。また、積和演算ユニット４７は、乗算結果と他の積和演算ユニット４７の乗算結果Ｓ（ｃｉ，ｄｉ）と加算する。積和演算ユニット４７は、加算結果Ｓ（ｃｉ＋１，ｄｉ）を出力する。要素Ａ（ｃｉ）は、２ビットの符号なし整数（０，１，２，３）である。要素Ｗ（ｃｉ，ｄｉ）は、１ビットの符号付整数（０，１）であり、値「０」は＋１を表し、値「１」は−１を表す。
【００８２】
積和演算ユニット４７は、反転器（インバータ）４７ａと、セレクタ４７ｂと、加算器４７ｃと、を有する。積和演算ユニット４７は、乗算器を用いず、反転器４７ａおよびセレクタ４７ｂのみを用いて乗算を行う。セレクタ４７ｂは、要素Ｗ（ｃｉ，ｄｉ）が「０」の場合、要素Ａ（ｃｉ）の入力を選択する。セレクタ４７ｂは、要素Ｗ（ｃｉ，ｄｉ）が「１」の場合、要素Ａ（ｃｉ）を反転器により反転させた補数を選択する。要素Ｗ（ｃｉ，ｄｉ）は、加算器４７ｃのＣａｒｒｙ−ｉｎにも入力される。加算器４７ｃは、要素Ｗ（ｃｉ，ｄｉ）が「０」のとき、Ｓ（ｃｉ，ｄｉ）に要素Ａ（ｃｉ）を加算した値を出力する。加算器４７ｃは、Ｗ（ｃｉ，ｄｉ）が「１」のとき、Ｓ（ｃｉ，ｄｉ）から要素Ａ（ｃｉ）を減算した値を出力する。
【００８３】
図１２は、アキュムレータ回路４３の内部ブロック図である。
アキュムレータ回路４３は、乗算器４２の積和演算結果Ｏ（ｄｉ）を第二メモリ２にアキュムレートする。アキュムレータ回路４３は、Ｂｄ個のアキュムレータユニット４８を有し、Ｂｄ個の積和演算結果Ｏ（ｄｉ）を並列して第二メモリ２にアキュムレートできる。
【００８４】
図１３は、アキュムレータユニット４８の内部ブロック図である。
アキュムレータユニット４８は、加算器４８ａと、マスク部４８ｂとを有している。加算器４８ａは、積和演算結果Ｏの要素Ｏ（ｄｉ）と、第二メモリ２に格納された式１に示す畳み込み演算の途中経過である部分和と、を加算する。加算結果は、要素あたり１６ビットである。加算結果は、要素あたり１６ビットに限定されず、例えば要素あたり１５ビットや１７ビットであってもよい。
【００８５】
加算器４８ａは、加算結果を第二メモリ２の同一アドレスに書き込む。マスク部４８ｂは、初期化信号ｃｌｅａｒがアサートされた場合に、第二メモリ２からの出力をマスクし、要素Ｏ（ｄｉ）に対する加算対象をゼロにする。初期化信号ｃｌｅａｒは、第二メモリ２に途中経過の部分和が格納されていない場合にアサートされる。
【００８６】
乗算器４２およびアキュムレータ回路４３による畳み込み演算が完了すると、第二メモリに、出力データｆ（ｘ，ｙ，ｄｏ）が格納される。
【００８７】
ステートコントローラ４４は、乗算器４２およびアキュムレータ回路４３のステートを制御する。また、ステートコントローラ４４は、内部バスＩＢを介してコントローラ６と接続されている。ステートコントローラ４４は、命令キュー４５と制御回路４６とを有する。
【００８８】
命令キュー４５は、畳み込み演算回路４用の命令コマンドＣ４が格納されるキューであり、例えばＦＩＦＯメモリで構成される。命令キュー４５には、内部バスＩＢ経由で命令コマンドＣ４が書き込まれる。
【００８９】
制御回路４６は、命令コマンドＣ４をデコードし、命令コマンドＣ４に基づいて乗算器４２およびアキュムレータ回路４３を制御するステートマシンである。制御回路４６は、ＤＭＡＣ３のステートコントローラ３２の制御回路３４と同様の構成である。
【００９０】
［量子化演算回路５］
図１４は、量子化演算回路５の内部ブロック図である。
量子化演算回路５は、量子化パラメータメモリ５１と、ベクトル演算回路５２と、量子化回路５３と、ステートコントローラ５４と、を有する量子化演算回路５は、ベクトル演算回路５２および量子化回路５３に対する専用のステートコントローラ５４を有しており、命令コマンドが入力されると、外部のコントローラを必要とせずに量子化演算を実施できる。
【００９１】
量子化パラメータメモリ５１は、量子化演算に用いる量子化パラメータｑが格納されるメモリであり、例えばＳＲＡＭ（Ｓｔａｔｉｃ  ＲＡＭ）などで構成された揮発性のメモリ等の書き換え可能なメモリである。ＤＭＡＣ３は、ＤＭＡ転送により、量子化演算に必要な量子化パラメータｑを量子化パラメータメモリ５１に書き込む。
【００９２】
図１５は、ベクトル演算回路５２と量子化回路５３の内部ブロック図である。
ベクトル演算回路５２は、第二メモリ２に格納された出力データｆ（ｘ，ｙ，ｄｏ）に対して演算を行う。ベクトル演算回路５２は、Ｂｄ個の演算ユニット５７を有し、出力データｆ（ｘ，ｙ，ｄｏ）に対して並列にＳＩＭＤ演算を行う。
【００９３】
図１６は、演算ユニット５７のブロック図である。
演算ユニット５７は、例えば、ＡＬＵ５７ａと、第一セレクタ５７ｂと、第二セレクタ５７ｃと、レジスタ５７ｄと、シフタ５７ｅと、を有する。演算ユニット５７は、公知の汎用ＳＩＭＤ演算回路が有する他の演算器等をさらに有してもよい。
【００９４】
ベクトル演算回路５２は、演算ユニット５７が有する演算器等を組み合わせることで、出力データｆ（ｘ，ｙ，ｄｏ）に対して、量子化演算層２２０におけるプーリング層２２１や、Ｂａｔｃｈ  Ｎｏｒｍａｌｉｚａｔｉｏｎ層２２２や、活性化関数層２２３の演算のうち少なくとも一つの演算を行う。
【００９５】
演算ユニット５７は、レジスタ５７ｄに格納されたデータと第二メモリ２から読み出した出力データｆ（ｘ，ｙ，ｄｏ）の要素ｆ（ｄｉ）とをＡＬＵ５７ａにより加算できる。演算ユニット５７は、ＡＬＵ５７ａによる加算結果をレジスタ５７ｄに格納できる。演算ユニット５７は、第一セレクタ５７ｂの選択によりレジスタ５７ｄに格納されたデータに代えて「０」をＡＬＵ５７ａに入力することで加算結果を初期化できる。例えばプーリング領域が２×２である場合、シフタ５７ｅはＡＬＵ５７ａの出力を２ｂｉｔ右シフトすることで加算結果の平均値を出力できる。ベクトル演算回路５２は、Ｂｄ個の演算ユニット５７による上記の演算等を繰り返すことで、式２に示す平均プーリングの演算を実施できる。
【００９６】
演算ユニット５７は、レジスタ５７ｄに格納されたデータと第二メモリ２から読み出した出力データｆ（ｘ，ｙ，ｄｏ）の要素ｆ（ｄｉ）とをＡＬＵ５７ａにより比較できる。
演算ユニット５７は、ＡＬＵ５７ａによる比較結果に応じて第二セレクタ５７ｃを制御して、レジスタ５７ｄに格納されたデータと要素ｆ（ｄｉ）の大きい方を選択できる。演算ユニット５７は、第一セレクタ５７ｂの選択により要素ｆ（ｄｉ）の取りうる値の最小値をＡＬＵ５７ａに入力することで比較対象を最小値に初期化できる。本実施形態において要素ｆ（ｄｉ）は１６ｂｉｔ符号付き整数であるので、要素ｆ（ｄｉ）の取りうる値の最小値は「０ｘ８０００」である。ベクトル演算回路５２は、Ｂｄ個の演算ユニット５７による上記の演算等を繰り返すことで、式３のＭＡＸプーリングの演算を実施できる。なお、ＭＡＸプーリングの演算ではシフタ５７ｅは第二セレクタ５７ｃの出力をシフトしない。
【００９７】
演算ユニット５７は、レジスタ５７ｄに格納されたデータと第二メモリ２から読み出した出力データｆ（ｘ，ｙ，ｄｏ）の要素ｆ（ｄｉ）とをＡＬＵ５７ａにより減算できる。シフタ５７ｅはＡＬＵ５７ａの出力を左シフト（すなわち乗算）もしくは右シフト（すなわち除算）できる。ベクトル演算回路５２は、Ｂｄ個の演算ユニット５７による上記の演算等を繰り返すことで、式４のＢａｔｃｈ  Ｎｏｒｍａｌｉｚａｔｉｏｎの演算を実施できる。
【００９８】
演算ユニット５７は、第二メモリ２から読み出した出力データｆ（ｘ，ｙ，ｄｏ）の要素ｆ（ｄｉ）と第一セレクタ５７ｂにより選択された「０」とをＡＬＵ５７ａにより比較できる。演算ユニット５７は、ＡＬＵ５７ａによる比較結果に応じて要素ｆ（ｄｉ）と予めレジスタ５７ｄに格納された定数値「０」のいずれかを選択して出力できる。ベクトル演算回路５２は、Ｂｄ個の演算ユニット５７による上記の演算等を繰り返すことで、式５のＲｅＬＵ演算を実施できる。
【００９９】
ベクトル演算回路５２は、平均プーリング、ＭＡＸプーリング、Ｂａｔｃｈ  Ｎｏｒｍａｌｉｚａｔｉｏｎ、活性化関数の演算およびこれらの演算の組み合わせを実施できる。ベクトル演算回路５２は、汎用ＳＩＭＤ演算を実施できるため、量子化演算層２２０における演算に必要な他の演算を実施してもよい。また、ベクトル演算回路５２は、量子化演算層２２０における演算以外の演算を実施してもよい。
【０１００】
なお、量子化演算回路５は、ベクトル演算回路５２を有してなくてもよい。量子化演算回路５がベクトル演算回路５２を有していない場合、出力データｆ（ｘ，ｙ，ｄｏ）は量子化回路５３に入力される。
【０１０１】
量子化回路５３は、ベクトル演算回路５２の出力データに対して、量子化を行う。量子化回路５３は、図１５に示すように、Ｂｄ個の量子化ユニット５８を有し、ベクトル演算回路５２の出力データに対して並列に演算を行う。
【０１０２】
図１７は、量子化ユニット５８の内部ブロック図である。
量子化ユニット５８は、ベクトル演算回路５２の出力データの要素ｉｎ（ｄｉ）に対して量子化を行う。量子化ユニット５８は、比較器５８ａと、エンコーダ５８ｂと、を有する。量子化ユニット５８はベクトル演算回路５２の出力データ（１６ビット／要素）に対して、量子化演算層２２０における量子化層２２４の演算（式６）を行う。量子化ユニット５８は、量子化パラメータメモリ５１から必要な量子化パラメータｑ（ｔｈ０，ｔｈ１，ｔｈ２）を読み出し、比較器５８ａにより入力ｉｎ（ｄｉ）と量子化パラメータｑとの比較を行う。量子化ユニット５８は、比較器５８ａによる比較結果をエンコーダ５８ｂにより２ビット／要素に量子化する。式４におけるα(c)とβ(c)は、変数ｃごとに異なるパラメータであるため、α(c)とβ(c)を反映する量子化パラメータｑ（ｔｈ０，ｔｈ１，ｔｈ２）はｉｎ（ｄｉ）ごとに異なるパラメータである。
【０１０３】
量子化ユニット５８は、入力ｉｎ（ｄｉ）を３つの閾値ｔｈ０，ｔｈ１，ｔｈ２と比較することにより、入力ｉｎ（ｄｉ）を４領域（例えば、ｉｎ≦ｔｈ０，ｔｈ０＜ｉｎ≦ｔｈ１，ｔｈ１＜ｉｎ≦ｔｈ２，ｔｈ２＜ｉｎ）に分類し、分類結果を２ビットにエンコードして出力する。量子化ユニット５８は、量子化パラメータｑ（ｔｈ０，ｔｈ１，ｔｈ２）の設定により、量子化と併せてＢａｔｃｈ  Ｎｏｒｍａｌｉｚａｔｉｏｎや活性化関数の演算を行うこともできる。
【０１０４】
量子化ユニット５８は、閾値ｔｈ０を式４のβ(ｃ)、閾値の差（ｔｈ１―ｔｈ０）および（ｔｈ２―ｔｈ１）を式４のα(ｃ)として設定して量子化を行うことで、式４に示すＢａｔｃｈ  Ｎｏｒｍａｌｉｚａｔｉｏｎの演算を量子化と併せて実施できる。（ｔｈ１―ｔｈ０）および（ｔｈ２―ｔｈ１）を大きくすることでα(ｃ)を小さくできる。（ｔｈ１―ｔｈ０）および（ｔｈ２―ｔｈ１）を小さくすることで、α(c)を大きくできる。
【０１０５】
量子化ユニット５８は、入力ｉｎ（ｄｉ）の量子化と併せて活性化関数のＲｅＬＵ演算を実施できる。例えば、量子化ユニット５８は、ｉｎ（ｄｉ）≦ｔｈ０およびｔｈ２＜ｉｎ（ｄｉ）となる領域では出力値を飽和させる。量子化ユニット５８は、出力が非線形とするように量子化パラメータｑを設定することで活性化関数の演算を量子化と併せて実施できる。
【０１０６】
ステートコントローラ５４は、ベクトル演算回路５２および量子化回路５３のステートを制御する。また、ステートコントローラ５４は、内部バスＩＢを介してコントローラ６と接続されている。ステートコントローラ５４は、命令キュー５５と制御回路５６とを有する。
【０１０７】
命令キュー５５は、量子化演算回路５用の命令コマンドＣ５が格納されるキューであり、例えばＦＩＦＯメモリで構成される。命令キュー５５には、内部バスＩＢ経由で命令コマンドＣ５が書き込まれる。
【０１０８】
制御回路５６は、命令コマンドＣ５をデコードし、命令コマンドＣ５に基づいてベクトル演算回路５２および量子化回路５３を制御するステートマシンである。制御回路５６は、ＤＭＡＣ３のステートコントローラ３２の制御回路３４と同様の構成である。
【０１０９】
量子化演算回路５は、Ｂｄ個の要素を持つ量子化演算出力データを第一メモリ１に書き込む。なお、ＢｄとＢｃの好適な関係を式１０に示す。式１０においてｎは整数である。
【０１１０】
【数１０】
0006896306.tif 000011
【０１１１】
［コントローラ６］
コントローラ６は、外部ホストＣＰＵから転送される命令コマンドを、ＤＭＡＣ３、畳み込み演算回路４および量子化演算回路５が有する命令キューに転送する。コントローラ６は、各回路に対する命令コマンドを格納する命令メモリを有してもよい。
【０１１２】
コントローラ６は、外部バスＥＢに接続されており、外部ホストＣＰＵのスレーブとして動作する。コントローラ６は、パラメータレジスタや状態レジスタを含むレジスタ６１を有している。パラメータレジスタは、ＮＮ回路１００の動作を制御するレジスタである。状態レジスタは、セマフォＳを含むＮＮ回路１００の状態を示すレジスタである。
【０１１３】
［セマフォＳ］
図１８は、セマフォＳによるＮＮ回路１００の制御を説明する図である。
セマフォＳは、第一セマフォＳ１と、第二セマフォＳ２と、第三セマフォＳ３と、を有する。セマフォＳは、Ｐ操作によりデクリメントされ、Ｖ操作によってインクリメントされる。ＤＭＡＣ３、畳み込み演算回路４および量子化演算回路５によるＰ操作およびＶ操作は、内部バスＩＢを経由して、コントローラ６が有するセマフォＳを更新する。
【０１１４】
第一セマフォＳ１は、第一データフローＦ１の制御に用いられる。第一データフローＦ１は、ＤＭＡＣ３（Ｐｒｏｄｕｃｅｒ）が第一メモリ１に入力データａを書き込み、畳み込み演算回路４（Ｃｏｎｓｕｍｅｒ）が入力データａを読み出すデータフローである。第一セマフォＳ１は、第一ライトセマフォＳ１Ｗと、第一リードセマフォＳ１Ｒと、を有する。
【０１１５】
第二セマフォＳ２は、第二データフローＦ２の制御に用いられる。第二データフローＦ２は、畳み込み演算回路４（Ｐｒｏｄｕｃｅｒ）が出力データｆを第二メモリ２に書き込み、量子化演算回路５（Ｃｏｎｓｕｍｅｒ）が出力データｆを読み出すデータフローである。第二セマフォＳ２は、第二ライトセマフォＳ２Ｗと、第二リードセマフォＳ２Ｒと、を有する。
【０１１６】
第三セマフォＳ３は、第三データフローＦ３の制御に用いられる。第三データフローＦ３は、量子化演算回路５（Ｐｒｏｄｕｃｅｒ）が量子化演算出力データを第一メモリ１に書き込み、畳み込み演算回路４（Ｃｏｎｓｕｍｅｒ）が量子化演算回路５の量子化演算出力データを読み出すデータフローである。第三セマフォＳ３は、第三ライトセマフォＳ３Ｗと、第三リードセマフォＳ３Ｒと、を有する。
【０１１７】
［第一データフローＦ１］
図１９は、第一データフローＦ１のタイミングチャートである。
第一ライトセマフォＳ１Ｗは、第一データフローＦ１におけるＤＭＡＣ３による第一メモリ１に対する書き込みを制限するセマフォである。第一ライトセマフォＳ１Ｗは、第一メモリ１において、例えば入力ベクトルＡなどの所定のサイズのデータを格納可能なメモリ領域のうち、データが読み出し済みで他のデータを書き込み可能なメモリ領域の数を示している。第一ライトセマフォＳ１Ｗが「０」の場合、ＤＭＡＣ３は第一メモリ１に対して第一データフローＦ１における書き込みを行えず、第一ライトセマフォＳ１Ｗが「１」以上となるまで待たされる。
【０１１８】
第一リードセマフォＳ１Ｒは、第一データフローＦ１における畳み込み演算回路４による第一メモリ１からの読み出しを制限するセマフォである。第一リードセマフォＳ１Ｒは、第一メモリ１において、例えば入力ベクトルＡなどの所定のサイズのデータを格納可能なメモリ領域のうち、データが書き込み済みで読み出し可能なメモリ領域の数を示している。第一リードセマフォＳ１Ｒが「０」の場合、畳み込み演算回路４は第一メモリ１からの第一データフローＦ１における読み出しを行えず、第一リードセマフォＳ１Ｒが「１」以上となるまで待たされる。
【０１１９】
ＤＭＡＣ３は、命令キュー３３に命令コマンドＣ３が格納されることにより、ＤＭＡ転送を開始する。図１９に示すように、第一ライトセマフォＳ１Ｗが「０」でないため、ＤＭＡＣ３はＤＭＡ転送を開始する（ＤＭＡ転送１）。ＤＭＡＣ３は、ＤＭＡ転送を開始する際に、第一ライトセマフォＳ１Ｗに対してＰ操作を行う。ＤＭＡＣ３は、ＤＭＡ転送の完了後に、第一リードセマフォＳ１Ｒに対してＶ操作を行う。
【０１２０】
畳み込み演算回路４は、命令キュー４５に命令コマンドＣ４が格納されることにより、畳み込み演算を開始する。図１９に示すように、第一リードセマフォＳ１Ｒが「０」であるため、畳み込み演算回路４は第一リードセマフォＳ１Ｒが「１」以上となるまで待たされる（デコードステートＳ２におけるＷａｉｔ）。ＤＭＡＣ３によるＶ操作により第一リードセマフォＳ１Ｒが「１」となると、畳み込み演算回路４は畳み込み演算を開始する（畳み込み演算１）。畳み込み演算回路４は、畳み込み演算を開始する際、第一リードセマフォＳ１Ｒに対してＰ操作を行う。畳み込み演算回路４は、畳み込み演算の完了後に、第一ライトセマフォＳ１Ｗに対してＶ操作を行う。
【０１２１】
図１９において「ＤＭＡ転送３」と記載されたＤＭＡ転送をＤＭＡＣ３が開始する際、第一ライトセマフォＳ１Ｗが「０」であるため、ＤＭＡＣ３は第一ライトセマフォＳ１Ｗが「１」以上となるまで待たされる（デコードステートＳ２におけるＷａｉｔ）。畳み込み演算回路４によるＶ操作により第一ライトセマフォＳ１Ｗが「１」以上となると、ＤＭＡＣ３はＤＭＡ転送を開始する。
【０１２２】
ＤＭＡＣ３と畳み込み演算回路４とは、セマフォＳ１を使用することで、第一データフローＦ１において第一メモリ１に対するアクセス競合を防止できる。また、ＤＭＡＣ３と畳み込み演算回路４とは、セマフォＳ１を使用することで、第一データフローＦ１におけるデータ転送の同期を取りつつ、独立して並列に動作できる。
【０１２３】
［第二データフローＦ２］
図２０は、第二データフローＦ２のタイミングチャートである。
第二ライトセマフォＳ２Ｗは、第二データフローＦ２における畳み込み演算回路４による第二メモリ２に対する書き込みを制限するセマフォである。第二ライトセマフォＳ２Ｗは、第二メモリ２において、例えば出力データｆなどの所定のサイズのデータを格納可能なメモリ領域のうち、データが読み出し済みで他のデータを書き込み可能なメモリ領域の数を示している。第二ライトセマフォＳ２Ｗが「０」の場合、畳み込み演算回路４は第二メモリ２に対して第二データフローＦ２における書き込みを行えず、第二ライトセマフォＳ２Ｗが「１」以上となるまで待たされる。
【０１２４】
第二リードセマフォＳ２Ｒは、第二データフローＦ２における量子化演算回路５による第二メモリ２からの読み出しを制限するセマフォである。第二リードセマフォＳ２Ｒは、第二メモリ２において、例えば出力データｆなどの所定のサイズのデータを格納可能なメモリ領域のうち、データが書き込み済みで読み出し可能なメモリ領域の数を示している。第二リードセマフォＳ２Ｒが「０」の場合、量子化演算回路５は第二メモリ２からの第二データフローＦ２における読み出しを行えず、第一リードセマフォＳ１Ｒが「１」以上となるまで待たされる。
【０１２５】
畳み込み演算回路４は、図２０に示すように、畳み込み演算を開始する際、第二ライトセマフォＳ２Ｗに対してＰ操作を行う。畳み込み演算回路４は、畳み込み演算の完了後に、第二リードセマフォＳ２Ｒに対してＶ操作を行う。
【０１２６】
量子化演算回路５は、命令キュー５５に命令コマンドＣ５が格納されることにより、量子化演算を開始する。図２０に示すように、第二リードセマフォＳ２Ｒが「０」であるため、量子化演算回路５は第二リードセマフォＳ２Ｒが「１」以上となるまで待たされる（デコードステートＳ２におけるＷａｉｔ）。畳み込み演算回路４によるＶ操作により第二リードセマフォＳ２Ｒが「１」となると、量子化演算回路５は畳み込み演算を開始する（量子化演算１）。量子化演算回路５は、量子化演算を開始する際、第二リードセマフォＳ２Ｒに対してＰ操作を行う。量子化演算回路５は、量子化演算の完了後に、第二ライトセマフォＳ２Ｗに対してＶ操作を行う。
【０１２７】
図２０において「量子化演算２」と記載された量子化演算を量子化演算回路５が開始する際、第二リードセマフォＳ２Ｒが「０」であるため、量子化演算回路５は第二リードセマフォＳ２Ｒが「１」以上となるまで待たされる（デコードステートＳ２におけるＷａｉｔ）。畳み込み演算回路４によるＶ操作により第二リードセマフォＳ２Ｒが「１」以上となると、量子化演算回路５は量子化演算を開始する。
【０１２８】
畳み込み演算回路４と量子化演算回路５とは、セマフォＳ２を使用することで、第二データフローＦ２において第二メモリ２に対するアクセス競合を防止できる。また、畳み込み演算回路４と量子化演算回路５とは、セマフォＳ２を使用することで、第二データフローＦ２におけるデータ転送の同期を取りつつ、独立して並列に動作できる。
【０１２９】
［第三データフローＦ３］
第三ライトセマフォＳ３Ｗは、第三データフローＦ３における量子化演算回路５による第一メモリ１に対する書き込みを制限するセマフォである。第三ライトセマフォＳ３Ｗは、第一メモリ１において、例えば量子化演算回路５の量子化演算出力データなどの所定のサイズのデータを格納可能なメモリ領域のうち、データが読み出し済みで他のデータを書き込み可能なメモリ領域の数を示している。第三ライトセマフォＳ３Ｗが「０」の場合、量子化演算回路５は第一メモリ１に対して第三データフローＦ３における書き込みを行えず、第三ライトセマフォＳ３Ｗが「１」以上となるまで待たされる。
【０１３０】
第三リードセマフォＳ３Ｒは、第三データフローＦ３における畳み込み演算回路４による第一メモリ１からの読み出しを制限するセマフォである。第三リードセマフォＳ３Ｒは、第一メモリ１において、例えば量子化演算回路５の量子化演算出力データなどの所定のサイズのデータを格納可能なメモリ領域のうち、データが書き込み済みで読み出し可能なメモリ領域の数を示している。第三リードセマフォＳ１Ｒが「０」の場合、畳み込み演算回路４は第三データフローＦ３における第一メモリ１からの読み出しを行えず、第三リードセマフォＳ１Ｒが「１」以上となるまで待たされる。
【０１３１】
量子化演算回路５と畳み込み演算回路４とは、セマフォＳ３を使用することで、第三データフローＦ３において第一メモリ１に対するアクセス競合を防止できる。また、量子化演算回路５と畳み込み演算回路４とは、セマフォＳ３を使用することで、第三データフローＦ３におけるデータ転送の同期を取りつつ、独立して並列に動作できる。
【０１３２】
第一メモリ１は、第一データフローＦ１および第三データフローＦ３において共有される。ＮＮ回路１００は、第一セマフォＳ１と第三セマフォＳ３とを別途設けることで、第一データフローＦ１と第三データフローＦ３とを区別してデータ転送の同期を取ることができる。
【０１３３】
［畳み込み演算回路４の動作（１）］
畳み込み演算回路４は、畳み込み演算を行う際、第一メモリ１から読み出しを行い、第二メモリ２に対して書き込みを行う。すなわち、畳み込み演算回路４は、第一データフローＦ１においてはＣｏｎｓｕｍｅｒであり、第二データフローＦ２においてはＰｒｏｄｕｃｅｒである。そのため、畳み込み演算回路４は、畳み込み演算を開始する際、第一リードセマフォＳ１Ｒに対してＰ操作を行い（図１９参照）、第二ライトセマフォＳ２Ｗに対してＰ操作を行う（図２０参照）。畳み込み演算回路４は、畳み込み演算の完了後に、第一ライトセマフォＳ１Ｗに対してＶ操作を行い（図１９参照）、第二リードセマフォＳ２Ｒに対してＶ操作を行う（図２０参照）。
【０１３４】
畳み込み演算回路４は、畳み込み演算を開始する際、第一リードセマフォＳ１Ｒが「１」以上、かつ、第二ライトセマフォＳ２Ｗが「１」以上となるまで待たされる（デコードステートＳ２におけるＷａｉｔ）。
【０１３５】
［量子化演算回路５の動作］
量子化演算回路５は、量子化演算を行う際、第二メモリ２から読み出しを行い、第一メモリ１に対して書き込みを行う。すなわち、量子化演算回路５は、第二データフローＦ２においてはＣｏｎｓｕｍｅｒであり、第三データフローＦ３においてはＰｒｏｄｕｃｅｒである。そのため、量子化演算回路５は、量子化演算を開始する際、第二リードセマフォＳ２Ｒに対してＰ操作を行い、第三ライトセマフォＳ３Ｗに対してＰ操作を行う。量子化演算回路５は量子化演算の完了後に、第二ライトセマフォＳ２Ｗに対してＶ操作を行い、第三リードセマフォＳ３Ｒに対してＶ操作を行う。
【０１３６】
量子化演算回路５は、量子化演算を開始する際、第二リードセマフォＳ２Ｒが「１」以上、かつ、第三ライトセマフォＳ３Ｗが「１」以上となるまで待たされる（デコードステートＳ２におけるＷａｉｔ）。
【０１３７】
［畳み込み演算回路４の動作（２）］
畳み込み演算回路４が第一メモリ１から読み出す入力データは、第三データフローにおいて量子化演算回路５が書き込んだデータである場合もある。この場合、畳み込み演算回路４は、第三データフローＦ３においてはＣｏｎｓｕｍｅｒであり、第二データフローＦ２においてはＰｒｏｄｕｃｅｒである。そのため、畳み込み演算回路４は、畳み込み演算を開始する際、第三リードセマフォＳ３Ｒに対してＰ操作を行い、第二ライトセマフォＳ２Ｗに対してＰ操作を行う。畳み込み演算回路４は、畳み込み演算の完了後に、第三ライトセマフォＳ３Ｗに対してＶ操作を行い、第二リードセマフォＳ２Ｒに対してＶ操作を行う。
【０１３８】
畳み込み演算回路４は、畳み込み演算を開始する際、第三リードセマフォＳ３Ｒが「１」以上、かつ、第二ライトセマフォＳ２Ｗが「１」以上となるまで待たされる（デコードステートＳ２におけるＷａｉｔ）。
【０１３９】
以上説明したように、本実施形態に係るＮＮ回路１００によれば、畳み込み演算回路４と量子化演算回路５とがループ状に形成されており、畳み込み演算回路４と量子化演算回路５とが交互（図５）もしくは並列（図６）に、図１に示すＣＮＮ２００の演算を行う。そのため、ＮＮ回路１００は回路規模が小さく、ＩｏＴ機器などの組み込み機器に組み込み可能である。
【０１４０】
本実施形態に係るＮＮ回路１００によれば、畳み込み演算回路４への入力データは、量子化演算回路５によって量子化される。そのため、畳み込み演算回路４の演算量を削減でき、畳み込み演算回路４の回路規模を低減できる。
【０１４１】
本実施形態に係るＮＮ回路１００によれば、ＤＭＡＣ３と量子化演算回路５と畳み込み演算回路４とは、セマフォＳを使用することで、使用するデータフローにおけるデータ転送の同期を取りつつ、独立して並列に動作できる。また、本実施形態に係るＮＮ回路１００によれば、データフローごとにセマフォを設けることで、データフローを区別してデータ転送の同期を取ることができる。そのため、ＮＮ回路１００は、各回路が順次実行される場合と比較して、演算速度が速く高性能である。
【０１４２】
以上、本発明の第一実施形態について図面を参照して詳述したが、具体的な構成はこの実施形態に限られるものではなく、本発明の要旨を逸脱しない範囲の設計変更等も含まれる。また、上述の実施形態および変形例において示した構成要素は適宜に組み合わせて構成することが可能である。
【０１４３】
（変形例１）
上記実施形態において、第一メモリ１と第二メモリ２は別のメモリであったが、第一メモリ１と第二メモリ２の態様はこれに限定されない。第一メモリ１と第二メモリ２は、例えば、同一メモリにおける第一メモリ領域と第二メモリ領域であってもよい。
【０１４４】
（変形例２）
上記実施形態において、セマフォＳは第一データフローＦ１、第二データフローＦ２および第三データフローＦ３に対して設けられていたが、セマフォＳの態様はこれに限定されない。セマフォＳは、例えば、ＤＭＡＣ３が重みＷを重みメモリ４１に書き込み、乗算器４２が重みＷを読み出すデータフローに設けられていてもよい。セマフォＳは、例えば、ＤＭＡＣ３が量子化パラメータｑを量子化パラメータメモリ５１に書き込み、量子化回路５３が量子化パラメータｑを読み出すデータフローに設けられていてもよい。
【０１４５】
（変形例３）
例えば、上記実施形態に記載のＣＮＮ２００に入力されるデータは単一の形式に限定されず、静止画像、動画像、音声、文字、数値およびこれらの組み合わせで構成することが可能である。なお、ＣＮＮ２００に入力されるデータは、ＣＮＮ２００が設けられるエッジデバイスに搭載され得る、光センサ、温度計、Global Positioning System（GPS）計測器、角速度計測器、風速計などの物理量測定器における測定結果に限られない。周辺機器から有線または無線通信経由で受信する基地局情報、車両・船舶等の情報、天候情報、混雑状況に関する情報などの周辺情報や金融情報や個人情報等の異なる情報を組み合わせてもよい。
【０１４６】
（変形例４）
ＮＮ１００が設けられるエッジデバイスは、バッテリー等で駆動する携帯電話などの通信機器、パーソナルコンピュータなどのスマートデバイス、デジタルカメラ、ゲーム機器、ロボット製品などのモバイル機器を想定するが、これに限られるものではない。Power on Ethernet（PoE）などでの供給可能なピーク電力制限、製品発熱の低減または長時間駆動の要請が高い製品に利用することでも他の先行例にない効果を得ることができる。例えば、車両や船舶などに搭載される車載カメラや、公共施設や路上などに設けられる監視カメラ等に適用することで長時間の撮影を実現できるだけでなく、軽量化や高耐久化にも寄与する。また、テレビやディスプレイ等の表示デバイス、医療カメラや手術ロボット等の医療機器、製造現場や建築現場で使用される作業ロボットなどにも適用することで同様の効果を奏することができる。
【０１４７】
（変形例５）
ＮＮ回路１００は、ＮＮ回路１００の一部または全部を一つ以上のプロセッサを用いて実現してもよい。例えば、ＮＮ回路１００は、入力層または出力層の一部または全部をプロセッサによるソフトウェア処理により実現してもよい。ソフトウェア処理により実現する入力層または出力層の一部は、例えば、データの正規化や変換である。これにより、様々な形式の入力形式または出力形式に対応できる。なお、プロセッサで実行するソフトウェアは、通信手段や外部メディアを用いて書き換え可能に構成してもよい。
【０１４８】
（変形例６）
ＮＮ回路１００は、ＣＮＮ２００における処理の一部をクラウド上のGraphics Processing Unit（GPU）等を組み合わせることで実現してもよい。ＮＮ回路１００は、ＮＮ回路１００が設けられるエッジデバイスで行った処理に加えて、クラウド上でさらに処理を行ったり、クラウド上での処理に加えてエッジデバイス上で処理を行ったりすることで、より複雑な処理を少ないリソースで実現できる。このような構成によれば、ＮＮ回路１００は、処理分散によりエッジデバイスとクラウドとの間の通信量を低減できる。
【０１４９】
（変形例７）
ＮＮ回路１００が行う演算は、学習済みのＣＮＮ２００の少なくとも一部であったが、ＮＮ回路１００が行う演算の対象はこれに限定されない。ＮＮ回路１００が行う演算は、例えば畳み込み演算と量子化演算のように、２種類の演算を繰り返す学習済みのニューラルネットワークの少なくとも一部であってもよい。
【０１５０】
また、本明細書に記載された効果は、あくまで説明的または例示的なものであって限定的ではない。つまり、本開示に係る技術は、上記の効果とともに、または上記の効果に代えて、本明細書の記載から当業者には明らかな他の効果を奏しうる。
【産業上の利用可能性】
【０１５１】
本発明は、ニューラルネットワークの演算に適用することができる。
【符号の説明】
【０１５２】
２００  畳み込みニューラルネットワーク
１００  ニューラルネットワーク回路（ＮＮ回路）
１  第一メモリ
２  第二メモリ
３  ＤＭＡコントローラ（ＤＭＡＣ）
４  畳み込み演算回路
４２  乗算器
４３  アキュムレータ回路
５  量子化演算回路
５２  ベクトル演算回路
５３  量子化回路
６  コントローラ
６１  レジスタ
Ｓ  セマフォ
Ｆ１  第一データフロー
Ｆ２  第二データフロー
Ｆ３  第三データフロー
【要約】      （修正有）【課題】ＩｏＴ機器などの組み込み機器に組み込み可能かつ高性能なニューラルネットワーク回路を提供する。【解決手段】ニューラルネットワーク回路１００は、入力データを格納する第一メモリ１と、第一メモリに格納された入力データと重みとに対して畳み込み演算を行う畳み込み演算回路４と、畳み込み演算回路の畳み込み演算出力データを格納する第二メモリ２と、第二メモリに格納された畳み込み演算出力データに対して量子化演算を行う量子化演算回路５と、を備える。量子化演算回路の量子化演算出力データは、第一メモリに格納されて、第一メモリに格納された量子化演算出力データは、畳み込み演算回路に入力データとして入力される。【選択図】図４【図１】
0006896306.tif 000012
【図２】
0006896306.tif 000013
【図３】
0006896306.tif 000014
【図４】
0006896306.tif 000015
【図５】
0006896306.tif 000016
【図６】
0006896306.tif 000017
【図７】
0006896306.tif 000018
【図８】
0006896306.tif 000019
【図９】
0006896306.tif 000020
【図１０】
0006896306.tif 000021
【図１１】
0006896306.tif 000022
【図１２】
0006896306.tif 000023
【図１３】
0006896306.tif 000024
【図１４】
0006896306.tif 000025
【図１５】
0006896306.tif 000026
【図１６】
0006896306.tif 000027
【図１７】
0006896306.tif 000028
【図１８】
0006896306.tif 000029
【図１９】
0006896306.tif 000030
【図２０】
0006896306.tif 000031