Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

PythonによるDeep Learningの実装

16,778 views

Published on

Zansaの発表資料

Published in: Science
  • Be the first to comment

PythonによるDeep Learningの実装

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

×