Jupyter NotebookとChainerで楽々Deep Learning
-
Upload
jun-ya-norimatsu -
Category
Engineering
-
view
7.878 -
download
1
Transcript of Jupyter NotebookとChainerで楽々Deep Learning
Jupyter Notebookと Chainerで楽々Deep Learning
乗松潤矢Engineer at Alpaca
2016/4/16 SoftLayer Bluemix Community Festa 2016
2
自己紹介
乗松潤矢 (Jun-ya Norimatsu)
Engineer @ Alpaca
専門 : 自然言語処理統計的機械翻訳統計的言語モデル
3月に博士号をとったばかりのペーペーです
フリーランス今日の肩書き
3
Capitalico
https://www.capitalico.com/
Deep Learningによる投資アルゴリズム学習
こんなの作ってます
4
Deep Learningで投資アルゴリズム学習 ?投資家には、それぞれ思い描いているパターンがある
自分が思っているパターンが来たらお知らせしてほしい
5
Deep Learningで投資アルゴリズム学習 ?これらはすべて同じパターンとして検出したい 実例から機械学習
6
与えられた実例からパターンを学習
7
今日のお話をきくとお得な人たちDeep Learningやってみたいけど腰が重い人
Deep Learning Framework入れてみたけど、「…で?」となった人過去にやった検証のどれがなにだかわからなくなりがちな人
逆に、時間の無駄になるかもしれない人たちChainerマスターな人Jupyter Notebookマスターな人
8
本日の内容• 第 1部
• Alpacaにおける Chainer + Jupyter Notebook環境• 第 2部
• Jupyter Notebookで Deep Learningをやってみる• (Chainer入門 )
9
AlpacaにおけるJupyter Notebook + Chainer環境
第 1部
10
本題の前に…Alpacaにおける Softlayerの利用Alpacaでは開発に Dockerをフル活用
SoftlayerさまサーバーDocker
Webサーバ DBサーバ Jobサーバ
DockerWebサーバ DBサーバ Jobサーバ
DockerWebサーバ DBサーバ Jobサーバ
Aさん用環境
Bさん用環境
Cさん用環境
=container
各環境内で閉じたネットワーク
11
本題の前に…Alpacaにおける Softlayerの利用
SoftlayerさまサーバーDocker
Webサーバ DBサーバ Jobサーバ
DockerWebサーバ DBサーバ Jobサーバ
Aさん用環境
Bさん用環境
=container
一台のサーバーで複数人が同時開発可能ポイント : Networkがコンテナ内で独立
Softlayerサーバーをフル活用
12
本題の前に…Alpacaにおける Softlayerの利用
Softlayerさまサーバー
Tesla K80
Tesla K80
Docker
検証用環境も Dockerで構築
Chainer +Jupyter Notebook
Docker内から GPUにアクセスできるよう設定
13
本題なぜ Jupyter Notebookなのか
「前にやったあの実験どうなったんだっけ」「あのとき、ここのパラメータどうしたんだっけ」「前はうまくいったはずだったんだけど…」
Notebook導入前の悩み
「これから新しく来る人に今までやってきた知見をどう伝えよう」Notebookのいいところ
実験の手順を残せるコードと一緒に実験結果のグラフ・表を保存できるGitHubにアップロードすると実験結果への permalinkができる
14
Jupyter Notebook
旧 IPython Notebook
Pythonだけじゃなくなったので名前変更ノートブック形式でプログラムを実行・結果を保存
15
Notebook形式?ノートに書き込んでいるかのように対話的なプログラム実行
Markdown
Pythonコード
16
Notebookファイルを GitHubに上げるとそのまま見える記録・参照・共有に便利
17
Chainer
日本発の Deep Learning Framework
Networkをダイナミックに書き換えられる数ある Frameworkの中で一番書きやすい ( )※
( )※ 個人の感想です
18
Jupyter Notebook + Chainer
Notebook中で importして使うだけ
GPUも問題なく使える
19
Alpacaでの Jupyter Notebookの利用例トレーニングの進捗をその場で可視化
training dataに対する lossを可視化横軸 : 正解データの値縦軸 : 推定データの値
training lossの反復に対する変化横軸 : 反復回数縦軸 : lossの値 (average)
20
Alpacaでの Jupyter Notebookの利用例シグナルの出方を Notebook上で可視化
シグナル
21
Notebookの運用 (試行錯誤中 )タスク管理との連動
Notebookの URL
22
Notebookの運用 (試行錯誤中 )
失敗した実験はどう保存する?全部保存していたら大量の Notebookが溢れてしまう
( 暫定作 ) Pull Requestを出してマージしない
PRから辿れば Notebookを参照できる
23
Jupyter Notebook Tips
Pythonでやるよりコマンド叩いた方が速いんだけど“%%bash” で bashが使える
24
Jupyter Notebook Tips
時間を計りたい“%%time” で実行時間を測定できる
25
Jupyter Notebook Tipsもっとインタラクティブにグラフを見たいんだけど
plotlyが便利
ただし GitHubからは見えなくなる
マウスオンで値が見える
拡大できる
26
第 1部まとめ• Jupyter Notebookで Chainerつかえる• Jupyter Notebookで実験を保存
• その場でグラフ作って結果確認• GitHubと相性良い• GitHubが実験に permalinkをくれる
• チームメンバー全員が実験結果にアクセス可• タスク管理ツールと連動すると後から参照しやすい
27
Jupyter NotebookでDeep Learningをやってみる(Chainer入門 )
第 2部
28
やってみようJupyter Notebookのインストールいろんな方法があります
多分一番楽なのは anaconda
chainerのインストールpip install chainer
Notebookから pipできる
29
Demo
走れメロスっぽい文ジェネレータ実際に、やってみた
Deep Learningで「走れメロス」の文体を学習学習した文体で文を生成
30
走れメロスっぽい文ジェネレータ実行例
31
走れメロスっぽい文ジェネレータうまくいかなかった文
走れメロス本文に出てくる文
なんかおかしい文
32
Jupyter Notebookのイロハ
%matplotlib inline%load_ext autoreload%autoreload 2
とりあえずこれを実行しておきましょう
%matplotlib inline
図を Notebook上に表示%load_ext autoreload%autoreload 2
importしたライブラリが更新されると自動的にリロードしてくれる
33
モデルを作ろうやりたいこと : 文を生成したい
生成モデルがいいよね
文 ( 単語列 )を とするを与えるモデルがあれば文をサンプリングできる
34
よくある式変形
を Deep Learningでモデル化しましょう
なので
35
今回のモデル
LSTM
LSTM
Fully Connected
EmbedID
Softmax
Chainerの exampleとほぼ同一
https://github.com/pfnet/chainer/blob/master/examples/ptb
単語を高次元空間の位置に変換
過去の単語と今回の単語を組み合わせて文脈をベクトル化
ベクトルを確率分布に変換
36
今回のモデル
LSTM
LSTM
Fully Connected
EmbedID
Softmax
LSTM
LSTM
Fully Connected
EmbedID
Softmax
LSTM
LSTM
Fully Connected
EmbedID
Softmax
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)
例えばこんな感じ
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はパラメータを持たない
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!
( 詳細は略 )
40
学習しようモデルを作っただけではだめ
適切なモデルパラメータを学習しないと使えないモデルパラメータはどうやって学習する?学習データをうまく表現するパラメータを探すモデルと学習データのズレ
(training) lossと言いますlossができるだけ小さくなるようにモデルパラメータを設定
最適化と言います
41
学習しようモデルパラーメタの学習
lossが小さくなるようにモデルのパラメータを少しずつ動かす作業
42
学習 [Step 1]モデルから分類器を作る
classifier = links.Classifier(lm)lm = LM(len(vocab))
次の 1 単語を予測正解・不正解を判定LSTM
LSTM
Fully Connected
EmbedID
(Softmax)
LM
lossclassifier( , ): 「どういう風に当たり / 外れたか」を返す
43
変数の取り扱いclassifier( , )
ってどう扱う?って書いたけど、
Variableクラスを使いましょう !!
Variable( の単語 ID, volatile=...)使い方volatileに与える値 ( 典型的な使い方の場合 )
学習時 : False, テスト時 : True
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 =
45
学習 [Step 2]lossの計算学習用データを 1回なめる関数一単語ずつ、予測・当たり / 外れ情報が変数 lossに溜まっていく
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))
( 細かい向き・不向きはある )
47
学習 [Step 3-2]パラメータの最適化
lm.reset_state()opt.zero_grads()
loss = forward_all(id_vec, classifier, train=True)
loss.backward()opt.update()
学習用データを 1回なめて、パラメータを更新初期化
2 つ前のスライドで作った関数
当たり外れの情報からパラメータを更新
この処理を何度も何度も繰り返す
48
学習の様子をグラフで見る単に Plotしたいときは、 pandas.DataFrameを経由するのが便利
49
最適化処理は何をやっているのかデータを一回なめる (forward)
パラメータをどっちに動かすと lossが小さくなるか計算 (backward)
正解との誤差を計算できる
その方向にちょっとだけずらす (update)
Variable.gradに結果を蓄積
変数 lossに結果を蓄積
実は変数 lossを各パラメータで偏微分しているだけ
50
出来上がったモデルを使ってみよう適当に文をサンプリング文をサンプルする関数
51
補足GPUを使おうCPUで計算すると重いchainerの場合 :
データを GPUに転送すればあとは勝手にやってくれる転送方法
numpy 配列 : chainer.cuda.to_gpu(value)
Variable: variable.to_gpu()
Chain: model.to_gpu()
52
補足注意 : マルチ GPU
GPUを複数積んでいるサーバーの場合データとモデルのデータは同じ GPU内メモリに置く
置き場所を間違えた時 :
classifier.to_gpu(1)
GPUを指定する方法 1: to_gpuで指定する
GPUを指定する方法 2: withブロックで指定するwith cupy.cuda.Device(1): ...
53
第 2部まとめ
ね、簡単でしょう?
54
まとめ• Jupyter Notebook + Chainerでお手軽 Deep Learningできる• GitHubとの連携で後からの参照もばっちり• Chainerは難しくない!【 PR 】Capitalico使ってね