(57)【要約】【課題】学習を必要とせず、組み込み機器やモバイル機器等の低スペックのデバイスにおいて、高性能なコンパクト化したモデルを搭載することができる二値化ニューラルネットワーク用プロセッサを実現する。【解決手段】二値化ニューラルネットワーク用プロセッサでは、重み演算処理の大部分を二値基底行列を用いたビット演算処理にし、ごく少数の実数演算（スケーリング係数ベクトルを用いた乗算処理）を行うことで、重み演算処理を実行する。したがって、二値化ニューラルネットワーク用プロセッサでは、ハードウェア規模の増大を抑えつつ、高精度な重み演算処理を実行することできる。その結果、二値化ニューラルネットワーク用プロセッサでは、再学習を必要とせず、コンパクト化したモデル（大規模システムで学習し取得した学習済みモデルの近似モデル）に相当する重み演算処理を実行することができる。【選択図】図１
2018190197.tif 000002
【特許請求の範囲】
【請求項１】
実数ベクトルデータであるスケーリング係数ベクトルを設定するスケーリング係数ベクトル設定部と、
「１」または「−１」をとる２値データを要素とする二値基底行列を設定する二値基底行列設定部と、
重み演算処理の対象となるデータを決定するための入力値ビット幅と同一桁処理ビット長を設定する処理データサイズ設定部と、
前記入力値ビット幅および前記同一桁処理ビット長に基づいて決定される重み演算処理の対象データを用いて、前記二値基底行列に基づく処理を実行することで、二値基底行列処理結果データを取得し、取得した前記二値基底行列処理結果データと、前記スケーリング係数ベクトルとを用いた乗算処理を実行することで、乗算結果データを取得する重み演算処理部と、
を備える、
二値化ニューラルネットワーク用プロセッサ。
【請求項２】
前記重み演算処理部は、
前記入力値ビット幅および前記同一桁処理ビット長に基づいて、重み演算処理の対象データを決定し、入力データの同一桁を抽出することで縦ビットデータＤｉ［１：ｍ］（ｉ：自然数、入力データのビットの桁を表す番号、ｍ：自然数）を取得する入力変換部と、
（１）前記縦ビットデータＤｉ［１：ｍ］と、前記二値基底行列の第ｊ行のデータであるデータＭｊとを用いて内積演算処理を実行することで、内積演算結果データを取得し、（２）取得した前記内積演算結果データを、前記縦ビットデータＤｉ［１：ｍ］が抽出された前記入力データの桁に応じてビットシフト量により、ビットシフト演算処理を行うことで、ビットシフト演算結果データを取得し、（３）前記入力データの桁ごとに取得した前記ビットシフト演算結果データを加算することで、前記入力データと前記データＭｊとの内積データを取得する内積演算部と、
前記内積データと前記スケーリング係数とを乗算することで、第ｊ行乗算結果データを取得する乗算部と、
を備える請求項１に記載の二値化ニューラルネットワーク用プロセッサ。
【請求項３】
前記内積演算部は、
ｋ個（ｋ：自然数、１≦ｋ≦ｎ）のビットカウンタである第１ビットカウンタ〜第ｋビットカウンタと、
フレキシブル多項加算部と、
を備え、
前記第ｋビットカウンタは、
前記縦ビットデータＤｉ［１：ｍ］から一部のビットデータを抽出した第１縦ビットデータと、前記データＭｊのデータのうち前記第１縦ビットデータのビット数と同一のビット数のデータを抽出した第１マトリックスデータＭｊ’との各ビットが両方とも「１」であるときのみ「１」を出力するＡＮＤ処理を実行するＡＮＤ処理部と、
前記ＡＮＤ処理の出力データに含まれる「１」の数をカウントし、第１カウント値として取得する第１正値並列一括ビットカウンタと、
前記第１カウント値を２倍にしたデータを第１データとして取得するビットシフト部と、
前記第１縦ビットデータに含まれる「１」の数をカウントし、第２カウント値として取得する第２正値並列一括ビットカウンタと、
前記第１データから前記第２カウント値を減算することで、カウンタ出力データＣｎｔ＿ｂｋを取得する減算部と、
を備え、
前記フレキシブル多項加算部は、
前記第１ビットカウンタ〜第ｋビットカウンタにより取得されたカウンタ出力データＣｎｔ＿ｂ１〜Ｃｎｔ＿ｂｎを入力し、カウンタ出力データＣｎｔ＿ｂ１〜Ｃｎｔ＿ｂｎのぞれぞれに対して、前記入力値ビット幅および前記同一桁処理ビット長に基づいて設定されるシフト量によりシフト演算処理を実行し、データＤｏ１〜Ｄｏ１２を取得し、取得した前記データＤｏ１〜Ｄｏ１２を加算することで、多項加算結果データを取得する、
請求項２に記載の二値化ニューラルネットワーク用プロセッサ。
【請求項４】
前記内積演算部は、
前記多項加算結果データを複数保持することができ、複数保持した多項加算結果データを加算することで累算結果データを取得する累算部をさらに備える、
請求項３に記載の二値化ニューラルネットワーク用プロセッサ。
【請求項５】
前記二値化ニューラルネットワーク用プロセッサの各機能部を制御する制御部をさらに備え、
前記制御部は、
（１）前記スケーリング係数ベクトルを設定するデータを設定する命令である第１命令と、
（２）前記二値基底行列を設定する命令である第２命令と、
（３）入力データの同一桁を抽出した２値データと二値基底行列との行列演算を実行する命令である第３命令と、
を入力することができる、
請求項１から４のいずれかに記載の二値化ニューラルネットワーク用プロセッサ。
【請求項６】
前記制御部が前記第１命令を入力したとき、
前記制御部は、前記スケーリング係数ベクトル設定部において、前記第１命令に基づく前記スケーリング係数ベクトルが設定されるように、前記スケーリング係数ベクトル設定部を制御する、
請求項５に記載の二値化ニューラルネットワーク用プロセッサ。
【請求項７】
前記制御部が前記第２命令を入力したとき、
前記制御部は、前記二値基底行列設定部において、前記第２命令に基づく前記二値基底行列が設定されるように、前記二値基底行列設定部を制御する、
請求項５に記載の二値化ニューラルネットワーク用プロセッサ。
【請求項８】
前記制御部が前記第３命令を入力したとき、
前記制御部は、前記入力データの同一桁を抽出した２値データと二値基底行列との行列演算が実行されるように、前記重み演算処理部を制御する、
請求項５に記載の二値化ニューラルネットワーク用プロセッサ。
【請求項９】
二値化ニューラルネットワーク用プロセッサで実行されるデータ処理方法であって、
実数ベクトルデータであるスケーリング係数ベクトルを設定するスケーリング係数ベクトル設定ステップと、
「１」または「−１」をとる２値データを要素とする二値基底行列を設定する二値基底行列設定ステップと、
重み演算処理の対象となるデータを決定するための入力値ビット幅と同一桁処理ビット長を設定する処理データサイズ設定ステップと、
前記入力値ビット幅および前記同一桁処理ビット長に基づいて決定される重み演算処理の対象データを用いて、前記二値基底行列に基づく処理を実行することで、二値基底行列処理結果データを取得し、取得した前記二値基底行列処理結果データと、前記スケーリング係数ベクトルとを用いた乗算処理を実行することで、乗算結果データを取得する重み演算処理ステップと、
を備える、
データ処理方法。
【請求項１０】
請求項９に記載のデータ処理方法をコンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ニューラルネットワークの技術に関する。
【背景技術】
【０００２】
近年、ニューラルネットワーク技術の１つである、ＣＮＮ（Ｃｏｎｖｏｌｕｔｉｏｎａｌ  Ｎｅｕｒａｌ  Ｎｅｔｗｏｒｋ）を用いた多様な技術が開発されている（例えば、特許文献１を参照）。ＣＮＮの中でも、中間層を多く設けたＤＣＮＮ（Ｄｅｅｐ  Ｃｏｎｖｏｌｕｔｉｏｎａｌ  Ｎｅｕｒａｌ  Ｎｅｔｗｏｒｋ）を用いた技術が、多様な分野で成果を上げているため、特に注目を集めている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１５−１９７７０２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
ＤＣＮＮは，一般物体認識やセマンティックセグメンテーション等の様々なタスクにおいて高い認識性能を実現している。その一方で、ＤＣＮＮは、処理を実行するために必要な計算量とパラメータ数が非常に多いため、処理を実行するときに、膨大な処理時間と多大なメモリ量が必要となる。
【０００５】
また、ＤＣＮＮでは、層をより深くすることで認識精度が向上する傾向が見られ、これに伴い識別時間（処理時間）に加えモデルサイズも増加するという問題が発生する。組み込み機器やモバイル機器等の低スペックのデバイスでＤＣＮＮを使用するには、識別計算の高速化とモデルサイズの圧縮が大きな課題となる。
【０００６】
つまり、組み込み機器やモバイル機器等の低スペックのデバイス（例えば、エッジ端末）において、大規模システムで学習し取得した学習済みモデルをそのまま搭載することは困難であり、低スペックのデバイスにおいて、コンパクト化したモデルを構築する必要がある。
【０００７】
組み込み機器やモバイル機器等の低スペックのデバイス（例えば、エッジ端末）に、大規模システムで学習し取得した学習済みモデルを搭載するためには、低スペックのデバイスにおいて、当該学習済みモデルのコンパクト化したモデルを構築し、当該学習済みモデルに用いた学習用データを用いて、再度、コンパクト化したモデルにおいて、学習させる必要がある（この学習を「再学習」という）。
【０００８】
つまり、組み込み機器やモバイル機器等の低スペックのデバイス（例えば、エッジ端末）で、大規模システムで学習し取得した学習済みモデルを搭載するためには、再学習が必要となるという課題がある。
【０００９】
そこで、本発明は、上記課題に鑑み、再学習を必要とせず、組み込み機器やモバイル機器等の低スペックのデバイス（例えば、エッジ端末）において、高性能なコンパクト化したモデルを搭載することができる二値化ニューラルネットワーク用プロセッサ、データ処理方法、および、プログラムを実現することを目的とする。
【課題を解決するための手段】
【００１０】
上記課題を解決するために、第１の発明は、スケーリング係数ベクトル設定部と、二値基底行列設定部と、処理データサイズ設定部と、重み演算処理部と、を備える二値化ニューラルネットワーク用プロセッサである。
【００１１】
スケーリング係数ベクトル設定部は、実数ベクトルデータであるスケーリング係数ベクトルを設定する。
【００１２】
二値基底行列設定部は、「１」または「−１」をとる２値データを要素とする二値基底行列を設定する。
【００１３】
処理データサイズ設定部は、重み演算処理の対象となるデータを決定するための入力値ビット幅と同一桁処理ビット長を設定する。
【００１４】
重み演算処理部は、入力値ビット幅および同一桁処理ビット長に基づいて決定される重み演算処理の対象データを用いて、二値基底行列に基づく処理を実行することで、二値基底行列処理結果データを取得し、取得した二値基底行列処理結果データと、スケーリング係数ベクトルとを用いた乗算処理を実行することで、乗算結果データを取得する。
【００１５】
これにより、この二値化ニューラルネットワーク用プロセッサでは、入力値ビット幅および同一桁処理ビット長に基づいて、重み演算処理の対象データを柔軟に設定することができる。そして、この二値化ニューラルネットワーク用プロセッサでは、設定（決定）した重み演算処理の対象データを用いて、重み演算処理の大部分を二値基底行列を用いたビット演算処理にし、ごく少数の実数演算（スケーリング係数ベクトルを用いた乗算処理）を行うことで、重み演算処理を実行することができる。したがって、この二値化ニューラルネットワーク用プロセッサでは、入力データのビット長に依存せず、柔軟に重み演算処理の対象データを設定することができるともに、ハードウェア規模の増大を抑えつつ、高精度な重み演算処理を実行することできる。その結果、この二値化ニューラルネットワーク用プロセッサでは、再学習を必要とせず、コンパクト化したモデル（大規模システムで学習し取得した学習済みモデルの近似モデル）に相当する重み演算処理を実行することができる。
【００１６】
したがって、この二値化ニューラルネットワーク用プロセッサでは、再学習を必要とせず、組み込み機器やモバイル機器等の低スペックのデバイス（例えば、エッジ端末）において、高性能なコンパクト化したモデルを搭載することができる。
【００１７】
第２の発明は、第１の発明であって、重み演算処理部は、入力変換部と、内積演算部と、乗算部と、を備える。
【００１８】
入力変換部は、入力値ビット幅および同一桁処理ビット長に基づいて、重み演算処理の対象データを決定し、入力データの同一桁を抽出することで縦ビットデータＤｉ［１：ｍ］（ｉ：自然数、入力データのビットの桁を表す番号、ｍ：自然数）を取得する。
【００１９】
内積演算部は、（１）縦ビットデータＤｉ［１：ｍ］と、二値基底行列の第ｊ行のデータであるデータＭｊとを用いて内積演算処理を実行することで、内積演算結果データを取得し、（２）取得した内積演算結果データを、縦ビットデータＤｉ［１：ｍ］が抽出された入力データの桁に応じてビットシフト量により、ビットシフト演算処理を行うことで、ビットシフト演算結果データを取得し、（３）入力データの桁ごとに取得したビットシフト演算結果データを加算することで、入力データとデータＭｊとの内積データを取得する。
【００２０】
乗算部は、内積データとスケーリング係数とを乗算することで、第ｊ行乗算結果データを取得する。
【００２１】
これにより、この二値化ニューラルネットワーク用プロセッサでは、入力データ（例えば、ｖ＿ｘ）の同一桁ビットをひとまとめにして、二値基底行列Ｍの第ｋ行とのビット演算処理を行うため、ｖ＿ｘの要素であるデータｘｉのビット長に関係なく、内積演算部で同一の処理により、内積演算結果データ（例えば、Ｄ２１０＝Ｍ１・ｖ＿ｘ）を取得することができる。
【００２２】
このように、この二値化ニューラルネットワーク用プロセッサでは、入力データ（ｖ＿ｘ）のビット長に依存しないアーキテクチャにより、重み演算処理を実行することができる。
【００２３】
さらに、二値化ニューラルネットワーク用プロセッサでは、乗算部により、実数であるスケーリング係数と内積演算結果データ（例えば、Ｄ２１０＝Ｍ１・ｖ＿ｘ）との乗算処理により、乗算結果データ（例えば、Ｄ２１＝ｃ１×Ｍ１・ｖ＿ｘ）を取得する。つまり、この二値化ニューラルネットワーク用プロセッサでは、重み演算処理のビット精度がどのようなものであっても、一定の誤差範囲に収まるように、実数であるスケーリング係数を調整することで、大規模システムで学習し取得した学習済みモデルのパラメータ（重み付けデータ）を用いたモデルに相当する重み演算処理を実現することができる。
【００２４】
その結果、この二値化ニューラルネットワーク用プロセッサでは、再学習を必要とせず、コンパクト化したモデル（大規模システムで学習し取得した学習済みモデルの近似モデル）に相当する重み演算処理を実行することができる。
【００２５】
第３の発明は、第２の発明であって、内積演算部は、第１ビットカウンタ〜第ｋビットカウンタと、フレキシブル多項加算部と、ＡＮＤ処理部と、第１正値並列一括ビットカウンタと、ビットシフト部と、第２正値並列一括ビットカウンタと、減算部と、を備える。
【００２６】
第ｋビットカウンタは、ＡＮＤ処理部と、第１正値並列一括ビットカウンタと、ビットシフト部と、第２正値並列一括ビットカウンタと、減算部とを備える。
【００２７】
ＡＮＤ処理部は、縦ビットデータＤｉ［１：ｍ］から一部のビットデータを抽出した第１縦ビットデータと、データＭｊのデータのうち第１ビットデータのビット数と同一のビット数のデータを抽出した第１マトリックスデータＭｊ’との各ビットが両方とも「１」であるときのみ「１」を出力するＡＮＤ処理を実行する。
【００２８】
第１正値並列一括ビットカウンタは、ＡＮＤ処理の出力データに含まれる「１」の数をカウントし、第１カウント値として取得する。
【００２９】
ビットシフト部は、第１カウント値を２倍にしたデータを第１データとして取得する。
【００３０】
第２正値並列一括ビットカウンタは、第１縦ビットデータに含まれる「１」の数をカウントし、第２カウント値として取得する。
【００３１】
減算部は、第１データから第２カウント値を減算することで、カウンタ出力データＣｎｔ＿ｂｋを取得する。
【００３２】
フレキシブル多項加算部は、第１ビットカウンタ〜第ｋビットカウンタにより取得されたカウンタ出力データＣｎｔ＿ｂ１〜Ｃｎｔ＿ｂｎを入力し、カウンタ出力データＣｎｔ＿ｂ１〜Ｃｎｔ＿ｂｎのぞれぞれに対して、入力値ビット幅および同一桁処理ビット長に基づいて設定されるシフト量によりシフト演算処理を実行し、データＤｏ１〜Ｄｏ１２を取得し、取得したデータＤｏ１〜Ｄｏ１２を加算することで、多項加算結果データを取得する。
【００３３】
これにより、この二値化ニューラルネットワーク用プロセッサでは、「−１」の乗算を実行せずにカウント処理を実行することができるので、ハードウェア規模を効果的に削減することができる。
【００３４】
また、この二値化ニューラルネットワーク用プロセッサでは、フレキシブル多項加算部により入力値ビット幅および同一桁処理ビット長に基づいてシフト量（ビットシフト量）を調整することで、入力データ（ｖ＿ｘ）のビット長に依存しないデータ処理を実行することができる。つまり、この二値化ニューラルネットワーク用プロセッサでは、入力データ（ｖ＿ｘ）のビット長に依存しないアーキテクチャにより、重み演算処理を実行することができる。
【００３５】
第４の発明は、第３の発明であって、内積演算部は、多項加算結果データを複数保持することができ、複数保持した多項加算結果データを加算することで累算結果データを取得する累算部をさらに備える。
【００３６】
これにより、この二値化ニューラルネットワーク用プロセッサでは、累算部により、乗算部の乗算処理が終了することを待つことなく、連続して、累算処理を実行することができるので、パイプライン処理と同様に、重み演算処理全体の処理速度を向上させることができる。
【００３７】
第５の発明は、第１から第４のいずれかの発明であって、二値化ニューラルネットワーク用プロセッサの各機能部を制御する制御部をさらに備える。
【００３８】
制御部は、
（１）スケーリング係数ベクトルを設定するデータを設定する命令である第１命令と、
（２）二値基底行列を設定する命令である第２命令と、
（３）入力データの同一桁を抽出した２値データと二値基底行列との行列演算を実行する命令である第３命令と、を入力することができる（受け付けることができる）。
【００３９】
これにより、上記命令セットに対応した二値化ニューラルネットワーク用プロセッサを実現することができる。
【００４０】
第６の発明は、第５の発明であって、制御部が第１命令を入力したとき、制御部は、スケーリング係数ベクトル設定部において、第１命令に基づくスケーリング係数ベクトルが設定されるように、スケーリング係数ベクトル設定部を制御する。
【００４１】
これにより、この二値化ニューラルネットワーク用プロセッサでは、第１命令を受け付けたとき、第１命令に従った上記処理を実行することができる。
【００４２】
第７の発明は、第５の発明であって、制御部が第２命令を入力したとき、制御部は、二値基底行列設定部において、第２命令に基づく二値基底行列が設定されるように、二値基底行列設定部を制御する。
【００４３】
これにより、この二値化ニューラルネットワーク用プロセッサでは、第２命令を受け付けたとき、第２命令に従った上記処理を実行することができる。
【００４４】
第８の発明は、第５の発明であって、制御部が第３命令を入力したとき、制御部は、入力データの同一桁を抽出した２値データと二値基底行列との行列演算が実行されるように、重み演算処理部を制御する。
【００４５】
これにより、この二値化ニューラルネットワーク用プロセッサでは、第３命令を受け付けたとき、第３命令に従った上記処理を実行することができる。
【００４６】
第９の発明は、二値化ニューラルネットワーク用プロセッサで実行されるデータ処理方法であって、スケーリング係数ベクトル設定ステップと、二値基底行列設定ステップと、処理データサイズ設定ステップと、重み演算処理ステップと、を備える。
【００４７】
スケーリング係数ベクトル設定ステップは、実数ベクトルデータであるスケーリング係数ベクトルを設定する。
【００４８】
二値基底行列設定ステップは、「１」または「−１」をとる２値データを要素とする二値基底行列を設定する。
【００４９】
処理データサイズ設定ステップは、重み演算処理の対象となるデータを決定するための入力値ビット幅と同一桁処理ビット長を設定する。
【００５０】
重み演算処理ステップは、入力値ビット幅および同一桁処理ビット長に基づいて決定される重み演算処理の対象データを用いて、二値基底行列に基づく処理を実行することで、二値基底行列処理結果データを取得し、取得した二値基底行列処理結果データと、スケーリング係数ベクトルとを用いた乗算処理を実行することで、乗算結果データを取得する。
【００５１】
これにより、第１の発明と同様の効果を奏するデータ処理方法を実現することができる。
【００５２】
第１０の発明は、第９の発明であるデータ処理方法をコンピュータに実行させるためのプログラムである。
【００５３】
これにより、第１の発明と同様の効果を奏するデータ処理方法をコンピュータに実行させるためのプログラム実現することができる。
【発明の効果】
【００５４】
本発明によれば、再学習を必要とせず、組み込み機器やモバイル機器等の低スペックのデバイス（例えば、エッジ端末）において、高性能なコンパクト化したモデルを搭載することができる二値化ニューラルネットワーク用プロセッサ、データ処理方法、および、プログラムを実現することができる。
【図面の簡単な説明】
【００５５】
【図１】第１実施形態に係る二値化ニューラルネットワーク用プロセッサ１０００の概略構成図。
【図２】第１実施形態に係る第１重み演算部２１の概略構成図。
【図３】第１実施形態に係る第ｋ重み演算部２ｋ１の概略構成図。
【図４】第１実施形態に係る内積演算部２１１の概略構成図。
【図５】第１実施形態に係る第１ビットカウンタＢｃ１の概略構成図。
【図６】第１実施形態に係るフレキシブル多項加算部２１１２の概略構成図。
【図７】ＣＮＮの重み演算処理を、マトリックスで表現した図（上図）と、二値化ニューラルネットワークの重み演算処理を、マトリックスで表現した図（下図）とを示す図。
【図８】スケーリング係数ベクトルｖ＿ｃ（＝［ｃ１，ｃ２，・・・，ｃ６］）、および、二値基底行列Ｍの設定処理を説明するための図。
【図９】データＤｉｎ（＝ｖ＿ｘ）と行列Ｍの一部とを示した図。
【図１０】データＤｉｎ（＝ｖ＿ｘ）と行列Ｍの一部とを示した図。
【図１１】データＤｉｎ（＝ｖ＿ｘ）と行列Ｍの一部とを示した図。
【図１２】ｍ＝２４の場合のデータＤｉｎ（＝ｖ＿ｘ）と行列Ｍの一部（第１行のデータ）とを示した図。
【図１３】処理対象データと、フレキシブル多項加算部２１１２でのシフト、加算処理とを説明するための図。
【図１４】ＣＰＵバス構成を示す図。
【発明を実施するための形態】
【００５６】
［第１実施形態］
第１実施形態について、図面を参照しながら、以下、説明する。
【００５７】
＜１．１：二値化ニューラルネットワーク用プロセッサの構成＞
図１は、第１実施形態に係る二値化ニューラルネットワーク用プロセッサ１０００の概略構成図である。
【００５８】
図２は、第１実施形態に係る第１重み演算部２１の概略構成図である。
【００５９】
図３は、第１実施形態に係る第ｋ重み演算部２ｋ１の概略構成図である。
【００６０】
図４は、第１実施形態に係る内積演算部２１１の概略構成図である。
【００６１】
図５は、第１実施形態に係る第１ビットカウンタＢｃ１の概略構成図である。
【００６２】
図６は、第１実施形態に係るフレキシブル多項加算部２１１２の概略構成図である。
【００６３】
二値化ニューラルネットワーク用プロセッサ１０００は、図１に示すように、重み演算処理部１００と、制御部Ｃ１と、スケーリング係数ベクトル設定部ＳＴ１と、二値基底行列設定部ＳＴ２と、処理データサイズ設定部ＳＴ３とを備える。
【００６４】
重み演算処理部１００は、図１に示すように、入力変換部１と、重み演算部２と、加算部３とを備える。
【００６５】
入力変換部１は、入力データＤｉｎ（＝ｖ＿ｘ（＝［ｘ１，ｘ２，・・・，ｘｍ］））と、処理データサイズ設定部ＳＴ３から出力される入力値ビット幅ｂｉｔ＿ｗｉｄｔｈと、処理データサイズ設定部ＳＴ３から出力される同一桁処理ビット長ｂｉｔ＿ｌｅｎと、を入力する。入力変換部１は、入力値ビット幅ｂｉｔ＿ｗｉｄｔｈと同一桁処理ビット長ｂｉｔ＿ｌｅｎとに基づいて、入力データＤｉｎを、重み演算部２で処理するデータ形式のデータに変換する。そして、入力変換部１は、変換後のデータをデータＤｉ［１：ｍ］として、重み演算部２に出力する。
【００６６】
重み演算部２は、図１に示すように、第１重み演算部２１、第２重み演算部２２、・・・、および、第６重み演算部２６を備える。
【００６７】
第１重み演算部２１は、図２に示すように、内積演算部２１１と、乗算部２１２とを備える。
【００６８】
内積演算部２１１は、データＤｉ［１：ｍ］と、二値基底行列設定部により設定された二値基底行列Ｍの第１行であるＭ１とを入力する。内積演算部２１１は、データＤｉ［１：ｍ］と、二値基底行列Ｍの第１行Ｍ１とを用いて内積処理を行い、内積処理の結果をデータＤ２１０（＝Ｍ１・ｖ＿ｘ）として、乗算部２１２に出力する。
【００６９】
乗算部２１２は、内積演算部２１１から出力されるデータＤ２１０（＝Ｍ１・ｖ＿ｘ）と、スケーリング係数ベクトル設定部ＳＴ１により設定されたスケーリング係数ベクトルｖ＿ｃ（＝［ｃ１，ｃ２，・・・，ｃ６］）の第１スケーリング係数ｃ１とを入力する。乗算部２１２は、データＤ２１０（＝Ｍ１・ｖ＿ｘ）と第１スケーリング係数ｃ１とを用いて乗算処理を実行し、処理結果をデータＤ２１（＝ｃ１×（Ｍ１・ｖ＿ｘ））として加算部３に出力する。
【００７０】
なお、説明便宜のため、スケーリング係数ベクトルの６次元のベクトル、すなわち、スケーリング係数を６個であるものとして、以下、説明する。なお、スケーリング係数ベクトルの次元は、６次元以外であってもよい。
【００７１】
第２重み演算部２２〜第６重み演算部２６は、それぞれ、第１重み演算部２１と同様の構成を有している。第ｋ重み演算部２ｋ（ｋ：自然数、１≦ｋ≦６）は、図３に示すように、データＤｉ［１：ｍ］と、二値基底行列設定部により設定された二値基底行列Ｍの第ｋ行であるＭｋと、スケーリング係数ベクトルｖ＿ｃ（＝［ｃ１，ｃ２，・・・，ｃ６］）の第ｋスケーリング係数ｃｋとを入力する。そして、第ｋ重み演算部２ｋは、第１重み演算部２１と同様の処理を実行し、データＤ２ｋを取得し、取得したデータＤ２ｋを加算部３に出力する。
【００７２】
なお、以下では、第ｋ重み演算部２ｋの構成は、第１重み演算部２１の構成と同様であるため、第１重み演算部２１の構成について説明する。
【００７３】
第１重み演算部２１の内積演算部２１１は、図４に示すように、ビットカウンタ部２１１１と、フレキシブル多項加算部２１１２と、累算部２１１３とを備える。
【００７４】
ビットカウンタ部２１１１は、図４に示すように、６個のビットカウンタである第１ビットカウンタＢｃ１、第２ビットカウンタＢｃ２、・・・、および、第６ビットカウンタＢｃ６を備える。
【００７５】
第ｋビットカウンタＢｃｋ（ｋ：自然数、１≦ｋ≦６）は、データＤｉ［１：ｍ］と、二値基底行列設定部により設定された二値基底行列Ｍの第１行であるＭ１とを入力する。そして、第ｋビットカウンタＢｃｋは、カウント処理を実行し、処理結果をデータＣｎｔ＿ｂｋ（ｋ：自然数、１≦ｋ≦６）としてフレキシブル多項加算部２１１２に出力する。
【００７６】
フレキシブル多項加算部２１１２は、ビットカウンタ部２１１１から出力される６個のデータ（データＣｎｔ＿ｂ１〜Ｃｎｔ＿ｂ６）を入力し、当該６個のデータを用いて加算処理を実行し、処理結果をデータＳｕｍ１として、累算部２１１３に出力する。
【００７７】
累算部２１１３は、フレキシブル多項加算部２１１２から出力されるデータＳｕｍ１を入力し、当該データＳｕｍ１を用いて累算処理ｗを実行し、処理結果をデータＤ２１０（＝Ｍ１・ｖ＿ｘ）として、乗算部２１２に出力する。
【００７８】
第１ビットカウンタＢｃ１は、図５に示すように、ＡＮＤ処理部Ｂｃ１０１と、第１正値並列一括ビットカウンタＢｃ１０２と、ビットシフト部Ｂｃ１０３と、第２正値並列一括ビットカウンタＢｃ１０４と、減算部Ｂｃ１０５とを備える。
【００７９】
ＡＮＤ処理部Ｂｃ１０１は、データＤｉ［１：ｍ］と、二値基底行列Ｍの第１行のデータＭ１とを入力し、データＤｉ［１：ｍ］とデータＭ１とを用いてＡＮＤ処理を実行し、処理結果をデータＢｃＤ１として、第１正値並列一括ビットカウンタＢｃ１０２に出力する。
【００８０】
第１正値並列一括ビットカウンタＢｃ１０２は、ＡＮＤ処理部から出力されるデータＢｃＤ１を入力し、データＢｃＤ１を用いて正値並列一括ビットカウント処理を実行し、処理結果をデータＢｃＤ２としてビットシフト部Ｂｃ１０３に出力する。
【００８１】
ビットシフト部Ｂｃ１０３は、第１正値並列一括ビットカウンタＢｃ１０２から出力されるデータＢｃＤ２を入力し、データＢｃＤ２を用いてビットシフト処理を実行し、処理結果をデータＢｃＤ３として減算部Ｂｃ１０５に出力する。
【００８２】
第２正値並列一括ビットカウンタＢｃ１０４は、データＤｉ［１：ｍ］を入力し、データＤｉ［１：ｍ］を用いて正値並列一括ビットカウント処理を実行し、処理結果をデータＢｃＤ４として減算部Ｂｃ１０５に出力する。
【００８３】
減算部Ｂｃ１０５は、ビットシフト部Ｂｃ１０３から出力されるデータＢｃＤ３と、第２正値並列一括ビットカウンタＢｃ１０４から出力されるデータＢｃＤ４とを入力する。減算部Ｂｃ１０５は、データＢｃＤ３とデータＢｃＤ４とを用いて減算処理を実行し、処理結果をデータＣｎｔ＿ｂ１としてフレキシブル多項加算部２１１２に出力する。
【００８４】
フレキシブル多項加算部２１１２は、図６に示すように、設定部ＦＬＡ１１と、第１シフト部ＳＦ１、第２シフト部ＳＦ２、・・・、および、第１１シフト部ＳＦ１１と、多項加算部ＦＬＡ１２とを備える。
【００８５】
設定部ＦＬＡ１１は、処理データサイズ設定部ＳＴ３から出力される入力値ビット幅ｂｉｔ＿ｗｉｄｔｈと、処理データサイズ設定部ＳＴ３から出力される同一桁処理ビット長ｂｉｔ＿ｌｅｎと、を入力する。設定部ＦＬＡ１１は、入力値ビット幅ｂｉｔ＿ｗｉｄｔｈと同一桁処理ビット長ｂｉｔ＿ｌｅｎとに基づいて、第１〜第１１シフト部に設定するビットシフト量を決定し、決定したビットシフト量のビットシフト演算が、第１〜第１１シフト部で実行されるように、ビットシフト量を示すデータＳｆｔ１〜Ｓｆｔ１１を、それぞれ、第１〜第１１シフト部に出力する。
【００８６】
第１ビットシフト部ＳＦ１は、第２ビットカウンタＢｃ２から出力されるデータＣｎｔ＿ｂ２と、設定部ＦＬＡ１１から出力されるビットシフト量を示すデータＳｆｔ１とを入力する。第１ビットシフト部ＳＦ１は、ビットシフト量を示すデータＳｆｔ１に基づいて、データＣｎｔ＿ｂ２に対してビットシフト処理を行い、処理結果をデータＤｏ２として多項加算部ＦＬＡ１２に出力する。
【００８７】
なお、第２シフト部ＳＦ２〜第１１シフト部ＳＦ１１は、第１ビットシフト部ＳＦ１と同様の構成である。
【００８８】
つまり、第（ｋ−１）シフト部ＳＦｋ−１（ｋ：自然数、２≦ｋ≦１２）は、第ｋビットカウンタＢｃｋから出力されるデータＣｎｔ＿ｂｋと、設定部ＦＬＡ１１から出力されるビットシフト量を示すデータＳｆｔ（ｋ−１）とを入力する。第（ｋ−１）ビットシフト部ＳＦ（ｋ−１）は、ビットシフト量を示すデータＳｆｔ（ｋ−１）に基づいて、データＣｎｔ＿ｂｋに対してビットシフト処理を行い、処理結果をデータＤｏｋとして多項加算部ＦＬＡ１２に出力する。
【００８９】
多項加算部ＦＬＡ１２は、第１ビットカウンタＢｃ１から出力されるデータＣｎｔ＿ｂ１（＝Ｄｏ１）と、第１シフト部ＳＦ１〜第１１シフト部ＳＦ１１から出力されるデータＤｏ２〜Ｄｏ１２とを入力する。多項加算部ＦＬＡ１２は、データＤｏ１〜Ｄｏ１２を用いて加算処理を実行し、処理結果をデータＳｕｍ１として、累算部２１１３に出力する。
【００９０】
累算部２１１３は、フレキシブル多項加算部２１１２から出力されるデータＳｕｍ１を入力し、データＳｕｍ１を用いて、累算処理を実行し、処理結果をデータＤ２１０（＝Ｍ１・ｖ＿ｘ）として、乗算部２１２に出力する。
【００９１】
加算部３は、図１に示すように、重み演算部２から出力されるデータＤ２１（＝ｃ１×（Ｍ１・ｖ＿ｘ））、データＤ２２（＝ｃ２×（Ｍ２・ｖ＿ｘ））、・・・、データＤ２６（＝ｃ６×（Ｍ６・ｖ＿ｘ））を入力し、それらのデータを用いて加算処理を実行する。そして、加算部３は、処理結果をデータＤｏｕｔとして出力する。
【００９２】
＜１．２：二値化ニューラルネットワーク用プロセッサの動作＞
以上のように構成された二値化ニューラルネットワーク用プロセッサ１０００の動作について、以下、説明する。
【００９３】
一般に、ＣＮＮでは、入力層と、畳み込み層（コンボリューション層）と、全結合層とを含む。
【００９４】
ＣＮＮでは、畳み込み層の処理、あるいは、全結合層の処理において、入力データに対して重み演算処理が実行され、当該処理結果に対して活性化関数（例えば、シグモイド関数やＳｏｆｔｍａｘ関数）により処理が実行されることで、畳み込み層あるいは全結合層の出力が得られる。
【００９５】
図７は、ＣＮＮの重み演算処理を、マトリックスで表現した図（上図）と、二値化ニューラルネットワークの重み演算処理を、マトリックスで表現した図（下図）とを示している。
【００９６】
図７の上図に示すように、ＣＮＮの重み演算処理では、各要素ｗｉｊが実数である行列Ｗ（ｎ×ｍの行列）と、入力データ（ベクトルｖ＿ｘ（１×ｍの行列））との行列の積を求めることで、出力データｙ（１×ｍの行列）が取得される。
【００９７】
一方、二値化ニューラルネットワークの重み演算処理では、図７の下図に示すように、（１）各要素が実数であるスケーリング係数ベクトルｖ＿ｃ（＝［ｃ１，ｃ２，・・・，ｃ６］）と、（２）各要素が「−１」または「１」である二値基底行列Ｍと、（３）入力データｖ＿ｘ（＝［ｘ１，ｘ２，・・・，ｘｍ］）との行列の積を求めることで、出力データｙ１が取得される。そして、上記と同様の処理を、ｙ２〜ｙｎに対して行うことで、出力データｙ（１×ｍの行列）が取得される。
【００９８】
このように、二値化ニューラルネットワークの重み演算処理では、ＣＮＮの重み演算処理の重み付け係数を表す行列Ｗ（要素ｗｉｊは実数）を、（１）各要素が実数であるスケーリング係数ベクトルｖ＿ｃ（＝［ｃ１，ｃ２，・・・，ｃ６］）と、（２）各要素が「−１」または「１」である二値基底行列Ｍとで表現する（スケーリング係数ベクトルと二値基底行列とにベクトル分解する）。つまり、二値化ニューラルネットワークの重み演算処理では、重み演算処理の大部分をビット演算処理にし、ごく少数の実数演算（スケーリング係数ベクトルを用いた乗算処理）を行うことで、重み演算処理を、ハードウェア規模の増大を抑えつつ、高精度で実行する。このような処理を実行する二値化ニューラルネットワーク用プロセッサ１０００の動作について、以下、図面を参照しながら説明する。
【００９９】
（１．２．１：設定処理）
まず、スケーリング係数ベクトルｖ＿ｃ（＝［ｃ１，ｃ２，・・・，ｃ６］）、および、二値基底行列Ｍの設定処理について、説明する。
【０１００】
図８は、スケーリング係数ベクトルｖ＿ｃ（＝［ｃ１，ｃ２，・・・，ｃ６］）、および、二値基底行列Ｍの設定処理を説明するための図である。なお、説明便宜のため、ｍ＝８としている。
【０１０１】
例えば、大規模システムにおいて、学習が実行され、重み行列Ｗが取得された場合において、図８に示すように、重み行列Ｗの第１行目のデータが
［ｗ１１，ｗ１２，ｗ１３，ｗ１４，ｗ１５，ｗ１６，ｗ１７，ｗ１８］
＝［４４，−１９．８，−２５．６，１４．６，２６．４，−２５．６，４４，−２５．６］
である場合、図８の下段に示す値に、スケーリング係数ベクトルｖ＿ｃおよび二値基底行列Ｍを設定すれば、大規模システムでの学習により取得された重み行列Ｗの第１行目のデータを再現（近似）することができる。
【０１０２】
同様に、重み行列Ｗの第ｋ行目のデータ（パラメータ）を近似するスケーリング係数ベクトルｖ＿ｃおよび二値基底行列Ｍが取得できる。
【０１０３】
このようにして、大規模システムでの学習済みモデルのパラメータ（重み付けデータ）を近似するスケーリング係数ベクトルｖ＿ｃおよび二値基底行列Ｍを取得し、取得したスケーリング係数ベクトルｖ＿ｃおよび二値基底行列Ｍを、それぞれ、スケーリング係数ベクトル設定部ＳＴ１および二値基底行列設定部ＳＴ２に入力する。
【０１０４】
スケーリング係数ベクトル設定部ＳＴ１は、上記により入力されたスケーリング係数ベクトルのデータを保持し、スケーリング係数ｃｋを重み演算部２の第ｋ重み演算部２ｋに出力する。
【０１０５】
二値基底行列設定部ＳＴ２は、上記により入力された二値基底行列Ｍのデータを保持し、二値基底行列Ｍの第ｋ行のデータＭｋを重み演算部２の第ｋ重み演算部２ｋに出力する。
【０１０６】
（１．２．２：重み演算処理）
次に、重み演算処理について、説明する。
【０１０７】
所定のレンジ内のデータであるデータＤｉｎ（例えば、６ビットのデータ）が重み演算処理部１００の入力変換部１に入力される。説明便宜のため、データＤｉｎ（＝ｖ＿ｘ（＝［ｘ１，ｘ２，・・・，ｘｍ］））は、６ビットのデータ（ｘｋ）をｍ個含むベクトルであるものとする。なお、以下では、説明便宜のため、ｍ＝８として説明する。
【０１０８】
入力変換部１は、処理データサイズ設定部ＳＴ３から出力される入力値ビット幅ｂｉｔ＿ｗｉｄｔｈと、処理データサイズ設定部ＳＴ３から出力される同一桁処理ビット長ｂｉｔ＿ｌｅｎとに基づいて、入力データＤｉｎを、重み演算部２で処理するデータ形式のデータに変換する。
【０１０９】
以下では、一例として、入力変換部１が、
ｂｉｔ＿ｗｉｄｔｈ＝６ビット
ｂｉｔ＿ｌｅｎ＝８ビット
と設定した場合について、説明する。つまり、図９に示す６ビット×８ビット＝４８ビットのデータ（ｘ１〜ｘ８に相当）が処理対象の単位データとなる。
【０１１０】
また、図９に示すように、データＤｉｎ（＝ｖ＿ｘ（＝［ｘ１，ｘ２，・・・，ｘｍ］））は、一例として、
［ｘ１，ｘ２，ｘ３，ｘ４，ｘ５，ｘ６，ｘ７，ｘ８］
＝［１５，１４，１３，１５，６，３，４，１］
であるものとして、以下、説明する。
【０１１１】
第１重み演算部２１の内積演算部２１１には、図９、図１０に示すデータＤｉ［１：ｍ］（６ビット×８ビット＝４８ビットのデータ（ｘ１〜ｘ８に相当））が入力される。
【０１１２】
具体的には、図１０に示すように、第１〜第１２ビットカウンタには、以下のデータが入力される。
第１ビットカウンタＢｃ１の入力：Ｄ１［１：４］
第２ビットカウンタＢｃ２の入力：Ｄ１［５：８］
第３ビットカウンタＢｃ３の入力：Ｄ２［１：４］
第４ビットカウンタＢｃ４の入力：Ｄ２［５：８］
第５ビットカウンタＢｃ５の入力：Ｄ３［１：４］
第６ビットカウンタＢｃ６の入力：Ｄ３［５：８］
第７ビットカウンタＢｃ７の入力：Ｄ４［１：４］
第８ビットカウンタＢｃ８の入力：Ｄ４［５：８］
第９ビットカウンタＢｃ９の入力：Ｄ５［１：４］
第１０ビットカウンタＢｃ１０の入力：Ｄ５［５：８］
第１１ビットカウンタＢｃ１１の入力：Ｄ６［１：４］
第１２ビットカウンタＢｃ１２の入力：Ｄ６［５：８］
なお、Ｄｋ［ａ１：ａ２］は、図９、図１０に示した６ビット×８ビット＝４８ビットのデータ（ｘ１〜ｘ８に相当）において、右から第ｋ列目のａ１行目からａ２行目までのデータ（ビット列）を表すものとする。
【０１１３】
第１〜第１２ビットカウンタは、同様の動作をするため、ここでは、第１ビットカウンタＢｃ１の動作について説明する。
【０１１４】
図５に示すように、第１ビットカウンタＢｃ１には、データＤｉ［１：ｍ］と、二値基底行列Ｍの第１行のデータＭ１とが入力される。第１ビットカウンタＢｃ１は、４ビットデータを処理するカウンタであるので、第１ビットカウンタＢｃ１のＡＮＤ処理部Ｂｃ１０１には、Ｄ１［１：４］（＝［１，０，１，１］）とデータＭ１の上位４ビット分のデータ（図１１に示したデータＭ１の上位４ビット分のデータ（＝［１，−１，−１，１］））とが入力される。そして、ＡＮＤ処理部Ｂｃ１０１は、Ｄ１［１：４］（＝［１，０，１，１］）とデータＭ１の上位４ビット分のデータ（＝［１，−１，−１，１］）のビットごとのＡＮＤ処理を実行する。なお、このビットごとのＡＮＤ処理は、両者が「１」である場合以外は、出力を「０」とする。つまり、いずれかのデータが「−１」である場合、ＡＮＤ処理の出力は「０」とする。
【０１１５】
ＡＮＤ処理部Ｂｃ１０１は、上記処理を実行することで、図１１に示すように、処理結果データＢｃＤ１（＝［１，０，０，１］）を取得する。
【０１１６】
第１正値並列一括ビットカウンタＢｃ１０２は、ＡＮＤ処理部Ｂｃ１０１の処理結果データＢｃＤ１に含まれる「１」の数をカウントし、カウント値をデータＢｃＤ２としてビットシフト部Ｂｃ１０３に出力する。上記の場合、カウント値は「２」であるので、第１正値並列一括ビットカウンタＢｃ１０２は、ＢｃＤ２＝２として、データＢｃＤ２をビットシフト部Ｂｃ１０３に出力する。
【０１１７】
ビットシフト部Ｂｃ１０３は、データＢｃＤ２を入力し、データＢｃＤ２を左方向へ１ビットシフトする、つまり、データＢｃＤ２を２倍にする処理を行う。そして、処理結果データＢｃＤ３（＝２×ＢｃＤ２＝４）を減算部Ｂｃ１０５に出力する。
【０１１８】
第２正値並列一括ビットカウンタＢｃ１０４は、Ｄ１［１：４］（＝［１，０，１，１］）の「１」の数をカウントし、カウント値（＝３）をデータＢｃＤ４（＝３）として、減算部Ｂｃ１０５に出力する。
【０１１９】
減算部Ｂｃ１０５は、
Ｃｎｔ＿ｂ１＝ＢｃＤ３−ＢｃＤ４
に相当する減算処理を実行し、処理結果データＣｎｔ＿ｂ１を取得する。上記の場合、
Ｃｎｔ＿ｂ１＝ＢｃＤ３−ＢｃＤ４＝４−３＝１
であるので、減算部Ｂｃ１０５は、Ｃｎｔ＿ｂ１（＝１）をフレキシブル多項加算部２１１２に出力する。
【０１２０】
上記のように、第１ビットカウンタＢｃ１では、Ｄ１［１：４］とデータＭ１の上位４ビットにおいて、ビットごとのＡＮＤ処理、つまり、双方のビットが「１」であるビットのみ「１」とする処理を行い、出力結果データのビット列に含まれる「１」の数をカウントし、当該カウント値の２倍の値ＢｃＤ３を取得する。そして、第１ビットカウンタＢｃ１では、Ｄ１［１：４］のビット列に含まれる「１」の数をデータＢｃＤ４として取得し、Ｃｎｔ＿ｂ１＝ＢｃＤ３―ＢｃＤ４により、出力値Ｃｎｔ＿ｂ１を取得する。つまり、第１ビットカウンタＢｃ１では、上記のように処理することで、「−１」を乗算する処理を行うことなく、データＤ１［１：４］とデータＭ１の上位４ビットとの内積の値を取得することができる。
【０１２１】
第２ビットカウンタＢｃ２では、Ｄ１［５：８］とデータＭ１の下位４ビット（＝［１，−１，１，−１］）とを用いて、上記と同様の処理が実行され、Ｃｎｔ＿ｂ２＝−２が取得される。
【０１２２】
また、第３ビットカウンタＢｃ３〜第１２ビットカウンタＢｃ１２においても、上記と同様の処理が実行され、データＣｎｔ＿ｂ３〜Ｃｎｔ＿ｂ１２が取得される。
【０１２３】
上記のようにして取得されたデータＣｎｔ＿ｂ１は、図６に示すように、多項加算部ＦＬＡ１２に出力され、データＣｎｔ＿ｂ２〜Ｃｎｔ＿ｂ１２は、それぞれ、第１シフト部ＳＦ１〜第１１シフト部ＳＦ１１に出力される。
【０１２４】
設定部ＦＬＡ１１は、入力値ビット幅ｂｉｔ＿ｗｉｄｔｈと同一桁処理ビット長ｂｉｔ＿ｌｅｎとに基づいて、第１〜第１１シフト部に設定するビットシフト量を決定し、決定したビットシフト量のビットシフト演算が、第１〜第１１シフト部で実行されるように、ビットシフト量を示すデータＳｆｔ１〜Ｓｆｔ１１を、それぞれ、第１〜第１１シフト部に出力する。
【０１２５】
本実施形態では、ｂｉｔ＿ｗｉｄｔｈ＝６、ｂｉｔ＿ｌｅｎ＝８であり、第１ビットカウンタＢｃ１〜第１２ビットカウンタＢｃ１２が、それぞれ４ビットのデータ処理を行っているので、以下のようにシフト量が設定される。
第１シフト部ＳＦ１のシフト量＝０ビット（Ｄｏ２＝Ｃｎｔ＿ｂ２）
第２シフト部ＳＦ１のシフト量＝左へ１ビット（Ｄｏ３＝Ｃｎｔ＿ｂ３×２）
第３シフト部ＳＦ１のシフト量＝左へ１ビット（Ｄｏ４＝Ｃｎｔ＿ｂ４×２）
第４シフト部ＳＦ１のシフト量＝左へ２ビット（Ｄｏ５＝Ｃｎｔ＿ｂ５×２＾２）
第５シフト部ＳＦ１のシフト量＝左へ２ビット（Ｄｏ６＝Ｃｎｔ＿ｂ６×２＾２）
第６シフト部ＳＦ１のシフト量＝左へ３ビット（Ｄｏ７＝Ｃｎｔ＿ｂ７×２＾３）
第７シフト部ＳＦ１のシフト量＝左へ３ビット（Ｄｏ８＝Ｃｎｔ＿ｂ８×２＾３）
第８シフト部ＳＦ１のシフト量＝左へ４ビット（Ｄｏ９＝Ｃｎｔ＿ｂ９×２＾４）
第９シフト部ＳＦ１のシフト量＝左へ４ビット（Ｄｏ１０＝Ｃｎｔ＿ｂ１０×２＾４）
第１０シフト部ＳＦ１のシフト量＝左へ５ビット（Ｄｏ１１＝Ｃｎｔ＿ｂ１１×２＾５）
第１１シフト部ＳＦ１のシフト量＝左へ５ビット（Ｄｏ１２＝Ｃｎｔ＿ｂ１２×２＾５）
そして、上記括弧内で示した数式に相当する処理が実行され、データＤｏ２〜Ｄｏ１２が、それぞれ、第１シフト部ＳＦ１〜第１１シフト部ＳＦ１１から多項加算部ＦＬＡ１２に出力される。
【０１２６】
多項加算部ＦＬＡ１２では、データＤｏ１（＝Ｃｎｔ＿ｂ１）とデータＤｏ２〜Ｄｏ１２との加算処理が実行され、その処理結果データＳｕｍ１が取得される。
【０１２７】
このデータＳｕｍ１は、図７に示した行列Ｍの第１行のデータＭ１（＝［ｂ１１，ｂ１２，ｂ１３，ｂ１４，ｂ１５，ｂ１６，ｂ１７，ｂ１８，］）と、データｖ＿ｘ（＝［ｘ１，ｘ２，ｘ３，ｘ４，ｘ５，ｘ６，ｘ７，ｘ８，］）との内積をとった値と等しくなる。
【０１２８】
つまり、重み演算処理部１００で実行される上記処理は、下記数式に相当する。
【数１】
2018190197.tif 000003
なお、Ｍ１［１：４］は、行列Ｍの第１行のデータＭ１の上位４ビットのデータを表しており、Ｍ１［５：８］は、行列Ｍの第１行のデータＭ１の下位４ビットのデータを表している。例えば、図９の場合、Ｍ１［１：４］＝［１，−１，−１，１］であり、Ｍ１［５：８］＝［１，−１，１，−１］である。
【０１２９】
以上の処理により取得されたデータＳｕｍ１は、フレキシブル多項加算部２１１２の多項加算部ＦＬＡ１２から累算部２１１３に出力される。
【０１３０】
累算部２１１３では、フレキシブル多項加算部２１１２で取得されるデータＳｕｍ１を保持することができ、複数のＳｕｍ１を保持し、所定のタイミングで、保持している複数のデータＳｕｍ１の合計値（累算値）を取得することができる。
【０１３１】
上記の場合（ｍ＝８の場合）は、Ｓｕｍ１が、行列Ｍの第１行のデータＭ１（＝［ｂ１１，ｂ１２，ｂ１３，ｂ１４，ｂ１５，ｂ１６，ｂ１７，ｂ１８，］）と、データｖ＿ｘ（＝［ｘ１，ｘ２，ｘ３，ｘ４，ｘ５，ｘ６，ｘ７，ｘ８，］）との内積をとった値と等しいので、累算部２１１３は、
Ｄ２１０＝Ｓｕｍ１＝Ｍ１・ｖ＿ｘ
として、データＤ２１０を、乗算部２１２に出力する。
【０１３２】
例えば、図１２に示すように、ｍ＝２４の場合、上記処理が３回実行される。そして、図１２に示すように、１回目の処理で累算部２１１３により取得されたデータをＳｕｍ１（１）とし、２回目の処理で累算部２１１３により取得されたデータをＳｕｍ１（２）とし、３回目の処理で累算部２１１３により取得されたデータをＳｕｍ１（３）とすると、累算部２１１３は、データＳｕｍ（１）、データＳｕｍ（２）を保持し、データＳｕｍ（３）が取得されたタイミングで、累算処理を実行する、すなわち、
Ｄ２１０＝Ｓｕｍ１（１）＋Ｓｕｍ１（２）＋Ｓｕｍ１（３）（＝Ｍ１・ｖ＿ｘ）
に相当する処理を実行する。これにより、Ｍ１・ｖ＿ｘと等しいデータＤ２１０が取得される。
【０１３３】
このように、累算部２１１３で、複数のＳｕｍ１を保持することで、ｍが大きな数である場合、すなわち、二値基底行列Ｍ（例えば、図７を参照）の列の数が多い場合であっても、Ｍ１・ｖ＿ｘと等しいデータＤ２１０を取得することができる。
【０１３４】
また、累算部２１１３により、乗算部２１２の乗算結果を待つことなく、連続して、Ｓｕｍ１（１）、Ｓｕｍ（２）、Ｓｕｍ（３）、・・・の処理を実行することができるので、パイプライン処理と同様に、重み演算処理全体の処理速度を向上させることができる。
【０１３５】
また、累算部２１１３に、一時的にデータを保持するバッファを設け、累算結果を取得するためのデータを一時的に待避させ、時分割処理により、積算結果データを取得できるようにしてもよい。このようにすることで、例えば、小規模のハードウェアにより、累算部２１１３を実現することも可能となる。
【０１３６】
乗算部２１２では、内積演算部２１１から出力されるデータＤ２１０（＝Ｍ１・ｖ＿ｘ）と、スケーリング係数ｃ１との乗算処理が実行され、データＤ２１（＝ｃ１×Ｄ２１０＝ｃ１×Ｍ１・ｖ＿ｘ）が取得される。そして、取得されたデータＤ２１は、第１重み演算部２１から加算部３に出力される。
【０１３７】
第２重み演算部２２においても、上記と同様に処理が実行され、データＤ２２（＝ｃ２×Ｍ２・ｖ＿ｘ）が取得される。そして、取得されたデータＤ２２は、第２重み演算部２２から加算部３に出力される。
【０１３８】
第ｋ重み演算部２ｋにおいても、上記と同様に処理が実行され、データＤ２ｋ（＝ｃｋ×Ｍｋ・ｖ＿ｘ）が取得される。そして、取得されたデータＤ２ｋは、第ｋ重み演算部２ｋから加算部３に出力される。
【０１３９】
加算部３は、重み演算部２から出力されるデータＤ２１〜Ｄ２６を入力し、
Ｄｏｕｔ＝Ｄ２１＋Ｄ２２＋Ｄ２３＋Ｄ２４＋Ｄ２５＋Ｄ２６
に相当する処理を実行することで、データＤｏｕｔを出力する。
【０１４０】
これにより、図７に示したデータｙ１を取得することができる。
【０１４１】
また、上記と同様に処理を実行することで、重み演算処理部１００により、データｙ２〜ｙｎを取得することができる。
【０１４２】
なお、二値化ニューラルネットワーク用プロセッサ１０００において、重み演算処理部１００を複数設けて、データｙ１〜ｙｎの取得処理を並列に実行するようにしてもよい。
【０１４３】
以上のように、二値化ニューラルネットワーク用プロセッサ１０００では、重み演算処理の大部分を、二値基底行列Ｍを用いたビット演算処理にし、ごく少数の実数演算（スケーリング係数ベクトルを用いた乗算処理）を行う。したがって、二値化ニューラルネットワーク用プロセッサ１０００では、重み演算処理を、ハードウェア規模の増大を抑えつつ、高精度で実行することができる。
【０１４４】
また、図１３に示すように、入力変換部１において、処理対象データのサイズを上記以外のものに設定し、重み演算処理部が重み演算処理を実行するようにしてもよい。
【０１４５】
例えば、図１３の右図に示すように、処理対象データのサイズを、ｂｉｔ＿ｗｉｄｔｈ＝４ビット、ｂｉｔ＿ｌｅｎ＝１２ビットとすると、第１シフト部ＳＦ１〜第１１シフト部ＳＦ１１において、以下のようにシフト量が設定される。
第１シフト部ＳＦ１のシフト量＝０ビット（Ｄｏ２＝Ｃｎｔ＿ｂ２）
第２シフト部ＳＦ１のシフト量＝０ビット（Ｄｏ３＝Ｃｎｔ＿ｂ３）
第３シフト部ＳＦ１のシフト量＝左へ１ビット（Ｄｏ４＝Ｃｎｔ＿ｂ４×２）
第４シフト部ＳＦ１のシフト量＝左へ１ビット（Ｄｏ５＝Ｃｎｔ＿ｂ５×２）
第５シフト部ＳＦ１のシフト量＝左へ１ビット（Ｄｏ６＝Ｃｎｔ＿ｂ６×２）
第６シフト部ＳＦ１のシフト量＝左へ２ビット（Ｄｏ７＝Ｃｎｔ＿ｂ７×２＾２）
第７シフト部ＳＦ１のシフト量＝左へ２ビット（Ｄｏ８＝Ｃｎｔ＿ｂ８×２＾２）
第８シフト部ＳＦ１のシフト量＝左へ２ビット（Ｄｏ９＝Ｃｎｔ＿ｂ９×２＾２）
第９シフト部ＳＦ１のシフト量＝左へ３ビット（Ｄｏ１０＝Ｃｎｔ＿ｂ１０×２＾３）
第１０シフト部ＳＦ１のシフト量＝左へ３ビット（Ｄｏ１１＝Ｃｎｔ＿ｂ１１×２＾３）
第１１シフト部ＳＦ１のシフト量＝左へ３ビット（Ｄｏ１２＝Ｃｎｔ＿ｂ１２×２＾３）
そして、上記括弧内で示した数式に相当する処理が実行され、データＤｏ２〜Ｄｏ１２が、それぞれ、第１シフト部ＳＦ１〜第１１シフト部ＳＦ１１から多項加算部ＦＬＡ１２に出力され、上記と同様の処理が実行される。
【０１４６】
このように、二値化ニューラルネットワーク用プロセッサ１０００では、入力値ビット幅ｂｉｔ＿ｗｉｄｔｈと、同一桁処理ビット長ｂｉｔ＿ｌｅｎとにより処理対象となるデータ（データ単位）を決定し、決定した処理対象データに対して、重み演算処理を実行することができる。
【０１４７】
また、二値化ニューラルネットワーク用プロセッサ１０００では、図１０に示すように、入力データであるｖ＿ｘの同一桁ビットをひとまとめにして、二値基底行列Ｍの第ｋ行とのビット演算処理を行うため、ｖ＿ｘの要素であるデータｘｉのビット長に関係なく、内積演算部で同一の処理により、内積演算結果データ（例えば、Ｄ２１０＝Ｍ１・ｖ＿ｘ）を取得することができる。
【０１４８】
このように、二値化ニューラルネットワーク用プロセッサ１０００では、入力データ（ｖ＿ｘ）のビット長に依存しないアーキテクチャにより、重み演算処理を実行することができる。
【０１４９】
さらに、二値化ニューラルネットワーク用プロセッサ１０００では、乗算部（例えば、乗算部２１２）により、実数であるスケーリング係数と内積演算結果データ（例えば、Ｄ２１０＝Ｍ１・ｖ＿ｘ）との乗算処理により、乗算結果データ（例えば、Ｄ２１＝ｃ１×Ｍ１・ｖ＿ｘ）を取得する。つまり、二値化ニューラルネットワーク用プロセッサ１０００では、重み演算処理のビット精度がどのようなものであっても、一定の誤差範囲に収まるように、実数であるスケーリング係数を調整することで、大規模システムで学習し取得した学習済みモデルのパラメータ（重み付けデータ）を用いたモデルに相当する重み演算処理を実現することができる。
【０１５０】
その結果、二値化ニューラルネットワーク用プロセッサ１０００では、再学習を必要とせず、コンパクト化したモデル（大規模システムで学習し取得した学習済みモデルの近似モデル）に相当する重み演算処理を実行することができる。
【０１５１】
したがって、二値化ニューラルネットワーク用プロセッサ１０００では、再学習を必要とせず、組み込み機器やモバイル機器等の低スペックのデバイス（例えば、エッジ端末）において、高性能なコンパクト化したモデルを搭載することができる。
【０１５２】
なお、二値化ニューラルネットワーク用プロセッサ１０００において、上記重み演算処理を実行させるためのプロセッサ命令を定義し、当該プロセッサ命令により、制御部Ｃ１（例えば、ＣＰＵ）が、二値化ニューラルネットワーク用プロセッサ１０００において、上記の重み演算処理を実行するようにしてもよい。
【０１５３】
例えば、（１）スケーリング係数ベクトルを設定するデータを設定（ロード）する命令と、（２）二値基底行列のデータ（「１」、「−１」の値をとる行列係数）を設定（ロード）する命令と、（３）入力データの同一桁を抽出した２値データ（例えば、図１０のＤｉ［１：ｍ］等）と二値基底行列との行列演算を実行する命令と、定義し、定義した当該命令を二値化ニューラルネットワーク用プロセッサ１０００において実行するようにしてもよい。
【０１５４】
［他の実施形態］
上記実施形態で説明に用いたデータのビット長やサイズは一例であり、上記の説明に用いたデータのビット長やサイズに限定されることはない。また、上記実施形態では、スケーリング係数ベクトル係数が６個の場合（スケーリング係数ベクトルが６次元ベクトルである場合）について説明したが、これに限定されることはなく、スケーリング係数ベクトル係数の個数は、任意のｎ個（ｎ：自然数）であってもよい（スケーリング係数ベクトルはｎ次元ベクトルであってもよい）。スケーリング係数ベクトルがｎ次元ベクトルである場合、スケーリング係数ベクトル設定部ＳＴ１が、ｎ個のスケーリング係数ベクトル係数を設定する機能を有し、重み演算部２が、第１重み演算部２１〜第ｎ重み演算部２ｎ（ｎ個の重み演算部）を備えるように、重み演算処理部を構成するようにすればよい。
【０１５５】
上記実施形態で説明した重み演算処理部１００において、各ブロックは、ＬＳＩなどの半導体装置により個別に１チップ化されても良いし、一部又は全部を含むように１チップ化されても良い。
【０１５６】
なお、ここでは、ＬＳＩとしたが、集積度の違いにより、ＩＣ、システムＬＳＩ、スーパーＬＳＩ、ウルトラＬＳＩと呼称されることもある。
【０１５７】
また、集積回路化の手法はＬＳＩに限るものではなく、専用回路又は汎用プロセサで実現してもよい。ＬＳＩ製造後に、プログラムすることが可能なＦＰＧＡ（Ｆｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）や、ＬＳＩ内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサーを利用しても良い。
【０１５８】
また、上記各実施形態の各機能ブロックの処理の一部または全部は、プログラムにより実現されるものであってもよい。そして、上記各実施形態の各機能ブロックの処理の一部または全部は、コンピュータにおいて、中央演算装置（ＣＰＵ）により行われる。また、それぞれの処理を行うためのプログラムは、ハードディスク、ＲＯＭなどの記憶装置に格納されており、ＲＯＭにおいて、あるいはＲＡＭに読み出されて実行される。
【０１５９】
また、上記実施形態の各処理をハードウェアにより実現してもよいし、ソフトウェア（ＯＳ（オペレーティングシステム）、ミドルウェア、あるいは、所定のライブラリとともに実現される場合を含む。）により実現してもよい。さらに、ソフトウェアおよびハードウェアの混在処理により実現しても良い。
【０１６０】
例えば、上記実施形態（変形例を含む）の各機能部を、ソフトウェアにより実現する場合、図１４に示したハードウェア構成（例えば、ＣＰＵ、ＲＯＭ、ＲＡＭ、入力部、出力部等をバスＢｕｓにより接続したハードウェア構成）を用いて、各機能部をソフトウェア処理により実現するようにしてもよい。
【０１６１】
また、上記実施形態における処理方法の実行順序は、必ずしも、上記実施形態の記載に制限されるものではなく、発明の要旨を逸脱しない範囲で、実行順序を入れ替えることができるものである。
【０１６２】
前述した方法をコンピュータに実行させるコンピュータプログラム及びそのプログラムを記録したコンピュータ読み取り可能な記録媒体は、本発明の範囲に含まれる。ここで、コンピュータ読み取り可能な記録媒体としては、例えば、フレキシブルディスク、ハードディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ、ＤＶＤ−ＲＯＭ、ＤＶＤ−ＲＡＭ、大容量ＤＶＤ、次世代ＤＶＤ、半導体メモリを挙げることができる。
【０１６３】
上記コンピュータプログラムは、上記記録媒体に記録されたものに限られず、電気通信回線、無線又は有線通信回線、インターネットを代表とするネットワーク等を経由して伝送されるものであってもよい。
【０１６４】
また、文言「部」は、「サーキトリー（ｃｉｒｃｕｉｔｒｙ）」を含む概念であってもよい。サーキトリーは、ハードウェア、ソフトウェア、あるいは、ハードウェアおよびソフトウェアの混在により、その全部または一部が、実現されるものであってもよい。
【０１６５】
なお、本発明の具体的な構成は、前述の実施形態に限られるものではなく、発明の要旨を逸脱しない範囲で種々の変更および修正が可能である。
【符号の説明】
【０１６６】
１０００  二値化ニューラルネットワーク用プロセッサ
１  入力変換部
２  重み演算部
２１  第１重み演算部
２２  第２重み演算部
２６  第６重み演算部
２１１  内積演算部
２１２  乗算部
２１１１  ビットカウンタ部
２１１２  フレキシブル多項加算部
２１１３  累算部
３  加算部
ＳＴ１  スケーリング係数ベクトル設定部
ＳＴ２  二値基底行列設定部
ＳＴ３  処理データサイズ設定部
Ｂｃ１０１  ＡＮＤ処理部
Ｂｃ１０２  第１正値並列一括ビットカウンタ
Ｂｃ１０３  ビットシフト部
Ｂｃ１０４  第２正値並列一括ビットカウンタ
Ｂｃ１０５  減算部
【図１】
2018190197.tif 000004
【図２】
2018190197.tif 000005
【図３】
2018190197.tif 000006
【図４】
2018190197.tif 000007
【図５】
2018190197.tif 000008
【図６】
2018190197.tif 000009
【図７】
2018190197.tif 000010
【図８】
2018190197.tif 000011
【図９】
2018190197.tif 000012
【図１０】
2018190197.tif 000013
【図１１】
2018190197.tif 000014
【図１２】
2018190197.tif 000015
【図１３】
2018190197.tif 000016
【図１４】
2018190197.tif 000017