SlideShare a Scribd company logo
PythonによるDeep Learningの実装 
Akiba Shinya
Title 
Name 
Date 
OUTLINE 
○About me 
○今⽇日の話 
○Neural Networkのおさらい 
○Deep Learningやってみよう 
-‐‑‒ Auto Encoder 
-‐‑‒ Dropout 
○おわりに
Title 
About me 
Akiba Shinya 
早稲⽥田⼤大学 -‐‑‒ 機械科学専攻 M2 
Name 
-‐‑‒ 分析のアルバイト 
-‐‑‒ 機械学習、物理理シミュレーション 
@aki_̲n1wa Date
Title 
Name 
Date 
今⽇日の話 
○数年年前から話題のつきないDeep Learning(DL)の話をします。 
最近はslideshare等にも、DL関連の資料料が増えてきました。 
DLの概説やライブラリ紹介などが多く、実際にコードで書くときに 
参考にできる資料料があまりなかったことが、発表の動機です。 
(爆速ライブラリ書いたぜーとかいう話ではありません 
! 
○実際にコード書いてみると理理解が深まる 
○pylearn2はライブラリというより、バッチ処理理ツールという感じ
Title 
Name 
Date 
Neural Networkのおさらい 
入力データに対して、何かしらの出力データが得られる装置。 
他の神経細胞からの入力 
ある閾値を超えると発火して、 
他の神経細胞へ入力を与える 
http://thinkit.co.jp/article/30/3/ 
入力: 
重み: 
閾値: 
出力: 
モデル化 
閾値を超えたら1 
! 
超えなかったら0 
「パーセプトロン」
Title 
Name 
Date 
Neural Networkのおさらい 
簡単な分類問題 
入力データの特徴量が1個 
0 1 
入力データの特徴量が2個 
1 
一次元空間での線形分類二次元空間での線形分類 
0
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/
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つらい)
Title 
Name 
Date 
Neural Networkのおさらい 
3層のNeuralNetwork 
… 
… 784個 
196個 
出力 
… 1 
10個 
0 
0 
0 
0 
0 
0 
0 
0 
0 
正解 
0 
0 
0 
0 
0 
0 
0 
1 
0 
0 
出力が計算できたら、 
誤差を求めて、パラメー 
タを修正する。 
修正するパラメータで 
誤差関数を偏微分する。 
ηは学習係数
Title 
Name 
Date 
Neural Networkのおさらい 
NNの学習過程まとめ 
1. 入力データに対して、何かしらの出力データを得る。 
2. 出力データと教師データを比べて、 
間違っていたら、誤差関数を微分してパラメータを修正する。
Title 
Name 
Date 
Neural Networkのおさらい 
NNの学習過程まとめ 
1. 入力データに対して、何かしらの出力データを得る。 
2. 出力データと教師データを比べて、 
間違っていたら、誤差関数を微分してパラメータを修正する。 
ここが面倒くさい。 
3層NNだと, Wx, b, Wh, c, それぞれについて 
偏微分の式を計算して、コードに書き下さなきゃなんない。 
→Theanoを使うよ
Title 
Name 
Date 
Neural Networkのおさらい 
【Theano】 
Pythonライブラリ 
微分演算が楽 
再帰的な処理はちょっと弱い 
GPUでの実行 
http://deeplearning.net/software/theano/
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)
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)
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)
Title 
Name 
Date 
Neural Networkのおさらい 
ここまでで作ったNNを実行すると… 
手法学習データ検証データ 
NN 100.0% 75.6% 
NNの問題点 
○パラメータの初期値 
○過学習
Title 
Name 
Date 
Neural Networkのおさらい 
ここまでで作ったNNを実行すると… 
手法学習データ検証データ 
NN 100.0% 75.6% 
NNの問題点 
○パラメータの初期値 
→ Auto Encoderを使おう 
○過学習 
→ Dropoutを使おう
Title 
Name 
Date 
Auto Encoder 
Auto Encoderとは、BackpropagationでNN全体の学習(パラメータの更更新)を 
⾏行行う前に、事前に⾏行行う学習。 
! 
⼊入⼒力力データを再現するような重みの学習を各層ごとに⾏行行う教師無し学習である。 
! 
ランダムに初期パラメータを決めるのではなく、Auto Encoderを⾏行行った後で、 
NN全体の学習を⾏行行うと精度度が上がると⾔言われている。
Title 
Name 
Date 
Auto Encoder 
… 
… 
’ 
’ 
’ 
… 
196個 
784個784個 
仮想的な出⼒力力xʼ’を教師データとして 
xとの誤差関数を定義し、 
Wx, b, Wxʼ’, bʼ’のパラメータを更更新する。 
(Wxʼ’, bʼ’はNN全体の学習には使わない)
Title 
Name 
Date 
Auto Encoder 
… 
… 
’ 
’ 
… 
196個 
784個784個 
… 
… 
’ 
’ 
… 
’ 
196個10個’196個 
全てのパラメータに 
ついて、事前学習を⾏行行う
Title 
Name 
Date 
Auto Encoder 
# decode用の変数を定義 
de_x = T.dvector(“de_x") 
de_b = T.dvector(“de_b") 
de_wx = T.dmatrix(“de_wx”) 
! 
# decode用の共有変数を定義 
de_wx = theano.shared(np.random.randn(784, 196), name=“_de_wx") 
de_b = theano.shared(np.random.randn(784), name=“_de_b”) 
! 
de_x = sigmoid(T.dot(de_wx, h) + de_b) 
pre1_cost_func = T.sum((de_x - x)**2) 
! 
# 誤差関数と偏微分するパラメータを指定 
pre1_grad_cost = T.grad(cost=pre1_cost_func, wrt=[wx, b, de_wx, de_b]) 
! 
# 計算に必要な全ての変数をinputsに、更新するパラメータをupdatesに指定 
pre1_grad_cost_func = theano.function(inputs=[de_x, de_wx, de_b, wx, bx, x], 
outputs=[], 
updates={_wx: _wx - eta * pre1_grad_cost[0], 
_b: _b - eta * pre1_grad_cost[1], 
_de_wx: _wh - eta * pre1_grad_cost[2], 
_de_b: _c - eta * pre1_grad_cost[3]})
Title 
Name 
Date 
Auto Encoder 
Auto Encoderの実装 
手法学習データ検証データ 
NN 100.0% 75.6% 
AE 99.7% 82.1%
Title 
Name 
Date 
Dropout 
Dropoutとは、NNに汎化性能をもたせる⼿手法。 
! 
NNは層同⼠士がフルに繋がっているため、過学習に陥りやすいと⾔言われている。 
Dropoutによって、アンサンブル学習のような効果が得られる。 
! 
学習時にいくつかの特徴量量を0にする。 
推定時にはすべての特徴量量を使⽤用するが、出⼒力力をある割合で⼩小さくする。
Title 
Name 
Date 
… 
… 
784個 
196個 
… 
10個 
各層の⼊入⼒力力データをランダムに0にする。 
⼊入⼒力力データは20%を0に、 
隠れ層のデータは50%を0にすると 
うまく学習できると⾔言われている。 
(NNの構造によるかも) 
! 
学習ごとに異異なるNNの構造が得られるため、 
汎化性能が向上する。(計算時間は増える) 
! 
学習ごとに結構学習精度度が暴暴れるので、 
L2正則化などと組み合わせることが多い。 
20%削減 
50%削減 
Dropout
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)
Title 
Name 
Date 
Dropout 
Auto Encoder + Dropoutの精度 
手法学習データ検証データ 
NN 100.0% 75.6% 
AE 99.7% 82.1% 
AE+Dropout 96.4% 84.2%
Title 
Name 
Date 
おわりに 
MNISTのデータセットは、学習データに60,000枚、 
検証データに10,000枚使い、4層以上のNNで学習を行う論文が多いです。 
今回のコードはスペースの都合上ミニバッチ処理を省略しています。 
! 
DLの一手法であるAuto EncoderとDropoutに関する発表でしたが、他にもDL 
と呼ばれる手法はたくさんあります。 
! 
特に、畳み込みNNは、プレトレーニングやDropoutのような手法無しでも、 
汎化性能が高く、計算量もそんなに多くないのでおすすめです。 
(今回発表してないけど…
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

More Related Content

PDF
実装ディープラーニング
Yurie Oka
 
PDF
Deep learning入門
magoroku Yamamoto
 
PPTX
はじめての人のためのDeep Learning
Tadaichiro Nakano
 
PDF
Chainerチュートリアル -v1.5向け- ViEW2015
Ryosuke Okuta
 
PDF
Convolutional Neural Network @ CV勉強会関東
Hokuto Kagaya
 
PDF
「ゼロから作るDeep learning」の畳み込みニューラルネットワークのハードウェア化
marsee101
 
PPTX
Deep Learning基本理論とTensorFlow
Tadaichiro Nakano
 
PPTX
多層NNの教師なし学習 コンピュータビジョン勉強会@関東 2014/5/26
Takashi Abe
 
実装ディープラーニング
Yurie Oka
 
Deep learning入門
magoroku Yamamoto
 
はじめての人のためのDeep Learning
Tadaichiro Nakano
 
Chainerチュートリアル -v1.5向け- ViEW2015
Ryosuke Okuta
 
Convolutional Neural Network @ CV勉強会関東
Hokuto Kagaya
 
「ゼロから作るDeep learning」の畳み込みニューラルネットワークのハードウェア化
marsee101
 
Deep Learning基本理論とTensorFlow
Tadaichiro Nakano
 
多層NNの教師なし学習 コンピュータビジョン勉強会@関東 2014/5/26
Takashi Abe
 

What's hot (20)

PPTX
Cvim saisentan-6-4-tomoaki
tomoaki0705
 
PDF
深層学習入門
Danushka Bollegala
 
PPTX
MIRU2014 tutorial deeplearning
Takayoshi Yamashita
 
PDF
再帰型ニューラルネット in 機械学習プロフェッショナルシリーズ輪読会
Shotaro Sano
 
PDF
ディープラーニングフレームワーク とChainerの実装
Ryosuke Okuta
 
PDF
DeepLearningTutorial
Takayoshi Yamashita
 
PDF
Deep Learningと画像認識   ~歴史・理論・実践~
nlab_utokyo
 
PPTX
深層学習 第4章 大規模深層学習の実現技術
孝昌 田中
 
PDF
LSTM (Long short-term memory) 概要
Kenji Urai
 
PDF
2013.07.15 はじパタlt scikit-learnで始める機械学習
Motoya Wakiyama
 
PDF
Pythonで体験する深層学習 5章
孝好 飯塚
 
PDF
深層学習フレームワーク Chainer の開発と今後の展開
Seiya Tokui
 
PDF
Pythonによる機械学習入門 ~Deep Learningに挑戦~
Yasutomo Kawanishi
 
PDF
bigdata2012ml okanohara
Preferred Networks
 
PDF
20160329.dnn講演
Hayaru SHOUNO
 
PPT
17ゼロから作るディープラーニング2章パーセプトロン
Keiichirou Miyamoto
 
PDF
Pythonによる機械学習入門 ~SVMからDeep Learningまで~
Yasutomo Kawanishi
 
PDF
Introduction to Chainer (LL Ring Recursive)
Kenta Oono
 
PDF
画像認識のための深層学習
Saya Katafuchi
 
PDF
ディープニューラルネット入門
TanUkkii
 
Cvim saisentan-6-4-tomoaki
tomoaki0705
 
深層学習入門
Danushka Bollegala
 
MIRU2014 tutorial deeplearning
Takayoshi Yamashita
 
再帰型ニューラルネット in 機械学習プロフェッショナルシリーズ輪読会
Shotaro Sano
 
ディープラーニングフレームワーク とChainerの実装
Ryosuke Okuta
 
DeepLearningTutorial
Takayoshi Yamashita
 
Deep Learningと画像認識   ~歴史・理論・実践~
nlab_utokyo
 
深層学習 第4章 大規模深層学習の実現技術
孝昌 田中
 
LSTM (Long short-term memory) 概要
Kenji Urai
 
2013.07.15 はじパタlt scikit-learnで始める機械学習
Motoya Wakiyama
 
Pythonで体験する深層学習 5章
孝好 飯塚
 
深層学習フレームワーク Chainer の開発と今後の展開
Seiya Tokui
 
Pythonによる機械学習入門 ~Deep Learningに挑戦~
Yasutomo Kawanishi
 
bigdata2012ml okanohara
Preferred Networks
 
20160329.dnn講演
Hayaru SHOUNO
 
17ゼロから作るディープラーニング2章パーセプトロン
Keiichirou Miyamoto
 
Pythonによる機械学習入門 ~SVMからDeep Learningまで~
Yasutomo Kawanishi
 
Introduction to Chainer (LL Ring Recursive)
Kenta Oono
 
画像認識のための深層学習
Saya Katafuchi
 
ディープニューラルネット入門
TanUkkii
 
Ad

Viewers also liked (12)

PDF
MNIST and machine learning - presentation
Steve Dias da Cruz
 
PDF
深層学習フレームワーク概要とChainerの事例紹介
Kenta Oono
 
PDF
Tech-Circle Pepperで機械学習体験ハンズオン勉強会inアトリエ秋葉原
Koji Shiraishi
 
PDF
Py datameetup1
shiroyagi
 
PDF
Chainerで流体計算
Preferred Networks
 
PDF
研究発表のためのプレゼンテーション技術
Shinnosuke Takamichi
 
PPTX
NIPS2015読み会: Ladder Networks
Eiichi Matsumoto
 
PDF
Chainerの使い方と自然言語処理への応用
Seiya Tokui
 
PDF
深層学習フレームワークChainerの特徴
Yuya Unno
 
PDF
TensorFlowによるCNNアーキテクチャ構築
Hirokatsu Kataoka
 
PDF
Introduction to Chainer
Shunta Saito
 
PDF
機械学習チュートリアル@Jubatus Casual Talks
Yuya Unno
 
MNIST and machine learning - presentation
Steve Dias da Cruz
 
深層学習フレームワーク概要とChainerの事例紹介
Kenta Oono
 
Tech-Circle Pepperで機械学習体験ハンズオン勉強会inアトリエ秋葉原
Koji Shiraishi
 
Py datameetup1
shiroyagi
 
Chainerで流体計算
Preferred Networks
 
研究発表のためのプレゼンテーション技術
Shinnosuke Takamichi
 
NIPS2015読み会: Ladder Networks
Eiichi Matsumoto
 
Chainerの使い方と自然言語処理への応用
Seiya Tokui
 
深層学習フレームワークChainerの特徴
Yuya Unno
 
TensorFlowによるCNNアーキテクチャ構築
Hirokatsu Kataoka
 
Introduction to Chainer
Shunta Saito
 
機械学習チュートリアル@Jubatus Casual Talks
Yuya Unno
 
Ad

Similar to PythonによるDeep Learningの実装 (20)

PPTX
「機械学習とは?」から始める Deep learning実践入門
Hideto Masuoka
 
PDF
SGDによるDeepLearningの学習
Masashi (Jangsa) Kawaguchi
 
PDF
20150803.山口大学集中講義
Hayaru SHOUNO
 
PDF
深層学習(講談社)のまとめ(1章~2章)
okku apot
 
PPTX
機械学習 / Deep Learning 大全 (2) Deep Learning 基礎編
Daiyu Hatakeyama
 
PDF
自然言語処理のためのDeep Learning
Yuta Kikuchi
 
PDF
Deep Learningの基礎と応用
Seiya Tokui
 
PDF
深層学習レポート Day1 (小川成)
ssuser441cb9
 
PDF
TensorflowとKerasによる深層学習のプログラム実装実践講座
Ruo Ando
 
PDF
03_深層学習
CHIHIROGO
 
PPTX
Machine Learning Fundamentals IEEE
Antonio Tejero de Pablos
 
PPTX
ディープラーニングハンズオン・レクチャー資料
Yoshihiro Ochi
 
PPTX
Hello deeplearning!
T2C_
 
PPTX
深層学習とTensorFlow入門
tak9029
 
PPT
Deep Learningの技術と未来
Seiya Tokui
 
PDF
MANABIYA Machine Learning Hands-On
陽平 山口
 
PPTX
深層学習入門 スライド
swamp Sawa
 
PPTX
Pythonとdeep learningで手書き文字認識
Ken Morishita
 
PDF
20150310 第1回 ディープラーニング勉強会
哲朗 島田
 
PDF
第2回 メドレー読書会
Toshifumi
 
「機械学習とは?」から始める Deep learning実践入門
Hideto Masuoka
 
SGDによるDeepLearningの学習
Masashi (Jangsa) Kawaguchi
 
20150803.山口大学集中講義
Hayaru SHOUNO
 
深層学習(講談社)のまとめ(1章~2章)
okku apot
 
機械学習 / Deep Learning 大全 (2) Deep Learning 基礎編
Daiyu Hatakeyama
 
自然言語処理のためのDeep Learning
Yuta Kikuchi
 
Deep Learningの基礎と応用
Seiya Tokui
 
深層学習レポート Day1 (小川成)
ssuser441cb9
 
TensorflowとKerasによる深層学習のプログラム実装実践講座
Ruo Ando
 
03_深層学習
CHIHIROGO
 
Machine Learning Fundamentals IEEE
Antonio Tejero de Pablos
 
ディープラーニングハンズオン・レクチャー資料
Yoshihiro Ochi
 
Hello deeplearning!
T2C_
 
深層学習とTensorFlow入門
tak9029
 
Deep Learningの技術と未来
Seiya Tokui
 
MANABIYA Machine Learning Hands-On
陽平 山口
 
深層学習入門 スライド
swamp Sawa
 
Pythonとdeep learningで手書き文字認識
Ken Morishita
 
20150310 第1回 ディープラーニング勉強会
哲朗 島田
 
第2回 メドレー読書会
Toshifumi
 

PythonによるDeep Learningの実装

  • 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つらい)
  • 9. Title Name Date Neural Networkのおさらい 3層のNeuralNetwork … … 784個 196個 出力 … 1 10個 0 0 0 0 0 0 0 0 0 正解 0 0 0 0 0 0 0 1 0 0 出力が計算できたら、 誤差を求めて、パラメー タを修正する。 修正するパラメータで 誤差関数を偏微分する。 ηは学習係数
  • 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個 全てのパラメータに ついて、事前学習を⾏行行う
  • 21. Title Name Date Auto Encoder # decode用の変数を定義 de_x = T.dvector(“de_x") de_b = T.dvector(“de_b") de_wx = T.dmatrix(“de_wx”) ! # decode用の共有変数を定義 de_wx = theano.shared(np.random.randn(784, 196), name=“_de_wx") de_b = theano.shared(np.random.randn(784), name=“_de_b”) ! de_x = sigmoid(T.dot(de_wx, h) + de_b) pre1_cost_func = T.sum((de_x - x)**2) ! # 誤差関数と偏微分するパラメータを指定 pre1_grad_cost = T.grad(cost=pre1_cost_func, wrt=[wx, b, de_wx, de_b]) ! # 計算に必要な全ての変数をinputsに、更新するパラメータをupdatesに指定 pre1_grad_cost_func = theano.function(inputs=[de_x, de_wx, de_b, wx, bx, x], outputs=[], updates={_wx: _wx - eta * pre1_grad_cost[0], _b: _b - eta * pre1_grad_cost[1], _de_wx: _wh - eta * pre1_grad_cost[2], _de_b: _c - eta * pre1_grad_cost[3]})
  • 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