Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Deep Learning 1 (Chapter 2 , Chapter 3)

banquet.kuma
February 01, 2020

Deep Learning 1 (Chapter 2 , Chapter 3)

発表用に「ゼロから作るディープラーニング1巻」(オライリー)の2,3章をまとめました。

banquet.kuma

February 01, 2020
Tweet

More Decks by banquet.kuma

Other Decks in Technology

Transcript

  1. ディープラーニングとは(1/2) • 「脳神経細胞」を模擬したを数学モデル • ニューロンの「結合重み」を変化させて問題解決能⼒を創出 • 簡単な関数を深く重ねることで、表現⼒の⾼い関数を創出 模擬 特徴を抽出し 「⼈間の顔」、「猫の顔」という概念を獲得

    出典︓https://www.slideshare.net/nlab_utokyo/deep-learning-40959442 結合重み 脳神経︓ シナプスの結合重み が“学習”で変化 数学モデル︓ ⼊⼒の結合重み が“学習”で変化 出典︓⼈⼯知能は⼈間を超えるか(⾓川選書)松尾豊著 1000万枚のYouTube画像 8
  2. ディープラーニングとは(2/2) ディープラーニングの動作は、「学習」と「推論」がある。 教師データ 教師データと訓練データの整合を取る様に結合重みを調整する 学習 0 1 2 3 訓練データ

    推論 未知のデータを⼊⼒して、予測値を取り出す 学習してから、推論する 出典︓⼈⼯知能は⼈間を超えるか(⾓川選書)松尾豊著 9
  3. 講座の流れ(2/3) 【講座の⽬的】 ・ニューラルネットワークの理論を理解し、説明できるようになる ・基本的な動作をPythonで実装できるようになる ・ライブラリ活⽤時のパラメータの意味が理解できる 回 分野 章 キーワード 第1回

    推論 2、3 ニューラルネットワーク、 活性化関数、⾏列計算 第2回 学習 4 損失関数、数値微分、 勾配法 第3回 学習 5 誤差逆伝搬 第4回 学習 6 SDG、Adam、過学習、 ハイパーパラメータ 全4回を予定 12
  4. 1. パーセプトロン ⇒最⼩構成要素の動きを理解 2. ニューラルネットワーク ⇒多層化する 3. 活性化関数の導⼊ ⇒多層化のメリットを引き出す 4.

    推論動作を紐解く ⇒推論動作を⼿計算する 5. まとめ 第1回の⽬標 • 推論動作が「⾏列の積と和」であることを理解する • 「活性化関数」の種類と役割を理解する 講座の流れ(3/3) 13
  5. • AND, OR, NAND ゲートは全て単層パーセプトロンで表現可能 • 「適切に重み付け(w)と閾値(θ)を決めることが重要」 ゲート AND OR

    NAND 式 閾値 真理値 (w" , w$, )=(0.5, 0.5,0.7) (w", w$,)=(−0.5, −0.5, −0.7) (w", w$,)=(0.5, 0.5,0.2) “単層パーセプトロン”の動きを理解する(2/3) 16
  6. 単層パーセプトロンは「⾮線形問題」に対応できない ! (例)XORゲート 分離 線形 ⾮線形 ゲート OR XOR 真理値

    分け⽅ $ " (0,1) (1,1) (1,0) (0,0) " $ (1,1) (1,0) (0,1) (0,0) “単層パーセプトロン”の限界(1/2) 19
  7. " # 単層パーセプトロンの式とSVM(サポートベクターマシン)の境界線の式は同じ。 ⾮線形問題に対しては、特徴量エンジニアリングと同じような策が必要。 単層パーセプトロンの式 SVMにおける境界線の式 (" , $ )

    = b+" " + $ $ 同じ︕ ⾮線形問題 への対応 ? 特徴量エンジニアリング (⾼次元空間への写像) “単層パーセプトロン”の限界(2/2) 出典 http://enakai00.hatenablog.com/entry/2017/10/13/145337 20
  8. ⼊⼒層「データを⼊れる層」、出⼒層「予測値が出てくる層」、中間層「間の層」 ニュ ーロン (0層) (2層) (1層) ニュ ーロン ニュ ーロン

    ニュ ーロン ニュ ーロン ニュ ーロン ニュ ーロン 多層パーセプトロンの中間層・出⼒層に特定の活性化関数を 適⽤したものを「ニューラルネットワーク」と呼びます 多層パーセプトロンから“ニューラルネットワーク”へ(3/3) 26
  9. 1. ⾮線形であること ⇒ 多層化のメリットを活かす︕ 2. 推論動作での減衰が⼩さい ⇒ 多層化のメリットを活かす︕ 3. 傾きが0の領域がないこと

    ⇒ 勾配消失を防ぐ(第3回で説明) 4. 傾きが⼀定であること ⇒ 学習速度が早い(第3回で説明) 名前 step sigmoid tanh ReLU Leaky ReLU 特徴 0 or 1を返す ・0〜1を返す ・中⼼が0.5 ・-1〜1を返す ・中⼼が0 ・⼊出⼒が⽐例 ・a≦0で傾き=0 ・⼊出⼒が⽐例 ・a≦0で傾き≠0 式 グラフ ℎ ℎ ℎ ℎ ( > 0) ( ≦ 0) 1 1 + 78 8 − 78 8 + 78 ( > 0) ( ≦ 0) ( > 0) ( ≦ 0) 進化の過程 ℎ 中間層で使う活性化関数︓ 活性化関数の種類と役割(2/8) 29
  10. ⾮線形関数 ・ステップ関数 h() = " ":;<=(7>) ・シグモイド関数 ・ReLU関数 線形関数 h(x)

    =cx h(x) =cx h(h(x)) =$x h(h(h(x))) =Bx → h(x) =Ex と等価 1.⾮線形関数であること ⇒ 線形関数を使うと多層の利点を⽣かせない(= 中間層なしと同じ) ℎ c = 1と置くと、 活性化関数がない ことと同じ︕ 活性化関数の種類と役割(3/8) 30
  11. ℎ( ) ℎ( ) ℎ( ) ℎ( ) ℎ( )

    ℎ( ) ℎ( ) ℎ( ) ℎ( ) ℎ( ) ℎ( ) ℎ( ) sigmoid 減衰⼤ ⼊⼒ 出⼒ 1層 2層 3層 4層 ℎ ℎ 信号の流れ 活性化関数の種類と役割(5/8) 2.推論動作での減衰が少ない ⇒ 浅い層の重みが最終的な出⼒に影響し、多層化のメリットを活かせる Leaky ReLU 減衰⼩ 潰れる︕ 32
  12. 名 前 identity sigmoid softmax 特 徴 ⼊⼒値をそのまま返す ・0〜1を返す ・中⼼が0.5

    総和が1になる 役 割 回帰問題 2クラス分類 多クラス分類 式 グ ラ フ ℎ = ℎ H = 8I ∑KL" M 8N ℎ ℎ h() = " ":OPQ 出⼒層で使う活性化関数︓ 活性化関数の種類と役割(6/8) " ℎ " 33
  13. ℎ H = 8I ∑ KL" M 8N softmax関数︓出⼒の総和は1になる。⼊/出⼒で⼤⼩関係は変わらない。 R

    HL" M ℎ(H ) = 1 定義式 特徴 確率変数の定義を満たしている︕ 活性化関数の種類と役割(7/8) " " ℎ( ) ( ( ℎ( ) ) ) ℎ( ) " ℎ " 入力に対し て 確率差が付き やすい ⼊⼒ 他のニューロン への⼊⼒が、 他のニューロン の出⼒に影響する 34
  14. 0.06 0.82 0.12 82% 6% “human” “cat” softmax関数を使うと、⼊⼒値を確率に変換できる。 " "

    ℎ( ) ( ( ℎ( ) ) ) ℎ( ) 12% “dog” 0.3 2.9 1.0 " $ B " $ B ⼊⼒ 出⼒ 活性化関数の種類と役割(8/8) softmax関数 35
  15. ⾏列の積の復習 • 前の⾏列の列数と後ろの⾏列の⾏数が⼀致してれば掛けられる • 前の⾏列の⾏数と後ろの⾏列の列数ができる⾏列の⾏・列数に等しい " $ B " $

    B " " $ $ B B = " " + $ $ + B B " " + $ $ + B B " " + $ $ + B B " " + $ $ + B B (2⾏,3列)×(3⾏,2列) (2⾏,2列) ⼀致 ニューラルネットワークの推論動作を紐解く(2/3) 38
  16. " $ "" $" B" "$ $$ B$ + "

    $ B = " $ B ⼊⼒ 重み 中間層への⼊⼒ 信号の流れ ⼊⼒層 中間層 " = "" " + "$ $ + " $ = $""+ $$$+ $ B = B""+ B$$+ B 以下の図にエッセンスが詰まっています。 層が深くなっても、⾏列の積と和を繰り返すだけ。 1 1 2 3 X 1 2 1 3 5 2 4 6 + 1 1 1 = 6 12 18 バイアス W b Y = ニューラルネットワークの推論動作を紐解く(3/3) 39
  17. ⼊⼒層から1層⽬への信号の流れ (1,2)・(2,3) + (1,3) = (1,3) の⾏列計算で表せる 0層 (⼊⼒層) 1層

    " $ "" (") $" (") B" (") "$ (") $$ (") B$ (") + " (")$ (")B (") = " (")$ (")B (") 1層への重み ⼊⼒ (")+ (") = (") ⼊⼒での バイアス 1層への ⼊⼒ 無視 3層ニューラルネットワークの動きを理解する(3/7) 43
  18. 1層⽬での信号の変換 1層への⼊⼒を活性化関数に⼊れる。⾏列の形は不変((1,3)のまま) 無視 ℎ((")) = (") ℎ " (")$ (")B

    (") = ℎ(" (")) ℎ($ (") ) ℎ(B (")) = " (")$ (")B (") 1層への⼊⼒を活性化関数で変換 1層の出⼒ 1層への⼊⼒ 活性化関数 1層 0層 (⼊⼒層) 3層ニューラルネットワークの動きを理解する(4/7) 44
  19. 3層ニューラルネットワークの動きを理解する(5/7) 1層⽬から2層⽬への信号の流れ & 2層⽬での信号変換 (1,3)・(3,2) + (1,2) = (1,2) の⾏列計算で表せる

    無視 (")($)+ ($) = ($) ℎ(($)) = ($) 1層 2層 " (")$ (")B (") "" ($) $" ($) "$ ($) $$ ($) "B ($) $B ($) + " ($) $ ($) = " ($) $ ($) 信号の流れ 活性化関数で変換 無視 1層の出⼒ ℎ " ($)$ ($) = ℎ(" $ ) ℎ($ $ ) = " ($)$ ($) 2層の⼊⼒ 2層への重み 1層での バイアス 2層の出⼒ 活性化関数 2層の⼊⼒ 45
  20. 3層ニューラルネットワークの動きを理解する(6/7) 2層⽬から出⼒層への信号の流れ & 出⼒層での信号変換 (1,2)・(2,2) + (1,2) = (1,2) の⾏列計算で表せる

    無視 2層 3層 (出⼒層) ($)(B)+ (B) = (B) 信号の流れ " ($)$ ($) "" (B) $" (B) "$ (B) $$ (B) + " (B) $ (B) = " (B) $ (B) 出⼒時の変換 ((B)) = " (B)$ (B) = (" B )($ B ) = " $ 2層の出⼒ 3層への重み 3層の⼊⼒ 2層での バイアス softmax 関数 3層の⼊⼒ 出⼒ 46
  21. 第2回発表の構想 1. 損失関数の導⼊ 2乗和誤差、交差エントロピー誤差 2. 微分の復習 数値微分、偏微分 3. 勾配法による学習 4.

    勾配法の実装 ディープラーニングの本丸「誤差逆伝播法」への導⼊として、 勾配法を使った学習を説明する。 53
  22. ANDゲート実装コード # coding: utf-8 import numpy as np def AND(x1,

    x2): x = np.array([x1, x2]) #入力 w = np.array([0.5, 0.5]) #重み b = -0.7 #バイアス tmp = np.sum(w*x) + b if tmp <= 0: return 0 else: return 1 if __name__ == '__main__': for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]: y = AND(xs[0], xs[1]) print(str(xs) + " -> " + str(y)) 62
  23. ORゲート実装コード # coding: utf-8 import numpy as np def OR(x1,

    x2): x = np.array([x1, x2]) #入力 w = np.array([0.5, 0.5]) #重み b = -0.2 #バイアス tmp = np.sum(w*x) + b if tmp <= 0: return 0 else: return 1 if __name__ == '__main__': for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]: y = OR(xs[0], xs[1]) print(str(xs) + " -> " + str(y)) 63
  24. NANDゲート実装コード # coding: utf-8 import numpy as np def NAND(x1,

    x2): x = np.array([x1, x2]) #入力 w = np.array([-0.5, -0.5]) #重みv b = 0.7 #バイアス tmp = np.sum(w*x) + b if tmp <= 0: return 0 else: return 1 if __name__ == '__main__': for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]: y = NAND(xs[0], xs[1]) print(str(xs) + " -> " + str(y)) 64
  25. XORゲート実装コード # coding: utf-8 from and_gate import AND from or_gate

    import OR from nand_gate import NAND def XOR(x1, x2): s1 = NAND(x1, x2) s2 = OR(x1, x2) y = AND(s1, s2) return y if __name__ == '__main__': for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]: y = XOR(xs[0], xs[1]) print(str(xs) + " -> " + str(y)) 65
  26. # coding: utf-8 import numpy as np import matplotlib.pylab as

    plt def step_function(x): return np.array(x > 0, dtype=np.int) X = np.arange(-5.0, 5.0, 0.1) Y = step_function(X) plt.plot(X, Y) plt.ylim(-0.1, 1.1) # 図で描画するy軸の範囲を指定 plt.show() step関数実装コード ℎ 66
  27. # coding: utf-8 import numpy as np import matplotlib.pylab as

    plt def sigmoid(x): return 1 / (1 + np.exp(- x)) X = np.arange(-5.0, 5.0, 0.1) Y = sigmoid(X) plt.plot(X, Y) plt.ylim(-0.1, 1.1) plt.show() sigmoid関数実装コード ℎ 67
  28. # coding: utf-8 import numpy as np import matplotlib.pylab as

    plt def relu(x): return np.maximum(0, x) x = np.arange(-5.0, 5.0, 0.1) y = relu(x) plt.plot(x, y) plt.ylim(-1.0, 5.5) plt.show() ℎ ReLU関数実装コード 68