以下,実施例を図面に基づいて説明する。なお,実施例を説明する全図において,同一の機能を有する部材には同一の符号を付し,その繰り返しの説明は特に必要な場合を除き省略する。
同一あるいは同様な機能を有する要素が複数ある場合には,同一の符号に異なる添字を付して説明する場合がある。ただし、複数の要素を区別する必要がない場合には,添字を省略して説明する場合がある。
本明細書等における「第1」、「第2」、「第3」などの表記は,構成要素を識別するために付するものであり,必ずしも,数,順序,もしくはその内容を限定するものではない。また,構成要素の識別のための番号は文脈毎に用いられ,一つの文脈で用いた番号が,他の文脈で必ずしも同一の構成を示すとは限らない。また、ある番号で識別された構成要素が,他の番号で識別された構成要素の機能を兼ねることを妨げるものではない。
図面等において示す各構成の位置,大きさ,形状,範囲などは,発明の理解を容易にするため,実際の位置,大きさ、形状、範囲などを表していない場合がある。このため,本発明は,必ずしも,図面等に開示された位置,大きさ,形状,範囲などに限定されない。
以下の実施例の概要の一例を挙げるならば,畳込み層のあとにプーリング層を持つ畳込みニューラルネットワークであり,畳込み層の行列を前半部分と後半部分に分割して保持してある。行列の前半部分は行列の主要項を多く含むようにし,行列の後半部分は行列の誤差項を多く含むようにする。このために行列を特異値分解し,しきい値となる特異値より大きい(あるいは以上の)特異値に対応する行列成分を前半部分に割り当て,しきい値より小さい(あるいは以下の)特異値に対応する行列成分を後半部分に割り当てる。この畳込みニューラルネットワークの畳込み演算は,行列前半部分に対応する畳込み演算と行列後半部分に対応する畳込み演算の2つに分割される。行列前半部分の畳込み演算は,プーリング演算でどのデータをサンプリングするかの予測に用いられる。予測されたデータ領域のみに大して後半部分の畳込み演算を実行し,前半部分の畳込み演算結果に加算することで演算精度を確保する。
図1に,本実施例における畳込みニューラルネットワークの構成の全体像を示す。入力データである画像データ(入力層)100に対して第1の畳込み演算conv1 200を適用することで中間層101を得る。中間層101にプーリング演算pool1 201を適用することで中間層102を得る。中間層102に畳込み演算conv2 202を適用することで中間層103を得る。中間層103にプーリング演算pool2 203を適用することで中間層104を得る。
中間層104に全結合演算ip1 204を適用することで中間層105を得る。中間層105に活性化演算relu1 205を適用することで中間層106を得る。中間層106に全結合演算ip2 202を適用することで中間層107を得る。中間層107の出力に基づいて,例えば画像の認識結果Mを得ることができる。
本実施例では,画像データ(入力層)100に畳込み演算conv1 200とプーリング演算pool1 201を適用し中間層102を適用する部分108を,従来と一部変更する。わかりやすさのために,従来の一般的構成及び本実施例の畳込みニューラルネットワークのconv1とpool1の組合せ108を対比して説明する。本実施例で行う演算は,従来の演算の近似演算であるため,従来と同等の演算結果を出力することを目標として構成される。
まずは従来の畳込みニューラルネットワークにおけるconv1とpool1の組合せ108aについて説明する。従来の畳込みニューラルネットワークでは,まず畳込み演算conv1 200aの演算を行い,つぎにプーリング演算pool1 201aを行う。従来の畳込み演算conv1 200aでは,画像データ(入力層)100の一部のベクトルデータ110に行列ベクトル積を適用することで,中間層101aの一部のベクトルデータ111aを生成する。従来のプーリング演算201aでは,中間層101aの一部のベクトルデータ112aからそれぞれ最大値をサンプリングし,次の中間層102のベクトルデータ113とする。
図2は、図1の畳込みニューラルネットワークのうち,畳込み演算conv1とプーリング演算pool1の組合せ108bの詳細を説明する概念図である。図1と図2の双方に本実施例の畳込みニューラルネットワークのconv1とpool1の組合せ108bを示している。
図1と図2を参照して,本実施例の畳込み演算conv1とプーリング演算pool1の組合せ108bについて説明する。本実施例では,畳込み演算conv1は,前半部分200b-1と後半部分200b-2の2つに分割される。まず前半部分の畳込み演算conv1 200b-1を行い,つぎにプーリング演算pool1 201bを行い,最後に後半部分の畳込み演算conv1 200b-2を行う。
本実施例の前半部分の畳込み演算conv1 200b-1では,画像データ100の一部のベクトルデータ110に前半の行列ベクトル積を適用することで,中間層101bの一部のベクトルデータ111bを生成する。前半部分の畳込み演算conv1 200b-1は,いわば行列の主要項のみを演算しており,このあとに続く本実施例のプーリング演算pool1 201bで最大値を正しく検出できる程度の精度を確保できればよい。
図2の符号を参照して説明すると,本実施例のプーリング演算pool1 201bでは,中間層101bの一部のベクトルデータ112bからそれぞれ最大値をサンプリングし,次の中間層102b-1のベクトルデータ113b-1とする。このとき,本実施例のプーリング演算pool1 201bでは,ベクトルデータ112b内部の複数(例えば4つ)のベクトルデータ111bのなかでどのベクトルデータ111bの値が最もサンプリングされたかを集計し,そのサンプリングされた数が最も多いベクトルデータ111bに対応する画像データ(入力層)100のベクトルデータ110を検出する。
本実施例のプーリング演算pool1 201bで検出された入力層100のベクトルデータ110に対して本実施例の後半部分の畳込み演算conv1 200b-2を適用し,演算の結果得られたベクトルデータ113b-2を中間層102b-1のベクトルデータ113b-1に加算する。この後半部分の畳込み演算conv1 200b-1は,前半部分の畳込み演算conv1 200b-1で不足していた演算精度を補うことを目的としている。
図3は,本実施例の画像認識装置の畳込み演算conv1 108bの行列ベクトル積で用いられる行列データを概念的に示す図である。まず,従来の畳込み演算conv1 108aの行列ベクトル積で用いられる行列データA 131を,n行m列の短形行列であるとする。本実施例では畳込み演算conv1 200bを2分割するため,行列データも2分割する。その基準となるのが,行列データA 131の特異値である。
本実施例では,この行列データA 131を特異値分解により数学的に等価な3つの行列の積に分解する。特異値分解自体は,数学的に知られた手法である。3つの行列とはすなわち,n行n列の左直交行列U 132と,n行n列の対角行列S 133と,n行m列の右直交行列VT 134である。対角行列行列S 133の対角成分には,行列A 131の特異値が降順に並ぶ。そこで,特異値の大きさに基準値を設け,基準値を基準に行列を分割する。たとえば,その基準値よりも大きい特異値に対応した行列を前半部分とし,その基準値以下の特異値に対応した行列が後半部分とする。
本実施例では基準値をk番目の特異値skとする。したがって大きい順にk個の特異値を並べた特異値行列をk行k列の前半部分の対角行列Sk 137とし,残りの特異値を並べた特異値行列を(n-k)行(n-k)列の後半部分の対角行列S(n-k)138とする。左直交行列U 132および右直交行列VT 134も,特異値を基準に前後半に分割する。
前半部分の対角行列Sk 137に対応した前半k列のn行k列の部分行列Uk 135を左直交行列U 132の前半部分とし,それ以外の後半(n-k)列のn行(n-k)列の部分行列U(n-k)136を左直交行列U 132の後半部分とする。同様に,前半部分の対角行列Sk 137に対応した前半k行のk行m列の部分行列VkT 139を右直交行列VT 134の前半部分とし,それ以外の後半(n-k)行の(n-k)行m列の部分行列V(n-k)T140を右直交行列VT 134の後半部分とする。左直交行列の前半部分Uk 135と対角行列の前半部分Sk 137と右直交行列の前半部分VkT 139の積である(UkSkVkT) 141を前半部分の畳込み演算conv1 200b-1で用いる行列データとし,左直交行列の後半部分U(n-k) 136と対角行列の後半部分S(n-k) 138と右直交行列の後半部分V(n-k)T 140の積である(U(n-k)S(n-k)V(n-k)T) 142を後半部分の畳込み演算conv1 200b-2で用いる行列データとする。当然ながら,行列の前半部分(UkSkVkT) 141と(U(n-k)S(n-k)V(n-k)T) 142の和は,行列A 131に等しい。
本実施例では,まず前半部分の行列に対して畳込み演算を行い,最大値を求める。次に,後半部分の行列のうち,最大値を出力する限定された領域に対して,畳込み演算を行う。そして,前半部分の演算結果に,後半部分の演算結果を加算する。数理的には,前半部分の大きな特異値に対応する部分が,その行列の主要項であり,後半部分の小さい特異値に対応する部分が,その行列の誤差項となる。このため,最大値の判定には主要項だけを用いて演算結果を用いている。
前半部分と後半部分をどこで切り分けるかは,用途や要求精度によって決めればよいが,基本的には,精度と処理負荷(装置規模、消費電力、計算時間等)のトレードオフになる。すなわち,前半部分の割合を大きくすれば,精度が向上するが,処理負荷も増大する。前半部分の割合を小さくすれば,精度が低下するが,処理負荷も低下する。後の実施例6は,前半部分と後半部分の切断点の決定手法について説明するものである。
図4は,本実施例の畳込み演算conv1とプーリング演算pool1を演算する装置の装置構成を示すブロック図である。このような装置構成は,例えばプロセッサとメモリと入力装置と出力装置を備える,通常のコンピュータ(例えばサーバ)によって実現することができる。サーバで構成する場合には,各演算ユニット155,157,163等はメモリに格納されたソフトウエアをプロセッサが実行することにより構成される。また,データを格納する各バッファ154,156等は、メモリを利用して記憶される。画像データ等の処理対象となるデータは,入力装置から入力され,結果は出力装置により例えば画像出力装置にて表示される。以上の構成は,単体のコンピュータで構成してもよいし,あるいは,入力装置,出力装置,プロセッサ,メモリの任意の部分が,ネットワークで接続された他のコンピュータで構成されてもよい。
また,他の構成例としては,ソフトウエアで構成した機能と同等の機能は、FPGA(Field Programmable Gate Array)、ASIC(Application Specific Integrated Circuit)などのハードウエアでも実現できる。例えば,図4と等価な構成は,FPGAの論理ブロックをプログラムすることによって実現することができる。このようなFPGAは,畳込みニューラルネットワークの演算を行う専用の1チップのデバイスとして構成することもできる。この場合,FPGAは例えば上位コントローラである汎用のプロセッサに全体を制御され,処理すべきデータは必要に応じて上位コントローラから提供し,結果を上位コントローラに返すように構成することができる。あるいは、自分を制御するための簡単なコントローラを,自デバイス内に備えても良い。
図5は,図4の装置のうち演算ユニット部分の詳細を示したブロック図である。
まず図4について説明する。メモリロードユニット153は,畳込みニューラルネットワークの入力層100のデータを保存しているメモリ(図示せず)から,その一部のベクトルデータ110をロードしバッファA 154に保存するユニットである。
バッファA 154は4本の記憶領域を持ち,4種類のベクトルデータ110を保持する。これは本実施例のプーリング演算pool1 201aが4つのデータから1つの最大値を検出することに対応している。なお,この例では構成を簡単に説明するため,4つのバッファを用いているが、その数は任意であり,特に4個に限定するものではない。
メモリロードユニット153の処理が完了すると,つぎに行列前半部分の行列ベクトル積演算ユニット155が行列ベクトル積の演算を実行する。行列ベクトル積演算ユニット155は,行列保存領域150の中の前半部分の畳込み演算conv1のための行列保存領域151に保存されている前半部分の行列データ(UkSkVkT) 141と,バッファA 154に保存されているうち1本のベクトルデータ110を用いて行列ベクトル積を実行し,バッファB 156に演算結果を保存する。
ここでバッファB 156に保存された演算結果は中間層101bの一部のベクトルデータ111bである。行列ベクトル積演算ユニット155は,4つのベクトルデータ110に対して行列ベクトル積を演算し,4つのベクトルデータ111bを出力する。
プーリング演算実行ユニット157は,プーリング演算の最大値検出を実行するユニットである。詳細は次の図5で説明する。プーリング演算実行ユニット157は,セレクト信号線158を通じてセレクト信号を出力するほか,バッファC 160,バッファD 161と接続し演算結果を出力し保存する。
プーリング演算実行ユニット157の演算が終了すると,行列後半部分の行列ベクトル積演算ユニット159が行列ベクトル積の演算を実行する。後半部分の行列ベクトル積演算ユニット159は,行列保存領域150の中の後半部分の畳込み演算conv1のための行列保存領域152に保存されている後半部分の行列データ(U(n-k)S(n-k)V(n-k)T) 142と,バッファA 154に保存されている4本のベクトルデータ110の中からセレクト信号線158によって選択される1本のベクトルデータ110との行列ベクトル積を実行し,その演算結果をバッファE 162に保存する。
ベクトル和演算ユニット163はベクトルの和を演算するユニットである。詳細は次の図5で説明する。ベクトル和演算ユニット163の演算結果はバッファF 164に保存される。バッファF 164に保存された演算結果は中間層102の一部のベクトルデータ113であり,メモリストアユニット165によって畳込みニューラルネットワークの中間層102のデータを保持するメモリ(図示せず)にストアされる。
図5を用いてプーリング演算実行ユニット157とベクトル和演算ユニット163について説明する。プーリング演算実行ユニット157は最大値検出・最大点検出ユニット170とバッファG 171と最大点計数ユニット172と比較ユニット173によって構成される。
最大値検出・最大点検出ユニット170は,バッファB 156に保存されている4本のベクトルデータ111bの各要素を比較し,最大値からなる最大値ベクトルDをバッファD 161に保存する最大値サンプリングを行う。また最大値検出・最大点検出ユニット170は同時に,最大値となったベクトルデータがバッファB1〜B4のうち,それぞれどの番号のバッファから選択されたかを検出し,最大点ベクトルGとしてバッファG 171に保存する。
最大点計数ユニット172は最大点を最も多く出力したベクトルデータの番号を検出し,セレクト信号としてセレクト信号線158により出力する。セレクト信号線158は,行列ベクトル積演算ユニット(後半部分)159に入力されるベクトルデータを,バッファA1〜A4から選択する。最大点計数ユニット172の演算が終了すると,比較ユニット173が演算を開始する。
比較ユニット173はバッファGに保存されている最大点ベクトルGのデータとセレクト信号線158から出力される最大点データを比較し,一致する要素は「1」とし一致しない要素は「0」として,比較結果ベクトルCを生成しバッファC 160に保存する。この「0」「1」のデータは,バッファDに格納された最大値ベクトルDの各要素が,セレクト信号線158でバッファA1〜A4から選択されるバッファのベクトルデータに基づくものか,そうでないかを識別する。
比較ユニット173がバッファG 171に保存されている最大点ベクトルGのすべての要素に対して比較演算を終了し,比較結果ベクトルCとしてバッファC 160に演算結果を保存すると,プーリング演算実行ユニット157の演算は終了しベクトル和演算ユニット163の演算が開始する。
ベクトル和演算ユニットはバッファC 160,バッファD 161,そしてバッファE 162に保存されているベクトルデータを参照し要素ごとに演算を行い,演算結果をバッファF 164に保存する。もしバッファC 160に保存されたデータが「1」ならばバッファD 161とバッファE 162の和を演算しその結果をバッファF 164に保存する。もしバッファC 160に保存されたデータが「0」ならばバッファD 161のデータをバッファF 164に保存する。
図6は,図1に示した本実施例における画像認識の処理フローを示す図である。処理108bの演算は,図4および図5に示した構成により実行する。他の各演算は,従来と同様の処理で良く,それぞれ専用の演算ユニットで実行することができる。なお、畳込み演算やプール演算は,基本的に同様の行列演算なので,同じ演算ユニットを異なる層の演算で共通に使用することもできる。
ステップ300: 画像認識の処理フローを開始する。
ステップ301: 画像を畳込みニューラルネットワークの入力層100に入力する。
ステップ108b: 本実施例の畳込み演算conv1とプーリング演算pool1の組合せ108bにより,入力層100から中間層データ102を出力する。詳細は図7と図8で説明する。
ステップ202: 畳込み演算conv2により,中間層データ102から中間層データ103を出力する。
ステップ203: プーリング演算pool2により,中間層データ103から中間層データ104を出力する。
ステップ204: 全結合演算ip1により,中間層データ104から中間層データ105を出力する。
ステップ205: 活性化演算relu1により,中間層データ105から中間層データ106を出力する。
ステップ206: 全結合演算ip2により,中間層データ106から中間層データ107を出力する。
ステップ302: 中間層データ107の最大値を検出することで,画像の認識結果を出力する。
ステップ303: 画像認識の処理フローを終了する。
図7は本実施例における畳込み演算conv1とプーリング演算pool1の組合せ108bの処理フローを示す図である。
ステップ304: 畳込み演算conv1とプーリング演算pool1の組合せ108bの処理フローを開始する。
ステップ305: メモリロードユニット153が,この処理フローの下位の処理フローで用いられる次の4本の部分的なベクトルデータ110を入力層100から抜粋し用意する。
ステップ306: 畳込み演算conv1とプーリング演算pool1の組合せ108bの下位の処理フローである。詳細は図8で説明する。
ステップ307: 入力層100の全ての部分のベクトルデータ110を処理完了したならばステップ308に進み,そうでないならばステップ305に進む。
ステップ308: 畳込み演算conv1とプーリング演算pool1の組合せ108bの処理フローを終了する。
図8は本実施例における畳込み演算conv1とプーリング演算pool1の組合せ108bの下位の処理フロー306を示す図である。図2乃至図5を参照しつつ処理を説明する。
ステップ180: 畳込み演算conv1とプーリング演算pool1の組合せ108bの下位の処理フローを開始する。
ステップ181: iを1で初期化する。
ステップ182: メモリロードユニット153が,i本目のベクトルAi 110を,i本目のバッファAi 154にロードする。図4の例ではバッファAは4列あるため,処理182から185は4回繰り返し行われることになる。もっとも,先に述べたようにこの数は任意である。
ステップ183: 行列前半部分の行列ベクトル積演算ユニット155が,行列前半部分(UkSkVkT) 141とi本目のバッファAi 154に保存されているi本目のベクトルAi 110との行列ベクトル積の演算を実行し,演算結果としてベクトルBi 111bを得る。ベクトルBi 111bはi本目のバッファBi 156に保存される。
ステップ184: iを(i+1)で更新する。
ステップ185: iが4より大きければステップ186に進み,そうでなければステップ182に進む。以上の処理で,行列前半部分(UkSkVkT) 141を用いた演算結果が,バッファBi 156に格納される。
ステップ186: プーリング演算実行ユニット157が{1,2,3,4}の中から最大点を選びjとして保存する。同時に,比較結果ベクトルCをバッファC 160に保存し,最大値ベクトルDをバッファD 161に保存する。詳細は図9で説明する。
ステップ187: 行列後半部分の行列ベクトル積演算ユニット159が,行列後半部分(U(n-k)S(n-k)V(n-k)T) 142とバッファAj 154に保存されているj本目のベクトルAj 110との行列ベクトル積の演算を実行し,演算結果としてベクトルEを得る。ベクトルEはバッファE 162に保存される。本実施例では,行列後半部分を用いた演算は,バッファA 154に格納される4つのベクトルのうち,一つに対してだけ行えば良いので,演算量を低減することができる。
ステップ188: ベクトル和演算ユニット163が,バッファD 161の最大値ベクトルDとバッファE 162のベクトルEを部分的に加算し,演算結果としてベクトルFを得る。ベクトルF 113はバッファF 164に保存する。詳細は,図10で説明する。
ステップ189: メモリストアユニット165が,バッファF 164に保存されたベクトルF 113をメモリ(図示せず)にストアする。
ステップ190: 畳込み演算conv1とプーリング演算pool1の組合せ108bの下位の処理フローを終了する。
図9は本実施例におけるプーリング演算実行ユニット157が,{1,2,3,4}の中から最大点を選びjとして保存すると同時に,比較結果ベクトルCをバッファC 160に保存し最大値ベクトルDをバッファD 161に保存する処理フローを示す図である。
ステップ210: プーリング演算実行ユニット157が,{1,2,3,4}の中から最大点を選びjとして保存すると同時に,比較結果ベクトルCをバッファC 160に保存し最大値ベクトルDをバッファD 161に保存する処理フローを開始する。
ステップ211: スカラー値iを0で初期化し,ベクトル値countを{0,0,0,0}で初期化する。
ステップ212: 最大値検出・最大点検出ユニット170は,ベクトルB1[i],ベクトルB2[i],ベクトルB3[i],ベクトルB4[i]の最大点を検出する処理を実行し,その結果を最大点ベクトルG[i]とする。すなわち,最大点ベクトルG[i] ← maxarg(ベクトルB1[i],ベクトルB2[i],ベクトルB3[i],ベクトルB4[i])とする。
ステップ213: 最大点計数ユニット172は,選択された最大点をカウントする。すなわち,count[最大点ベクトルG[i]-1]←count[最大点ベクトルG[i]-1]とする。その後,最大点ベクトルG[i]をバッファG 171に保存する。
ステップ214: 最大値検出・最大点検出ユニット170は,ベクトルB1[i],ベクトルB2[i],ベクトルB3[i],ベクトルB4[i]の最大値を検出する処理を実行し,その結果を最大値ベクトルD[i]とする。すなわち,最大値ベクトルD[i] ← max(ベクトルB1[i],ベクトルB2[i],ベクトルB3[i],ベクトルB4[i])とする。その後,最大値ベクトルD[i]をバッファD 161に保存する。
ステップ215: iを(i+1)で更新する。
ステップ216: iがベクトルBの要素数より少なければステップ212へと進み,そうでないならステップ217へと進む。
ステップ217: 最大点計数ユニット172 は,(カウントされた最大点)+1をjとする。すなわち,j ←1+max(count[0], count[1], count[2], count[3])とする。
ステップ218: kを0で初期化する。
ステップ219: 比較ユニット173は,ベクトルF[k]と最大点jを比較する。等しければステップ220へと進み,等しくなければステップ221へと進む。
ステップ220: 比較結果ベクトルC[k]を「1」とし,バッファC 160に保存する。
ステップ221: 比較結果ベクトルC[k]を「0」とし,バッファC 160に保存する。
ステップ222: kを(k+1)で更新する。
ステップ223: kが比較結果ベクトルCの要素数より少なければステップ219へと進み,そうでないならステップ224へと進む。
ステップ224: プーリング演算実行ユニット157{1,2,3,4}の中から最大点を選びjとして保存すると同時に,比較結果ベクトルCをバッファC 160に保存し最大値ベクトルDをバッファD 161に保存する処理フローを終了する。
図10は,ベクトル和演算ユニット163が,バッファD 161の最大値ベクトルDとバッファE 162のベクトルEを部分的に加算し,演算結果としてベクトルFを得,またベクトルF 113はバッファF 164に保存する処理フローを示す図である。
ステップ230: ベクトル和演算ユニット163が,バッファD 161の最大値ベクトルDとバッファE 162のベクトルEを部分的に加算し,演算結果としてベクトルFを得,またベクトルF 113はバッファF 164に保存する処理フローを開始する。
ステップ231: iを0で初期化する。
ステップ232: 比較結果ベクトルC[i]が1と等しいか比較する。等しいならステップ233に進み,等しくないならステップ234に進む。
ステップ233: 最大値ベクトルD[i]とベクトルE[i]の和を取り,その演算結果をベクトルF[i]とする。
ステップ234: 最大値ベクトルD[i]をベクトルF[i]とする。
ステップ235: iを(i+1)で更新する。
ステップ236: iが最大値ベクトルDの要素数より少なければステップ232へと進み,そうでないならステップ237へと進む。
ステップ237: ベクトルF 113をバッファF 164に保存する。
ステップ238: ベクトル和演算ユニット163が,バッファD 161の最大値ベクトルDとバッファE 162のベクトルEを部分的に加算し,演算結果としてベクトルFを得,またベクトルF 113はバッファF 164に保存する処理フローを終了する。
図11は,本実施例における,本実施例の畳込み演算conv1とプーリング演算pool1を演算する装置のタイミングチャートを示す図である。本実施例の演算装置の各ユニットはそれぞれ独立しているため,それぞれの演算装置で必要とするデータが全て揃った段階で演算を開始することができる。本タイミングチャートでは,各ユニットの演算実行タイミングを示す。まずメモリロードユニット153は,4本のベクトルデータ110をバッファA 154にロードする。
演算240: メモリロードユニット153は,1本目のベクトルデータA-1 110をバッファA-1 154にロードする。
演算241: メモリロードユニット153は,2本目のベクトルデータA-2 110をバッファA-2 154にロードする。
演算242: メモリロードユニット153は,2本目のベクトルデータA-3 110をバッファA-3 154にロードする。
演算243: メモリロードユニット153は,2本目のベクトルデータA-4 110をバッファA-4 154にロードする。
演算244: 演算240が完了した段階で開始可能となる。前半部分の行列ベクトル積演算ユニット155が,1本目のベクトルデータA-1 110を用いて前半部分の行列ベクトル積を演算し,1つ目の演算結果であるベクトルデータB-1 111bをバッファB-1 156に保存する。
演算245: 演算241が完了した段階で開始可能となる。前半部分の行列ベクトル積演算ユニット155が,1本目のベクトルデータA-2 110を用いて行列ベクトル積を演算し,2つ目の演算結果であるベクトルデータB-2 111bをバッファB-2 156に保存する。
演算246: 演算242が完了した段階で開始可能となる。前半部分の行列ベクトル積演算ユニット155が,1本目のベクトルデータA-3 110を用いて行列ベクトル積を演算し,3つ目の演算結果であるベクトルデータB-3 111bをバッファB-3 156に保存する。
演算247: 演算243が完了した段階で開始可能となる。前半部分の行列ベクトル積演算ユニット155が,1本目のベクトルデータA-4 110を用いて行列ベクトル積を演算し,4つ目の演算結果であるベクトルデータB-4 111bをバッファB-4 156に保存する。
演算248: 演算244, 演算245,演算246,演算247が完了した段階で開始可能となる。プーリング演算実行ユニット157がバッファB 156に保存されているベクトルデータB 111bを用いて,セレクト信号線158,バッファC 160,およびバッファ161に演算結果を出力する。
演算249: 演算248が完了した時点で開始可能となる。後半部分の行列ベクトル積演算ユニット159が,選択されたベクトルデータA-j 110を用いて後半部分の行列ベクトル積を演算し,ベクトルデータをバッファE 162に保存する。後半部分の行列ベクトル積演算ユニットが実行すべき演算249が1回で済むことが演算量と消費電力の低減につながり,本実施例の効果となる。
演算250: 演算248と演算249が完了した時点で開始可能となる。ベクトル和演算ユニット163がバッファC 160,バッファD 161,バッファE 162に保存されているベクトルデータを用いて演算を実行し,得られたベクトルデータF 113をバッファF 164に保存する。
演算251: 演算250が完了した時点で開始可能となる。メモリストアユニット165がベクトルデータF 113をバッファF 164からメモリにストアする。
本実施例は,上記の実施例で説明した畳込みニューラルネットワークにおいて、行列の前半部分と後半部分の切断点の決定手法および,それを応用した画像認識処理装置の学習方法について説明する。
図13は,本実施例における,畳込みニューラルネットワークを用いた画像認識処理装置を構成するまでの処理を示す図である。図中実線は処理の流れを、点線はデータの流れを示す。画像認識処理装置の具体的な例としては,図4で説明した構成をとるものとする。
従来行われているように,画像認識などのための畳込みニューラルネットワークでは,行列演算のために用いる行列データを,目的に合わせて最適化する学習処理が行われる。そのため,まず訓練データ用の画像データセット600を用いて,畳込みニューラルネットワークの学習装置にて畳込みニューラルネットワークの学習アルゴリズムを稼働させる。これにより,畳込みニューラルネットワークの学習処理602を実行し,畳込みニューラルネットワークのネットワークパラメータ603を得る。
学習装置は,通常のサーバで良く,訓練データ用画像データセット600を画像認識処理装置で処理させて結果を得,所望の結果が得られるように行列データ603を調整する。そのため,メモリに格納されたプログラムをプロセッサが実行することで各種の処理を行う。また,各種データ600、601、603、605も,サーバの記憶装置に格納しておくことにする。処理の際には,サーバと画像認識処理装置を接続して,必要なデータを画像認識処理装置に提供して処理させる。
畳込みニューラルネットワークのネットワークパラメータ603を得たことで従来の画像認識装置は構成可能となるが,本実施例ではこの畳込みニューラルネットワークのネットワークパラメータ603に行列データの分割処理604による加工を行うことで,更に演算量と消費電力の低い画像認識装置を提供可能となる。即ち,行列データ603を準備した後,準備された行列を分割する。この処理604も,処理602と同じサーバで実行して良い。
行列データの分割処理604の処理内容については,図14と図15で説明する。畳込み行列データの分割処理604はテストデータ用の画像データセット601と畳込みニューラルネットワークのネットワークパラメータ603を用いて処理を行い,行列データが分解された畳込みニューラルネットワークのネットワークパラメータ605を得る。
得られたネットワークパラメータ605を画像認識装置に搭載する。具体的には,図4の行列保存領域150に,行列データの前半部分と後半部分に分けて格納する。画像認識装置がFPGAで構成されている場合には,論理回路をプログラムする。これにより,従来と比べて演算量と消費電力の低い画像認識装置を提供することが可能となる。
図14は,図13の処理の一部を詳細に説明する画像認識装置開発の処理フローを示す図である。
ステップ430: 画像認識装置開発(あるいは製造)の処理フローを開始する。
ステップ431: 畳込みニューラルネットワークの学習装置が,訓練データ用の画像データセット600を用いて畳込みニューラルネットワークのネットワークパラメータ603を得る。
ステップ432: 畳込みニューラルネットワークの後処理装置(ステップ431の学習装置と同じ装置でよい)が,畳込み演算conv1 200の行列データA 131を前半部分141と後半部分142に分割し,行列データが分解された畳込みニューラルネットワークのネットワークパラメータ605を得る。この処理内容については,図15で詳細に説明する。
ステップ433: 行列データが分解された畳込みニューラルネットワークのネットワークパラメータ605を搭載可能な,畳込み演算conv1とプーリング演算pool1の組合せを処理可能な演算装置を構成する。具体的には,画像認識装置に前半部分141と後半部分142に分割したデータを送信し,図4の行列保存領域150に,行列データの前半部分と後半部分に分けて格納する。画像認識装置がFPGAで構成されている場合には,論理回路をプログラムする。
ステップ434: ステップ433で構成した部分以外で画像認識装置に必要な部品を開発あるいは実装する。これは従来の画像認識装置と同様に実行する。
ステップ435: 画像認識装置開発の処理フローを終了する。
図15は,畳込みニューラルネットワークの後処理装置が,畳込み演算conv1の行列データAを前半部分と後半部分に分割し,行列データが分解された畳込みニューラルネットワークのネットワークパラメータを得るための処理フローを示す図である。
ステップ440: 畳込みニューラルネットワークの後処理装置が,畳込み演算conv1の行列データAを前半部分と後半部分に分割し,行列データが分解された畳込みニューラルネットワークのネットワークパラメータを得るための処理フローを開始する。
ステップ441: 畳込み演算conv1 200の行列ベクトル積で用いる行列データA 131を特異値分解することで,左直交行列U 132と対角行列S 133と右直交行列VT 134の組を得る。
ステップ442: 行列データの特異値の数をnとする。特異値の数は対角行列Sの非零対角要素の数である。
ステップ443: iを(n-1)で初期化する。
ステップ444: i番目までの特異値までに対応する部分行列(UiSiViT)を行列データの前半部分とし,それ以降の特異値に対応する部分行列(U(n-i)S(n-i)V(n-i)T)を行列データの後半部分とする。
ステップ445: ステップ444で得られた行列データの前半部分と後半部分を用いて本実施例の画像認識装置を試作し,テストデータ用の画像データセット601を用いて認識精度を取得する。
ステップ446: ステップ445で得られた認識精度が目標認識精度を満足できればステップ447に進み,満足できなければステップ448に進む。
ステップ447: iを(i-1)で更新する。
ステップ448: kを(i+1)とする。
ステップ449: k番目までの特異値までに対応する部分行列(UkSkVkT)を行列データの前半部分141とし,それ以降の特異値に対応する部分行列(U(n-k)S(n-k)V(n-k)T)を行列データの後半部分142とする。
ステップ450: (UkSkVkT)を前半部分の畳込み演算conv1 200b-1の行列データとし, (U(n-k)S(n-k)V(n-k)T)を後半部分の畳込み演算conv1 200b-2の行列データとする。
ステップ451: 畳込みニューラルネットワークの後処理装置が,畳込み演算conv1の行列データAを前半部分と後半部分に分割し,行列データが分解された畳込みニューラルネットワークのネットワークパラメータを得るための処理フローを開始する。
なお,実施例6では,従来どおりに行列データを学習してから前半と後半に分割する例を示したが,前半と後半に分割してから学習をおこなってもよい。あるいは,実施例6同様に,行列データを学習してから前半と後半に分割し,さらに再学習をおこなってもよい。
以上説明したように本実施例では,畳込みニューラルネットワークの畳込み演算に用いられる行列ベクトル積を前半部分と後半部分に分割する。前半部分はプーリング層のサンプリングの予測に用い,後半部分は予測結果の演算精度の回復に用いる。前半部分は行列の主要項を多く含むようにし,後半部分は行列の誤差項を多く含むようにする。このために,行列を特異値分解し,ある特異値をしきい値とし,しきい値より大きい特異値に対応する行列成分を前半部分に割り当て,しきい値より小さい特異値に対応する行列を後半部分に割り当てる。これにより,畳込みニューラルネットワークの畳込み演算の消費電力と演算量を削減する。
本発明は上記した実施形態に限定されるものではなく、様々な変形例が含まれる。例えば、ある実施例の構成の一部を他の実施例の構成に置き換えることが可能であり、また、ある実施例の構成に他の実施例の構成を加えることが可能である。また、各実施例の構成の一部について、他の実施例の構成の追加・削除・置換をすることが可能である。