Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo

1

GPU上でのNLP向け深層学習
の実装について
(株)Preferred Infrastructure
海野  裕也

2

概要
l  データごとに構造の異異なる⾃自然⾔言語処理理の様な
分野で、効率率率的な学習をするにはどうすればよ
いか?
l  論論⽂文ベースで幾つかの⼯工夫を紹介
2

3

確率率率的勾配降降下法
until converge:
for x, y in trianing data:
grad = calc_grad(x, y)
update(w, grad)
3	
こちらの並列列化は限度度がある
こちらの並列列度度を上げる

4

ミニバッチ並列列化
until converge:
for {x, y} in trianing data:
grad = calc_grad({x, y})
update(w, grad)
4	
⼀一度度にたくさん計算する
並列列に計算できる

5

ミニバッチの勾配計算の例例(SVM)
Lhinge(yxTw)
l  W ∈ RD
l  x ∈ RD
l  y ∈ {-1, 1}
l  Lhinge: R à R
5	
∑ Lhinge(y⦿(xTw))
l  W ∈ RD
l  x ∈ R{B, D}
l  y ∈ {-1, 1}B
l  Lhinge: RB à RB
Bはミニバッチサイズ	
⾏行行列列計算ライブラリに並列列化を押し込む

6

⾔言語処理理でのミニバッチ並列列化の問題
l = 0
for x, y in sentence:
l = l + dot(softmax(dot(W, h)), y)
c, h = LSTM(c, h, x)
6	
ループ回数がデータ依存

7

ミニバッチ並列列(Bunch training)
l  複数⽂文をいっぺんに学習
l  ⽂文⻑⾧長の差分はNULL(特別な記号)で埋めてごまかす
7

8

NULL埋めによる無駄
8	
l  ⽂文⻑⾧長はガンマ分布に従うとして[古橋12]、複数サンプリ
ングした中で最⼤大⻑⾧長に合わせた時の計算効率率率をプロット
0
0.2
0.4
0.6
0.8
1
1.2
1 2 4 8 16 32 64 128 256

9

Sentence splicing [Chen+14]
l  NULLで埋めずに、次々に⽂文を処理理する
l  実装は単純ではない気がするが
9

10

Splicingの効果
l  Splicingしないと、50並列列程度度で性能は頭打ち
10

11

Pipeline [Chen+15]
l  層ごとにGPUが担当して、層が深くなるごとに別GPUが
計算を⾏行行う
11

12

短いチャンクに切切る[Doetsch+14]
l  単に短いチャンクに切切って並列列度度を上げる
l  NULLの量量も減る
l  本当に⻑⾧長い依存は学習できなくなる
12

13

計算グラフを解析 [Hwang+15]
l  計算グラフを強連結成分分解
l  Recurrentの部分は1つの強連結成分に押し込める
l  各強連結成分ごとに並列列計算する
13

14

⾃自動並列列化の効果
l  単⼀一ストリームでもスループット向上
l  ストリーム数が増えると性能は変わらない
14

15

おまけ:Bucketing
l  予め幾つかの⽂文⻑⾧長⽤用のネットワークを⽤用意して、
処理理データが収まる最⼩小のネットワークを利利⽤用
する
l  TensorFlowで使われている
15

16

並列列化の⼯工夫まとめ
l  ゼロ埋め
l  ⽂文⻑⾧長の違うデータに0を埋めて、無理理やり計算
l  スプライシング
l  ストリームごとに次々データを流流す
l  パイプライン
l  層ごとに別GPUを割り当ててスループットを稼ぐ
l  チャンク
l  ⽂文を無理理やり切切って⽂文⻑⾧長の差を緩和
l  グラフ解析
l  計算系列列中の独⽴立立部分を抽出して⾃自動割当
16

17

この辺から本題
l  今までみたのは全てシンプルなRecurrentだった
ので、基本的に⽂文⻑⾧長(EOSのタイミング)しか
違いがない
l  より複雑なネットワークの並列列処理理には更更に⼯工
夫が必要
l  Encoder-decoderモデル
l  Recursive neural network
l  Attentionモデル系
l  Memory networks系
17

18

並列列化のレベル
l  GPUデバイス内
l  SIMD, メモリ, スレッド, カーネル
l  メモリ帯域: ~1TB/sec
l  GPUデバイス間(マルチGPU)
l  PCI-ex (~100GB/sec)
l  マシン間
l  InfiniBand (~50GB/sec), Ethernet (~1GB/sec)
18

19

バッチ  vs オンライン
l  ミニバッチサイズを増やしても実時間での精度度
向上が早くなってないように感じる
l  バッチ学習とオンライン学習と同じ議論論
l  更更新頻度度をあげようとすると、CPUの⽅方が有利利
な可能性は無いか?
19

20

実装レベルで⽐比較

21

⽬目についた実装を調査
l  Embedding
l  Recurrent
l  Recursive
21

22

Embedding
l  word2vec
l  CPU実装、スレッドで並列列化、ロックしないで更更新(ミニバッ
チにはしていない)、勾配を陽に持たない
l  gensim
l  Python実装、Cythonで⾼高速化
l  Polyglot2
l  Python実装、Cythonとblasで⾼高速化
l  Chainer (word2vec example)
l  Python実装、cupyでGPUサポート、ミニバッチ
22

23

Recurrent
l  theano-rnn
l  Python実装、theanoでGPU、batchsizeでchunkを作る
l  Passage
l  Python実装、theanoでGPU、iteratorでミニバッチを作り、
余ったところはゼロ埋め
l  DL4J (rnn example)
l  Java実装、ND4JでGPU、iteratorでミニバッチを作り、
batchsizeでchunkを作る
l  Chainer (ptb example)
l  Python実装、CuPyでGPU、batchsizeでchunkを作る
23

24

Recursive
l  Stanford core nlp
l  Java実装、再帰関数で実装、ミニバッチしていない
l  deep-recursive
l  C++実装、Eigen利利⽤用、データ単位で処理理(ミニバッチしていな
い)
l  RecursiveNeuralTensorNetwork
l  Python実装、theano利利⽤用、Treeをstack操作に変換してから学
習しているがミニバッチしていなさそう
l  Chainer (sentiment example)
l  Python実装、CuPyでGPU、再帰関数で実装、ミニバッチして
いない
24

More Related Content

GPU上でのNLP向け深層学習の実装について