(57)【特許請求の範囲】
【請求項１】
平均プーリングニューラルネットワーク層を含むニューラルネットワークをハードウェア回路上で処理することを求める要求を受けることと、
それに応じて命令を生成することとを含み、前記命令は、前記ハードウェア回路によって実行されると、前記ハードウェア回路に、前記ニューラルネットワークによるネットワーク入力の処理中に、演算を実行することによって前記平均プーリングニューラルネットワーク層の出力に相当する層出力テンソルを生成させ、
前記演算は、
前記平均プーリングニューラルネットワーク層に対する入力テンソルと、カーネルとの畳み込みを実行することにより、第１のテンソルを生成することを含み、前記カーネルは、前記平均プーリングニューラルネットワーク層のウィンドウに等しいサイズを有し、各々が恒等行列である要素で構成されており、
前記演算は、さらに、
前記第１のテンソルの各要素を、前記平均プーリングニューラルネットワーク層のウィンドウ内の要素の数で除算することによって初期出力テンソルを生成させる演算を実行することと、
前記初期出力テンソルのエッジ要素を第１のスケーリングファクタによってリスケーリングし、前記初期出力テンソルのコーナー要素を第２のスケーリングファクタによってリスケーリングすることにより、出力テンソルを生成することとを含む、方法。
【請求項２】
前記第１のスケーリングファクタは、前記第１のテンソルのエッジ要素を生成するために前記畳み込みを実行する際に前記カーネルの要素で乗算される前記入力テンソルの要素の数に基づいており、前記第２のスケーリングファクタは、前記第１のテンソルのコーナー要素を生成するために前記畳み込みを実行する際に前記カーネルの要素で乗算される前記入力テンソルの要素の数に基づいている、請求項１に記載の方法。
【請求項３】
前記入力テンソルとカーネルとの畳み込みを実行することによって第１のテンソルを生成することは、
前記入力テンソルにゼロを埋め込むことによってゼロ埋込み入力テンソルを生成することと、
前記ゼロ埋込み入力テンソルと前記カーネルとの畳み込みを実行することによって前記第１のテンソルを生成することとを含む、請求項１または２に記載の方法。
【請求項４】
平均プーリングニューラルネットワーク層を含むニューラルネットワークをハードウェア回路上で処理することを求める要求を受けることと、
それに応じて命令を生成することとを含み、前記命令は、前記ハードウェア回路によって実行されると、前記ハードウェア回路に、前記ニューラルネットワークによるネットワーク入力の処理中に、演算を実行することによって前記平均プーリングニューラルネットワーク層の出力に相当する層出力テンソルを生成させ、
前記演算は、
前記平均プーリングニューラルネットワーク層に対する入力テンソルと、カーネルとの畳み込みを実行することにより、第１のテンソルを生成することを含み、前記カーネルは、前記平均プーリングニューラルネットワーク層のウィンドウに等しいサイズを有し、各々が恒等行列である要素で構成されており、
前記演算は、さらに、
前記第１のテンソルの各要素を、前記平均プーリングニューラルネットワーク層のウィンドウ内の要素の数で除算することによって初期出力テンソルを生成させる演算を実行することを含み、
前記第１のテンソルの各要素を前記平均プーリングニューラルネットワーク層のウィンドウ内の要素の数で除算することによって初期出力テンソルを生成させる演算を実行することは、
第１のファクタによる、前記第１のテンソルの各要素の第１の乗算を実行することを含み、前記第１のファクタは、
（ｉ）出力テンソルのコーナー要素を生成するために畳み込みを実行する際に、前記平均プーリングニューラルネットワーク層のウィンドウに等しいサイズを有するカーネルの要素で乗算される、入力テンソルの要素の数と、
（ｉｉ）出力テンソルのエッジ要素を生成するために畳み込みを実行する際に、前記平均プーリングニューラルネットワーク層のウィンドウに等しいサイズを有するカーネルの要素で乗算される、入力テンソルの要素の数と、
（ｉｉｉ）前記平均プーリングニューラルネットワーク層のウィンドウの要素の数との最小公倍数であり、
１つ以上の第２のファクタによる、前記第１のテンソルの各要素の第２の乗算を実行することを含み、各第２のファクタは、前記第１のテンソルの対応する要素を生成するために前記畳み込みを実行する際に前記カーネルの要素で乗算される前記入力テンソルの要素の数に基づいている、方法。
【請求項５】
平均プーリングニューラルネットワーク層を含むニューラルネットワークをハードウェア回路上で処理することを求める要求を受けることと、
それに応じて命令を生成することとを含み、前記命令は、前記ハードウェア回路によって実行されると、前記ハードウェア回路に、前記ニューラルネットワークによるネットワーク入力の処理中に、演算を実行することによって前記平均プーリングニューラルネットワーク層の出力に相当する層出力テンソルを生成させ、
前記演算は、
前記平均プーリングニューラルネットワーク層に対する入力テンソルと、カーネルとの畳み込みを実行することにより、第１のテンソルを生成することを含み、前記カーネルは、前記平均プーリングニューラルネットワーク層のウィンドウに等しいサイズを有し、各々が恒等行列である要素で構成されており、
前記演算は、さらに、
前記第１のテンソルの各要素を、前記平均プーリングニューラルネットワーク層のウィンドウ内の要素の数で除算することによって初期出力テンソルを生成させる演算を実行することを含み、
前記第１のテンソルの各要素を前記平均プーリングニューラルネットワーク層のウィンドウ内の要素の数で除算することによって初期出力テンソルを生成させる演算を実行することは、
マスキングテンソルを生成することを含み、前記マスキングテンソルのサイズは、前記入力テンソルのサイズによって決まり、前記マスキングテンソルの要素は、前記平均プーリングニューラルネットワーク層のウィンドウのサイズによって決まり、
前記第１のテンソルの各要素と、前記マスキングテンソルの対応する各要素との、要素ごとの乗算を実行することを含む、方法。
【請求項６】
前記マスキングテンソルを生成することは、メモリに格納されている１つ以上のマスキングテンソルフラグメントをタイリングすることを含む、請求項５に記載の方法。
【請求項７】
前記入力テンソルは、前記ハードウェア回路のユニファイドバッファに格納され、前記マスキングテンソルは、前記ハードウェア回路のダイナミックメモリに格納され、
前記第１のテンソルの各要素を前記平均プーリングニューラルネットワーク層のウィンドウ内の要素の数で除算することによって初期出力テンソルを生成させる演算を実行することは、
前記入力テンソルを、前記ユニファイドバッファから、ハードウェアで実現される前記ハードウェア回路の行列計算ユニットに送ることと、
前記マスキングテンソルを、前記ダイナミックメモリから、前記ハードウェア回路の前記行列計算ユニットに送ることと、
前記ハードウェア回路の前記行列計算ユニットにより、前記入力テンソルと前記マスキングテンソルとの、要素ごとの乗算を実行することによって前記第１のテンソルを生成することとを含む、請求項５または６に記載の方法。
【請求項８】
前記入力テンソルは、前記ハードウェア回路のユニファイドバッファに格納され、前記カーネルは、前記ハードウェア回路のダイナミックメモリに格納され、
前記入力テンソルと前記カーネルとの畳み込みを実行することにより、前記第１のテンソルを生成することは、
前記入力テンソルを、前記ユニファイドバッファから、ハードウェアで実現される前記ハードウェア回路の行列計算ユニットに送ることと、
前記カーネルを、前記ダイナミックメモリから、前記ハードウェア回路の前記行列計算ユニットに送ることと、
前記ハードウェア回路の前記行列計算ユニットにより、前記入力テンソルと前記カーネルとの畳み込みを実行することによって前記第１のテンソルを生成することとを含む、請求項１〜７のいずれか１項に記載の方法。
【請求項９】
前記畳み込みを実行すること、および、前記第１のテンソルの各要素を除算するための演算を実行することとは、整数レジスタに格納された値に対する固定小数点演算として実行される、請求項１〜８のいずれか１項に記載の方法。
【請求項１０】
システムであって、
ハードウェア回路と、
１つ以上の記憶装置とを備え、前記記憶装置は、ハードウェア回路によって実行されると前記ハードウェア回路に演算を実行させるように機能することが可能な命令を格納しており、前記演算は、
平均プーリングニューラルネットワーク層に対する入力テンソルと、カーネルとの畳み込みを実行することにより、第１のテンソルを生成することを含み、前記カーネルは、前記平均プーリングニューラルネットワーク層のウィンドウに等しいサイズを有し、各々が恒等行列である要素で構成されており、
前記演算は、さらに、
前記第１のテンソルの各要素を、前記平均プーリングニューラルネットワーク層のウィンドウ内の要素の数で除算することによって初期出力テンソルを生成させる演算を実行することと、
前記初期出力テンソルのエッジ要素を第１のスケーリングファクタによってリスケーリングし、前記初期出力テンソルのコーナー要素を第２のスケーリングファクタによってリスケーリングすることにより、出力テンソルを生成することとを含む、システム。
【請求項１１】
前記第１のスケーリングファクタは、前記第１のテンソルのエッジ要素を生成するために前記畳み込みを実行する際に前記カーネルの要素で乗算される前記入力テンソルの要素の数に基づいており、前記第２のスケーリングファクタは、前記第１のテンソルのコーナー要素を生成するために前記畳み込みを実行する際に前記カーネルの要素で乗算される前記入力テンソルの要素の数に基づいている、請求項１０に記載のシステム。
【請求項１２】
前記入力テンソルとカーネルとの畳み込みを実行することによって第１のテンソルを生成することは、
前記入力テンソルにゼロを埋め込むことによってゼロ埋込み入力テンソルを生成することと、
前記ゼロ埋込み入力テンソルと前記カーネルとの畳み込みを実行することによって前記第１のテンソルを生成することとを含む、請求項１０または１１に記載のシステム。
【請求項１３】
システムであって、
ハードウェア回路と、
１つ以上の記憶装置とを備え、前記記憶装置は、ハードウェア回路によって実行されると前記ハードウェア回路に演算を実行させるように機能することが可能な命令を格納しており、前記演算は、
平均プーリングニューラルネットワーク層に対する入力テンソルと、カーネルとの畳み込みを実行することにより、第１のテンソルを生成することを含み、前記カーネルは、前記平均プーリングニューラルネットワーク層のウィンドウに等しいサイズを有し、各々が恒等行列である要素で構成されており、
前記演算は、さらに、
前記第１のテンソルの各要素を、前記平均プーリングニューラルネットワーク層のウィンドウ内の要素の数で除算することによって初期出力テンソルを生成させる演算を実行することを含み、
前記第１のテンソルの各要素を前記平均プーリングニューラルネットワーク層のウィンドウ内の要素の数で除算することによって初期出力テンソルを生成させる演算を実行することは、
マスキングテンソルを生成することを含み、前記マスキングテンソルのサイズは、前記入力テンソルのサイズによって決まり、前記マスキングテンソルの要素は、前記平均プーリングニューラルネットワーク層のウィンドウのサイズによって決まり、
前記第１のテンソルの各要素と、前記マスキングテンソルの対応する各要素との、要素ごとの乗算を実行することを含む、システム。
【請求項１４】
前記入力テンソルは、前記ハードウェア回路のユニファイドバッファに格納され、前記マスキングテンソルは、前記ハードウェア回路のダイナミックメモリに格納され、
前記第１のテンソルの各要素を前記平均プーリングニューラルネットワーク層のウィンドウ内の要素の数で除算することによって初期出力テンソルを生成させる演算を実行することは、
前記入力テンソルを、前記ユニファイドバッファから、ハードウェアで実現される前記ハードウェア回路の行列計算ユニットに送ることと、
前記マスキングテンソルを、前記ダイナミックメモリから、前記ハードウェア回路の前記行列計算ユニットに送ることと、
前記ハードウェア回路の前記行列計算ユニットにより、前記入力テンソルと前記マスキングテンソルとの、要素ごとの乗算を実行することによって前記第１のテンソルを生成することとを含む、請求項１３に記載のシステム。
【請求項１５】
前記入力テンソルは、前記ハードウェア回路のユニファイドバッファに格納され、前記カーネルは、前記ハードウェア回路のダイナミックメモリに格納され、
前記入力テンソルと前記カーネルとの畳み込みを実行することにより、前記第１のテンソルを生成することは、
前記入力テンソルを、前記ユニファイドバッファから、ハードウェアで実現される前記ハードウェア回路の行列計算ユニットに送ることと、
前記カーネルを、前記ダイナミックメモリから、前記ハードウェア回路の前記行列計算ユニットに送ることと、
前記ハードウェア回路の前記行列計算ユニットにより、前記入力テンソルと前記カーネルとの畳み込みを実行することによって前記第１のテンソルを生成することとを含む、請求項１０〜１４のいずれか１項に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
背景
本明細書は、ハードウェアにおけるニューラルネットワーク推論の計算に関する。
【背景技術】
【０００２】
ニューラルネットワークは、受けた入力に対する出力、たとえば分類を生成するために１つ以上の層を用いる機械学習モデルである。ニューラルネットワークの中には、出力層に加えて１つ以上の隠れ層を含むものがある。各隠れ層の出力は、ネットワーク内の次の層、すなわち当該ネットワークの次の隠れ層または出力層への入力として使用される。ネットワークの各層は、対応するセットのパラメータの現在の値に従い、受けた入力から出力を生成する。
【発明の概要】
【課題を解決するための手段】
【０００３】
概要
概して、本明細書はニューラルネットワーク推論を計算する専用ハードウェア回路について説明する。
【０００４】
概して、本明細書に記載の主題の１つの革新的な側面は、平均プーリングニューラルネットワーク層を含むニューラルネットワークをハードウェア回路上で処理することを求める要求を受け、それに応じて命令を生成する、方法およびシステムを含む。命令は、ハードウェア回路によって実行されると、ハードウェア回路に、ニューラルネットワークによるネットワーク入力の処理中に、以下の演算を実行することによって平均プーリングニューラルネットワーク層の出力に相当する層出力テンソルを生成させ、上記演算は、平均プーリングニューラルネットワーク層に対する入力テンソルと、カーネルとの畳み込みを実行することにより、第１のテンソルを生成することを含み、カーネルは、平均プーリングニューラルネットワーク層のウィンドウに等しいサイズを有し、各々が恒等行列である要素で構成されている。上記演算は、さらに、第１のテンソルの各要素を、平均プーリングニューラルネットワーク層のウィンドウ内の要素の数で除算することによって初期出力テンソルを生成させる演算を実行することを含む。
【０００５】
実装形態は以下の特徴のうちの１つ以上を含み得る。いくつかの実装形態において、本主題の革新的な側面は、初期出力テンソルのエッジ要素を第１のスケーリングファクタによってリスケーリングし、初期出力テンソルのコーナー要素を第２のスケーリングファクタによってリスケーリングすることにより、出力テンソルを生成することを含む。第１のスケーリングファクタは、第１のテンソルのエッジ要素を生成するために畳み込みを実行する際にカーネルの要素で乗算される入力テンソルの要素の数に基づいており、第２のスケーリングファクタは、第１のテンソルのコーナー要素を生成するために畳み込みを実行する際にカーネルの要素で乗算される入力テンソルの要素の数に基づいている。いくつかの実装形態において、革新的な側面は、第１のテンソルのエッジに隣接する要素を第３のスケーリングファクタによってリスケーリングし、第１のテンソルのコーナーに隣接する要素を第４のスケーリングファクタによってリスケーリングすることにより、出力テンソルを生成することを含む。
【０００６】
実装形態は、以下の特徴のうちの１つ以上をさらに含み得る。入力テンソルとカーネルとの畳み込みを実行することによって第１のテンソルを生成することは、入力テンソルにゼロを埋め込むことによってゼロ埋込み入力テンソルを生成することと、ゼロ埋込み入力テンソルとカーネルとの畳み込みを実行することによって第１のテンソルを生成することとを含む。第１のテンソルの各要素を平均プーリングニューラルネットワーク層のウィンドウ内の要素の数で除算することによって初期出力テンソルを生成させる演算を実行することは、第１のファクタによる、第１のテンソルの各要素の第１の乗算を実行することを含み、第１のファクタは、（ｉ）出力テンソルのコーナー要素を生成するために畳み込みを実行する際に、平均プーリングニューラルネットワーク層のウィンドウに等しいサイズを有するカーネルの要素で乗算される、入力テンソルの要素の数と、（ｉｉ）出力テンソルのエッジ要素を生成するために畳み込みを実行する際に、平均プーリングニューラルネットワーク層のウィンドウに等しいサイズを有するカーネルの要素で乗算される、入力テンソルの要素の数と、（ｉｉｉ）平均プーリングニューラルネットワーク層のウィンドウの要素の数との最小公倍数であり、１つ以上の第２のファクタによる、第１のテンソルの各要素の第２の乗算を実行することを含み、各第２のファクタは、第１のテンソルの対応する要素を生成するために畳み込みを実行する際にカーネルの要素で乗算される入力テンソルの要素の数に基づいている。第１の乗算の実行結果の要素のビット分解能は、第１のテンソルの要素のビット分解能よりも高い。
【０００７】
実装形態は以下の特徴のうちの１つ以上をさらに含み得る。第１のテンソルの各要素を平均プーリングニューラルネットワーク層のウィンドウ内の要素の数で除算することによって初期出力テンソルを生成させる演算を実行することは、マスキングテンソルを生成することを含み、マスキングテンソルのサイズは、入力テンソルのサイズによって決まり、マスキングテンソルの要素は、平均プーリングニューラルネットワーク層のウィンドウのサイズによって決まる。上記演算はまた、第１のテンソルの各要素と、マスキングテンソルの対応する各要素との、要素ごとの乗算を実行することを含む。マスキングテンソルを生成することは、メモリに格納されている１つ以上のマスキングテンソルフラグメントをタイリングすることを含む。入力テンソルは、ハードウェア回路のユニファイドバッファに格納され、マスキングテンソルは、ハードウェア回路のダイナミックメモリに格納され、第１のテンソルの各要素を平均プーリングニューラルネットワーク層のウィンドウ内の要素の数で除算することによって初期出力テンソルを生成させる演算を実行することは、入力テンソルを、ユニファイドバッファから、ハードウェアで実現されるハードウェア回路の行列計算ユニットに送ることと、マスキングテンソルを、ダイナミックメモリから、ハードウェア回路の行列計算ユニットに送ることと、ハードウェア回路の行列計算ユニットにより、入力テンソルとマスキングテンソルとの、要素ごとの乗算を実行することによって第１のテンソルを生成することとを含む。
【０００８】
実装形態は以下の特徴のうちの１つ以上をさらに含み得る。入力テンソルは、ハードウェア回路のユニファイドバッファに格納され、カーネルは、ハードウェア回路のダイナミックメモリに格納され、入力テンソルとカーネルとの畳み込みを実行することにより、第１のテンソルを生成することは、入力テンソルを、ユニファイドバッファから、ハードウェアで実現されるハードウェア回路の行列計算ユニットに送ることと、カーネルを、ダイナミックメモリから、ハードウェア回路の行列計算ユニットに送ることと、ハードウェア回路の行列計算ユニットにより、入力テンソルとカーネルとの畳み込みを実行することによって第１のテンソルを生成することとを含む。畳み込みを実行すること、および、第１のテンソルの各要素を除算するための演算を実行することとは、整数レジスタに格納された値に対する固定小数点演算として実行される。
【０００９】
本明細書に記載の主題の特定の実施形態は、以下の利点のうちの１つ以上を得るために実現することができる。平均プーリングニューラルネットワーク層に対応する出力テンソルは、専用ハードウェア回路により、たとえこのハードウェア回路が平均プーリングを実行するために入力テンソルを直接処理できない場合であっても、ハードウェアで生成することができる。たとえ専用ハードウェア回路が平均プーリングを直接サポートしなくても、専用ハードウェア回路を用いて適切な出力を生成することにより、平均プーリングニューラルネットワーク層の処理を、データをホストコンピュータに返すことなく、すなわち計算の少なくとも一部をオフチップで実行することなく、実行することができる。これにより、平均プーリング層を含むニューラルネットワークの推論を、専用ハードウェア回路のハードウェアアーキテクチャを修正することなく、効率的に求めることができる。すなわち、オフチップで、ソフトウェアで、または双方で、処理の一部を実行することで生じる処理遅延を回避することができる。
【００１０】
また、本明細書に記載の主題は、ニューラルネットワーク計算において平均プーリングを効率的に実行するために、開示されている方法およびハードウェアを使用する、画像認識または分類方法およびシステムに関する。
【００１１】
本明細書の主題の１つ以上の実施形態の詳細は、添付の図面および以下の説明に記載されている。この主題のその他の特徴、局面、および利点は、上記説明、図面、および請求項から明らかになるであろう。
【図面の簡単な説明】
【００１２】
【図１】ニューラルネットワーク処理システムの一例を示す。
【図２】ニューラルネットワークの所与の層について計算を実行するための方法の一例のフロー図である。
【図３】ニューラルネットワーク処理システムの一例を示す。
【図４】行列計算ユニットを含むアーキテクチャの一例を示す。
【図５】シストリックアレイ内のセルのアーキテクチャの一例を示す。
【図６】ニューラルネットワーク処理システムに対してニューラルネットワークの平均プーリング層の計算の実行を指示する方法の一例のフロー図である。
【図７】ニューラルネットワークの平均プーリング層の計算を実行する方法の一例のフロー図である。
【図８】ニューラルネットワークの平均プーリング層の計算の一例を示す図である。
【図９】ニューラルネットワークの平均プーリング層におけるエッジ要素をリスケーリングするための計算の一例を示す図である。
【００１３】
各種図面において同様の参照番号および名称は同様の要素を示す。
【発明を実施するための形態】
【００１４】
詳細な説明
複数の層を有するニューラルネットワークを用いて推論を計算することができる。たとえば、入力が与えられると、ニューラルネットワークはその入力に対する推論を計算することができる。ニューラルネットワークは、ニューラルネットワークの各層を通って入力を処理することによって、この推論を計算する。各層は入力を受け取り、その層に対する重みのセットに従って入力を処理して出力を生成する。
【００１５】
したがって、受け取った入力から推論を計算するために、ニューラルネットワークは入力を受け取り、それを各ニューラルネットワーク層の各々を通して処理して推論を生成し、１つのニューラルネットワーク層からの出力は次のニューラルネットワーク層への入力として与えられる。ニューラルネットワーク層へのデータ入力、たとえば、ニューラルネットワークへの入力、またはシーケンス内におけるその層の下の層の、あるニューラルネットワーク層への出力は、その層への活性化入力と呼ぶことができる。
【００１６】
いくつかの実装形態では、ニューラルネットワークの層はシーケンスで配置される。ある他の実装形態では、層は有向グラフとして配される。つまり、任意の特定の層が複数の入力、複数の出力、またはそれらの両方を受け取ることができる。ニューラルネットワークの層は、ある層の出力を前の層への入力として送り返すことができるように構成することもできる。
【００１７】
いくつかのニューラルネットワークは、１つまたは複数のニューラルネットワーク層からの出力をプーリングして、後続のニューラルネットワーク層への入力として用いられるプーリングされた値を生成する。いくつかの実装形態では、ニューラルネットワークは、出力のグループの最大値、最小値、または平均値を判断し、最大値、最小値、または平均値をグループのプーリングされた出力として用いることによって、出力のグループをプーリングする。出力をプーリングすることは、空間的不変性をある程度維持することができるので、さまざまな構成で配置される出力を、同じ推論を有するように処理することができる。いくつかの実装例において、出力をプーリングすることはまた、プーリングする前の出力の所望の特性を維持しながら後続のニューラルネットワーク層で受け取られる入力のサイズまたは次元を低減することができ、それはニューラルネットワークによって生成される推論の品質を著しく損なうことなく効率を改善できる。
【００１８】
本明細書は、ニューラルネットワーク層を処理し、任意選択で１つまたは複数のニューラルネットワーク層の出力に対してプーリングを実行する専用ハードウェア回路を記載する。
【００１９】
図１は、一例としてのニューラルネットワーク処理システム１００を示す。ニューラルネットワーク処理システム１００は、以下に記載されるシステム、コンポーネント、および技術が実装され得る１つまたは複数の位置に１つまたは複数のコンピュータとして実装されるシステムの例である。
【００２０】
ニューラルネットワーク処理システム１００は、専用ハードウェア回路１１０を用いてニューラルネットワーク計算を実行するシステムである。ハードウェア回路１１０は、ニューラルネットワーク計算を実行するための集積回路であり、ハードウェアでベクトル‐行列乗算を実行する行列計算ユニット１２０を含む。ハードウェア回路１１０はまた、ベクトル計算ユニット１４０を含む。一例としての専用ハードウェア回路１２０については以下で図３を参照してより詳細に説明する。
【００２１】
特に、ニューラルネットワーク処理システム１００は、専用ハードウェア回路１１０上にニューラルネットワークを実装することを求める要求を受け、専用ハードウェア回路１１０上にニューラルネットワークを実装し、所与のニューラルネットワークが実装されると、ニューラルネットワーク推論を生成するために専用集積回路１１０を用いてニューラルネットワークへの入力を処理する。
【００２２】
すなわち、ニューラルネットワーク処理システム１００は、入力を処理するために用いられるべきニューラルネットワークのためのニューラルネットワークアーキテクチャを指定する要求を受けることができる。ニューラルネットワークアーキテクチャは、ニューラルネットワーク内の層の数および構成、ならびにパラメータを有する各層のパラメータの値を定義する。
【００２３】
専用集積回路１１０上にニューラルネットワークを実装するために、ニューラルネットワーク処理システム１００は、１つまたは複数の物理的位置にある１つまたは複数のコンピュータ上の１つまたは複数のコンピュータプログラムとして実装されるニューラルネットワーク実装エンジン１５０を含む。
【００２４】
ニューラルネットワーク実装エンジン１５０は命令を生成し、命令は、専用ハードウェア回路１１０によって実行されると、ハードウェア回路１１０に、ニューラルネットワークによって指定される演算を実行させて、受けたニューラルネットワーク入力からニューラルネットワーク出力を生成させる。
【００２５】
命令がニューラルネットワーク実装エンジン１５０によって生成され、ハードウェア回路１１０に与えられると、ニューラルネットワーク処理システム１００は、ニューラルネットワーク入力を受け、ニューラルネットワークを用いて、ハードウェア回路１１０に、生成された命令を実行させることによって、ニューラルネットワーク入力を処理することができる。
【００２６】
しかしながら、いくつかのニューラルネットワークは、１つまたは複数の互換性のないニューラルネットワーク層を含む。本明細書で用いられる互換性のないニューラルネットワーク層という用語は、専用ハードウェア回路１１０によってハードウェアで直接実行することができない操作を指定するニューラルネットワーク層を指す。ハードウェア回路１１０上にこれらのニューラルネットワークを実装するために、ニューラルネットワーク実装エンジン１５０は、ハードウェア回路１１０によって実行されると、ハードウェア回路１１０に、ハードウェアにおいて以下の操作を実行することによって互換性のないニューラルネットワーク層についての出力を生成させる命令を生成する。それらの操作は、ニューラルネットワーク層によって指定されるものとは異なる操作であるが、互換性のないニューラルネットワーク層の仕様を満たす層出力、つまり、層によって指定される操作を直接実行することによって生成されたであろう出力と同じ層出力が生成される結果となる。
【００２７】
特に、いくつかのニューラルネットワークは平均プーリング層を含む。そのようなニューラルネットワーク層は、平均プーリングを実行するためのウィンドウを定める。概念的には、平均プーリング層の出力テンソルの要素を生成するために、入力テンソルにおいて、上記ウィンドウの次元を有する領域を特定し、この領域内の要素の平均を求める。このウィンドウを入力テンソルにおいてシフトし、すなわち１ストライドシフトし、出力テンソルを生成する。このようなシナリオにおいては、出力テンソルは入力テンソルの次元と一致する次元を有することになる。次に、出力テンソルを、ニューラルネットワークの推論として、または、ニューラルネットワークの次の層に対する入力テンソルとして提供することができる。
【００２８】
いくつかのニューラルネットワークは他のタイプのプーリング層を含み得る。一般的に、これらのプーリング層が生成するテンソルの各要素は、ある演算、たとえば代数演算の結果であり、この結果は入力テンソルの要素のサブセットに適用される。たとえば、最大プーリング層または最小プーリング層は、最大または最小プーリングのためのウィンドウを指定することができ、プーリング層によって生成される出力テンソルの各要素は、入力テンソルの要素の対応する領域の最大値または最小値である。
【００２９】
専用ハードウェア回路１１０上で行列演算を実行する主ハードウェアユニットは行列計算ユニット１２０であるが専用ハードウェア回路１１０はハードウェアでその他のニューラルネットワーク演算を実行するその他の回路を含み得るので、専用ハードウェア回路１１０は平均プーリング層の出力を直接計算することができない。平均プーリング層を含むニューラルネットワークを実現するために、ニューラルネットワーク実現エンジン１５０は命令を生成し、命令は、ニューラルネットワークによるニューラルネットワーク入力の処理中に専用ハードウェア回路１１０によって実行されると、専用ハードウェア回路１１０にハードウェアで他の演算を実行させて、ニューラルネットワークの平均プーリング層の仕様を満たす出力テンソルを生成する。具体的には、これらの命令を使用することにより、行列乗算ユニット１２０およびベクトル計算ユニット１４０を制御するための制御信号を生成して演算を実行し、この演算の結果として平均プーリング層の使用を満たすテンソルを出力する。これらの命令およびその他の演算については以下で図６〜図１０を参照しながらより詳細に説明する。
【００３０】
図２は、専用ハードウェア回路を用いてニューラルネットワークの所与の層について計算を実行するための一例としてのプロセス２００のフロー図である。便宜上、方法２００は、方法２００を実行する１つまたは複数の回路を有するシステムに関して説明される。方法２００は、受けた入力から推論を計算するために、ニューラルネットワークの各層に対して実行することができる。
【００３１】
システムは、所与の層について重み入力のセット（ステップ２０２）および活性化入力のセット（ステップ２０４）を受ける。重み入力のセットおよび活性化入力のセットは、専用ハードウェア回路のダイナミックメモリおよびユニファイドバッファからそれぞれ受けることができる。いくつかの実装形態では、重み入力のセットと活性化入力のセットとの両方をユニファイドバッファから受けることができる。
【００３２】
システムは、専用ハードウェア回路の行列乗算ユニットを用いて、重み入力および活性化入力から累積値を生成する（ステップ２０６）。いくつかの実装形態では、累積値は、重み入力のセットと活性化入力のセットとの内積である。すなわち、層内のすべての重みのサブセットである１セットの重みについて、システムは各重み入力を各活性化入力と乗算し、それらの積を合計して累積値を形成することができる。システムは、次いで、他のセットの重みと他のセットの活性化入力との内積を計算することができる。
【００３３】
システムは、専用ハードウェア回路のベクトル計算ユニットを用いて累積値から層出力を生成することができる（ステップ２０８）。いくつかの実装形態では、ベクトル計算ユニットは、累積値に活性化関数を適用する。これについては、さらに以下で図５を参照しながら説明する。層の出力は、ニューラルネットワーク内の次の層への入力として用いるためにユニファイドバッファに格納することができる、または、ニューラルネットワークの推論を求めるために用いることができる。いくつかの実装形態では、ニューラルネットワーク層は、平均プーリング層であってもよく、システムは、平均プーリング層の出力と等価である層の出力テンソルを得るために、累積値に対して追加の処理を実施することができる。受けた入力がニューラルネットワークの各層を介して処理されて、受けた入力に対する推論が生成されると、システムはニューラルネットワークの処理を終了する。
【００３４】
図３は、ニューラルネットワーク計算を実行するための一例としての専用ハードウェア回路３００を示す。回路３００はホストインターフェイス３０２を含む。ホストインターフェイス３０２は、ニューラルネットワーク計算のためのパラメータを含む命令を、たとえばホストコンピュータまたは外部プロセッサから受けることができる。パラメータは、以下のうちの１つまたは複数を含むことができる。すなわち、処理すべき層の数、モデルの各層に対する対応する重み入力のセット、活性化入力の初期セット、すなわち推論が計算されるニューラルネットワークへの入力、各層の対応する入力および出力サイズ、ニューラルネットワーク計算のためのストライド値、および処理されるべき層のタイプ、たとえば畳み込み層、プーリング層、または全結合層、のうちの１つまたは複数を含むことができる。
【００３５】
ホストインターフェイス３０２は、命令をシーケンサ３０６に送ることができ、シーケンサ３０６は、命令を、ニューラルネットワーク計算を実行するように回路を制御する低レベル制御信号に変換する。いくつかの実装形態では、制御信号は、回路内のデータフロー、たとえば重み入力のセットおよび活性化入力のセットが回路をどのように流れるか、を調整する。言い換えると、制御信号は、たとえば平均プーリング計算を実行する行列計算ユニット３１２に対して如何にして入力テンソルの要素を入力として与えるか、および結果として得られた出力をどこに格納するかを指定する。シーケンサ３０６は、ユニファイドバッファ３０８、行列計算ユニット３１２、およびベクトル計算ユニット３１４に制御信号を送ることができる。いくつかの実装形態では、シーケンサ３０６はまた、ダイレクトメモリアクセスエンジン３０４およびダイナミックメモリ３１０に制御信号を送る。いくつかの実装形態では、シーケンサ３０６は制御信号を生成するプロセッサである。シーケンサ３０６は、適切なときに、制御信号を回路３００の各構成要素に送るために、制御信号のタイミングを用いることができる。いくつかの他の実装形態では、ホストインターフェイス３０２は外部プロセッサからの制御信号を送る。
【００３６】
ホストインターフェイス３０２は、重み入力のセットおよび活性化入力の初期セットをダイレクトメモリアクセスエンジン３０４に送ることができる。ダイレクトメモリアクセスエンジン３０４は、ユニファイドバッファ３０８に活性化入力のセットを格納することができる。いくつかの実装形態では、ダイレクトメモリアクセスは、メモリユニットであり得るダイナミックメモリ３１０に重みのセットを格納する。いくつかの実装形態では、ダイナミックメモリは回路の外に配置されている。
【００３７】
ユニファイドバッファ３０８は、たとえば、ダイナミックメモリ３１０から受けたまたはダイナミックメモリ３１０に格納するデータを含む、専用ハードウェア回路３００による処理中のデータを格納するメモリバッファレジスタである。それは、ダイレクトメモリアクセスエンジン３０４からの活性化入力のセットおよびベクトル計算ユニット３１４の出力を格納するために用いることができる。ダイレクトメモリアクセスエンジン３０４は、ユニファイドバッファ３０８からベクトル計算ユニット３１４の出力を読み出すこともできる。
【００３８】
ダイナミックメモリ３１０およびユニファイドバッファ３０８は、重み入力のセットおよび活性化入力のセットをそれぞれ行列計算ユニット３１２に送ることができる。いくつかの実装形態では、行列計算ユニット３１２は二次元シストリックアレイである。行列計算ユニット３１２は、数学的演算、たとえば乗算および加算を実行することができる一次元シストリックアレイまたは他の回路とすることもできる。いくつかの実装形態では、行列計算ユニット３１２は汎用の行列プロセッサである。
【００３９】
行列計算ユニット３１２は、重み入力および活性化入力を処理し、出力のベクトルをベクトル計算ユニット３１４に与えることができる。いくつかの実装形態では、行列計算ユニット３１２は、出力のベクトルをベクトル計算ユニット３１４に送り、ベクトル計算ユニット３１４は、出力のベクトルをユニファイドバッファ３０８に送る。ベクトル計算ユニット３１４は、出力のベクトルを処理し、処理した出力のベクトルをユニファイドバッファ３０８に格納することができる。処理した出力のベクトルは、たとえばニューラルネットワーク内の後続の層で用いるために、行列計算ユニット３１２への活性化入力として用いることができる。行列計算ユニット３１２については以下で図４を参照しながらより詳細に説明する。
【００４０】
ベクトル、たとえば行列計算ユニット３１２から受けた出力のベクトルを処理するために、ベクトル計算ユニット３１４は、活性化ユニット、正規化ユニット、またはその他のユニットのうちの、１つ以上を含み得る。ベクトル計算ユニット３１４の活性化ユニットは、行列計算ユニット３１２から受けた累積値に対して非線形関数、たとえばｔａｎｈ（ｘ）（ｘは累積値）を適用する回路を含み得る。活性化ユニットは、幅が８または６ビットであるバッファまたは整数レジスタを含み得る。ベクトル計算ユニット３１４の正規化ユニットは、後続のニューラルネットワーク層を通して非正規化累積値を送ることによって導入される可能性がある計算エラーを避けるために、行列計算ユニット３１２から受けた累積値を制限するための回路を含み得る。累積値に対して他の演算を実行するための回路がベクトル計算ユニット３１４に含まれていてもよい。
【００４１】
図４は、行列計算ユニットを含む一例としてのアーキテクチャ４００を示す。行列計算ユニットは、二次元シストリックアレイ４０６である。アレイ４０６は複数のセル４０４を含む。いくつかの実装形態では、シストリックアレイ４０６の第１の次元４２０はセルの列に対応し、シストリックアレイ４０６の第２の次元４２２はセルの行に対応する。シストリックアレイは、列よりも行の方が多くてもよく、行よりも列の方が多くてもよく、または列と行とが同数であってもよい。
【００４２】
図示の例では、値ローダ４０２は活性化入力をアレイ４０６の行に送り、重みフェッチャインターフェイス（weight fetcher interface）４０８は重み入力をアレイ４０６の列に送る。しかしながら、いくつかの他の実装形態では、活性化入力はアレイ４０６の列に転送され、重み入力はアレイ４０６の行に転送される。
【００４３】
値ローダ４０２は、ユニファイドバッファ、たとえば、図３のユニファイドバッファ３０８から、活性化入力を受けることができる。各値ローダは、対応する活性化入力をアレイ４０６の最も左側の異なるセルに送ることができる。たとえば、値ローダ４１２は、活性化入力をセル４１４に送ることができる。また、値ローダは、活性化入力を隣接する値ローダに送ることができ、活性化入力をアレイ４０６の最も左側の別のセルで使用することができる。これにより、活性化入力を、アレイ４０６の別の特定のセルで使用するためにシフトすることができる。
【００４４】
重みフェッチャインターフェイス４０８は、メモリユニット、たとえば図２のダイナミックメモリ３１０から重み入力を受けることができる。重みフェッチャインターフェイス４０８は、対応する重み入力をアレイ４０６の最も上の異なるセルに送ることができる。たとえば、重みフェッチャインターフェイス４０８は、重み入力をセル４１４および４１６に送ることができる。
【００４５】
いくつかの実装形態では、ホストインターフェイス、たとえば、図３のホストインターフェイス３０２は、活性化入力をアレイ４０６全体にわたって１つの次元に沿って、たとえば右にシフトしながら、重み入力をアレイ４０６全体にわたって別の次元に沿って、たとえば下にシフトする。たとえば、１クロックサイクルにわたって、セル４１４における活性化入力は、セル４１４の右にあるセル４１６の活性化レジスタにシフトすることができる。同様に、セル４１６における重み入力は、セル４１４の下にあるセル４１８における重みレジスタにシフトすることができる。
【００４６】
各クロックサイクルで、各セルは、所与の重み入力、所与の活性化入力、および隣接セルからの累積出力を処理して、累積出力を生成することができる。累積出力は、与えられた重み入力と同じ次元に沿って隣接セルに渡すこともできる。各セルは、隣接セルからの累積出力を処理することなく、所与の重み入力および所与の活性化入力を処理して出力を生成することもできる。出力は、累積されることなく、与えられた重み入力および出力と同じ次元に沿って隣接セルに渡すことにより、たとえば重みのセットおよび活性化入力の要素ごとの乗算を実行することができる。個々のセルについてはさらに以下で図５を参照しながら説明する。
【００４７】
いくつかの実装形態では、恒等行列、すなわち、主対角線上に１を有しそれ以外の場所に０を有する行列をアレイ４０６に渡すことができ、それによって値ローダ４０２で与えられる入力を修正なしでアキュムレータ４１０に渡すことができる。これは、２つの入力の要素ごとの乗算を実行するために用いることができ、アキュムレータでの第１の出力は、output = MatMul(input1, identity)で表すことができ、MatMulは、行列計算ユニットが行列乗算を実行するための命令であり、要素ごとの乗算結果に対応する第２の出力は、output *= MatMul(input2, identity)で表される。
【００４８】
いくつかの実装形態において、入力と恒等行列との間の行列乗算において、恒等行列全体の乗算は不要である。なぜなら、恒等行列内の値の多くがゼロであるからである。たとえば、７６８×７６８行列と、対応する７６８×７６８恒等行列との行列乗算を実行するために、行列計算ユニットによって、７６８×７６８恒等行列を、２５６×２５６行列の９タイルとして処理することができる。このような場合、２５６×２５６行列のうちの３つのみ、すなわち７６８×７６８恒等行列の主対角線を含むタイルが、ゼロ以外の値を含み、その他の６タイルはゼロのみを含むタイルである。処理要件を少なくするために、行列乗算ユニットは、非ゼロ値の行列を含む３つのタイルのみを用いて行列乗算を実行することにより、正しい乗算結果を得ることができる。
【００４９】
累積出力は、重み入力と同じ列に沿って、たとえばアレイ４０６内の列の一番下に向かって渡すことができる。いくつかの実装形態では、各列の一番下において、アレイ４０６は、行よりも多い活性化入力を有する層の計算を実行するときに各列からの各累積出力を格納し累積する、アキュムレータユニット４１０を含み得る。アキュムレータユニットは、セル４０４の出力を格納する３２ビットレジスタまたはバッファを有していてもよい。いくつかの実装形態では、各アキュムレータユニットは複数の並列累積値を格納する。アキュムレータユニット４１０は、各累積出力を累積して最終累積値を生成することができる。最終累積値はベクトル計算ユニット、たとえば図３のベクトル計算ユニットに転送することができる。いくつかの他の実装形態では、アキュムレータユニット４１０は、行よりも少ない活性化入力を有する層を処理するときに累積を実行せずに累積値をベクトル計算ユニットに渡す。
【００５０】
図５は、シストリックアレイ、たとえば図４のシストリックアレイ４０６の内部のセルの一例としてのアーキテクチャ５００を示す。
【００５１】
セルは、活性化入力を格納する活性化レジスタ５０６を含み得る。活性化レジスタは、シストリックアレイ内のセルの位置に応じて、左側の隣接セル、すなわち所与のセルの左側に位置する隣接セルから、またはユニファイドバッファから、活性化入力を受けることができる。セルは、重み入力を格納する重みレジスタ５０２を含み得る。重み入力は、シストリックアレイ内のセルの位置に応じて、上の隣接セルまたは重みフェッチャインターフェイスから転送することができる。セルは総和レジスタ５０４を含むこともできる。総和レジスタ５０４は、上の隣接セルからの累積値を格納することができる。乗算回路５０８を用いて、重みレジスタ５０２からの重み入力を活性化レジスタ５０６からの活性化入力と乗算することができる。乗算回路５０８は積を合計回路５１０に出力することができる。
【００５２】
合計回路５１０は、積と総和レジスタ５０４からの累積値とを合計して新たな累積値を生成することができる。次いで、合計回路５１０は、新たな累積値を、下の隣接セルに位置する別の総和レジスタに送ることができる。新たな累積値は、下の隣接セルにおける合計のためのオペランドとして用いることができる。
【００５３】
合計回路５１０はまた、総和レジスタ５０４からの値を受け、総和レジスタ５０４からの値を、乗算回路５０８からの積と合計することなく、下の隣接セルに送ることもできる。たとえば、要素ごとの乗算を実行するために、セルは、総和レジスタ５０４の値を受け、受けた値を隣接するセルに出力することができる。すなわち、合計回路５１０は受けた値に積を加算しない。このセルはまた、セルによる要素ごとの乗算に対応する乗算回路５０８が生成した積を、総和レジスタ５０４で受けた値と合計することなく、隣接するセルに与えることができる。その結果として、シストリックアレイ４０６は、活性化入力および重みの、要素ごとの乗算に対応する、出力ベクトルを提供することができる。
【００５４】
セルは、重み入力および活性化入力を、処理のために、隣接セルにシフトすることもできる。たとえば、重みレジスタ５０２は、重み入力を下の隣接セル内の別の重みレジスタに送ることができる。活性化レジスタ５０６は、活性化入力を右の隣接セル内の別の活性化レジスタに送ることができる。したがって、重み入力と活性化入力との両方を、後続のクロックサイクルでアレイ内の他のセルによって再利用することができる。
【００５５】
いくつかの実装形態では、セルは制御レジスタも含む。制御レジスタは、セルが重み入力または活性化入力のいずれかを隣接セルにシフトすべきかを決定する制御信号を格納することができる。いくつかの実装形態では、重み入力または活性化入力をシフトすることは、１つまたは複数のクロックサイクルを要する。制御信号は、活性化入力または重み入力が乗算回路５０８に転送されるかどうかも決定することができる、または乗算回路５０８が活性化入力および重み入力で演算を行うか否かも決定することができる。制御信号は、たとえば配線を用いて、１つまたは複数の隣接セルに渡すこともできる。
【００５６】
いくつかの実装形態では、重みは重み経路レジスタ５１２に事前にシフトされる。重み経路レジスタ５１２は、重み入力をたとえば上の隣接セルから受け、重み入力を制御信号に基づいて重みレジスタ５０２に転送することができる。重みレジスタ５０２は、活性化入力が複数のクロックサイクルにわたってたとえば活性化レジスタ５０６を介してセルに転送されるとき、重み入力がセル内に留まり、隣接セルに転送されないように、重み入力を静的に格納することができる。したがって、重み入力は、たとえば乗算回路５０８を用いて、複数の活性化入力に適用することができ、それぞれの累積値は隣接セルに転送することができる。
【００５７】
図６は、ニューラルネットワークの平均プーリング層の計算を実行するための一例としてのプロセス６００のフローチャートである。一般的に、プロセス６００は、専用ハードウェア回路を含む、１つ以上のコンピュータからなるシステム、たとえば図１のシステムによって実行される。
【００５８】
このシステムは、専用ハードウェア回路上にニューラルネットワークを実装することを求める要求を受ける（６０２）。具体的にはニューラルネットワークは平均プーリング層を含む。この要求は、ニューラルネットワークを用いて処理するネットワーク入力等の、ニューラルネットワークを実装するためのパラメータ、ニューラルネットワークを用いてネットワーク入力を処理することによって生成された推論を格納する場所、またはその他のパラメータを指定することができる。上記パラメータのうちのいくつかは、平均プーリングを適用すべきウィンドウの次元を定めるパラメータのような、ニューラルネットワークの平均プーリング層に固有のパラメータであってもよい。
【００５９】
このシステムは、ニューラルネットワークの平均プーリング層の処理において使用される、上記要求に基づく計算テンソルを生成する（６０４）。たとえば、ニューラルネットワークに対するネットワーク入力とニューラルネットワークの平均プーリング層のウィンドウとを指定する、ニューラルネットワーク実装要求を受けたことに基づいて、このシステムは、プーリングカーネルと、平均プーリング層を処理するためのゼロ埋込み入力テンソルと、平均プーリング層を処理するためのマスキングテンソルと、平均プーリング層を処理するための任意選択の第３のテンソルとを生成する。
【００６０】
平均プーリング層の計算に使用される第１の計算テンソルは、プーリングカーネルである。一般的に、カーネルは、入力行列の計算に使用され、典型的には入力行列よりも次元が小さい行列である。プーリングカーネルは、恒等行列からなり、その次元は、平均プーリング層に対して指定される平均プーリングウィンドウに一致する。たとえば３×３ウィンドウの場合、プーリングカーネルは３×３カーネルであり、カーネルの各要素は次元がＤ×Ｄである恒等行列であり、Ｄはニューラルネットワークの平均プーリング層によって処理されている入力テンソルの深さである。各恒等行列は、値、たとえば１および０で構成され、よって、プーリングカーネルと入力テンソルの領域との畳み込みにより、特定の深さにおけるこの領域内の要素の合計に等しい値を有する要素が生成される。
【００６１】
たとえば、入力テンソルの深さが１である、すなわち入力テンソルが２次元入力テンソルである場合、恒等行列は１からなる１×１行列である、すなわち、値が１であるスカラー要素である。よって、プーリングカーネルは１からなる２次元行列である。なぜなら、プーリングカーネルの各要素は、１からなる１×１行列、すなわち、値が１であるスカラー値であるからである。しかしながら、入力テンソルの深さが３である場合、プーリングカーネルは、平均プーリングウィンドウの指定されたサイズを有する２次元テンソルであり、プーリングカーネルの各要素は、主対角線上に１を有しそれ以外の場所では０を有する３×３恒等行列である。このように、入力テンソルの複数の次元を並列に処理することができる。
【００６２】
ニューラルネットワーク計算ユニット１５０は、恒等行列と、恒等行列からなるプーリングカーネルとを生成することができ、かつ、恒等行列および／またはプーリングカーネルを、専用ハードウェア回路１１０がアクセスできる場所に、たとえば、ダイナミックメモリ３１０に格納することができる。これに代えて、ニューラルネットワーク計算エンジン１５０は、恒等行列および／またはプーリングカーネルを専用ハードウェア回路１１０に与えることができる、または、たとえばプーリングカーネルもしくはプーリングカーネルを生成するための命令をホストインターフェイス３０２が受けた場合に、プーリングカーネルを生成するために命令を専用ハードウェア回路１１０に与えることができる。
【００６３】
平均プーリング層の計算に使用される第２の計算テンソルは、ゼロが埋め込まれた入力テンソルであってもよい。たとえば、システムは、平均プーリング層を含むニューラルネットワークを実現することを求める要求を受け、要求に基づいて、この要求が指定するネットワーク入力テンソルに、または、平均プーリング層に対する入力テンソルにゼロを埋め込むことにより、ゼロが埋め込まれた入力テンソルを生成してもよい。ゼロが埋め込まれた入力テンソルは、ニューラルネットワークの平均プーリング層に対して指定されたウィンドウに基づいて生成することができる。いくつかの実装形態において、システムのニューラルネットワーク実装エンジン１５０は、入力テンソルにゼロを埋め込んでもよく、ゼロが埋め込まれた入力テンソルを専用ハードウェア回路１１０に与えてもよい。これに代えて、ニューラルネットワーク実装エンジン１５０は、専用ハードウェア回路１１０を制御するための命令を生成することにより、ゼロが埋め込まれた入力テンソルを生成してもよい。この命令および入力テンソルは、専用ハードウェア回路のホストインターフェイス３０２が受けてもよく、受けた命令に基づく制御信号が、ベクトル計算ユニット３１４、ダイレクトメモリアクセスエンジン３０４、または専用ハードウェア回路の別のコンポーネントを制御することにより、入力テンソルのゼロ埋込みバージョンをユニファイドバッファ３０８格納してもよい。
【００６４】
専用ハードウェア回路１１０がゼロ埋込みを実行するいくつかの実装形態において、ゼロ埋込みは、先ず入力テンソルを、出力の適切な部分、たとえばユニファイドバッファ３０８にコピーし、次にゼロをメモリ内の適切な位置に書き込むことによって実現される。たとえば、平均プーリング層の８×８入力テンソルおよび３×３ウィンドウの場合、ゼロが埋め込まれた入力テンソルは１０×１０テンソルとなる。ゼロ埋込みの入力および出力双方について、データのラスタースキャン順序を想定すると、ゼロが埋め込まれた出力テンソルは次のように構成される。入力行列のゼロ埋込みの最初の行に対応して最初の１０個のゼロがあり、続く８行は各々、左に埋め込まれた１つのゼロと、入力テンソルの行からの８個の値と、右に埋め込まれた別のゼロとからなり、続くゼロ埋込みの最後の行に対応して別の１０個のゼロがある。
【００６５】
このゼロ埋込みを実現するために、たとえば、ニューラルネットワーク実装エンジン１５０からの命令から生成された制御信号に基づいて、入力テンソルをユニファイドバッファ３０８から行列計算ユニット３１２にロードすることができる。入力テンソルと恒等行列との乗算を、行列計算ユニット３１２で実行することにより、入力テンソルの活性化値をアキュムレータにロードし、そこで、ゼロが埋め込まれた入力テンソルに対し、ユニファイドバッファ３０８内の適切な場所に格納することができる。次に、ベクトル計算ユニット３１４は、適切なゼロをユニファイドバッファ３０８に書き込むことにより、ゼロが埋め込まれた入力テンソルを生成することができる。
【００６６】
いくつかの実装形態において、システムは、ニューラルネットワークの平均プーリングを処理するために第３の計算テンソルを生成することもできる。第３のテンソルは、平均プーリングニューラルネットワーク層のウィンドウ内の要素の数の逆数に各々が等しい要素で構成される。ニューラルネットワーク実装１５０は、受けたニューラルネットワーク実装要求に基づいて第３のテンソルを生成することができる。たとえば、ニューラルネットワーク実装エンジン１５０は、ニューラルネットワークの平均プーリング層に対する入力テンソルと同一サイズの第３のテンソルを生成してもよく、このテンソルを、平均プーリング層について指定されたウィンドウ内の要素の数の逆数に等しい値で埋めてもよい。生成された第３のテンソルは、専用ハードウェア回路１１０がアクセス可能なメモリ位置に格納してもよく、または、平均プーリング層の計算に使用するために専用ハードウェア回路１１０に与えてもよい。これに代えて、専用ハードウェア回路１１０は、ニューラルネットワーク実装エンジン１５０から受けた命令に基づいて第３のテンソルを生成してもよい。
【００６７】
いくつかの実装形態において、システムによって生成される第４の計算テンソルは、マスキングテンソルである。一般的に、マスキングテンソルは、ニューラルネットワークの平均プーリング層の計算においてリスケーリング動作を実行するための値で構成される。具体的には、マスキングテンソルの値は、平均プーリング層に対する入力テンソルの次元と、平均プーリング層について指定されたウィンドウとに基づいて、各値が、出力テンソルの対応する値を生成するために平均される入力テンソル値の数を反映するように、決定すればよい。
【００６８】
マスキングテンソルのサイズは、指定されたネットワーク入力の次元に基づいて、または、ニューラルネットワークの平均プーリング層に対する入力テンソルの予測サイズに基づいて、決定することができる。マスキングテンソル内の要素の値は、平均プーリング層の指定されたウィンドウと、平均プーリング層に対するネットワーク入力または入力テンソルの次元とに基づいて、決定することができる。マスキングテンソルの要素は、平均プーリング計算の実行において生成される要素のリスケーリングが可能となるように設定され、たとえば、平均プーリング層の処理中に生成された初期出力テンソルのエッジおよびコーナーの要素をリスケーリングする。ニューラルネットワークが２つ以上の平均プーリング層を含む場合、システムは、平均プーリング層各々に対してマスキングテンソルを生成すればよい。いくつかの実装形態において、システムは、メモリに格納されている１つ以上のマスキングテンソルフラグメントを傾斜させることによってマスキングテンソルを生成する。たとえば、要素の行または要素の行のセグメントを傾斜させることにより、より大きなマスキングベクトルをまたはマスキングテンソルフラグメントからなる行列を形成するように配置されたマスキングテンソルを生成することができる。いくつかの実装形態において、システムは、たとえばメモリに、マスキング行列のライブラリを格納することができ、このライブラリからマスキング行列を選択することができる。
【００６９】
マスキングテンソルを、ニューラルネットワーク実装エンジン１５０が生成してもよく、または、マスキングテンソルを生成するために専用ハードウェア回路１１０を制御するための命令を生成してもよい。たとえば、ニューラルネットワーク実装エンジン１５０は、ニューラルネットワーク実装要求に基づいてマスキングテンソルを生成し、専用ハードウェア回路１１０がアクセスできるメモリ場所、たとえば、ダイナミックメモリ３１０に、マスキングテンソルを格納することができる。マスキングテンソルを生成するために、ニューラルネットワーク実装エンジン１５０は、テンソルフラグメントにアクセスしてもよく、テンソルフラグメントをコンパイルすることにより、マスキングテンソルをメモリに生成してもよい。これに代えて、ニューラルネットワーク実装エンジン１５０は、マスキングテンソルを生成し専用ハードウェア回路１１０に与えてもよく、ここで、ホストインターフェイス３０２がマスキングテンソルを受けてもよい。他の実装形態において、ニューラルネットワーク実装エンジン１５０は、マスキングテンソルを生成するために専用ハードウェア回路１１０を制御するための命令を専用ハードウェア回路１１０に与えることができる。たとえば、これらの命令は、専用ハードウェア回路１１０を制御してマスキングテンソルを、たとえばダイナミックメモリ１１０においてアクセス可能なテンソルフラグメントから生成し、マスキングテンソルを、たとえばダイナミックメモリ１１０に格納することができる。
【００７０】
システムは、当該システムの専用ハードウェア回路によって実行されると、ニューラルネットワークによるネットワーク入力の処理中に平均プーリングニューラルネットワーク層の出力に相当する層出力を、当該専用ハードウェア回路に生成させる命令を、生成する（６０６）。たとえば、要求に応じて、図１のシステムのニューラルネットワーク実装エンジン１５０は、出力テンソルを、すなわち、入力テンソルに対して平均プーリングを実行することにより入力テンソルを処理した場合に専用ハードウェア回路１１０が生成する出力に相当する出力ベクトルを、生成する。
【００７１】
システムは、上記命令および計算テンソルを専用ハードウェア回路に送信する（６０８）。たとえば、ニューラルネットワーク実装エンジン１５０は、命令を、図１のシステムの専用ハードウェア回路１１０に与えることができ、専用ハードウェア回路１１０は、これらの命令を、たとえば専用ハードウェア回路のホストインターフェイス３０２で受けることができる。また、ニューラルネットワーク実装エンジン１５０は、計算テンソルを、専用ハードウェア回路１１０に与えることができ、たとえばホストインターフェイス３０２がこれらの計算テンソルを受けることができる。これに代えて、専用ハードウェア回路１１０に与えられた命令によって、専用ハードウェア回路１１０が、たとえばメモリにおいて、平均プーリング層を計算するための計算テンソルを生成するまたはこれにアクセスできるようにしてもよい。ニューラルネットワーク実装エンジン１５０は、専用ハードウェア回路１１０が受けることができる、ニューラルネットワークの計算のためのその他の命令および／またはパラメータを与えることもできる。命令、マスキングテンソル、および／またはパラメータを専用ハードウェア回路１１０に与えることにより、専用ハードウェア回路１１０は、極めて低いレイテンシでニューラルネットワークの平均プーリング層を計算することにより、後続のニューラルネットワーク層の計算の遅延を減じることができる。
【００７２】
図７は、ニューラルネットワークの平均プーリング層を計算するための一例としてのプロセスのフローチャートである。いくつかの実装形態において、プロセス７００は、図１のシステムの専用ハードウェア回路１１０が、ニューラルネットワーク実装エンジン１５０から受けた命令に基づいて、実行することができる。
【００７３】
たとえば、専用ハードウェア回路１１０に、図６で説明したようにニューラルネットワーク実装エンジン１５０が生成した命令を与えることができ、専用ハードウェア回路１１０は、命令に基づいてプロセス７００を実行することができる。命令は、専用ハードウェア回路のホストインターフェイス３０２が受けて専用ハードウェア回路のシーケンサ３０６に送ってもよく、シーケンサ３０６は、命令を、平均プーリング層計算を実行するために専用ハードウェア回路のコンポーネントを制御する低レベル制御信号に変換することができる。
【００７４】
専用ハードウェア回路は、受けた命令に基づいて、平均プーリングニューラルネットワーク層に対する入力テンソルと、平均プーリングニューラルネットワーク層のウィンドウに等しいサイズを有するプーリングカーネルであるカーネルとの、畳み込みを実行することにより、合計出力テンソルを生成する（７０２）。たとえば、受けた命令に基づいて生成した制御信号は、ニューラルネットワークの平均プーリング層に対する入力テンソル、たとえばネットワーク入力、またはニューラルネットワークの前の層の出力と、プーリングカーネルとの、畳み込みを実行するために、専用ハードウェア回路を制御する。ニューラルネットワークの平均プーリング層がニューラルネットワークにおける最初の層である場合、平均プーリング層は、ニューラルネットワークに対するネットワーク入力、たとえば、デジタル画像の画素に対応する要素を含むデジタル画像を表す入力を、処理する。そうではなく、ニューラルネットワークの平均プーリング層がニューラルネットワークにおける最初の層ではない場合、入力テンソルはニューラルネットワークの前の層の出力テンソルの可能性がある。
【００７５】
畳み込みを実行するために、入力テンソルは、たとえば入力テンソルがニューラルネットワークの前の層の出力である場合はユニファイドバッファ３０８内にあってもよく、または、たとえば入力テンソルがネットワーク入力である場合はユニファイドバッファ３０８が受けて格納してもよい。次に、入力テンソルは、ユニファイドバッファ３０８から行列計算ユニット３１２に送られる。加えて、プーリングカーネル、すなわち、恒等行列をその要素として有する行列が、図６で説明したように生成されまたは受け取られ、ダイナミックメモリ３１０に格納されてもよい。プーリングカーネルのサイズは、平均プーリング層のウィンドウに基づいて決定される。たとえば、平均プーリング層が平均プーリング用に３×３ウィンドウを指定する場合、３×３のプーリングカーネルが、たとえば、ホストインターフェイス３０２で受け取られてダイナミックメモリ３１０に送られてもよく、または、たとえばダイナミックメモリ３１０が次元が異なるプーリングカーネルのセットを格納している場合、ダイナミックメモリ３１０において特定されてもよい。プーリングカーネルのこれらの要素、すなわち恒等行列は、ダイナミックメモリ３１０から行列計算ユニット３１２に送られる。
【００７６】
行列計算ユニット３１２は、入力テンソルとプーリングカーネルとの畳み込みを実行することにより、合計出力テンソルを生成する。入力テンソルをプーリングカーネルを用いて畳み込むことにより、入力テンソルのサイズに一致するサイズを有する合計出力テンソルが得られる。いくつかの実装形態において、畳み込みは、その全体を本明細書に引用により援用する国際出願公開ＷＯ２０１６／１８６８１１に開示されている技術を用いて実行することができる。合計出力テンソルの各要素は、入力テンソルの対応する要素に適用されたときにウィンドウが画定する入力テンソルの領域内の入力テンソル要素の合計に相当する。入力テンソルの深さＤが２以上の場合、プーリングカーネルの各要素はＤ×Ｄ恒等行列であり、これらの入力テンソルとプーリングカーネルとの畳み込みでは、入力テンソルの異なる深さを並列に処理することによって合計出力テンソルを生成することができる。このようにして、合計出力テンソルの計算の遅延を減じることができる。合計出力テンソルは、ユニファイドバッファ３０８に格納することができる。いくつかの例において、行列計算ユニット３１２は合計出力をベクトル計算ユニット３１４に与えることができ、ベクトル計算ユニット３１４は合計出力テンソルをユニファイドバッファ３０８に格納する。
【００７７】
いくつかの実装形態において、入力テンソルとプーリングカーネルとの畳み込みは、ゼロが埋め込まれた入力テンソルとプーリングカーネルとの畳み込みを実行することを含む。たとえば、図６について述べたように、入力テンソルのゼロ埋込みバージョンを生成してもよく、ゼロ埋込み入力テンソルとプーリングカーネルとの畳み込みによって合計出力テンソルを生成してもよい。畳み込みを実行するために、ゼロ埋込み入力テンソルを生成しユニファイドバッファ３０８に格納することができる。次に、上記畳み込みプロセスと同様の畳み込みプロセスを実行することにより、入力テンソルと同一サイズの合計出力テンソルを生成することができる。たとえば、ゼロ埋込み入力テンソルおよびプーリングカーネルを行列計算ユニット３１２に与えてもよく、行列計算ユニット３１２は、畳み込み演算を実行し結果として得られた値をユニファイドバッファ３０８に送ることにより、合計出力テンソルとして格納することができる。
【００７８】
いくつかの実装形態において、畳み込み演算は固定小数点演算を利用する。分解能を維持するために、畳み込みの結果を行列計算ユニットのアキュムレータ４１０において保持することができる。いくつかの実装形態では、アキュムレータは各々３２ビット幅なので、畳み込みの結果、すなわちプーリングウィンドウ内の入力テンソル要素の合計はアキュムレータ４１０をオーバフローさせることはない。このように、この平均プーリング計算ステップにおいて解像度を維持することができる。
【００７９】
受けた命令に基づいて、専用ハードウェアは、合計出力テンソルの各要素を平均プーリングニューラルネットワーク層のウィンドウ内の要素の数で除算することにより初期出力テンソルを生成する演算を実行する（７０４）。たとえば、合計出力テンソルの各要素を、平均プーリングニューラルネットワーク層のウィンドウ内の要素の数の逆数に等しいファクタで乗算するために、ホストインターフェイス３０２においてニューラルネットワーク実装エンジンから受けた命令に基づいて制御信号をシーケンサ３０６によって生成してもよい。
【００８０】
いくつかの実装形態において、制御信号は、専用ハードウェア回路に初期出力テンソルを次のようにして生成させる。すなわち、合計出力テンソルと、平均プーリングニューラルネットワーク層のウィンドウ内の要素の数の逆数に各々が等しい要素で構成されたテンソルとに対し、要素ごとの乗算を実行することによって初期出力テンソルを生成する。図６について述べたように、専用ハードウェア回路は、そのような行列を、たとえばホストインターフェイス３０２で受け、ダイナミックメモリ３１０に格納してもよい。これに代えて、専用ハードウェア回路は、行列を生成しダイナミックメモリ３１０に格納するための動作を実行してもよい。この行列のサイズは合計出力テンソルのサイズに一致させることができ、この合計出力のサイズは入力テンソルのサイズにも一致する。たとえば、平均プーリング層が、３×３ウィンドウすなわち９要素からなるウィンドウを有するものとして指定された場合、値１／９（または約０．１１）を有し合計出力テンソルの次元を有する要素からなる行列を、専用ハードウェア回路のホストインターフェイス３０２で受けることができる。この行列はダイナミックメモリ３１０に格納することができる。これに代えて、このような行列は既にダイナミックメモリ３１０に格納されていてもよく、専用ハードウェア回路によって特定されてもよい。
【００８１】
合計出力ベクトルおよび行列の要素ごとの乗算を実行するために、合計出力ベクトルを、ユニファイドバッファ３０８から行列計算ユニット３１２に与えることができ、一方、行列をダイナミックメモリ３１０から行列計算ユニット３１２に与えることができる。行列の、要素ごとの乗算を実行し、要素ごとの乗算の出力を、ユニファイドバッファ３０８に格納することができる。たとえば、行列計算ユニット３１２は、受けた制御信号に基づいて要素ごとの乗算を実行し、結果として得られた初期出力テンソルをベクトル計算ユニット３１４に与えることができる。そうすると、ベクトル計算ユニット３１４は、この初期出力テンソルをユニファイドバッファ３０８に格納することができる。
【００８２】
これに代えて、合計出力ベクトルの要素を、ウィンドウ内の要素の数の逆数に等しいファクタで乗算することは、上記ファクタによる合計出力ベクトルのスカラー乗法を実行することによって実現してもよい。たとえば、合計出力ベクトルを、行列計算ユニット３１２からベクトル計算ユニット３１４に与えてもよく、ベクトル計算ユニット３１４は関数を合計出力ベクトルに適用して合計出力ベクトルの要素を上記ファクタで乗算することにより、初期出力ベクトルを生成してもよい。そうすると、ベクトル計算ユニット３１４は、この初期出力ベクトルをユニファイドバッファ３０８に格納することができる。
【００８３】
本明細書では乗算によって実施されると説明しているが、いくつかの実装形態において、他の演算を実行することにより、初期出力ベクトルを得てもよい。よって、専用ハードウェア回路が合計出力ベクトルの要素を平均プーリング層の指定されたウィンドウの要素の数の逆数で乗算するのではなく、すなわち専用ハードウェア回路が除算を実行可能な場合は、専用ハードウェア回路が、合計出力ベクトルの要素を、平均プーリング層の指定されたウィンドウ内の要素の数で除算することにより初期出力ベクトルを得るように演算してもよい。
【００８４】
ステップ７０２および７０４を実行することにより、専用ハードウェア回路は、平均プーリング層について概ね正確である出力を提供することが可能であるが、出力は適切な平均ではない特定の要素を有するであろう。たとえば、入力テンソルのコーナーの要素に３×３ウィンドウを用いる平均プーリング層を適用する場合、出力テンソルの対応するコーナーの要素の値は、入力テンソルの対応するコーナー要素と入力テンソル内の隣接する３つの要素のみの平均、すなわちたった４要素の平均となる。しかしながら、合計出力ベクトルのコーナー要素を３×３ウィンドウの要素の数の逆数で乗算する、すなわち、１／９で乗算することにより、初期出力テンソル内の計算した平均は、その要素について不正確である可能性がある。
【００８５】
この問題に対処するために、システムは、初期出力テンソルの要素をリスケーリングすることにより出力テンソルを生成することができる（７０６）。リスケーリングを実行するために、専用ハードウェア回路１１０は、図６のステップ６０４について述べたようにマスキングテンソルを受けるまたは生成することができる。マスキングテンソルには、たとえばダイナミックメモリ３１０において専用ハードウェア回路がアクセス可能であり、このマスキングテンソルは行列計算ユニット３１２に与えることができる。初期出力テンソルは、ユニファイドバッファ３０８から行列計算ユニット３１２に与えてもよい。初期出力テンソルおよびマスキングテンソルの要素ごとの乗算を実行することにより、ニューラルネットワークの平均プーリング層の出力に相当する出力テンソルを生成することができる。この出力テンソルは、たとえばベクトル計算ユニット３１４により、ユニファイドバッファ３０８に格納することができる。
【００８６】
プロセス６００のステップ６０４について述べたように、マスキングテンソルのサイズは、合計出力テンソルおよび初期出力テンソルのサイズにも相当する入力テンソルのサイズに相当するものであってもよい。マスキングテンソルの値は、入力テンソルの次元およびニューラルネットワークの平均プーリング層に対して指定されたウィンドウに基づいて求めてもよく、各値は、出力テンソルの対応する値を生成するために平均された入力テンソル値の数を反映する。たとえば、３×３平均ウィンドウおよびサイズが３×３以上である２次元入力テンソルの場合、マスキングテンソルは、コーナー要素についてファクタ９／４、エッジ要素についてファクタ９／６、マスキングテンソルの値の残りが１である。このように、ウィンドウ内の要素の数の逆数、すなわち１／９に等しいファクタで乗算した場合、コーナー要素をスケール９／４でリスケーリングすることにより、合計出力テンソルのコーナー値は４で除算されることになり、これは適切である。なぜなら３×３プーリングカーネルを入力テンソル句のコーナー要素に適用すると、入力テンソルの４要素が合計されて合計出力テンソルのコーナー要素を生成することになる。
【００８７】
その他の実装形態において、合計出力テンソルの要素を平均プーリング層のウィンドウ内の要素の数で処理させるための演算を実行する代わりに、システムは、先ず合計出力テンソルの各値を生成するために合計される入力テンソルの活性化値の数について最小公倍数を求めてもよい。よって、３×３ウィンドウおよび３×３またはそれよりも大きい２次元入力テンソルの場合、入力テンソルの４要素を合計することによって合計出力テンソルのコーナー要素を生成し、入力テンソルの６要素を合計することによって合計出力テンソルのエッジ要素を生成し、入力テンソルの９要素を合計することによって入力テンソルのその他の要素を生成する。したがって、最小公倍数は３６であろう。平均プーリング層について適切な値を生成するために、コーナー要素において９を有しエッジ要素において６を有しその他の場所で４を有するマスキングテンソルを求めればよい。合計出力テンソルの各要素を最小公倍数で除算し、次にマスキングテンソルを用いてリスケーリングするよう演算を実行すると、結果として得られる出力テンソルは、平均プーリング層について正確な出力となるであろう。すなわち、最小公倍数の逆数、すなわち１／３６または約０．０３からなる行列で合計出力テンソルを要素ごとに乗算し、これを、マスキングテンソルを用いた要素ごとの乗算と組み合わせることによって得られる出力テンソルは、ニューラルネットワークの平均プーリング層について正確な出力となるであろう。
【００８８】
分数の乗算ではなく整数の乗算を実行するこのような技術を、特定の実装形態で使用することにより、これらの計算を通して生成される値の分解能を維持する。上述のように、いくつかの実装形態において、行列計算ユニット３１２のアキュムレータ４１０は３２ビット幅であり、一方、たとえばベクトル計算ユニット３１４の活性化ユニットにおける活性化は、８ビットまたは１６ビット幅である。システムは、固定小数点演算を、３２ビット、８ビット、または１６ビットレジスタを用いて実行することにより、平均プーリング層出力の生成における計算を実行することができる。しかしながら、分数演算を実行できるのは活性化のみである。活性化の分解能は低い、すなわち３２ビットに対して８または１６ビットなので、可能であれば整数計算を実行することによって分解能を維持することが望ましい。一旦３２ビットアキュムレータに格納された値に対したとえばベクトル計算ユニット３１４の活性化ユニットによって活性化演算が実行されると、結果として得られる値の分解能は失われる。
【００８９】
このように、整数を用いて要素ごとの乗算を実行することにより、その結果を、活性化において分数を用いて実行された要素ごとの乗算よりも高い分解能で、アキュムレータに保持することができる。平均プーリング演算を整数計算のみを用いてすなわち分数乗算を用いずに実行できる場合、より高い分解能を維持することができる。少なくともいくつかの分数計算を実行しなければならない場合、活性化において実行する分数計算の数を減じることにより、より低い分解能の活性化を用いることで生成される量子化アーティファクトを低減することができる。
【００９０】
図８は、ニューラルネットワークの平均プーリング層の計算の一例を示す。図８の例は、図３の専用ハードウェア回路により、図７のプロセスを用いて実行することができる。例として、図８の例は、平均プーリング層を、活性化値の２次元８×８アレイに適用する。ニューラルネットワークの平均プーリング層は、３×３ウィンドウを有していてもよく、たとえば、ニューラルネットワーク実装要求は、平均プーリング層が３×３ウィンドウを有することを指定してもよく、これは、平均プーリング層の出力の各要素が、入力テンソルの対応する要素と、入力テンソルの対応する要素に隣接する、入力テンソルの８要素との数値平均であることを意味する。図８に示される８×８入力テンソルは、ニューラルネットワークに対するネットワーク入力としての画像入力の８×８部分を表すことができる、または、別の入力テンソル、たとえばニューラルネットワークの前の層の出力に対応する入力テンソルの、８×８部分を表すことができる。
【００９１】
図８のパート（ａ）において、８×８入力テンソルとプーリングカーネルとの畳み込みを実行することにより、合計出力テンソルを生成する。図示のように、プーリングカーネルは１で構成された３×３カーネルである。その理由は次の通りである。入力テンソルは２次元である、すなわちその深さが１であり、プーリングカーネルの各要素は１×１恒等行列、すなわち１のスカラー値である。入力テンソルとプーリングカーネルとの畳み込みの結果得られる合計出力テンソルにおいて、合計出力テンソルの各要素は、入力テンソルの対応する要素と、この入力テンソルの対応する要素に隣接する８要素、すなわち行列フォーマットで書き込まれた場合の入力テンソルの対応する要素を囲んでいる８要素との、合計に相当する。入力テンソルは、メモリすなわちユニフォームバッファ３０８にラスタースキャン順序で格納できるので、合計出力テンソルの要素を生成するために合計される入力テンソルの要素は、メモリ内で隣接していない場合がある。図８には示されていないが、入力テンソルは、図７のプロセス７００について説明した、ゼロが埋め込まれた入力テンソルであってもよい。
【００９２】
図８のパート（ａ）に示される具体例の場合、３×３プーリングカーネルが入力テンソルに適用され、合計出力テンソルの（１，１）位置に対応する、合計出力テンソルの要素が生成される。よって、合計出力テンソルの（１，１）要素は、入力テンソルの（０，０），（１，０），（２，０），（１，０），（１，１），（１，２），（２，０），（２，１），および（２，２）行列位置に対応する要素の合計である。このように、パート（ａ）に示される値の場合、合計出力テンソルの（１，１）位置に対応する要素は３６である。合計出力テンソルの他の要素も同様に計算されるが、図８の例には示されていない。
【００９３】
図８のパート（ｂ）において、合計出力テンソルの要素を、平均プーリングニューラルネットワーク層のウィンドウ内の要素の数の逆数に相当するファクタで乗算することにより、初期出力テンソルを生成する。この乗算を実行するために生成するマスキングテンソルのサイズは、入力テンソルのサイズとも同一サイズである合計出力テンソルのサイズに相当するサイズである。このマスキングテンソルの要素は、平均プーリングニューラルネットワーク層のウィンドウ内の要素の数の逆数に等しい。よって、図８に示されるように、マスキングテンソルは、各々が１／９に等しい値で構成された８×８アレイであり、この値は図８において０．１１に近似されたものとして示されている。
【００９４】
合計出力テンソルとマスキングテンソルとを要素ごとに乗算することにより、初期出力テンソルが得られ、初期出力テンソルの各要素は、合計出力テンソルの対応する要素とマスキングテンソルの対応する要素との積に等しい。よって、初期出力テンソルの（１，１）位置の要素は、３６＊（１／９）＝４に基づき、４となる。初期出力テンソルのその他の要素も同様に計算することができるが図８には示されていない。加えて、図８では要素ごとの乗算の実行を示しているが、いくつかの実装形態において、初期出力テンソルを、合計出力テンソルと、平均プーリング層のウィンドウ内の要素の数の逆数に相当するファクタとのスカラー乗算によって得てもよい。したがって、図８に示される例の場合、たとえばベクトル計算ユニット３１４によって実施される、合計出力テンソルと１／９とのスカラー乗算により、初期出力テンソルが得られる。
【００９５】
図８のパート（ｃ）において、初期出力テンソルの要素をリスケーリングすることにより、ニューラルネットワークの平均プーリング層の出力テンソルを生成する。リスケーリングを実行するために、初期出力テンソルと第２のマスキング層との間で要素ごとの乗算を実施する。第２のマスキングテンソルのサイズは、合計出力テンソルおよび入力テンソル双方のサイズとも同一である初期出力テンソルのサイズに一致する。第２のマスキングテンソルの要素は、図８のパート（ａ）における畳み込みの実施においてプーリングカーネルの要素を乗算した入力テンソルの要素の数に基づいて決定される。よって、図８の例においては、３×３重み行列を入力テンソルのエッジ要素に適用してプーリングカーネルの９要素のうちの４要素を入力テンソルの要素と乗算し、３×３プーリングカーネルを入力テンソルのエッジ要素に適用してプーリングカーネルの９要素のうちの６要素を入力テンソルの要素と乗算する。入力テンソルのその他すべての要素に対し、３×３プーリングカーネルを適用してプーリングカーネルの要素のすべての要素である９要素を入力テンソルの要素と乗算する。
【００９６】
したがって、第２のマスキングテンソルの要素は、平均プーリング層のウィンドウの要素の数による第１の乗算およびリスケーリングファクタによる第２の乗算によって出力テンソルの各要素に適切な平均計算が適用されるように、設定される。よって、入力テンソルのコーナー要素に関しては、プーリングカーネルをコーナー要素に適用するときに入力テンソルの４要素のみを平均する場合、合計出力テンソルの対応する要素の乗算は、最初に、パート（ｂ）に示されるように１／９すなわち０．１１で乗算し、次に、９／４で乗算し、結果として、合計出力ベクトルのコーナー要素を４で有効に除算する。言い換えると、リスケーリングファクタは、たとえば、初期出力テンソル内の特定の要素に寄与する加数の数に基づいて決定される。
【００９７】
いくつかの実装形態において、パート（ｂ）のマスキングテンソルおよびパート（ｃ）の第２のマスキングテンソルは、図１のニューラルネットワーク実装エンジン１５０によって生成され、専用ハードウェア回路１１０に与えられる。専用ハードウェア回路１１０は、生成されたこれらのマスキングテンソルを、たとえばホストインターフェイス３０２において受けることができ、平均プーリング層の計算において使用するためのマスキングテンソルを、たとえば、ダイナミックメモリ３１０に格納することにより、格納することができる。これに代えて、ニューラルネットワーク実装エンジン１５０が専用ハードウェア回路１１０に命令を与えてもよく、この命令は、マスキングテンソルをダイナミックメモリ３１０に生成および／または格納することを、専用ハードウェア回路に実行させる命令であり、たとえば、テンソルフラグメントをタイリングする（tile）ことによってマスキングテンソルを生成し生成したマスキングテンソルをダイナミックメモリ３１０に格納することを、専用ハードウェア回路１１０に実行させる。
【００９８】
初期出力テンソルと第２のマスキングテンソルとを要素ごとに乗算することによって得られた出力テンソルを、ニューラルネットワークの平均プーリング層の出力として、ユニファイドバッファ３０８に格納することができる。たとえば、図８に示されるように、プーリングカーネルのすべての９要素を、位置（１，１）の入力テンソルの要素に適用すると、第２のマスキングテンソルの対応するファクタは１である。よって、出力テンソルの（１，１）位置の要素は、値４を有する初期出力テンソルの対応する要素と同一である。同一の、要素ごとの乗算を、初期出力テンソルのその他すべての要素に対して実行することにより、出力テンソルを生成することができる。
【００９９】
いくつかの例において、図８に示される、合計出力テンソルとマスキングテンソルとの、要素ごとの乗算、および、初期出力テンソルと第２のマスキングテンソルとの、要素ごとの乗算は、活性化において、たとえばベクトル計算ユニット３１４の活性化ユニットで、実行される。これは、上記要素ごとの乗算演算がどちらも、いくつかの実装形態において、活性化によって処理できるがアキュムレータでは処理できない、分数の固定小数点演算である場合に、起こり得る。
【０１００】
図９は、ニューラルネットワークの平均プーリング層の計算のもう１つの例を示す。図９の例は、図３の専用ハードウェア回路により、図７のプロセスを用いて実行することができる。例として、図９の例は、平均プーリング層を、活性化値の８×８アレイに適用する。ニューラルネットワークの平均プーリング層は、３×３ウィンドウを有していてもよく、たとえば、ニューラルネットワーク実装要求は、平均プーリング層が３×３ウィンドウを有することを指定してもよく、これは、平均プーリング層の出力の各要素が、入力テンソルの対応する要素と、入力テンソルの対応する要素に隣接する、入力テンソルの８要素との数値平均であることを意味する。図９に示される８×８入力テンソルは、ニューラルネットワークに対するネットワーク入力としての画像入力の８×８部分を表すことができる、または、別の入力テンソル、たとえばニューラルネットワークの前の層の出力に対応する入力テンソルの、８×８部分を表すことができる。
【０１０１】
図９のパート（ａ）において、ニューラルネットワークの平均プーリング層に対する入力テンソルは、ゼロ埋込み入力テンソルを生成するためにゼロが埋め込まれたものである。専用ハードウェア回路に与えられる命令を用いて、入力テンソルにゼロを埋め込むように専用ハードウェア回路を制御するための制御信号を生成することができる。ゼロ埋込みは、たとえば次のようにして実現できる。ユニファイドバッファ３０８からの入力テンソルを行列計算ユニット３１２に与え、行列計算ユニット３１２において入力行列を恒等行列で乗算し、出力をユニファイドバッファ３０８に格納する。次に、活性化演算をたとえばベクトル計算ユニット３１４によって実行することにより、ユニファイドバッファ３０８の適切な場所にゼロを書き込むことで、ゼロ埋込み入力テンソルを生成することができる。得られたゼロ埋込み入力テンソルは、１０×１０行列であり、この行列は、１０個のゼロからなる第１行と、第１のゼロと入力テンソルの行からの８個の値と行の最後の第２のゼロとを各々が有する８つの行と、１０個のゼロからなる最終行とを有する。
【０１０２】
ニューラルネットワークの平均プーリング層に対して指定されたウィンドウと同一サイズのプーリングカーネルであるカーネルを用いて、ゼロ埋込み入力テンソルの畳み込みを実行する。よって、図９に示される例の場合、１×１恒等行列すなわち１からなる３×３カーネルを、ゼロ埋込み入力テンソルについて、畳み込むことにより、合計出力テンソルを生成する。図示のように、プーリングカーネルを用いてゼロ埋込み入力テンソルを畳み込むことにより生成される合計出力テンソルの各要素は、ゼロ埋込み入力テンソルの対応する要素と、このゼロ埋込み入力テンソルの対応する要素に隣接するものとして示される８要素との合計に等しい。よって、図９に示される合計出力テンソルの（０，０）要素は、８、すなわち、合計０＋０＋０＋０＋０＋１＋０＋３＋４＝８に等しい。同様の処理を実行することにより、図９には示されていない、合計出力テンソルのその他の要素各々を得ることができる。
【０１０３】
図９のパート（ｂ）において、合計出力テンソルとマスキングテンソルとの要素ごとの乗算が実行される。図９のマスキングテンソルは、先ず、ニューラルネットワークの平均プーリング層に対して指定されたウィンドウ内の要素の数、および、合計出力テンソルの各要素を生成するために使用される入力テンソルの要素の数の、最小公倍数を求めることにより、決定することができる。たとえば図９において、最小公倍数はしたがって３６である。すなわち、３×３ウィンドウ内の要素の数である９、合計出力テンソルのコーナー要素を生成するために合計される入力テンソルの要素の数である４、および、合計出力テンソルのエッジ要素を生成するために合計される入力テンソルの要素の数である６の、最小公倍数である。
【０１０４】
次に、マスキングテンソルのファクタを、最小公倍数と、合計出力テンソルの対応する要素を生成するために合計される入力テンソルの要素の数とに基づいて、決定する。上記ファクタにより、合計出力テンソルの要素の、最小公倍数の逆数による乗算、およびこのファクタによる乗算を実施することができ、結果として得られる値は、合計出力テンソルの値を生成するために合計される入力テンソルの要素の数で、合計出力テンソルの要素を除算した値である。よって、マスキングテンソルのコーナー要素は９である。すなわち、合計出力テンソルのコーナー要素を９および１／３６で乗算すると、コーナー要素を４で適切に除算したものになる。マスキングテンソルのエッジ要素は６である。すなわち、合計出力テンソルのエッジ要素を６および１／３６で乗算すると、コーナー要素を６で適切に除算したものになる。マスキングテンソルのその他の要素は４である。すなわち、合計出力ベクトルの対応する要素を４および１／３６で乗算すると、９で適切に除算したものになる。
【０１０５】
合計出力テンソルとマスキングテンソルとを要素ごとに乗算することにより、図９のパート（ｂ）に示される初期出力テンソルが得られる。たとえば、合計出力テンソルを、ユニファイドバッファ３０８から行列計算ユニット３１２に与えてもよく、専用ハードウェア回路が受けたまたは生成したマスキングテンソルを、ダイナミックメモリ３１０から行列計算ユニット３１２に与えてもよい。行列計算ユニット３１２は、要素ごとの乗算を実行することにより、初期出力テンソルを生成する。たとえば、８に等しい合計出力テンソルのコーナー要素と、値９を有するマスキングテンソルの対応する要素とを、要素ごとに乗算すると、初期出力テンソルのコーナー要素の値として、７２が得られる。同様のプロセスを実行することにより、初期出力テンソルのその他の要素を生成するが、これは簡潔にするために図９には示されていない。
【０１０６】
図９のパート（ｃ）において、初期出力テンソルを第２のマスキングテンソルで乗算することにより、出力テンソルを生成する。第２のマスキングテンソルは、初期出力テンソルと同一サイズであり、その各構成要素は、求めた最小公倍数の逆数に等しい、すなわち１／３６または約０．０３である。初期出力テンソルと第２のマスキングテンソルとを要素ごとに乗算することにより、出力テンソルを生成する。たとえば、初期出力テンソルは、ユニファイドバッファ３０８に格納することができ、ユニファイドバッファ３０８から行列計算ユニット３１２に与えることができる。第２のマスキングテンソルは、ダイナミックメモリ３１０に格納することができ、これも、行列計算ユニット３１２に与えることができる。この計算ユニットにおいて、要素ごとの乗算を実行することにより，出力テンソルを生成する。たとえば、値７２を有する初期出力テンソルのコーナー要素を、値１／３６を有する第２のマスキングテンソルの対応する要素で、要素ごとに乗算することにより、出力テンソルの対応するコーナー要素の値として、２が得られる。要素ごとの乗算を実行することにより、出力テンソルのその他の要素を生成することができるが、これは図９には示されていない。これに代えて、たとえばベクトル計算ユニット３１４により、初期出力テンソルに対してスカラー乗算関数を適用してもよい。結果として得られた出力テンソルはユニファイドバッファ３０８に格納することができる。
【０１０７】
特に、図９において実施される計算は、量子化エラーの発生を限定することができる。整数を用いてパート（ｂ）に示される要素ごとの乗算を実行することによって、活性化においてではなくアキュムレータにおいて計算を実行することができる。よって、アキュムレータが活性化よりも高い分解能を有する場合、パート（ｂ）の出力を、より高い分解能に保つことができる。このパート（ｂ）の計算における高められた分解能は、結果として、パート（ｃ）の計算から得られる出力テンソルの精度を高めることになる。
【０１０８】
本明細書に記載の主題の実施形態および機能的動作は、デジタル電子回路において、有形的に実現されたコンピュータソフトウェアまたはファームウェアにおいて、本明細書に開示されている構造およびその構造的均等物を含むコンピュータハードウェアにおいて、または、これらのうちの１つ以上を組み合わせたものにおいて、実現することができる。本明細書に記載の主題の実施形態は、１つ以上のコンピュータプログラムとして、すなわち、データ処理装置によって実行されるまたはデータ処理装置の動作を制御するための有形の非一時的なプログラムキャリア上で符号化されたコンピュータプログラム命令の１つ以上のモジュールとして、実現することができる。これに代えてまたはこれに加えて、プログラム命令は、データ処理装置による実行のために適切な受信装置に送信される情報を符号化するために生成された、人為的に生成された伝搬信号、たとえばマシンによって生成された電気、光、または電磁信号上で符号化することができる。コンピュータ記憶媒体は、マシン読取可能記憶媒体、マシン読取可能記憶基盤、ランダムもしくはシリアルアクセスメモリデバイス、または、これらのうちの１つ以上を組み合わせたものであってもよい。
【０１０９】
「データ処理装置」という用語は、例としてプログラマブルプロセッサ、コンピュータ、または複数のプロセッサもしくはコンピュータを含む、データ処理用のすべての種類の装置、デバイス、およびマシンを包含する。この装置は、専用論理回路たとえばＦＰＧＡ（フィールドプログラマブルゲートアレイ）またはＡＳＩＣ（特定用途向け集積回路）を含み得る。この装置はまた、ハードウェアに加えて、当該コンピュータプログラムのために実行環境を作成するコード、たとえばプロセッサファームウェア、プロトコルスタック、データベース管理システム、オペレーティングシステム、またはこれらのうちの１つ以上の組み合わせを構成するコードを含み得る。
【０１１０】
コンピュータプログラム（プログラム、ソフトウェア、ソフトウェアアプリケーション、モジュール、ソフトウェアモジュール、スクリプト、またはコードと呼ぶ、またはそういうものとして説明することもできる）は、コンパイルもしくはインタプリタ言語、または宣言型もしくは手続型言語を含む、任意のプログラミング言語形態で記述することができ、また、スタンドアロンプログラムとしてまたはモジュールとして、コンポーネント、サブルーチン、または計算環境で使用するのに適したその他のユニットを含む、任意の形態でデプロイすることができる。コンピュータプログラムはファイルシステム内のファイルに対応していてもよいがそうでなくてもよい。プログラムは、その他のプログラムまたはデータを保持する、たとえばマークアップ言語文書に保存されている１つ以上のスクリプトを保持するファイルの一部に、または当該プログラム専用の１つのファイルに、または連携している複数のファイル、たとえば１つ以上のモジュール、サブプログラム、またはコードの一部を保存する複数のファイルに、格納することができる。コンピュータプログラムは、１つの場所にある、または複数の場所に分散しており通信ネットワークによって相互接続されている、１つのコンピュータまたは複数のコンピュータ上で実行するためにデプロイすることができる。
【０１１１】
本明細書に記載のプロセスおよび論理フローは、入力データに対して作用し出力を生成することによって機能を果たすために１つ以上のコンピュータプログラムを実行する１つ以上のプログラマブルコンピュータによって実行することができる。プロセスおよび論理フローは、専用ロジック回路たとえばＦＰＧＡ（フィールドプログラマブルゲートアレイ）またはＡＳＩＣ（特定用途向け集積回路）によって実行されてもよく、装置は、専用ロジック回路たとえばＦＰＧＡ（フィールドプログラマブルゲートアレイ）またはＡＳＩＣ（特定用途向け集積回路）として実現されてもよい。
【０１１２】
コンピュータプログラムの実行に適したコンピュータは、一例として、汎用もしくは専用マイクロプロセッサまたはこれら双方に基づいていてもよく、または、その他任意の種類の中央処理装置に基づいていてもよい。一般的に、中央処理装置は、命令およびデータを、読み取り専用メモリまたはランダムアクセスメモリまたはこれら双方から受ける。コンピュータの必須要素は、命令を実施または実行するための中央処理装置と、命令およびデータを格納するための１つ以上のメモリデバイスとである。一般的に、コンピュータは、データを格納するための１つ以上の大量記憶装置たとえば磁気、光磁気ディスク、または光ディスクを含む、または、上記大量記憶装置からデータを受ける、これにデータを転送する、またはこれら双方のために、上記大量記憶装置に作動的に結合される。しかしながら、コンピュータはこのようなデバイスを有していなくてもよい。加えて、コンピュータは別のデバイスに、たとえば、例を挙げると、携帯電話、携帯情報端末（ＰＤＡ）、モバイルオーディオまたはビデオプレーヤー、ゲーム機、グローバルポジショニングシステム（ＧＰＳ）受信機、またはポータブル記憶装置たとえばユニバーサル・シリアル・バス（ＵＳＢ）フラッシュデバイスに、埋め込まれていてもよい。
【０１１３】
コンピュータプログラム命令およびデータを格納するのに適したコンピュータ読取可能媒体は、すべての形態の不揮発性メモリ、媒体およびメモリデバイスを含み、これは、一例として、半導体メモリデバイスたとえばＥＰＲＯＭ、ＥＥＰＲＯＭ、およびフラッシュメモリデバイス、磁気ディスクたとえば内部ハードディスクまたはリムーバブルディスク、光磁気ディスク、ならびにＣＤ  ＲＯＭおよびＤＶＤ−ＲＯＭディスクを含む。プロセッサおよびメモリに、専用論理回路を補充してもよく、専用論理回路にプロセッサおよびメモリが組み込まれていてもよい。
【０１１４】
ユーザとのやり取りにおける送信のために、本明細書に記載の主題の実施形態は、ユーザに対して情報を表示するためのディスプレイデバイスたとえばＣＲＴ（陰極線管）またはＬＣＤ（液晶ディスプレイ）モニタと、ユーザがコンピュータに入力を送ることができるようにするためのキーボードおよびポインティングデバイスたとえばマウスまたはトラックボールとを有するコンピュータ上で実現することができる。その他の種類のデバイスを用いてユーザとのやり取りにおける送信が行われるようにしてもよい。たとえば、ユーザに与えられるフィードバックは、任意の形態の感覚フィードバックたとえば視覚フィードバック、聴覚フィードバック、または触覚フィードバックであってもよく、ユーザからの入力は、音響、音声、または触覚入力を含む任意の形態で受けることができる。加えて、コンピュータは、ユーザとの対話を、ユーザが使用するデバイスに文書を送信するかまたはこのデバイスから文書を受信することによって、たとえば、ウェブブラウザから受信した要求に応じてユーザのクライアントデバイス上のウェブブラウザにウェブページを送信することによって、実現してもよい。
【０１１５】
本明細書に記載の主題の実施形態は、たとえばデータサーバとしてバックエンドコンポーネントを含む計算システム、または、ミドルウェアコンポーネントたとえばアプリケーションサーバを含む計算システム、または、フロントエンドコンポーネント、たとえば、本明細書に記載の主題を実現したものとユーザとのやり取りを可能にするためのグラフィカルユーザインターフェイスもしくはウェブブラウザを有するクライアントコンピュータを含む計算システム、または、このようなバックエンド、ミドルウェア、またはフロントエンドコンポーネントのうちの１つ以上の任意の組み合わせを含む計算システムにおいて、実現することができる。当該システムのコンポーネントは、デジタルデータ通信の形態または媒体たとえば通信ネットワークによって相互接続することができる。通信ネットワークの例は、ローカルエリアネットワーク（「ＬＡＮ」）およびワイドエリアネットワーク（「ＷＡＮ」）、たとえばインターネットを含む。
【０１１６】
計算システムはクライアントとサーバとを含み得る。クライアントとサーバは、通常は互いに離れており、通信ネットワークを通してやり取りするのが一般的である。クライアントとサーバとの関係は、それぞれのコンピュータ上で実行されクライアントとサーバとの関係を有するコンピュータプログラムによって発生する。
【０１１７】
本明細書には実装の具体的詳細事項が多く含まれているが、これらは、どの発明の範囲またはクレームし得るものの範囲の限定としても解釈されてはならないものであって、むしろ、特定の発明の特定の実施形態に固有であり得る特徴の説明として解釈されるべきものである。本明細書において、別々の実施形態という観点で記載されている特定の特徴は、１つの実施形態において組み合わせ実現することも可能である。逆に、１つの実施形態という観点から記載されている各種特徴を、複数の実施形態において別々に、または任意の適切な下位の組み合わせとして実現することも可能である。加えて、上記特徴は、特定の組み合わせで機能するものとして記載され最初にそういうものとしてクレームされている場合があるが、クレームされている組み合わせに含まれる１つ以上の特徴は、場合によってはこの組み合わせから省略することができ、クレームされている組み合わせは下位の組み合わせまたは下位の組み合わせの変形に関するものである場合がある。
【０１１８】
同様に、動作は図面において特定の順序で示されているが、これは、このような動作が、示されている特定の順序もしくは連続した順序で実行されることを要する、または、示されているすべての動作が所望の結果を得るために実行されることを要する、と理解されてはならない。特定の状況ではマルチタスキングおよび並列処理が好都合である場合がある。加えて、上記実施形態における各種システムモジュールおよびコンポーネントの分離は、すべての実施形態においてこのような分離を要するものと理解されてはならない。記載されているプログラムコンポーネントおよびシステムは一般的に、１つのソフトウェアプロダクトに統合できる、または、パッケージングして複数のソフトウェアプロダクトにできることが、理解されるはずである。
【０１１９】
当該主題の具体的な実施形態は上に述べた通りである。その他の実施形態は以下の請求項の範囲に含まれる。たとえば、請求項に記載の動作は、異なる順序で実行されてそれでもなお所望の結果を得ることができる。一例として、添付の図面に記載されているプロセスは、必ずしも示されている通りの特定の順序または連続した順序によって所望の結果を得ることを要している訳ではない。特定の実装例において、マルチタスキングおよび並列処理が好都合である場合がある。
【図１】
0006900487.tif 000002
【図２】
0006900487.tif 000003
【図３】
0006900487.tif 000004
【図４】
0006900487.tif 000005
【図５】
0006900487.tif 000006
【図６】
0006900487.tif 000007
【図７】
0006900487.tif 000008
【図８】
0006900487.tif 000009
【図９】
0006900487.tif 000010