(57)【要約】  【課題】  活性化関数をハードウェア化して処理を高速化し、かつ適用する活性化関数を容易に変更できるニューラルネットワークの演算装置を提供すること。  【解決手段】  ニューラルネットワークの演算装置（１０６）は、複数種類の活性化関数について、前記活性化関数を用いた演算を行う活性化関数回路（２０８）を有する演算ユニット（２０６）と、スレッドに対応付けて前記活性化関数の種類の指定を記憶するレジスタ（２１４）と、を備える。【選択図】  図４
2020160564.tif 000002
【特許請求の範囲】
【請求項１】
複数種類の活性化関数について、前記活性化関数を用いた演算を行う活性化関数回路（２０８）を有する演算ユニット（２０６）と、
スレッドに対応付けて前記活性化関数の種類の指定を記憶するレジスタ（２１４）と、
を備えるニューラルネットワークの演算装置（１１６）。
【請求項２】
前記演算ユニットに対して送信されるスレッドの命令コードにおいて前記活性化関数の種類の指定として予め定められた所定値が指定されている場合、前記演算ユニットは、前記レジスタにて前記スレッドに対応付けて指定された前記活性化関数を用いて演算を行う請求項１に記載のニューラルネットワークの演算装置。
【請求項３】
前記演算ユニットに対して送信されるスレッドの命令コードにおいて前記活性化関数の種類が指定されている場合には、前記演算ユニットは、前記レジスタでの指定にかかわらず、前記命令コードで指定された前記活性化関数を用いて演算を行う請求項１又は２に記載のニューラルネットワークの演算装置。
【請求項４】
スレッドに対応付けて前記活性化関数の係数の指定を記憶するレジスタ（２１６）をさらに備える請求項１から３のいずれかに記載のニューラルネットワークの演算装置。
【請求項５】
前記演算ユニットに対して送信されるスレッドの命令コードにおいて前記活性化関数の係数の指定として予め定められた所定値が指定されている場合、前記演算ユニットは、前記レジスタにて前記スレッドに対応付けて指定された前記活性化関数の係数を用いて演算を行う請求項４に記載のニューラルネットワークの演算装置。
【請求項６】
前記演算ユニットに対して送信されるスレッドの命令コードにおいて前記活性化関数の係数が指定されている場合には、前記演算ユニットは、前記レジスタでの指定にかかわらず、前記命令コードで指定された前記活性化関数の係数を用いて演算を行う請求項４又は５に記載のニューラルネットワークの演算装置。
【請求項７】
複数種類の前記活性化関数回路のうちの少なくとも１つの前記活性化関数回路は、複数のデータを並行してベクトル演算する請求項１から６のいずれかに記載のニューラルネットワークの演算装置。
【請求項８】
前記演算ユニットは、複数種類の前記活性化関数のそれぞれの微分関数を演算する複数種類の活性化関数の微分関数回路（２１０）をさらに備え、
前記活性化関数と前記活性化関数の微分関数とを用いて演算を行う請求項１から７のいずれかに記載のニューラルネットワークの演算装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ニューラルネットワークの演算装置に関する。
【背景技術】
【０００２】
従来、ニューラルネットワークの演算装置では、複数の活性化関数が使われることがある（例えば、特許文献１参照）。活性化関数は、例えば、シグモイド関数、Softmax関数、ReLU（Rectified Linear Unit）関数、恒等関数等が使われている。計算量の削減のため、日々新たな活性化関数が考案されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１８−９２５６０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
従来のニューラルネットワークの演算装置では、処理を高速化するために活性化関数に関するプログラム専用のハードウェアを設計し活性化関数をハードウェア化することがあった。この場合、新たな活性化関数への対応が難しくなるという課題があった。
【０００５】
本発明は、活性化関数をハードウェア化して処理を高速化し、かつ適用する活性化関数を容易に変更できるニューラルネットワークの演算装置を提供することを目的とする。
【課題を解決するための手段】
【０００６】
本開示は上記課題を解決するために以下の技術的手段を採用する。特許請求の範囲及びこの項に記載した括弧内の符号は、ひとつの態様として後述する実施の形態に記載の具体的手段との対応関係を示す一例であって、本発明の技術的範囲を限定するものではない。
【０００７】
上記目的を達成するために、本発明は、ニューラルネットワークの演算装置（１１６）であって、複数種類の活性化関数について、前記活性化関数を用いた演算を行う活性化関数回路（２０８）を有する演算ユニット（２０６）と、スレッドに対応付けて前記活性化関数の種類の指定を記憶するレジスタ（２１４）と、を備える。
【発明の効果】
【０００８】
本開示によれば、活性化関数をハードウェア化して処理を高速化し、かつ活性化関数の種類をレジスタで指定するので、適用する活性化関数を容易に変更できる。
【図面の簡単な説明】
【０００９】
【図１】本発明の実施の形態に係る演算装置の構成を示すブロック図である。
【図２】本発明の実施の形態に係る演算装置が処理するスレッドを説明するための図である。
【図３】本発明の実施の形態に係るデータフロー型プロセッサの構成を示すブロック図である。
【図４】本発明の実施の形態に係るＰＥ（Processing Element）の構成を示すブロック図である。
【図５】（ａ）本発明の実施の形態に係る活性化関数としてParametric ReLU関数を指定するアセンブラコードを示す図である。  （ｂ）本発明の実施の形態に係る活性化関数として、Hyperbolic Tangent関数を指定するアセンブラコードを示す図である。
【図６】（ａ）本発明の実施の形態に係る活性化関数としてParametric ReLU関数とその微分関数のグラフを示す図である。  （ｂ）本発明の実施の形態に係る活性化関数としてHyperbolic Tangent関数とその微分関数のグラフを示す図である。
【発明を実施するための形態】
【００１０】
以下、図面を参照して本発明の実施の形態を説明する。なお、以下に説明する実施の形態は、本発明を実施する場合の一例を示すものであって、本発明を以下に説明する具体的構成に限定するものではない。本発明の実施にあたっては、実施の形態に応じた具体的構成が適宜採用されてよい。
【００１１】
［演算装置１０の構成］
図１は、本発明の実施の形態に係る演算装置１０の構成を示すブロック図である。演算装置１０は、データフロー型プロセッサ１００、ホストＣＰＵ（Central Processing Unit）２００、システムバス３００、ＲＯＭ（Read Only Memory）４００、ＲＡＭ（Random Access Memory）５００、外部インターフェイス６００、イベントハンドラ７００を有する。
【００１２】
図２は、本発明の実施の形態に係る演算装置１０が処理するスレッドを説明するための図である。図２に示すように、プログラムコードは、データと処理とが分割されているグラフ構造を有している。このグラフ構造は、プログラムのタスク並列性、グラフ並列性を保持している。演算装置１０は、このグラフ構造のプログラムを分割して得られた多量のスレッドを処理する。
【００１３】
演算装置１０が、例えば、畳み込みニューラルネットワーク（Convolutional Neural Network：ＣＮＮ）における畳み込みやプーリング処理をするとき、データフロー型プロセッサ１００に大きな負荷がかかる。演算装置１０が、後述する活性化関数モジュール２０８や活性化関数の微分モジュール２１０を備え活性化関数のハードウェア化をすることで、このデータフロー型プロセッサ１００にかかる大きな負荷を低減できる。
【００１４】
図１に戻って説明を続ける。データフロー型プロセッサ１００には、割込み処理を生成するイベントハンドラ７００が接続されており、イベントハンドラ７００が生成した割込みをサポートしている。データフロー型プロセッサ１００の具体的な構成は、図３を用いて後述する。
【００１５】
ホストＣＰＵ２００は、演算装置１０の中央処理装置（ＣＰＵ）である。ホストＣＰＵ２００は、システムバス３００を介して、演算装置１０の各部と情報の授受が可能である。ホストＣＰＵ２００が、ＲＯＭ４００又はＲＡＭ５００に記憶されたプログラムを実行することにより、演算装置１０の各部の機能を実現する。
【００１６】
ＲＯＭ４００は、読み出し専用の不揮発性メモリである。ＲＡＭ５００は、読み書き用の揮発性メモリである。ＲＯＭ４００とＲＡＭ５００とは、ホストＣＰＵ２００が演算装置１０の各部の機能を実現するためのプログラムを記憶する。ＲＯＭ４００とＲＡＭ５００とは、データフロー型プロセッサ１００の演算結果を記憶してもよい。
【００１７】
外部インターフェイス６００は、演算装置１０が外部から情報を入力し、又は外部へ情報を出力する入出力装置である。外部インターフェイス６００は、例えば、カメラ、超音波センサ等である。
【００１８】
［データフロー型プロセッサ１００の構成］
図３は、データフロー型プロセッサ１００の構成を示すブロック図である。データフロー型プロセッサ１００は、コマンドユニット１０２と、メモリサブシステム１０４と、スレッドスケジューラ１１２と、実行コア１１４とを有する。
【００１９】
コマンドユニット１０２は、データフロー型プロセッサ１００の機能の実行を指示する命令部である。コマンドユニット１０２は、ユーザが設定できるコンフィギュレーション（設定項目）のインターフェイスであるコンフィグインターフェイスと通信してもよい。コマンドユニット１０２は、データの読み出し命令、書き込み命令、消去命令等のコマンドを一時的に格納するコマンドバッファの機能を有してもよい。
【００２０】
メモリサブシステム１０４は、ＲＡＭ５００と実行コア１１４との間に置かれるメモリのシステムである。メモリサブシステム１０４は、システムバスインターフェイス又はＲＯＭインターフェイスと通信してもよい。メモリサブシステム１０４は、アービタ１０６、Ｌ１キャッシュ１０８、Ｌ２キャッシュ１１０を有する。
【００２１】
アービタ１０６は、ＰＥ１１６とＬ１キャッシュ１０８との間に配置され、複数のデータアクセス要求が競合したときに、優先度等を用いた予め定められた規則に従って調整する調整装置である。Ｌ１キャッシュ１０８は、ＲＡＭ５００よりも高速に読み書きできるメモリである。Ｌ２キャッシュ１１０は、Ｌ１キャッシュの下位にあるＲＡＭ５００よりも高速に読み書きできるメモリである。
【００２２】
スレッドスケジューラ１１２は、処理すべき優先度にしたがい複数スレッドを実行コア１１４に割り当てる、スレッドのスケジューラである。
【００２３】
実行コア１１４は、スレッドの処理を実行する実行部である。実行コア１１４は、複数の演算器（Processing Element：ＰＥ）１１６を有する。ＰＥ１１６は、スカラ演算するスカラ演算器でもよいし、ベクトル演算するベクトル演算器でもよい。本実施の形態では、ＰＥ１１６は、少なくとも１つはベクトル演算器である。
【００２４】
［ＰＥ１１６の構成］
図４は、本発明の実施の形態に係るＰＥ１１６の構成を示すブロック図である。ＰＥ１１６は、命令デコーダ・制御部２０２、汎用レジスタファイル２０４、演算ユニット２０６、設定レジスタ２１２を有する。
【００２５】
命令デコーダ・制御部２０２は、命令をデコードし、各部を制御する命令デコーダ・制御部である。命令デコーダ・制御部２０２は、汎用レジスタファイル２０４に対して演算に用いられるレジスタを指定し、設定レジスタ２１２に対して演算スレッドを指定し、演算ユニット２０６に対して演算に用いるモジュールを指定する。
【００２６】
演算ユニット２０６は、入力データに基づいて出力データを生成する演算部である。上述したように、演算ユニット２０６は、命令デコーダ・制御部２０２が指定したレジスタの値に対して、命令デコーダ・制御部２０２が指定したモジュールを使用して演算する。本実施の形態では、演算ユニット２０６は、ベクトル演算を行う。演算ユニット２０６は、活性化関数モジュール２０８と活性化関数の微分モジュール２１０とを有する。
【００２７】
活性化関数モジュール２０８は、活性化関数を演算に適用する活性化関数回路であり、ハードウェアによって構成されている。活性化関数モジュール２０８は、種類の異なる複数の活性化関数を有する。
【００２８】
活性化関数は、例えば、恒等関数、ステップ関数、線形関数、ソフトプラス関数、シグモイド関数、ハードシグモイド関数、Hyperbolic Tangent関数、ソフトサイン関数、ReLU関数、Leaky ReLU関数、Parametric ReLU関数、Thresholded ReLU関数、eLU（Exponential Linear Units）関数、SeLU（Scaled Exponential Linear Unit）関数、Softmax関数、Gumbel-Softmax関数、Swish関数等がある。図４では、活性化関数モジュール２０８が、活性化関数Ａ、活性化関数Ｂ、活性化関数Ｃの３つの活性化関数を有する例を挙げた。
【００２９】
活性化関数の微分モジュール２１０は、活性化関数の微分を演算に適用する活性化関数の微分関数回路であり、ハードウェアによって構成されている。活性化関数の微分モジュール２１０は、種類の異なる複数の活性化関数の微分関数を有する。活性化関数の微分モジュール２１０が演算に適用する複数の活性化関数の微分関数は、例えば、活性化関数モジュール２０８が記憶する複数の活性化関数を微分した関数である。図４では、活性化関数の微分モジュール２１０が、活性化関数Ａの微分関数、活性化関数Ｂの微分関数、活性化関数Ｃの微分関数を有する例を挙げた。
【００３０】
なお、本実施の形態では、演算ユニット２０６が活性化関数モジュール２０８と活性化関数の微分モジュール２１０を有する例を挙げたが、演算ユニット２０６は、活性化関数モジュール２０８だけでもよい。
【００３１】
設定レジスタ２１２は、活性化関数の種類を指定し、活性化関数の係数を指定するためのデータを記憶するレジスタである。なお、設定レジスタ２１２としては、プロセッサが対応するスレッドの数分の設定レジスタ２１２が備えられる。設定レジスタ２１２は、活性化関数の種類を指定するデータを記憶するレジスタ２１４を有する。本実施の形態では、活性化関数Ａを指定するレジスタ値を「１」、活性化関数Ｂを指定するレジスタ値を「２」、活性化関数Ｃを指定するレジスタ値を「３」とする。スレッドに指定されたレジスタ値に対応する活性化関数を、そのスレッドの「デフォルトの活性化関数」という。
【００３２】
設定レジスタ２１２は、活性化関数の係数を指定するデータを記憶するレジスタ２１６を有してもよい。本実施の形態では、設定レジスタ２１２は、活性化関数の種類と係数とを指定する。
【００３３】
命令デコーダ・制御部２０２は、演算ユニット２０６に対して、命令コードで活性化関数の種類、およびその係数を指定する。活性化関数の種類の指定は、命令コードの活性化関数の種類を指定するビットにより判別される。命令コードの活性化関数の種類を指定するビットが「０」のときは、活性化関数の種類を指定するレジスタの値によって、該当する活性化関数（すなわち、デフォルトの活性化関数）を実行する。ここで、「０」は、活性化関数Ａ〜Ｃに対応するレジスタ値とは異なる予め定められた値である。一方、命令コードの活性化関数の種類を指定するビットが「１」〜「３」のときは、演算ユニット２０６は、指定された値に該当する活性化関数Ａ〜Ｃのいずれかを実行する。
【００３４】
同様に、活性化関数の係数の指定は、命令コードの活性化関数の係数を指定するビットにより判別される。命令コードの活性化関数の種類を指定するビットが「０」のときは、活性化関数の係数を指定するレジスタの値によって、該当する活性化関数の係数（すなわち、デフォルトの活性化関数の係数）を指定する。一方、命令コードの活性化関数の種類を指定するビットが「１」以上のときは、命令コードには、必要に応じて活性化関数の係数が指定されており、演算ユニット２０６は、指定された値を用いて活性化関数を実行する。
【００３５】
上述した活性化関数の種類と係数の指定とを、図５と図６とを用いて説明する。図５（ａ）は、本発明の実施の形態に係る活性化関数としてParametric ReLU関数を指定するアセンブラコードを示す図である。図６（ａ）は、本発明の実施の形態に係る活性化関数としてParametric ReLU関数とその微分関数のグラフを示す図である。
【００３６】
アセンブラコード（１）３０２は、活性化関数の種類を指定するデータを記述している。本実施の形態では、アセンブラコード（１）３０２は、活性化関数の種類を指定する引数が「１」であり、「１」に対応付けられたParametric ReLU関数を指定している。
【００３７】
アセンブラコード（２）３０４は、活性化関数の種類を指定するレジスタＲ１に、アセンブラコード（１）３０２で指定した活性化関数を指定するデータ（actfunc#sel）を設定することを記述している。
【００３８】
アセンブラコード（３）３０６は、引数で活性化関数の係数を指定し、活性化関数を演算に適用することを記述している。本実施の形態では、アセンブラコード（３）３０６は、引数「１」でParametric ReLU関数の係数「１」を指定し、Parametric ReLU関数を演算に適用することを記述している。
【００３９】
アセンブラコード（４）３０８は、引数で活性化関数の微分関数の係数を指定し、活性化関数の微分関数を演算に適用することを記述している。本実施の形態では、アセンブラコード（４）３０８は、引数「１」でParametric ReLU関数の微分関数の係数を指定し、Parametric ReLUの微分関数を演算に適用することを記述している。
【００４０】
図５（ａ）に示すアセンブラコードにより演算に適用されるParametric ReLU関数をグラフにすると、図６（ａ）に示すように係数ａ＝１のParametric ReLU関数とその微分関数のグラフとなる。
【００４１】
次に、演算に適用する活性化関数をParametric ReLU関数及びその微分関数からHyperbolic Tangent関数及びその微分関数へと変更するアセンブラコードを説明する。図５（ｂ）本発明の実施の形態に係る活性化関数として、Hyperbolic Tangent関数を指定するアセンブラコードを示す図であり、図６（ｂ）本発明の実施の形態に係る活性化関数としてHyperbolic Tangent関数及びその微分関数のグラフを示す図である。
【００４２】
図５（ｂ）に示すように、本実施の形態では、アセンブラコード（１）４０２は、活性化関数の種類を指定する値が「１」から「２」に変更されている。この変更により、値「１」に対応づけられたParametric ReLU関数から値「２」に対応付けられたHyperbolic Tangent関数へと活性化関数及びその微分関数の指定が変更される。
【００４３】
アセンブラコード（２）３０４からアセンブラコード（４）３０８は、アセンブラコード（２）４０４からアセンブラコード（４）４０８と同じアセンブラコードである。このように、他のアセンブラコードは変えずにアセンブラコード（１）４０２により関数の種類を指定するのみで、演算に適用するデフォルトの活性化関数を変更できる。
【００４４】
なお、Hyperbolic Tangent関数は係数がない関数であり係数の指定が不要である。そのため、アセンブラコード（３）４０６が、引数「１」により関数の係数を指定し、アセンブラコード（４）４０８が引数「１」により関数の係数を指定しても、いずれも無視される。
【００４５】
図５（ｂ）に示すアセンブラコードにより適用される活性化関数をグラフにすると図６（ｂ）に示すように係数をもたないHyperbolic Tangent関数及びその微分関数のグラフとなる。
【００４６】
このように、ニューラルネットワークの演算装置１０は、活性化関数回路を有する演算ユニット２０６と、スレッドに対応付けて活性化関数の種類及び係数の指定を記憶する設定レジスタ２１２とを備えているため、活性化関数をハードウェア化して処理を高速化し、かつ適用する活性化関数を容易に変更できる。
【００４７】
また、ニューラルネットワークの演算装置１０は、少なくとも１つの活性化関数回路がベクトル演算を行うため、複数のデータを並列処理できる。
【００４８】
また、ニューラルネットワークの演算装置１０は、演算ユニット２０６として、複数種類の活性化関数回路とその微分関数回路とを有するため、一つの命令で複数の活性化関数とその微分とを切り替えて利用できる。
【００４９】
また、活性化関数の種類と係数とは、設定レジスタ２１２の値又は命令コードの引数により指定されるため、設定レジスタ２１２のデフォルト値を変えるだけで異なる活性化関数及びその係数への対応が可能となり、デフォルトの活性化関数を変更するためにＲＯＭコードの書き換えを不要若しくは少なくできる。
【００５０】
また、活性化関数の種類とその係数との指定は、設定レジスタ２１２による指定よりも命令コードによる指定を優先できるため、設定レジスタ２１２による活性化関数の指定を受けたくないスレッドは、命令コードにより活性化関数とその係数とを指定できる。なお、設定レジスタ２１２による指定よりも命令コードによる指定を優先できる場合でも、命令コードの引数として予め定められた所定値が指定されているときは、設定レジスタ２１２による活性化関数とその係数との指定を採用できる。
【００５１】
［変形例］
本発明の実施の形態では、データフロー型プロセッサ１００が用いられているが、データフロー型プロセッサ１００に代えてＣＰＵ（Central Processing Unit）、ＧＰＵ（Graphics Processing Unit）等の従来のプロセッサを用いてもよい。
【符号の説明】
【００５２】
１０・・・演算装置，１００・・・データフロー型プロセッサ，
２００・・・ホストＣＰＵ，３００・・・システムバス，４００・・・ＲＯＭ，
５００・・・ＲＡＭ，６００・・・外部インターフェイス，
７００・・・イベントハンドラ，１０２・・・コマンドユニット，
１０４・・・メモリサブシステム，１０６・・・アービタ，
１０８・・・Ｌ１キャッシュ，１１０・・・Ｌ２キャッシュ，
１１２・・・スレッドスケジューラ，１１４・・・実行コア，１１６・・・ＰＥ，
２０２・・・命令デコーダ・制御部，２０４・・・汎用レジスタファイル，
２０６・・・演算ユニット，２０８・・・活性化関数モジュール，
２１０・・・活性化関数の微分モジュール，２１２・・・設定レジスタ，
２１４・・・活性化関数の種類を指定するレジスタ，
２１６・・・活性化関数の係数を指定するレジスタ
【図１】
2020160564.tif 000003
【図２】
2020160564.tif 000004
【図３】
2020160564.tif 000005
【図４】
2020160564.tif 000006
【図５】
2020160564.tif 000007
【図６】
2020160564.tif 000008