2.
Title
Name
Date
OUTLINE
○About me
○今⽇日の話
○Neural Networkのおさらい
○Deep Learningやってみよう
-‐‑‒ Auto Encoder
-‐‑‒ Dropout
○おわりに
3.
Title
About me
Akiba Shinya
早稲⽥田⼤大学 -‐‑‒ 機械科学専攻 M2
Name
-‐‑‒ 分析のアルバイト
-‐‑‒ 機械学習、物理理シミュレーション
@aki_̲n1wa Date
4.
Title
Name
Date
今⽇日の話
○数年年前から話題のつきないDeep Learning(DL)の話をします。
最近はslideshare等にも、DL関連の資料料が増えてきました。
DLの概説やライブラリ紹介などが多く、実際にコードで書くときに
参考にできる資料料があまりなかったことが、発表の動機です。
(爆速ライブラリ書いたぜーとかいう話ではありません
!
○実際にコード書いてみると理理解が深まる
○pylearn2はライブラリというより、バッチ処理理ツールという感じ
5.
Title
Name
Date
Neural Networkのおさらい
入力データに対して、何かしらの出力データが得られる装置。
他の神経細胞からの入力
ある閾値を超えると発火して、
他の神経細胞へ入力を与える
http://thinkit.co.jp/article/30/3/
入力:
重み:
閾値:
出力:
モデル化
閾値を超えたら1
!
超えなかったら0
「パーセプトロン」
6.
Title
Name
Date
Neural Networkのおさらい
簡単な分類問題
入力データの特徴量が1個
0 1
入力データの特徴量が2個
1
一次元空間での線形分類二次元空間での線形分類
0
7.
Title
Name
Date
Neural Networkのおさらい
⼊入⼒力力データが画像(数値)のときは、
どんなNNを設計しよう…
28×28ピクセルのデータ
= 特徴量量784個
from MNIST database
(Mixed National Institute of Standards and Technology database)
http://yann.lecun.com/exdb/mnist/
8.
Title
Name
Date
Neural Networkのおさらい
3層のNeuralNetwork
…
… 784個
196個
…
10個
入力層:x 画像データ
隠れ層:h
出力層:y
重み:Wx, Wh
バイアス項:b, c
シグモイド関数:
注)MNISTの画像データに対するNNは
784-800-800-10とかで設計されますが、
計算大変なので、小さめのNNとなっております。
(ラップトップでNNつらい)
10.
Title
Name
Date
Neural Networkのおさらい
NNの学習過程まとめ
1. 入力データに対して、何かしらの出力データを得る。
2. 出力データと教師データを比べて、
間違っていたら、誤差関数を微分してパラメータを修正する。
11.
Title
Name
Date
Neural Networkのおさらい
NNの学習過程まとめ
1. 入力データに対して、何かしらの出力データを得る。
2. 出力データと教師データを比べて、
間違っていたら、誤差関数を微分してパラメータを修正する。
ここが面倒くさい。
3層NNだと, Wx, b, Wh, c, それぞれについて
偏微分の式を計算して、コードに書き下さなきゃなんない。
→Theanoを使うよ
12.
Title
Name
Date
Neural Networkのおさらい
【Theano】
Pythonライブラリ
微分演算が楽
再帰的な処理はちょっと弱い
GPUでの実行
http://deeplearning.net/software/theano/
13.
Title
Name
Date
Neural Networkのおさらい
import theano
import theano.tensor as T
from sklearn.datasets import fetch_mldata
from sklearn import preprocessing
!
# sklearnのデータセットから画像取得
mnist = fetch_mldata('MNIST original', data_home=".")
X_digits, _, _, t_digits = mnist.values()
data_size = 1000
index = np.arange(70000)
index = shuffle(index)[0:70000]
x_digits = X_digits[index[0:data_size]]
t_digits = t_digits[index[0:data_size]]
!
data_x = []
# 学習用入力データ前処理
for A in x_digits:
data_x.append(np.array([1 if x > 100 else 0 for x in A]))
!
# 学習用教師データ前処理
lb = preprocessing.LabelBinarizer()
lb.fit([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
data_t = lb.transform(Y_digits)
14.
Title
Name
Date
Neural Networkのおさらい
# 使用する変数を定義
b, c = T.dvectors("b", "c")
wx, wh = T.dmatrices("wx", "wh")
t, y, x, h = T.dvectors('t', 'y', 'x', 'h')
!
# パラメータは共有変数として値をもつ
_wx = theano.shared(np.random.randn(196, 784), name="_wx")
_wh = theano.shared(np.random.randn(10,196), name="_wh")
_b = theano.shared(np.random.randn(196), name="_b")
_c = theano.shared(np.random.randn(10), name=“_c”)
!
def sigmoid(x):
return 1./(1+T.exp(-x))
!
h = sigmoid(T.dot(wx, x) + b)
y = sigmoid(T.dot(wh, h) + c)
!
# 学習係数
eta = 0.01
# 誤差関数
cost_func = T.sum((t - y)**2)
15.
Title
Name
Date
Neural Networkのおさらい
# 誤差関数と偏微分するパラメータを指定
grad_cost = T.grad(cost=cost_func, wrt=[wx, b, wh, c])
!
# 計算に必要な全ての変数をinputsに、更新するパラメータをupdatesに指定
grad_cost_func = theano.function(inputs=[t, wh, bh, wx, bx, x],
outputs=[],
updates={_wx: _wx - eta * grad_cost[0],
_b: _b - eta * grad_cost[1],
_wh: _wh - eta * grad_cost[2],
_c: _c - eta * grad_cost[3]})
!
train_count = 1000
# 指定した回数学習させる
for n in range(train_count):
for x, t in zip(data_x, data_t):
input = [t,
_wh.get_value(),
_bh.get_value(),
_wx.get_value(),
_bx.get_value(),
x]
grad_cost_func(input)
16.
Title
Name
Date
Neural Networkのおさらい
ここまでで作ったNNを実行すると…
手法学習データ検証データ
NN 100.0% 75.6%
NNの問題点
○パラメータの初期値
○過学習
17.
Title
Name
Date
Neural Networkのおさらい
ここまでで作ったNNを実行すると…
手法学習データ検証データ
NN 100.0% 75.6%
NNの問題点
○パラメータの初期値
→ Auto Encoderを使おう
○過学習
→ Dropoutを使おう
18.
Title
Name
Date
Auto Encoder
Auto Encoderとは、BackpropagationでNN全体の学習(パラメータの更更新)を
⾏行行う前に、事前に⾏行行う学習。
!
⼊入⼒力力データを再現するような重みの学習を各層ごとに⾏行行う教師無し学習である。
!
ランダムに初期パラメータを決めるのではなく、Auto Encoderを⾏行行った後で、
NN全体の学習を⾏行行うと精度度が上がると⾔言われている。
19.
Title
Name
Date
Auto Encoder
…
…
’
’
’
…
196個
784個784個
仮想的な出⼒力力xʼ’を教師データとして
xとの誤差関数を定義し、
Wx, b, Wxʼ’, bʼ’のパラメータを更更新する。
(Wxʼ’, bʼ’はNN全体の学習には使わない)
20.
Title
Name
Date
Auto Encoder
…
…
’
’
…
196個
784個784個
…
…
’
’
…
’
196個10個’196個
全てのパラメータに
ついて、事前学習を⾏行行う
22.
Title
Name
Date
Auto Encoder
Auto Encoderの実装
手法学習データ検証データ
NN 100.0% 75.6%
AE 99.7% 82.1%
23.
Title
Name
Date
Dropout
Dropoutとは、NNに汎化性能をもたせる⼿手法。
!
NNは層同⼠士がフルに繋がっているため、過学習に陥りやすいと⾔言われている。
Dropoutによって、アンサンブル学習のような効果が得られる。
!
学習時にいくつかの特徴量量を0にする。
推定時にはすべての特徴量量を使⽤用するが、出⼒力力をある割合で⼩小さくする。
24.
Title
Name
Date
…
…
784個
196個
…
10個
各層の⼊入⼒力力データをランダムに0にする。
⼊入⼒力力データは20%を0に、
隠れ層のデータは50%を0にすると
うまく学習できると⾔言われている。
(NNの構造によるかも)
!
学習ごとに異異なるNNの構造が得られるため、
汎化性能が向上する。(計算時間は増える)
!
学習ごとに結構学習精度度が暴暴れるので、
L2正則化などと組み合わせることが多い。
20%削減
50%削減
Dropout
25.
Title
Name
Date
Dropout
# 0 or 1の配列 [0, 1, 0, 1, 1, 1, 0, 1, …, 1]
bino_x = np.random.binomial(1, 0.8, 784)
bino_h = np.random.binomial(1, 0.5, 196)
!
h = sigmoid(T.dot(wx, bino_x * x) + b)
y = sigmoid(T.dot(wh, bion_h * h) + c)
26.
Title
Name
Date
Dropout
Auto Encoder + Dropoutの精度
手法学習データ検証データ
NN 100.0% 75.6%
AE 99.7% 82.1%
AE+Dropout 96.4% 84.2%
27.
Title
Name
Date
おわりに
MNISTのデータセットは、学習データに60,000枚、
検証データに10,000枚使い、4層以上のNNで学習を行う論文が多いです。
今回のコードはスペースの都合上ミニバッチ処理を省略しています。
!
DLの一手法であるAuto EncoderとDropoutに関する発表でしたが、他にもDL
と呼ばれる手法はたくさんあります。
!
特に、畳み込みNNは、プレトレーニングやDropoutのような手法無しでも、
汎化性能が高く、計算量もそんなに多くないのでおすすめです。
(今回発表してないけど…
28.
Title
Name
Date
G. E. Hinton, N. Srivastava, A. Krizhevsky, I. Sutskever and R. R. Salakhutdinov,
University of Toronto
2012, Improving neural networks by preventing co-adaptation of feature detectors
http://arxiv.org/pdf/1207.0580.pdf
!
Marc’Aurelio Ranzato, Y-Lan Boureau, Yann LeCun
New York University
Sparse Feature Learning for Deep Belief Networks
http://yann.lecun.com/exdb/publis/pdf/ranzato-nips-07.pdf