(57)【要約】  本出願で開示されるのは、ニューラルネットワークなどの用途における畳み込み演算またはその他の行列乗算を加速するための技法である。コンピュータ実装方法は、記憶装置から畳み込み演算のための低精度入力を受け取ることと、差分値を生成するために低精度入力から高精度ゼロ値を表す低精度値を減算することであって、低精度入力が高精度入力から非対称に量子化される、ことと、を含む。本方法はまた、積和を生成するために差分値に対して積和演算を行うことと、積和をスケーリング係数でスケーリングすることによって高精度出力を生成することと、を含む。【選択図】図９
2021510888.tif 000002
【特許請求の範囲】
【請求項１】
畳み込み演算のための低精度入力を格納するように構成された記憶装置であって、前記低精度入力が非対称量子化を使用して高精度入力から生成される、記憶装置と、
前記記憶装置から前記低精度入力を受け取り、前記低精度入力から高精度ゼロ値を表す低精度値を減算することにより、差分値を作成するように構成された減算エンジンの配列と、
前記差分値を使用して積和を生成するように構成された処理要素（ＰＥ）配列であって、前記ＰＥ配列が複数行の処理要素を含み、各行の処理要素が対応する減算エンジンから差分値を受け取るように構成された、ＰＥ配列と、
前記積和をスケーリング係数によってスケーリングして高精度出力を生成するように構成された処理エンジンと
を含む装置。
【請求項２】
前記低精度入力がｎビット形式で前記記憶装置に格納され、
ｎが８の倍数である、
請求項１に記載の装置。
【請求項３】
前記高精度入力が３２ビットの浮動小数点入力を含み、
前記低精度入力が８ビットの符号なし整数を含み、
前記差分値が９ビットの符号付き整数を含む、
請求項２に記載の装置。
【請求項４】
前記非対称量子化において、
前記高精度入力の最小値が前記低精度入力におけるゼロ値として量子化され、
前記高精度入力の最大値が前記低精度入力における最大値として量子化され、
前記高精度入力のゼロ値が、量子化誤差なしで前記高精度ゼロ値を表す前記低精度値として量子化される、
前記請求項のいずれか一項に記載の装置。
【請求項５】
前記高精度入力が、人工ニューラルネットワークの層の重みおよび入力データ要素を含み、
前記重みおよび前記入力データ要素が独立して量子化される、
前記請求項のいずれか一項に記載の装置。
【請求項６】
減算エンジンの前記配列が、前記重みと前記入力データ要素の両方に対応する低精度入力から減算するように構成される、請求項５に記載の装置。
【請求項７】
前記装置が、フィールド・プログラマブル・ゲート・アレイ（ＦＰＧＡ）、システム・オン・チップ（ＳｏＣ）、特定用途向け集積回路（ＡＳＩＣ）、プログラマブル・アレイ・ロジック（ＰＡＬ）、または複合プログラマブル・ロジック・デバイス（ＣＰＬＤ）を含む、前記請求項のいずれか一項に記載の装置。
【請求項８】
前記処理要素配列が、前記積和を生成するために前記差分値を使用して１組の乗算および加算を行うように構成される、前記請求項のいずれか一項に記載の装置。
【請求項９】
前記処理エンジンが、人工ニューラルネットワークの活性化エンジン、プーリングエンジン、または出力バッファを含む、前記請求項のいずれか一項に記載の装置。
【請求項１０】
記憶装置から、畳み込み演算のための低精度入力を受け取ることであって、前記低精度入力が非対称量子化を使用して高精度入力から生成される、ことと、
減算エンジンが、差分値を作成するために前記低精度入力から高精度ゼロ値を表す低精度値を減算することと、
処理エンジンが、積和を生成するために前記差分値に対して積和演算を行うことと、
後処理エンジンが、前記積和をスケーリング係数でスケーリングすることによって高精度出力を生成することと
を含む、コンピュータ実装方法。
【請求項１１】
前記高精度入力が３２ビットの浮動小数点入力を含み、
前記低精度入力が８ビットの符号なし整数を含み、
前記差分値が９ビットの符号付き整数を含む、
請求項１０に記載のコンピュータ実装方法。
【請求項１２】
前記非対称量子化において、
前記高精度入力の最小値が前記低精度入力におけるゼロ値として量子化され、
前記高精度入力の最大値が前記低精度入力における最大値として量子化され、
前記高精度入力のゼロ値が、量子化誤差なしで前記高精度ゼロ値を表す前記低精度値として量子化される、
請求項１０または１１に記載のコンピュータ実装方法。
【請求項１３】
前記高精度入力の前記最小値と前記最大値とが前記高精度入力の前記ゼロ値に対して対称ではない、請求項１２に記載のコンピュータ実装方法。
【請求項１４】
前記高精度入力が、人工ニューラルネットワークの層の重みまたは入力データ要素を含む、請求項１０〜１３のいずれか一項に記載のコンピュータ実装方法。
【請求項１５】
前記処理エンジンが、高精度の積和演算ではなく低精度の積和演算を行うように構成される、請求項１０〜１４のいずれか一項に記載のコンピュータ実装方法。
【発明の詳細な説明】
【技術分野】
【０００１】
[0001]人工ニューラルネットワークとは、生物学的ニューラルネットワークに基づくアーキテクチャを有するコンピューティングシステムである。画像やビデオから物体、活動、文字などを識別または分類するなどの、特定のタスクをどのようにして行うかを学習するために、訓練データを使用して人工ニューラルネットワークを訓練することができる。ディープ・ニューラル・ネットワークなどの人工ニューラルネットワークは、多層の処理ノードを含み得る。層の各処理ノードは、先行する層の処理ノードによって生成された入力データに対して計算を行って出力データを生成することができる。例えば、処理ノードは、乗算や加算などの１組の算術演算を行って中間出力を生成するか、または中間出力に対して後処理演算を行って最終出力を生成し得る。ディープ・ニューラル・ネットワークなどの人工ニューラルネットワークは、数千以上の処理ノードおよび数百万以上のパラメータを含み得る。
【背景技術】
【０００２】
[0002]一般に、ニューラルネットワークは、開発され、訓練され、多くのエンドユーザの利用に供され得る。次いでエンドユーザは、訓練されたニューラルネットワークを使用して、既存のネットワークを変更するかまたは変更せずに様々なタスク（推論プロセスと呼ばれ得る）を行うことができる。ニューラルネットワークが構築されているとき、最優先事項は、機能する正確なネットワークを取得することであり得る。よって、正確さを維持するために訓練中には一般に浮動小数点数および浮動小数点演算が使用される。訓練プロセスは、十分な記憶空間および計算パワーを有するコンピューティングシステムで行うことができ、多くの場合、リアルタイムの性能は不要であり、数時間、数日、または数ヵ月単位で行われ得る。しかしながら、推論プロセスは、事前に訓練されたネットワークを使用して、モバイル機器や組み込み機器などの、限られた記憶空間および計算パワーを有する多くのコンピューティングデバイス上で行われ得る。よって、多くの場合、大量の浮動小数点データを格納するメモリにアクセスすることおよび／または浮動小数点計算を行うこと（高電力消費を引き起こし得る）が、推論プロセスにとってのボトルネックになり得る。
【０００３】
[0003]図面を参照して本開示による様々な実施形態を説明する。
【図面の簡単な説明】
【０００４】
【図１】例示的な多層人工ニューラルネットワークを示す図である。
【図２】例示的な畳み込みニューラルネットワーク（ＣＮＮ）を示す図である。
【図３Ａ】畳み込みニューラルネットワークにおいて畳み込み層によって入力画素配列に対して行われた畳み込み演算を示す図である。
【図３Ｂ】畳み込みニューラルネットワークにおいて畳み込み層によって入力画素配列に対して行われた畳み込み演算を示す図である。
【図４Ａ】例示的な入力画素に対して行われた例示的な畳み込み演算、非線形活性化演算、およびプーリング演算を示す図である。
【図４Ｂ】例示的な入力画素に対して行われた例示的な畳み込み演算、非線形活性化演算、およびプーリング演算を示す図である。
【図４Ｃ】例示的な入力画素に対して行われた例示的な畳み込み演算、非線形活性化演算、およびプーリング演算を示す図である。
【図４Ｄ】例示的な入力画素に対して行われた例示的な畳み込み演算、非線形活性化演算、およびプーリング演算を示す図である。
【図４Ｅ】例示的な入力画素に対して行われた例示的な畳み込み演算、非線形活性化演算、およびプーリング演算を示す図である。
【図５】例示的な人工ニューラルネットワークのための例示的な装置を示す図である。
【図６】処理要素の配列を含む簡略化された例示的な計算エンジンを示す図である。
【図７Ａ】浮動小数点数を使用した例示的な畳み込み演算を示す図である。
【図７Ｂ】整数を使用した例示的な畳み込み演算を示す図である。
【図８】特定の実施形態による整数を使用した例示的な畳み込み演算を示す図である。
【図９】特定の実施形態による例示的な畳み込み演算を行うための簡略化された例示的な計算エンジンを示す図である。
【図１０】特定の実施形態による人工ニューラルネットワークにおける計算を加速する例示的な方法を示す簡略化された流れ図である。
【図１１】特定の実施形態による例示的なコンピューティングデバイスを示す図である。
【発明を実施するための形態】
【０００５】
[0016]本明細書で開示される技法は、一般に、人工ニューラルネットワークに関し、より具体的には、人工ニューラルネットワークの量子化された計算を加速することに関する。
【０００６】
[0017]人工ニューラルネットワーク（「ニューラルネットワーク」とも呼ばれる）は、ある層上の処理ノードが別の層上の処理ノードに結合し得る、２つ以上の層に配置された複数の処理ノードを含み得る。処理ノードを、例えば、入力層、いくつかの中間層（隠れ層としても知られている）、および出力層を含む層に分割することができる。層（例えば、入力層、中間層など）上の各処理ノードは、入力データ要素の順次ストリームを受け取り、各入力データ要素を重みと乗算し、入力データ要素の加重和を計算し、加重和を次の層に転送し得る。畳み込みニューラルネットワークなどの人工ニューラルネットワークは、数千以上の処理ノード、ならびに数百万以上の重みおよび入力データ要素を含み得る。入力データ要素および重みは、一般に、正確を期して浮動小数点数（３２ビット浮動小数点数など）によって表され得る。よって、計算に使用されるデータのサイズは非常に大きい場合がある。そのため、大きな記憶空間、高帯域幅のバス、および高い並列浮動小数点処理性能を有する処理ユニットが必要とされる場合があり、これにより、記憶空間、データ転送帯域幅、および／または計算パワーの限られた機器上でのニューラルネットワークの適用が制限され得る。いくつかの実施態様では、計算に使用されるデータのサイズを縮小し、推論中の計算の効率を高めるために、計算（行列乗算など）に整数（８ビットの整数など）の量子化された入力および重みデータが使用され、次いで計算結果が、後続の層によるさらなる処理のために浮動小数点数に逆量子化され得る。しかしながら、計算および量子化・逆量子化プロセスは、多くの場合依然として非常に複雑であり得る。
【０００７】
[0018]いくつかの実施形態によれば、ニューラルネットワークを使用した推論中に計算に使用される浮動小数点データは、（例えば８ビットの数に）非対称に量子化され、行列乗算（畳み込みなど）の前に前処理（例えばシフト）され得る。結果として、浮動小数点データ内のゼロ値が、バイアスを回避するために整数に（量子化誤差なしで）完全に量子化され得るのみならず、行列乗算前に整数「０」に変換されることにもなり、そのため行列乗算がさらに簡略化され得る。前処理により、実装面積がより小さいバイト単位で整列したメモリを使用した量子化データの格納および管理が可能となり得る。加えて、前処理（シフトなど）により、行列乗算のために行われるべき乗算および加算の回数を減らし、行列乗算の結果の逆量子化を簡略化することもできる。例えば、行列乗算は、他の技法による４組の乗算および加算ではなく、１組の乗算および加算を使用して行われ、行列乗算の結果を浮動小数点スケーリング係数でスケーリング（すなわち乗算）することによって逆量子化を行うことができる。したがって、長い浮動小数点値（３２ビットの浮動小数点値など）を表すのに短い整数値（８ビットの整数など）が使用されるので、計算に使用されるデータのサイズを縮小することができ、行列乗算および逆量子化を著しく簡略化することができる。そのため、記憶空間および計算パワーの限られた機器が、推論プロセスを、場合によってはリアルタイムで処理することができる。
【０００８】
[0019]本明細書で使用される場合、２つのノード間の接続は必ずしも２つのノード間に物理的な接続があることを意味するとは限らない。いくつかの実施形態では、この接続は、あるノードと関連付けられた値と別のノードと関連付けられた値との間の関係を指し得る。例えば、２つのノード間の接続は、一方のノード上の値が他方のノード上の値を決定する際にどのように重み付けされるかを指示する係数（重みなど）によって表され得る。
【０００９】
[0020]本明細書で使用される場合、ネットワークノード、ノード、処理ノード、ニューラル・ネットワーク・ノード、またはニューロンとは、必ずしもハードウェアユニットまたは物理的な機器を指すとは限らない。いくつかの実施形態では、ネットワークノード、ノード、処理ノード、ニューラル・ネットワーク・ノード、またはニューロンとは、１組の入力値の加重和などの１組の算術演算を行うように構成された処理要素（ＰＥ）のセットを指し得る。いくつかの実施形態では、ネットワークノード、ノード、処理ノード、ニューラル・ネットワーク・ノード、またはニューロンとは、１組の入力値の加重和などの１組の算術演算を指し得る。
【００１０】
[0021]本明細書で使用される場合、量子化とは、大きいデータ型の数（３２ビットの浮動小数点数など）をより小さいデータ型の数（８ビットの符号付きまたは符号なしの整数など）に変換することを指し、逆量子化（または再量子化）とは、小さいデータ型の数から大きいデータ型の数を回復することを指し得る。量子化と逆量子化とは、互いに逆の線形変換であり得る。ニューラルネットワークでは、量子化された値は、大量の低精度演算が許容できる場合（畳み込みなど）に使用され、逆量子化された値は、高精度演算が好ましい場合（活性化など）に使用され得る。
【００１１】
[0022]以下の説明では、様々な実施形態が説明される。説明を目的として、実施形態の十分な理解を提供するために具体的な構成および詳細が記載される。しかしながら、それらの実施形態はそれらの具体的な詳細なしでも実施され得ることも当業者には理解されるであろう。さらに、説明される実施形態を不明瞭にしないように周知の特徴が省略または簡略化される場合もある。各図および説明は限定のためのものではない。「例」という語は、本明細書では、「例、具体例、または実例の役割を果たすこと」を意味するために使用される。本明細書で「例」として記載される実施形態または設計は、必ずしも、他の実施形態または設計に優って好ましいかまたは有利であると解釈されるとは限らない。
【００１２】
[0023]人工ニューラルネットワークは、機械学習の研究および産業用途で使用されてきており、例えば、画像認識、音声認識、コンピュータビジョン、テキスト処理などにおいて多くの画期的な成果を達成してきた。ニューラルネットワークにおける基本計算単位は、ニューロン（ノードとも呼ばれる）である。ニューロンは、ある他のニューロンまたは外部ソースから入力を受け取り、出力を計算し得る。各入力は、他の入力に対するその入力の重要度に基づいて割り当てられ得る、関連付けられた重み（ｗ）を有し得る。ニューロンはまた、その入力の加重和に関数（非線形関数など）を適用し得る。
【００１３】
[0024]フィードフォワード・ニューラル・ネットワークとは、人工ニューラルネットワークの１種である。これは、層として配置された多数のノードを含み得る。隣接する層のノードは、その間に接続またはエッジを有し得る。これらの接続は接続と関連付けられた対応する重みを有し得る。情報は、入力ノードから、（もしあれば）隠れノードを通って出力ノードに流れ得る。このネットワークにはサークルやループはない。対照的に、リカレント・ニューラル・ネットワーク（長・短期記憶（ＬＳＴＭ）ネットワークなど）は、サークルまたはループを形成するノード間の接続を含み得る。
【００１４】
[0025]図１に、例示的な多層ニューラルネットワーク１００を示す。多層ニューラルネットワーク１００は、入力層１１０と、隠れ（または中間）層１２０と、出力層１３０とを含み得る。多くの実施態様では、多層ニューラルネットワーク１００は、２つ以上の隠れ層を含み、ディープ・ニューラル・ネットワークと呼ばれ得る。一般に、任意の連続関数をモデル化するには、単一の隠れ層を有するニューラルネットワークで十分であり得る。しかしながら、そのようなネットワークは、複数の隠れ層を有するニューラルネットワークと比較して飛躍的に多数のノードを必要とし得る。ディープ・ニューラル・ネットワークを比較的浅いネットワークよりずっとうまく機能するように訓練できることが示されている。
【００１５】
[0026]入力層１１０は、外界からネットワークに情報（すなわち入力データ）を提供し得る複数の入力ノード（ノード１１２、ノード１１４、およびノード１１６など）を含み得る。入力ノードは情報を次の層に渡してもよく、入力ノードによって計算が行われなくてもよい。隠れ層１２０は、ノード１２２、ノード１２４、およびノード１２６などの、複数のノードを含み得る。隠れ層のノードには外界との直接接続がなくてもよい（よって「隠れ」の名がある）。隠れ層のノードは計算を行い、入力ノードからの情報を次の層（別の隠れ層や出力層１３０など）に転送し得る。フィードフォワード・ニューラル・ネットワークには単一の入力層および単一の出力層があり得るが、フィードフォワード・ニューラル・ネットワークの隠れ層はゼロかまたは複数であり得る。出力層１３０は、特定のオブジェクトまたは活動を認識したり、条件または動作を決定したりするなど、情報を計算し、ネットワークから外界に転送する役割を果たす複数の出力ノードを含み得る。
【００１６】
[0027]図１に示されるように、フィードフォワード・ニューラル・ネットワークでは、（もしあればバイアスノードを除く）ノードは、直接先行する層およびすぐ次の層内の（もしあればバイアスノードを除く）すべてのノードへの接続を有し得る。よって、これらの層は全結合層と呼ばれ得る。ノード間のすべての接続が接続と関連付けられた重みを有し得るが、図１にはそれらの重みの一部だけしか示されていない。複雑なネットワークでは、数百または数千のノードおよび数千または数百万のノード間の接続があり得る。
【００１７】
[0028]上記のように、フィードフォワード・ニューラル・ネットワークは、ゼロ（単層パーセプトロンと呼ばれる）、または１つもしくは複数の隠れ層（多層パーセプトロン（ＭＬＰ）と呼ばれる）を含み得る。たとえ図１には多層パーセプトロンに単一の隠れ層しか示されていないとしても、多層パーセプトロンは、（１つの入力層および１つの出力層に加えて）１つまたは複数の隠れ層を含み得る。多くの隠れ層を有するフィードフォワード・ニューラル・ネットワークは、ディープ・ニューラル・ネットワークと呼ばれ得る。単層パーセプトロンは線形関数のみを学習し得るが、多層パーセプトロンは非線形関数を学習することができる。
【００１８】
[0029]図１に示される例では、ノード１１２は、１の値を有するバイアスノードであり得るか、または通常の入力ノードであり得る。ノード１１４およびノード１１６は、入力データセットに依存する数値であり得る、外部入力Ｘ１および外部入力Ｘ２を取り得る。上記のように、入力層１１０では計算が行われず、よって、入力層１１０のノード１１２、ノード１１４、およびノード１１６からの出力は、それぞれ、１、Ｘ１、およびＸ２であり、これらは隠れ層１２０に供給され得る。
【００１９】
[0030]図１に示される例では、ノード１２２は、１の値を有するバイアスノードであり得るか、または通常のネットワークノードであり得る。隠れ層１２０のノード１２４およびノード１２６の出力は、入力層１１０からの出力（すなわち、１、Ｘ１、Ｘ２など）と、接続１１５と関連付けられた重みとに依存し得る。例えば、ノード１２４は、数値入力Ｘ１および数値入力Ｘ２を取り、それらの入力と関連付けられた重みｗ１および重みｗ２を有し得る。加えて、ノード１２４は、重みｗ０と関連付けられた、１などの（バイアスと呼ばれる）別の入力も有し得る。バイアスの主機能は、あらゆるノードに（ノードが受け取る通常の入力に加えて）訓練可能な一定値を提供することである。バイアス値は、１が活性化関数を左または右にシフトさせることを可能にし得る。たとえ図１にはノード１２４への３つの入力しか示されていなくても、様々な実施態様において、ノードは、数十、数百、数千、またはそれ以上の入力および関連付けられた重みを含み得ることに留意されたい。
【００２０】
[0031]ノード１２４からの出力Ｙは次式で計算され得る。
Ｙ＝ｆ（ｗ１×Ｘ１＋ｗ２×Ｘ２＋ｗ０）（１）
式中、関数ｆは、多くの場合活性化関数と呼ばれる非線形関数であり得る。ノードがＫ個の入力を有する場合、ノードからの出力は次式で計算され得る。
【数１】
2021510888.tif 000003
よって、各ニューラルネットワーク層上の計算は、入力行列と重み行列との乗算および行列乗算の積に適用される活性化関数として説明され得る。次いで、中間層上のノードからの出力が、出力層１３０などの次の層上のノードに供給され得る。
【００２１】
[0032]大部分の実世界の関数は非線形であり、ニューロンがこれらの非線形表現を学習できることが望ましいので、活性化関数の目的は、ニューラル・ネットワーク・ノードの出力に非線形性を導入することである。活性化関数は、単数を取り、その単数に対して特定の固定された数学演算を行い得る。人工ニューラルネットワークではいくつかの活性化関数が使用され得る。１つの例示的な活性化関数がシグモイド関数σ（ｘ）であり、シグモイド関数σ（ｘ）は実数値の入力を取り、その入力を０から１までの値に変換する。
σ（ｘ）＝１／（１＋ｅｘｐ（−ｘ））（３）
別の例示的な活性化関数がＴａｎｈ関数であり、Ｔａｎｈ関数は実数値の入力を取り、その入力を［−１，１］の範囲内の値に変換する。
ｔａｎｈ（ｘ）＝２σ（２ｘ）−１（４）
第３の例示的な活性化関数が正規化線形ユニット（ＲｅＬＵ）関数である。ＲｅＬＵ関数は実数値の入力を取り、その入力を０より上で閾値処理する（すなわち、負の値を０で置換する）。
ｆ（ｘ）＝ｍａｘ（０，ｘ）（５）
別の例示的な活性化関数がＬｅａｋｙ  ＲｅＬＵ関数であり、これは次式として定義され得る。
Ｌｅａｋｙ−ＲｅＬＵ（ｘ）＝ｍａｘ（０，ｘ）＋αｍｉｎ（０，ｘ）（６）
式中、αは、事前に決定されたパラメータまたは学習できるパラメータであり得る。
【００２２】
[0033]図１に示される例の出力層１３０は、隠れ層１２０から入力を取り、接続１２５と関連付けられた重みを使用して隠れノードと同様の計算を行い得るノード１３２およびノード１３４を含み得る。計算結果（Ｙ１およびＹ２）は多層パーセプトロンの出力である。いくつかの実施態様では、分類のためのＭＬＰにおいて、ソフトマックス関数が出力層において活性化関数として使用され得る。ソフトマックス関数は、実数値のスコアのベクトルを取り、そのベクトルを、合計が１になる０から１までの値のベクトルにマップする。
【００２３】
[0034]所与の入力特徴セットＸ＝（ｘ１，ｘ２，…）およびターゲットＹについて、多層パーセプトロンは、特徴と分類または回帰のためのターゲットとの間の関係を学習することができる。多層パーセプトロンは、逆伝搬アルゴリズムを使用して学習し得る。（多くの場合ＢａｃｋＰｒｏｐと呼ばれる）誤差の逆方向伝搬は、人工ニューラルネットワークを訓練できるいくつかの方法のうちの１つである。ＢａｃｋＰｒｏｐは、誤差を低減するためにニューラルネットワークのパラメータを変更ことによってラベル付き訓練データおよびノードにおける誤差から学習する教師あり訓練方式であり得る。
【００２４】
[0035]上記のように、人工ニューラルネットワーク内の隣接する層のノード間の接続は接続と関連付けられた重みを有し、重みは、所与の入力ベクトルについて出力ベクトルが何であるかを決定し得る。学習または訓練プロセスによりこれらの接続に適切な重みが割り当てられ得る。いくつかの実施態様では、重みの初期値はランダムに割り当てられ得る。訓練データセット内のあらゆる入力について、人工ニューラルネットワークの出力が観察され、予期された出力と比較され、予期された出力と観察された出力との間の誤差が前の層に逆伝搬され得る。重みは、誤差に基づいてしかるべく調整され得る。このプロセスは、出力誤差が所定の閾値を下回るまで繰り返される。
【００２５】
[0036]誤差の逆方向伝搬は、勾配を決定するために入れ子関数ｙ＝ｆ（ｇ（ｘ））に使用される連鎖律に基づくものであり得る。
【数２】
2021510888.tif 000004
式中、
【数３】
2021510888.tif 000005
は、活性化関数の導関数であり、
【数４】
2021510888.tif 000006
は重みｗに比例し得る。出力ノードにおける誤差が計算され、勾配を計算するためにネットワークを介して逆伝搬され得る。勾配降下法などの最適化法が、ネットワークにおける重みを調整して出力層での誤差を低減するために使用され得る。順方向伝搬は出力層で大規模行列をベクトルで乗算するまで各層で大規模行列を連続して乗算することを伴い得るので、逆伝搬は順方向伝搬よりも計算上安くつく可能性がある。逆伝搬ではまず、行列を第１のベクトルで乗算して第２のベクトルを取得し、別の行列を第２のベクトルで乗算して第３のベクトルを取得し、以下同様に行い得る。言い換えると、逆伝搬は、行列・行列乗算の代わりにより効率のよい行列・ベクトル乗算を使用する。
【００２６】
[0037]重み調整の後、今度は重みが誤差を最小化するように調整されているので、ネットワークは同じ入力に対して前よりうまく機能するはずである。このプロセスは、訓練データセット内のすべての訓練サンプルに対してこれらのサンプルから学習するために繰り返され得る。
【００２７】
[0038]多くの場合、上記のようなフィードフォワード・ニューラル・ネットワークを、画像分類などの実世界の用途に使用することは、実際的ではない。例えば、２００×２００画素の二次元（２Ｄ）画像では、４０，０００個の入力ノードがニューラルネットワークにおいて使用され得る。隠れ層が２０，０００個のノードを有する場合、重みの行列のサイズは４０，０００×２０，０００（すなわち８億個の要素）になる。各重みが３２ビット（すなわち４バイト）の浮動小数点値である場合、重みに使用される合計メモリは３．２ＧＢになる。これは第１層だけについてである。層の数が増加するにつれて、重みのサイズも増加し得る。加えて、個々の画素を使用して画像をベクトル化すると、画像の複雑な２Ｄ空間構造が無視される可能性もある。
【００２８】
[0039]これらの問題を克服する１つの方法は、上記のような大規模行列乗算ではなくより小さい畳み込みフィルタを使用して２Ｄ畳み込みを行う畳み込みニューラルネットワークを使用することである。１組の畳み込みフィルタ（１１×１１行列など）を学習することは、大規模行列（４０，０００×２０，０００など）を学習するよりずっと容易で高速であり得る。また２Ｄ畳み込みは、当然ながら、画像の２Ｄ構造を考慮に入れることもできる。畳み込みニューラルネットワークは、局所接続性および重み共有を有するフィードフォワード・ニューラル・ネットワークとして説明され得る。局所接続性は、畳み込みフィルタが、それが作用する画像よりずっと小さい次元を有し得ることを指す。重み共有は、畳み込みを行うときに画像全体にわたって同じフィルタが使用され得ることに起因するものであり、これは、画像内の多くの位置で同じローカルフィルタが使用されることを意味する。言い換えると、画像内の異なる位置のすべてのフィルタリング間で重みが共有される。
【００２９】
[0040]畳み込みニューラルネットワーク（ＣｏｎｖＮｅｔまたはＣＮＮとも呼ばれる）は、画像認識や分類などの用途に非常に有効なニューラルネットワークの一種である。例えば、ＣＮＮは、ロボットや自動運転車で使用するために、顔、物体、および交通標識を識別するのに使用され得る。ＣＮＮは、（文の分類などの）自然言語処理タスクでも使用され得る。手書き数字認識のために１９９０年代にＹａｎｎ  ＬｅＣｕｎらによって開発されたＬｅＮｅｔが、深層学習の分野を推進するのに役立った最初の畳み込みニューラルネットワークのうちの１つである。近年、ＬｅＮｅｔを改善するためにいくつかの新しいアーキテクチャが提案されているが、それらはすべてＬｅＮｅｔからの主概念を使用している。
【００３０】
[0041]図２に、画像またはオブジェクトの分類のための例示的な畳み込みニューラルネットワーク（ＣＮＮ）２００を示す。ＣＮＮ２００は、次の４つの主な演算を含み得る。（１）畳み込み、（２）非線形関数（ＲｅＬＵなど）、（３）プーリングまたはサブサンプリング、および（４）分類（全結合層）。これらの演算は、あらゆる畳み込みニューラルネットワークの基本構成要素であり得る。ＣＮＮが異なればこれら４つの主な演算の異なる組み合わせも異なり得る。
【００３１】
[0042]入力画像２１０などの分類されるべき画像が、画素値の行列で表され得る。入力画像２１０は、各チャネルが画像の特定の構成要素を表す、複数のチャネルを含み得る。例えば、デジタルカメラからの画像は、赤チャネル、緑チャネル、および青チャネルを有し得る。各チャネルは、０から２５５（すなわち８ビット）の範囲内の画素値を有する画素の２Ｄ行列で表され得る。グレースケール画像はただ１つのチャネルを有し得る。以下の説明では、ＣＮＮ２００を使用した単一の画像チャネルの処理を説明する。他のチャネルも同様に処理され得る。
【００３２】
[0043]図２に示されるように、入力画像２１０は、第１のフィルタを使用して第１の畳み込み層２１５によって処理され得る。畳み込みの詳細については、図３Ａおよび図３Ｂを参照して後述する。第１の畳み込み層２１５は、上記のような非線形活性化関数（ＲｅＬＵなど）も行い得る。第１の畳み込み層２１５からの出力行列２２０は、入力画像２１０より小さい次元を有し、畳み込み特徴、活性化マップ、または特徴マップと呼ばれ得る。第１の畳み込み層２１５は、複数の出力行列（または特徴マップ）２２０を生成するために複数のフィルタを使用して入力画像２１０に対して畳み込みを行い得る。使用されるフィルタの数は、畳み込み層の深さと呼ばれ得る。図２に示される例では、第１の畳み込み層２１５は深さ３を有し得る。出力行列（または特徴マップ）２２０はプーリング層２２５に渡され、そこで出力行列２２０は、行列２３０を生成するためにサブサンプリングまたはダウンサンプリングされ得る。プーリング演算の詳細については、図４Ｄおよび図４Ｅを参照して後述する。
【００３３】
[0044]行列２３０は、フィルタを使用して第２の畳み込み層２３５によって処理され得る。上記のように非線形活性化関数（ＲｅＬＵなど）も第２の畳み込み層２３５によって行われ得る。第２の畳み込み層２３５からの出力行列２４０（または特徴マップ）は行列２３０より小さい次元を有し得る。第２の畳み込み層２３５は、複数の出力行列（または特徴マップ）２４０を生成するために複数のフィルタを使用して行列２３０に対して畳み込みを行い得る。図２に示される例では、第２の畳み込み層２３５は深さ６を有し得る。出力行列２４０はプーリング層２４５に渡され、そこで出力行列２４０は、行列２５０を生成するためにサブサンプリングまたはダウンサンプリングされ得る。
【００３４】
[0045]プーリング層２４５からの二次元出力行列２５０は、平滑化層２５５によって一次元（１Ｄ）ベクトルに平滑化され、図１に記載されるように全結合層２６０（すなわち、多層パーセプトロン（ＭＬＰ））を通され得る。全結合層２６０は、平滑化層２５５からの１Ｄ出力ベクトルを取る入力層２７０（図１の入力層１１０など）を含み得る。全結合層２６０は、隠れ層２８０（図１の隠れ層１２０など）および出力層２９０（図１の出力層１３０など）も含み得る。全結合層２６０は、特徴マップまたは行列２５０と、例えば、ソフトマックス関数とを使用して、入力画像２１０内のオブジェクトをいくつかのカテゴリのうちの１つに分類し得る。
【００３５】
[0046]全結合層の演算は行列乗算で表され得る。例えば、入力層２７０上にＭ個のノードがあり、隠れ層２８０上にＮ個のノードがあり、入力Ｘ＝［ｘ１，ｘ２，ｘ３，…，ｘＭ］である場合、入力層２７０上のＭ個のノードと隠れ層２８０上のＮ個のノードとの間の接続の重みを次式で表すことができる。
【数５】
2021510888.tif 000007
隠れ層２８０の出力Ｙは次式によって決定され得る。
【数６】
2021510888.tif 000008
全結合層でＭ個の入力を各々含むＫ個のサンプルのバッチが受け取られる場合、入力は、それらＫ個のサンプルについてのＫ×Ｍ行列で表され得る。隠れ層２８０の出力Ｙは、Ｋ×Ｎ個の要素を含み、２Ｄ行列乗算によって決定され得る。
【００３６】
[0047]ＣＮＮ内の畳み込み演算は、入力画像２１０から特徴を抽出するために使用され得る。畳み込み演算は、入力画像の小領域を使用して画像特徴を抽出することによって画素間の空間関係を保持する。畳み込みでは、行列（フィルタ、カーネル、または特徴検出器と呼ばれる）が、特定のステップサイズ（ストライドと呼ばれる）で入力画像（または特徴マップ）上をスライドし得る。位置（またはステップ）ごとに、フィルタ行列と入力画像におけるオーバーラップ行列との間の要素別の乗算が計算され、合計されて、出力行列（特徴マップなど）の単一要素を表す最終値が取得され得る。よって、フィルタは、元の入力画像から特徴を検出するように作用し得る。
【００３７】
[0048]図３Ａおよび図３Ｂに、畳み込みニューラルネットワークにおいて畳み込み層によってフィルタ３１０を使用して入力画素配列３２０に対して行われた畳み込み演算を示す。入力画素配列３２０は、入力画像、入力画像のチャネル、または別の畳み込み層もしくはプーリング層によって生成された特徴マップを含み得る。図３Ａに、第１のステップで入力画素配列３２０の第１の領域３２２に対して行われた畳み込み演算を示す。図３Ｂに、フィルタ３１０を１ストライドだけスライドさせた後に第２のステップで入力画素配列３２０の第２の領域３２４に対して行われた畳み込み演算を示す。
【００３８】
[0049]フィルタ３１０は二次元行列を含んでいてもよく、２Ｄ行列の各要素は重みを表す。フィルタ３１０の重みは、画像内の画素値の空間分布から特定の特徴を検出または抽出するように設計または訓練され得る。抽出された特徴は、人間の目にとって有意である場合もそうでない場合もある。入力画素配列から異なる特徴を検出または抽出するために異なるフィルタが使用され得る。例えば、いくつかのフィルタは、画像内のエッジを検出するか、または画像を鮮明化もしくは不鮮明化するために使用され得る。フィルタ３１０は、Ｒ行（高さ）、Ｓ列（幅）を有し、高さＨ画素、幅Ｗ画素を有し得る入力画素配列３２０より通常は小さい。フィルタ３１０の各重みは、入力画素配列３２０におけるＲ行Ｓ列の領域内の画素にマップされ得る。例えば、図３Ａに示されるように、畳み込み層（第１の畳み込み層２１５や第２の畳み込み層２３５など）または畳み込み層の処理ノードは、入力画素配列３２０の（Ｒ×Ｓ画素を含む）領域３２２の画素値を受け取り、フィルタ３１０内と領域３２２内との対応する要素間の要素別の乗算を行い、要素別の乗算の積を合計して畳み込み出力値３３２を生成し得る。言い換えると、畳み込み出力値３３２は、
【数７】
2021510888.tif 000009
による、フィルタ３１０内の重みと領域３２２内の対応する画素との間の乗算結果の和、すなわち、フィルタ３１０を表す行列と領域３２２の画素値を表す行列との間のドット積であり得る。
【００３９】
[0050]同様に、図３Ｂに示されるように、畳み込み層（畳み込み層の別の処理ノードなど）も、入力画素配列３２０の（Ｒ×Ｓ画素を含む）領域３２４の画素値を受け取り、フィルタ３１０内と領域３２４内との対応する要素間の要素別の乗算を行い、要素別の乗算の積を合計して畳み込み出力値３３４を生成し得る。図３Ｂに示されるように、畳み込み演算を、事前に決定されたストライドＤでスライディングウィンドウ方式で行うことができる。例えば、図３Ｂに示される例では、領域３２４は領域３２２から（画素単位で）距離Ｄのところにあり、次の畳み込み演算のための次の領域は、領域３２４から同じ距離Ｄのところに位置し得る。ストライドＤは、フィルタ３１０の幅Ｓより小さくても大きくてもよい。
【００４０】
[0051]畳み込み演算の出力は、高さＥ行、幅Ｆ列の畳み込み出力行列３３０を形成し得る。上記のように、行列３３０は特徴マップと呼ばれ得る。行列３３０の次元は、入力画素配列３２０より小さくてもよく、入力画素配列３２０の次元とフィルタ３１０の次元とストライドＤとに基づいて決定され得る。例えば、ストライドＤが水平方向と垂直方向の両方に１画素である場合、Ｅは、Ｈ−Ｒ＋１であり、ＦはＷ−Ｓ＋１であり得る。いくつかの実施態様では、図３Ａおよび図３Ｂの各畳み込み出力（出力値３３２や出力値３３４など）は、畳み込み層の処理ノードの出力に対応し得る。
【００４１】
[0052]入力画素配列上であるフィルタを使用する畳み込みが１つの特徴マップを生成するために使用され、同じ入力画素配列上で別のフィルタを使用する畳み込みが異なる特徴マップを生成し得る。実際には、ＣＮＮは、フィルタの数、フィルタサイズ、ネットワークのアーキテクチャなどといった訓練プロセスの前のいくつかのユーザ指定のパラメータ（ハイパーパラメータと呼ばれ得る）に基づいて訓練プロセス中にそれ自体でフィルタの重みを学習し得る。使用されるフィルタの数が多いほど、多くの画像特徴が抽出され、ネットワークが新しい画像におけるパターンをより良く認識し得る。
【００４２】
[0053]上記のように、出力特徴マップのサイズは、深さ、ストライド、およびゼロパディングなどのパラメータに基づいて決定され得る。上記のように、深さは、畳み込み演算に使用されるフィルタの数に対応し得る。図２に示されるＣＮＮ２００では、第１の畳み込み層２１５において入力画像に対して畳み込み演算を行うために３つの別々のフィルタが使用され、よって、３つの異なる出力行列（または特徴マップ）２２０を生成する。ストライドは、フィルタ行列を入力画素配列上でスライドさせる画素数である。例えば、ストライドが１である場合、フィルタ行列は一度に１画素だけ移動される。ストライドが２である場合、フィルタ行列は一度に２画素だけ移動される。ストライドが大きいほど小さい特徴マップが生成され得る。いくつかの実施態様では、フィルタ行列が入力画素配列の隣接する要素に適用され得るように、入力行列は境界の周囲を０でパディングされ得る。ゼロパディングは、特徴マップのサイズの制御を可能にし得る。
【００４３】
[0054]図２に示されるように、どの畳み込み演算の後にも活性化関数（ＲｅＬＵなど）を使用した追加の非線形演算が使用され得る。上記のように、ＲｅＬＵは、特徴マップ内のすべての負の画素値を０で置き換える要素別の演算である。ＲｅＬＵの目的は、ＣＮＮに非線形性を導入することである。Ｔａｎｈ関数やシグモイド関数などの他の非線形関数も使用できるが、ＲｅＬＵは多くの場合よりうまく働くことが判明している。
【００４４】
[0055]空間プーリング（サブサンプリングまたはダウンサンプリングとも呼ばれる）は、最重要の情報を保持しつつ、各特徴マップの次元を縮小し得る。特に、プーリングは、特徴次元をより小さく、より扱いやすくし、ネットワークにおけるパラメータおよび計算の数を低減させ得る。またプーリングは、局所近傍における最大値または平均値が使用されることが原因で入力画像の小さい歪みがプーリングの出力を変化させることのないように、ネットワークを入力画像内の小さい変形、歪み、および変換に対して不変にし得る。よって、プーリングは、画像内のオブジェクトがそれらがどこに位置しようと検出され得るように入力画像の等価の表現を取得するのに役立ち得る。空間プーリングは、最大プーリング、平均プーリング、合計プーリングなどといった様々な方法で行われ得る。最大プーリングでは、各空間近傍（２×２ウィンドウなど）内の最大要素がその空間近傍を表すために使用され得る。最大要素を取る代わりに、各ウィンドウ内のすべての要素の（平均プーリングの）平均または（合計プーリングの）合計が空間近傍を表すために使用されてもよい。多くの用途では、最大プーリングが他のプーリング法よりもうまく機能し得る。
【００４５】
[0056]図４Ａ〜図４Ｅに、例示的な入力画素データに対して行われた例示的な畳み込み演算、非線形活性化演算、およびプーリング演算を示す。入力画素データは、例えば、デジタル画像、デジタル画像のチャネル、または畳み込みニューラルネットワーク内の前の層によって生成された特徴マップを表し得る。図４Ａに、例示的な入力画素データを含む例示的な入力行列４１０を示す。入力行列４１０は、画素配列の各要素が整数や浮動小数点数などの実数を含み得る、６×６画素配列を含み得る。図４Ｂに、例示的なフィルタ４２０を示す。フィルタ４２０は、行列の各要素がフィルタの重みを表す、３×３行列を含み得る。フィルタ４２０は、入力行列４１０から特定の特徴を抽出するために使用され得る。例えば、図４Ｂに示される例示的なフィルタ４２０は、画像内のエッジを検出するためのフィルタであり得る。
【００４６】
[0057]入力行列４１０とフィルタ４２０とは、図４Ｃに示されるような出力行列４３０を生成するために畳み込まれ得る。出力行列４３０の各要素は、フィルタ４２０内の対応する要素と入力行列４１０のオーバーラップする領域４１２との間の要素別の乗算の和（すなわちドット積）であり、フィルタ４２０と同じ次元（３×３など）を有するウィンドウが特定のストライド（水平および／または垂直に１要素など）で入力行列４１０上をスライドするステップごとに決定され得る。例えば、出力行列４３０の行１列３の要素４３２の値は、フィルタ４２０を表す行列と入力行列４１０の領域４１２を表す行列との間のドット積であり、２×０＋１×１＋０×０＋５×１＋３×（−４）＋２×１＋２×０＋１×１＋１×０＝１＋５−１２＋２＋１＝−３である。同様に、出力行列４３０の行４列１の要素４３４の値は、フィルタ４２０を表す行列と入力行列４１０の領域４１４を表す行列との間のドット積であり、０×０＋２×１＋１×０＋０×１＋０×（−４）＋１×１＋５×０＋３×１＋２×０＝２＋１＋３＝６である。６×６画素配列を有する入力行列４１０と３×３行列で表されるフィルタ４２０とでは、使用されるストライドが１要素または１画素であるとき、出力行列４３０は４×４行列であり得る。
【００４７】
[0058]次いで、図４Ｄに示されるような行列４４０を生成するために、出力行列４３０に非線形活性化関数（例えば、ＲｅＬＵ、シグモイド、Ｔａｎｈなど）が適用され得る。図４Ｄに示される例では、ＲｅＬＵ関数が使用され、よって、出力行列４３０内のすべての負の値が行列４４０では０で置き換えられる。行列４４０内のデータをサブサンプリングまたはダウンサンプリングするために行列４４０にプーリング演算（最大、平均、または合計プーリング演算など）が適用され得る。図４Ｄおよび図４Ｅに示される例では、行列４４０に最大プーリング演算が適用され、４×４行列４４０が４つの２×２領域４４２、４４４、４４６、および４４８に分割され得る。各領域の最大値が各領域を表すサブサンプルとして選択され得る。例えば、領域４４２から最大値９が選択され、領域４４４から最大値２が選択され、領域４４６から最大値５が選択され、領域４４８から最大値６が選択される。よって、畳み込み演算、非線形活性化演算、およびプーリング演算の後に６×６入力行列４１０から４つの要素９、２、６、５を有する特徴マップ４５０が生成され得る。
【００４８】
[0059]図２に戻って、ＣＮＮ２００は、２組の畳み込み層、ＲｅＬＵ層、およびプーリング層を含み、第２の畳み込み層２３５は、６個のフィルタを使用してプーリング層２２５の出力に対して畳み込み演算を行って合計６個の特徴マップを生成し得る。次いで、これら６個の特徴マップ全部に対して個別にＲｅＬＵが適用され得る。次に、６個の正規化特徴マップの各々に対して最大プーリング演算が行われ得る。これらの畳み込み層、ＲｅＬＵ層、およびプーリング層は、組み合わさって、画像から有用な特徴を抽出し、ネットワークに非線形性を導入し、特徴次元を低減させると同時、それらの特徴をスケールおよび変換と等価にし得る。プーリング層２４５の出力行列２５０は、入力画像の高レベル特徴を表し、全結合層２６０への入力として使用され得る。
【００４９】
[0060]全結合層２６０は、多層パーセプトロンであり得る。上記のように、全結合層では、層内のあらゆるノードが（１つまたは複数の）隣接する層上のあらゆるノードに結合される。全結合層２６０は、出力行列２５０で表された入力画像の高レベル特徴を使用して、入力画像を訓練データセットに基づく様々なクラスに分類し得る。また全結合層は、これらの高レベル特徴の非線形結合関数を学習するための低コストの方法としても使用され得る。畳み込み層およびプーリング層からの特徴は分類タスクに適し得るが、それらの特徴の非線形結合はさらに一層適し得る。
【００５０】
[0061]全結合層２６０は、出力層に対してソフトマックス活性化関数を使用し得る。ソフトマックス関数は、実数値のスコアのベクトルを取り、そのベクトルを、合計が１になる０から１までの値（確率）を有するベクトルに変換する。よって、全結合層からの出力値の合計は１であり得る。いくつかの実施形態では、サポート・ベクター・マシン（ＳＶＭ）分類器などの他の分類器も使用することができる。
【００５１】
[0062]図２に示される例では、２組の畳み込み層およびプーリング層が使用される。これらの演算を単一のＣＮＮにおいて何回でも繰り返すことができることに留意されたい。加えて、プーリング層が畳み込み層ごとに使用されない場合もある。いくつかの実施態様では、ＣＮＮは、プーリング演算を行う前に複数の畳み込み演算およびＲｅＬＵ演算を行い得る。
【００５２】
[0063]ＣＮＮ２００などの畳み込みニューラルネットワークの訓練プロセスは、図２に記載されるフィードフォワード・ニューラル・ネットワークに関して上述した訓練プロセスと同様であり得る。第１に、すべてのパラメータおよび重み（フィルタ内の重みおよび全結合層のための重みを含む）が乱数値で初期設定され得る。第２に、畳み込みニューラルネットワークは、入力として訓練サンプル（訓練画像など）を取り、順方向伝搬ステップ（畳み込み演算、非線形活性化演算、およびプーリング演算を、全結合層における順方向伝搬演算と共に含む）を行い、可能なクラスごとの出力確率を決定し得る。重みなどの畳み込みニューラルネットワークのパラメータは、訓練例にランダムに割り当てられるので、出力確率もランダムであり得る。
【００５３】
[0064]出力層での全誤差（すべての可能なクラスの総和など）は、すべての可能なクラスの確率誤差を合計することによって計算され得る。例えば、全誤差は、次式に基づいて計算される。
全誤差＝１／２Σ（目標確率−出力確率）２  （１０）
式中、目標確率は、画像内のオブジェクトの実際のクラスに対応する「１」と、他のクラスに対応する「０」とを含み得る。次いで、上記の逆伝搬法などの技法を使用して、ネットワークにおいて訓練されるべきパラメータおよび重みに関する誤差の勾配が計算され、勾配降下法を使用してネットワークにおいて訓練されるべきパラメータおよび重みが出力誤差を最小化するように更新され得る。重みは、それらの全誤差への寄与に従って微調整または調整され得る。同じ訓練サンプルが入力として再度使用される場合、出力確率が目標確率により近づく可能性もあり、これは、ネットワークがこの特定の画像の分類を学習したことを指示する。上記のように、フィルタの数、フィルタサイズ、ネットワークのアーキテクチャなどといった畳み込みニューラルネットワークのいくつかのパラメータは、事前に選択され、訓練プロセスの間不変のままであり得る。上記の訓練プロセスは、訓練データセット内のすべての訓練サンプルについて繰り返され得る。
【００５４】
[0065]訓練プロセスの終了時には、ＣＮＮのすべての重みおよびパラメータが、訓練データセットからの訓練サンプルを正しく分類するように最適化され得る。ＣＮＮに未知のサンプル（試験サンプルや新しいサンプルなど）が入力されると、ＣＮＮは順方向伝搬ステップを経て、訓練された重みおよびパラメータを使用してクラスごとの確率を出力し、これは、訓練プロセスに対して推論（または予測）プロセスと呼ばれ得る。訓練データセットが十分であれば、訓練されたネットワークは未知のサンプルを正しいクラスに分類し得る。
【００５５】
[0066]ＡｌｅｘＮｅｔ（２０１２）、ＺＦＮｅｔ（Ｚｅｉｌｅｒ＆Ｆｅｒｇｕｓ  Ｎｅｔの略称）（２０１３）、ＧｏｏｇＬｅＮｅｔ（２０１４）、ＶＧＧＮｅｔ（ネットワークの性能がネットワークの深さ（層の数）に依存し得ることを示す）（２０１４）、レジデュアルネットワーク（ＲｅｓＮｅｔ）（２０１５）、および密に結合された畳み込みネットワーク（ＤｅｎｓｅＮｅｔ）（２０１６）などの、上記のＣＮＮ２００に対する多くの変形形態および改変形態があり得る。
【００５６】
[0067]上記のフィードフォワード・ニューラル・ネットワークでは、すべてのサンプルが独立しているとみなされる。リカレント・ニューラル・ネットワーク（ＲＮＮ）では、上記と同じ演算が系列内のあらゆる要素に対して行われ、ある入力要素についての出力は前の入力要素についての出力に依存し得る。最も一般的に使用されるタイプのＲＮＮのうちの１つが、長・短期記憶（ＬＳＴＭ）ネットワークであり、これは入力層と、１つまたは複数のＬＳＴＭ層と、全結合層とを含み得る。
【００５７】
[0068]上記の訓練プロセスおよび推論プロセスは、ハードウェア、ソフトウェア、またはハードウェアとソフトウェアの組み合わせで行われ得る。しかしながら、人工ニューラルネットワークを訓練し、または訓練された人工ニューラルネットワークを推論に使用するには、一般に、例えば、行列乗算や畳み込みを行うための相当な量の計算パワーが必要である。よって、訓練および／または推論にはグラフィック・プロセッシング・ユニット（ＧＰＵ）、テンソル・プロセッシング・ユニット（ＴＰＵ）、ニューラル・ネットワーク・プロセッシング・ユニット（ＮＰＵ）、ＦＰＧＡ、ＡＳＩＣ、または他の高並列処理回路などの専用ハードウェア回路が使用され得る。訓練および推論は、クラウド、データセンタ、または機器上で行われ得る。
【００５８】
[0069]図５に、例示的な人工ニューラルネットワークのための例示的な装置５００を示す。装置５００は、データ・センタ・サーバなどのコンピュータシステムの一部であり得る。いくつかの実施形態では、装置５００は、マルチテナント・コンピュート・サービス・システム（クラウドなど）の一部であり、ホストデバイス（図５には示されていない）と通信して、コンピューティングデバイスに計算リソースおよびメモリリソースを提供し得る。装置５００は、相互接続５１８を介してメモリ５１２と、ダイレクト・メモリ・アクセス（ＤＭＡ）・コントローラ５１６と、ホストインターフェース５１４とに結合されたニューラル・ネットワーク・プロセッサ５０２を含み得る。ニューラル・ネットワーク・プロセッサ５０２は、訓練されたニューラルネットワークを使用した推論を支援するために計算リソースを提供し得る。ニューラル・ネットワーク・プロセッサ５０２の動作の詳細を以下で説明する。
【００５９】
[0070]メモリ５１２は、命令、入力データ（画像の画素データなど）、および、例えばホストデバイスから受け取られた訓練されたニューラルネットワークの重み（フィルタデータなど）またはその他のパラメータを格納するように構成され得る。メモリ５１２は、ニューラル・ネットワーク・プロセッサ５０２の出力（入力画像に関する１つまたは複数の画像認識判断など）または何らかの中間データを格納するためにも使用され得る。メモリ５１２は、ダイナミック・ランダム・アクセス・メモリ（ＤＲＡＭ）、シンクロナスＤＲＡＭ（ＳＤＲＡＭ）、ダブル・データ・レートＤＲＡＭ（ＤＤＲ  ＤＲＡＭ）、ストレージ・クラス・メモリ（ＳＣＭ）、フラッシュ・メモリ・デバイスなどといった任意の適切なメモリを含み得る。
【００６０】
[0071]ＤＭＡコントローラ５１６は、ニューラル・ネットワーク・プロセッサ５０２とホストデバイスとの間でデータを転送するＤＭＡ操作を行うように構成され得る。例えば、ホストデバイスは、メモリ５１２において、命令、入力データ、重み、およびニューラルネットワークのその他のパラメータを格納し得る。ホストデバイスは、ニューラル・ネットワーク・プロセッサ５０２に（メモリ記述子の形などで）格納された命令、データ、重み、およびニューラルネットワークのその他のパラメータのメモリアドレスを提供し得る。ニューラル・ネットワーク・プロセッサ５０２は次いで、ホストデバイスによって提供されたメモリアドレスに基づいて、格納された命令、データ、重み、またはニューラルネットワークのその他のパラメータを取得し得る。ニューラル・ネットワーク・プロセッサ５０２はまた、メモリ５１２において計算の結果（１つまたは複数の画像認識判断や中間データなど）を格納し、格納された結果のメモリアドレスをホストデバイスに提供し得る。
【００６１】
[0072]ホストインターフェース５１４は、ホストデバイスとニューラル・ネットワーク・プロセッサ５０２との間の通信を可能にし得る。例えば、ホストインターフェース５１４は、ホストデバイスとニューラル・ネットワーク・プロセッサ５０２との間で格納されたデータ（例えば、入力データ、重み、計算の結果など）のメモリアドレスを含むメモリ記述子を送るように構成され得る。ホストインターフェース５１４は、例えば、周辺機器相互接続エクスプレス（ＰＣＩｅ）インターフェースやホストデバイスと通信するための任意の適切なインターフェースを含み得る。
【００６２】
[0073]ニューラル・ネットワーク・プロセッサ５０２は、画像分類などの、推論のためのニューラルネットワーク計算を支援する計算リソースを提供し得る。図５に示される例では、ニューラル・ネットワーク・プロセッサ５０２は、システム・オン・チップ（ＳｏＣ）、ＦＰＧＡ、またはＡＳＩＣなどの集積回路を含み得る。ニューラル・ネットワーク・プロセッサ５０２は、ステートバッファ５２２、計算エンジン５２４、出力バッファ５２６、およびポストプロセッサ５２８などのいくつかの回路構成要素を含み得る。いくつかの実施態様では、ニューラル・ネットワーク・プロセッサ５０２は、以下で詳細に論じるように、計算エンジン５４２およびポストプロセッサ５２８にステートバッファ５２２への読取りおよび書込みアクセスを提供する読取りアクセスエンジン５３６および書込みアクセスエンジン５３８も含み得る。
【００６３】
[0074]ステートバッファ５２２は、計算エンジン５２４で計算に使用されるデータのキャッシングを提供するように構成され得る。ステートバッファ５２２でキャッシュされるデータは、例えば、メモリ５１２から取得された入力データおよび重み、計算エンジン５２４からの出力データ、ならびに／またはポストプロセッサ５２８からの出力データを含み得る。キャッシングにより、計算エンジン５２４の性能に及ぼす（メモリ５１２、ＤＭＡコントローラ５１６、相互接続５１８などにおける待ち時間によって生じる）メモリアクセスのボトルネックの影響が低減され得る。ステートバッファ５２２は、オンチップ・メモリ・デバイスであってもよく、例えば、スタティック・ランダム・アクセス・メモリ（ＳＲＡＭ）を含み得る。いくつかの実施形態では、ステートバッファ５２２は、計算エンジン５２４の編成に基づいて分割され得る。例えば、ステートバッファ５２２は複数のＳＲＡＭバンクを含み、各バンクは、１行の計算エンジン５２４の入力データおよび重みを格納するように構成され得る。
【００６４】
[0075]計算エンジン５２４は、ニューラルネットワーク計算のための１つまたは複数の算術演算（ベクトル乗算など）を行うように構成された処理要素（ＰＥ）の配列を含み得る。いくつかの実施態様では、計算エンジン５２４は、行列畳み込みおよび／または行列乗算に使用され得る行列乗算ユニットであり、よって、畳み込み層または全結合層を実装するために使用され得る。例えば、いくつかの実施態様では、計算エンジン５２４は、行と列とに配置された処理要素の二次元配列を含むシストリックアレイを含み得る。
【００６５】
[0076]図６に、処理要素６２０の配列を含む簡略化された例示的な計算エンジン６００を示す。計算エンジン６００は、計算エンジン５２４の簡略化された例であり得る。図６に示される例では、計算エンジン６００は、Ｍ行の各々にＮ個のＰＥとＮ列の各々にＭ個のＰＥとを有するＰＥのＭ×Ｎ配列を含み得る。各ＰＥは、行入力バス６２２と、列入力バス６２４と、列出力バス６２６と、行出力バス６２８とを含み得る。ＰＥは、行入力バス６２２を介して同じ行の（左の）先行するＰＥから（または外部回路から）入力を受け取り得る。ＰＥはまた、列入力バス６２４を介して同じ列の（上の）先行するＰＥから（または外部回路から）も入力を受け取り得る。入力は浮動小数点値であり得る。ＰＥは、入力に基づいて浮動小数点演算（積和演算（ＭＡＣ）など）を行い、算術演算の結果を、列出力バス６２６を介して同じ列の後続の（下の）ＰＥに（または外部回路に）送り得る。ＰＥはまた、行出力バス６２８を介して、同じ行の（右の）後続のＰＥに入力を転送し得る。
【００６６】
[0077]計算エンジン６００の各行は、複数の入力データ要素を含む１つの入力データセットを処理し得るが、計算エンジン６００の各列は、異なる入力データセットからの入力データ要素の加重和を生成し得る。例えば、計算エンジン６００がＭ個の入力画素群６１０、６１２、６１４、…、および６１６を処理することになる場合、第１行は画素群６１０の入力データ要素を受け取り、第２行は画素群６１２の入力データ要素を受け取り、第３行は画素群６１４の入力データ要素を受け取り、以下同様であり、第Ｍ行は入力群６１６の入力データ要素を受け取り得る。各ＰＥは、一度に１つの入力データ要素を処理することになる乗算器６２３を含み得る。例えば、ＰＥは、（例えば行入力バス６２２から）入力データ要素および重みを受け取り、乗算器６２３を使用して、重み付き入力データ要素を表す乗算の積を生成し得る。重みは、畳み込みカーネル（すなわちフィルタ）の要素または全結合層の２つの層上のノード間の接続の重みであり得る。加えて、ＰＥは、同じ列の先行するＰＥから（例えば列入力バス６２４から）部分加重和も受け取り得る。部分加重和は、そのＰＥより上の行のＰＥによって受け取られた入力データセットの入力データ要素の加重和を表す。ＰＥは、重み付き入力データ要素を部分加重和に加算し、更新された部分加重和を（例えば列出力バス６２６を介して）同じ列の下のＰＥに渡し得る加算器６２５を含み得る。各列の最終行のＰＥは、その列のすべてのＰＥによって受け取られた入力データ要素の加重和を生成し得る。
【００６７】
[0078]計算エンジン６００の各ＰＥの演算は、計算エンジン６００とニューラル・ネットワーク・プロセッサ（ニューラル・ネットワーク・プロセッサ５０２など）の他の構成要素との間の相互運用性を向上させるためにクロック信号に同期され得る。各ＰＥはまた、加算器および乗算器回路の入力データ、重み、および出力データを格納し、回路へと回路からとのデータの流れを同期するために、順序論理回路（例えば、レジスタ、ラッチ、フリップフロップ、状態機械など）も含み得る。各ＰＥの順序論理回路を、同じクロック信号またはクロック信号の複製によってクロック制御して、データがクロックサイクル中に順次にＰＥに、かつ／またはＰＥから同期してシフトされ得るようにすることができる。例えば、第１のクロックサイクルでは、第２行のＰＥ６２０ｂが、画素群６１２の第１の入力データ要素と、第１行のＰＥ６２０ａからの画素群６１０の重み付きの第１の入力データ要素を含む部分和とを受け取り得る。第１のクロックサイクル内に、ＰＥ６２０ｂは、入力データ要素を重みと乗算し、乗算の積を部分和に加算して更新された部分和を生成し、更新された部分和を内部レジスタに格納し得る。第２のクロックサイクルでは、ＰＥ６２０ｂは更新された部分和を下の第３行のＰＥ６２０ｃに転送し、ＰＥ６２０ｃは乗算および累算を行って更新された部分和を生成し得る。第３のクロックサイクルでは、ＰＥ６２０ｃは更新された部分和を下の第４行の次のＰＥに転送し、次のＰＥは乗算および累算を行って更新された部分和を生成し得る。更新された部分和は、第Ｍのクロックサイクルで第Ｍ行のＰＥ６２０ｄによって出力バッファ６３０（ＰＳＵＭバッファとも呼ばれる）に出力されるまで、各列に沿って下方に伝搬され得る。
【００６８】
[0079]いくつかの実施態様では、計算エンジン６００の各列がニューラルネットワーク層の処理ノードに対応し、異なる重みセット｛ｗｉ｝を適用して、入力データセット｛ｘｉ｝ごとに異なる加重和
【数８】
2021510888.tif 000010
を生成し得る。
【００６９】
[0080]図５を参照すると、ポストプロセッサ５２８は、ニューラルネットワーク層の最終出力を生成するために出力バッファ５２６に格納され得る（畳み込み層や全結合層などの、ニューラルネットワーク層として機能し得る）計算エンジン５２４の出力に対して後処理を行うように構成され得る。図５に示される例では、ポストプロセッサ５２８は、活性化エンジン５２８ａと、プーリングエンジン５２８ｂとを含み得る。活性化エンジン５２８ａは、畳み込み層の出力に対して、Ｔａｎｈ、シグモイド、ＲｅＬＵなどといった１つまたは複数の活性化（非線形）関数を行って出力データを生成し、出力データをステートバッファ５２２で格納し得る。いくつかの実施態様では、活性化エンジン５２８ａは、１つまたは複数の乗算器回路を含み得る。プーリングエンジン５２８ｂは、畳み込み層または活性化エンジン５２８ａの出力に対して、例えば、最大プーリング、平均プーリングなどを行ってサブサンプルを生成し、サブサンプルをステートバッファ５２２で格納し得る。いくつかの実施態様では、プーリングエンジン５２８ｂは、１つまたは複数の乗算器回路も含み得る。プーリングエンジン５２８ｂおよび／または活性化エンジン５２８ａは、特定の畳み込み層についてはスキップされるように制御されてもよい。例えば、上記のように、ＣＮＮは、プーリング演算を行う前に複数の畳み込み演算およびＲｅＬＵ演算を行い得る。
【００７０】
[0081]いくつかの実施態様では、ポストプロセッサ５２８は、全結合層の出力に対してソフトマックス関数を行うことができるソフトマックスエンジン（図５には示されていない）も含み得る。上記のように、ソフトマックスエンジンは、全結合層からの実数値のスコアのベクトルを取り、その実数値のスコアのベクトルを、合計が１になる０から１までの確率値のベクトルにマップし得る。
【００７１】
[0082]読取りアクセスエンジン５３６は、例えば、計算エンジン５２４やポストプロセッサ５２８を含む読取りアクセス要求デバイスにステートバッファ５２２への読取りアクセスを提供し得る。書込みアクセスエンジン５３８は、例えば、ポストプロセッサ５２８を含む書込みアクセス要求デバイスにステートバッファ５２２への書込みアクセスを提供し得る。読取りアクセスエンジン５３６と書込みアクセスエンジン５３８とは各々、電力を削減し、待ち時間を短縮するために、一連のアクセス操作（複数のクロックサイクルにわたる複数の読取り操作または書込み操作など）を１回のアクセス操作に変換し得る。読取りアクセスエンジン５３６と書込みアクセスエンジン５３８とは各々、ステートバッファ５２２に基づいて編成され得る。例えば、読取りアクセスエンジン５３６と書込みアクセスエンジン５３８とは各々、各サブエンジンが対応するＳＲＡＭバンクへのアクセスを提供する、ステートバッファ５２２の複数のＳＲＡＭバンクに対応する複数のサブエンジンを含み得る。読取りアクセスエンジン５３６のサブエンジンは、（例えば、１行の計算エンジン５２４やポストプロセッサ５２８による）複数のデータ要素についての対応するＳＲＡＭバンクへの一連の読取りアクセス操作を、複数のデータ要素についての１回の読取りアクセスに変換し得る。書込みアクセスエンジン５３８のサブエンジンも、（例えばポストプロセッサ５２８による）対応するＳＲＡＭバンクにおいて複数のデータ要素を格納するための一連の書込みアクセスを、複数のデータ要素についての１回の書込みアクセスに変換し得る。
【００７２】
[0083]ディープ・ニューラル・ネットワークや畳み込みニューラルネットワークなどのニューラルネットワークは、数千以上の処理ノードおよび数百万以上のパラメータを含み得る。これらのパラメータは、大きな記憶空間を使用し得る。例えば、オリジナルのＡｌｅｘＮｅｔは、３２ビット浮動小数点（ＦＰ３２）形式で２００ＭＢを超える記憶空間を使用し得る。２００ＭＢほとんどすべてがノード間の接続の重みによって占められる。一般に、重みは大規模なグループとして配置され、各グループは１つの層の重みを含み、各グループ内の重みは特定の範囲内、例えば、−３．０から６．０までなどであり得る。これらの重みは一般には、わずかに異なる浮動小数点数であるので、ｚｉｐや、Ｌｅｍｐｌｅ−Ｚｉｖや、Ｈｕｆｆｍａｎアルゴリズムなどの圧縮法ではうまく圧縮できない可能性がある。
【００７３】
[0084]上記のように、ニューラルネットワークの訓練は、一般には、重みに少しの調整を加えることによって行われ、そのような少しの調整では、通常、浮動小数点精度が正しく機能する必要がある。低精度で訓練を行おうと試みるいくつかの実験があったが、その結果は、訓練プロセスの逆伝搬および勾配を処理するには８を上回るビットが必要であること示しているようである。他方、事前に訓練されたモデルを取得し、推論を実行すれば、例えば、ＣＣＤノイズや、照明の変化や、入力と訓練例との間のその他の低レベルの差などの入力中のノイズを処理し、より高レベルの類似性に焦点を当てるよう訓練され得るディープ・ニューラル・ネットワークの固有の特性によりそのような高精度が不要になり得る。よって、事前に訓練されたニューラルネットワークは、低精度の計算を一種のノイズとして扱い、精度の低い数でさえも正確な結果を生み出し得る。したがって、推論に量子化された値を使用しても最終結果に影響を及ぼさない可能性がある。加えて、訓練プロセスを再度行う必要なく使用できる、ＦＰ３２データ形式のパラメータを用いる多くの公知の、または事前に訓練されたモデルもあり得る。よって、これらの公知の、または事前に訓練されたネットワークのパラメータを、８ビットの符号なし整数（ＵＩＮＴ８）などの精度の低い整数に変換することにより、より高速で、より費用効果の高い計算が可能となり得る。
【００７４】
[0085]ニューラルネットワークのパラメータのデータサイズを縮小する１つの方法が、浮動小数点形式のパラメータを、８ビット（すなわち１バイト）の整数などのより短い整数に量子化することである。例えば、ＦＰ３２の数を８ビットの整数に量子化することにより、データサイズを元のデータサイズの２５％に縮小することができる。一般には、管理を容易にし、記憶効率を高めるために、各整数のビット数が８の倍数である（すなわちバイト単位で整列される）ことが望ましい。いくつかの実施態様では、量子化およびデータサイズ縮小は、浮動小数点値の対称線形量子化によって達成され得る。例えば、パラメータが−３．０から６．０の範囲内である場合、パラメータを、例えば、８ビットの整数に量子化するには、浮動小数点数−６．０が符号付き整数−１２８に量子化され、浮動小数点数６．０が整数＋１２７に量子化され、浮動小数点数０が整数０に量子化され得る。パラメータ範囲の最小値および最大値を、最小値が常に最大の負の数になるように制約すれば、行列乗算のオペランドへのオフセットを回避し得るので、実施に好都合であり得る。しかしながら、対称量子化は、少なくとも一部のニューラルネットワークには許容できない精度の損失を引き起こし得る。例えば、対称量子化では、ネットワークパラメータの範囲が対称でない場合、低い範囲または高い範囲の整数が絶対に使用されず、量子化分解能が低減される可能性がある。
【００７５】
[0086]いくつかの実施態様では、量子化およびデータサイズ縮小は、層ごとのネットワークパラメータの最小値および最大値を格納し、次いで各浮動小数点値を、ある範囲（８ビットの符号なし整数では０〜２５５など）内の線形の整数セット内の最も近い整数（８ビットの整数など）に非対称に量子化することによって達成されてもよく、範囲の最低値は層ごとのパラメータの最小値に対応し、範囲の最高値は層ごとのパラメータの最大値に対応し得る。例えば、パラメータが−３．０から６．０の範囲内である場合、量子化された整数０は浮動小数点数−３．０を表し、量子化された整数２５５は浮動小数点数６．０を表し、量子化された整数１２８は浮動小数点数約１．５を表し得る。このようにして、整数の全範囲が利用され、量子化分解能が対称量子化に優って改善され得る。
【００７６】
[0087]ネットワークパラメータの量子化は、計算を、例えば、８ビットの整数で行うことによって、推論のための計算リソースを減らすこともできる。例えば、８ビットの値のフェッチには、ＦＰ３２の値に使用されるメモリ帯域幅の２５％しか使用されず、よって、キャッシュがより十分に利用され、ＲＡＭアクセスのボトルネックが回避され得る。１クロックサイクル当たりに多くの操作を行うために８ビットの整数を使用して単一命令複数データ（ＳＩＭＤ）操作も行われ得る。８ビットの整数パラメータを使用した推論を行うためにデジタル信号プロセッサやベクトルプロセッサなどの多くのプロセッサを使用することができる。よって、計算に８ビットのパラメータを使用することにより、推論が加速され、使用電力が削減され、記憶および計算容量がより少ないシステム（モバイル機器や組込みシステムなど）または浮動小数点演算を効率的に行うのに適さないシステムで推論を行うことが可能となり得る。
【００７７】
[0088]量子化された値は、大量の低精度演算が許容できる場合（畳み込みなど）に使用され得る。しかしながら、活性化関数やプーリング関数などのいくつかの演算では、高精度演算が行われ得る。よって、いくつかの演算には逆量子化された値が使用される必要があり得る。したがって、いくつかの実施態様では、重みや特徴マップなどの、畳み込みまたは行列乗算に使用されるデータが量子化された値に符号化され、活性化層／プーリング層への入力は逆量子化された値に逆変換される必要があり得る。
【００７８】
[0089]図７Ａに、浮動小数点数を使用した例示的な畳み込み演算７００を示す。畳み込み演算７００はブロック７１０から開始し、そこで、重みや浮動小数点値で表された試験サンプルなどの入力が畳み込み層の入力で受け取られ得る。次いで浮動小数点入力は、例えば、図５の装置５００や図６の計算エンジン６００を使用して、畳み込みまたはその他の行列乗算に使用され得る。部分加重和などの畳み込みまたはその他の行列乗算の出力もまた、浮動小数点形式であってもよく、活性化エンジンおよび／またはプーリングエンジンによるさらなる処理のために出力バッファ（出力バッファ５２６など）に送られ得る。上記のように、活性化エンジンおよび／またはプーリングエンジンは、高精度浮動小数点演算を行い得る。上記のように、そのような演算は、大きな記憶空間、高いバス帯域幅、および高い浮動小数点計算パワーを必要とし得る。
【００７９】
[0090]図７Ｂに、整数を使用した例示的な畳み込み演算７４０を示す。畳み込み演算７４０は、畳み込み演算７００より少ないリソースを使用してより効率的に行われ得る。畳み込み演算７００の場合と同様に、ブロック７１０で、浮動小数点値で表された重みや試験サンプルなどの入力が畳み込み層の入力で受け取られ得る。いくつかの実施形態では、最小値および最大値が事前に計算され得る。例えば、重みは一般にロード時に既知であり、重みの範囲を重みと共に定数として格納することができる。場合によっては、畳み込み層への入力（例えば、画像の入力は通常０．０から２５５．０の範囲内のＲＧＢ値である）および多くの活性化関数の出力も既知の範囲を有し、よって、範囲を決定するための畳み込み層への入力の分析が不要であり得る。いくつかの実施形態では、入力の最小値および最大値、例えば、前の層の出力である入力は、既知ではなく、ブロック７４２およびブロック７４４で決定され得る。例えば、２つの８ビットの数の和は９ビットを有し、２つの８ビットの数の積は１６ビットを有し、行列乗算における一連の８ビットの乗算の和は１６を上回るビット、例えば２０ビットから３２ビットを有し得る。
【００８０】
[0091]ブロック７５０で、浮動小数点入力が、８ビットの符号付き整数（ＩＮＴ８）、８ビットの符号なし整数（ＵＩＮＴ８）、１６ビットの符号付き整数（ＩＮＴ１６）、１６ビットの符号なし整数（ＵＩＮＴ１６）などの符号付きまたは符号なしの整数に量子化され得る。量子化は、例えば、ブロック７４２およびブロック７４４で決定された最小値および最大値に基づく、上記の、以下でより詳細に説明されるような対称または非対称の線形量子化であり得る。ブロック７６０で、量子化された整数を使用して畳み込みまたはその他の行列乗算が行われ得る。上記のように、畳み込みまたはその他の行列乗算は、量子化された整数を使用してより効率的に行われ、より少ないリソースを使用して行われ得る。ブロック７７０で、畳み込みの整数出力が、ブロック７３０の浮動小数点出力が浮動小数点演算を必要とし得る後続の層（活性化層など）によって使用され得るように、最小値および最大値に基づいて逆量子化され得る。
【００８１】
[0092]量子化は、実数値を整数値に変換する変換に基づいて行われ得る（逆量子化についてはその逆である）。量子化に使用できる例示的な変換は以下を含む。
Ｘ＝ＳＸ・Ｘｑ＋バイアス  （１１）
および
Ｘ＝ＳＸ・Ｘｑ−バイアス  （１２）
式中、Ｘｑは、量子化された整数値であり、Ｘは、ＦＰ３２の実数値であり、ＳＸは、スケーリングに使用される正のＦＰ３２の数（すなわち、スケーリング係数）である。多くの場合、ＦＰ３２の実数値０を、最適化された実施態様のために量子化された整数値で厳密に表せることが望ましい。例えば、上記のように、畳み込み層またはプーリング層では、ゼロパディングを実施することが有用であり得る。多くの場合、行列（特徴マップなど）は、多くの実数値０を含み得る疎行列であり得る。そのような層の量子化された実施態様が実行可能であるためには、実数値０が、ゼロ点整数と呼ばれる量子化された数で厳密に表せる（すなわち、実数値０についての量子化誤差がない）ことが望ましい。加えて、ＣＮＮにおける一般的な最適化は、０であることが既知である特定のパディング計算をスキップすることである。これが可能であり得るのは、０を厳密に表せる場合のみである。実数値０を量子化された整数によって正確に表せない、すなわち、ゼロ点整数が実数値０に厳密に対応しない場合、実数値０は通常ランダムに分配されず、よって量子化誤差がゼロ平均値を有しない場合があるので、結果に不正確さが導入される可能性があり、結果にバイアスを導入し得る。
【００８２】
[0093]式（１１）では、Ｘが０になるには、ゼロ点整数がＸｑｚ＝−バイアス／ＳＸになるはずである。よって、Ｘｑｚが整数であるためには−バイアス／ＳＸが整数である必要があり、これを満たすことは容易ではない場合もある。いくつかの実施態様では、バイアスが省かれ、その結果として対称量子化が得られ得る。上記のように、対称量子化は、少なくとも一部のニューラルネットワークには許容できない精度の損失を引き起こし得る。
【００８３】
[0094]式（１２）では、Ｘ＝０では、ＳＸを任意の値とすることができ、バイアスをゼロ点整数Ｘｑｚとすることができる。よって、式（１２）では、実数値０を厳密に表せるという条件を容易に満たすことができ、ゼロ点整数は定義上整数値である。したがって、式（１２）を以下のように書き換えることができる。
【数９】
2021510888.tif 000011
または
例えば、Ｘの範囲が［−０．５，３．５］である場合、ＳＸは１／６４であってもよく、Ｘｑｚは３２であってもよく、これにより、Ｘ＝−０．５の場合にはＸｑ＝３２＋（６４・（−０．５））＝０、Ｘ＝０の場合にはＸｑ＝３２＋６４・０＝３２＝Ｘｑｚ、Ｘ＝３．４９９の場合にはＸｑ＝３２＋６４・３．４９９＝２５５になり得る。式（１２）または式（１３）によって定義される変換は、浮動小数点入力の範囲が実数値０に対して対称であること（すなわち、−最大値と最大値とによる範囲）を前提としないので、非対称であることに留意されたい。（符号付き整数の代わりに）８ビットの符号なし整数（ＵＩＮＴ８）を使用して、式（１２）または式（１３）によって定義される変換を使用するＦＰ３２の入力を表すこともできることにも留意されたい。
【００８４】
[0095]重み行列Ｗと入力データ（特徴マップなど）行列Ｘとの乗算から得られる積行列は、次式によって決定され得る。
【数１０】
2021510888.tif 000012
式（１４）に示される行列Ｘおよび行列Ｗは２×２行列であるが、行列Ｘおよび行列Ｗのサイズは変動し得ることに留意されたい。例えば、行列Ｘは任意のＭ×Ｎ行列であり、行列Ｗは任意のＮ×Ｋ行列であり得る。上記のような浮動小数点実数値Ｘから量子化された整数値Ｘｑへの変換では、実数値の浮動小数点数の行列の乗算は、量子化された重み行列と、量子化された特徴マップ行列と、２つのゼロ点整数（特徴マップの）Ｘｑｚおよび（重み行列の）Ｗｑｚと、２つの浮動小数点スケーリング係数（特徴マップの）ＳＸおよび（重み行列の）ＳＷとを使用した量子化された入力値の行列の乗算によって計算され得る。
【００８５】
[0096]例えば、いくつかの実施態様では、式（１４）に記載される行列乗算は、以下の展開形を使用して行われ得る。
【数１１】
2021510888.tif 000013
式（１５）で示されるように、たとえ量子化プロセスが、ＵＩＮＴ８計算がＦＰ３２計算よりずっと高速であるために、重みおよび特徴マップのデータサイズを縮小し、より効率的な計算を実現することができても、式（１５）によって示される実施態様は、二次展開による４つの積和を含み、これは複雑であり、よって計算が高くつく可能性がある。例えば、図６に示されるようなＰＥ配列を使用してこれら４つの積和を行うには、データがＰＥ配列を４回通過する必要があり、通過ごとに１つの積和が計算され得る。よって、式（１５）で示される実施態様は求められるほど効率的ではない可能性がある。
【００８６】
[0097]特定の実施形態によれば、重み行列Ｗと入力データ（特徴マップなど）行列Ｘとの乗算は、二次展開なしで、以下の形でずっと効率的に行われ得る。
【数１２】
2021510888.tif 000014
よって、式（１６）による行列乗算は３ステップで行われ得る。第１のステップでは、量子化された入力（重みや特徴マップなど）が、量子化された入力からゼロ点整数ＸｑｚまたはＷｑｚを減算して差分値を生成することによってシフトされ得る。
Ｘａｄｊ＝（Ｘｑ（ｉｋ）−Ｘｑｚ）  （１７）
および
Ｙａｄｊ＝（Ｗｑ（ｋｊ）−Ｗｑｚ）  （１８）
式中、ＸａｄｊおよびＹａｄｊは、入力が８ビットの符号なし整数に量子化される場合には９ビットの符号付き整数であり得る。このようにして、整数値ＸｑｚまたはＷｑｚに量子化される実数値０は、Ｘｑｚ−Ｘｑｚ＝０およびＷｑｚ−Ｗｑｚ＝０であるので、９ビットの符号付き整数形式の整数値０になり得る。上記のように、特徴マップは、多くの実数値０を含むか、または多くのパディングされた０を含み得る疎行列である可能性があり、０との乗算は０になるので、これにより後続の乗算がさらに簡略化され得る。
【００８７】
[0098]第２のステップでは、第１のステップで生成された、シフトされた量子化入力ＸａｄｊおよびＹａｄｊが、次式に従って乗算および累算され得る。
【数１３】
2021510888.tif 000015
上記のように、ＸｑおよびＷｑが８ビットの符号なし整数である場合、ＸａｄｊおよびＹａｄｊは、９ビットの符号付き整数であり得る。よって、乗算は９ビットの符号付き整数に対して行われ、各乗算の積は、例えば、１８ビットの整数で表され得る。積の和Ｚは、例えば、３２ビットの整数で表され得る。
【００８８】
[0099]第３のステップでは、第２のステップからの積の和Ｚが、整数の積和を浮動小数点数に変換するために、浮動小数点スケーリング係数ＳＸＳＷによってスケーリングされ得る。
Ｐ（ｉｊ）＝ＳＸＳＷ・Ｚ  （２０）
よって、式（１５）を使用した実施態様と比較して、行列乗算のために、４つの積和ではなく、ただ１つの積和が計算され、よってＰＥ配列により１回のパスで行われ得る。
【００８９】
[0100]上記のように、シフトされた量子化入力ＸａｄｊおよびＹａｄｊは、９ビットの符号付き整数（ＩＮＴ９）で表されてもよく、よって乗算はＩＮＴ９のオペランドを使用して行われてもよく、９は２の累乗ではない。メモリにおける２の累乗ではないビット数を有するデータ型の格納および管理は、あまり効率的はない場合もある。ＩＮＴ９データを１６ビット形式で格納すると記憶空間が無駄になり得る。特定の実施形態によれば、量子化された入力ＸｑおよびＷｑは、ＵＩＮＴ８形式でメモリに保存され、メモリから取得され得る。行列乗算の前に式（１７）および式（１８）に従って量子化された入力からゼロ点整数ＸｑｚまたはＷｑｚを減算することにより量子化された入力ＸｑおよびＷｑをシフトさせるために、減算エンジンを含む前処理モジュールが使用され得る。シフトされた量子化入力ＸａｄｊおよびＹａｄｊを使用した行列乗算の結果は、行列乗算の結果を後続の層への入力としての浮動小数点形式のより正確な実数値に変換するために、浮動小数点スケーリング係数ＳＸＳＷによってスケーリングされ得る。
【００９０】
[0101]図８に、特定の実施形態による整数を使用した例示的な畳み込み演算８００を示す。図７Ｂの畳み込みの場合と同様に、ブロック８１０で、浮動小数点値で表された、重みや試験サンプルまたは中間特徴マップなどの畳み込み層への入力が受け取られ得る。いくつかの実施形態では、前の層の出力である入力などの入力の最小値および最大値は、事前に知られておらず、ブロック８１２およびブロック８１４で決定され得る。いくつかの実施形態では、最小値および最大値が事前に計算され得る。例えば、ニューラルネットワークの重みは一般にロード時に既知であり、重みの範囲を重みと共に定数として格納することができる。場合によっては、入力データ（０．０から２５５．０の範囲内のＲＧＢ値で表された画像など）および多くの活性化関数の出力も既知の範囲を有し、よって、範囲を決定するための畳み込み層への入力の分析が不要であり得る。
【００９１】
[0102]ブロック８２０で、浮動小数点入力が、８ビットの符号なし整数（ＵＩＮＴ８）、８ビットの符号付き整数（ＩＮＴ８）、１６ビットの符号付き整数（ＩＮＴ１６）、１６ビットの符号なし整数（ＵＩＮＴ１６）などの符号付きまたは符号なしの整数に量子化され得る。量子化は、例えば、ブロック８１２およびブロック８１４で決定された最小値および最大値に基づく、式（１２）または式（１３）に関して上述したような、非対称の線形量子化であり得る。量子化された入力はメモリ８２５に格納されてもよく、メモリ８２５はオンチップ・ステート・バッファやオフチップメモリであり得る。いくつかの実施形態では、メモリ８２５は、スケーリング係数（ＳＸやＳＷなど）およびゼロ点整数（ＸｑｚやＷｑｚなど）も格納し得る。
【００９２】
[0103]ブロック８３０で、量子化された入力がメモリ８２５から読み取られ、式（１７）および式（１８）に関して上述したように、差分値を生成するために、量子化された入力からゼロ点整数を減算することによって前処理され得る。やはり上記のように、量子化された入力からゼロ点整数を減算することにより、量子化された入力がシフトされ、量子化された入力が、例えば、９ビットの符号付き整数の差分値に変換され得る。前処理の後、整数値（すなわち、ゼロ点整数）に量子化される実数値０が９ビットの符号付き整数形式の整数値０になり、入力データ（特徴マップなど）は、多くの実数値０を含むか、または多くのパディングされた０を含み得る疎行列である可能性があり、０との乗算は０になるので、これにより後続の乗算が簡略化され得る。
【００９３】
[0104]ブロック８４０で、式（１９）に関して上述したように、シフトされた量子化整数（差分値など）を使用して畳み込みまたはその他の行列乗算が行われ得る。やはり上記のように、畳み込みまたはその他の行列乗算は、量子化された整数を使用してより効率的に行われ、より少ないリソースを使用して行われ得る。畳み込みは、８ビットの符号なし整数ではなく、例えば、９ビットの符号付き整数を使用して行われ、よって、いくつかの実施態様で使用される積和演算（ＭＡＣ）ハードウェア（処理要素など）は、８ビットの符号なし整数に使用されるＭＡＣハードウェアとわずかに異なり得ることに留意されたい。
【００９４】
[0105]ブロック８５０で、式（２０）に関して上述したように、浮動小数点形式のより正確な実数値に変換するために、畳み込みまたはその他の行列乗算（すなわち、積和）の整数出力がスケーリング係数（ＳＸＳＷなど）によってスケーリングされ得る。ブロック８６０の浮動小数点出力は、浮動小数点演算を必要とし得る後続の層（活性化層など）への入力として使用され得る。
【００９５】
[0106]様々な実施態様において、上記の畳み込み演算または行列乗算は、ハードウェア、ソフトウェア、またはソフトウェアとハードウェアの組み合わせとして行われ得る。例えば、いくつかの実施態様では、上記の畳み込み演算または行列乗算は、例えば、並列処理ユニット、ベクトルプロセッサ、デジタル信号プロセッサ、グラフィック・プロセッシング・ユニット、テンソル・プロセッシング・ユニット、ネットワーク・プロセッシング・ユニット、ＦＰＧＡ、ＡＳＩＣなどによって実行され得るソフトウェアで実施され得る。いくつかの実施態様では、上記の畳み込み演算または行列乗算は、装置５００と同様の装置または何らかの変更を伴う計算エンジン６００と同様の計算エンジンを使用して実施され得る。
【００９６】
[0107]図９に、特定の実施形態による例示的な畳み込み演算（畳み込み演算８００など）を行うための簡略化された例示的な計算エンジン９００を示す。計算エンジン９００は、計算エンジン５２４の具体的な実施態様であり、何らかの変更を伴う計算エンジン６００と同様であり得る。計算エンジン９００は、Ｍ行の各々にＮ個のＰＥとＮ列の各々にＭ個のＰＥとを有するＰＥのＭ×Ｎ配列を含み得る。各行はまた、メモリまたはバッファから（ＵＩＮＴ８形式などの）量子化された入力および（ＵＩＮＴ８形式などの）ゼロ点整数を取る減算エンジン９３０ａ、９３０ｂ、９３０ｃ、…、または９３０ｄも含み得る。例えば、減算エンジンへの入力は、８ビットの重みＷｑ９３４、８ビットの入力データ要素Ｘｑ９３２（画像または特徴マップの画素など）、重みの８ビットのゼロ点整数Ｗｑｚ９３６、および入力データ要素の８ビットのゼロ点整数Ｘｑｚ９３８を含み得る。ゼロ点整数Ｗｑｚ９３６およびゼロ点整数Ｘｑｚ９３８は、それぞれ、例えば、式（１２）および式（１３）に関して上述したように、重みの範囲および入力データ要素の範囲に基づいて決定され得る。いくつかの実施態様では、Ｘｑｚ９３８およびＷｑｚ９３６は、ソフトウェアによってプログラム可能であり得る。減算エンジンは、重みＷｑ９３４からゼロ点整数Ｗｑｚ９３６を減算して、［−２５５，２５５］の範囲内のＩＮＴ９形式のシフトされた重みＷｑ＿ｓｈｉｆｔ９４４（差分値など）を生成し、入力データ要素Ｘｑ９３２からゼロ点整数Ｘｑｚ９３８を減算して、ＩＮＴ９形式のシフトされた入力データ要素Ｘｑ＿ｓｈｉｆｔ９４２を生成し得る。減算エンジンは、ＩＮＴ９形式のシフトされた重みＷｑ＿ｓｈｉｆｔ９４４およびＩＮＴ９形式のシフトされた入力データ要素Ｘｑ＿ｓｈｉｆｔ９４２を、各行の第１のＰＥ９２０ａ、９２０ｂ、９２０ｃ、…、または９２０ｄに渡し得る。減算エンジンはまたＷｑｚ９３６およびＸｑｚ９３８を次の行の減算エンジンに渡し得る。
【００９７】
[0108]各ＰＥは、行入力バス９２２と、列入力バス９２４と、列出力バス９２６と、行出力バス９２８とを含み得る。ＰＥは、行入力バス９２２を介して同じ行の（左の）先行するＰＥから（または減算エンジンから）入力を受け取り得る。入力は、８ビットの整数などの整数であり得る。ＰＥはまた、列入力バス９２４を介して同じ列の（上の）先行するＰＥから（または外部回路から）も入力を受け取り得る。入力は、８以上のビットを各々含む整数であり得る。ＰＥは、入力（９ビットの符号付き整数など）に基づいて整数算術演算（積和演算（ＭＡＣ）など）を行い、算術演算の結果を、列出力バス９２６を介して同じ列の後続の（下の）ＰＥに（またはバッファなどの外部回路に）送り得る。ＰＥはまた、行出力バス９２８を介して、同じ行の（右の）後続のＰＥに入力を転送し得る。
【００９８】
[0109]計算エンジン９００の各行は、複数の入力データ要素を含む１つの入力データセットを処理し得るのに対し、計算エンジン９００の各列は、異なる入力データセットからの入力データ要素の加重和を生成し得る。例えば、計算エンジン９００がＭ個の入力画素群９１０、９１２、９１４、…、および９１６を処理することになる場合、第１行は画素群９１０の入力データ要素を受け取り、第２行は画素群９１２の入力データ要素を受け取り、第３行は画素群９１４の入力データ要素を受け取り、以下同様であり、第Ｍ行は入力群９１６の入力データ要素を受け取り得る。各ＰＥは、一度に１つの入力データ要素（９ビットの符号付き整数形式の入力画素など）および１つの（ＩＮＴ９形式などの）重みを扱うことになる乗算器９２３を含み得る。例えば、ＰＥは、（例えば行入力バス９２２から）入力データ要素および重みを受け取り、乗算器９２３を使用して、重み付き入力データ要素を表す乗算の積を生成し得る。重みは、畳み込みカーネル（すなわちフィルタ）の要素または全結合層の２つの層上のノード間の接続の重みであり得る。加えて、ＰＥは、同じ列の先行するＰＥから（例えば列入力バス９２４から）部分加重和も受け取り得る。部分加重和は、そのＰＥより上の行のＰＥによって受け取られた入力データセットの入力データ要素の加重和を表す。ＰＥは、重み付き入力データ要素を部分加重和に加算し、更新された部分加重和を（例えば列出力バス９２６を介して）下のＰＥに渡し得る加算器９２５を含み得る。最終行のＰＥ（ＰＥ９２０ｄなど）は、同じ列のすべてのＰＥによって受け取られた入力データ要素の加重和を生成し得る。
【００９９】
[0110]計算エンジン９００の各ＰＥの演算は、計算エンジン９００とニューラル・ネットワーク・プロセッサ（ニューラル・ネットワーク・プロセッサ９０２など）の他の構成要素との間の相互運用性を向上させるためにクロック信号に同期され得る。各ＰＥはまた、加算器および乗算器回路の入力データ、重み、および出力データを格納し、回路へと回路からとのデータの流れを同期するために、順序論理回路（例えば、レジスタ、ラッチ、状態機械など）も含み得る。各ＰＥの順序論理回路を、同じクロック信号またはクロック信号の複製によってクロック制御して、データがクロックサイクル中に順次にＰＥに、かつ／またはＰＥからシフトされ得るようにすることができる。例えば、第１のクロックサイクルでは、第２行のＰＥ９２０ｂが、画素群９１２の第１の入力データ要素と、第１行のＰＥ９２０ａからの画素群９１０の重み付きの第１の入力データ要素を含む部分和とを受け取り得る。第１のクロックサイクル内に、ＰＥ９２０ｂは、入力データ要素を重みと乗算し、乗算の積を部分和に加算して更新された部分和を生成し、更新された部分和を内部レジスタに格納し得る。第２のクロックサイクルでは、ＰＥ９２０ｂは更新された部分和を下の第３行のＰＥ９２０ｃに転送し、ＰＥ９２０ｃは乗算および累算を行って更新された部分和を生成し得る。第３のクロックサイクルでは、ＰＥ９２０ｃは更新された部分和を下の第４行の次のＰＥに転送し、次のＰＥは乗算および累算を行って更新された部分和を生成し得る。更新された部分和は、第Ｍのクロックサイクルで第Ｍ行のＰＥ９２０ｄによって出力バッファ９４０に出力されるまで、各列に沿って下方に伝搬され得る。
【０１００】
[0111]いくつかの実施態様では、出力バッファ９４０からの部分和は、後続の層が使用するための浮動小数点形式の実数値に変換するために、活性化エンジン（活性化エンジン５２８ａなど）またはプーリングエンジン（プーリングエンジン５２８ｂなど）によって、ＳＸＳＷなどのスケーリング係数を使用してスケーリングされ得る。
【０１０１】
[0112]式（１６）に示されるように因数分解形で行列乗算を行い、ＰＥ配列の前で減算エンジンを使用して符号なし整数入力をシフトさせて差分値を生成することによっていくつかの利点が得られ得る。例えば、入力データ（画像または特徴マップにおける重みや画素値など）は、ＵＩＮＴ８形式でメモリに格納され、これにより、ＩＮＴ９形式のデータより容易なハードウェア設計および効率的な記憶および管理が可能になり得る。ソフトウェアは８ビット形式のデータを扱い、９ビットの算術演算を認識しなくてもよく、これにより、９ビット形式のデータを保持するメモリをアドレス指定するよりも容易なソフトウェア設計が可能になり得る。量子化誤差なしで非ゼロの符号なし整数（すなわちゼロ点整数）に非対称に量子化される実数値０が、乗算の前に減算エンジンによって符号付き整数値０に変換され、これにより後続の乗算が簡略化され得る。各行列乗算および逆量子化は、ＰＥ配列を使用して１回のパスで行われ得る。
【０１０２】
[0113]９ビットの算術演算を行うことにより、８ビットの符号なし整数を使用した算術演算と比較して、シリコン面積および動作周波数の点でハードウェアに対する影響が最小限に抑えられ得る。例えば、ＵＩＮＴ８の乗算および加算を計算するためのシリコン面積（または価格）をＡとすると、ＵＩＮＴ１６の乗算および加算を計算するためのシリコン面積（または価格）は約４Ａであり、ＵＩＮＴ３２の乗算および加算を計算するためのシリコン面積（または価格）は約１６Ａであり得るのに対し、ＦＰ３２の乗算および加算を計算するためのシリコン面積（または価格）は約２０Ａであり得る。ＩＮＴ９オペランドを使用した算術演算は、ＵＩＮＴ８オペランドを使用した算術演算と比較して、最小限の余分なハードウェア（約１．０５Ａなど）で達成可能であり得る。よって、ＦＰ３２オペランドを使用した行列乗算と比較して、本明細書で開示される技法を使用した行列乗算は、計算コストを約１９分の１に削減することができる（すなわち、２０Ａ／１．０５Ａ）。
【０１０３】
[0114]図１０は、特定の実施形態による人工ニューラルネットワークにおける計算を加速する例示的な方法を示す簡略化された流れ図１０００である。この例示的な方法は、例えば、ＧＰＵ、ＴＰＵ、フィールド・プログラマブル・ゲート・アレイ（ＦＰＧＡ）、システム・オン・チップ（ＳｏＣ）、特定用途向け集積回路（ＡＳＩＣ）、プログラマブル・アレイ・ロジック（ＰＡＬ）、複合プログラマブル・ロジック・デバイス（ＣＰＬＤ）、ニューラル・ネットワーク・プロセッサ５０２、計算エンジン５２４もしくは９００、または命令コードを有する汎用コンピュータなど、上記のシステムを使用して実施され得る。命令コードは、非一時的な記憶媒体（メモリデバイスなど）に格納され得る。図１０に示され、以下で説明される方法は、例示であり非限定的であることが意図されている。
【０１０４】
[0115]任意選択で、ブロック１０１０で、人工ニューラルネットワークの層（畳み込み層など）への浮動小数点入力が受け取られ得る。浮動小数点入力は、人工ニューラルネットワークの層の重みおよび／または入力データ要素を含み得る。例えば、重みは、事前に訓練されたニューラルネットワークの重みであり得る。入力データ要素は、例えば、ニューラルネットワークによって分析されるべき画像やニューラルネットワークの先行する層によって生成された特徴マップを含み得る。浮動小数点入力は、例えば、３２ビットの浮動小数点形式であり得る。
【０１０５】
[0116]任意選択で、ブロック１０２０で、浮動小数点入力がｎビットの整数入力に線形に量子化され、ｎは２の累乗または８の累乗、例えば８や１６であり得る。量子化は非対称であってもよく、浮動小数点入力の最小値が整数ゼロとして量子化され、浮動小数点入力の最大値が２ｎ−１として量子化され、浮動小数点入力のゼロ値が量子化誤差なしでゼロ点整数値として量子化され得る。いくつかの実施形態では、量子化は、例えば、式（１２）や式（１３）を使用したスケーリング係数とバイアス（ゼロ点整数など）とに基づくものであり得る。例えば、ｎ＝８であり、入力（重みなど）が−０．５から３．５の範囲内である場合、入力の最小値（浮動小数点数−０．５）は整数０として量子化され、入力の最大値（浮動小数点数３．５）は整数２５５として量子化され、浮動小数点値０は整数３２（すなわちゼロ点整数）として量子化され得る。よって、浮動小数点入力の範囲が浮動小数点ゼロに対して対称でない場合、量子化された整数入力の範囲はゼロ点整数に対して対称ではない場合がある。層の重みと入力データ要素とは、異なる範囲を有する場合があり、よってそれぞれの範囲に基づいて独立して量子化され得る。したがって、重みのゼロ点整数は入力データ要素のゼロ点整数と異なる場合があり、重みのスケーリング係数は入力データ要素のスケーリング係数と異なる場合がある。
【０１０６】
[0117]任意選択で、ブロック１０３０で、整数入力が、バッファや揮発性または不揮発性メモリデバイスなどの記憶装置に格納され得る。浮動小数点入力（３２ビットや４バイトの浮動小数点値など）が、例えば、８ビットの符号なし整数として量子化されるので、整数入力を格納するための記憶空間のサイズは著しく縮小され得る。上記のように、各整数入力のビット数が、８や１６などの、２の累乗または８の倍数なので、整数入力は、記憶装置により効率的に格納され、ソフトウェアによってより容易に管理され得る。
【０１０７】
[0118]ブロック１０４０で、畳み込み層が記憶装置から整数入力を読み取り得る。整数入力のデータサイズが浮動小数点入力と比較してずっと小さいので、記憶装置から読み取られるべきデータの量およびデータを転送するために使用される帯域幅が著しく低減され得る。
【０１０８】
[0119]ブロック１０５０で、ゼロ点整数に量子化される浮動小数点入力のゼロ値が今度は整数ゼロで表されるように、整数入力がゼロ点整数だけシフトされ得る。シフトは、例えば、図９に関して上述したように、整数入力からゼロ点整数を減算して差分値を生成するように構成された減算エンジンの配列によって行われ得る。シフト後に、整数入力は１ビット多い符号付き整数に変換され得る。例えば、整数入力が８ビットの符号なし整数である場合、シフトされた整数入力は９ビットの符号付き整数であり得る。例えば、ブロック１０２０に関して上述した例では、シフト後に、整数０として量子化される浮動小数点数−０．５は符号付き整数−３２で表され、整数２５５として量子化される浮動小数点数３．０は符号付き整数２２３で表され、整数３２として量子化される浮動小数点値０（すなわちゼロ点整数値）は今度は符号付き整数０で表され得る。
【０１０９】
[0120]ブロック１０６０で、積和を生成するためにシフトされた整数入力に対して積和演算が行われ得る。図９に関して上述したように、いくつかの実施態様では、積和演算は複数の行を含むＰＥ配列によって行われ、そこで各行のＰＥは対応する減算エンジンからシフトされた整数入力を受け取り得る。各ＰＥは、同じ列のＰＥからの乗算の積が合計されて積和が生成され得る、整数の積和を行うように構成され得る。
【０１１０】
[0121]ブロック１０７０で、積和が浮動小数点スケーリング係数でスケーリングされて、後続の層によってさらなる処理に使用され得る浮動小数点出力が生成され得る。例えば、浮動小数点出力は、活性化層または別の畳み込み層によってさらに処理され得る特徴マップの一部であり得る。いくつかの実施形態では、スケーリングは、例えば、活性化層、プーリング層、または浮動小数点乗算を行うことができる人工ニューラルネットワークの任意の他の処理モジュールで行われ得る。浮動小数点スケーリング係数は、式（２０）に示されるように重みのスケーリング係数と入力データ要素の重みとの積であり得る。
【０１１１】
[0122]図１０には例示的な方法が順次操作として記載されているが、いくつかの操作は並列に、または同時に行われ得る。いくつかの操作は異なる順序で行われ得る。操作が、図に含まれていない追加的なステップを有する場合もある。いくつかの操作は任意選択であり、よって様々な実施形態において省略される場合もある。いくつかの操作は別の操作と一緒に行われ得る。さらに、この方法の実施形態は、ハードウェア、ソフトウェア、ファームウェア、ミドルウェア、マイクロコード、ハードウェア記述言語、またはこれらの任意の組み合わせとして実施され得る。
【０１１２】
[0123]いくつかの実施態様では、上記の技法を、人工ニューラルネットワーク以外のシステムにおいて畳み込み演算または行列乗算を行うために使用することもできる。例えば、本明細書で開示される技法を、ニューラルネットワークを使用しない画像処理における畳み込み演算に使用することができる。
【０１１３】
[0124]いくつかの実施態様では、上記の技法を、１６ビット、３２ビット、６４ビット、もしくはそれ以上の浮動小数点もしくは小数点データ、または１６ビット、３２ビット、６４ビット、もしくはそれ以上の整数データなどの、高精度形式のデータのための畳み込み演算またはその他の行列乗算を行うために使用される記憶空間、搬送帯域幅、および計算パワーを削減するために使用することができる。いくつかの実施態様では、高精度データのデータを、例えば、１６ビットの浮動小数点データや１６ビットもしくは８ビットの整数データなどの、低精度データに量子化することができる。高精度データと低精度データとは、同じ範囲の、ただし異なる精度または分解能のデータを表し得る。例えば、０．０から１．０までの値を表すために１６ビットのデータが使用される場合、精度または分解能は２−１６であり得るが、０．０から１までの値を表す８ビットのデータの精度または分解能は２−８である。上記のように、ニューラルネットワークでは、訓練には高精度データが使用され得るが、推論中の少なくとも一部の操作には低精度データで十分であり得る。様々な実施態様において、低精度データの各要素のビット数は、低精度データをより効率的に記憶装置に格納し、コントローラまたはソフトウェアによって管理できるように、８の倍数であり得る（すなわちバイト単位で整列され得る）。
【０１１４】
[0125]図１１に、コンピューティングデバイス１１００の一例を示す。コンピューティングデバイス１１００の機能および／またはいくつかの構成要素は、無制限に、本開示の別の箇所で開示される他の実施形態でも無制限に使用され得る。コンピューティングデバイス１１００は、タスクの処理を容易にする計算を行い得る。実例として、コンピューティングデバイス１１００を、マルチテナント・コンピュート・サービス・システムにおけるサーバの一部とすることができる。コンピューティングデバイス１１００の様々なハードウェアリソースおよびソフトウェアリソース（画像認識サービスの提供と関連付けられたハードウェアリソースおよびソフトウェアリソースなど）を要求に応じてクライアントに割り振ることができる。
【０１１５】
[0126]一例では、コンピューティングデバイス１１００は、処理論理１１０２と、バス・インターフェース・モジュール１１０８と、メモリ１１１０と、ネットワーク・インターフェース・モジュール１１１２とを含み得る。これらのモジュールは、ハードウェアモジュール、ソフトウェアモジュール、またはハードウェアとソフトウェアの組み合わせであり得る。特定の例では、モジュールは、本開示の範囲から逸脱することなく、構成要素またはエンジンと区別なく使用され得る。コンピューティングデバイス１１００は、図示されていないその他のモジュールを含み得る。いくつかの実施態様では、コンピューティングデバイス１１００は、より少ないモジュールを含み得る。いくつかの実施態様では、モジュールのうちの１つまたは複数が１つのモジュールに組み合わされ得る。モジュールのうちの１つまたは複数は、通信チャネル１１１４上で互いに通信し得る。通信チャネル１１１４は、１つまたは複数のバス、メッシュ、マトリクス、ファブリック、これらの通信チャネルの組み合わせ、または何らかの他の適切な通信チャネルを含み得る。
【０１１６】
[0127]処理論理１１０２は１つまたは複数の集積回路を含んでいてもよく、これらは、特定用途向け集積回路（ＡＳＩＣ）、フィールド・プログラマブル・ゲート・アレイ（ＦＰＧＡ）、システム・オン・チップ（ＳｏＣ）、ネットワーク・プロセッシング・ユニット（ＮＰＵ）、命令を実行するように構成されたプロセッサまたは論理演算および浮動小数点演算を行うように構成された任意の他の回路を含み得る。処理論理１１０２に含まれ得るプロセッサの例には、ＡＲＭ（登録商標）、ＭＩＰＳ（登録商標）、ＡＭＤ（登録商標）、Ｉｎｔｅｌ（登録商標）、Ｑｕａｌｃｏｍｍ（登録商標）などによって開発されたプロセッサが含まれ得る。特定の実施態様では、プロセッサが複数の処理コアを含んでいてもよく、各処理コアは、その他の処理コアから独立して命令を実行するように構成され得る。さらに、特定の実施態様では、各プロセッサまたは処理コアは、複数の処理スレッド間の論理的分離を維持しながら、同じプロセッサまたは処理コアで命令を実行する複数の処理スレッドを実装し得る。プロセッサまたは処理コアで実行されるそのような処理スレッドは、ソフトウェアに対して別々の論理プロセッサまたは処理コアとして示され得る。いくつかの実施態様では、複数のプロセッサ、処理コア、または同じコアで実行される処理スレッドが、例えば、バス、レベル１（Ｌ１）キャッシュ、および／またはレベル２（Ｌ２）キャッシュなどの、特定のリソースを共有し得る。処理論理１１０２によって実行される命令は、コンピュータ可読記憶媒体上に、例えば、コンピュータプログラムの形で格納され得る。コンピュータ可読記憶媒体は、非一時的であり得る。場合によっては、コンピュータ可読媒体は、メモリ１１１０の一部であり得る。処理論理１１０２は、例えば、ニューラル・ネットワーク・プロセッサ３０２などを含む、人工ニューラルネットワーク計算を行うためのハードウェア回路も含み得る。
【０１１７】
[0128]クライアントによって要求されたパーソナル・アシスタント・サービスを提供するためにクライアントに処理論理１１０２へのアクセスを許可することができる。例えば、コンピューティングデバイス１１００は、画像認識ソフトウェアアプリケーションを実行するための仮想マシンをホストし得る。画像認識ソフトウェアアプリケーションは、実行されると、例えば、画像に含まれるオブジェクトを予測する処理論理１１０２にアクセスし得る。別の例として、処理論理１１０２へのアクセスを、クライアント機器（例えば、リモートコンピュータや、スマートフォンなど）上で実行されている画像認識ソフトウェアアプリケーションが、画像の認識を行うために処理論理１１０２に直接アクセスできるベアメタルインスタンスの一部として許可することもできる。
【０１１８】
[0129]メモリ１１１０は、揮発性もしくは不揮発性のどちらか、または揮発性と不揮発性の両方のタイプのメモリを含み得る。メモリ１１１０は、例えば、ランダム・アクセス・メモリ（ＲＡＭ）、読取り専用メモリ（ＲＯＭ）、電気的消去可能プログラム可能読取り専用メモリ（ＥＥＰＲＯＭ）、フラッシュメモリ、および／または何らかの他の適切な記憶媒体を含み得る。場合によっては、メモリ１１１０の一部または全部がコンピューティングデバイス１１００の内部にあってもよく、場合によっては、メモリの一部または全部がコンピューティングデバイス１１００の外部にあってもよい。メモリ１１１０は、処理論理１１０２によって実行されると、コンピューティングデバイス１１００にネットワーキング機能を提供する命令を実行するための実行環境を提供する実行可能命令を含むオペレーティングシステムを格納し得る。メモリ１１１０はまた、例えば、人工ニューラルネットワークの計算を行うためのソフトウェアアプリケーションも格納し得る。例えば、メモリ１１１０は、上記の式の計算に関連したソフトウェアルーチンを格納し得る。処理論理１１０２がＦＰＧＡの形である場合には、メモリ１１１０は、処理論理１１０２の様々な論理回路構成要素を表すネットリストデータを格納し得る。
【０１１９】
[0130]バス・インターフェース・モジュール１１０８は、外部通信媒体上での、ホストデバイスおよび／またはコンピューティングシステム内の他の構成要素などの外部エンティティとの通信を可能にし得る。バス・インターフェース・モジュール１１０８は、ケーブル、ソケット、ポートに接続するため、または外部通信媒体へのその他の接続のための物理インターフェースを含み得る。バス・インターフェース・モジュール１１０８は、入力トランザクションおよび出力トランザクションを管理するハードウェアおよび／またはソフトウェアをさらに含み得る。バス・インターフェース・モジュール１１０８は、周辺機器相互接続（ＰＣＩ）ベースのプロトコル、不揮発性メモリエクスプレス（ＮＶＭｅ）、アドバンスト・ホスト・コントローラ・インターフェース（ＡＨＣＩ）、小型コンピュータシステムインターフェース（ＳＣＳＩ）、シリアルアタッチトＳＣＳＩ（ＳＡＳ）、シリアルＡＴアタッチメント（ＳＡＴＡ）、パラレルＡＴＡ（ＰＡＴＡ）、何らかの他の標準バスプロトコル、または専用バスプロトコルなどのローカル・バス・プロトコルを実装し得る。バス・インターフェース・モジュール１１０８は、特に、コネクタ、電源管理、およびエラー処理を含む、これらのバスプロトコルのいずれかのための物理層を含み得る。いくつかの実施態様では、コンピューティングデバイス１１００は、複数の外部エンティティと通信するための複数のバス・インターフェース・モジュールを含み得る。これら複数のバス・インターフェース・モジュールは、同じローカル・バス・プロトコル、異なるローカル・バス・プロトコル、または同じバスプロトコルと異なるバスプロトコルの組み合わせを実装し得る。
【０１２０】
[0131]ネットワーク・インターフェース・モジュール１１１２は、ネットワークと通信するためのハードウェアおよび／またはソフトウェアを含み得る。このネットワーク・インターフェース・モジュール１１１２は、例えば、ネットワークへの有線接続のための物理コネクタもしくは物理ポート、および／またはネットワークへの無線通信のためのアンテナを含み得る。ネットワーク・インターフェース・モジュール１１１２は、ネットワーク・プロトコル・スタックを実装するように構成されたハードウェアおよび／またはソフトウェアをさらに含み得る。ネットワーク・インターフェース・モジュール１１１２は、例えば、特に、ＴＣＰ／ＩＰ、ＩｎｆｉｎｉＢａｎｄ、ＲｏＣＥ、米国電気電子技術者協会（ＩＥＥＥ）８０２．１１無線プロトコル、ユーザ・データグラム・プロトコル（ＵＤＰ）、非同期転送モード（ＡＴＭ）、トークンリング、フレームリレー、ハイレベル・データ・リンク制御（ＨＤＬＣ）、光ファイバ分散データインターフェース（ＦＤＤＩ）、および／またはポイントツーポイントプロトコル（ＰＰＰ）などのネットワークプロトコルを使用してネットワークと通信し得る。いくつかの実施態様では、コンピューティングデバイス１１００は、異なるネットワークと通信するように各々構成された、複数のネットワーク・インターフェース・モジュールを含み得る。例えば、これらの実施態様では、コンピューティングデバイス１１００は、有線のイーサネットネットワーク、無線の８０２．１１ネットワーク、セルラーネットワーク、ＩｎｆｉｎｉＢａｎｄネットワークなどと通信するためのネットワーク・インターフェース・モジュールを含み得る。いくつかの実施形態では、コンピューティングデバイス１１００は、ネットワーク・インターフェース・モジュール１１１２を介してサーバから、忘却ゲート因子、入力因子、出力因子などの生成のための前述の重みベクトルなどのパラメータセットを受け取り得る。
【０１２１】
[0132]上記の、コンピューティングデバイス１１００の様々な構成要素およびモジュールは、ディスクリートコンポーネントとして、システム・オン・チップ（ＳｏＣ）として、ＡＳＩＣとして、ＮＰＵとして、ＦＰＧＡとして、またはそれらの任意の組み合わせとして実装され得る。いくつかの実施形態では、ＳｏＣまたはその他の構成要素は、トラフィック監視、トラフィックシェーピング、計算などといった様々なサービスを提供するために別のコンピューティングシステムに通信可能に結合され得る。この技術のいくつかの実施形態では、ＳｏＣまたはその他の構成要素は、本明細書で開示される複数のサブシステムを含み得る。
【０１２２】
[0133]本明細書に記載されるモジュールは、ソフトウェアモジュール、ハードウェアモジュール、またはそれらの適切な組み合わせであり得る。モジュールがソフトウェアモジュールである場合、モジュールを、非一時的なコンピュータ可読媒体上で具体化し、本明細書に記載されるコンピュータシステムのいずれかにおいてプロセッサが処理することができる。記載のプロセスおよびアーキテクチャを、リアルタイムで、またはユーザインタラクションの前に非対称モードで行うことができることに留意されたい。モジュールは、図１１に示される方法で構成されてもよく、かつ／または、本明細書に記載される機能を、別々のモジュールとして存在する１つもしくは複数のモジュールが提供することもでき、かつ／または、本明細書に記載されるモジュール機能を複数のモジュールに拡散することもできる。
【０１２３】
[0134]したがって、本明細書および図面は、限定的な意味ではなく例示として評価されるべきである。しかしながら、特許請求の範囲に記載される本開示のより広い趣旨および範囲から逸脱することなく、それらに様々な改変および変更が加えられ得ることは明らかであろう。
【０１２４】
[0135]他の変形形態も本開示の範囲内にある。よって、開示の技法には様々な改変形態および代替構造の余地があるが、それらの特定の例示の実施形態が図面に示されており、以上で詳細に説明されている。しかしながら、本開示を開示の特定の１つまたは複数の形態に限定する意図はなく、むしろ反対に、添付の特許請求の範囲で定義される、本開示の趣旨および範囲内に当たるすべての改変形態、代替構造、および均等物を網羅することが意図されていることを理解されたい。
開示の技術のいくつかの実施形態を以下の各項により説明する。
１．人工ニューラルネットワークの畳み込み層への浮動小数点入力を受け取ることと、
浮動小数点入力をｎビットの整数入力に線形に量子化することであって、
ｎが８の倍数であり、
浮動小数点入力の最小値が整数ゼロとして量子化され、
浮動小数点入力の最大値が２ｎ−１として量子化され、
浮動小数点入力のゼロ値が量子化誤差なしで浮動小数点入力のゼロ値を表す整数として量子化される、ことと、
整数入力をメモリに格納することと、
畳み込み層が、メモリから整数入力を読み取ることと、
減算エンジンが、浮動小数点入力のゼロ値が整数値ゼロによって表されるように、整数入力から浮動小数点入力のゼロ値を表す整数を減算することによって差分値を作成することと、
畳み込み層が、積和を生成するために差分値に対して１組の（ｎ＋１）ビットの整数の積和演算を行うことと、
人工ニューラルネットワークの活性化層、プーリング層、または出力バッファが、積和を浮動小数点スケーリング係数でスケーリングすることによって浮動小数点出力を生成することと
を含む、コンピュータ実装方法。
２．ｎが８である、第１項に記載のコンピュータ実装方法。
３．浮動小数点入力の最小値と最大値とが浮動小数点入力のゼロ値に対して対称ではない、前項のいずれか一項に記載のコンピュータ実装方法。
４．畳み込み演算のための低精度入力を格納するように構成された記憶装置であって、低精度入力が非対称量子化を使用して高精度入力から生成される、記憶装置と、
記憶装置から低精度入力を受け取り、低精度入力から高精度ゼロ値を表す低精度値を減算することにより、差分値を作成するように構成された減算エンジンの配列と、
差分値を使用して積和を生成するように構成された処理要素（ＰＥ）配列であって、ＰＥ配列が複数行の処理要素を含み、各行の処理要素が対応する減算エンジンから差分値を受け取るように構成された、ＰＥ配列と、
積和をスケーリング係数によってスケーリングして高精度出力を生成するように構成された処理エンジンと
を含む装置。
５．低精度入力がｎビット形式で記憶装置に格納され、
ｎが８の倍数である、
第４項に記載の装置。
６．高精度入力が３２ビットの浮動小数点入力を含み、
低精度入力が８ビットの符号なし整数を含み、
差分値が９ビットの符号付き整数を含む、
第５項に記載の装置。
７．非対称量子化において、
高精度入力の最小値が低精度入力におけるゼロ値として量子化され、
高精度入力の最大値が低精度入力における最大値として量子化され、
高精度入力のゼロ値が、量子化誤差なしで高精度ゼロ値を表す低精度値として量子化される、
第４項〜第６項のいずれか一項に記載の装置。
８．高精度入力が、人工ニューラルネットワークの層の重みおよび入力データ要素を含み、
重みおよび入力データ要素が独立して量子化される、
第４項〜第７項のいずれか一項に記載の装置。
９．減算エンジンの配列が、重みと入力データ要素の両方に対応する低精度入力から減算するように構成される、第８項に記載の装置。
１０．装置が、フィールド・プログラマブル・ゲート・アレイ（ＦＰＧＡ）、システム・オン・チップ（ＳｏＣ）、特定用途向け集積回路（ＡＳＩＣ）、プログラマブル・アレイ・ロジック（ＰＡＬ）、または複合プログラマブル・ロジック・デバイス（ＣＰＬＤ）を含む、第４項〜第９項のいずれか一項に記載の装置。
１１．処理要素配列が、積和を生成するために差分値を使用して１組の乗算および加算を行うように構成される、第４項〜第１０項のいずれか一項に記載の装置。
１２．処理エンジンが、人工ニューラルネットワークの活性化エンジン、プーリングエンジン、または出力バッファを含む、第４項〜第１１項のいずれか一項に記載の装置。
１３．記憶装置から、畳み込み演算のための低精度入力を受け取ることであって、低精度入力が非対称量子化を使用して高精度入力から生成される、ことと、
減算エンジンが、差分値を作成するために低精度入力から高精度ゼロ値を表す低精度値を減算することと、
処理エンジンが、積和を生成するために差分値に対して積和演算を行うことと、
後処理エンジンが、積和をスケーリング係数でスケーリングすることによって高精度出力を生成することと
を含む、コンピュータ実装方法。
１４．高精度入力が３２ビットの浮動小数点入力を含み、
低精度入力が８ビットの符号なし整数を含み、
差分値が９ビットの符号付き整数を含む、
第１３項に記載のコンピュータ実装方法。
１５．非対称量子化において、
高精度入力の最小値が低精度入力におけるゼロ値として量子化され、
高精度入力の最大値が低精度入力における最大値として量子化され、
高精度入力のゼロ値が、量子化誤差なしで高精度ゼロ値を表す低精度値として量子化される、
第１３項または第１４項に記載のコンピュータ実装方法。
１６．高精度入力の最小値と最大値とが高精度入力のゼロ値に対して対称ではない、第１５項に記載のコンピュータ実装方法。
１７．高精度入力が、人工ニューラルネットワークの層の重みまたは入力データ要素を含む、第１３項〜第１６項のいずれか一項に記載のコンピュータ実装方法。
１８．処理エンジンが、高精度の積和演算ではなく低精度の積和演算を行うように構成される、第１３項〜第１７項のいずれか一項に記載のコンピュータ実装方法。
１９．積和演算が処理要素配列によって行われる、第１３項〜第１８項のいずれか一項に記載のコンピュータ実装方法。
２０．積和をスケーリング係数でスケーリングすることが、積和を、人工ニューラルネットワークの活性化エンジン、プーリングエンジン、または出力バッファを使用してスケーリングすることを含む、第１３項〜第１９項のいずれか一項に記載のコンピュータ実装方法。
【０１２５】
[0136]開示の実施形態を説明する文脈における（特に、添付の特許請求の範囲の文脈における）「ａ」および「ａｎｄ」および「ｔｈｅ」の各用語および類似した指示対象の使用は、本明細書で特に指示されるか、または文脈と明らかに矛盾しない限り、単数形と複数形の両方を含むと解釈されるべきである。「ｃｏｍｐｒｉｓｉｎｇ」、「ｈａｖｉｎｇ」、「ｉｎｃｌｕｄｉｎｇ」および「ｃｏｎｔａｉｎｉｎｇ」の各用語は、特に注記されない限り、非限定用語（すなわち、「〜を含むがこれに限定されない」を意味する）と解釈されるべきである。「ｃｏｎｎｅｃｔｅｄ」という用語は、何かが介在しているとしても、部分的または完全に内部に含まれるか、取り付けられるか、または１つに結合されることと解釈されるべきである。本明細書における値の範囲の記述は、本明細書で特に指示されない限り、単に、その範囲内に該当する各別々の値に個別に言及する簡単な方法として使用するためのものにすぎず、各別々の値は、それが本明細書に個別に記載された場合と同様に本明細書に組み込まれる。本明細書で特に指示されるか、または文脈と明らかに矛盾しない限り、本明細書に記載されるすべての方法を任意の適切な順序で行うことができる。本明細書で提供されるありとあらゆる例の使用、または例示的表現（「ｓｕｃｈ  ａｓ」など）は、単に、本開示の実施形態をより良く解明するためのものにすぎず、特に求められない限り、本開示の範囲に対する限定を提示するものではない。本明細書におけるいかなる表現も、特許請求されない要素を本開示の実施に不可欠であるものとして指示していると解釈されるべきではない。
【０１２６】
[0137]「Ｘ、Ｙ、またはＺのうちの少なくとも１つ」などの論理和表現は、特に言及されない限り、項目、項などが、Ｘ、Ｙ、もしくはＺ、またはそれらの任意の組み合わせ（Ｘ、Ｙ、および／またはＺなど）であり得ることを提示するために一般に使用されるように文脈内で理解されるべきことが意図されている。よって、そのような論理和表現は、一般に、特定の実施形態が、Ｘのうちの少なくとも１つ、Ｙのうちの少なくとも１つ、またはＺのうちの少なくとも１つが各々存在することを必要とすることを示唆するためのものではなく、示唆すべきでもない。
【０１２７】
[0138]本明細書には、本発明者らに知られている本開示を実行するための最良の形態を含む、本開示の様々な実施形態が記載されている。それらの実施形態の変形形態は、前述の説明を読めば当業者には明らかになるであろう。本発明者らは、当業者がそのような変形形態を適宜用いることを予期しており、本発明者らは、本開示が、本明細書に具体的に記載される以外の方法で実施されることを意図している。したがって、本開示は、適用法によって許容されるように添付の特許請求の範囲に記載される主題のすべての改変形態および均等物を含む。さらに、本明細書で特に指示されるか、または文脈と明らかに矛盾しない限り、それらのすべての可能な変形形態における上記の要素の任意の組み合わせも本開示によって包含される。
【図１】
2021510888.tif 000016
【図２】
2021510888.tif 000017
【図３Ａ】
2021510888.tif 000018
【図３Ｂ】
2021510888.tif 000019
【図４Ａ−Ｅ】
2021510888.tif 000020
【図５】
2021510888.tif 000021
【図６】
2021510888.tif 000022
【図７Ａ】
2021510888.tif 000023
【図７Ｂ】
2021510888.tif 000024
【図８】
2021510888.tif 000025
【図９】
2021510888.tif 000026
【図１０】
2021510888.tif 000027
【図１１】
2021510888.tif 000028
【手続補正書】
【提出日】令和2年10月19日(2020.10.19)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
人工ニューラルネットワークの畳み込み層への浮動小数点入力を受け取ることと、
前記浮動小数点入力をｎビットの整数入力に線形に量子化することであって、
ｎが８の倍数であり、
前記浮動小数点入力の最小値が整数ゼロとして量子化され、
前記浮動小数点入力の最大値が２ｎ−１として量子化され、
前記浮動小数点入力のゼロ値が量子化誤差なしで前記浮動小数点入力の前記ゼロ値を表す整数として量子化される、ことと、
前記整数入力をメモリに格納することと、
前記畳み込み層によって、前記メモリから前記整数入力を読み取ることと、
減算エンジンによって、前記浮動小数点入力の前記ゼロ値が整数値ゼロによって表されるように、前記整数入力から前記浮動小数点入力の前記ゼロ値を表す整数を減算することによって差分値を作成することと、
前記畳み込み層によって、積和を生成するために前記差分値に対して１組の（ｎ＋１）ビットの整数の積和演算を行うことと、
前記人工ニューラルネットワークの活性化層、プーリング層、または出力バッファによって、前記積和を浮動小数点スケーリング係数でスケーリングすることによって浮動小数点出力を生成することと
を含む、コンピュータ実装方法。
【請求項２】
ｎが８である、請求項１に記載のコンピュータ実装方法。
【請求項３】
前記浮動小数点入力の前記最小値と前記最大値とが前記浮動小数点入力の前記ゼロ値に対して対称ではない、請求項１に記載のコンピュータ実装方法。
【請求項４】
前記浮動小数点出力が、前記浮動小数点入力の畳み込み結果を表す、請求項１に記載のコンピュータ実装方法。
【請求項５】
前記浮動小数点スケーリング係数が第１の浮動小数点スケーリング係数であり、
前記第１の浮動小数点スケーリング係数は、第２の浮動小数点スケーリング係数の乗算の積を含み、各第２の浮動小数点スケーリング係数は、それぞれの前記ｎビットの整数入力への前記浮動小数点入力の１つの量子化に関連する、請求項１に記載のコンピュータ実装方法。
【請求項６】
畳み込み演算のための低精度入力を格納するように構成された記憶装置であって、前記低精度入力が非対称量子化を使用して高精度入力から生成される、記憶装置と、
前記記憶装置から前記低精度入力を受け取り、前記低精度入力から高精度ゼロ値を表す低精度値を減算することにより、差分値を作成するように構成された減算エンジンのアレイと、
前記差分値を使用して積和を生成するように構成された処理要素（ＰＥ）アレイであって、前記ＰＥアレイが複数行の処理要素を含み、各行の処理要素が対応する減算エンジンから差分値を受け取るように構成された、ＰＥアレイと、
高精度出力を生成するために、前記積和をスケーリング係数によってスケーリングするように構成された処理エンジンと
を含む装置。
【請求項７】
前記低精度入力がｎビット形式で記憶装置に格納され、
ｎが８の倍数である、
請求項６に記載の装置。
【請求項８】
前記高精度入力が３２ビットの浮動小数点入力を含み、
前記低精度入力が８ビットの符号なし整数を含み、
前記差分値が９ビットの符号付き整数を含む、
請求項７に記載の装置。
【請求項９】
前記非対称量子化において、
前記高精度入力の最小値が前記低精度入力におけるゼロ値として量子化され、
前記高精度入力の最大値が前記低精度入力における最大値として量子化され、
前記高精度入力のゼロ値が、量子化誤差なしで前記高精度ゼロ値を表す前記低精度値として量子化される、
請求項６に記載の装置。
【請求項１０】
前記高精度入力が、人工ニューラルネットワークの層の重みおよび入力データ要素を含み、
前記重みおよび前記入力データ要素が独立して量子化される、
請求項６に記載の装置。
【請求項１１】
前記減算エンジンのアレイが、前記重みと前記入力データ要素の両方に対応する低精度入力から減算するように構成される、請求項１０に記載の装置。
【請求項１２】
前記装置が、フィールド・プログラマブル・ゲート・アレイ（ＦＰＧＡ）、システム・オン・チップ（ＳｏＣ）、特定用途向け集積回路（ＡＳＩＣ）、プログラマブル・アレイ・ロジック（ＰＡＬ）、または複合プログラマブル・ロジック・デバイス（ＣＰＬＤ）を含む、請求項６に記載の装置。
【請求項１３】
前記処理要素アレイが、積和を生成するために前記差分値を使用して１組の乗算および加算を行うように構成される、請求項６に記載の装置。
【請求項１４】
前記処理エンジンが、人工ニューラルネットワークの活性化エンジン、プーリングエンジン、または出力バッファを含む、請求項６に記載の装置。
【請求項１５】
前記積和が、前記ＰＥアレイにより１回のパスで生成される、請求項６に記載の装置。
【請求項１６】
記憶装置から、畳み込み演算のための低精度入力を受け取ることであって、前記低精度入力が非対称量子化を使用して高精度入力から生成される、ことと、
減算エンジンによって、差分値を作成するために前記低精度入力から高精度ゼロ値を表す低精度値を減算することと、
処理エンジンによって、積和を生成するために前記差分値に対して積和演算を行うことと、
後処理エンジンによって、前記積和をスケーリング係数でスケーリングすることによって高精度出力を生成することと
を含む、コンピュータ実装方法。
【請求項１７】
前記高精度入力が３２ビットの浮動小数点入力を含み、
前記低精度入力が８ビットの符号なし整数を含み、
前記差分値が９ビットの符号付き整数を含む、
請求項１６に記載のコンピュータ実装方法。
【請求項１８】
非対称量子化において、
前記高精度入力の最小値が前記低精度入力におけるゼロ値として量子化され、
前記高精度入力の最大値が前記低精度入力における最大値として量子化され、
前記高精度入力のゼロ値が、量子化誤差なしで高精度ゼロ値を表す低精度値として量子化される、
請求項１に記載のコンピュータ実装方法。
【請求項１９】
前記高精度入力の前記最小値と前記最大値とが前記高精度入力の前記ゼロ値に対して対称ではない、請求項１８に記載のコンピュータ実装方法。
【請求項２０】
前記高精度入力が、人工ニューラルネットワークの層の重みまたは入力データ要素を含む、請求項１６に記載のコンピュータ実装方法。
【請求項２１】
前記処理エンジンが、高精度の積和演算ではなく低精度の積和演算を行うように構成される、請求項１６に記載のコンピュータ実装方法。
【請求項２２】
前記積和演算が処理要素アレイによって行われる、請求項１６に記載のコンピュータ実装方法。
【請求項２３】
前記積和を前記スケーリング係数でスケーリングすることが、前記積和を、人工ニューラルネットワークの活性化エンジン、プーリングエンジン、または出力バッファを使用してスケーリングすることを含む、請求項１６に記載のコンピュータ実装方法。
【国際調査報告】
2021510888.tif 000029
2021510888.tif 000030
2021510888.tif 000031
2021510888.tif 000032