(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2021-12-27
(45)【発行日】2022-01-19
(54)【発明の名称】二値化ニューラルネットワーク用プロセッサ、データ処理方法、および、プログラム
(51)【国際特許分類】
G06N 3/06 20060101AFI20220112BHJP
【FI】
G06N3/06
(21)【出願番号】P 2017092381
(22)【出願日】2017-05-08
【審査請求日】2020-04-17
(73)【特許権者】
【識別番号】304030497
【氏名又は名称】株式会社プロアシスト
(73)【特許権者】
【識別番号】591128453
【氏名又は名称】株式会社メガチップス
(73)【特許権者】
【識別番号】500433225
【氏名又は名称】学校法人中部大学
(74)【代理人】
【識別番号】100143498
【氏名又は名称】中西 健
(74)【代理人】
【識別番号】100125704
【氏名又は名称】坂根 剛
(72)【発明者】
【氏名】松谷 隆司
(72)【発明者】
【氏名】田中 基康
(72)【発明者】
【氏名】猪熊 一行
(72)【発明者】
【氏名】藤吉 弘亘
【審査官】多胡 滋
(56)【参考文献】
【文献】特開2014-112358(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06N 3/00
(57)【特許請求の範囲】
【請求項1】
実数ベクトルデータであるスケーリング係数ベクトルを設定するスケーリング係数ベクトル設定部と、
「1」または「-1」をとる2値データを要素とする二値基底行列を設定する二値基底行列設定部と、
重み演算処理の対象となるデータを決定するための入力値ビット幅と同一桁処理ビット長を設定する処理データサイズ設定部と、
前記入力値ビット幅および前記同一桁処理ビット長に基づいて決定される重み演算処理の対象データを用いて、前記二値基底行列に基づく処理を実行することで、二値基底行列処理結果データを取得し、取得した前記二値基底行列処理結果データと、前記スケーリング係数ベクトルとを用いた乗算処理を実行することで、乗算結果データを取得する重み演算処理部と、
を備える、
二値化ニューラルネットワーク用プロセッサ。
【請求項2】
前記重み演算処理部は、
前記入力値ビット幅および前記同一桁処理ビット長に基づいて、重み演算処理の対象データを決定し、入力データの同一桁を抽出することで縦ビットデータDi[1:m](i:自然数、入力データのビットの桁を表す番号、m:自然数)を取得する入力変換部と、
(1)前記縦ビットデータDi[1:m]と、前記二値基底行列の第j行のデータであるデータM
jとを用いて内積演算処理を実行することで、内積演算結果データを取得し、(2)取得した前記内積演算結果データを、前記縦ビットデータDi[1:m]が抽出された前記入力データの桁に応じてビットシフト量により、ビットシフト演算処理を行うことで、ビットシフト演算結果データを取得し、(3)前記入力データの桁ごとに取得した前記ビットシフト演算結果データを加算することで、前記入力データと前記データM
jとの内積データを取得する内積演算部と、
前記内積データと前記スケーリング係数とを乗算することで、第j行乗算結果データを取得する乗算部と、
を備える請求項1に記載の二値化ニューラルネットワーク用プロセッサ。
【請求項3】
前記内積演算部は、
k個(k:自然数、1≦k≦n)のビットカウンタである第1ビットカウンタ~第kビットカウンタと、
フレキシブル多項加算部と、
を備え、
前記第kビットカウンタは、
前記縦ビットデータDi[1:m]から一部のビットデータを抽出した第1縦ビットデータと、前記データM
jのデータのうち前記第1縦ビットデータのビット数と同一のビット数のデータを抽出した第1マトリックスデータM
j’との各ビットが両方とも「1」であるときのみ「1」を出力するAND処理を実行するAND処理部と、
前記AND処理の出力データに含まれる「1」の数をカウントし、第1カウント値として取得する第1正値並列一括ビットカウンタと、
前記第1カウント値を2倍にしたデータを第1データとして取得するビットシフト部と、
前記第1縦ビットデータに含まれる「1」の数をカウントし、第2カウント値として取得する第2正値並列一括ビットカウンタと、
前記第1データから前記第2カウント値を減算することで、カウンタ出力データCnt_bkを取得する減算部と、
を備え、
前記フレキシブル多項加算部は、
前記第1ビットカウンタ~第kビットカウンタにより取得されたカウンタ出力データCnt_b1~Cnt_bnを入力し、カウンタ出力データCnt_b1~Cnt_bnのぞれぞれに対して、前記入力値ビット幅および前記同一桁処理ビット長に基づいて設定されるシフト量によりシフト演算処理を実行し、データDo1~Do12を取得し、取得した前記データDo1~Do12を加算することで、多項加算結果データを取得する、
請求項2に記載の二値化ニューラルネットワーク用プロセッサ。
【請求項4】
前記内積演算部は、
前記多項加算結果データを複数保持することができ、複数保持した多項加算結果データを加算することで累算結果データを取得する累算部をさらに備える、
請求項3に記載の二値化ニューラルネットワーク用プロセッサ。
【請求項5】
前記二値化ニューラルネットワーク用プロセッサの各機能部を制御する制御部をさらに備え、
前記制御部は、
(1)前記スケーリング係数ベクトルを設定するデータを設定する命令である第1命令と、
(2)前記二値基底行列を設定する命令である第2命令と、
(3)
前記入力データの同一桁を抽出した2値データと二値基底行列との行列演算を実行する命令である第3命令と、
を入力することができる、
請求項
2から4のいずれかに記載の二値化ニューラルネットワーク用プロセッサ。
【請求項6】
前記制御部が前記第1命令を入力したとき、
前記制御部は、前記スケーリング係数ベクトル設定部において、前記第1命令に基づく前記スケーリング係数ベクトルが設定されるように、前記スケーリング係数ベクトル設定部を制御する、
請求項5に記載の二値化ニューラルネットワーク用プロセッサ。
【請求項7】
前記制御部が前記第2命令を入力したとき、
前記制御部は、前記二値基底行列設定部において、前記第2命令に基づく前記二値基底行列が設定されるように、前記二値基底行列設定部を制御する、
請求項5に記載の二値化ニューラルネットワーク用プロセッサ。
【請求項8】
前記制御部が前記第3命令を入力したとき、
前記制御部は、前記入力データの同一桁を抽出した2値データと二値基底行列との行列演算が実行されるように、前記重み演算処理部を制御する、
請求項5に記載の二値化ニューラルネットワーク用プロセッサ。
【請求項9】
二値化ニューラルネットワーク用プロセッサで実行されるデータ処理方法であって、
実数ベクトルデータであるスケーリング係数ベクトルを設定するスケーリング係数ベクトル設定ステップと、
「1」または「-1」をとる2値データを要素とする二値基底行列を設定する二値基底行列設定ステップと、
重み演算処理の対象となるデータを決定するための入力値ビット幅と同一桁処理ビット長を設定する処理データサイズ設定ステップと、
前記入力値ビット幅および前記同一桁処理ビット長に基づいて決定される重み演算処理の対象データを用いて、前記二値基底行列に基づく処理を実行することで、二値基底行列処理結果データを取得し、取得した前記二値基底行列処理結果データと、前記スケーリング係数ベクトルとを用いた乗算処理を実行することで、乗算結果データを取得する重み演算処理ステップと、
を備える、
データ処理方法。
【請求項10】
請求項9に記載のデータ処理方法をコンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、ニューラルネットワークの技術に関する。
【背景技術】
【0002】
近年、ニューラルネットワーク技術の1つである、CNN(Convolutional Neural Network)を用いた多様な技術が開発されている(例えば、特許文献1を参照)。CNNの中でも、中間層を多く設けたDCNN(Deep Convolutional Neural Network)を用いた技術が、多様な分野で成果を上げているため、特に注目を集めている。
【先行技術文献】
【特許文献】
【0003】
【発明の概要】
【発明が解決しようとする課題】
【0004】
DCNNは,一般物体認識やセマンティックセグメンテーション等の様々なタスクにおいて高い認識性能を実現している。その一方で、DCNNは、処理を実行するために必要な計算量とパラメータ数が非常に多いため、処理を実行するときに、膨大な処理時間と多大なメモリ量が必要となる。
【0005】
また、DCNNでは、層をより深くすることで認識精度が向上する傾向が見られ、これに伴い識別時間(処理時間)に加えモデルサイズも増加するという問題が発生する。組み込み機器やモバイル機器等の低スペックのデバイスでDCNNを使用するには、識別計算の高速化とモデルサイズの圧縮が大きな課題となる。
【0006】
つまり、組み込み機器やモバイル機器等の低スペックのデバイス(例えば、エッジ端末)において、大規模システムで学習し取得した学習済みモデルをそのまま搭載することは困難であり、低スペックのデバイスにおいて、コンパクト化したモデルを構築する必要がある。
【0007】
組み込み機器やモバイル機器等の低スペックのデバイス(例えば、エッジ端末)に、大規模システムで学習し取得した学習済みモデルを搭載するためには、低スペックのデバイスにおいて、当該学習済みモデルのコンパクト化したモデルを構築し、当該学習済みモデルに用いた学習用データを用いて、再度、コンパクト化したモデルにおいて、学習させる必要がある(この学習を「再学習」という)。
【0008】
つまり、組み込み機器やモバイル機器等の低スペックのデバイス(例えば、エッジ端末)で、大規模システムで学習し取得した学習済みモデルを搭載するためには、再学習が必要となるという課題がある。
【0009】
そこで、本発明は、上記課題に鑑み、再学習を必要とせず、組み込み機器やモバイル機器等の低スペックのデバイス(例えば、エッジ端末)において、高性能なコンパクト化したモデルを搭載することができる二値化ニューラルネットワーク用プロセッサ、データ処理方法、および、プログラムを実現することを目的とする。
【課題を解決するための手段】
【0010】
上記課題を解決するために、第1の発明は、スケーリング係数ベクトル設定部と、二値基底行列設定部と、処理データサイズ設定部と、重み演算処理部と、を備える二値化ニューラルネットワーク用プロセッサである。
【0011】
スケーリング係数ベクトル設定部は、実数ベクトルデータであるスケーリング係数ベクトルを設定する。
【0012】
二値基底行列設定部は、「1」または「-1」をとる2値データを要素とする二値基底行列を設定する。
【0013】
処理データサイズ設定部は、重み演算処理の対象となるデータを決定するための入力値ビット幅と同一桁処理ビット長を設定する。
【0014】
重み演算処理部は、入力値ビット幅および同一桁処理ビット長に基づいて決定される重み演算処理の対象データを用いて、二値基底行列に基づく処理を実行することで、二値基底行列処理結果データを取得し、取得した二値基底行列処理結果データと、スケーリング係数ベクトルとを用いた乗算処理を実行することで、乗算結果データを取得する。
【0015】
これにより、この二値化ニューラルネットワーク用プロセッサでは、入力値ビット幅および同一桁処理ビット長に基づいて、重み演算処理の対象データを柔軟に設定することができる。そして、この二値化ニューラルネットワーク用プロセッサでは、設定(決定)した重み演算処理の対象データを用いて、重み演算処理の大部分を二値基底行列を用いたビット演算処理にし、ごく少数の実数演算(スケーリング係数ベクトルを用いた乗算処理)を行うことで、重み演算処理を実行することができる。したがって、この二値化ニューラルネットワーク用プロセッサでは、入力データのビット長に依存せず、柔軟に重み演算処理の対象データを設定することができるともに、ハードウェア規模の増大を抑えつつ、高精度な重み演算処理を実行することできる。その結果、この二値化ニューラルネットワーク用プロセッサでは、再学習を必要とせず、コンパクト化したモデル(大規模システムで学習し取得した学習済みモデルの近似モデル)に相当する重み演算処理を実行することができる。
【0016】
したがって、この二値化ニューラルネットワーク用プロセッサでは、再学習を必要とせず、組み込み機器やモバイル機器等の低スペックのデバイス(例えば、エッジ端末)において、高性能なコンパクト化したモデルを搭載することができる。
【0017】
第2の発明は、第1の発明であって、重み演算処理部は、入力変換部と、内積演算部と、乗算部と、を備える。
【0018】
入力変換部は、入力値ビット幅および同一桁処理ビット長に基づいて、重み演算処理の対象データを決定し、入力データの同一桁を抽出することで縦ビットデータDi[1:m](i:自然数、入力データのビットの桁を表す番号、m:自然数)を取得する。
【0019】
内積演算部は、(1)縦ビットデータDi[1:m]と、二値基底行列の第j行のデータであるデータMjとを用いて内積演算処理を実行することで、内積演算結果データを取得し、(2)取得した内積演算結果データを、縦ビットデータDi[1:m]が抽出された入力データの桁に応じてビットシフト量により、ビットシフト演算処理を行うことで、ビットシフト演算結果データを取得し、(3)入力データの桁ごとに取得したビットシフト演算結果データを加算することで、入力データとデータMjとの内積データを取得する。
【0020】
乗算部は、内積データとスケーリング係数とを乗算することで、第j行乗算結果データを取得する。
【0021】
これにより、この二値化ニューラルネットワーク用プロセッサでは、入力データ(例えば、v_x)の同一桁ビットをひとまとめにして、二値基底行列Mの第k行とのビット演算処理を行うため、v_xの要素であるデータxiのビット長に関係なく、内積演算部で同一の処理により、内積演算結果データ(例えば、D210=M1・v_x)を取得することができる。
【0022】
このように、この二値化ニューラルネットワーク用プロセッサでは、入力データ(v_x)のビット長に依存しないアーキテクチャにより、重み演算処理を実行することができる。
【0023】
さらに、二値化ニューラルネットワーク用プロセッサでは、乗算部により、実数であるスケーリング係数と内積演算結果データ(例えば、D210=M1・v_x)との乗算処理により、乗算結果データ(例えば、D21=c1×M1・v_x)を取得する。つまり、この二値化ニューラルネットワーク用プロセッサでは、重み演算処理のビット精度がどのようなものであっても、一定の誤差範囲に収まるように、実数であるスケーリング係数を調整することで、大規模システムで学習し取得した学習済みモデルのパラメータ(重み付けデータ)を用いたモデルに相当する重み演算処理を実現することができる。
【0024】
その結果、この二値化ニューラルネットワーク用プロセッサでは、再学習を必要とせず、コンパクト化したモデル(大規模システムで学習し取得した学習済みモデルの近似モデル)に相当する重み演算処理を実行することができる。
【0025】
第3の発明は、第2の発明であって、内積演算部は、第1ビットカウンタ~第kビットカウンタと、フレキシブル多項加算部と、AND処理部と、第1正値並列一括ビットカウンタと、ビットシフト部と、第2正値並列一括ビットカウンタと、減算部と、を備える。
【0026】
第kビットカウンタは、AND処理部と、第1正値並列一括ビットカウンタと、ビットシフト部と、第2正値並列一括ビットカウンタと、減算部とを備える。
【0027】
AND処理部は、縦ビットデータDi[1:m]から一部のビットデータを抽出した第1縦ビットデータと、データMjのデータのうち第1ビットデータのビット数と同一のビット数のデータを抽出した第1マトリックスデータMj’との各ビットが両方とも「1」であるときのみ「1」を出力するAND処理を実行する。
【0028】
第1正値並列一括ビットカウンタは、AND処理の出力データに含まれる「1」の数をカウントし、第1カウント値として取得する。
【0029】
ビットシフト部は、第1カウント値を2倍にしたデータを第1データとして取得する。
【0030】
第2正値並列一括ビットカウンタは、第1縦ビットデータに含まれる「1」の数をカウントし、第2カウント値として取得する。
【0031】
減算部は、第1データから第2カウント値を減算することで、カウンタ出力データCnt_bkを取得する。
【0032】
フレキシブル多項加算部は、第1ビットカウンタ~第kビットカウンタにより取得されたカウンタ出力データCnt_b1~Cnt_bnを入力し、カウンタ出力データCnt_b1~Cnt_bnのぞれぞれに対して、入力値ビット幅および同一桁処理ビット長に基づいて設定されるシフト量によりシフト演算処理を実行し、データDo1~Do12を取得し、取得したデータDo1~Do12を加算することで、多項加算結果データを取得する。
【0033】
これにより、この二値化ニューラルネットワーク用プロセッサでは、「-1」の乗算を実行せずにカウント処理を実行することができるので、ハードウェア規模を効果的に削減することができる。
【0034】
また、この二値化ニューラルネットワーク用プロセッサでは、フレキシブル多項加算部により入力値ビット幅および同一桁処理ビット長に基づいてシフト量(ビットシフト量)を調整することで、入力データ(v_x)のビット長に依存しないデータ処理を実行することができる。つまり、この二値化ニューラルネットワーク用プロセッサでは、入力データ(v_x)のビット長に依存しないアーキテクチャにより、重み演算処理を実行することができる。
【0035】
第4の発明は、第3の発明であって、内積演算部は、多項加算結果データを複数保持することができ、複数保持した多項加算結果データを加算することで累算結果データを取得する累算部をさらに備える。
【0036】
これにより、この二値化ニューラルネットワーク用プロセッサでは、累算部により、乗算部の乗算処理が終了することを待つことなく、連続して、累算処理を実行することができるので、パイプライン処理と同様に、重み演算処理全体の処理速度を向上させることができる。
【0037】
第5の発明は、第1から第4のいずれかの発明であって、二値化ニューラルネットワーク用プロセッサの各機能部を制御する制御部をさらに備える。
【0038】
制御部は、
(1)スケーリング係数ベクトルを設定するデータを設定する命令である第1命令と、
(2)二値基底行列を設定する命令である第2命令と、
(3)入力データの同一桁を抽出した2値データと二値基底行列との行列演算を実行する命令である第3命令と、を入力することができる(受け付けることができる)。
【0039】
これにより、上記命令セットに対応した二値化ニューラルネットワーク用プロセッサを実現することができる。
【0040】
第6の発明は、第5の発明であって、制御部が第1命令を入力したとき、制御部は、スケーリング係数ベクトル設定部において、第1命令に基づくスケーリング係数ベクトルが設定されるように、スケーリング係数ベクトル設定部を制御する。
【0041】
これにより、この二値化ニューラルネットワーク用プロセッサでは、第1命令を受け付けたとき、第1命令に従った上記処理を実行することができる。
【0042】
第7の発明は、第5の発明であって、制御部が第2命令を入力したとき、制御部は、二値基底行列設定部において、第2命令に基づく二値基底行列が設定されるように、二値基底行列設定部を制御する。
【0043】
これにより、この二値化ニューラルネットワーク用プロセッサでは、第2命令を受け付けたとき、第2命令に従った上記処理を実行することができる。
【0044】
第8の発明は、第5の発明であって、制御部が第3命令を入力したとき、制御部は、入力データの同一桁を抽出した2値データと二値基底行列との行列演算が実行されるように、重み演算処理部を制御する。
【0045】
これにより、この二値化ニューラルネットワーク用プロセッサでは、第3命令を受け付けたとき、第3命令に従った上記処理を実行することができる。
【0046】
第9の発明は、二値化ニューラルネットワーク用プロセッサで実行されるデータ処理方法であって、スケーリング係数ベクトル設定ステップと、二値基底行列設定ステップと、処理データサイズ設定ステップと、重み演算処理ステップと、を備える。
【0047】
スケーリング係数ベクトル設定ステップは、実数ベクトルデータであるスケーリング係数ベクトルを設定する。
【0048】
二値基底行列設定ステップは、「1」または「-1」をとる2値データを要素とする二値基底行列を設定する。
【0049】
処理データサイズ設定ステップは、重み演算処理の対象となるデータを決定するための入力値ビット幅と同一桁処理ビット長を設定する。
【0050】
重み演算処理ステップは、入力値ビット幅および同一桁処理ビット長に基づいて決定される重み演算処理の対象データを用いて、二値基底行列に基づく処理を実行することで、二値基底行列処理結果データを取得し、取得した二値基底行列処理結果データと、スケーリング係数ベクトルとを用いた乗算処理を実行することで、乗算結果データを取得する。
【0051】
これにより、第1の発明と同様の効果を奏するデータ処理方法を実現することができる。
【0052】
第10の発明は、第9の発明であるデータ処理方法をコンピュータに実行させるためのプログラムである。
【0053】
これにより、第1の発明と同様の効果を奏するデータ処理方法をコンピュータに実行させるためのプログラム実現することができる。
【発明の効果】
【0054】
本発明によれば、再学習を必要とせず、組み込み機器やモバイル機器等の低スペックのデバイス(例えば、エッジ端末)において、高性能なコンパクト化したモデルを搭載することができる二値化ニューラルネットワーク用プロセッサ、データ処理方法、および、プログラムを実現することができる。
【図面の簡単な説明】
【0055】
【
図1】第1実施形態に係る二値化ニューラルネットワーク用プロセッサ1000の概略構成図。
【
図2】第1実施形態に係る第1重み演算部21の概略構成図。
【
図3】第1実施形態に係る第k重み演算部2k1の概略構成図。
【
図4】第1実施形態に係る内積演算部211の概略構成図。
【
図5】第1実施形態に係る第1ビットカウンタBc1の概略構成図。
【
図6】第1実施形態に係るフレキシブル多項加算部2112の概略構成図。
【
図7】CNNの重み演算処理を、マトリックスで表現した図(上図)と、二値化ニューラルネットワークの重み演算処理を、マトリックスで表現した図(下図)とを示す図。
【
図8】スケーリング係数ベクトルv_c(=[c1,c2,・・・,c6])、および、二値基底行列Mの設定処理を説明するための図。
【
図9】データDin(=v_x)と行列Mの一部とを示した図。
【
図10】データDin(=v_x)と行列Mの一部とを示した図。
【
図11】データDin(=v_x)と行列Mの一部とを示した図。
【
図12】m=24の場合のデータDin(=v_x)と行列Mの一部(第1行のデータ)とを示した図。
【
図13】処理対象データと、フレキシブル多項加算部2112でのシフト、加算処理とを説明するための図。
【発明を実施するための形態】
【0056】
[第1実施形態]
第1実施形態について、図面を参照しながら、以下、説明する。
【0057】
<1.1:二値化ニューラルネットワーク用プロセッサの構成>
図1は、第1実施形態に係る二値化ニューラルネットワーク用プロセッサ1000の概略構成図である。
【0058】
図2は、第1実施形態に係る第1重み演算部21の概略構成図である。
【0059】
図3は、第1実施形態に係る第k重み演算部2k1の概略構成図である。
【0060】
図4は、第1実施形態に係る内積演算部211の概略構成図である。
【0061】
図5は、第1実施形態に係る第1ビットカウンタBc1の概略構成図である。
【0062】
図6は、第1実施形態に係るフレキシブル多項加算部2112の概略構成図である。
【0063】
二値化ニューラルネットワーク用プロセッサ1000は、
図1に示すように、重み演算処理部100と、制御部C1と、スケーリング係数ベクトル設定部ST1と、二値基底行列設定部ST2と、処理データサイズ設定部ST3とを備える。
【0064】
重み演算処理部100は、
図1に示すように、入力変換部1と、重み演算部2と、加算部3とを備える。
【0065】
入力変換部1は、入力データDin(=v_x(=[x1,x2,・・・,xm]))と、処理データサイズ設定部ST3から出力される入力値ビット幅bit_widthと、処理データサイズ設定部ST3から出力される同一桁処理ビット長bit_lenと、を入力する。入力変換部1は、入力値ビット幅bit_widthと同一桁処理ビット長bit_lenとに基づいて、入力データDinを、重み演算部2で処理するデータ形式のデータに変換する。そして、入力変換部1は、変換後のデータをデータDi[1:m]として、重み演算部2に出力する。
【0066】
重み演算部2は、
図1に示すように、第1重み演算部21、第2重み演算部22、・・・、および、第6重み演算部26を備える。
【0067】
第1重み演算部21は、
図2に示すように、内積演算部211と、乗算部212とを備える。
【0068】
内積演算部211は、データDi[1:m]と、二値基底行列設定部により設定された二値基底行列Mの第1行であるM1とを入力する。内積演算部211は、データDi[1:m]と、二値基底行列Mの第1行M1とを用いて内積処理を行い、内積処理の結果をデータD210(=M1・v_x)として、乗算部212に出力する。
【0069】
乗算部212は、内積演算部211から出力されるデータD210(=M1・v_x)と、スケーリング係数ベクトル設定部ST1により設定されたスケーリング係数ベクトルv_c(=[c1,c2,・・・,c6])の第1スケーリング係数c1とを入力する。乗算部212は、データD210(=M1・v_x)と第1スケーリング係数c1とを用いて乗算処理を実行し、処理結果をデータD21(=c1×(M1・v_x))として加算部3に出力する。
【0070】
なお、説明便宜のため、スケーリング係数ベクトルの6次元のベクトル、すなわち、スケーリング係数を6個であるものとして、以下、説明する。なお、スケーリング係数ベクトルの次元は、6次元以外であってもよい。
【0071】
第2重み演算部22~第6重み演算部26は、それぞれ、第1重み演算部21と同様の構成を有している。第k重み演算部2k(k:自然数、1≦k≦6)は、
図3に示すように、データDi[1:m]と、二値基底行列設定部により設定された二値基底行列Mの第k行であるM
kと、スケーリング係数ベクトルv_c(=[c
1,c
2,・・・,c
6])の第kスケーリング係数c
kとを入力する。そして、第k重み演算部2kは、第1重み演算部21と同様の処理を実行し、データD2kを取得し、取得したデータD2kを加算部3に出力する。
【0072】
なお、以下では、第k重み演算部2kの構成は、第1重み演算部21の構成と同様であるため、第1重み演算部21の構成について説明する。
【0073】
第1重み演算部21の内積演算部211は、
図4に示すように、ビットカウンタ部2111と、フレキシブル多項加算部2112と、累算部2113とを備える。
【0074】
ビットカウンタ部2111は、
図4に示すように、6個のビットカウンタである第1ビットカウンタBc1、第2ビットカウンタBc2、・・・、および、第6ビットカウンタBc6を備える。
【0075】
第kビットカウンタBck(k:自然数、1≦k≦6)は、データDi[1:m]と、二値基底行列設定部により設定された二値基底行列Mの第1行であるM1とを入力する。そして、第kビットカウンタBckは、カウント処理を実行し、処理結果をデータCnt_bk(k:自然数、1≦k≦6)としてフレキシブル多項加算部2112に出力する。
【0076】
フレキシブル多項加算部2112は、ビットカウンタ部2111から出力される6個のデータ(データCnt_b1~Cnt_b6)を入力し、当該6個のデータを用いて加算処理を実行し、処理結果をデータSum1として、累算部2113に出力する。
【0077】
累算部2113は、フレキシブル多項加算部2112から出力されるデータSum1を入力し、当該データSum1を用いて累算処理wを実行し、処理結果をデータD210(=M1・v_x)として、乗算部212に出力する。
【0078】
第1ビットカウンタBc1は、
図5に示すように、AND処理部Bc101と、第1正値並列一括ビットカウンタBc102と、ビットシフト部Bc103と、第2正値並列一括ビットカウンタBc104と、減算部Bc105とを備える。
【0079】
AND処理部Bc101は、データDi[1:m]と、二値基底行列Mの第1行のデータM1とを入力し、データDi[1:m]とデータM1とを用いてAND処理を実行し、処理結果をデータBcD1として、第1正値並列一括ビットカウンタBc102に出力する。
【0080】
第1正値並列一括ビットカウンタBc102は、AND処理部から出力されるデータBcD1を入力し、データBcD1を用いて正値並列一括ビットカウント処理を実行し、処理結果をデータBcD2としてビットシフト部Bc103に出力する。
【0081】
ビットシフト部Bc103は、第1正値並列一括ビットカウンタBc102から出力されるデータBcD2を入力し、データBcD2を用いてビットシフト処理を実行し、処理結果をデータBcD3として減算部Bc105に出力する。
【0082】
第2正値並列一括ビットカウンタBc104は、データDi[1:m]を入力し、データDi[1:m]を用いて正値並列一括ビットカウント処理を実行し、処理結果をデータBcD4として減算部Bc105に出力する。
【0083】
減算部Bc105は、ビットシフト部Bc103から出力されるデータBcD3と、第2正値並列一括ビットカウンタBc104から出力されるデータBcD4とを入力する。減算部Bc105は、データBcD3とデータBcD4とを用いて減算処理を実行し、処理結果をデータCnt_b1としてフレキシブル多項加算部2112に出力する。
【0084】
フレキシブル多項加算部2112は、
図6に示すように、設定部FLA11と、第1シフト部SF1、第2シフト部SF2、・・・、および、第11シフト部SF11と、多項加算部FLA12とを備える。
【0085】
設定部FLA11は、処理データサイズ設定部ST3から出力される入力値ビット幅bit_widthと、処理データサイズ設定部ST3から出力される同一桁処理ビット長bit_lenと、を入力する。設定部FLA11は、入力値ビット幅bit_widthと同一桁処理ビット長bit_lenとに基づいて、第1~第11シフト部に設定するビットシフト量を決定し、決定したビットシフト量のビットシフト演算が、第1~第11シフト部で実行されるように、ビットシフト量を示すデータSft1~Sft11を、それぞれ、第1~第11シフト部に出力する。
【0086】
第1ビットシフト部SF1は、第2ビットカウンタBc2から出力されるデータCnt_b2と、設定部FLA11から出力されるビットシフト量を示すデータSft1とを入力する。第1ビットシフト部SF1は、ビットシフト量を示すデータSft1に基づいて、データCnt_b2に対してビットシフト処理を行い、処理結果をデータDo2として多項加算部FLA12に出力する。
【0087】
なお、第2シフト部SF2~第11シフト部SF11は、第1ビットシフト部SF1と同様の構成である。
【0088】
つまり、第(k-1)シフト部SFk-1(k:自然数、2≦k≦12)は、第kビットカウンタBckから出力されるデータCnt_bkと、設定部FLA11から出力されるビットシフト量を示すデータSft(k-1)とを入力する。第(k-1)ビットシフト部SF(k-1)は、ビットシフト量を示すデータSft(k-1)に基づいて、データCnt_bkに対してビットシフト処理を行い、処理結果をデータDokとして多項加算部FLA12に出力する。
【0089】
多項加算部FLA12は、第1ビットカウンタBc1から出力されるデータCnt_b1(=Do1)と、第1シフト部SF1~第11シフト部SF11から出力されるデータDo2~Do12とを入力する。多項加算部FLA12は、データDo1~Do12を用いて加算処理を実行し、処理結果をデータSum1として、累算部2113に出力する。
【0090】
累算部2113は、フレキシブル多項加算部2112から出力されるデータSum1を入力し、データSum1を用いて、累算処理を実行し、処理結果をデータD210(=M1・v_x)として、乗算部212に出力する。
【0091】
加算部3は、
図1に示すように、重み演算部2から出力されるデータD21(=c
1×(M
1・v_x))、データD22(=c
2×(M
2・v_x))、・・・、データD26(=c
6×(M
6・v_x))を入力し、それらのデータを用いて加算処理を実行する。そして、加算部3は、処理結果をデータDoutとして出力する。
【0092】
<1.2:二値化ニューラルネットワーク用プロセッサの動作>
以上のように構成された二値化ニューラルネットワーク用プロセッサ1000の動作について、以下、説明する。
【0093】
一般に、CNNでは、入力層と、畳み込み層(コンボリューション層)と、全結合層とを含む。
【0094】
CNNでは、畳み込み層の処理、あるいは、全結合層の処理において、入力データに対して重み演算処理が実行され、当該処理結果に対して活性化関数(例えば、シグモイド関数やSoftmax関数)により処理が実行されることで、畳み込み層あるいは全結合層の出力が得られる。
【0095】
図7は、CNNの重み演算処理を、マトリックスで表現した図(上図)と、二値化ニューラルネットワークの重み演算処理を、マトリックスで表現した図(下図)とを示している。
【0096】
図7の上図に示すように、CNNの重み演算処理では、各要素w
ijが実数である行列W(n×mの行列)と、入力データ(ベクトルv_x(1×mの行列))との行列の積を求めることで、出力データy(1×mの行列)が取得される。
【0097】
一方、二値化ニューラルネットワークの重み演算処理では、
図7の下図に示すように、(1)各要素が実数であるスケーリング係数ベクトルv_c(=[c
1,c
2,・・・,c
6])と、(2)各要素が「-1」または「1」である二値基底行列Mと、(3)入力データv_x(=[x
1,x
2,・・・,x
m])との行列の積を求めることで、出力データy
1が取得される。そして、上記と同様の処理を、y
2~y
nに対して行うことで、出力データy(1×mの行列)が取得される。
【0098】
このように、二値化ニューラルネットワークの重み演算処理では、CNNの重み演算処理の重み付け係数を表す行列W(要素wijは実数)を、(1)各要素が実数であるスケーリング係数ベクトルv_c(=[c1,c2,・・・,c6])と、(2)各要素が「-1」または「1」である二値基底行列Mとで表現する(スケーリング係数ベクトルと二値基底行列とにベクトル分解する)。つまり、二値化ニューラルネットワークの重み演算処理では、重み演算処理の大部分をビット演算処理にし、ごく少数の実数演算(スケーリング係数ベクトルを用いた乗算処理)を行うことで、重み演算処理を、ハードウェア規模の増大を抑えつつ、高精度で実行する。このような処理を実行する二値化ニューラルネットワーク用プロセッサ1000の動作について、以下、図面を参照しながら説明する。
【0099】
(1.2.1:設定処理)
まず、スケーリング係数ベクトルv_c(=[c1,c2,・・・,c6])、および、二値基底行列Mの設定処理について、説明する。
【0100】
図8は、スケーリング係数ベクトルv_c(=[c
1,c
2,・・・,c
6])、および、二値基底行列Mの設定処理を説明するための図である。なお、説明便宜のため、m=8としている。
【0101】
例えば、大規模システムにおいて、学習が実行され、重み行列Wが取得された場合において、
図8に示すように、重み行列Wの第1行目のデータが
[w
11,w
12,w
13,w
14,w
15,w
16,w
17,w
18]
=[44,-19.8,-25.6,14.6,26.4,-25.6,44,-25.6]
である場合、
図8の下段に示す値に、スケーリング係数ベクトルv_cおよび二値基底行列Mを設定すれば、大規模システムでの学習により取得された重み行列Wの第1行目のデータを再現(近似)することができる。
【0102】
同様に、重み行列Wの第k行目のデータ(パラメータ)を近似するスケーリング係数ベクトルv_cおよび二値基底行列Mが取得できる。
【0103】
このようにして、大規模システムでの学習済みモデルのパラメータ(重み付けデータ)を近似するスケーリング係数ベクトルv_cおよび二値基底行列Mを取得し、取得したスケーリング係数ベクトルv_cおよび二値基底行列Mを、それぞれ、スケーリング係数ベクトル設定部ST1および二値基底行列設定部ST2に入力する。
【0104】
スケーリング係数ベクトル設定部ST1は、上記により入力されたスケーリング係数ベクトルのデータを保持し、スケーリング係数ckを重み演算部2の第k重み演算部2kに出力する。
【0105】
二値基底行列設定部ST2は、上記により入力された二値基底行列Mのデータを保持し、二値基底行列Mの第k行のデータMkを重み演算部2の第k重み演算部2kに出力する。
【0106】
(1.2.2:重み演算処理)
次に、重み演算処理について、説明する。
【0107】
所定のレンジ内のデータであるデータDin(例えば、6ビットのデータ)が重み演算処理部100の入力変換部1に入力される。説明便宜のため、データDin(=v_x(=[x1,x2,・・・,xm]))は、6ビットのデータ(xk)をm個含むベクトルであるものとする。なお、以下では、説明便宜のため、m=8として説明する。
【0108】
入力変換部1は、処理データサイズ設定部ST3から出力される入力値ビット幅bit_widthと、処理データサイズ設定部ST3から出力される同一桁処理ビット長bit_lenとに基づいて、入力データDinを、重み演算部2で処理するデータ形式のデータに変換する。
【0109】
以下では、一例として、入力変換部1が、
bit_width=6ビット
bit_len=8ビット
と設定した場合について、説明する。つまり、
図9に示す6ビット×8ビット=48ビットのデータ(x
1~x
8に相当)が処理対象の単位データとなる。
【0110】
また、
図9に示すように、データDin(=v_x(=[x
1,x
2,・・・,x
m]))は、一例として、
[x
1,x
2,x
3,x
4,x
5,x
6,x
7,x
8]
=[15,14,13,15,6,3,4,1]
であるものとして、以下、説明する。
【0111】
第1重み演算部21の内積演算部211には、
図9、
図10に示すデータDi[1:m](6ビット×8ビット=48ビットのデータ(x
1~x
8に相当))が入力される。
【0112】
具体的には、
図10に示すように、第1~第12ビットカウンタには、以下のデータが入力される。
第1ビットカウンタBc1の入力:D
1[1:4]
第2ビットカウンタBc2の入力:D
1[5:8]
第3ビットカウンタBc3の入力:D
2[1:4]
第4ビットカウンタBc4の入力:D
2[5:8]
第5ビットカウンタBc5の入力:D
3[1:4]
第6ビットカウンタBc6の入力:D
3[5:8]
第7ビットカウンタBc7の入力:D
4[1:4]
第8ビットカウンタBc8の入力:D
4[5:8]
第9ビットカウンタBc9の入力:D
5[1:4]
第10ビットカウンタBc10の入力:D
5[5:8]
第11ビットカウンタBc11の入力:D
6[1:4]
第12ビットカウンタBc12の入力:D
6[5:8]
なお、D
k[a1:a2]は、
図9、
図10に示した6ビット×8ビット=48ビットのデータ(x
1~x
8に相当)において、右から第k列目のa1行目からa2行目までのデータ(ビット列)を表すものとする。
【0113】
第1~第12ビットカウンタは、同様の動作をするため、ここでは、第1ビットカウンタBc1の動作について説明する。
【0114】
図5に示すように、第1ビットカウンタBc1には、データD
i[1:m]と、二値基底行列Mの第1行のデータM
1とが入力される。第1ビットカウンタBc1は、4ビットデータを処理するカウンタであるので、第1ビットカウンタBc1のAND処理部Bc101には、D
1[1:4](=[1,0,1,1])とデータM
1の上位4ビット分のデータ(
図11に示したデータM
1の上位4ビット分のデータ(=[1,-1,-1,1]))とが入力される。そして、AND処理部Bc101は、D
1[1:4](=[1,0,1,1])とデータM
1の上位4ビット分のデータ(=[1,-1,-1,1])のビットごとのAND処理を実行する。なお、このビットごとのAND処理は、両者が「1」である場合以外は、出力を「0」とする。つまり、いずれかのデータが「-1」である場合、AND処理の出力は「0」とする。
【0115】
AND処理部Bc101は、上記処理を実行することで、
図11に示すように、処理結果データBcD1(=[1,0,0,1])を取得する。
【0116】
第1正値並列一括ビットカウンタBc102は、AND処理部Bc101の処理結果データBcD1に含まれる「1」の数をカウントし、カウント値をデータBcD2としてビットシフト部Bc103に出力する。上記の場合、カウント値は「2」であるので、第1正値並列一括ビットカウンタBc102は、BcD2=2として、データBcD2をビットシフト部Bc103に出力する。
【0117】
ビットシフト部Bc103は、データBcD2を入力し、データBcD2を左方向へ1ビットシフトする、つまり、データBcD2を2倍にする処理を行う。そして、処理結果データBcD3(=2×BcD2=4)を減算部Bc105に出力する。
【0118】
第2正値並列一括ビットカウンタBc104は、D1[1:4](=[1,0,1,1])の「1」の数をカウントし、カウント値(=3)をデータBcD4(=3)として、減算部Bc105に出力する。
【0119】
減算部Bc105は、
Cnt_b1=BcD3-BcD4
に相当する減算処理を実行し、処理結果データCnt_b1を取得する。上記の場合、
Cnt_b1=BcD3-BcD4=4-3=1
であるので、減算部Bc105は、Cnt_b1(=1)をフレキシブル多項加算部2112に出力する。
【0120】
上記のように、第1ビットカウンタBc1では、D1[1:4]とデータM1の上位4ビットにおいて、ビットごとのAND処理、つまり、双方のビットが「1」であるビットのみ「1」とする処理を行い、出力結果データのビット列に含まれる「1」の数をカウントし、当該カウント値の2倍の値BcD3を取得する。そして、第1ビットカウンタBc1では、D1[1:4]のビット列に含まれる「1」の数をデータBcD4として取得し、Cnt_b1=BcD3―BcD4により、出力値Cnt_b1を取得する。つまり、第1ビットカウンタBc1では、上記のように処理することで、「-1」を乗算する処理を行うことなく、データD1[1:4]とデータM1の上位4ビットとの内積の値を取得することができる。
【0121】
第2ビットカウンタBc2では、D1[5:8]とデータM1の下位4ビット(=[1,-1,1,-1])とを用いて、上記と同様の処理が実行され、Cnt_b2=-2が取得される。
【0122】
また、第3ビットカウンタBc3~第12ビットカウンタBc12においても、上記と同様の処理が実行され、データCnt_b3~Cnt_b12が取得される。
【0123】
上記のようにして取得されたデータCnt_b1は、
図6に示すように、多項加算部FLA12に出力され、データCnt_b2~Cnt_b12は、それぞれ、第1シフト部SF1~第11シフト部SF11に出力される。
【0124】
設定部FLA11は、入力値ビット幅bit_widthと同一桁処理ビット長bit_lenとに基づいて、第1~第11シフト部に設定するビットシフト量を決定し、決定したビットシフト量のビットシフト演算が、第1~第11シフト部で実行されるように、ビットシフト量を示すデータSft1~Sft11を、それぞれ、第1~第11シフト部に出力する。
【0125】
本実施形態では、bit_width=6、bit_len=8であり、第1ビットカウンタBc1~第12ビットカウンタBc12が、それぞれ4ビットのデータ処理を行っているので、以下のようにシフト量が設定される。
第1シフト部SF1のシフト量=0ビット(Do2=Cnt_b2)
第2シフト部SF1のシフト量=左へ1ビット(Do3=Cnt_b3×2)
第3シフト部SF1のシフト量=左へ1ビット(Do4=Cnt_b4×2)
第4シフト部SF1のシフト量=左へ2ビット(Do5=Cnt_b5×2^2)
第5シフト部SF1のシフト量=左へ2ビット(Do6=Cnt_b6×2^2)
第6シフト部SF1のシフト量=左へ3ビット(Do7=Cnt_b7×2^3)
第7シフト部SF1のシフト量=左へ3ビット(Do8=Cnt_b8×2^3)
第8シフト部SF1のシフト量=左へ4ビット(Do9=Cnt_b9×2^4)
第9シフト部SF1のシフト量=左へ4ビット(Do10=Cnt_b10×2^4)
第10シフト部SF1のシフト量=左へ5ビット(Do11=Cnt_b11×2^5)
第11シフト部SF1のシフト量=左へ5ビット(Do12=Cnt_b12×2^5)
そして、上記括弧内で示した数式に相当する処理が実行され、データDo2~Do12が、それぞれ、第1シフト部SF1~第11シフト部SF11から多項加算部FLA12に出力される。
【0126】
多項加算部FLA12では、データDo1(=Cnt_b1)とデータDo2~Do12との加算処理が実行され、その処理結果データSum1が取得される。
【0127】
このデータSum1は、
図7に示した行列Mの第1行のデータM
1(=[b
11,b
12,b
13,b
14,b
15,b
16,b
17,b
18,])と、データv_x(=[x
1,x
2,x
3,x
4,x
5,x
6,x
7,x
8,])との内積をとった値と等しくなる。
【0128】
つまり、重み演算処理部100で実行される上記処理は、下記数式に相当する。
【数1】
なお、M
1[1:4]は、行列Mの第1行のデータM
1の上位4ビットのデータを表しており、M
1[5:8]は、行列Mの第1行のデータM
1の下位4ビットのデータを表している。例えば、
図9の場合、M
1[1:4]=[1,-1,-1,1]であり、M
1[5:8]=[1,-1,1,-1]である。
【0129】
以上の処理により取得されたデータSum1は、フレキシブル多項加算部2112の多項加算部FLA12から累算部2113に出力される。
【0130】
累算部2113では、フレキシブル多項加算部2112で取得されるデータSum1を保持することができ、複数のSum1を保持し、所定のタイミングで、保持している複数のデータSum1の合計値(累算値)を取得することができる。
【0131】
上記の場合(m=8の場合)は、Sum1が、行列Mの第1行のデータM1(=[b11,b12,b13,b14,b15,b16,b17,b18,])と、データv_x(=[x1,x2,x3,x4,x5,x6,x7,x8,])との内積をとった値と等しいので、累算部2113は、
D210=Sum1=M1・v_x
として、データD210を、乗算部212に出力する。
【0132】
例えば、
図12に示すように、m=24の場合、上記処理が3回実行される。そして、
図12に示すように、1回目の処理で累算部2113により取得されたデータをSum1(1)とし、2回目の処理で累算部2113により取得されたデータをSum1(2)とし、3回目の処理で累算部2113により取得されたデータをSum1(3)とすると、累算部2113は、データSum(1)、データSum(2)を保持し、データSum(3)が取得されたタイミングで、累算処理を実行する、すなわち、
D210=Sum1(1)+Sum1(2)+Sum1(3)(=M
1・v_x)
に相当する処理を実行する。これにより、M
1・v_xと等しいデータD210が取得される。
【0133】
このように、累算部2113で、複数のSum1を保持することで、mが大きな数である場合、すなわち、二値基底行列M(例えば、
図7を参照)の列の数が多い場合であっても、M
1・v_xと等しいデータD210を取得することができる。
【0134】
また、累算部2113により、乗算部212の乗算結果を待つことなく、連続して、Sum1(1)、Sum(2)、Sum(3)、・・・の処理を実行することができるので、パイプライン処理と同様に、重み演算処理全体の処理速度を向上させることができる。
【0135】
また、累算部2113に、一時的にデータを保持するバッファを設け、累算結果を取得するためのデータを一時的に待避させ、時分割処理により、積算結果データを取得できるようにしてもよい。このようにすることで、例えば、小規模のハードウェアにより、累算部2113を実現することも可能となる。
【0136】
乗算部212では、内積演算部211から出力されるデータD210(=M1・v_x)と、スケーリング係数c1との乗算処理が実行され、データD21(=c1×D210=c1×M1・v_x)が取得される。そして、取得されたデータD21は、第1重み演算部21から加算部3に出力される。
【0137】
第2重み演算部22においても、上記と同様に処理が実行され、データD22(=c2×M2・v_x)が取得される。そして、取得されたデータD22は、第2重み演算部22から加算部3に出力される。
【0138】
第k重み演算部2kにおいても、上記と同様に処理が実行され、データD2k(=ck×Mk・v_x)が取得される。そして、取得されたデータD2kは、第k重み演算部2kから加算部3に出力される。
【0139】
加算部3は、重み演算部2から出力されるデータD21~D26を入力し、
Dout=D21+D22+D23+D24+D25+D26
に相当する処理を実行することで、データDoutを出力する。
【0140】
これにより、
図7に示したデータy
1を取得することができる。
【0141】
また、上記と同様に処理を実行することで、重み演算処理部100により、データy2~ynを取得することができる。
【0142】
なお、二値化ニューラルネットワーク用プロセッサ1000において、重み演算処理部100を複数設けて、データy1~ynの取得処理を並列に実行するようにしてもよい。
【0143】
以上のように、二値化ニューラルネットワーク用プロセッサ1000では、重み演算処理の大部分を、二値基底行列Mを用いたビット演算処理にし、ごく少数の実数演算(スケーリング係数ベクトルを用いた乗算処理)を行う。したがって、二値化ニューラルネットワーク用プロセッサ1000では、重み演算処理を、ハードウェア規模の増大を抑えつつ、高精度で実行することができる。
【0144】
また、
図13に示すように、入力変換部1において、処理対象データのサイズを上記以外のものに設定し、重み演算処理部が重み演算処理を実行するようにしてもよい。
【0145】
例えば、
図13の右図に示すように、処理対象データのサイズを、bit_width=4ビット、bit_len=12ビットとすると、第1シフト部SF1~第11シフト部SF11において、以下のようにシフト量が設定される。
第1シフト部SF1のシフト量=0ビット(Do2=Cnt_b2)
第2シフト部SF1のシフト量=0ビット(Do3=Cnt_b3)
第3シフト部SF1のシフト量=左へ1ビット(Do4=Cnt_b4×2)
第4シフト部SF1のシフト量=左へ1ビット(Do5=Cnt_b5×2)
第5シフト部SF1のシフト量=左へ1ビット(Do6=Cnt_b6×2)
第6シフト部SF1のシフト量=左へ2ビット(Do7=Cnt_b7×2^2)
第7シフト部SF1のシフト量=左へ2ビット(Do8=Cnt_b8×2^2)
第8シフト部SF1のシフト量=左へ2ビット(Do9=Cnt_b9×2^2)
第9シフト部SF1のシフト量=左へ3ビット(Do10=Cnt_b10×2^3)
第10シフト部SF1のシフト量=左へ3ビット(Do11=Cnt_b11×2^3)
第11シフト部SF1のシフト量=左へ3ビット(Do12=Cnt_b12×2^3)
そして、上記括弧内で示した数式に相当する処理が実行され、データDo2~Do12が、それぞれ、第1シフト部SF1~第11シフト部SF11から多項加算部FLA12に出力され、上記と同様の処理が実行される。
【0146】
このように、二値化ニューラルネットワーク用プロセッサ1000では、入力値ビット幅bit_widthと、同一桁処理ビット長bit_lenとにより処理対象となるデータ(データ単位)を決定し、決定した処理対象データに対して、重み演算処理を実行することができる。
【0147】
また、二値化ニューラルネットワーク用プロセッサ1000では、
図10に示すように、入力データであるv_xの同一桁ビットをひとまとめにして、二値基底行列Mの第k行とのビット演算処理を行うため、v_xの要素であるデータx
iのビット長に関係なく、内積演算部で同一の処理により、内積演算結果データ(例えば、D210=M
1・v_x)を取得することができる。
【0148】
このように、二値化ニューラルネットワーク用プロセッサ1000では、入力データ(v_x)のビット長に依存しないアーキテクチャにより、重み演算処理を実行することができる。
【0149】
さらに、二値化ニューラルネットワーク用プロセッサ1000では、乗算部(例えば、乗算部212)により、実数であるスケーリング係数と内積演算結果データ(例えば、D210=M1・v_x)との乗算処理により、乗算結果データ(例えば、D21=c1×M1・v_x)を取得する。つまり、二値化ニューラルネットワーク用プロセッサ1000では、重み演算処理のビット精度がどのようなものであっても、一定の誤差範囲に収まるように、実数であるスケーリング係数を調整することで、大規模システムで学習し取得した学習済みモデルのパラメータ(重み付けデータ)を用いたモデルに相当する重み演算処理を実現することができる。
【0150】
その結果、二値化ニューラルネットワーク用プロセッサ1000では、再学習を必要とせず、コンパクト化したモデル(大規模システムで学習し取得した学習済みモデルの近似モデル)に相当する重み演算処理を実行することができる。
【0151】
したがって、二値化ニューラルネットワーク用プロセッサ1000では、再学習を必要とせず、組み込み機器やモバイル機器等の低スペックのデバイス(例えば、エッジ端末)において、高性能なコンパクト化したモデルを搭載することができる。
【0152】
なお、二値化ニューラルネットワーク用プロセッサ1000において、上記重み演算処理を実行させるためのプロセッサ命令を定義し、当該プロセッサ命令により、制御部C1(例えば、CPU)が、二値化ニューラルネットワーク用プロセッサ1000において、上記の重み演算処理を実行するようにしてもよい。
【0153】
例えば、(1)スケーリング係数ベクトルを設定するデータを設定(ロード)する命令と、(2)二値基底行列のデータ(「1」、「-1」の値をとる行列係数)を設定(ロード)する命令と、(3)入力データの同一桁を抽出した2値データ(例えば、
図10のD
i[1:m]等)と二値基底行列との行列演算を実行する命令と、定義し、定義した当該命令を二値化ニューラルネットワーク用プロセッサ1000において実行するようにしてもよい。
【0154】
[他の実施形態]
上記実施形態で説明に用いたデータのビット長やサイズは一例であり、上記の説明に用いたデータのビット長やサイズに限定されることはない。また、上記実施形態では、スケーリング係数ベクトル係数が6個の場合(スケーリング係数ベクトルが6次元ベクトルである場合)について説明したが、これに限定されることはなく、スケーリング係数ベクトル係数の個数は、任意のn個(n:自然数)であってもよい(スケーリング係数ベクトルはn次元ベクトルであってもよい)。スケーリング係数ベクトルがn次元ベクトルである場合、スケーリング係数ベクトル設定部ST1が、n個のスケーリング係数ベクトル係数を設定する機能を有し、重み演算部2が、第1重み演算部21~第n重み演算部2n(n個の重み演算部)を備えるように、重み演算処理部を構成するようにすればよい。
【0155】
上記実施形態で説明した重み演算処理部100において、各ブロックは、LSIなどの半導体装置により個別に1チップ化されても良いし、一部又は全部を含むように1チップ化されても良い。
【0156】
なお、ここでは、LSIとしたが、集積度の違いにより、IC、システムLSI、スーパーLSI、ウルトラLSIと呼称されることもある。
【0157】
また、集積回路化の手法はLSIに限るものではなく、専用回路又は汎用プロセサで実現してもよい。LSI製造後に、プログラムすることが可能なFPGA(Field Programmable Gate Array)や、LSI内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサーを利用しても良い。
【0158】
また、上記各実施形態の各機能ブロックの処理の一部または全部は、プログラムにより実現されるものであってもよい。そして、上記各実施形態の各機能ブロックの処理の一部または全部は、コンピュータにおいて、中央演算装置(CPU)により行われる。また、それぞれの処理を行うためのプログラムは、ハードディスク、ROMなどの記憶装置に格納されており、ROMにおいて、あるいはRAMに読み出されて実行される。
【0159】
また、上記実施形態の各処理をハードウェアにより実現してもよいし、ソフトウェア(OS(オペレーティングシステム)、ミドルウェア、あるいは、所定のライブラリとともに実現される場合を含む。)により実現してもよい。さらに、ソフトウェアおよびハードウェアの混在処理により実現しても良い。
【0160】
例えば、上記実施形態(変形例を含む)の各機能部を、ソフトウェアにより実現する場合、
図14に示したハードウェア構成(例えば、CPU、ROM、RAM、入力部、出力部等をバスBusにより接続したハードウェア構成)を用いて、各機能部をソフトウェア処理により実現するようにしてもよい。
【0161】
また、上記実施形態における処理方法の実行順序は、必ずしも、上記実施形態の記載に制限されるものではなく、発明の要旨を逸脱しない範囲で、実行順序を入れ替えることができるものである。
【0162】
前述した方法をコンピュータに実行させるコンピュータプログラム及びそのプログラムを記録したコンピュータ読み取り可能な記録媒体は、本発明の範囲に含まれる。ここで、コンピュータ読み取り可能な記録媒体としては、例えば、フレキシブルディスク、ハードディスク、CD-ROM、MO、DVD、DVD-ROM、DVD-RAM、大容量DVD、次世代DVD、半導体メモリを挙げることができる。
【0163】
上記コンピュータプログラムは、上記記録媒体に記録されたものに限られず、電気通信回線、無線又は有線通信回線、インターネットを代表とするネットワーク等を経由して伝送されるものであってもよい。
【0164】
また、文言「部」は、「サーキトリー(circuitry)」を含む概念であってもよい。サーキトリーは、ハードウェア、ソフトウェア、あるいは、ハードウェアおよびソフトウェアの混在により、その全部または一部が、実現されるものであってもよい。
【0165】
なお、本発明の具体的な構成は、前述の実施形態に限られるものではなく、発明の要旨を逸脱しない範囲で種々の変更および修正が可能である。
【符号の説明】
【0166】
1000 二値化ニューラルネットワーク用プロセッサ
1 入力変換部
2 重み演算部
21 第1重み演算部
22 第2重み演算部
26 第6重み演算部
211 内積演算部
212 乗算部
2111 ビットカウンタ部
2112 フレキシブル多項加算部
2113 累算部
3 加算部
ST1 スケーリング係数ベクトル設定部
ST2 二値基底行列設定部
ST3 処理データサイズ設定部
Bc101 AND処理部
Bc102 第1正値並列一括ビットカウンタ
Bc103 ビットシフト部
Bc104 第2正値並列一括ビットカウンタ
Bc105 減算部