jupyter notebookとchainerで楽々deep learning

54
Jupyter Notebook と Chainer ととと Deep Learning とととと Engineer at Alpaca 16/4/16 SoftLayer Bluemix Community Festa 2016

Upload: jun-ya-norimatsu

Post on 21-Apr-2017

8.799 views

Category:

Engineering


5 download

TRANSCRIPT

Page 1: Jupyter NotebookとChainerで楽々Deep Learning

Jupyter Notebookと Chainerで楽々Deep Learning

乗松潤矢Engineer at Alpaca

2016/4/16 SoftLayer Bluemix Community Festa 2016

Page 2: Jupyter NotebookとChainerで楽々Deep Learning

2

自己紹介

乗松潤矢 (Jun-ya Norimatsu)

Engineer @ Alpaca

専門 : 自然言語処理統計的機械翻訳統計的言語モデル

3月に博士号をとったばかりのペーペーです

フリーランス今日の肩書き

Page 3: Jupyter NotebookとChainerで楽々Deep Learning

3

Capitalico

https://www.capitalico.com/

Deep Learningによる投資アルゴリズム学習

こんなの作ってます

Page 4: Jupyter NotebookとChainerで楽々Deep Learning

4

Deep Learningで投資アルゴリズム学習 ?投資家には、それぞれ思い描いているパターンがある

自分が思っているパターンが来たらお知らせしてほしい

Page 5: Jupyter NotebookとChainerで楽々Deep Learning

5

Deep Learningで投資アルゴリズム学習 ?これらはすべて同じパターンとして検出したい 実例から機械学習

Page 6: Jupyter NotebookとChainerで楽々Deep Learning

6

与えられた実例からパターンを学習

Page 7: Jupyter NotebookとChainerで楽々Deep Learning

7

今日のお話をきくとお得な人たちDeep Learningやってみたいけど腰が重い人

Deep Learning Framework入れてみたけど、「…で?」となった人過去にやった検証のどれがなにだかわからなくなりがちな人

逆に、時間の無駄になるかもしれない人たちChainerマスターな人Jupyter Notebookマスターな人

Page 8: Jupyter NotebookとChainerで楽々Deep Learning

8

本日の内容• 第 1部

• Alpacaにおける Chainer + Jupyter Notebook環境• 第 2部

• Jupyter Notebookで Deep Learningをやってみる• (Chainer入門 )

Page 9: Jupyter NotebookとChainerで楽々Deep Learning

9

AlpacaにおけるJupyter Notebook + Chainer環境

第 1部

Page 10: Jupyter NotebookとChainerで楽々Deep Learning

10

本題の前に…Alpacaにおける Softlayerの利用Alpacaでは開発に Dockerをフル活用

SoftlayerさまサーバーDocker

Webサーバ DBサーバ Jobサーバ

DockerWebサーバ DBサーバ Jobサーバ

DockerWebサーバ DBサーバ Jobサーバ

Aさん用環境

Bさん用環境

Cさん用環境

=container

各環境内で閉じたネットワーク

Page 11: Jupyter NotebookとChainerで楽々Deep Learning

11

本題の前に…Alpacaにおける Softlayerの利用

SoftlayerさまサーバーDocker

Webサーバ DBサーバ Jobサーバ

DockerWebサーバ DBサーバ Jobサーバ

Aさん用環境

Bさん用環境

=container

一台のサーバーで複数人が同時開発可能ポイント : Networkがコンテナ内で独立

Softlayerサーバーをフル活用

Page 12: Jupyter NotebookとChainerで楽々Deep Learning

12

本題の前に…Alpacaにおける Softlayerの利用

Softlayerさまサーバー

Tesla K80

Tesla K80

Docker

検証用環境も Dockerで構築

Chainer +Jupyter Notebook

Docker内から GPUにアクセスできるよう設定

Page 13: Jupyter NotebookとChainerで楽々Deep Learning

13

本題なぜ Jupyter Notebookなのか

「前にやったあの実験どうなったんだっけ」「あのとき、ここのパラメータどうしたんだっけ」「前はうまくいったはずだったんだけど…」

Notebook導入前の悩み

「これから新しく来る人に今までやってきた知見をどう伝えよう」Notebookのいいところ

実験の手順を残せるコードと一緒に実験結果のグラフ・表を保存できるGitHubにアップロードすると実験結果への permalinkができる

Page 14: Jupyter NotebookとChainerで楽々Deep Learning

14

Jupyter Notebook

旧 IPython Notebook

Pythonだけじゃなくなったので名前変更ノートブック形式でプログラムを実行・結果を保存

Page 15: Jupyter NotebookとChainerで楽々Deep Learning

15

Notebook形式?ノートに書き込んでいるかのように対話的なプログラム実行

Markdown

Pythonコード

Page 16: Jupyter NotebookとChainerで楽々Deep Learning

16

Notebookファイルを GitHubに上げるとそのまま見える記録・参照・共有に便利

Page 17: Jupyter NotebookとChainerで楽々Deep Learning

17

Chainer

日本発の Deep Learning Framework

Networkをダイナミックに書き換えられる数ある Frameworkの中で一番書きやすい ( )※

( )※ 個人の感想です

Page 18: Jupyter NotebookとChainerで楽々Deep Learning

18

Jupyter Notebook + Chainer

Notebook中で importして使うだけ

GPUも問題なく使える

Page 19: Jupyter NotebookとChainerで楽々Deep Learning

19

Alpacaでの Jupyter Notebookの利用例トレーニングの進捗をその場で可視化

training dataに対する lossを可視化横軸 : 正解データの値縦軸 : 推定データの値

training lossの反復に対する変化横軸 : 反復回数縦軸 : lossの値 (average)

Page 20: Jupyter NotebookとChainerで楽々Deep Learning

20

Alpacaでの Jupyter Notebookの利用例シグナルの出方を Notebook上で可視化

シグナル

Page 21: Jupyter NotebookとChainerで楽々Deep Learning

21

Notebookの運用 (試行錯誤中 )タスク管理との連動

Notebookの URL

Page 22: Jupyter NotebookとChainerで楽々Deep Learning

22

Notebookの運用 (試行錯誤中 )

失敗した実験はどう保存する?全部保存していたら大量の Notebookが溢れてしまう

( 暫定作 ) Pull Requestを出してマージしない

PRから辿れば Notebookを参照できる

Page 23: Jupyter NotebookとChainerで楽々Deep Learning

23

Jupyter Notebook Tips

Pythonでやるよりコマンド叩いた方が速いんだけど“%%bash” で bashが使える

Page 24: Jupyter NotebookとChainerで楽々Deep Learning

24

Jupyter Notebook Tips

時間を計りたい“%%time” で実行時間を測定できる

Page 25: Jupyter NotebookとChainerで楽々Deep Learning

25

Jupyter Notebook Tipsもっとインタラクティブにグラフを見たいんだけど

plotlyが便利

ただし GitHubからは見えなくなる

マウスオンで値が見える

拡大できる

Page 26: Jupyter NotebookとChainerで楽々Deep Learning

26

第 1部まとめ• Jupyter Notebookで Chainerつかえる• Jupyter Notebookで実験を保存

• その場でグラフ作って結果確認• GitHubと相性良い• GitHubが実験に permalinkをくれる

• チームメンバー全員が実験結果にアクセス可• タスク管理ツールと連動すると後から参照しやすい

Page 27: Jupyter NotebookとChainerで楽々Deep Learning

27

Jupyter NotebookでDeep Learningをやってみる(Chainer入門 )

第 2部

Page 28: Jupyter NotebookとChainerで楽々Deep Learning

28

やってみようJupyter Notebookのインストールいろんな方法があります

多分一番楽なのは anaconda

chainerのインストールpip install chainer

Notebookから pipできる

Page 29: Jupyter NotebookとChainerで楽々Deep Learning

29

Demo

走れメロスっぽい文ジェネレータ実際に、やってみた

Deep Learningで「走れメロス」の文体を学習学習した文体で文を生成

Page 30: Jupyter NotebookとChainerで楽々Deep Learning

30

走れメロスっぽい文ジェネレータ実行例

Page 31: Jupyter NotebookとChainerで楽々Deep Learning

31

走れメロスっぽい文ジェネレータうまくいかなかった文

走れメロス本文に出てくる文

なんかおかしい文

Page 32: Jupyter NotebookとChainerで楽々Deep Learning

32

Jupyter Notebookのイロハ

%matplotlib inline%load_ext autoreload%autoreload 2

とりあえずこれを実行しておきましょう

%matplotlib inline

図を Notebook上に表示%load_ext autoreload%autoreload 2

importしたライブラリが更新されると自動的にリロードしてくれる

Page 33: Jupyter NotebookとChainerで楽々Deep Learning

33

モデルを作ろうやりたいこと : 文を生成したい

生成モデルがいいよね

文 ( 単語列 )を とするを与えるモデルがあれば文をサンプリングできる

Page 34: Jupyter NotebookとChainerで楽々Deep Learning

34

よくある式変形

を Deep Learningでモデル化しましょう

なので

Page 35: Jupyter NotebookとChainerで楽々Deep Learning

35

今回のモデル

LSTM

LSTM

Fully Connected

EmbedID

Softmax

Chainerの exampleとほぼ同一

https://github.com/pfnet/chainer/blob/master/examples/ptb

単語を高次元空間の位置に変換

過去の単語と今回の単語を組み合わせて文脈をベクトル化

ベクトルを確率分布に変換

Page 36: Jupyter NotebookとChainerで楽々Deep Learning

36

今回のモデル

LSTM

LSTM

Fully Connected

EmbedID

Softmax

LSTM

LSTM

Fully Connected

EmbedID

Softmax

LSTM

LSTM

Fully Connected

EmbedID

Softmax

Page 37: Jupyter NotebookとChainerで楽々Deep Learning

37

Modelを書こう – 全体像 – class LM(Chain): def __init__(self, n_vocab): super(LM, self).__init__( embed=L.EmbedID(n_vocab, 100), lstm1=L.LSTM(100, 50), lstm2=L.LSTM(50, 50), out=L.Linear(50, n_vocab), ) self.n_vocab = n_vocab self.dropout_ratio = 0.5 self.train = False self.softmax = lambda x: x def reset_state(self): self.lstm1.reset_state() self.lstm2.reset_state() def __call__(self, x): h = self.embed(x) h = self.lstm1(h) h = F.dropout(h, ratio=self.dropout_ratio, train=self.train) h = self.lstm2(h) h = F.dropout(h, ratio=self.dropout_ratio, train=self.train) y = self.out(h) y = self.softmax(y) return y

LSTM

LSTM

Fully Connected

EmbedID

(Softmax)

例えばこんな感じ

Page 38: Jupyter NotebookとChainerで楽々Deep Learning

38

Modelを書こう – レイヤー定義 –

class LM(Chain): def __init__(self, n_vocab): super(LM, self).__init__( embed=L.EmbedID(n_vocab, 100), lstm1=L.LSTM(100, 50), lstm2=L.LSTM(50, 50), out=L.Linear(50, n_vocab), )

LSTM

LSTM

Fully Connected

EmbedID

(Softmax)

パラメータを持つレイヤーの定義

レイヤーは link.Chainが管理Point!

dropout, softmaxはパラメータを持たない

Page 39: Jupyter NotebookとChainerで楽々Deep Learning

39

Modelを書こう – 確率分布計算 –

def __call__(self, x): h = self.embed(x) h = self.lstm1(h) h = F.dropout(h, ratio=self.dropout_ratio, train=self.train) h = self.lstm2(h) h = F.dropout(h, ratio=self.dropout_ratio, train=self.train) y = self.out(h) y = self.softmax(y) return y

LSTM

LSTM

Fully Connected

EmbedID

(Softmax)

レイヤーを順に並べるだけ

たまに dropoutを入れるといい感じに学習するPoint!

( 詳細は略 )

Page 40: Jupyter NotebookとChainerで楽々Deep Learning

40

学習しようモデルを作っただけではだめ

適切なモデルパラメータを学習しないと使えないモデルパラメータはどうやって学習する?学習データをうまく表現するパラメータを探すモデルと学習データのズレ

(training) lossと言いますlossができるだけ小さくなるようにモデルパラメータを設定

最適化と言います

Page 41: Jupyter NotebookとChainerで楽々Deep Learning

41

学習しようモデルパラーメタの学習

lossが小さくなるようにモデルのパラメータを少しずつ動かす作業

Page 42: Jupyter NotebookとChainerで楽々Deep Learning

42

学習 [Step 1]モデルから分類器を作る

classifier = links.Classifier(lm)lm = LM(len(vocab))

次の 1 単語を予測正解・不正解を判定LSTM

LSTM

Fully Connected

EmbedID

(Softmax)

LM

lossclassifier( , ): 「どういう風に当たり / 外れたか」を返す

Page 43: Jupyter NotebookとChainerで楽々Deep Learning

43

変数の取り扱いclassifier( , )

ってどう扱う?って書いたけど、

Variableクラスを使いましょう !!

Variable( の単語 ID, volatile=...)使い方volatileに与える値 ( 典型的な使い方の場合 )

学習時 : False, テスト時 : True

Page 44: Jupyter NotebookとChainerで楽々Deep Learning

44

値の持ち方通常、複数の文を一度に処理します

文 1文 2文 3

ID(w11) ID(w12) ID(w13) … ID(w1m)

ID(w21) ID(w22) ID(w23) … ID(w2m)

ID(w31) ID(w32) ID(w33) … ID(w3m)

… … … … …

1 単語目 2 単語目 3 単語目 m 単語目…

ID(w): 単語 wの単語 IDを返す関数wij: 文 iの j番目の単語 , 文長が j 未満の場合特殊単語 </s>m: データに含まれる文の最大文長 +1

このとき、 は Variable(id_vec[:, i], volatile=...)

id_vec =

Page 45: Jupyter NotebookとChainerで楽々Deep Learning

45

学習 [Step 2]lossの計算学習用データを 1回なめる関数一単語ずつ、予測・当たり / 外れ情報が変数 lossに溜まっていく

Page 46: Jupyter NotebookとChainerで楽々Deep Learning

46

学習 [Step 3-1]パラメータの最適化Optimizerを使う

opt = optimizers.AdaDelta()opt.setup(classifier)opt.add_hook(optimizer.GradientClipping(5))

optimizers.AdaDelta()optimizerの手法。他にもいろいろある。経験的にはどれを使ってもあんまり変わらないoptimizers.SGDは玄人向き

最適化対象を設定opt.setup(classifier)

値の爆発を抑制opt.add_hook(optimizer.GradientClipping(5))

( 細かい向き・不向きはある )

Page 47: Jupyter NotebookとChainerで楽々Deep Learning

47

学習 [Step 3-2]パラメータの最適化

lm.reset_state()opt.zero_grads()

loss = forward_all(id_vec, classifier, train=True)

loss.backward()opt.update()

学習用データを 1回なめて、パラメータを更新初期化

2 つ前のスライドで作った関数

当たり外れの情報からパラメータを更新

この処理を何度も何度も繰り返す

Page 48: Jupyter NotebookとChainerで楽々Deep Learning

48

学習の様子をグラフで見る単に Plotしたいときは、 pandas.DataFrameを経由するのが便利

Page 49: Jupyter NotebookとChainerで楽々Deep Learning

49

最適化処理は何をやっているのかデータを一回なめる (forward)

パラメータをどっちに動かすと lossが小さくなるか計算 (backward)

正解との誤差を計算できる

その方向にちょっとだけずらす (update)

Variable.gradに結果を蓄積

変数 lossに結果を蓄積

実は変数 lossを各パラメータで偏微分しているだけ

Page 50: Jupyter NotebookとChainerで楽々Deep Learning

50

出来上がったモデルを使ってみよう適当に文をサンプリング文をサンプルする関数

Page 51: Jupyter NotebookとChainerで楽々Deep Learning

51

補足GPUを使おうCPUで計算すると重いchainerの場合 :

データを GPUに転送すればあとは勝手にやってくれる転送方法

numpy 配列 : chainer.cuda.to_gpu(value)

Variable: variable.to_gpu()

Chain: model.to_gpu()

Page 52: Jupyter NotebookとChainerで楽々Deep Learning

52

補足注意 : マルチ GPU

GPUを複数積んでいるサーバーの場合データとモデルのデータは同じ GPU内メモリに置く

置き場所を間違えた時 :

classifier.to_gpu(1)

GPUを指定する方法 1: to_gpuで指定する

GPUを指定する方法 2: withブロックで指定するwith cupy.cuda.Device(1): ...

Page 53: Jupyter NotebookとChainerで楽々Deep Learning

53

第 2部まとめ

ね、簡単でしょう?

Page 54: Jupyter NotebookとChainerで楽々Deep Learning

54

まとめ• Jupyter Notebook + Chainerでお手軽 Deep Learningできる• GitHubとの連携で後からの参照もばっちり• Chainerは難しくない!【 PR 】Capitalico使ってね