JP2021068136A - 計算機システム、学習方法、及びプログラム - Google Patents
計算機システム、学習方法、及びプログラム Download PDFInfo
- Publication number
- JP2021068136A JP2021068136A JP2019192475A JP2019192475A JP2021068136A JP 2021068136 A JP2021068136 A JP 2021068136A JP 2019192475 A JP2019192475 A JP 2019192475A JP 2019192475 A JP2019192475 A JP 2019192475A JP 2021068136 A JP2021068136 A JP 2021068136A
- Authority
- JP
- Japan
- Prior art keywords
- negative
- arithmetic
- learning
- computer system
- cpu
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/08—Learning methods
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/34—Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
- G06F11/3409—Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment for performance assessment
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/34—Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
- G06F11/3447—Performance evaluation by modeling
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F18/00—Pattern recognition
- G06F18/20—Analysing
- G06F18/21—Design or setup of recognition systems or techniques; Extraction of features in feature space; Blind source separation
- G06F18/214—Generating training patterns; Bootstrap methods, e.g. bagging or boosting
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F18/00—Pattern recognition
- G06F18/20—Analysing
- G06F18/285—Selection of pattern recognition techniques, e.g. of classifiers in a multi-classifier system
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N20/00—Machine learning
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/06—Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons
- G06N3/063—Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons using electronic means
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
- G06N3/048—Activation functions
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Data Mining & Analysis (AREA)
- General Physics & Mathematics (AREA)
- Life Sciences & Earth Sciences (AREA)
- Evolutionary Computation (AREA)
- Artificial Intelligence (AREA)
- Computer Vision & Pattern Recognition (AREA)
- Software Systems (AREA)
- Bioinformatics & Cheminformatics (AREA)
- Bioinformatics & Computational Biology (AREA)
- Evolutionary Biology (AREA)
- Computing Systems (AREA)
- Mathematical Physics (AREA)
- Biophysics (AREA)
- Biomedical Technology (AREA)
- Health & Medical Sciences (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Molecular Biology (AREA)
- General Health & Medical Sciences (AREA)
- Computational Linguistics (AREA)
- Medical Informatics (AREA)
- Neurology (AREA)
- Machine Translation (AREA)
Abstract
【課題】実用的な学習処理の時間で、高い推論精度のモデルを生成する。【解決手段】ネガティブサンプリング法を用いてモデルを生成するための学習処理を実行する計算機システムは、複数の演算コアを有する計算機と、学習部と、を備え、学習部は、正例演算を実行する演算コア及び負例演算を実行する演算コアの性能特性を示す性能情報を取得し、性能情報に基づいて、負例演算における負例の数の最大値を算出し、最大値に基づいて負例の数を決定し、所定の数の正例となる学習データを用いた正例演算を少なくとも一つの演算コアに実行させ、決定された負例の数の、ランダムに選択された学習データを用いた負例演算を少なくとも一つの演算コアに実行させることによってモデルを生成する。【選択図】図1
Description
本発明は、ニューラルネットワーク等のモデルを生成するための学習処理に関する。
近年、ニューラルネットワークを利用した機械学習が広く利用されている。中でも多クラス分類問題は、手書き数字認識、顔画像識別、及び自然言語処理等によく用いられている。多クラス分類問題とは、入力データを複数のクラスのいずれかに分類する問題である。例えば、手書き数字認識では、0から9までの10種類の手書きの数字を正しい数字に分類する。
ニューラルネットワークを用いてこれを高速に分類するために用いられるのが、ネガティブサンプリング法(負例サンプリング法)である。ネガティブサンプリング法は、正解確率P(xt)を式(1)、(2)で算出する。ここでxtは入力データ、Vngは入力データxtと異なるデータの集合、xngは集合Vngの要素、σ(x)はシグモイド関数である。
この方法は、正解確率に占める入力データxtの寄与σ(xt)と、入力データxt以外のデータであるxngの寄与1−σ(xng)との積をとることで、正解確率P(xt)を表そうというものである。ここで、xtを正例(positive sample)、xngを負例(negative sample)と呼ぶ。
データ数が非常に多い場合(例えば、105個から107個の範囲)であっても、負例の数は少数でよいことが経験的に知られている。例えば、非特許文献1では、負例数は数個から数十個の範囲でよいとされている。また負例は、正例以外の入力データからランダムに選べばよい。
さらに高速化を行うために、GPU(Graphics Processing Unit)及びFPGA(Field Programmable Gate Array)等を用いたネガティブサンプリングの並列処理も提案されている。word2vecのようなネガティブサンプリング法を利用した自然言語処理の場合、非特許文献2のような並列処理方法(HogWild並列処理)が提案されている。
HogWild並列処理は、下記のようなループネストを、同期をとらずに1行目のループを並列実行する手法である。同期処理がないため、高速に実行できるというメリットがある。
01: for (int d=0; d<M; d++) {
02: L=…;
03: for (int i=0; i<N; i++) { b[i] += a[i+L]; }
04: for (int i=0; i<N; i++) { a[i+L] += ...; }
05: }
02: L=…;
03: for (int i=0; i<N; i++) { b[i] += a[i+L]; }
04: for (int i=0; i<N; i++) { a[i+L] += ...; }
05: }
Mikolov, Tomas, et al., "Distributed representations of words and phrases and their compositionality," In the Proceedings of the Advances in Neural Information Processing Systems, 2013
Recht, Benjamin, et al., "Hogwild: A lock-free approach to parallelizing stochastic gradient descent," In the Proceedings of the Advances in Neural Information Processing Systems, 2011
Gupta, Saurabh, and Vineet Khare, "Blazingtext: Scaling and accelerating word2vec using multiple gpus," Proceedings of the Machine Learning on HPC Environments, 2017
Tomasz S. Czajkowski, David Neto, Michael Kinsner, Utku Aydonat, Jason Wong, Dmitry Denisenko, Peter Yiannacouras, John Freeman, Deshanand P. Singh and Stephen D. Brown, "OpenCL for FPGAs: Prototyping a Compiler," Proceedings of the International Conference on Engineering of Reconfigurable Systems and Algorithms, 2012
千種菊里, GPUをフル活用する、Snow Leopardの「OpenCL」, https://ascii.jp/elem/000/000/456/456973/index-2.html, 2009, [2019年6月7日検索]
Intel, Intel SDK for OpenCL Applications, https://software.intel.com/en-us/opencl-sdk, [2019年6月7日検索]
笠原博徳, 並列処理技術, コロナ社, 1991
しかし、非特許文献3によれば、HogWild並列処理では変数の依存関係(上記例では、2行目の配列要素a[i+L]からの読み込みと、3行目の配列要素a[i+L]への読み込みとの関係)を無視した並列化が行われる。そのため、上記例で説明すれば、1行目のループ制御変数dの異なった値に対して、2行目の変数Lが同じ値になる場合(正例の演算処理の実行時に相当する)、3、4行目のループでメモリからの読み込み(3行目のa[i+L])とメモリへの書き込み(4行目のa[i+L])との実行順序が逆転する現象が発生し、3行目のa[i+L]が4行目のa[i+L]の値の更新前の値を使ってしまう可能性がある。その結果、生成されたモデルの推論結果の精度が低下する恐れがあることが指摘されている。なお、負例の演算処理の実行時にはLの値がランダムに決まるため、このような現象はほとんど生じないことがわかっている。
上記のような事態を避けるため、正例の演算は逐次処理で行い、一方、負例の演算は並列処理で行い、また、並列処理をGPU及びFPGA等を搭載したアクセラレータにオフロードする処理方法が考えられる。
このとき、負例の数は数個から数十個であればよいという経験則はあるが、負例数を一意に決める方法は知られていない。
非特許文献1に記載されているように、負例の数と推論精度との間には正の相関があることから、非常に多くの負例を用いれば推論精度は向上する。しかし、負例の数が多くなると演算処理の実行時間の増大するため(式(1)において、Vngの要素数が増えることに相当する)、学習処理そのものの実行時間も増大する。
そのため、従来は、負例の数を試行錯誤で何度も調整して複数のモデルを生成し、要求される処理時間の範囲内で、推論精度が最大となる負例の数を見つけるしかなかった。モデルの生成を何度も繰り返すことから、やはり計算に大きな時間がかかってしまう。
本発明は、ネガティブサンプリング法を用いたニューラルネットワークの学習において、学習処理の時間を実用的な範囲に抑え、かつ、高い推論精度のモデルを生成するための負例の数を一意に決定するシステム及び方法を提供する。
本願において開示される発明の代表的な一例を示せば以下の通りである。すなわち、ネガティブサンプリング法を用いて、事象の予測を行うモデルを生成するための学習処理を実行する計算機システムであって、複数の演算コア及び記憶装置を有する少なくとも一つの計算機と、複数の学習データを用いて前記学習処理を実行する学習部と、を備え、前記学習部は、正例演算を実行する前記演算コア及び負例演算を実行する前記演算コアの性能特性を示す性能情報を取得し、前記性能情報に基づいて、前記負例演算における前記負例の数の最大値を算出し、前記最大値に基づいて前記負例の数を決定し、所定の数の正例となる前記学習データを用いた正例演算を少なくとも一つの前記演算コアに実行させ、前記決定された負例の数の、ランダムに選択された前記学習データを用いた前記負例演算を少なくとも一つの前記演算コアに実行させることによって前記モデルを生成する。
本発明によれば、ネガティブサンプリング法を利用するニューラルネットワークの計算方法において、学習処理の時間を実用的な範囲に抑え、かつ、高い推論精度のモデルを生成するための負例数を一意に決定できる。上記した以外の課題、構成及び効果は、以下の実施例の説明により明らかにされる。
以下、本発明の実施例を、図面を用いて説明する。ただし、本発明は以下に示す実施例の記載内容に限定して解釈されるものではない。本発明の思想ないし趣旨から逸脱しない範囲で、その具体的構成を変更し得ることは当業者であれば容易に理解される。
以下に説明する発明の構成において、同一又は類似する構成又は機能には同一の符号を付し、重複する説明は省略する。
本明細書等における「第1」、「第2」、「第3」等の表記は、構成要素を識別するために付するものであり、必ずしも、数又は順序を限定するものではない。
以下では、OS(Operating System)はLinux(Linuxは登録商標、以下同じ)、プログラム言語は、CPU用プログラムはC言語を、GPU用プログラム、FPGA用プログラム、及びマルチコアCPU用プログラムはOpenCL(Open Computing Language)(OpenCLは登録商標、以下同じ)を用いる。しかし、本発明の範囲はOS及び記述言語に限定されず、Windows(Windowsは登録商標、以下同じ)等の他のOS、またOpenCL以外のアクセラレータ用言語、Verilog HDL及びVHDL等のハードウェア記述言語等でも適用可能である。
図1は、実施例1の計算機システムの構成の一例を示す図である。
計算機システム10は、少なくとも一つの計算機100から構成される。計算機システム10が複数の計算機100から構成される場合、各計算機100はLAN(Local Area Network)及びWAN(Wide Area Network)等のネットワークを介して互いに接続される。なお、接続方式は、有線及び無線のいずれでもよい。
計算機100は、CPU(Central Processing Unit)101、アクセラレータ102、主記憶装置103、及び副記憶装置104を備える。また、計算機100には、入出力装置105が接続される。
CPU101及びアクセラレータ102は、少なくとも一つの演算コアを有し、プログラムにしたがって演算処理を実行する演算装置である。CPU101は、計算機100全体を制御するための演算処理と、ニューラルネットワーク300(図3を参照)を生成するための演算処理とを実行する。アクセラレータ102は、CPU101と協働して、ニューラルネットワーク300を生成するための演算処理を実行する。アクセラレータ102は、例えば、GPU及びFPGA等を搭載するボード、並びにマルチコアCPU等である。実施例1では、アクセラレータ102としてGPUを搭載しているボードを想定する。
主記憶装置103は、プログラム及びプログラムが使用するデータを格納する記憶装置である。主記憶装置103は、プログラムが一時的に使用するワークエリアを確保するためにも用いられる。主記憶装置103は、例えば、DRAM(Dynamic Random Access Memory)等のメモリである。主記憶装置103に格納されるプログラム及びデータについては後述する。
副記憶装置104は、記憶領域の容量が大きく、また、データを永続的に保存する記憶装置である。副記憶装置104は、例えば、HDD(Hard Disk Drive)及びSSD(Solid State Drive)等である。副記憶装置104に格納されるデータについては後述する。
入出力装置105は、計算機100への情報の入力、及び計算機100からの情報の主力を行うための装置である。入出力装置105は、例えば、キーボード、マウス、タッチパネル、及びディスプレイ等である。
ここで、主記憶装置103及び副記憶装置104に格納されるプログラム及びデータについて説明する。
副記憶装置104は、学習処理に用いる学習データ140を格納する。学習データ140は、入力データのみから構成されるデータでもよいし、入力データ及び教師データのペアから構成されるデータでもよい。
主記憶装置103は、ニューラルネットワーク学習部110を実現するプログラムを格納し、正例の演算処理を実現するプログラム(Cプログラム133)、負例の演算処理を実現するプログラム(OpenCLプログラム134)を格納し、また、コンフィギュレーションファイル111及びニューラルネットワーク情報112を格納する。また、主記憶装置103には、学習処理において使用される第1の一時配列130、第2の一時配列131、及び学習データ配列132が格納される。
なお、Cプログラム133及びOpenCLプログラム134は、ニューラルネットワーク学習部110を実現するプログラムに含まれてもよい。また、ニューラルネットワーク学習部110を実現するプログラムは、学習処理において使用されるプログラムをコンパイルするためのコンパイラを含む。
ニューラルネットワーク学習部110は、CPU101がプログラムを実行して実現される機能部(モジュール)である。ニューラルネットワーク学習部110は、ニューラルネットワーク300を生成するための学習処理を実行する。
ニューラルネットワーク情報112は、学習処理によって生成されたニューラルネットワーク300の情報を格納する。ニューラルネットワーク情報112には、階層間を接続するエッジの重みに関する情報である、第1の重み配列120及び第2の重み配列121が含まれる。
なお、主記憶装置103に格納されるプログラム及びデータは、副記憶装置104に格納されてもよい。この場合、CPU101が主記憶装置103からプログラム及びデータを読み出し、主記憶装置103にロードする。
なお、計算機システム10が複数の計算機100から構成される場合、機能部及び情報は、複数の計算機100に分散するように配置されてもよい。
以上が図1の説明である。
図2は、実施例1のアクセラレータ102のハードウェア構成の一例を示す図である。
実施例1のアクセラレータ102は、GPU200を搭載するボード(例えば、グラフィックボード)である。
アクセラレータ102は、GPU200、DRAM201、及び入出力インタフェース202を備える。GPU200はDRAM201と接続し、また、DRAM201は、入出力インタフェース202と接続する。
アクセラレータ102は、入出力インタフェース202に接続される通信経路を介して、CPU101等の外部装置と通信する。通信経路、例えば、PCI Express(Peripheral Component InterConnect Express)(PCI Expressは登録商標、以下同じ)である。
以上が図2の説明である。
図3は、実施例1の計算機システム10によって生成されるニューラルネットワークの構造の一例を示す図である。
図3に示すニューラルネットワーク300は、入力層301、隠れ層302、及び出力層303の三つの層から構成される。入力層301はV個の要素xi(iは1からVの範囲の整数)を含み、隠れ層302はN個の要素hj(jは1からNの範囲の整数)を含み、出力層303はV個の要素uk(kは1からVの範囲の整数)を含む。なお、各層の要素はノードと呼んでもよい。
図3では、入力層301及び隠れ層302の要素がエッジ311で全結合されている。このとき、入力層301の各要素xiと、隠れ層302の各要素hjとの間には式(3)に示すような関係がある。
ここでvi,jは、入力層301及び隠れ層302の結合の重みを与える第1の重み配列120の要素を表す。
同様に、隠れ層302及び出力層303の要素がエッジ312で全結合されている。このとき、隠れ層302の各要素hjと、出力層303の各要素ukとの間には式(4)に示すような関係がある。
ここでv’k,lは、隠れ層302及び出力層303の結合の重みを与える第2の重み配列121の要素を表す。
ここでは具体例として、文章に含まれる単語の共起を用いて単語のベクトル表現を学習するアルゴリズムであるword2vecのニューラルネットワーク300を取り上げている。word2vecでは、ニューラルネットワーク300の出力層303から単語出現確率を算出する場合、ネガティブサンプリング法が用いられる。
なお、word2vecの場合、学習データ140は文章を示すデータであり、学習データ配列132は、学習データ140に出現する単語を出現順に配列要素に格納した配列である。また、入力層301の各要素xiは、単語ごとに一意なベクトルになるように定義されている。具体的には、一成分が1かつ他の成分が0となるベクトルを用いて単語が定義される。前述のようなベクトルをone hotベクトルと呼ぶ。例えば、学習データ配列132が三つの要素(The,cats,walk)である場合、「The」のone hotベクトルが(1,0,0)、「cats」のone hotベクトルが(0,1,0)、「walk」のone hotベクトルが(0,0,1)と定義される。このように、one hotベクトルは、0又は1を要素とし、単語を一意に表現するベクトルである。
なお、本発明は、図3に示すような構造以外のニューラルネットワークであってもよい。
以上が図3の説明である。
図4は、実施例1の計算機100が実行する学習処理の一例を説明するフローチャートである。
計算機100は、実行指示を受け付けた場合、以下で説明する処理を実行する。なお、処理の開始の契機は一例であってこれに限定されない。
まず、ニューラルネットワーク学習部110は、ネガティブサンプリング法における負例の数を決定するための負例数算出処理を実行する(ステップS1000)。負例数算出処理の詳細は図5及び図6を用いて説明する。
次に、ニューラルネットワーク学習部110は、処理で用いる配列を初期化するための配列初期化処理を実行する(ステップS1100)。配列初期化処理の詳細は図7を用いて説明する。
次に、ニューラルネットワーク学習部110は、アクセラレータ102に実行させる負例の演算処理(負例並列処理)の実行に必要な設定を行うためのCPU送信処理を実行する(ステップS1200)。CPU送信処理の詳細は図8を用いて説明する。
次に、ニューラルネットワーク学習部110は、正例の演算処理(正例逐次処理)及び負例の演算処理の各々のスレッドを生成するためのスレッド生成処理を実行する(ステップS1300)。スレッド生成処理の詳細は図9を用いて説明する。なお、スレッド生成処理では、正例の演算処理に対応するスレッドには識別番号「0」が設定され、負例の演算処理に対応するスレッドには識別番号「1」が設定される。
次に、ニューラルネットワーク学習部110は、スレッドの識別番号に応じて、スレッドに対応する演算処理の実行をCPU101及びアクセラレータ102に指示し(ステップS1400)、その後、ステップS1500に進む。
具体的には、スレッドの識別番号が「0」である場合、ニューラルネットワーク学習部110は、CPU101に正例の演算処理の実行を指示し、スレッドの識別番号が「1」である場合、アクセラレータ102に負例の演算処理の実行を指示する。アクセラレータ102への負例の演算処理の実行指示は、OpenCL言語に実装されているアクセラレータ起動関数であるclEnqueueTask関数を用いて実現できる。
なお、実行指示を受け付けたCPU101が実行する処理については図11を用いて説明する。実行指示を受け付けたアクセラレータ102が実行する処理については図12から図16を用いて説明する。
ステップS1500では、ニューラルネットワーク学習部110は、スレッド待合せを行う(ステップS1500)。ニューラルネットワーク学習部110は、二つのスレッドの終了を検知した後、ステップS1600に進む。なお、スレッド待合せは、例えば、スレッド生成関数pthread_joinを用いることで実現できる。
ステップS1600では、ニューラルネットワーク学習部110は、アクセラレータ102から負例の演算処理の結果を取得するためのCPU受信処理を実行する(ステップS1600)。CPU受信処理の詳細は図17を用いて説明する。
次に、ニューラルネットワーク学習部110は、正例の演算処理及び負例の演算処理の結果に基づいて、重み配列を更新するための配列加算処理を実行する(ステップS1700)。その後、ニューラルネットワーク学習部110は、処理を終了する。配列加算処理の詳細は図18を用いて説明する。
以上が図4の説明である。
図5は、実施例1のニューラルネットワーク学習部110が実行する負例数算出処理の一例を説明するフローチャートである。図6は、実施例1のコンフィギュレーションファイル111の一例を示す図である。
まず、コンフィギュレーションファイル111について説明する。図6の左端の番号は行番号を示し、記号「#」に続く文字列はコメントを示す。
コンフィギュレーションファイル111は、学習処理に必要なパラメータの値を含む。
2行目から4行目はハードウェアに依存しないパラメータの値を定義する。具体的には、2行目のNSminは、負例の数の最小値を示すパラメータであり、3行目のwindowは、windowの数を示すパラメータであり、4行目のαは、学習率を示すパラメータである。図6では、NSminは3、windowは3、αは0.025が設定されている。
ここで、windowの数とは、図3のニューラルネットワーク300で単語の共起を用いて単語のベクトル表現を学習する場合に、ある文章中で注目する単語の両側から何単語までを共起として取り扱うかを意味する数字である。例えば、「Two cats sat on the floor」という文章において、注目する単語が「sat」、かつ、windowが1の場合、「sat」と共起するとみなす単語は「cats」及び「on」である。一方、注目する単語が「sat」、かつ、windowが2の場合、「sat」と共起するとみなす単語は「Two」、「cats」、「on」、「the」である。
7行目及び8行目はCPU101に関するパラメータの値を定義する。7行目のPcpuはCPU101の積和演算命令の並列度を示すパラメータであり、8行目のFcpuはCPU101のクロック周波数を示すパラメータである。図6では、Pcpuは8、Fcpuは3e9が設定されている。なお、Fcpuの単位はHzとしている。また、3e9は3×109の略記である。
11行目から13行目はGPU200に関するパラメータの値を定義する。11行目のPgpuはGPU200の積和演算命令の並列度を示すパラメータであり、12行目のNgpucoreはGPU200の演算コアの数を示すパラメータであり、13行目のFgpuはGPU200のクロック周波数を示すパラメータである。図6では、Pgpuは4、Ngpucoreは1024、Fgpuは1e9が設定されている。なお、Fgpuの単位はHzとしている。
以上が図6の説明である。
ニューラルネットワーク学習部110は、コンフィギュレーションファイル111から演算コアの性能特性に関する情報を取得する(ステップS1001)。
ここでは、CPU101の演算コアの性能特性に関する情報として、CPU101の積和演算命令の並列度及びクロック周波数が取得され、GPU200の演算コアの性能特性に関する情報として、GPU200の積和演算命令の並列度、演算コアの数、及びクロック周波数が取得される。
なお、演算コアの性能特性に関する情報は、コンフィギュレーションファイル111以外から取得してもよい。例えば、OSから取得してもよいし、CPU101及びGPU200から直接取得してもよい。
次に、ニューラルネットワーク学習部110は、正例の演算処理(正例逐次処理)及び負例の演算処理(負例並列処理)の実行時間に基づいて、負例の数の最大値を算出する(ステップS1002)。本実施例では、式(5)に基づいて、負例の数の最大値が算出される。
式(5)は、式(6)に示すCPU101による正例の演算処理の実行時間と、式(7)に示すGPU200による負例の演算処理の実行時間とが等しいと仮定した場合に導出される式である。ここで、Nmaは、正例の演算処理における全積和演算の数を表す。
なお、式(5)に基づいて算出された値が整数でない場合、ニューラルネットワーク学習部110は、四捨五入、切り上げ、及び切り下げ等の処理を行って値を整数に変換する。
次に、ニューラルネットワーク学習部110は、負例の数の最大値に基づいて、設定する負例の数を決定する(ステップS1003)。
例えば、ニューラルネットワーク学習部110は、負例の数の最大値を、設定する負例の数としてもよい。また、ニューラルネットワーク学習部110は、ユーザに、負例の数の最大値を提示し、ユーザからの入力を受け付けるようにしてもよい。
次に、ニューラルネットワーク学習部110は、決定された負例の数が最小負例数NSminより小さいか否かを判定する(ステップS1004)。
決定された負例の数が最小負例数NSmin以上である場合、ニューラルネットワーク学習部110は負例数算出処理を終了する。
決定された負例の数が最小負例数NSminより小さい場合、ニューラルネットワーク学習部110は、負例の数を最小負例数NSminに設定し(ステップS1005)、その後、負例数算出処理を終了する。負例の数が最小負例数より小さくならないように制御することによって、ニューラルネットワーク300の推論精度を一定以上に保つことができる。
以上で説明したように、本実施例では、正例の演算処理の実行時間と負例の演算処理の実行時間との差が小さくなるように負例の数の最大値が決定される。負例の数は、最大値及び最小値の範囲内で決定されるため、学習処理の時間を実用的な範囲に抑え、かつ、高い推論精度のモデルを生成することができる。
以上が図5の説明である。
図7は、実施例1のニューラルネットワーク学習部110が実行する配列初期化処理の一例を説明するフローチャートである。
ニューラルネットワーク学習部110は、副記憶装置104から学習データ140を読み出し、学習データ配列132に格納する(ステップS1101)。
次に、ニューラルネットワーク学習部110は、第1の重み配列120と同じ型かつ同じ要素数の第1の一時配列130と、第2の重み配列121と同じ型かつ同じ要素数の第2の一時配列131とを生成する(ステップS1102)。
次に、ニューラルネットワーク学習部110は、第1の一時配列130及び第2の一時配列131を初期化する(ステップS1103)。その後、ニューラルネットワーク学習部110は配列初期化処理を終了する。
具体的には、第1の一時配列130及び第2の一時配列131の各々の全要素に0が設定される。
配列初期化処理は、正例の演算処理において使用される第1の重み配列120及び第2の重み配列121の代わりに、負例の演算処理において使用される第1の一時配列130及び第2の一時配列131を準備するために実行される。
以上が図7の説明である。
図8は、実施例1のニューラルネットワーク学習部110が実行するCPU送信処理の一例を説明するフローチャートである。
ニューラルネットワーク学習部110は、アクセラレータ102に、学習データ配列132を送信する(ステップS1201)。
次に、ニューラルネットワーク学習部110は、アクセラレータ102に、第1の一時配列130を送信する(ステップS1202)。
次に、ニューラルネットワーク学習部110は、アクセラレータ102に、第2の一時配列131を送信する(ステップS1203)。
次に、ニューラルネットワーク学習部110は、アクセラレータ102に、コンフィギュレーションファイル111から読み出した学習率を送信する(ステップS1204)。
次に、ニューラルネットワーク学習部110は、アクセラレータ102に、コンフィギュレーションファイル111から読み出したwindowの数を送信する(ステップS1205)。
次に、ニューラルネットワーク学習部110は、アクセラレータ102に、負例数算出処理において算出された負例の数を送信する(ステップS1206)。その後、ニューラルネットワーク学習部110はCPU送信処理を終了する。
なお、アクセラレータ102へのデータの送信は、例えば、例えばOpenCL言語のCPUからアクセラレータへのデータ転送関数であるclEnqueueWriteBuffer関数を用いて実現できる。
以上が図8の説明である。
図9は、実施例1のニューラルネットワーク学習部110が実行するスレッド生成処理の一例を説明するフローチャートである。
ニューラルネットワーク学習部110は、正例の演算処理(正例逐次処理)及び負例の演算処理(負例並列処理)の各々のスレッドを生成し(ステップS1301)、スレッド生成処理を終了する。
このとき、ニューラルネットワーク学習部110は、正例の演算処理のスレッドにスレッド番号として「0」を設定し、負例の演算処理(負例並列処理)のスレッドにスレッド番号として「1」を設定する。
なお、スレッドの生成は、例えば、スレッド生成関数pthread_createを用いて実現できる。
以上が図9の説明である。
図10A及び図10Bは、実施例1のニューラルネットワーク学習部110が実行するコンパイル処理を説明する図である。
ニューラルネットワーク学習部110を実現するプログラムに含まれるコンパイラ1000は、Cプログラム133をコンパイルすることによってCPU101が実行可能なCPUプログラム1010に変換する。コンパイラ1000は、例えば、GCC(GNU Compiler Collection)等である。CPUプログラム1010は、CPU101にロードされ、アクセラレータ102と協調するように実行される。
ニューラルネットワーク学習部110を実現するプログラムに含まれるコンパイラ1001は、OpenCLプログラム134をコンパイルすることによってアクセラレータ102が実行可能なアクセラレータプログラム1011に変換する。実施例1のコンパイラ1001は、GPU用のコンパイラであって、例えば、非特許文献5に記載のコンパイラである。アクセラレータプログラム1011は、アクセラレータ102にロードされ、CPU101と協調するように実行される。
次に、ニューラルネットワーク学習部110からの指示を受け付けたCPU101が実行する処理について説明する。CPU101は、実行指示を受け付けた場合、正例の演算処理を開始する。
図11は、実施例1のCPU101が実行する正例の演算処理の一例を説明するフローチャートである。
CPU101は、変数iを初期化する(ステップS2001)。具体的には、変数iに0が設定される。
CPU101は、変数iが入力単語数より小さいか否かを判定する(ステップS2002)。なお、入力単語数は、学習データ配列132の要素数に等しい。
変数iが入力単語数以上である場合、CPU101は正例の演算処理を終了する。
変数iが入力単語数より小さい場合、CPU101は、式(8)に示すように、学習データ配列132のi番目の単語に対応するone hotベクトルを出力する関数funcの演算を実行し、ベクトルxw_Iを算出する(ステップS2003)。なお、表記の関係でwIをw_Iと記載している。
次に、CPU101は、式(9)に示すように、ベクトルxw_Iに第1の重み配列120を乗算することによって、ベクトルvw_Iを算出する(ステップS2004)。なお、表記の関係でwIをw_Iと記載している。
ベクトルxw_Iは(0,1,0)のような形式のベクトルであるため、ベクトルvw_Iはi番目の単語に対応する第1の重み配列120の列を抜き出すことに対応する。
次に、CPU101は、変数jを初期化する(ステップS2005)。具体的には、変数jに−windowが設定される。
次に、CPU101は、変数jがwindow以下であるか否かを判定する(ステップS2006)。ステップS2008以降の処理は、注目する単語(j=0の場合)の前後window個の単語に対する共起を学習するループである。
変数jがwindowより大きい場合、CPU101は、変数iに1を加算した値を、変数iに設定し(ステップS2007)、その後、ステップS2002に戻る。
変数jがwindow以下である場合、CPU101は、変数jが0と等しいか否かを判定する(ステップS2008)。ここでは、変数jが0と等しくない場合、判定結果がTUREとなり、変数jが0と等しい場合、判定結果がFALSEとなる。なお、変数jが0と等しくない場合にのみステップS2009以降の処理を行うのは、注目する単語(j=0の場合)自身に対する共起を計算しないためである。
変数jが0と等しい場合(ステップS2008の結果がFALSEの場合)、CPU101はステップS2013に進む。
変数jが0と等しくない場合(ステップS2008の結果がTUREの場合)、CPU101は、式(10)に示すように、学習データ配列132のi+j番目の単語に対応するone hotベクトルを出力する関数funcの演算を実行し、ベクトルxw_0を算出する(ステップS2009)。なお、表記の関係でw0をw_0と記載している。
次に、CPU101は、式(11)に示すように、ベクトルxw_0に第1の重み配列120及び第2の重み配列121を乗算することによって、ベクトルv’w_0を算出する(ステップS2010)。なお、表記の関係でw0をw_0と記載している。
次に、CPU101は、式(12)に示す演算を実行することによって、ベクトルvw_Iを更新する(ステップS2011)。なお、シグモイド関数σの引数は、ベクトルv’w_0及びベクトルvw_Iの内積である。
ベクトルvw_Iの更新は、i番目の単語に対する第1の重み配列120の要素の更新に対応する。
次に、CPU101は、式(13)に示す演算を実行することによって、ベクトルv’w_0を更新し(ステップS2012)、ステップS2013に進む。なお、シグモイド関数σの引数は、ベクトルv’w_0及びベクトルvw_Iの内積である。
ベクトルv’w_0の更新は、i+j番目の単語に対する第2の重み配列121の要素の更新に対応する。
ステップS2013では、CPU101は、変数jに1を加算した値を、変数jに設定し(ステップS2013)、その後、ステップS2006に戻る。
以上が図11の説明である。
次に、ニューラルネットワーク学習部110からの指示を受け付けたアクセラレータ102が実行する処理について説明する。アクセラレータ102は、実行指示を受け付けた場合、アクセラレータ処理を開始する。
図12は、実施例1のアクセラレータ102が実行するアクセラレータ処理の一例を説明するフローチャートである。
アクセラレータ102は、CPU送信処理によって送信されたデータを受信するために、アクセラレータ受信処理を実行する(ステップS3000)。アクセラレータ受信処理の詳細は図13を用いて説明する。
次に、アクセラレータ102は、負例の演算処理(負例並列処理)を実行する(ステップS3100)。負例の演算処理の詳細は図14、図15を用いて説明する。
次に、アクセラレータ102は、負例の演算処理の結果をCPU101に送信するために、アクセラレータ送信処理を実行する(ステップS3200)。その後、アクセラレータ102は、アクセラレータ処理を終了する。アクセラレータ送信処理の詳細は図16を用いて説明する。
以上が図12の説明である。
図13は、実施例1のアクセラレータ102が実行するアクセラレータ受信処理の一例を説明するフローチャートである。
アクセラレータ102は、学習データ配列132を受信し(ステップS3001)、DRAM201に学習データ配列132を格納する。
次に、アクセラレータ102は、第1の一時配列130を受信し(ステップS3002)、DRAM201に第1の一時配列130を格納する。
次に、アクセラレータ102は、第2の一時配列131を受信し(ステップS3003)、DRAM201に第2の一時配列131を格納する。
次に、アクセラレータ102は、学習率を受信し(ステップS3004)、DRAM201に学習率を格納する。
次に、アクセラレータ102は、アクセラレータ102に、windowの数を受信し(ステップS3005)、DRAM201にwindowの数を格納する。
次に、アクセラレータ102は、負例の数を受信し(ステップS3006)、DRAM201に負例の数を格納する。その後、アクセラレータ102はアクセラレータ受信処理を終了する。
以上が図13の説明である。
図14は、実施例1のアクセラレータ102が実行する負例の演算処理の一例を説明するフローチャートである。
以下で示す変数i、jは、正例の演算処理において示した変数i、jと同じ文字であるが、別々の実体である。すなわち、図11の変数i、jと図14の変数i、jとは独立の変数である。
アクセラレータ102は、変数iを初期化する(ステップS3101)。具体的には、アクセラレータ102は、式(14)を用いて算出される値を変数iの初期値として設定する。入力単語数は、学習データ配列132の要素数に等しい。
これは、学習データ配列132の重なりがないように、GPU200の各演算コアに処理を担当させるための処理である。なお、GPU200の演算コアには0から(Ngpucore−1)の範囲の整数の識別番号が割り当てられている。
次に、アクセラレータ102は、変数iが式(15)の値より小さいか否かを判定する(ステップS3102)。
変数iが式(15)の値以上である場合、アクセラレータ102は負例の演算処理を終了する。
変数iが式(15)の値より小さい場合、アクセラレータ102は、式(16)に示すように、学習データ配列132のi番目の単語に対応するone hotベクトルを出力する関数funcの演算を実行し、ベクトルxw_Iを算出する(ステップS3103)。なお、表記の関係でwIをw_Iと記載している。
次に、アクセラレータ102は、式(17)に示すように、ベクトルxw_Iに第1の一時配列130を乗算することによって、ベクトルvw_Iを算出する(ステップS3104)。なお、表記の関係でwIをw_Iと記載している。
ベクトルxw_Iは(0,1,0)のような形式のベクトルであるため、ベクトルvw_Iはi番目の単語に対応する第1の一時配列130の列を抜き出すことに対応する。
次に、アクセラレータ102は、変数jを初期化する(ステップS3105)。具体的には、変数jに−windowが設定される。
次に、アクセラレータ102は、変数jがwindow以下であるか否かを判定する(ステップS3106)。
変数jがwindowより大きい場合、アクセラレータ102は、変数iに1を加算した値を、変数iに設定し(ステップS3107)、その後、ステップS3102に戻る。
変数jがwindow以下である場合、アクセラレータ102は、変数jが0と等しいか否かを判定する(ステップS3108)。ここでは、変数jが0と等しくない場合、判定結果がTUREとなり、変数jが0と等しい場合、判定結果がFALSEとなる。
変数jが0と等しい場合(ステップS3108の結果がFALSEの場合)、アクセラレータ102はステップS3110に進む。
変数jが0と等しくない場合(ステップS3108の結果がTUREの場合)、アクセラレータ102は、負例本体処理を実行し(ステップS3109)、その後、ステップS3110に進む。負例本体処理の詳細は図15を用いて説明する。
ステップS3110では、アクセラレータ102は、変数jに1を加算した値を、変数jに設定し(ステップS3110)、その後、ステップS3106に戻る。
以上が図14の説明である。
図15は、実施例1のアクセラレータ102が実行する負例本体処理の一例を説明するフローチャートである。
アクセラレータ102は、変数nを初期化する(ステップS3151)。具体的には、変数nに0が設定される。
次に、アクセラレータ102は、変数nが負例の数より小さいか否かを判定する(ステップS3152)。
変数nが負例の数以上である場合、アクセラレータ102は負例本体処理を終了する。
変数nが負例の数より小さい場合、アクセラレータ102は、学習データ配列132の要素(単語)を負例としてランダムに選択し、式(18)に示すように、当該単語に対応するone hotベクトルを出力する関数funcの演算を実行し、ベクトルxw_0を算出する(ステップS3153)。なお、表記の関係でw0をw_0と記載している。
次に、アクセラレータ102は、式(19)に示すように、ベクトルxw_0に第1の一時配列130及び第2の一時配列131を乗算することによって、ベクトルv’w_0を算出する(ステップS3154)。なお、表記の関係でw0をw_0と記載している。
ベクトルv’w_0は、ランダムに選択された単語に対応する第2の一時配列131の列を抜き出すことに対応する。
次に、アクセラレータ102は、式(20)に示す演算を実行することによって、ベクトルvw_Iを更新する(ステップS3155)。なお、シグモイド関数σの引数は、ベクトルv’w_0及びベクトルvw_Iの内積である。
ベクトルvw_Iの更新は、i番目の単語に対する第1の一時配列130の要素の更新に対応する。
次に、アクセラレータ102は、式(21)に示す演算を実行することによって、ベクトルv’w_0を更新する(ステップS3156)。なお、シグモイド関数σの引数は、ベクトルv’w_0及びベクトルvw_Iの内積である。
ベクトルv’w_0の更新は、ランダムに選択された単語(負例)に対する第2の一時配列131の要素の更新に対応する。
次に、アクセラレータ102は、変数nに1を加算した値を、変数nに設定し(ステップS3157)、その後、ステップS3152に戻る。
以上が図15の説明である。
図16は、実施例1のアクセラレータ102が実行するアクセラレータ送信処理の一例を説明するフローチャートである。
アクセラレータ102は、CPU101に、第1の一時配列130を送信し(ステップS3201)、また、第2の一時配列131を送信する(ステップS3202)。その後、アクセラレータ102はアクセラレータ送信処理を終了する。
以上が図16の説明である。
次に、スレッド待合せ後に実行される処理について説明する。
図17は、実施例1のニューラルネットワーク学習部110が実行するCPU受信処理の一例を説明するフローチャートである。
ニューラルネットワーク学習部110は、アクセラレータ102から、第1の一時配列130を受信する(ステップS1601)。このとき、ニューラルネットワーク学習部110は、主記憶装置103に格納される第1の一時配列130を、受信した第1の一時配列130に更新する。
次に、ニューラルネットワーク学習部110は、アクセラレータ102から、第2の一時配列131を受信する(ステップS1602)。その後、ニューラルネットワーク学習部110はCPU受信処理を終了する。このとき、ニューラルネットワーク学習部110は、主記憶装置103に格納される第2の一時配列131を、受信した第2の一時配列131に更新する。
なお、アクセラレータ102からのデータの受信は、例えば、OpenCL言語のアクセラレータからCPUへのデータ転送関数であるclEnqueueReadBuffer関数を用いて実現できる。
以上が図17の説明である。
図18は、実施例1のニューラルネットワーク学習部110が実行する配列加算処理の一例を説明するフローチャートである。
ニューラルネットワーク学習部110は、変数iを初期化する(ステップS1701)。具体的には、変数iに0が設定される。
次に、ニューラルネットワーク学習部110は、変数iが第1の重み配列120の要素数より小さいか否かを判定する(ステップS1702)。
変数iが第1の重み配列120の要素数より小さい場合、ニューラルネットワーク学習部110は、第1の重み配列120のi番目の要素を更新する(ステップS1703)。
具体的には、ニューラルネットワーク学習部110は、第1の重み配列120のi番目の要素に、第1の一時配列130のi番目の要素を加算する。
次に、ニューラルネットワーク学習部110は、変数iに1を加算した値を、変数iに設定し(ステップS1704)、その後、ステップS1702に戻る。
ステップS1702において、変数iが第1の重み配列120の要素数以上の場合、ニューラルネットワーク学習部110は、変数jを初期化する(ステップS1705)。具体的には、変数jに0が設定される。
ニューラルネットワーク学習部110は、変数jが第2の重み配列121の要素数より小さいか否かを判定する(ステップS1706)。
変数jが第2の重み配列121の要素数より小さい場合、ニューラルネットワーク学習部110は、第2の重み配列121のj番目の要素を更新する(ステップS1707)。
具体的には、ニューラルネットワーク学習部110は、第2の重み配列121のj番目の要素に、第2の一時配列131のj番目の要素を加算する。
次に、ニューラルネットワーク学習部110は、変数jに1を加算した値を、変数jに設定し(ステップS1708)、その後、ステップS1706に戻る。
ステップS1706において、変数jが第2の重み配列121の要素数以上の場合、ニューラルネットワーク学習部110は配列加算処理を終了する。
以上が図18の説明である。
実施例1によれば、ニューラルネットワーク学習部110は、正例の演算処理(正例逐次処理)及び負例の演算処理(負例並列処理)の実行時間の差が最小となる負例の数を、負例の数の最大値として設定し、当該最大値に基づいて実際の負例の数を決定する。これによって、実用的な学習処理の時間で、高い推論精度のモデルを生成できる。
実施例2では、FPGAを搭載するアクセラレータ102を用いる点が実施例1と異なる。以下、実施例1との差異を中心に実施例2について説明する。
実施例2の計算機システム10の構成は実施例1と同一である。実施例2ではアクセラレータ102の構成が異なる。図19は、実施例2のアクセラレータ102のハードウェア構成の一例を示す図である。
実施例2のアクセラレータ102は、FPGA1900を搭載するボードである。
アクセラレータ102は、FPGA1900、DRAM1901、及び入出力インタフェース1902を備える。FPGA1900はDRAM1901と接続し、また、DRAM1901は、入出力インタフェース1902と接続する。
以上が図19の説明である。
実施例2の負例数算出処理は、実施例1と同じ処理の流れであるが、負例の数の最大値の算出方法が異なる。まず、実施例2のコンフィギュレーションファイル111を説明した後、実施例2の負例の数の最大値の算出方法について説明する。
図20は、実施例2のコンフィギュレーションファイル111の一例を示す図である。
図20の左端の番号は行番号を示し、記号「#」に続く文字列はコメントを示す。
2行目から5行目はハードウェアに依存しないパラメータの値を定義する。具体的には、2行目のNSminは、負例の数の最小値を示すパラメータであり、3行目のNmaは、正例の演算の積和演算数を示すパラメータであり、4行目のwindowは、windowの数を示すパラメータであり、5行目のαは、学習率を示すパラメータである。図20では、NSminは3、Nmaは5e12、windowは3、αは0.025が設定されている。
8行目及び9行目はCPU101に関するパラメータの値を定義する。8行目のPcpuはCPU101の積和演算命令の並列度を示すパラメータであり、9行目のFcpuはCPU101のクロック周波数を示すパラメータである。図20では、Pcpuは8、Fcpuは3e9が設定されている。なお、Fcpuの単位はHzとしている。
12行目から14行目はFPGA1900に関するパラメータの値を定義する。12行目のNdspはFPGA1900のDSPブロック数を示すパラメータであり、13行目のFfgpaはFPGA1900のクロック周波数を示すパラメータであり、14行目のIIはFPGA1900のパイプライン開始間隔を示すパラメータである。図20では、Ndspは1024、Ffgpaは3e8、IIは1が設定されている。
なお、パイプライン開始間隔及びDSPブロック数は、FPGA用コンパイラの出力等で確認することができる。
以上が図20の説明である。
次に、実施例2の負例の数の最大値の算出方法について説明する。実施例2では、ニューラルネットワーク学習部110は、ステップS1002において、式(22)に基づいて、負例の数の最大値を算出する。
式(22)は、式(6)に示すCPU101による正例逐次処理の実行時間と、式(23)に示すFPGA1900による負例並列処理(パイプライン並列処理)の実行時間とが等しいと仮定した場合に導出される式である。
なお、パイプライン並列処理の実行時間を算出するための計算式は、非特許文献7に記載されている。
なお、式(22)に基づいて算出された値が整数でない場合、ニューラルネットワーク学習部110は、四捨五入、切り上げ、及び切り下げ等の処理を行って値を整数に変換する。
実施例2の配列初期化処理、CPU送信処理、スレッド生成処理、スレッド待合せ、CPU受信処理、及び配列加算処理は、実施例1と同一である。
なお、実施例2のOpenCLプログラム134のコンパイル処理は以下のようになる。図21は、実施例2のニューラルネットワーク学習部110が実行するコンパイル処理を説明する図である。
ニューラルネットワーク学習部110を実現するプログラムに含まれるコンパイラ2100は、OpenCLプログラム134をコンパイルすることによって、Verilog HDL等のハードウェア記述言語(HDL:Hardware Description Language)で記述されたHDLプログラム2110に変換する。コンパイラ2100は、例えば、非特許文献4に記載のFPGA用OpenCLコンパイラである。
さらに、ニューラルネットワーク学習部110を実現するプログラムに含まれる配置配線ツール2101は、HDLプログラム2110を、FPGA1900の回路及び配置構成を記述したFPGAプログラム2111に変換する。配置配線ツール2101は、例えば、非特許文献4に記載されているツール(例えば、Quartus II)である。FPGAプログラムはbitstreamとも呼ばれる。
このように、コンパイラ2100及び配置配線ツール2101によって、OpenCLプログラム134は、面積が小さく、高速、かつ、消費電力が低い回路から構成されるFPGA1900によるパイプライン並列処理を実現するためのFPGAプログラム2111に変換される。
以上が図21の説明である。
実施例2の正例の演算処理は実施例1と同一である。実施例2の負例の演算処理は一部処理が異なる。図22は、実施例2のアクセラレータ102が実行する負例の演算処理の一例を説明するフローチャートである。
アクセラレータ102は、変数iを初期化する(ステップS4001)。具体的には、変数iに0が設定される。
次に、アクセラレータ102は、変数iが入力単語数より小さいか否かを判定する(ステップS4002)。
変数iが入力単語数以上である場合、アクセラレータ102は負例の演算処理を終了する。
変数iが入力単語数より小さい場合、アクセラレータ102は、FPGA1900上の任意回路にてパイプライン処理を実行する(ステップS4003)。パイプライン処理の詳細は図23で説明する。
アクセラレータ102は、パイプライン処理の実行を開始した後にIIサイクル経過した場合、変数iに1を加算した値を、変数iに設定し(ステップS4004)、その後、ステップS4002に戻る。
上記のような処理によって、FPGA1900においてパイプライン並列処理を実行できる。
以上が図22の説明である。
図23は、実施例2のアクセラレータ102が実行するパイプライン処理の一例を説明するフローチャートである。
ステップS4101からステップS4107の処理は、ステップS3103からステップS3110の処理と同一である。ただし、ステップS4101において、変数jがwindowより大きい場合、アクセラレータ102は、パイプライン処理を終了する。
実施例2も実施例1と同様に、実用的な学習処理の時間で、高い推論精度のモデルを生成するための負例の数を決定することができる。
実施例3では、CPU101とは別に、マルチコアCPUをアクセラレータ102として利用する点が実施例1と異なる。以下、実施例1との差異を中心に実施例3について説明する。
実施例3の計算機システム10の構成は実施例1と同一である。実施例3では、アクセラレータ102としてマルチコアCPUを用いる。マルチコアCPUとしては、例えば、Intel XeonPhi(Intelは登録商標、以下同じ)である。この場合、CPU101及びアクセラレータ102は、Intel QuickPath InterConnect等の通信経路を介して互いに接続される。
実施例3の負例数算出処理は、実施例1と同じ処理の流れであるが、負例の数の最大値の算出方法が異なる。まず、実施例3のコンフィギュレーションファイル111を説明した後、実施例3の負例の数の最大値の算出方法について説明する。
図24は、実施例3のコンフィギュレーションファイル111の一例を示す図である。
図24の左端の番号は行番号を示し、記号「#」に続く文字列はコメントを示す。
2行目から5行目はハードウェアに依存しないパラメータの値を定義する。具体的には、2行目のNSminは、負例の数の最小値を示すパラメータであり、3行目のNmaは、正例の演算の積和演算数を示すパラメータであり、4行目のwindowは、windowの数を示すパラメータであり、5行目のαは、学習率を示すパラメータである。図24では、NSminは3、Nmaは5e12、windowは3、αは0.025が設定されている。
8行目及び9行目はCPU101に関するパラメータの値を定義する。8行目のPcpuはCPU101の積和演算命令の並列度を示すパラメータであり、9行目のFcpuはCPU101のクロック周波数を示すパラメータである。図24では、Pcpuは8、Fcpuは3e9が設定されている。なお、Fcpuの単位はHzとしている。
11行目から13行目はマルチコアCPUに関するパラメータの値を定義する。11行目のPmcpuはマルチコアCPUの積和演算命令の並列度を示すパラメータであり、12行目のNmcpucoreはマルチコアCPUの演算コアの数を示すパラメータであり、13行目のFmcpuはマルチコアCPUのクロック周波数を示すパラメータである。図24では、Pmcpuは4、Nmcpucoreは16、Fmcpuは2e9が設定されている。なお、Fmcpuの単位はHzとしている。
以上が図24の説明である。
次に、実施例3の負例の数の最大値の算出方法について説明する。実施例3では、ニューラルネットワーク学習部110は、ステップS1002において、式(24)に基づいて、負例の数の最大値を算出する。
式(24)は、式(6)に示すCPU101による正例逐次処理の実行時間と、式(25)に示すマルチコアCPUによる負例並列処理の実行時間とが等しいと仮定した場合に導出される式である。
なお、式(24)に基づいて算出された値が整数でない場合、ニューラルネットワーク学習部110は、四捨五入、切り上げ、及び切り下げ等の処理を行って値を整数に変換する。
実施例3の配列初期化処理、CPU送信処理、スレッド生成処理、スレッド待合せ、CPU受信処理、及び配列加算処理は、実施例1と同一である。
なお、実施例3のOpenCLプログラム134のコンパイル処理は以下のようになる。図25は、実施例3のニューラルネットワーク学習部110が実行するコンパイル処理を説明する図である。
ニューラルネットワーク学習部110を実現するプログラムに含まれるコンパイラ2500は、OpenCLプログラム134をコンパイルすることによって、マルチコアCPUが実行可能なマルチコアCPUプログラム2510に変換する。
コンパイラ2500は、マルチコアCPU用のコンパイラであって、例えば、非特許文献6に記載のコンパイラである。
以上が図25の説明である。
実施例3の正例の演算処理は実施例1と同一である。実施例3の負例の演算処理は実施例1と同一である。ただし、ステップS3101では、アクセラレータ102は、式(26)を用いて算出される値を変数iの初期値として設定する。また、ステップS3102では、アクセラレータ102は、変数iが式(27)の値より小さいか否かを判定する。
なお、マルチコアCPUの演算コアには0から(Nmcpucore−1)の範囲の整数の識別番号が割り当てられている。
実施例3も実施例1と同様に、実用的な学習処理の時間で、高い推論精度のモデルを生成するための負例の数を決定することができる。
なお、計算機100は、アクセラレータ102を備えず、複数の演算コアを有するCPU101(マルチコアCPU)のみを備える計算機であってもよい。この場合、ニューラルネットワーク学習部110は、マルチコアCPUの少なくとも一つの演算コアに正例の演算処理を実行させ、正例の演算を実行する演算コアとは異なる少なくとも一つの演算コアに負例の演算処理を実行させる。この場合も同様の制御を実現することができる。
なお、本発明は上記した実施例に限定されるものではなく、様々な変形例が含まれる。また、例えば、上記した実施例は本発明を分かりやすく説明するために構成を詳細に説明したものであり、必ずしも説明した全ての構成を備えるものに限定されるものではない。また、各実施例の構成の一部について、他の構成に追加、削除、置換することが可能である。
また、上記の各構成、機能、処理部、処理手段等は、それらの一部又は全部を、例えば集積回路で設計する等によりハードウェアで実現してもよい。また、本発明は、実施例の機能を実現するソフトウェアのプログラムコードによっても実現できる。この場合、プログラムコードを記録した記憶媒体をコンピュータに提供し、そのコンピュータが備えるプロセッサが記憶媒体に格納されたプログラムコードを読み出す。この場合、記憶媒体から読み出されたプログラムコード自体が前述した実施例の機能を実現することになり、そのプログラムコード自体、及びそれを記憶した記憶媒体は本発明を構成することになる。このようなプログラムコードを供給するための記憶媒体としては、例えば、フレキシブルディスク、CD−ROM、DVD−ROM、ハードディスク、SSD(Solid State Drive)、光ディスク、光磁気ディスク、CD−R、磁気テープ、不揮発性のメモリカード、ROMなどが用いられる。
また、本実施例に記載の機能を実現するプログラムコードは、例えば、アセンブラ、C/C++、perl、Shell、PHP、Python、Java(登録商標)等の広範囲のプログラム又はスクリプト言語で実装できる。
さらに、実施例の機能を実現するソフトウェアのプログラムコードを、ネットワークを介して配信することによって、それをコンピュータのハードディスクやメモリ等の記憶手段又はCD−RW、CD−R等の記憶媒体に格納し、コンピュータが備えるプロセッサが当該記憶手段や当該記憶媒体に格納されたプログラムコードを読み出して実行するようにしてもよい。
上述の実施例において、制御線や情報線は、説明上必要と考えられるものを示しており、製品上必ずしも全ての制御線や情報線を示しているとは限らない。全ての構成が相互に接続されていてもよい。
10 計算機システム
100 計算機
101 CPU
102 アクセラレータ
103 主記憶装置
104 副記憶装置
105 入出力装置
110 ニューラルネットワーク学習部
111 コンフィギュレーションファイル
112 ニューラルネットワーク情報
120 第1の重み配列
121 第2の重み配列
130 第1の一時配列
131 第2の一時配列
132 学習データ配列
133 Cプログラム
134 OpenCLプログラム
140 学習データ
200 GPU
201、1901 DRAM
202、1902 入出力インタフェース
300 ニューラルネットワーク
301 入力層
302 隠れ層
303 出力層
311、312 エッジ
1000、1001、2100、2500 コンパイラ
1010 CPUプログラム
1011 アクセラレータプログラム
1900 FPGA
2101 配置配線ツール
2110 HDLプログラム
2111 FPGAプログラム
2510 マルチコアCPUプログラム
100 計算機
101 CPU
102 アクセラレータ
103 主記憶装置
104 副記憶装置
105 入出力装置
110 ニューラルネットワーク学習部
111 コンフィギュレーションファイル
112 ニューラルネットワーク情報
120 第1の重み配列
121 第2の重み配列
130 第1の一時配列
131 第2の一時配列
132 学習データ配列
133 Cプログラム
134 OpenCLプログラム
140 学習データ
200 GPU
201、1901 DRAM
202、1902 入出力インタフェース
300 ニューラルネットワーク
301 入力層
302 隠れ層
303 出力層
311、312 エッジ
1000、1001、2100、2500 コンパイラ
1010 CPUプログラム
1011 アクセラレータプログラム
1900 FPGA
2101 配置配線ツール
2110 HDLプログラム
2111 FPGAプログラム
2510 マルチコアCPUプログラム
Claims (15)
- ネガティブサンプリング法を用いて、事象の予測を行うモデルを生成するための学習処理を実行する計算機システムであって、
複数の演算コア及び記憶装置を有する少なくとも一つの計算機と、
複数の学習データを用いて前記学習処理を実行する学習部と、
を備え、
前記学習部は、
正例演算を実行する前記演算コア及び負例演算を実行する前記演算コアの性能特性を示す性能情報を取得し、
前記性能情報に基づいて、前記負例演算における前記負例の数の最大値を算出し、
前記最大値に基づいて前記負例の数を決定し、
所定の数の正例となる前記学習データを用いた正例演算を少なくとも一つの前記演算コアに実行させ、前記決定された負例の数の、ランダムに選択された前記学習データを用いた前記負例演算を少なくとも一つの前記演算コアに実行させることによって前記モデルを生成することを特徴とする計算機システム。 - 請求項1に記載の計算機システムであって、
前記学習部は、前記正例演算に要する処理時間と前記負例演算に要する処理時間との差が最小となる前記負例のデータの数を、前記負例演算における前記負例のデータの数の最大値として算出することを特徴とする計算機システム。 - 請求項1に記載の計算機システムであって、
前記性能情報は、前記学習処理を制御するためのパラメータを格納するコンフィギュレーション情報に含まれることを特徴とする計算機システム。 - 請求項1に記載の計算機システムであって、
前記少なくとも一つの計算機は、少なくとも一つの前記演算コアを含む第1演算装置と、少なくとも一つの前記演算コアを含む第2演算装置とを備え、
前記学習部は、前記第1演算装置に前記正例演算を実行させ、前記第2演算装置に前記負例演算を実行させることを特徴とする計算機システム。 - 請求項4に記載の計算機システムであって、
前記第1演算装置は、CPUであり、
前記第2演算装置は、GPUを搭載するボード、FPGAを搭載するボード、及びCPUのいずれかであることを特徴とする計算機システム。 - 請求項1に記載の計算機システムであって、
前記複数の演算コアを含むCPUを備え、
前記学習部は、前記CPUに含まれる前記少なくとも一つの演算コアに前記正例演算を実行させ、前記CPUに含まれ、かつ、前記正例演算に割り当てられた前記少なくとも一つの演算コアとは異なる、前記少なくとも一つの演算コアに前記負例演算を実行させることを特徴とする計算機システム。 - 請求項1に記載の計算機システムであって、
前記計算機システムには、前記負例の数の最小値が設定され、
前記学習部は、前記決定された負例の数が前記負例の数の最小値より小さい場合、前記決定された負例の数を前記負例の数の最小値に修正することを特徴とする計算機システム。 - 計算機システムが実行する、ネガティブサンプリング法を用いて事象の予測を行うモデルを生成するための学習方法であって、
前記計算機システムは、複数の演算コア及び記憶装置を有する少なくとも一つの計算機と、複数の学習データを用いて前記モデルを生成するための学習処理を実行する学習部と、を有し、
前記学習方法は、
前記学習部が、正例演算を実行する前記演算コア及び負例演算を実行する前記演算コアの性能特性を示す性能情報を取得する第1のステップと、
前記学習部が、前記性能情報に基づいて、前記負例演算における前記負例の数の最大値を算出する第2のステップと、
前記学習部が、前記最大値に基づいて前記負例の数を決定する第3のステップと、
前記学習部が、所定の数の正例となる前記学習データを用いた正例演算を少なくとも一つの前記演算コアに実行させ、前記決定された負例の数の、ランダムに選択された前記学習データを用いた前記負例演算を少なくとも一つの前記演算コアに実行させることによって前記モデルを生成する第4のステップと、を含むことを特徴とする学習方法。 - 請求項8に記載の学習方法であって、
前記第2のステップは、前記学習部が、前記正例演算に要する処理時間と前記負例演算に要する処理時間との差が最小となる前記負例のデータの数を、前記負例演算における前記負例のデータの数の最大値として算出するステップを含むことを特徴とする学習方法。 - 請求項8に記載の学習方法であって、
前記性能情報は、前記学習処理を制御するためのパラメータを格納するコンフィギュレーション情報に含まれることを特徴とする学習方法。 - 請求項8に記載の学習方法であって、
前記少なくとも一つの計算機は、少なくとも一つの前記演算コアを含む第1演算装置と、少なくとも一つの前記演算コアを含む第2演算装置とを有し、
前記第4のステップは、
前記学習部が、前記第1演算装置に前記正例演算を実行させるステップと、
前記学習部が、前記第2演算装置に前記負例演算を実行させるステップと、を含むことを特徴とする学習方法。 - 請求項11に記載の学習方法であって、
前記第1演算装置は、CPUであり、
前記第2演算装置は、GPUを搭載するボード、FPGAを搭載するボード、及びCPUのいずれかであることを特徴とする学習方法。 - 請求項8に記載の学習方法であって、
前記少なくとも一つの計算機は、前記複数の演算コアを含むCPUを有し、
前記第4のステップは、
前記学習部が、前記CPUに含まれる前記少なくとも一つの演算コアに前記正例演算を実行させるステップと、
前記学習部が、前記CPUに含まれ、かつ、前記正例演算に割り当てられた前記少なくとも一つの演算コアとは異なる、前記少なくとも一つの演算コアに前記負例演算を実行させることを特徴とする学習方法。 - 請求項8に記載の学習方法であって、
前記計算機システムには、前記負例の数の最小値が設定され、
前記第3のステップは、前記決定された負例の数が前記負例の数の最小値より小さい場合、前記学習部が、前記決定された負例の数を前記負例の数の最小値に修正するステップを含むことを特徴とする学習方法。 - ネガティブサンプリング法を用いて、事象の予測を行うモデルを生成するための学習処理を実行する計算機に実行させるプログラムであって、
前記計算機は、複数の演算コア及び記憶装置を有し、
前記プログラムは、
正例演算を実行する前記演算コア及び負例演算を実行する前記演算コアの性能特性を示す性能情報を取得する手順と、
前記性能情報に基づいて、前記負例演算における前記負例の数の最大値を算出する手順と、
前記最大値に基づいて前記負例の数を決定する手順と、
所定の数の正例となる学習データを用いた正例演算を少なくとも一つの前記演算コアに実行させ、前記決定された負例の数の、ランダムに選択された前記学習データを用いた前記負例演算を少なくとも一つの前記演算コアに実行させることによって前記モデルを生成させる手順と、を前記計算機に実行させることを特徴とするプログラム。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2019192475A JP2021068136A (ja) | 2019-10-23 | 2019-10-23 | 計算機システム、学習方法、及びプログラム |
US17/071,025 US20210125103A1 (en) | 2019-10-23 | 2020-10-15 | Computer system, learning method, and program |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2019192475A JP2021068136A (ja) | 2019-10-23 | 2019-10-23 | 計算機システム、学習方法、及びプログラム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2021068136A true JP2021068136A (ja) | 2021-04-30 |
Family
ID=75587141
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2019192475A Pending JP2021068136A (ja) | 2019-10-23 | 2019-10-23 | 計算機システム、学習方法、及びプログラム |
Country Status (2)
Country | Link |
---|---|
US (1) | US20210125103A1 (ja) |
JP (1) | JP2021068136A (ja) |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2015192239A1 (en) * | 2014-06-20 | 2015-12-23 | Miovision Technologies Incorporated | Machine learning platform for performing large scale data analytics |
US20160071022A1 (en) * | 2014-09-04 | 2016-03-10 | International Business Machines Corporation | Machine Learning Model for Level-Based Categorization of Natural Language Parameters |
US20200272906A1 (en) * | 2017-11-07 | 2020-08-27 | Nec Corporation | Discriminant model generation device, discriminant model generation method, and discriminant model generation program |
CN109902708B (zh) * | 2018-12-29 | 2022-05-10 | 华为技术有限公司 | 一种推荐模型训练方法及相关装置 |
-
2019
- 2019-10-23 JP JP2019192475A patent/JP2021068136A/ja active Pending
-
2020
- 2020-10-15 US US17/071,025 patent/US20210125103A1/en not_active Abandoned
Also Published As
Publication number | Publication date |
---|---|
US20210125103A1 (en) | 2021-04-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Geiger et al. | Causal abstractions of neural networks | |
Lai et al. | HeteroCL: A multi-paradigm programming infrastructure for software-defined reconfigurable computing | |
Buluç et al. | The Combinatorial BLAS: Design, implementation, and applications | |
CN111339255B (zh) | 目标情感分析的方法、模型训练方法、介质和设备 | |
Lugowski et al. | A flexible open-source toolbox for scalable complex graph analysis | |
Venkat et al. | SWIRL: High-performance many-core CPU code generation for deep neural networks | |
JPWO2007096935A1 (ja) | プログラム解析方法、プログラム解析装置およびプログラム解析プログラム | |
CN113255328B (zh) | 语言模型的训练方法及应用方法 | |
Cano et al. | GPU-parallel subtree interpreter for genetic programming | |
Zhao et al. | Hardware compilation of deep neural networks: An overview | |
Benmeziane | Comparison of deep learning frameworks and compilers | |
Khouzami et al. | Model-based autotuning of discretization methods in numerical simulations of partial differential equations | |
Jessup et al. | Performance-based numerical solver selection in the Lighthouse framework | |
Bourez | Deep learning with Theano | |
JP2021068136A (ja) | 計算機システム、学習方法、及びプログラム | |
Marker et al. | Code generation and optimization of distributed-memory dense linear algebra kernels | |
Bai et al. | Gtco: Graph and tensor co-design for transformer-based image recognition on tensor cores | |
You et al. | Evaluating multi-core and many-core architectures through accelerating the three-dimensional Lax–Wendroff correction stencil | |
Gallez et al. | Hardware-software co-design of an FPGA-based transformer for embedded machine learning | |
Petrosanu et al. | Implementation solutions for deep learning neural networks targeting various application fields | |
Kochanek et al. | Improving Training Dataset Balance with ChatGPT Prompt Engineering | |
Chau et al. | Advances in dataflow systems | |
Ingebrigtsen et al. | CosmoAI: A study of gravitational lensing through simulation and machine learning | |
Erwig et al. | Parametric Fortran: Program generation in scientific computing | |
KR102694428B1 (ko) | 데이터 증강 방법 및 이를 이용한 양성 에피토프 예측 모델 생성 방법 |