以下に、図1〜図15を参照しながら、本発明に係る学習識別装置および学習識別方法の実施形態を詳細に説明する。また、以下の実施形態によって本発明が限定されるものではなく、以下の実施形態における構成要素には、当業者が容易に想到できるもの、実質的に同一のもの、およびいわゆる均等の範囲のものが含まれる。さらに、以下の実施形態の要旨を逸脱しない範囲で構成要素の種々の省略、置換、変更および組み合わせを行うことができる。
(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個のビンに分割しており、しきい値候補はl個だけとなる。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、ノード判別器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のみを用いて学習を行うことで同じ回路を流用して、回路規模を小さくすることができる。
以下では、上述の実施形態に係る学習識別装置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
また、速度の測定条件を以下の(表1)に示す。FPGAのクロック周波数は仮に100[MHz]での動作とした(実際にはそれ以上となる可能性が高い)。
<ハードウェアロジックの試算>
上述した速度の計算式を用いた上述のアーキテクチャでの学習速度の試算を以下の(表2)に示す。ただし、本試算はすべてのサンプルデータが末端の枝まで行った場合の試算であり最悪値である。
<CPU・GPUでの実測を含めた比較結果>
CPU・GPUでの実測結果を以下の(表3)に示す。なお、比較のため、ハードロジックの試算結果も含めて表示している。ここまでの試算はフィーチャパラレル(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に収まるかどうかは今後検討が必要である。
なお、消費電力に関してはFPGAでは数[W]と予測され、CPUおよびGPUでの100[W]以上であることを考えると、速度に加えて消費電力が2桁異なるため、電力効率では3桁以上の差となる可能性がある。