以下に、図1~図30を参照しながら、本発明に係る学習装置および学習方法の実施形態を詳細に説明する。また、以下の実施形態によって本発明が限定されるものではなく、以下の実施形態における構成要素には、当業者が容易に想到できるもの、実質的に同一のもの、およびいわゆる均等の範囲のものが含まれる。さらに、以下の実施形態の要旨を逸脱しない範囲で構成要素の種々の省略、置換、変更および組み合わせを行うことができる。
[第1の実施形態]
(GBDTのロジックについて)
高性能な機械学習のアルゴリズムとしてのDLにおいて、識別器は様々なハードロジックによる実装が試みられ、GPU(Graphics Processing Unit)での処理と比較して電力効率が高いことが分かっている。ただし、DLのうち特にCNNの場合には、GPUのアーキテクチャが非常にマッチするため、速度的には、ロジック実装したFPGA(Field-Programmable Gate Array)の方がGPUに比べて、識別が速いというわけではない。それに対して、GBDTのような決定木系のアルゴリズムについて、FPGAによるハードロジックの実装が試行され、GPUよりも高速な結果が報告されている。これは、後述するように、決定木系のアルゴリズムはそのデータ配列の特徴上、GPUのアーキテクチャに適さないためである。
また、学習に関しては、識別よりも世の中の検討は遅れており、DLにおいてもほとんど現状報告がなく、決定木系では報告は少ない状況である。その中でもGBDTの学習は、現状どこからもまだ報告がなく、現在では未開拓の分野であると考えられる。精度のよい識別モデルを得るためには、学習時に特徴量の選択および設計、ならびに学習アルゴリズムのハイパーパラメータの選択を行うため、莫大な試行回数が必要となり、特に大量の学習データがある場合には、学習処理のスピードの高さは現実的に最終的なモデルの精度について非常に大きく作用する。さらに、ロボティクス、HFT(High Frequency Trading)、およびRTB(Real-Time Bidding)のように環境変化への追従のリアルタイム性が求められる分野に関しては、スピードの速さが性能へと直結する。そのため、精度の高いGBDTにおいて、高速な学習処理が出来た場合には、結果的にそれを利用したシステムの性能を大きく向上させることができると考えられる。
(GBDTのFPGAに対する親和性)
決定木またはGBDTが、なぜGPUでは速くならないか、および、なぜFPGAだと速くなるかについて、GBDTのFPGAに対する親和性の観点から述べる。
まず、GBDTがブースティングを用いたアルゴリズムであることの観点から述べる。決定木の中でも、アンサンブル学習を用いたRandom Forest(RF)の場合は、木の間に依存関係がないため、GPUでも並列化しやすいが、GBDTはブースティングを用いて、多数の木を連結する方法であり、一個前の木の結果が出ないと、次の木の学習を開始することができない。そのため、処理としてシリアルな処理であり、一本ずつの木をいかに速く学習するかがキーとなる。これに対して、RFでは、一本あたりは遅くても、並列に多数の木の学習を速くすることで、全体の学習を速くするという選択肢をとり得る。そのため、GPUを用いた場合にも次に述べるDRAM(Dynamic Random Access Memory)のアクセスレイテンシの問題をある程度隠蔽することが可能であると考えられる。
次に、GPUデバイスのRAM(Random Access Memory)へのアクセス速度の限界(特にランダムアクセス)の観点から述べる。FPGAに内蔵のSRAM(Static Random Access Memory)は、FPGA内のRAMのバス幅を非常に大きくできるため、ミドルレンジのFPGAである、例えば、Xilinx社のXC7k325Tを用いた場合でも、以下の様に、3.2[TB/sec]に及ぶ。なお、内蔵RAMの容量は16[Mb]である。
BRAM 445個 × 36bit × 100MHz × 2ポート = 445*36*2*100*10^6/10^12 = 3.2TB/sec
また、ハイエンドのFPGAである、Xilinx社のVU9Pを用いた場合、6.9[TB/sec]である。なお、内蔵RAMの容量は270[Mb]である。
URAM 960個 × 36bit × 100MHz × 2ポート = 960*36*2*100*10^6/10^12 = 6.9TB/sec
これらの値は、クロック周波数を100[MHz]とした場合であるが、実際には、回路構成を工夫すると、200~500[MHz]程度での動作が考えられ、限界の帯域は数倍となる。これに対して、CPU(Central Processing Unit)に接続されているRAMは現世代では、DDR4(Double-Data-Rate4)であるが、下記のようにDIMM(Dual Inline Memory Module)1枚での帯域は25.6[GB/sec]に留まる。4枚のインタリーブ構成(256ビット幅)にしたとしても、100[GB/sec]程度である。DDR4のチップ規格がDDR4-3200(バス幅64ビット、DIMM1枚)の場合、以下のようになる。
200MHz × 2(DDR) × 64 = 200*10^6*2*64/10^9 = 25.6GB/sec
GPUに搭載されているGDDR5(Graphics Double-Data-Rate5)では、DDR4の帯域よりも4倍程度大きくなっているが、それでも、最大で400[GB/sec]程度である。
このように、FPGA内のRAMと、GPUおよびCPUでの外部メモリとは、帯域に大きな差がある。さらに、ここまでは、アドレスに対してシーケンシャルなアクセスの場合に関して述べてきたが、これ以上に大きく効いてくるのが、ランダムアクセス時のアクセスの時間である。FPGA内蔵のRAMはSRAMであるため、シーケンシャルアクセスでもランダムアクセスでもアクセスレイテンシは1クロックであるが、DDR4およびGDDR5は、DRAMであり、センスアンプの都合上、異なるカラムにアクセスした場合には、レイテンシが大きくなる。例えば、DDR4のRAMにおいて、代表的なCASレイテンシ(Column Address Strobe latency)は16クロックであり、簡単には、シーケンシャルアクセスと比較して、1/16しかスループットが出ない計算となる。
CNNの場合には、隣接した画素のデータを処理していくので、ランダムアクセスのレイテンシは大きく問題とならないが、決定木の場合には、分岐を続けていくと、枝ごとに元のデータのアドレスがどんどんと不連続になり、基本的にランダムアクセスとなる。そのため、データをDRAMに置いた場合、そのスループットがボトルネックとなり、速度が大きく劣化する。GPUにはそのような場合の性能劣化を抑えるために、キャッシュが存在するが、基本的に決定木はデータを総なめしていくアルゴリズムなので、データアクセスに局所性がなくキャッシュの効果が非常に効きにくい。なお、GPUの構造では、GPUには、演算コア(SM)毎に割り振られたSRAMからなるシェアードメモリが存在し、これを使うと高速な処理が可能である場合があるが、1個のSMあたり16~48[kB]と少量であり、かつ、SM間をまたぐアクセスの場合には、大きなレイテンシが発生する。現在の高価で大規模なGPUである、Nvidia K80の場合のシェアードメモリの容量の試算を以下に示す。
K80 = 2 × 13 SMX = 26 SMX = 4992 CUDAコア
26 × 48 × 8 = 9Mb
このように、数十万円する大規模なGPUでもシェアードメモリはたった9[Mb]しか存在せず、容量が少な過ぎる。さらに、GPUの場合は、上述のように、処理を行うSMは他のSMのシェアードメモリには直接アクセスできないことに起因し、決定木の学習に利用する場合には、高速なコーディングが困難という制約も存在する。
以上のように、データがFPGA上のSRAMに載るという前提で、FPGAはGPUに比べてGBDTの学習アルゴリズムを高速に実装可能であると考えられる。
(GBDTのアルゴリズム)
図1は、決定木モデルの一例を示す図である。以下、式(1)~式(22)および図1を参照してGBDTの基本論理を説明する。
GBDTは、教師あり学習の一手法であり、教師あり学習は以下の式(1)に示すように、学習データに対するフィッティングの良さを表すロス関数L(θ)と、学習したモデルの複雑さを表す正則化項Ω(θ)とからなる目的関数obj(θ)を何らかの尺度で最適化する処理である。正則化項Ω(θ)は、モデル(決定木)が複雑になり過ぎることを防ぐ、すなわち、汎化性能を高める役割を有する。
式(1)の第1項のロス関数は、例えば、以下の式(2)に示すように、サンプルデータ(学習データ)ごとに誤差関数lより計算されるロスを足し合わせたものである。ここでnはサンプルデータ数、iはサンプル番号、yはラベル、モデルのy(ハット)は予測値である。
ここで、誤差関数lは、例えば、以下の式(3)および式(4)に示すような二乗誤差関数またはロジスティックロス関数等が用いられる。
また式(1)の第2項の正則化項Ω(θ)は、例えば、以下の式(5)に示すようなパラメータθの二乗ノルム等が用いられる。ここで、λは正則化の重みを表すハイパーパラメータである。
ここで、GBDTの場合について考える。まず、GBDTのi番目のサンプルデータx
iに対する予測値は、以下の式(6)のように表現できる。
ここで、Kは決定木の総数、kは決定木の番号、f
k()はk番目の決定木の出力、x
iは入力されるサンプルデータの特徴量である。これより、GBDTもRF等と同じく、各決定木の出力を足し合わせたものを最終的な出力としていることがわかる。また、パラメータθは、θ={f
1,f
2,・・・,f
K}である。以上より、GBDTの目的関数は以下の式(7)のように表される。
上記の目的関数について学習を行うが、決定木モデルではニューラルネット等の学習で用いられるSGD(Stochastic Gradient Descent:確率的勾配降下法)等の手法は使えない。そこでAdditive Training(ブースティング)を用いて学習を行う。Additive Trainingでは、あるラウンド(学習回数、決定木モデル数)tにおける予測値を以下の式(8)のように表現する。
式(8)より、あるラウンドtにおいて、決定木(の出力)f
t(x
i)を求める必要があることが分かる。逆に、あるラウンドtでは他のラウンドについて考える必要はない。そこで、以下では、ラウンドtについて考える。ラウンドtでの目的関数は以下の式(9)のように表される。
ここで、ラウンドtにおける目的関数のテーラー展開(二次の項までで打ち切り)は以下の式(10)のようになる。
ここで、式(10)において、勾配情報g
i、h
iは以下の式(11)で表されるものである。
式(10)において定数項を無視すると、ラウンドtでの目的関数は、以下の式(12)のようになる。
この式(12)により、ラウンドtでの目的関数は、誤差関数を1ラウンド前の予測値で1階微分および2階微分したもの、および正則化項で表されるので、1階微分および2階微分が求まる誤差関数ならば適用が可能なことが分かる。
ここで、決定木モデルについて考える。図1に決定木モデルの例を示す。決定木モデルは、ノードとリーフとから構成され、ノードではある分岐条件を元に入力を次のノードまたはリーフへ入力し、リーフにはリーフウェイトがあり、これが入力に対する出力となる。例えば、図1では、「リーフ2」のリーフウェイトW2が「-1」であることを示している。
また、決定木モデルは以下の式(13)に示すように定式化される。
式(13)において、wはリーフウェイト、qは木の構造を表す。つまり、入力(サンプルデータx)は木の構造qによりいずれかのリーフに割り当てられ、そのリーフのリーフウェイトが出力されることになる。
ここで、決定木モデルの複雑さを以下の式(14)のように定義する。
式(14)において、第1項はリーフの数による複雑さを、第2項はリーフウェイトの二乗ノルムである。また、γは正則化項の重要度を制御するハイパーパラメータである。以上より、ラウンドtでの目的関数について、以下の式(15)のように整理する。
ただし、式(15)において、I
j、G
j、H
jは、以下の式(16)のように表される。
式(15)より、あるラウンドtでの目的関数はリーフウェイトwに関する二次関数であり、一般に二次関数の最小値、およびその時の条件は、以下の式(17)で表される。
つまり、あるラウンドtの決定木の構造qが決まったときに、その目的関数およびリーフウェイトは以下の式(18)のようになる。
ここまでで、あるラウンドで決定木の構造が決まったときのリーフウェイトの算出が可能となった。以降は、決定木の構造の学習手順について述べる。
決定木の構造の学習方法の1つに貪欲法(Greedy Algorithm)がある。貪欲法では、木構造を深さ0からスタートし、各ノードで分岐スコア(Gain)を計算し分岐するか否かを判断して決定木の構造を学習するアルゴリズムである。分岐スコアは以下の式(19)で求められる。
ここで、GL、HLは左ノードに分岐したサンプルの勾配情報の和、GR、HRは右ノードに分岐したサンプルの勾配情報の和、γは正則化項である。式(19)の[]内の第1項は左ノードに分岐したサンプルデータのスコア(目的関数)、第2項は右ノードに分岐したサンプルデータのスコア、第3項は分岐しない場合のスコアであり、分岐による目的関数の改善度合いを表している。
上述の式(19)に示す分岐スコアは、ある特徴量のあるしきい値で分岐した時の良さを表すが、これ単体ではどのような条件が最適か判断できない。そこで、貪欲法では、全ての特徴量の全てのしきい値候補で分岐スコアを求め、分岐スコアが最大となる条件を探すものである。貪欲法は上述のように、アルゴリズムとしては非常にシンプルであるが、全ての特徴量の全てのしきい値候補で分岐スコアを求めるため計算コストが高い。そこで後述するXGBoost等のライブラリでは、性能を維持しつつ、計算コストを低減する工夫がなされている。
(XGBoostについて)
以下、GBDTのライブラリとして周知なXGBoostについて述べる。XGBoostの学習アルゴリズムでは、しきい値候補の削減、および欠損値の扱いの2点について工夫がされている。
まず、しきい値候補の削減について説明する。上述した貪欲法は計算コストが高いという課題があった。XGBoostでは、Weighted Quantile Sketchという方法でしきい値候補数を削減している。これは、分岐スコア(Gain)の計算では、左右に別れるサンプルデータの勾配情報の和が重要であり、勾配情報の和が一定割合変化するしきい値のみを探索候補とするものである。具体的にはサンプルの二次勾配であるhを用いている。特徴量の次元をfとすると、特徴量およびサンプルデータの二次勾配hの集合を、以下の式(20)のように表現する。
また、ランク関数r
fを以下の式(21)のように定義する。
ここで、zはしきい値候補である。式(21)に示すランク関数r
fは、あるしきい値候補より小さいサンプルデータの二次勾配の和が全サンプルデータの二次勾配の和に占める割合を意味している。最終的には、次元fで示される特徴量について、あるしきい値候補の集合{s
f1,s
f2,・・・,s
fl}を求める必要があり、これは以下の式(22)で求める。
ここでεはしきい値候補の削減度合いを決めるパラメータであり、おおよそ1/ε個のしきい値候補が得られる。
Weighted Quantile Sketchは、決定木の最初のノードで(全サンプルデータに対して一括で)行うグローバルと、ノードごとに(当該ノードに割り当てられたサンプルについて毎回)行うローカルの2パターンが考えられる。汎化性能の面ではローカルの方がよいという結果が出ているので、XGBoostではローカルを採用している。
次に、欠損値の扱いについて説明する。入力されるサンプルデータの欠損値の扱いはGBDTおよび決定木に限らず、機械学習分野において一般的に有効な手法はない。欠損値を、平均値、中央値、もしくは協調フィルタ等で補完する方法、または欠損値が多い特徴量を除外する方法等があるが、性能の面で多くのケースで成功するわけではない。しかし、構造化データは欠損値を含むことが多く、実用上は何らかの対応が求められる。
XGBoostは、欠損値を含むサンプルデータを直接扱えるように学習アルゴリズムが工夫されている。これは、ノードの分岐スコアを求める際に、欠損値のデータを全て左右どちらかのノードに割り当てた時のスコアを求める方法である。また、上述のWeighted Quantile Sketchを行う場合は、欠損値を含むサンプルデータを除外した集合に対してしきい値候補を求めるものとすればよい。
(LightGBMについて)
次に、GBDTのライブラリであるLightGBMについて述べる。LightGBMは前処理にbinningと呼ばれる特徴量の量子化を採用し、分岐スコアの計算にGPUを利用した高速なアルゴリズムを採用している。LightGBMはXGBoostと比較して性能は同程度で学習速度が数倍速く、近年利用者が増えてきている。
まず、特徴量の量子化について説明する。分岐スコアは、データセットが大規模であれば大量のしきい値候補に対して計算が必要である。LightGBMは、学習の前処理として、特徴量を量子化することでしきい値候補数を削減している。また、量子化することでXGBoostのようにノードごとにしきい値候補の値および数が変わることがなく、GPUを利用する場合に必須の処理となっている。
特徴量の量子化についてはbinningという名前で様々な研究がなされており、LightGBMでは、特徴量をk個のビンに分割しており、しきい値候補はk個だけとなる。kは255、63、15等であり、データセットによって性能または学習速度は異なる。
また、特徴量を量子化したことで分岐スコアの計算が簡易になる。具体的には、しきい値候補が単に量子化された値になる。そのため、各特徴量について一次勾配および二次勾配のヒストグラムを作成し、各ビン(量子化された値)について分岐スコアを求めればよいことになる。これを特徴量ヒストグラムと呼んでいる。
次に、GPUを利用した分岐スコアの計算について説明する。分岐スコアの計算自体は特徴量が量子化されているため最大でも256パターンであるが、サンプルデータ数はデータセットによっては数万件を超えるため、ヒストグラム作成が学習時間に対して支配的となる。上述で述べたように、分岐スコアの計算では、特徴量ヒストグラムを求める必要がある。GPUを利用した場合、複数のスレッドが同一のヒストグラムを更新する必要があるが、このとき同一のビンを更新する可能性がある。そのため、アトミック演算を使用する必要があり、同一のビンを更新する割合が高いとパフォーマンスが低下する。そこで、LightGBMでは、ヒストグラムの作成の際に、一次勾配および二次勾配のどちらのヒストグラムから値を更新するかをスレッドごとに分けており、これによって同一のビンを更新する頻度を下げている。
(学習識別装置の構成)
図2は、実施形態に係る学習識別装置のモジュール構成の一例を示す図である。図3は、ポインタメモリの構成の一例を示す図である。図4は、ラーニングモジュールのモジュール構成の一例を示す図である。図2~図4を参照しながら、本実施形態に係る学習識別装置1(学習装置)のモジュール構成について説明する。
図2に示すように、本実施形態に係る学習識別装置1は、CPU10と、ラーニングモジュール20(学習部)と、データメモリ30と、モデルメモリ40と、クラシフィケーションモジュール50(識別部)と、を備えている。このうち、ラーニングモジュール20、データメモリ30、モデルメモリ40およびクラシフィケーションモジュール50は、FPGAにより構成されている。CPU10と、当該FPGAとはバスを介してデータ通信可能となっている。なお、学習識別装置1は、図2に示す各構成要素だけではなく、他の構成要素、例えば、CPU10のワークエリアとなるRAM、CPU10が実行するプログラム等を記憶したROM(Read Only Memory)、各種データ(プログラム等)を記憶した補助記憶装置、および外部装置と通信を行う通信I/F等を備えているものとしてもよい。
CPU10は、全体でGBDTの学習を制御する演算装置である。CPU10は、制御部11を有する。制御部11は、ラーニングモジュール20、データメモリ30、モデルメモリ40およびクラシフィケーションモジュール50の各モジュールを制御する。制御部11は、CPU10で実行されるプログラムによって実現される。
ラーニングモジュール20は、決定木を構成するノード毎の最適な特徴量の番号(以下、「特徴量番号」と称する場合がある)、およびしきい値を算出し、当該ノードがリーフの場合は、リーフウェイトを算出し、モデルメモリ40に書き込むハードウェアモジュールである。また、図4に示すように、ラーニングモジュール20は、ゲイン算出モジュール21_1、21_2、・・・、21_nと、最適条件導出モジュール22と、を備えている。ここで、nは、少なくともサンプルデータ(学習データ、識別データ双方含む)の特徴量の数以上の数である。なお、ゲイン算出モジュール21_1、21_2、・・・、21_nについて、任意のゲイン算出モジュールを示す場合、または総称する場合、単に「ゲイン算出モジュール21」と称するものとする。
ゲイン算出モジュール21は、入力されるサンプルデータに含まれる特徴量のうち対応する特徴量について、各しきい値における分岐スコアを、上述の式(19)を用いて算出するモジュールである。ここで、サンプルデータのうち学習データには、特徴量の他、ラベル(真の値)が含まれ、サンプルデータのうち識別データには、特徴量が含まれるが、ラベルは含まれていない。また、各ゲイン算出モジュール21は、一度(1クロック)で入力されたすべての特徴量について、それぞれにそのヒストグラムを演算・格納するメモリを有し、全特徴量を並列に演算する。そのヒストグラムの結果より、各特徴量のゲインを並列に算出する。これによって、一度に、または同時に全特徴量に対する処理が可能となるので、学習処理の速度を飛躍的に向上させることが可能となる。このように、並列に全部の特徴量を読み出し、処理していく方法をフィーチャパラレル(Feature Parallel)と呼ぶ。なお、この方法を実現するためには、データメモリは一度(1クロック)ですべての特徴量を読み出すことができる必要がある。そのため、通常の32ビットや256ビット幅のデータ幅を持つメモリでは実現できない。また、ソフトウエアでは、通常CPUの一度に扱えるデータのビット数は64ビットにとどまり、特徴量数が100、各特徴量のビット数が8ビットだとしても8000ビットが必要となるのに対して、全く対応できない。そのため、従来は、メモリのアドレス毎(例えば、CPUが扱える64ビット幅)に別の特徴量を格納しておき、特徴量すべてでは、複数のアドレスにまたがって保存される方法が取られていた。それに対して、本方法では、メモリの1アドレスにすべての特徴量を格納し、1アクセスで全特徴量を読み出す点が新規の技術内容である。
上述のように、GBDTでは決定木の学習についての並列化はできない。そのため、いかに一本ずつの決定木を速く学習するかが、学習処理の速度に関して支配的となる。一方、アンサンブルな学習を行うRFでは、決定木の間の依存関係は学習時にないので、決定木ごとの学習処理の並列化は容易であるが、一般的にGBDTに対して精度が劣る。上述のように、RFよりも精度の高いGBDTの学習について、上述のようなフィーチャパラレル(Feature Parallel)を適用することで、決定木の学習処理の速度を向上させることができる。
ゲイン算出モジュール21は、算出した分岐スコアを最適条件導出モジュール22へ出力する。
最適条件導出モジュール22は、各ゲイン算出モジュール21により出力された各特徴量に対応する各分岐スコアを入力し、分岐スコアが最大となる特徴量の番号(特徴量番号)およびしきい値を導出するモジュールである。最適条件導出モジュール22は、導出した特徴量番号およびしきい値を、対応するノードの分岐条件データ(分岐条件)として、モデルメモリ40へ書き込む。
データメモリ30は、各種データを格納するSRAMである。データメモリ30は、ポインタメモリ31と、フィーチャメモリ32と、ステートメモリ33と、を備えている。
ポインタメモリ31は、フィーチャメモリ32で格納されているサンプルデータの格納先アドレスを記憶するメモリである。ポインタメモリ31は、図3に示すように、バンクA(バンク領域)と、バンクB(バンク領域)とを有する。なお、バンクAおよびバンクBの2バンクに分割して、サンプルデータの格納先アドレスを記憶する動作の詳細については、図5~図13で後述する。なお、ポインタメモリ31は、3つ以上のバンクを有することを制限するものではない。
フィーチャメモリ32は、サンプルデータ(学習データ、識別データを含む)を格納するメモリである。
ステートメモリ33は、ステート情報(上述のw、g、h)およびラベル情報を記憶するメモリである。
モデルメモリ40は、決定木のノード毎の分岐条件データ(特徴量番号、しきい値)、そのノードがリーフであるか否かを示すリーフフラグ(フラグ情報)、および、そのノードがリーフである場合におけるリーフウェイトを記憶するSRAMである。
クラシフィケーションモジュール50は、ノードごと、決定木ごとにサンプルデータを振り分けるハードウェアモジュールである。また、クラシフィケーションモジュール50は、ステート情報(w,g,h)を計算して、ステートメモリ33に書き込む。
なお、クラシフィケーションモジュール50は、上述のように学習処理におけるサンプルデータ(学習データ)の識別(分岐)だけでなく、サンプルデータ(識別データ)に対する識別処理においても、同一のモジュール構成で、当該識別データに対する識別を行うことが可能である。また、識別処理時にも、一括して特徴量をすべて読み込むことにより、クラシフィケーションモジュール50による処理をパイプライン化することができ、クロックごとに1つのサンプルデータの識別をすることまで処理の高速化が可能となる。一方、上述のように一括で読み込むことができない場合、どこの特徴量が必要になるかは、各ノードに分岐してみないとわからないため、毎回該当する特徴量のアドレスにアクセスする形態ではパイプライン化ができないことになる。
また、上述のクラシフィケーションモジュール50を複数備えるものとし、複数の識別データを分割(データパラレル(Data Parallel))して、各クラシフィケーションモジュール50に分配してそれぞれに識別処理をさせることによって、識別処理を高速化させることもできる。
(学習識別装置の学習処理)
以下、図5~図13を参照しながら、学習識別装置1の学習処理について具体的に説明する。
<初期化>
図5は、実施形態に係る学習識別装置の初期化時のモジュールの動作を示す図である。図5に示すように、まず、制御部11は、ポインタメモリ31を初期化する。例えば、図5に示すように、制御部11は、ポインタメモリ31のバンクAに対して、サンプルデータ(学習データ)のフィーチャメモリ32におけるアドレスを、学習データの数だけ順番に(例えば、アドレスの低い方から順に)書き込む。
なお、学習データのすべてを利用(すべてのアドレスを書き込み)することに限定されるものではなく、いわゆるデータサブサンプリングによって、所定の乱数に従った確率に基づいてランダムに選択した学習データを用いる(当該選択した学習データのアドレスを書き込む)ものとしてもよい。例えば、データサブサンプリングが0.5の場合、乱数に従った半分の確率で学習データの全アドレスのうち、半分のアドレスがポインタメモリ31(ここではバンクA)に書き込まれるものとしてもよい。乱数の発生には、LFSR(Linear Feedback Shift Register:線形帰還シフトレジスタ)により作成された擬似乱数が使用可能である。
また、学習に使用する学習データのうちすべての特徴量を使用することに限定されるものではなく、いわゆるフィーチャサブサンプルによって、上述と同様の乱数に従った確率に基づいてランダムに選択(例えば、半分を選択)した特徴量のみを使用するものとしてもよい。この場合、例えば、フィーチャサブサンプルにより選択された特徴量以外の特徴量のデータとしては、フィーチャメモリ32から定数が出力されるものとすればよい。これによって、未知のデータ(識別データ)に対する汎化性能が向上するという効果がある。
<デプス0・ノード0の分岐条件データの決定>
図6は、実施形態に係る学習識別装置のデプス0、ノード0のノードパラメータを決定する場合のモジュールの動作を示す図である。なお、決定木の一番上の階層を「デプス0」、そこから下の階層を順に「デプス1」、「デプス2」、・・・と称するものとし、特定の階層の一番左のノードを「ノード0」、そこから右のノードを順に「ノード1」、「ノード2」、・・・と称するものとする。
図6に示すように、まず、制御部11は、ラーニングモジュール20へ開始アドレスおよび終了アドレスを送信し、トリガによりラーニングモジュール20による処理を開始させる。ラーニングモジュール20は、開始アドレスおよび終了アドレスに基づいて、ポインタメモリ31(バンクA)から対象とする学習データのアドレスを指定し、当該アドレスによって、フィーチャメモリ32から学習データ(特徴量)を読み出し、ステートメモリ33からステート情報(w,g,h)を読み出す。
この場合、上述したように、ラーニングモジュール20の各ゲイン算出モジュール21は、対応する特徴量のヒストグラムを計算し、それぞれ自身のSRAMに格納し、その結果に基づいて各しきい値における分岐スコアを算出する。そして、ラーニングモジュール20の最適条件導出モジュール22は、各ゲイン算出モジュール21により出力された各特徴量に対応する各分岐スコアを入力し、分岐スコアが最大となる特徴量の番号(特徴量番号)およびしきい値を導出する。そして、最適条件導出モジュール22は、導出した特徴量番号およびしきい値を、対応するノード(デプス0、ノード0)の分岐条件データとして、モデルメモリ40へ書き込む。この際、最適条件導出モジュール22は、ノード(デプス0、ノード0)からさらに分岐されることを示すためにリーフフラグを「0」として、当該ノードのデータ(分岐条件データの一部としてもよい)をモデルメモリ40へ書き込む。
以上の動作について、ラーニングモジュール20は、バンクAに書き込まれた学習データのアドレスを順に指定し、当該アドレスによって、フィーチャメモリ32から各学習データを読み出して行う。
<デプス0・ノード0でのデータ分岐処理>
図7は、実施形態に係る学習識別装置のデプス0、ノード0の分岐時のモジュールの動作を示す図である。
図7に示すように、制御部11は、クラシフィケーションモジュール50へ開始アドレスおよび終了アドレスを送信し、トリガによりクラシフィケーションモジュール50による処理を開始させる。クラシフィケーションモジュール50は、開始アドレスおよび終了アドレスに基づいて、ポインタメモリ31(バンクA)から対象とする学習データのアドレスを指定し、当該アドレスによって、フィーチャメモリ32から学習データ(特徴量)を読み出す。また、クラシフィケーションモジュール50は、モデルメモリ40から対応するノード(デプス0、ノード0)の分岐条件データ(特徴量番号、しきい値)を読み出す。そして、クラシフィケーションモジュール50は、分岐条件データに従って、読み出したサンプルデータを、ノード(デプス0、ノード0)の左側に分岐させるか、右側に分岐させるかを判定し、その判定結果により、当該学習データのフィーチャメモリ32におけるアドレスを、ポインタメモリ31の読み出しバンク(ここではバンクA)(読み出し用のバンク領域)と異なる他方のバンク(書き込みバンク)(ここではバンクB)(書き込み用のバンク領域)に書き込む。
この際、クラシフィケーションモジュール50は、当該ノードの左側に分岐すると判定した場合、当該学習データのアドレスを、図7に示すように、バンクBのアドレスの低い方から順に書き込み、当該ノードの右側に分岐すると判定した場合、当該学習データのアドレスを、バンクBのアドレスの高い方から順に書き込む。これによって、書き込みバンク(バンクB)では、ノードの左側に分岐した学習データのアドレスは、アドレスの低い方に、ノードの右側に分岐した学習データのアドレスは、アドレスの高い方にきれいに分けて書き込むことができる。なお、書き込みバンクにおいて、ノードの左側に分岐した学習データのアドレスは、アドレスの高い方に、ノードの右側に分岐した学習データのアドレスは、アドレスの低い方に分けて書き込むものとしてもよい。
このように、ポインタメモリ31では、上述のように、バンクAおよびバンクBの2つが構成されており、交互に読み書きすることによって、FPGA内のSRAMの容量が限られている中、効率的にメモリを使用することが可能となる。単純には、フィーチャメモリ32およびステートメモリ33を、それぞれ2バンク構成する方法もあるが、一般的に、サンプルデータよりも、フィーチャメモリ32でのアドレスを示すデータの方が小さいので、本実施形態のように、ポインタメモリ31を準備しておき、間接的にアドレスを指定する方法の方が、メモリの使用量を削減することが可能となる。
以上の動作について、クラシフィケーションモジュール50は、全学習データに対して分岐処理を行う。ただし、分岐処理が終了した後、ノード(デプス0、ノード0)の左側と右側とに同数の学習データが分けられるわけではないので、クラシフィケーションモジュール50は、左側に分岐した学習データのアドレスと、右側に分岐した学習データのアドレスとの境界に対応する書き込みバンク(バンクB)におけるアドレス(中間アドレス)を、制御部11に返す。当該中間アドレスは、次の分岐処理の際に使用される。
<デプス1・ノード0の分岐条件データの決定>
図8は、実施形態に係る学習識別装置のデプス1、ノード0のノードパラメータを決定する場合のモジュールの動作を示す図である。基本的には、図6に示した、デプス0・ノード0の分岐条件データの決定の処理と同様であるが、対象とするノードの階層が変わる(デプス0からデプス1になる)ので、ポインタメモリ31のバンクAおよびバンクBの役割が反転する。具体的には、バンクBが読み出しバンクとなり、バンクAが書き込みバンク(図9参照)となる。
図8に示すように、制御部11は、デプス0での処理でクラシフィケーションモジュール50から受け取った中間アドレスに基づいて、ラーニングモジュール20へ開始アドレスおよび終了アドレスを送信し、トリガによりラーニングモジュール20による処理を開始させる。ラーニングモジュール20は、開始アドレスおよび終了アドレスに基づいて、ポインタメモリ31(バンクB)から対象とする学習データのアドレスを指定し、当該アドレスによって、フィーチャメモリ32から学習データ(特徴量)を読み出し、ステートメモリ33からステート情報(w,g,h)を読み出す。具体的には、ラーニングモジュール20は、図8に示すように、バンクBの左側(アドレスが低い方)から中間アドレスまで順にアドレスを指定していく。
この場合、上述したように、ラーニングモジュール20の各ゲイン算出モジュール21は、読み出した学習データの各特徴量をそれぞれ自身のSRAMに格納して、各しきい値における分岐スコアを算出する。そして、ラーニングモジュール20の最適条件導出モジュール22は、各ゲイン算出モジュール21により出力された各特徴量に対応する各分岐スコアを入力し、分岐スコアが最大となる特徴量の番号(特徴量番号)およびしきい値を導出する。そして、最適条件導出モジュール22は、導出した特徴量番号およびしきい値を、対応するノード(デプス1、ノード0)の分岐条件データとして、モデルメモリ40へ書き込む。この際、最適条件導出モジュール22は、ノード(デプス1、ノード0)からさらに分岐されることを示すためにリーフフラグを「0」として、当該ノードのデータ(分岐条件データの一部としてもよい)をモデルメモリ40へ書き込む。
以上の動作について、ラーニングモジュール20は、バンクBの左側(アドレスが低い方)から中間アドレスまで順に指定し、当該アドレスによって、フィーチャメモリ32から各学習データを読み出して行う。
<デプス1・ノード0でのデータ分岐処理>
図9は、実施形態に係る学習識別装置のデプス1、ノード0の分岐時のモジュールの動作を示す図である。
図9に示すように、制御部11は、デプス0での処理でクラシフィケーションモジュール50から受け取った中間アドレスに基づいて、クラシフィケーションモジュール50へ開始アドレスおよび終了アドレスを送信し、トリガによりクラシフィケーションモジュール50による処理を開始させる。クラシフィケーションモジュール50は、開始アドレスおよび終了アドレスに基づいて、ポインタメモリ31(バンクB)の左側から対象とする学習データのアドレスを指定し、当該アドレスによって、フィーチャメモリ32から学習データ(特徴量)を読み出す。また、クラシフィケーションモジュール50は、モデルメモリ40から対応するノード(デプス1、ノード0)の分岐条件データ(特徴量番号、しきい値)を読み出す。そして、クラシフィケーションモジュール50は、分岐条件データに従って、読み出したサンプルデータを、ノード(デプス1、ノード0)の左側に分岐させるか、右側に分岐させるかを判定し、その判定結果により、当該学習データのフィーチャメモリ32におけるアドレスを、ポインタメモリ31の読み出しバンク(ここではバンクB)(読み出し用のバンク領域)と異なる他方のバンク(書き込みバンク)(ここではバンクA)(書き込み用のバンク領域)に書き込む。
この際、クラシフィケーションモジュール50は、当該ノードの左側に分岐すると判定した場合、当該学習データのアドレスを、図9に示すように、バンクAのアドレスの低い方(受信した開始アドレス)から順に書き込み、当該ノードの右側に分岐すると判定した場合、当該学習データのアドレスを、バンクAのアドレスの高い方(受信した終了アドレスであって前回の中間アドレス)から順に書き込む。これによって、書き込みバンク(バンクA)では、ノードの左側に分岐した学習データのアドレスは、アドレスの低い方に、ノードの右側に分岐した学習データのアドレスは、アドレスの高い方にきれいに分けて書き込むことができる。なお、書き込みバンクにおいて、ノードの左側に分岐した学習データのアドレスは、アドレスの高い方に、ノードの右側に分岐した学習データのアドレスは、アドレスの低い方に分けて書き込むものとしてもよい。
以上の動作について、クラシフィケーションモジュール50は、全学習データのうちバンクBの中間アドレスよりも左側に書き込まれたアドレスで指定される学習データに対して分岐処理を行う。ただし、分岐処理が終了した後、ノード(デプス1、ノード0)の左側と右側とに同数の学習データが分けられるわけではないので、クラシフィケーションモジュール50は、左側に分岐した学習データのアドレスと、右側に分岐した学習データのアドレスとの中間に対応する書き込みバンク(バンクA)におけるアドレス(中間アドレス)を、制御部11に返す。当該中間アドレスは、次の分岐処理の際に使用される。
<デプス1・ノード1の分岐条件データの決定>
図10は、実施形態に係る学習識別装置のデプス1、ノード1のノードパラメータを決定する場合のモジュールの動作を示す図である。なお、図8の場合と同様に、デプス1・ノード0のノードと同じ階層なので、バンクBが読み出しバンクとなり、バンクAが書き込みバンク(図11参照)となる。
図10に示すように、制御部11は、デプス0での処理でクラシフィケーションモジュール50から受け取った中間アドレスに基づいて、ラーニングモジュール20へ開始アドレスおよび終了アドレスを送信し、トリガによりラーニングモジュール20による処理を開始させる。ラーニングモジュール20は、開始アドレスおよび終了アドレスに基づいて、ポインタメモリ31(バンクB)から対象とする学習データのアドレスを指定し、当該アドレスによって、フィーチャメモリ32から学習データ(特徴量)を読み出し、ステートメモリ33からステート情報(w,g,h)を読み出す。具体的には、ラーニングモジュール20は、図10に示すように、バンクBの右側(アドレスが高い方)から中間アドレスまで順にアドレスを指定していく。
この場合、上述したように、ラーニングモジュール20の各ゲイン算出モジュール21は、読み出した学習データの各特徴量をそれぞれ自身のSRAMに格納して、各しきい値における分岐スコアを算出する。そして、ラーニングモジュール20の最適条件導出モジュール22は、各ゲイン算出モジュール21により出力された各特徴量に対応する各分岐スコアを入力し、分岐スコアが最大となる特徴量の番号(特徴量番号)およびしきい値を導出する。そして、最適条件導出モジュール22は、導出した特徴量番号およびしきい値を、対応するノード(デプス1、ノード1)の分岐条件データとして、モデルメモリ40へ書き込む。この際、最適条件導出モジュール22は、ノード(デプス1、ノード1)からさらに分岐されることを示すためにリーフフラグを「0」として、当該ノードのデータ(分岐条件データの一部としてもよい)をモデルメモリ40へ書き込む。
以上の動作について、ラーニングモジュール20は、バンクBの右側(アドレスが高い方)から中間アドレスまで順に指定し、当該アドレスによって、フィーチャメモリ32から各学習データを読み出して行う。
<デプス1・ノード1でのデータ分岐処理>
図11は、実施形態に係る学習識別装置のデプス1、ノード1の分岐時のモジュールの動作を示す図である。
図11に示すように、制御部11は、デプス0での処理でクラシフィケーションモジュール50から受け取った中間アドレスに基づいて、クラシフィケーションモジュール50へ開始アドレスおよび終了アドレスを送信し、トリガによりクラシフィケーションモジュール50による処理を開始させる。クラシフィケーションモジュール50は、開始アドレスおよび終了アドレスに基づいて、ポインタメモリ31(バンクB)の右側から対象とする学習データのアドレスを指定し、当該アドレスによって、フィーチャメモリ32から学習データ(特徴量)を読み出す。また、クラシフィケーションモジュール50は、モデルメモリ40から対応するノード(デプス1、ノード1)の分岐条件データ(特徴量番号、しきい値)を読み出す。そして、クラシフィケーションモジュール50は、分岐条件データに従って、読み出したサンプルデータを、ノード(デプス1、ノード1)の左側に分岐させるか、右側に分岐させるかを判定し、その判定結果により、当該学習データのフィーチャメモリ32におけるアドレスを、ポインタメモリ31の読み出しバンク(ここではバンクB)(読み出し用のバンク領域)と異なる他方のバンク(書き込みバンク)(ここではバンクA)(書き込み用のバンク領域)に書き込む。
この際、クラシフィケーションモジュール50は、当該ノードの左側に分岐すると判定した場合、当該学習データのアドレスを、図11に示すように、バンクAのアドレスの低い方(受信した開始アドレスであって前回の中間アドレス)から順に書き込み、当該ノードの右側に分岐すると判定した場合、当該学習データのアドレスを、バンクAのアドレスの高い方(受信した終了アドレス)から順に書き込む。これによって、書き込みバンク(バンクA)では、ノードの左側に分岐した学習データのアドレスは、アドレスの低い方に、ノードの右側に分岐した学習データのアドレスは、アドレスの高い方にきれいに分けて書き込むことができる。なお、書き込みバンクにおいて、ノードの左側に分岐した学習データのアドレスは、アドレスの高い方に、ノードの右側に分岐した学習データのアドレスは、アドレスの低い方に分けて書き込むものとしてもよい。この場合、図9における動作も合わせる必要がある。
以上の動作について、クラシフィケーションモジュール50は、全学習データのうちバンクBの中間アドレスよりも右側に書き込まれたアドレスで指定される学習データに対して分岐処理を行う。ただし、分岐処理が終了した後、ノード(デプス1、ノード1)の左側と右側とに同数の学習データが分けられるわけではないので、クラシフィケーションモジュール50は、左側に分岐した学習データのアドレスと、右側に分岐した学習データのアドレスとの中間に対応する書き込みバンク(バンクA)におけるアドレス(中間アドレス)を、制御部11に返す。当該中間アドレスは、次の分岐処理の際に使用される。
<デプス1・ノード1の分岐条件データの決定時に分岐しない場合>
図12は、実施形態に係る学習識別装置のデプス1、ノード1のノードパラメータを決定の結果、分岐しない場合のモジュールの動作を示す図である。なお、図8の場合と同様に、デプス1・ノード0のノードと同じ階層なので、バンクBが読み出しバンクとなる。
図12に示すように、制御部11は、デプス0での処理でクラシフィケーションモジュール50から受け取った中間アドレスに基づいて、ラーニングモジュール20へ開始アドレスおよび終了アドレスを送信し、トリガによりラーニングモジュール20による処理を開始させる。ラーニングモジュール20は、開始アドレスおよび終了アドレスに基づいて、ポインタメモリ31(バンクB)から対象とする学習データのアドレスを指定し、当該アドレスによって、フィーチャメモリ32から学習データ(特徴量)を読み出し、ステートメモリ33からステート情報(w,g,h)を読み出す。具体的には、ラーニングモジュール20は、図12に示すように、バンクBの右側(アドレスが高い方)から中間アドレスまで順にアドレスを指定していく。
ラーニングモジュール20は、算出した分岐スコア等から、これ以上ノード(デプス1、ノード1)から分岐しないと判断した場合、リーフフラグを「1」として、当該ノードのデータ(分岐条件データの一部としてもよい)をモデルメモリ40に書き込むと共に、制御部11にも当該ノードのリーフフラグが「1」であることを送信する。これによって、ノード(デプス1、ノード1)から下の階層には分岐しないことが認識される。さらに、ラーニングモジュール20は、ノード(デプス1、ノード1)のリーフフラグが「1」である場合、特徴量番号およびしきい値の代わりに、リーフウェイト(w)(分岐条件データの一部としてもよい)をモデルメモリ40に書き込む。これにより、モデルメモリ40の容量を別々に持つよりも小さくすることができる。
以上の図6~図12で示した処理を、階層(デプス)毎に進めていくと、全体の決定木が完成する(決定木が学習される)。
<決定木の学習が完了した場合>
図13は、実施形態に係る学習識別装置において決定木の学習が完了した場合に全サンプルデータのステート情報を更新するときのモジュールの動作を示す図である。
GBDTを構成する1つの決定木の学習が完了した場合、次の決定木へのブースティング(ここではグラディエントブースティング)の際に使用するため、各学習データの誤差関数に対応する一次勾配g、二次勾配h、および各学習データに対するリーフウェイトwを算出する必要がある。図13に示すように、制御部11は、トリガによりクラシフィケーションモジュール50による上述の計算を開始させる。クラシフィケーションモジュール50は、全学習データに対して、全デプス(階層)のノードに対する分岐判定の処理を行い、各学習データに対応するリーフウェイトを算出する。そして、クラシフィケーションモジュール50は、算出したリーフウェイトに対して、ラベル情報を基に、ステート情報(w、g、h)を算出し、元のステートメモリ33のアドレスに書き戻す。このように、更新されたステート情報を利用して、次の決定木の学習が行われる。
以上のように、本実施形態に係る学習識別装置1において、ラーニングモジュール20は、入力されたサンプルデータの各特徴量を読み込むためのメモリ(例えば、SRAM)をそれぞれ備えている。これによって、1アクセスでサンプルデータの全特徴量を読み出すことができ、各ゲイン算出モジュール21により、一度に全特徴量に対する処理が可能となるので、決定木の学習処理の速度を飛躍的に向上させることが可能となる。
また、本実施形態に係る学習識別装置1において、ポインタメモリ31では、バンクAおよびバンクBの2つが構成されており、交互に読み書きするものとしている。これによって、効率的にメモリを使用することが可能となる。単純には、フィーチャメモリ32およびステートメモリ33を、それぞれ2バンク構成する方法もあるが、一般的に、サンプルデータよりも、フィーチャメモリ32でのアドレスを示すデータの方が小さいので、本実施形態のように、ポインタメモリ31を準備しておき、間接的にアドレスを指定する方法の方が、メモリ容量を節約することが可能となる。また、クラシフィケーションモジュール50は、ノードの左側に分岐すると判定した場合、学習データのアドレスを、2つのバンクのうち書き込みバンクのアドレスの低い方から順に書き込み、当該ノードの右側に分岐すると判定した場合、当該学習データのアドレスを、書き込みバンクのアドレスの高い方から順に書き込む。これによって、書き込みバンクでは、ノードの左側に分岐した学習データのアドレスは、アドレスの低い方に、ノードの右側に分岐した学習データのアドレスは、アドレスの高い方にきれいに分けて書き込むことができる。
(変形例)
図14は、変形例に係る学習識別装置のモデルメモリの構成の一例を示す図である。図14を参照しながら、本変形例に係る学習識別装置1におけるモデルメモリ40において、決定木のデプス(階層)毎にメモリが備えられた構成について説明する。
図14に示すように、本変形例に係る学習識別装置1のモデルメモリ40は、学習された決定木のモデルデータについてデプス(階層)毎にデータ(具体的には分岐条件データ)を格納するためのデプス0用メモリ41_1、デプス1用メモリ41_2、・・・、デプス(m-1)用メモリ41_mを有する。ここで、mは、少なくとも決定木のモデルのデプス(階層)数以上の数である。すなわち、モデルメモリ40は、学習された決定木のモデルデータについてデプス(階層)毎にデータ(デプス0ノードデータ、デプス1ノードデータ、・・・、デプス(m-1)ノードデータ)を同時に取り出すための独立したポートを有する、ということになる。これによって、クラシフィケーションモジュール50は、決定木における最初のノードでの分岐結果に基づき、次のノードに対応するデータ(分岐条件データ)を読み出すことを、全デプス(階層)で並列に行い、途中にメモリを介さずに、1つのサンプルデータ(識別データ)に対して、1クロックで同時に各デプス(階層)での分岐処理を実行(パイプライン処理)することが可能となる。これによって、クラシフィケーションモジュール50における識別処理は、サンプルデータ数分だけの時間だけで済むことになり、識別処理の速度を飛躍的に向上させることができる。これに対して、従来の技術では、ノード毎に新しいメモリ領域にサンプルデータをコピーしていくため、メモリの読み書きの時間だけ速度に影響し、(サンプルデータ数×デプス(階層)数)の識別処理の時間となるので、上述のように本変形例に係る識別処理の方が大幅に優位となる。
図15は、変形例に係る学習識別装置のクラシフィケーションモジュールの構成の一例を示す図である。図15に示すように、クラシフィケーションモジュール50は、ノード0判別器51_1、ノード1判別器51_2、ノード2判別器51_3、・・・を有する。フィーチャメモリ32からは、1クロックに1つのサンプルデータが特徴量として供給される。図15に示すように、特徴量は、まずノード0判別器51_1に入力され、ノード0判別器51_1は、対応するモデルメモリ40のデプス0用メモリ41_1からそのノードのデータ(デプス0ノードデータ)(右に行くか、左に行くかの条件、および使用する特徴量番号)を受け取る。ノード0判別器51_1では、その条件に従い、対応するサンプルデータが右に行くか左に行くかが判別される。なお、ここではデプス用メモリ(デプス0用メモリ41_1、デプス1用メモリ41_2、デプス2用メモリ41_3、・・・)はそれぞれレイテンシが1クロックあるとしている。ノード0判別器51_1の結果により、次のデプス1用メモリ41_2の内、何番目のノードに行くかがアドレス指定され、対応するノードのデータ(デプス1ノードデータ)が抽出され、ノード1判別器51_2に入力される。
デプス0用メモリ41_1のレイテンシは1クロックであるため、同じように特徴量も1クロックの遅延を入れて、ノード1判別器51_2に入力される。また、同じクロックで次のサンプルデータの特徴量がノード0判別器51_1に入力されている。このようにして、パイプライン処理で識別を行うことにより、デプス毎にメモリが同時に出力されている前提で、1つの決定木全体として、1クロックで1つのサンプルデータを識別することが可能である。なお、デプス0用メモリ41_1は、デプス0ではノードは1つしかないので、1つのアドレスのみでよく、デプス1用メモリ41_2は、デプス1ではノードは2つあるので、2つのアドレスが必要であり、同じように、デプス2用メモリ41_3は、4つのアドレスが必要であり、デプス3用メモリ(図示せず)は、8つのアドレスが必要となる。なお、このクラシフィケーションモジュール50は木全体の識別を行うものであるが、ノードの学習時には、ノード0判別器51_1のみを用いて学習を行うことで同じ回路を流用して、回路規模を小さくすることができる。
[第2の実施形態]
第2の実施形態に係る学習識別装置について、第1の実施形態に係る学習識別装置1と相違する点を中心に説明する。第1の実施形態では、サンプルデータが記憶されるデータメモリ30を1つとして、GBDTによる学習処理および識別処理について説明した。本実施形態では、複数のサンプルデータを並列で処理するデータパラレルを実現するために、データメモリを複数に分割して学習処理を行う動作について説明する。
(データパラレルについて)
図16は、データパラレルを適用した学習識別装置のモジュール構成の一例を示す図である。図16を参照しながら、データパラレルを実現する構成の例である学習識別装置1aの構成について説明する。
サンプルデータ(学習データまたは識別データ)に対するデータパラレルを実現するためには、まず、図16に示すように、サンプルデータを分割して保持するために2つのデータメモリ30a、30bに分割することが考えられる。図16のデータメモリ30bでは図示していないが、データメモリ30aと同様に、データメモリ30bも、ポインタメモリ31と、フィーチャメモリ32と、ステートメモリ33とを含む。ただし、単にサンプルデータを保持するメモリを分割しても、分割されたサンプルデータを並列に処理(学習処理、識別処理等)を行う機構が必要である。図16に示す例では、識別処理を行うモジュールを、分割されたデータメモリと同数だけ配置された構成を示す。すなわち、学習識別装置1aは、2つのデータメモリ30a、30bのそれぞれに格納されたサンプルデータについて並列で識別処理を行うために、クラシフィケーションモジュール50a、50b(識別部)を有する。個別のモジュールに着目した場合、フィーチャパラレルで処理されるものとすると、上述のようなデータパラレルにするために、構成の変更はほとんどないので実装も容易である。
また、学習処理、すなわち、ラーニングモジュール20での処理を高速化するためのデータパラレルとしては、サンプルデータを分割して保持するために2つのデータメモリ30a、30bに分割すると共に、上述したように、学習処理の過程で算出される特徴量および勾配情報(上述の式(11)参照)についてのヒストグラム(以下、「勾配ヒストグラム」と称する場合がある)を保持するメモリが、データメモリの分割数に比例して増大するので、回路規模が増大するという問題がある。
(勾配ヒストグラムを用いた分岐スコアの算出方法)
ここで、まず、ラーニングモジュール20における分岐スコアの算出方法について説明する。ここで、サンプルデータ(ここでは学習データ)の特徴量は、あるビット幅に量子化されていることを前提とする。例えば、特徴量が8ビット(256パターンの値)で、特徴量の次元が100である場合、ラーニングモジュール20は、256×100=25600パターンの分岐スコアを算出することになる。この場合のしきい値の候補は、256個である。
ある分岐条件(1つの特徴量に対する1つのしきい値)に対応する分岐スコアを算出するには、現在のノードにある学習データから、しきい値以上の特徴量を有する学習データの勾配情報の和(上述の式(19)のG
R、H
Rに相当)と、当該しきい値未満の学習データの勾配情報の和(上述の式(19)のG
L、H
Lに相当)を求める必要がある。ここで、下記の(表1)に示すように、学習データが4つ、特徴量が1次元で値が3パターン、勾配情報が一次勾配gである場合において具体的に説明する。
(表1)に示すように、特徴量が0、1、2の3パターンあるので、しきい値についても0、1、2となり、各しきい値での勾配情報の和は、以下の(表2)に示す値となり、この3パターンの各しきい値に対応する分岐スコアが算出される。
特定のしきい値に対して、勾配情報の和を求めるためには、現在のノードのすべての学習データを参照する必要がある。これをすべてのしきい値について毎回行うものとすると、非常に処理時間がかかることになる。例えば、特徴量が8ビット(256パターン)の場合、しきい値についても256パターンあるので、(現在のノードにある学習データ数×256)回だけ勾配情報の和を求める必要がある。これでは非常に処理時間がかかるので、予め、特徴量の各値における勾配情報の和(勾配ヒストグラム)、および勾配情報の総和を求めておき、勾配ヒストグラムの累積和をとることによって分岐スコアの算出処理を簡略化するものとする。
サンプルデータが上述の(表1)で示したものである場合、特徴量の各値における勾配情報の和(勾配ヒストグラム)は、以下の(表3)に示す値となる。
また、特徴量の各値における勾配情報の総和は、0.1+0.2+0.1-0.3=0.1となる。ここで、勾配ヒストグラムの累積和を求めることによって、勾配情報の和G
Lが求まり、勾配情報の総和から勾配情報の和G
Lを引くと勾配情報のG
Rが求まり、各しきい値に対する勾配情報の和G
L、G
Rは、以下の(表4)に示す値となる。
この方法であれば、現在のノードの学習データはそれぞれ1回参照すればよく、その後は、しきい値の数だけ勾配ヒストグラムを参照すれば、すべての分岐条件に対して分岐スコアを求めることができる。特徴量が8ビット(256パターン)の場合、(現在のノードにある学習データ数+256)回の処理で済むことになる。なお、上述の場合は、特徴量が1次元の場合であるが、特徴量が2次元以上でも、特徴量の次元ごとに勾配ヒストグラムを求めれば、同様の処理を並列で算出することが可能である。以下、第1の実施形態でフィーチャパラレルで学習を行うラーニングモジュール20の構成として示した図4に基づいてさらに詳細な構成を示した図17に示すラーニングモジュール20により、勾配ヒストグラムを算出して分岐条件データを求めるための構成および動作を説明し、さらに、データパラレルの構成とした場合の構成および動作について説明する。
(勾配ヒストグラムを用いて分岐条件データを求めるラーニングモジュールの構成例)
図17は、ラーニングモジュールの詳細なモジュール構成の一例を示す図である。図17を参照しながら、上述の図4が示す構成をさらに詳細に示したラーニングモジュール20の構成および動作について説明する。
図17に示すラーニングモジュール20は、ゲイン算出モジュール21_1、21_2、・・・、21_nと、最適条件導出モジュール22と、を備えている。ここで、nは、少なくともサンプルデータ(ここでは、学習データ)の特徴量の種類以上の数である。なお、ゲイン算出モジュール21_1、21_2、・・・、21_nについて、任意のゲイン算出モジュールを示す場合、または総称する場合、単に「ゲイン算出モジュール21」と称するものとする。
ゲイン算出モジュール21_1~21_1nは、それぞれ、入力されるサンプルデータに含まれる特徴量のうち対応する特徴量について、各しきい値における分岐スコアを、上述の式(19)を用いて算出するモジュールである。ゲイン算出モジュール21_1は、勾配ヒストグラム算出モジュール61_1と、累積勾配算出モジュール62_1と、算出モジュール63_1と、を含む。
勾配ヒストグラム算出モジュール61_1は、入力したサンプルデータの特徴量の各値をヒストグラムのビンとして、当該サンプルデータに対応する勾配情報の値を積算することによって勾配ヒストグラムを算出するモジュールである。
累積勾配算出モジュール62_1は、特徴量に対する各しきい値について、勾配ヒストグラムの累積和を求めることにより、勾配情報の和(GL、GR、HL、HR)を算出するモジュールである。
算出モジュール63_1は、累積勾配算出モジュール62_1により算出された勾配情報の和を用いて、上述の式(19)を用いて、各しきい値における分岐スコアを算出するモジュールである。
また、ゲイン算出モジュール21_2も、同様に、勾配ヒストグラム算出モジュール61_2と、累積勾配算出モジュール62_2と、算出モジュール63_2と、を含み、以下、ゲイン算出モジュール21_nについても同様である。なお、勾配ヒストグラム算出モジュール61_1、61_2、・・・、61_nについて、任意の勾配ヒストグラム算出モジュールを示す場合、または総称する場合、単に「勾配ヒストグラム算出モジュール61」と称するものとする。また、累積勾配算出モジュール62_1、62_2、・・・、62_nについて、任意の累積勾配算出モジュールを示す場合、または総称する場合、単に「累積勾配算出モジュール62」と称するものとする。また、算出モジュール63_1、63_2、・・・、63_nについて、任意の算出モジュールを示す場合、または総称する場合、単に「算出モジュール63」と称するものとする。
最適条件導出モジュール22は、各ゲイン算出モジュール21により出力された各特徴量および各しきい値に対応する各分岐スコアを入力し、分岐スコアが最大となる特徴量の番号(特徴量番号)およびしきい値を導出するモジュールである。最適条件導出モジュール22は、導出した特徴量番号およびしきい値を、対応するノードの分岐条件データ(ノードのデータの一例)として、モデルメモリ40へ書き込む。
<勾配ヒストグラム算出モジュールの構成および動作>
図18は、ラーニングモジュールの勾配ヒストグラム算出モジュールのモジュール構成の一例を示す図である。図18を参照しながら、ラーニングモジュール20における勾配ヒストグラム算出モジュール61の構成および動作について説明する。なお、図18では、特徴量が1次元であるものとし、勾配情報として一次勾配gおよび二次勾配hがある場合について説明するが、単に、勾配情報g、勾配情報hと称する場合がある。
図18に示すように、勾配ヒストグラム算出モジュール61は、データカウンタ201と、加算器202と、ディレイ203と、勾配ヒストグラムメモリ204と、総和格納メモリ205と、加算器206と、ディレイ207と、勾配ヒストグラムメモリ208と、総和格納メモリ209と、を有する。
データカウンタ201は、データメモリ30から学習処理の対象となるサンプルデータ(特徴量)、および対応する勾配情報g、hを読み出すためのアドレスを出力する。
加算器202は、勾配ヒストグラムメモリ204から読み出した、加算された勾配情報gと、データメモリ30から新たに読み出した勾配情報gとを加算する。
ディレイ203は、加算器202により加算された勾配情報gを勾配ヒストグラムメモリ204に書き込むタイミングを合わせるために、データメモリ30から読み出された特徴量を遅延して出力する。
勾配ヒストグラムメモリ204は、特徴量の値をアドレスとして、加算された勾配情報gを格納していき、最終的に、特徴量の値(ビン)ごとの勾配ヒストグラムを格納するメモリである。
総和格納メモリ205は、データメモリ30から読み出した勾配情報gの総和を格納するメモリである。
加算器206は、勾配ヒストグラムメモリ208から読み出した、加算された勾配情報hと、データメモリ30から新たに読み出した勾配情報hとを加算する。
ディレイ207は、加算器206により加算された勾配情報hを勾配ヒストグラムメモリ208に書き込むタイミングを合わせるために、データメモリ30から読み出された特徴量を遅延して出力する。
勾配ヒストグラムメモリ208は、特徴量の値をアドレスとして、加算された勾配情報hを格納していき、最終的に、特徴量の値(ビン)ごとの勾配ヒストグラムを格納するメモリである。
総和格納メモリ209は、データメモリ30から読み出した勾配情報hの総和を格納するメモリである。
以下、勾配ヒストグラム算出モジュール61の勾配ヒストグラムの算出動作の流れを簡潔に説明する。まず、勾配ヒストグラム算出モジュール61は、データカウンタ201から出力されるアドレスを用いて、データメモリ30に記憶されている、現在のノードの1つの学習データ(特徴量、勾配情報)を読み出す。そして、加算器202は、データメモリ30から読み出した特徴量をアドレスとして、勾配ヒストグラムメモリ204から勾配情報g(加算された勾配情報g)を読み出す。そして、加算器202は、勾配ヒストグラムメモリ204から読み出した勾配情報g(加算された勾配情報g)と、データメモリ30から読み出した勾配情報gとを加算し、データメモリ30から読み出された特徴量をアドレスとして、勾配ヒストグラムメモリ204へ加算した勾配情報gを書き込む(更新する)。総和格納メモリ205は、データメモリ30から勾配情報gを読み出す度に加算して勾配情報gの総和を格納する。なお、加算器206、ディレイ207、勾配ヒストグラムメモリ208および総和格納メモリ209による勾配情報hに対する処理も、上述と同様である。以上の動作を、現在のノードのすべての学習データについて繰り返す。
<累積勾配算出モジュールの構成および動作>
図19は、ラーニングモジュールの累積勾配算出モジュールのモジュール構成の一例を示す図である。図19を参照しながら、ラーニングモジュール20における累積勾配算出モジュール62の構成および動作について説明する。なお、図19では、特徴量が1次元であるものとし、勾配情報として一次勾配gおよび二次勾配hがある場合について説明する。
図19に示すように、累積勾配算出モジュール62は、しきい値カウンタ210と、アキュムレータ211と、ディレイ212と、差分器213と、アキュムレータ214と、ディレイ215と、差分器216と、を有する。
しきい値カウンタ210は、勾配ヒストグラムメモリ204、208から特徴量の値ごとに加算された勾配情報(g、h)、すなわち、特徴量の各値の勾配ヒストグラムを読み出すためのアドレスとなるしきい値を出力する。
アキュムレータ211は、しきい値カウンタ210から出力されたしきい値(アドレス)に対応した勾配情報gについての勾配ヒストグラムを勾配ヒストグラムメモリ204から読み出して、現在格納している勾配ヒストグラムの累積和に対して、さらに累積して、新たな勾配ヒストグラムの累積和として保持する。
ディレイ212は、アキュムレータ211から読み出した勾配情報gについての勾配ヒストグラムの累積和を、差分器213から勾配情報gの和GRが出力されるタイミングと合せるために遅延させて、勾配情報gの和GLとして出力する。
差分器213は、総和格納メモリ205から読み出した勾配情報gの総和から、アキュムレータ211から読み出した勾配情報gについての勾配ヒストグラムの累積和(すなわち、勾配情報gの和GL)を引いて、勾配情報gの和GRを算出する。
アキュムレータ214は、しきい値カウンタ210から出力されたしきい値(アドレス)に対応した勾配情報hについての勾配ヒストグラムを勾配ヒストグラムメモリ208から読み出して、現在格納している勾配ヒストグラムの累積和に対して、さらに累積して、新たな勾配ヒストグラムの累積和として保持する。
ディレイ215は、アキュムレータ214から読み出した勾配情報hについての勾配ヒストグラムの累積和を、差分器216から勾配情報hの和HRが出力されるタイミングと合せるために遅延させて、勾配情報hの和HLとして出力する。
差分器216は、総和格納メモリ209から読み出した勾配情報hの総和から、アキュムレータ214から読み出した勾配情報hについての勾配ヒストグラムの累積和(すなわち、勾配情報hの和HL)を引いて、勾配情報hの和HRを算出する。
以下、累積勾配算出モジュール62の勾配情報の和(GL、GR、HL、HR)の算出動作の流れを簡潔に説明するなお、累積勾配算出モジュール62による算出処理は、勾配ヒストグラム算出モジュール61における勾配情報の勾配ヒストグラムの算出・格納処理の動作終了後に開始される。すなわち、勾配ヒストグラム算出モジュール61による算出処理の終了後は、勾配ヒストグラムメモリ204、208には、それぞれ、現在のノードのすべての学習データから算出された勾配情報g、hについての勾配ヒストグラムが保持してある。
まず、累積勾配算出モジュール62は、しきい値カウンタ210から出力されるアドレスとしてのしきい値を用いて、勾配ヒストグラムメモリ204に記憶されている勾配情報gの勾配ヒストグラムを読み出す。そして、アキュムレータ211は、しきい値カウンタ210から出力されたしきい値に対応した勾配情報gについての勾配ヒストグラムを勾配ヒストグラムメモリ204から読み出して、現在格納している勾配ヒストグラムの累積和に対して、さらに累積して、新たな勾配ヒストグラムの累積和として保持する。そして、差分器213は、総和格納メモリ205から読み出した勾配情報gの総和から、アキュムレータ211から読み出した勾配情報gについての勾配ヒストグラムの累積和(すなわち、勾配情報gの和GL)を引いて、勾配情報gの和GRを算出して、算出モジュール63へ出力する。また、ディレイ212は、アキュムレータ211から読み出した勾配情報gについての勾配ヒストグラムの累積和(すなわち、勾配情報gの和GL)を、差分器213の出力に合せて、算出モジュール63へ出力する。なお、アキュムレータ214、ディレイ215および差分器216におる勾配情報hに対する処理(勾配情報hの和HL、HRの算出処理)も、上述と同様である。以上の動作を、すべてのしきい値について繰り返すが、この場合、しきい値カウンタ210がしきい値を順にカウントアップさせながら一巡して出力することによって実現される。
<データパラレルにした場合の勾配ヒストグラム算出モジュール>
図20は、データパラレルにした場合の勾配ヒストグラム算出モジュールのモジュール構成の一例を示す図である。図20を参照しながら、データパラレルにした場合の勾配ヒストグラム算出モジュール61の構成および動作について説明する。なお、図20では、データパラレルの分割数を2とし、特徴量が1次元であるものとし、勾配情報として一次勾配gのみを考えた場合について説明する。
図20に示すように、分割数が2の場合のデータパラレルとするために、図18に示すデータメモリ30の代わりに、分割したメモリであるデータメモリ30a、30bが構成され、勾配ヒストグラム算出モジュール61の代わりに、勾配ヒストグラム算出モジュール61a、61bが構成される。
図20に示すように、勾配ヒストグラム算出モジュール61aは、データカウンタ201aと、加算器202aと、ディレイ203aと、勾配ヒストグラムメモリ204aと、総和格納メモリ205aと、を有する。また、勾配ヒストグラム算出モジュール61bは、データカウンタ201bと、加算器202bと、ディレイ203bと、勾配ヒストグラムメモリ204bと、総和格納メモリ205bと、を有する。データカウンタ201a、201b、加算器202a、202b、ディレイ203a、203b、勾配ヒストグラムメモリ204a、204b、および、総和格納メモリ205a、205bの機能は、図18で説明した各機能と同様である。
データパラレルを簡易に構成する場合、図20に示すように、データメモリ30と共に、勾配ヒストグラム算出モジュール61も分割数と同数だけ配置する構成が考えられる。この場合、勾配ヒストグラムメモリの数は、特徴量次元×分割数となる。図20に示す例では、特徴量は一次元、分割数は2としているので、勾配ヒストグラムメモリ204a、204bの2つとなる。さらに、勾配情報として一次勾配gおよび二次勾配h用のそれぞれの勾配ヒストグラムメモリを考えた場合、必要となる勾配ヒストグラムメモリの全容量は、1つのメモリの容量(ビン数×ビット幅)×2(一次勾配g、二次勾配h)×特徴量次元×分割数となる。大規模なデータセットでは、特徴量が数百~数千次元ある場合も珍しくなく、そのうえ、分割数を増やすと大量のメモリの数が必要となり、メモリの容量がボトルネックとなり、回路の規模が増大してしまう。例えば、特徴量が8ビット(256パターン)で2000次元であり、勾配情報が一次勾配gおよび二次勾配hの2つとし、勾配ヒストグラムのビット幅が12ビットの場合、12[ビット]×256=3072[ビット]なので、1つの勾配ヒストグラムメモリのメモリ容量は3072ビットを満たせるものが必要になる。メモリは、通常、2のべき乗で用意されるので、この場合、メモリ容量は4096ビット(4kビット)となる。したがって、1分割(分割なし)の場合の勾配ヒストグラムメモリの全容量は、以下のようになる。
4[kビット]×2(一次勾配g、二次勾配h)×2000[次元]=16[Mビット]
すなわち、1分割(分割なし)あたり16Mビットのメモリ容量が必要になり、分割した場合は、(分割数×16Mビット)のメモリ容量が必要となる。
例えば、ハイエンドなFPGAであるxilinx社のvirtex UltrScale+のVU9Pというチップの場合について考える。勾配ヒストグラムメモリに用いることができるのは分散RAMおよびブロックRAMという回路である。VU9Pでは、分散RAMが最大で36.1Mビット、ブロックRAMが最大で75.9Mビットである。そのため、勾配ヒストグラムメモリに分散RAMを用いた場合は2分割が限界であり、ブロックRAMを用いた場合は4分割が限界となる。また、分散RAMおよびブロックRAMは、勾配ヒストグラムの保持以外にも使う必要があるため、分割数の上限は上述の数よりも低くなる。以上のことより、特徴量および勾配情報のセットが並列に入力される場合において、図17~図20で説明したラーニングモジュール20の構成と比較して、より小規模な回路で勾配ヒストグラムを算出および格納することが可能な構成が必要である。以下、本実施形態に係るラーニングモジュールの構成および動作を、図21~図26で説明する。
(第2の実施形態に係るラーニングモジュールの構成)
図21は、第2の実施形態に係る学習識別装置のラーニングモジュールのモジュール構成の一例を示す図である。図21を参照しながら、本実施形態に係る学習識別装置(学習装置の一例)のラーニングモジュール20aの構成および動作について説明する。なお、図21では、データパラレルの分割数を2とし、特徴量が1次元であるものとして説明する。
図21に示すように、本実施形態に係るラーニングモジュール20a(学習部)は、勾配ヒストグラム算出モジュール71と、累積勾配算出モジュール72と、算出モジュール73と、最適条件導出モジュール22と、を備えている。
勾配ヒストグラム算出モジュール71は、入力したサンプルデータの特徴量の各値をヒストグラムのビンとして、当該サンプルデータに対応する勾配情報の値を積算することによって勾配ヒストグラムを算出するモジュールである。勾配ヒストグラム算出モジュール71は、勾配出力モジュール301a、301bと、加算モジュール302と、アキュムレータモジュール303と、総和格納メモリ304と、を有する。
勾配出力モジュール301a、301bは、特徴量の各値に対応した出力ポートを有し、データメモリ30a、30bから、特徴量および勾配情報を入力し、入力した特徴量の値に対応した出力ポートから当該勾配情報を出力するモジュールである。
加算モジュール302は、特徴量の値(ビン)ごとに対応する勾配情報を加算して出力するモジュールである。
アキュムレータモジュール303は、特徴量の値(ビン)ごとに、加算モジュール302から入力した加算された勾配情報を、現在保持している加算された勾配情報に加算し、最終的に、ビンごとに勾配情報の勾配ヒストグラムを保持するモジュールである。
総和格納メモリ304は、加算モジュール302により算出された勾配情報の総和を格納するメモリである。
累積勾配算出モジュール72は、特徴量に対する各しきい値について、勾配ヒストグラムの累積和を求めることにより、勾配情報の和(GL、GR、HL、HR)を算出するモジュールである。
算出モジュール73は、累積勾配算出モジュール72により算出された勾配情報の和を用いて、上述の式(19)を用いて、各しきい値における分岐スコアを算出するモジュールである。
最適条件導出モジュール22は、算出モジュール73により出力された各特徴量(図21では1つの特徴量)および各しきい値に対応する各分岐スコアを入力し、分岐スコアが最大となる特徴量の番号(特徴量番号)およびしきい値を導出するモジュールである。最適条件導出モジュール22は、導出した特徴量番号およびしきい値を、対応するノードの分岐条件データ(ノードのデータの一例)として、モデルメモリ40へ書き込む。
また、図21に示すように、分割数が2の場合のデータパラレルとするために、メモリがデータメモリ30a、30bの2つのメモリに分割され、勾配ヒストグラム算出モジュール71のうち、前段において勾配出力モジュール301a、301bの2つのモジュールに分割されている。図21では、分割された物理的な単位を、「分割1」および「分割2」と表記している。
<勾配ヒストグラム算出モジュールの構成および動作>
図22は、第2の実施形態のラーニングモジュールの勾配ヒストグラム算出モジュールのモジュール構成の一例を示す図である。図22を参照しながら、本実施形態に係るラーニングモジュール20aにおける勾配ヒストグラム算出モジュール71の構成および動作について説明する。なお、図21では、データパラレルの分割数を2とし、特徴量が1次元であるものとし、勾配情報として1つ(例えば、一次勾配g)のみを考えた場合について説明する。
図21に示すように、勾配ヒストグラム算出モジュール71は、図20で説明した構成に加え、データカウンタ311a、311bを有する。
データカウンタ311aは、データメモリ30aから学習処理の対象となるサンプルデータ(特徴量)、および対応する勾配情報を読み出すためのアドレスを出力する。
勾配出力モジュール301aは、図22に示すように、比較器312_1、312_2、・・・、312_Nと、マルチプレクサ313_1、313_2、・・・、313_Nと、を有する。ここで、Nは、特徴量が取り得る値の数であって、勾配ヒストグラムにおけるビンの数である。なお、比較器312_1、312_2、・・・、312_Nについて、任意の比較器を示す場合、または総称する場合、単に「比較器312」と称するものとする。また、マルチプレクサ313_1、313_2、・・・、313_Nについて、任意のマルチプレクサを示す場合、または総称する場合、単に「マルチプレクサ313」と称するものとする。
比較器312は、データメモリ30aから読み出した特徴量と、特定のビンの特徴量の値とを入力し、双方を比較して一致した場合、一致した旨(例えば、電圧レベルのオン出力)を、マルチプレクサ313へ出力する。例えば、比較器312_1は、データメモリ30aから読み出した特徴量が、ビン1の特徴量の値と一致した場合、一致した旨をマルチプレクサ313_1へ出力する。
マルチプレクサ313は、比較器312がデータメモリ30aから読み出した特徴量(学習データ)に対応する勾配情報と、0とを入力し、比較器312から出力された比較結果に応じて、入力した勾配情報または0を出力する。例えば、マルチプレクサ313_1は、比較器312_1がデータメモリ30aから読み出した特徴量に対応する勾配情報と、0とを入力し、比較器312_1から出力された比較結果が一致を示す場合、入力した勾配情報をビン1に対応する勾配情報として出力し、比較結果が不一致を示す場合、0を出力する。すなわち、データメモリ30aから読み出された特徴量の値に対応するマルチプレクサ313から、当該特徴量に対応する勾配情報が出力され、それ以外のマルチプレクサ313から0が出力される仕組みである。
なお、データメモリ30b、データカウンタ311b、および勾配出力モジュール301bの機能は、それぞれ上述のデータメモリ30a、データカウンタ311a、および勾配出力モジュール301aと同様である。
加算モジュール302は、特徴量の値、すなわちビンごとにマルチプレクサ313から入力した勾配情報を加算して、アキュムレータモジュール303へ出力する。加算モジュール302は、加算器321_1、321_2、・・・、321_Nと、加算器322と、を有する。
加算器321_1、321_2、・・・、321_Nは、それぞれビン1、2、・・・、Nごとにマルチプレクサ313から入力した勾配情報を加算して、加算した勾配情報をアキュムレータモジュール303へ出力する。例えば、加算器321_1は、勾配出力モジュール301aにおけるビン1に対応するマルチプレクサ313_1からの出力である勾配情報と、勾配出力モジュール301bにおけるビン1に対応するマルチプレクサ313_1からの出力である勾配情報と、を加算して、アキュムレータモジュール303(この場合、後述するビン1アキュムレータ331_1)へ出力する。
加算器322は、勾配出力モジュール301aおよび勾配出力モジュール301bが、それぞれデータメモリ30a、30bから読み出した勾配情報をぞれぞれ入力して加算し、加算した勾配情報を総和格納メモリ304へ出力する。
アキュムレータモジュール303は、特徴量の値(ビン)ごとに、加算モジュール302から入力した加算された勾配情報を、現在保持している加算された勾配情報に加算し、最終的に、ビンごとに勾配情報の勾配ヒストグラムを保持する。アキュムレータモジュール303は、ビン1アキュムレータ331_1と、ビン2アキュムレータ331_2と、・・・、ビンNアキュムレータ331_Nと、を有する。
ビン1アキュムレータ331_1、ビン2アキュムレータ331_2、・・・、ビンNアキュムレータ331_Nは、それぞれビン1、2、・・・、Nごとに、加算器321_1、321_2、・・・、321_Nからそれぞれ入力した加算された勾配情報を、現在保持している加算された勾配情報に加算する。例えば、ビン1アキュムレータ331_1は、加算器321_1から入力した加算された勾配情報を、現在保持している加算された勾配情報に加算し、ビン1の勾配情報の勾配ヒストグラムを保持する。
総和格納メモリ304は、加算器322から出力された加算された勾配情報を、現在保持している加算された勾配情報に加算する。すなわち、総和格納メモリ304は、すべての学習データに対応する勾配情報の総和が格納される。
以下、本実施形態に係る勾配ヒストグラム算出モジュール71の勾配ヒストグラムの算出動作の流れを簡潔に説明する。データカウンタ311a(311b)は、データメモリ30aから学習処理の対象となるサンプルデータ(特徴量)、および対応する勾配情報を読み出すためのアドレスを出力する。勾配出力モジュール301a(301b)の比較器312は、データメモリ30a(30b)から読み出した特徴量と、特定のビンの特徴量の値とを入力し、双方を比較して一致した場合、一致した旨を、マルチプレクサ313へ出力する。マルチプレクサ313は、比較器312がデータメモリ30a(30b)から読み出した特徴量(学習データ)に対応する勾配情報と、0とを入力し、比較器312から出力された比較結果に応じて、入力した勾配情報または0を出力する。加算モジュール302の加算器321_1、321_2、・・・、321_Nは、それぞれビン1、2、・・・、Nごとにマルチプレクサ313から入力した勾配情報を加算して、加算した勾配情報をアキュムレータモジュール303へ出力する。アキュムレータモジュール303のビン1アキュムレータ331_1、ビン2アキュムレータ331_2、・・・、ビンNアキュムレータ331_Nは、それぞれビン1、2、・・・、Nごとに、加算器321_1、321_2、・・・、321_Nからそれぞれ入力した加算された勾配情報を、現在保持している加算された勾配情報に加算して、最終的に、ビンごとに勾配情報の勾配ヒストグラムを保持する。以上の動作を、現在のノードのすべての学習データについて繰り返す。
以上のような、本実施形態に係る勾配ヒストグラム算出モジュール71の構成では、従来の図20で示した構成のように勾配ヒストグラムをメモリに格納するのではなく、特徴量のビンごとに対応したレジスタ(アキュムレータ)に格納するものとしている。図22に示す勾配ヒストグラム算出モジュール71の構成では、特徴量のビン数×特徴量次元(図22では次元を1としている)の数のレジスタがあれば実現することが可能である。すなわち、勾配ヒストグラムを格納するために必要となる全容量は、ビン数×ビット幅×2(一次勾配g、二次勾配h)×特徴量次元となり、分割数に依存しない。したがって、従来の図20で示した構成の場合と比較して、勾配ヒストグラムを格納するための回路容量を大幅に削減することができる。また、本実施形態に係る勾配ヒストグラム算出モジュール71の構成では、回路規模は分割数に依存しないので、他のモジュールの回路規模が許せる限り、データパラレルの分割数を増加させることができ、学習処理の速度を向上させることが可能となる。
例えば、特徴量が8ビット(256パターン)で2000次元であり、勾配情報が一次勾配gおよび二次勾配hの2つとした場合、必要となるレジスタの数は、以下のようになる。
256(ビン数)×2(一次勾配g、二次勾配h)×2000[次元]=1024000[個]
ここで、上述のVU9Pというチップの場合、最大レジスタ数は2364000[個]なので、本実施形態に係る勾配ヒストグラム算出モジュール71の構成で、勾配ヒストグラムの保持に必要なレジスタ数は、当該最大レジスタ数の半分程度に収めることができる。
図23は、第2の実施形態のラーニングモジュールにおいて分割数を3とした場合の勾配ヒストグラム算出モジュールのモジュール構成の一例を示す図である。図23を参照しながら、データパラレルの分割数を3とした場合の勾配ヒストグラム算出モジュール71の構成の一例について説明する。なお、図23では、特徴量が1次元であるものとし、勾配情報として1つ(例えば、一次勾配g)のみを考えた場合について説明する。
例えば、図23では、加算モジュール302は、加算器321_1_1、・・・、321_N_1と、加算器321_1_2、・・・、321_N_2と、加算器322_1、322_2と、を有する。図23に示す勾配ヒストグラム算出モジュール71のように、加算モジュール302は、段階的に勾配情報を統合(加算)するものとすればよい。例えば、ビン1について、加算器321_1_1は、「分割1」から出力された勾配情報と、「分割2」から出力された勾配情報とを加算して、加算器321_1_2へ出力する。そして、加算器321_1_2は、加算器321_1_1から出力された加算値と、「分割3」から出力された勾配情報と、を加算して、アキュムレータモジュール303のビン1アキュムレータ331_1へ出力する。
<累積勾配算出モジュールの構成および動作>
図24は、第2の実施形態のラーニングモジュールの累積勾配算出モジュールのモジュール構成の一例を示す図である。図24を参照しながら、本実施形態に係るラーニングモジュール20aにおける累積勾配算出モジュール72の構成および動作について説明する。なお、図24では、データパラレルの分割数を1とし、特徴量が1次元であるものとし、勾配情報として2つ(例えば、一次勾配g、二次勾配h)を考えた場合について説明する。
図19に示す従来の累積勾配算出モジュール62では、しきい値カウンタ210の出力(しきい値)をアドレスとして、勾配ヒストグラムメモリ204(208)にアクセスしていた。図24では、勾配ヒストグラムは、ビンごとにレジスタ(アキュムレータ)に保持されているので、マルチプレクサを介してすべてのビンからしきい値カウンタのしきい値に対応した値のみを取り出している。
図24に示すように、累積勾配算出モジュール72は、しきい値カウンタ340と、アキュムレータ341と、ディレイ342と、差分器343と、アキュムレータ344と、ディレイ345と、差分器346と、マルチプレクサ347、348と、を有する。また、図24では、一次勾配gに対応するアキュムレータモジュール303および総和格納メモリ304を、それぞれアキュムレータモジュール303gおよび総和格納メモリ304gとしている。また、二次勾配hに対応するアキュムレータモジュール303および総和格納メモリ304を、それぞれアキュムレータモジュール303hおよび総和格納メモリ304hとしている。
しきい値カウンタ340は、アキュムレータモジュール303g、303hから、特徴量の値(ビン)ごとに加算された勾配情報(g、h)、すなわち、特徴量の各ビンの勾配ヒストグラムを読み出すためのしきい値を出力する。
マルチプレクサ347は、しきい値カウンタ340からのしきい値と、アキュムレータモジュール303gの各アキュムレータ(ビン1アキュムレータ331_1、ビン2アキュムレータ331_2、・・・、ビンNアキュムレータ331_N)の格納値(勾配ヒストグラム)を入力する。そして、マルチプレクサ347は、入力した各ビンの勾配ヒストグラムのうち、しきい値カウンタ340からのしきい値に対応するビンに対応する勾配ヒストグラムを、アキュムレータ341へ出力する。
マルチプレクサ348は、しきい値カウンタ340からのしきい値と、アキュムレータモジュール303hの各アキュムレータ(ビン1アキュムレータ331_1、ビン2アキュムレータ331_2、・・・、ビンNアキュムレータ331_N)の格納値(勾配ヒストグラム)を入力する。そして、マルチプレクサ348は、入力した各ビンの勾配ヒストグラムのうち、しきい値カウンタ340からのしきい値に対応するビンに対応する勾配ヒストグラムを、アキュムレータ344へ出力する。
アキュムレータ341は、しきい値カウンタ340から出力されたしきい値に対応する勾配情報gについての勾配ヒストグラムをマルチプレクサ347から入力して、現在格納している勾配ヒストグラムの累積和に対して、さらに累積して、新たな勾配ヒストグラムの累積和として保持する。
ディレイ342は、アキュムレータ341から読み出した勾配情報gについての勾配ヒストグラムの累積和を、差分器343から勾配情報gの和GRが出力されるタイミングと合せるために遅延させて、勾配情報gの和GLとして出力する。
差分器343は、総和格納メモリ304gから読み出した勾配情報gの総和から、アキュムレータ341から読み出した勾配情報gについての勾配ヒストグラムの累積和(すなわち、勾配情報gの和GL)を引いて、勾配情報gの和GRを算出する。
アキュムレータ344は、しきい値カウンタ340から出力されたしきい値に対応する勾配情報hについての勾配ヒストグラムをマルチプレクサ348から入力して、現在格納している勾配ヒストグラムの累積和に対して、さらに累積して、新たな勾配ヒストグラムの累積和として保持する。
ディレイ345は、アキュムレータ344から読み出した勾配情報hについての勾配ヒストグラムの累積和を、差分器346から勾配情報hの和HRが出力されるタイミングと合せるために遅延させて、勾配情報hの和HLとして出力する。
差分器346は、総和格納メモリ304hから読み出した勾配情報hの総和から、アキュムレータ344から読み出した勾配情報hについての勾配ヒストグラムの累積和(すなわち、勾配情報hの和HL)を引いて、勾配情報hの和HRを算出する。
以下、累積勾配算出モジュール72の勾配情報の和(GL、GR、HL、HR)の算出動作の流れを簡潔に説明するなお、累積勾配算出モジュール72による算出処理は、勾配ヒストグラム算出モジュール71における勾配情報の勾配ヒストグラムの算出・格納処理の動作終了後に開始される。すなわち、勾配ヒストグラム算出モジュール71による算出処理の終了後は、アキュムレータモジュール303g、303hには、それぞれ、現在のノードのすべての学習データから算出された勾配情報g、hについての勾配ヒストグラムが保持してある。
まず、マルチプレクサ347は、しきい値カウンタ340からのしきい値と、アキュムレータモジュール303gの各アキュムレータ(ビン1アキュムレータ331_1、ビン2アキュムレータ331_2、・・・、ビンNアキュムレータ331_N)の格納値(勾配ヒストグラム)を入力する。そして、マルチプレクサ347は、入力した各ビンの勾配ヒストグラムのうち、しきい値カウンタ340からのしきい値に対応するビンに対応する勾配ヒストグラムを、アキュムレータ341へ出力する。そして、アキュムレータ341は、しきい値カウンタ340から出力されたしきい値に対応する勾配情報gについての勾配ヒストグラムをマルチプレクサ347から入力して、現在格納している勾配ヒストグラムの累積和に対して、さらに累積して、新たな勾配ヒストグラムの累積和として保持する。また、ディレイ342は、アキュムレータ341から読み出した勾配情報gについての勾配ヒストグラムの累積和を、差分器343から勾配情報gの和GRが出力されるタイミングと合せるために遅延させて、勾配情報gの和GLとして、算出モジュール73へ出力する。そして。差分器343は、総和格納メモリ304gから読み出した勾配情報gの総和から、アキュムレータ341から読み出した勾配情報gについての勾配ヒストグラムの累積和(すなわち、勾配情報gの和GL)を引いて、勾配情報gの和GRを算出して、算出モジュール73へ出力する。なお、マルチプレクサ348、アキュムレータ344、ディレイ345および差分器346におる勾配情報hに対する処理(勾配情報hの和HL、HRの算出処理)も、上述と同様である。以上の動作を、すべてのしきい値について繰り返すが、この場合、しきい値カウンタ340がしきい値を順にカウントアップさせながら一巡して出力することによって実現される。
このように、予め、勾配ヒストグラム算出モジュール71による勾配情報の勾配ヒストグラムの算出・格納処理の動作を行ったうえで、累積勾配算出モジュール72および算出モジュール73の処理を行うものとしている。これによって、ラーニングモジュール20aによる分岐スコア(ゲイン)の算出処理を高速化することができる。
<次元数が2の場合のラーニングモジュールの構成>
図25は、第2の実施形態に係る学習識別装置において特徴量の種類を2とした場合のラーニングモジュールのモジュール構成の一例を示す図である。図26は、第2の実施形態のラーニングモジュールにおいて特徴量の種類を2とした場合の勾配ヒストグラム算出モジュールのモジュール構成の一例を示す図である。図25および図26を参照しながら、本実施形態に係る学習識別装置(学習装置の一例)のラーニングモジュール20bの構成および動作について説明する。なお、図25では、データパラレルの分割数を2とし、特徴量が2次元であるものとして説明する。
図25に示すように、ラーニングモジュール20b(学習部)は、勾配ヒストグラム算出モジュール71と、累積勾配算出モジュール72_1、72_2と、算出モジュール73_1、73_2と、最適条件導出モジュール22と、を備えている。勾配ヒストグラム算出モジュール71は、勾配出力モジュール301a_1、301a_2、301b_1、301b_2と、加算モジュール302_1、302_2と、アキュムレータモジュール303_1、303_2と、総和格納メモリ304_1、304_2と、を有する。図26に示すように、勾配ヒストグラム算出モジュール71は、図25に示した構成に加え、データカウンタ311a、311bを有する。
また、図26に示すように、勾配出力モジュール301a_1、301a_2、301b_1、301b_2は、それぞれ、比較器312_1、312_2、・・・、312_Nと、マルチプレクサ313_1、313_2、・・・、313_Nと、を有する。加算モジュール302_1、302_2は、それぞれ、加算器321_1、321_2、・・・、321_Nと、加算器322と、を有する。アキュムレータモジュール303_1、303_2は、それぞれ、ビン1アキュムレータ331_1と、ビン2アキュムレータ331_2と、・・・、ビンNアキュムレータ331_Nと、を有する。
図25および図26に示す構成のうち、勾配出力モジュール301a_1、301b_1、加算モジュール302_1、アキュムレータモジュール303_1、総和格納メモリ304_1、累積勾配算出モジュール72_1、および算出モジュール73_1は、「特徴量1」に対応する処理のために用いられる。一方、勾配出力モジュール301a_2、301b_2、加算モジュール302_2、アキュムレータモジュール303_2、総和格納メモリ304_2、累積勾配算出モジュール72_2、および算出モジュール73_2は、「特徴量2」に対応する処理のために用いられる。各モジュールの動作は、図22および図24で説明した動作と同様である。
上述したように、勾配ヒストグラムを格納するために必要となる容量は、ビン数×ビット幅×2(一次勾配g、二次勾配h)×特徴量次元であるので、特徴量の次元数だけ、アキュムレータモジュール303(図25では、アキュムレータモジュール303_1、303_2)が必要となる。しかし、当該容量は、分割数に依存しないので、図25および図26に示す例では、分割数が2の場合であるが、分割数が3以上となっても、特徴量の次元が2である限り、アキュムレータモジュール303は2つであればよい。
以上のように、本実施形態に係る学習識別装置のラーニングモジュール20a(20b)では、勾配ヒストグラム算出モジュール71は、従来の図20で示した構成のように勾配ヒストグラムをメモリに格納するのではなく、特徴量のビンごとに対応したレジスタ(アキュムレータ)に格納するものとしている。この勾配ヒストグラム算出モジュール71の構成では、特徴量のビン数×特徴量次元の数のレジスタがあれば実現することが可能である。すなわち、勾配ヒストグラムを格納するために必要となる全容量は、ビン数×ビット幅×2(一次勾配g、二次勾配h)×特徴量次元となり、分割数に依存しない。したがって、従来の図20で示した構成の場合と比較して、並列に入力される特徴量および勾配情報について作成された勾配ヒストグラムの情報を保持するメモリ(アキュムレータ、レジスタ)の回路規模を大幅に削減することができる。また、本実施形態に係る勾配ヒストグラム算出モジュール71の構成では、回路規模は分割数に依存しないので、他のモジュールの回路規模が許せる限り、データパラレルの分割数を増加させることができ、学習処理の速度を向上させることが可能となる。
[第3の実施形態]
第3の実施形態に係る学習識別装置について、第1の実施形態に係る学習識別装置1と相違する点を中心に説明する。第1の実施形態では、決定木の学習処理において、分岐条件を決定する学習と、分岐条件に従ってサンプルデータ(学習データ)を分岐させる識別とをシーケンシャルに実行する動作について説明した。本実施形態では、分岐条件を決定する学習と、分岐条件に従って分岐させる識別とを並列に行う動作について説明する。
(学習識別装置の構成)
図27は、第3の実施形態に係る学習識別装置のモジュール構成の一例を示す図である。図27を参照しながら、本実施形態に係る学習識別装置1cのモジュール構成について説明する。
図27に示すように、本実施形態に係る学習識別装置1c(学習装置の一例)は、CPU10と、ラーニングモジュール20c(学習部)と、データメモリ30cと、モデルメモリ40cと、クラシフィケーションモジュール50c(識別部)と、を備えている。このうち、ラーニングモジュール20c、データメモリ30c、モデルメモリ40cおよびクラシフィケーションモジュール50cは、FPGAにより構成されている。CPU10と、当該FPGAとはバスを介してデータ通信可能となっている。なお、学習識別装置1cは、図27に示す各構成要素だけではなく、他の構成要素、例えば、CPU10のワークエリアとなるRAM、CPU10が実行するプログラム等を記憶したROM、各種データ(プログラム等)を記憶した補助記憶装置、および外部装置と通信を行う通信I/F等を備えているものとしてもよい。
CPU10は、全体でGBDTの学習を制御する演算装置である。CPU10は、制御部11cを有する。制御部11cは、ラーニングモジュール20c、データメモリ30c、モデルメモリ40cおよびクラシフィケーションモジュール50cの各モジュールを制御する。制御部11cは、CPU10で実行されるプログラムによって実現される。また、制御部11cは、決定木の学習処理時に、クラシフィケーションモジュール50cに対して、特定のデプスの特定のノードについてラーニングモジュール20cにより決定された分岐条件データに従ってサンプルデータの分岐処理(識別)を行わせることと並列に、ラーニングモジュール20cに対して、同じデプスの当該特定ノードの次のノードについての学習を行わせる。
ラーニングモジュール20cは、決定木を構成するノード毎の最適な特徴量の番号、およびしきい値を算出し、当該ノードがリーフの場合は、リーフウェイトを算出し、モデルメモリ40cに書き込むハードウェアモジュールである。また、ラーニングモジュール20cは、特定のデプスの特定のノードに対する分岐条件データの導出(学習)後、クラシフィケーションモジュール50cによる当該特定のノードに対する識別が行われることと並列に、当該特定のノードの次のノードについての学習を行う。なお、ラーニングモジュール20cのモジュール構成は、例えば、上述の第1の実施形態のラーニングモジュール20のモジュール構成と同様である。
データメモリ30cは、各種データを格納するSRAMである。データメモリ30cは、ポインタメモリ31cと、フィーチャメモリ32cと、ステートメモリ33と、を備えている。なお、ステートメモリ33の機能は、上述の第1の実施形態で説明した機能と同様である。
ポインタメモリ31cは、フィーチャメモリ32cで格納されているサンプルデータの格納先アドレスを記憶するメモリである。ポインタメモリ31cは、上述の第1の実施形態のポインタメモリ31と同様に、バンクA(バンク領域)と、バンクB(バンク領域)とを有する。また、ポインタメモリ31cは、データアクセス用のポートを2つ備えている。すなわち、ポインタメモリ31cは、学習時におけるラーニングモジュール20cによる一方のポートを介してのアクセス処理中に、識別時におけるクラシフィケーションモジュール50cによる他方のポートを介してのアクセス処理が可能となっている。なお、ポインタメモリ31cは、3つ以上のバンクを有することを制限するものではない。また、ポインタメモリ31cは、データアクセス用のポートを3以上備えているものとしてもよい。
フィーチャメモリ32cは、サンプルデータ(学習データ、識別データを含む)を格納するメモリである。また、フィーチャメモリ32cは、データアクセス用のポートを2つ備えている。すなわち、フィーチャメモリ32cは、学習時におけるラーニングモジュール20cによる一方のポート(第2ポート)を介してのサンプルデータの読み出し処理中に、識別時におけるクラシフィケーションモジュール50cによる他方のポート(第1ポート)を介してのサンプルデータの読み出し処理が可能となっている。なお、フィーチャメモリ32cは、データアクセス用のポートを3以上備えているものとしてもよい。
以上のように、データメモリ30cは、全体として2つのポートを有すると捉えることができ、ラーニングモジュール20cによって一方のポート(第2ポート)を介してアクセスされたデータに基づく学習中に、クラシフィケーションモジュール50cによって他方のポート(第1ポート)を介してアクセスされたデータに基づく識別が可能となるように捉えることができる。
モデルメモリ40cは、決定木のノード毎の分岐条件データ(特徴量番号、しきい値)、そのノードがリーフであるか否かを示すリーフフラグ(フラグ情報)、および、そのノードがリーフである場合におけるリーフウェイトを記憶するSRAMである。また、モデルメモリ40cは、データアクセス用のポートを2つ備えている。すなわち、モデルメモリ40cは、学習時におけるラーニングモジュール20cによる一方のポートを介しての分岐条件データ等の書き込み処理中に、識別時におけるクラシフィケーションモジュール50cによる他方のポートを介しての分岐条件データの読み出し処理が可能となっている。なお、モデルメモリ40cは、データアクセス用のポートを3以上備えているものとしてもよい。
クラシフィケーションモジュール50cは、ノードごと、決定木ごとにサンプルデータを振り分けるハードウェアモジュールである。また、クラシフィケーションモジュール50cは、ステート情報(w,g,h)を計算して、ステートメモリ33に書き込む。また、クラシフィケーションモジュール50cは、ラーニングモジュール20cが特定のデプスの特定のノードの次のノードについて先行で学習を行っていることと並列に、当該特定のノードでの分岐条件データに基づく分岐処理(識別)を行う。なお、クラシフィケーションモジュール50cのモジュール構成は、例えば、上述の第1の実施形態のクラシフィケーションモジュール50のモジュール構成と同様である。
(決定木の学習処理)
図28は、第3の実施形態に係る学習識別装置における学習および識別の並列処理時での2つのバンクの状態の一例を示す図である。図28を参照しながら、本実施形態の学習識別装置1cの学習および識別の並列処理を説明するために、特定のデプス(デプス1)に着目して当該並列処理を説明する。ここでは、デプス1、ノード0についての学習が既に終了しているものとする。
制御部11cは、デプス0での処理でクラシフィケーションモジュール50cから受け取った中間アドレスに基づいて、クラシフィケーションモジュール50cへ開始アドレスおよび終了アドレスを送信し、トリガによりクラシフィケーションモジュール50cによる処理(識別)を開始させる。なお、クラシフィケーションモジュール50cによる識別動作におけるデータの流れについて、図27においては実線で示している。
クラシフィケーションモジュール50cは、開始アドレスおよび終了アドレスに基づいて、ポインタメモリ31c(バンクB)の左側から対象とする学習データのアドレスを指定し、当該アドレスによって、フィーチャメモリ32cから学習データ(特徴量)を読み出す。また、クラシフィケーションモジュール50cは、モデルメモリ40cから対応するノード(デプス1、ノード0)の分岐条件データ(特徴量番号、しきい値)を読み出す。そして、クラシフィケーションモジュール50cは、分岐条件データに従って、読み出したサンプルデータを、ノード(デプス1、ノード0)の左側に分岐させるか、右側に分岐させるかを判定し、その判定結果により、当該学習データのフィーチャメモリ32cにおけるアドレスを、ポインタメモリ31cの読み出しバンク(バンクB)(読み出し用のバンク領域)と異なる他方の書き込みバンク(バンクA)(書き込み用のバンク領域)に書き込む。
この際、クラシフィケーションモジュール50cは、当該ノードの左側に分岐すると判定した場合、当該学習データのアドレスを、図28に示すように、バンクAのアドレスの低い方(受信した開始アドレス)から順に書き込み、当該ノードの右側に分岐すると判定した場合、当該学習データのアドレスを、バンクAのアドレスの高い方(受信した終了アドレスであって前回の中間アドレス)から順に書き込む。これによって、書き込みバンク(バンクA)では、ノードの左側に分岐した学習データのアドレスは、アドレスの低い方に、ノードの右側に分岐した学習データのアドレスは、アドレスの高い方にきれいに分けて書き込むことができる。なお、書き込みバンクにおいて、ノードの左側に分岐した学習データのアドレスは、アドレスの高い方に、ノードの右側に分岐した学習データのアドレスは、アドレスの低い方に分けて書き込むものとしてもよい。
以上の動作について、クラシフィケーションモジュール50cは、全学習データのうちバンクBの中間アドレスよりも左側に書き込まれたアドレスで指定される学習データに対して分岐処理を行う。ただし、分岐処理が終了した後、ノード(デプス1、ノード0)の左側と右側とに同数の学習データが分けられるわけではないので、クラシフィケーションモジュール50cは、左側に分岐した学習データのアドレスと、右側に分岐した学習データのアドレスとの中間に対応する書き込みバンク(バンクA)におけるアドレス(中間アドレス)を、制御部11cに返す。当該中間アドレスは、次の分岐処理の際に使用される。
以上のようなクラシフィケーションモジュール50cによるデプス1、ノード0での識別の動作に並列して、制御部11cは、デプス0での処理でクラシフィケーションモジュール50cから受け取った中間アドレスに基づいて、ラーニングモジュール20cへ開始アドレスおよび終了アドレスを送信し、トリガによりラーニングモジュール20cによる処理(学習)を開始させる。なお、ラーニングモジュール20cによる学習動作におけるデータの流れについて、図27においては破線で示している。
ラーニングモジュール20cは、開始アドレスおよび終了アドレスに基づいて、ポインタメモリ31c(バンクB)から対象とする学習データのアドレスを指定し、当該アドレスによって、フィーチャメモリ32cから学習データ(特徴量)を読み出し、ステートメモリ33からステート情報(w,g,h)を読み出す。具体的には、ラーニングモジュール20cは、図28に示すように、バンクBの右側(アドレスが高い方)から中間アドレスまで順にアドレスを指定していく。
この場合、ラーニングモジュール20cは、読み出した学習データの各特徴量、各しきい値における分岐スコアを算出する。そして、ラーニングモジュール20cは、各特徴量、各しきい値に対応する分岐スコアが最大となる特徴量の番号(特徴量番号)およびしきい値を導出する。そして、ラーニングモジュール20cは、導出した特徴量番号およびしきい値を、対応するノード(デプス1、ノード1)の分岐条件データとして、モデルメモリ40cへ書き込む。この際、ラーニングモジュール20cは、ノード(デプス1、ノード1)からさらに分岐されることを示すためにリーフフラグを「0」として、当該ノードのデータ(分岐条件データの一部としてもよい)をモデルメモリ40cへ書き込む。
以上の動作について、ラーニングモジュール20cは、バンクBの右側(アドレスが高い方)から中間アドレスまで順に指定し、当該アドレスによって、フィーチャメモリ32cから各学習データを読み出して行う。
以上の図28に示した例のように、本実施形態では、決定木の学習処理時に、例えば、同じデプス(ここでは、デプス1)において、クラシフィケーションモジュール50cが、デプス1のノード0についてラーニングモジュール20cにより決定された分岐条件データに従ってサンプルデータの分岐処理(識別)を行わせることと並列に、ラーニングモジュール20cに対して、同じデプス1のノード0の次のノード1についての学習を行わせることが可能である。
図29は、第3の実施形態に係る学習識別装置での学習および識別の並列処理のタイミングチャートの一例を示す図である。本実施形態における決定木の学習処理時に、上述したようなクラシフィケーションモジュール50cの識別と、ラーニングモジュール20cによる学習との並列処理のタイミングチャートについて、図29を参照しながら説明する。
図29(a)は、並列処理を行わない場合の学習と識別とを交互にシーケンシャルに実行する場合のタイミングチャートを示している。図29(a)に示すタイミングチャートでは、各デプスにおいて、特定のノードの学習および識別が終了した後に、次のノードの学習および識別が行われる動作となっている。
一方、図29(b)は、本実施形態に係る学習識別装置1cにおいて、学習と識別とを並列に実行する場合のタイミングチャートを示している。図29(b)に示すように、並列処理が可能となるのは、デプス1以降の深さのデプスに対応するノードであって、そのデプスの2番目のノード(すなわち、ノード1)以降に対応するノードに対する学習処理である。例えば、デプス0のノードはノード0のみであるので、学習と識別との並列処理を行うことはできない。デプス2のノードは、ノード0~ノード4の4つのノードが含まれるが、そのうち2番目のノード1の学習の動作から並列(ノード0の識別の動作との並列)の処理が可能となる。
このような並列処理が可能となるのは、上述のように、データメモリ30cのポインタメモリ31cおよびフィーチャメモリ32c、ならびに、モデルメモリ40cが、それぞれデータアクセス用のポートを2つ備えているためである。そして、本実施形態に係る学習識別装置1cが学習を行う決定木は2分岐の決定木であるので、特定のノードの識別の動作で対象となるサンプルデータと、当該ノードの次のノードの学習の動作で対象となるサンプルデータとが重複していないためである。以上のような、決定木の学習処理のおける学習および識別の並列処理によって、図29に示すように、並列処理を行わない場合と比較して高速化が実現でき、学習処理の処理速度を向上させることができる。
また、デプスが深くなる大きな決定木の学習処理では、理想的には2倍近い学習処理の高速化が可能となる。ただし、実際には、ノード毎に分岐したサンプルデータの数が異なるため、それより処理速度は落ちることが予想されるが、極端にサンプルデータの数が各ノードでアンバランスとなる場合、例えば、クラシフィケーションモジュール50cは、サンプルデータの数が所定数(例えば、10個)以下となった場合には、そのノードはリーフとみなし、それ以上は識別(分岐)を行わないようすればよい。これによって、極端にサンプルデータの数が少ないノードを発生させないことができ、本実施形態の高速化の効果を顕著にすることができる。
なお、本実施形態に係る学習識別装置1cにおける学習および識別の並列処理について、図27に示すようにデータパラレルではない構成の場合についての動作を説明したが、これに限定されるものではない。すなわち、上述の第2の実施形態での図16に示したデータパラレル(図16では分割数が2である場合の例)においても、本実施形態の学習および識別の並列処理を適用することが可能である。また、上述の図4および図17等で説明したフィーチャパラレルの構成においても、本実施形態の学習および識別の並列処理を適用することが可能である。
(変形例)
図30は、第3の実施形態の変形例に係る学習識別装置での学習および識別の並列処理のタイミングチャートの一例を示す図である。図30を参照しながら、上述の図29で示した第3の実施形態での学習および識別の並列処理による高速化よりもさらに高速化の効果を高める動作について説明する。
図29に示した第3の実施形態での学習および識別の並列処理では、各デプスにおいてノード0、ノード1、ノード2、・・・という順番で学習処理を実行していた。この場合のタイミングチャートを、デプス2を例にして、図30(a)に示す。この場合、例えば、ノード1の学習動作でのサンプルデータの数が、ノード0の識別動作よりも少ないために、ノード1の識別動作までに待ち時間が発生している。また、ノード1の識別動作でのサンプルデータの数が、ノード2の学習動作よりも少ないために、ノード2の識別動作までに待ち時間が発生している。すなわち、図27に示した構成では、ラーニングモジュール20cとクラシフィケーションモジュール50cとが1つずつしかないので、サンプルデータの数に偏りがあると待ち時間が発生することになる。
そこで、本変形例では、サンプルデータの数が同程度のノード間で並列処理が行われるようにする。具体的には、ある特定のデプスでの学習処理が終了した段階で、次のデプスの各ノードについてサンプルデータの数が多い順(または、少ない順)にソートして、サンプルデータの多いノードから順番に学習処理を行う。これによって、図30に示すように、ソートを行わない通常の並列処理の場合と比較して、上述の待ち時間を減少させ高速化を実現することができ、学習処理の処理速度をさらに向上させることができる。
なお、上述では、各ノードについてサンプルデータの数が多い順(または、少ない順)にソートするものとしたが、必ずしもサンプルデータの数の順序にソートする必要はなく、学習処理を行う順序において隣接するノードのサンプルデータの数が近くなるようにして学習処理を実行するものとすればよい。
また、上述の第2の実施形態での図16に示したデータパラレル(図16では分割数が2である場合の例)においても、本変形例の学習および識別の並列処理を適用することが可能である。また、上述の図4および図17等で説明したフィーチャパラレルの構成においても、本変形例の学習および識別の並列処理を適用することが可能である。
以下では、上述の実施形態に係る学習識別装置1における学習処理の速度の予測結果を説明する。
まずは、比較のためGBDTの代表的なライブラリである上述のXGBoost、およびLightGBMの学習速度の評価を行った。2017年12月時点では、LightGBMでGPUを用いた場合が高速であり、これについて実測した。
ハードウェア構成のクロックから処理時間を算出した。今回実装したハードウェアのロジックでは、ラーニングモジュール20による学習処理、クラシフィケーションモジュール50による識別処理(ノード単位)、およびクラシフィケーションモジュール50による識別処理(木単位)の3つが主な処理である。
<ラーニングモジュールの処理について>
ここでは、サンプルデータの各特徴量から勾配ヒストグラムの作成および分岐スコアの算出が支配的である。サンプルデータの各特徴量からの勾配ヒストグラムの作成では、1デプス(階層)ごとに全サンプルデータを読む必要がある。木のデプスが浅い段階で学習が終了するサンプルデータもあるので、この見積りは最大値である。分岐スコアの計算は勾配ヒストグラムの全ビンを参照するのでビンの数(特徴量の次元)のクロックを要する。以上より、ラーニングモジュール20の処理のクロック数C
learningは以下の式(23)で表される。
ここで、nsample_trainは決定木の学習に使うサンプルデータ数であり、一般に全サンプルデータからサブサンプルされた集合である。また、maxdepthは決定木の最大深さであり、nfeatureはビンの数(特徴量の次元)であり、nnodeはノード数である。
<クラシフィケーションモジュールの処理(ノード単位)について>
ここでは、学習したノードの結果を使って、サンプルデータが左右どちらの下位のノードに割り当てられるかを処理している。深さごとに処理するサンプルデータの総数は変わらないので、クロック数C
Classification_nodeは以下の式(24)で表される。実際は途中で学習が終了するノードがあるため、下記の見積は最大値である。
<クラシフィケーションモジュールの処理(木単位)について>
ここでは、決定木1つの学習が終了した後、次の決定木の学習のため、サンプルデータごとに勾配情報の更新を行う。そのため、学習した決定木を用いて、全サンプルデータについて予測を行う必要がある。木単位の処理では、深さ分だけ遅延が発生する。この場合、クロック数C
Classification_treeは以下の式(25)で表される。
ここで、全サンプルデータとは、サブサンプル前の全学習サンプルデータと、全バリデーションサンプルデータの総数である。
以上より、決定木1つ分の学習処理にかかるクロック数C
tree(最大値)は以下の式(26)で表される。
GBDTは多数の決定木から構成されるので、決定木の本数をn
treeとすると、GBDTモデル全体のクロック数C
gbdtは以下の式(27)で表される。
以上は、上述したフィーチャパラレル(Feature Parallel)の場合の試算であり、このモジュールを並列に多数配置し、データで分割した場合のいわゆるデータパラレル(Data Parallel)では、各モジュール毎に各ノードでのデータ数に偏りがない場合には、基本的にそのモジュール数倍の高速化が可能である。どの程度偏りが存在するかは、サンプルデータおよび各モジュールへのサンプルデータの分割の方法に依存するため、今後、本オーバーヘッドに関しては実データを用いて検討を行う。予測としては、本オーバーヘッドを考慮しても、効率で50%以上は出るものと推測される。
<使用データについて>
テスト用のサンプルデータとしては、約10万件からランダムに学習データと識別データ(評価用データ)とを選択したものである。以下にデータセットの概要を示す。
・クラス数 :2
・特徴量次元 :129
・学習データ数 :63415
・評価用データ数 :31707
また、速度の測定条件を以下の(表5)に示す。FPGAのクロック周波数は仮に100[MHz]での動作とした(実際にはそれ以上となる可能性が高い)。
<ハードウェアロジックの試算>
上述した速度の計算式を用いた上述のアーキテクチャでの学習速度の試算を以下の(表6)に示す。ただし、本試算はすべてのサンプルデータが末端の枝まで行った場合の試算であり最悪値である。
<CPU・GPUでの実測を含めた比較結果>
CPU・GPUでの実測結果を以下の(表7)に示す。なお、比較のため、ハードロジックの試算結果も含めて表示している。ここまでの試算はフィーチャパラレル(Feature Parallel)のみであるため、参考として、データパラレル(Data Parallel)も併用した場合の試算結果も追加した。
本データに関しては、GPUを使用した場合にもCPUよりも速度が落ちていることがわかる。LightGBMの開発元のマイクロソフト社はGPU使用の場合には、3倍から10倍程度高速化するが、データに大きく依存するとしており、本データに関しては、GPUでの高速化がうまくいかなかったことがわかる。また、この結果はGBDTのアルゴリズムが、CNNほどGPUの高速化が容易ではないことを示している。CPUでの結果では、最も基本的なライブラリであるXGBoostと比較して、後発のLightGBMでは10倍程度高速となっている。なお、フィーチャパラレル(Feature Parallel)のみのハードロジックでも、PC(Personal Computer)での最も速いCPU(LightGBM)と比較して、2.3倍程度高速となっている。また、15並列のデータパラレル(Data Parallel)も使用した場合には、データパラレル(Data Parallel)の効率を75%とした場合でも、25倍以上、AWS f1.16xlargeインスタンスを考えた場合で240並列の場合の効率を50%とすると、275倍以上の速度となることが試算された。ただし、この試算はメモリ帯域が限界の場合の試算である。
なお、消費電力に関してはFPGAでは数[W]と予測され、CPUおよびGPUでの100[W]以上であることを考えると、速度に加えて消費電力が2桁異なるため、電力効率では3桁以上の差となる可能性がある。