「深層学習」勉強会lt資料 "chainer使ってみた"

38
Chainer使ってみた @kenmatsu4 2015.8.5 機械学習プロフェッショナルシリーズ輪読会 #4 Lightning Talk  

Upload: kenichi-matsui

Post on 21-Apr-2017

9.632 views

Category:

Data & Analytics


0 download

TRANSCRIPT

Chainer使ってみた

@kenmatsu42015.8.5

機械学習プロフェッショナルシリーズ輪読会 #4 Lightning Talk  

自己紹介・Twitterアカウント    @kenmatsu4 ・Qiitaでブログを書いています(統計、機械学習、Python等)    http://qiita.com/kenmatsu4    (2500 contributionを超えました!)

・趣味    - バンドでベースを弾いたりしています。    - 主に東南アジアへバックパック旅行に行ったりします    (カンボジア、ミャンマー、バングラデシュ、新疆ウイグル自治区 etc) 旅行の写真 : http://matsu-ken.jimdo.com

Twitterアイコン

2015.6.9 Deep Learning Framework Chainer Release!

特徴• All Pythonで記載ができるので、設定ファイル等のフォーマットを覚える必要がない。

• インストールが簡単

pip install chainer

王道、MNIST手書き数字で試す。

モデルは入力784 units、出力10 units

# Prepare multi-layer perceptron model# 多層パーセプトロンモデルの設定 # 入力 784次元、出力 10次元 model = FunctionSet( l1=F.Linear(784, n_units), l2=F.Linear(n_units, n_units), l3=F.Linear(n_units, 10))

コード:モデル定義

# Prepare multi-layer perceptron model# 多層パーセプトロンモデルの設定 # 入力 784次元、出力 10次元 model = FunctionSet( l1=F.Linear(784, n_units), l2=F.Linear(n_units, n_units), l3=F.Linear(n_units, 10))

コード:モデル定義(POINT:入出力定義)

# ニューラルネットの構造def forward(x_data, y_data, train=True): x, t = Variable(x_data), Variable(y_data) h1 = F.dropout(F.relu(model.l1(x)),           train=train) h2 = F.dropout(F.relu(model.l2(h1)),        train=train) y = model.l3(h2) # 多クラス分類なので誤差関数としてソフトマックス関数の # 交差エントロピー関数を用いて、誤差を導出 return F.softmax_cross_entropy(y, t), F.accuracy(y, t)

コード:順伝播

# ニューラルネットの構造def forward(x_data, y_data, train=True): x, t = Variable(x_data), Variable(y_data) h1 = F.dropout(F.relu(model.l1(x)),           train=train) h2 = F.dropout(F.relu(model.l2(h1)),        train=train) y = model.l3(h2) # 多クラス分類なので誤差関数としてソフトマックス関数の # 交差エントロピー関数を用いて、誤差を導出 return F.softmax_cross_entropy(y, t), F.accuracy(y, t)

コード:順伝播(POINT: Variableクラス)

基本クラスの一つです

http://docs.chainer.org/en/latest/reference/core/variable.html#variable

基本クラスの一つです

http://docs.chainer.org/en/latest/reference/core/variable.html#variable

このクラスに、データ、パラメータ、 モデルの構造等を持たせて、 誤差逆伝播を行います。

# ニューラルネットの構造def forward(x_data, y_data, train=True): x, t = Variable(x_data), Variable(y_data) h1 = F.dropout(F.relu(model.l1(x)),           train=train) h2 = F.dropout(F.relu(model.l2(h1)),        train=train) y = model.l3(h2) # 多クラス分類なので誤差関数としてソフトマックス関数の # 交差エントロピー関数を用いて、誤差を導出 return F.softmax_cross_entropy(y, t), F.accuracy(y, t)

コード:順伝播(POINT: relu関数)

コード:順伝播(POINT: relu関数)

relu(x) = max(0, x)

# ニューラルネットの構造def forward(x_data, y_data, train=True): x, t = Variable(x_data), Variable(y_data) h1 = F.dropout(F.relu(model.l1(x)),           train=train) h2 = F.dropout(F.relu(model.l2(h1)),        train=train) y = model.l3(h2) # 多クラス分類なので誤差関数としてソフトマックス関数の # 交差エントロピー関数を用いて、誤差を導出 return F.softmax_cross_entropy(y, t), F.accuracy(y, t)

コード:順伝播(POINT: dropout関数)

コード:順伝播(POINT: dropout関数)

x2#

x783�

x784�

x1�

x0�

z10�u10�

z1�u1�

z2�u1�

z9�u9�

z1000�u1000�

z999�u999�

u1##z1�

u2##z2�

z0�

z1000�u1000�

z999�u999�

u1##z1�

u2##z2�

z0�

コード:順伝播(POINT: dropout関数)

x2#

x784�

x0�

z10�u10�

z1�u1�

z2�u1�

z9�u9�z999�u999�

u1##z1�

z0�

z1000�u1000�

u1##z1�

z0�

# ニューラルネットの構造def forward(x_data, y_data, train=True): x, t = Variable(x_data), Variable(y_data) h1 = F.dropout(F.relu(model.l1(x)),           train=train) h2 = F.dropout(F.relu(model.l2(h1)),        train=train) y = model.l3(h2) # 多クラス分類なので誤差関数としてソフトマックス関数の # 交差エントロピー関数を用いて、誤差を導出 return F.softmax_cross_entropy(y, t), F.accuracy(y, t)

コード:順伝播(POINT: softmax関数)

コード:順伝播(POINT: softmax関数)

yk = zk = fk(u) =exp(uk)PKj exp(uj)

En = �X

k

dk log

exp(uk)PKj exp(uj)

!交差エントロピー関数

ソフトマックス関数

# Setup optimizeroptimizer = optimizers.Adam()optimizer.setup(model.collect_parameters())

コード:Optimizerの設定

Optimizerで勾配法を選択する。 今回はAdamを使用。

http://ja.scribd.com/doc/260859670/30minutes-AdamAdamの参考

for epoch in xrange(1, n_epoch+1): perm = np.random.permutation(N) # 0~Nまでのデータをバッチサイズごとに使って学習 for i in xrange(0, N, batchsize): x_batch = x_train[perm[i:i+batchsize]] y_batch = y_train[perm[i:i+batchsize]] # 勾配を初期化 optimizer.zero_grads() # 順伝播させて誤差と精度を算出 loss, acc = forward(x_batch, y_batch) # 誤差逆伝播で勾配を計算 loss.backward() optimizer.update()

コード:学習

train_loss.append(loss.data) train_acc.append(acc.data) sum_loss += float(cuda.to_cpu(loss.data)) * batchsize sum_accuracy += float(cuda.to_cpu(acc.data)) * batchsize # 訓練データの誤差と、正解精度を表示 print 'train mean loss={}, accuracy={}' .format(sum_loss / N,sum_accuracy / N)

コード:学習

#evaluation #テストデータで誤差と、正解精度を算出し汎化性能を確認 sum_accuracy = 0 sum_loss = 0 for i in xrange(0, N_test, batchsize): x_batch = x_test[i:i+batchsize] y_batch = y_test[i:i+batchsize] # 順伝播させて誤差と精度を算出 loss, acc = forward(x_batch, y_batch, train=False) test_loss.append(loss.data) test_acc.append(acc.data)

コード:評価

sum_loss += float(cuda.to_cpu(loss.data)) * batchsize sum_accuracy += float(cuda.to_cpu(acc.data)) * batchsize # テストデータでの誤差と、正解精度を表示 print 'test mean loss={}, accuracy={}’ .format(sum_loss / N_test, sum_accuracy / N_test)

コード:評価

結果

結果 間違ったのはこの1つだけ。 でも、9にも見えるので仕方ない!?

結果:パラメーター の可視化 w

Autoencoder

概要

時間がないので結果だけ・・・

活性化関数 中間層数 Dropout ノイズ付加Sigmoid 1000 あり なし

誤差の推移:20回しくらいで大体収束

活性化関数 中間層数 Dropout ノイズ付加Sigmoid 1000 あり なし

出力結果:ほとんど復元できている

活性化関数 中間層数 Dropout ノイズ付加Sigmoid 1000 あり なし

第一層 w(1)ji の可視化

活性化関数 中間層数 Dropout ノイズ付加Sigmoid 1000 あり なし

第一層 w(1)ji の可視化

結構、数字のエッジ等、 特徴らしきものを捉えられている

活性化関数 中間層数 Dropout ノイズ付加Sigmoid 1000 あり なし

第二層 の可視化 w(2)ji

詳細はこちらをご覧ください!• 【機械学習】ディープラーニング フレームワークChainerを試しながら解説してみる。 http://qiita.com/kenmatsu4/items/7b8d24d4c5144a686412

• 【ディープラーニング】ChainerでAutoencoderを試して結果を可視化してみる。 http://qiita.com/kenmatsu4/items/99d4a54d5a57405ecaf8

また、Chainerの仕組みについては作者の方が非常に わかりやすくまとめられているので、ぜひご参考ください!

http://www.slideshare.net/beam2d/chainer-atfpgax7

Thanks• Chainer Homepage http://chainer.org

• Chainer Github page https://github.com/pfnet/chainer

• Chainer Document http://docs.chainer.org

• Azusa Colors (Keynote template) http://sanographix.github.io/azusa-colors/