ゼロから作るDeepLearning読書会 in YOKOHAMA vol.0 第2章「パーセプトロン」

7806b36df14baf48a05ea5471ac5662e?s=47 dproject21
November 17, 2016

ゼロから作るDeepLearning読書会 in YOKOHAMA vol.0 第2章「パーセプトロン」

オライリー・ジャパンから刊行された「ゼロから作るDeepLearning」の読書会を横浜で開催しています。
その第0回として、同書第2章の「パーセプトロン」をサンプルを兼ねて資料作成・発表をしました。

※当日発表の際に頂いた質問などを盛り込んで加筆修正しています。

7806b36df14baf48a05ea5471ac5662e?s=128

dproject21

November 17, 2016
Tweet

Transcript

  1. 「ゼロから作るDeepLearning」 読書会 in YOKOHAMA vol.0 第2章 「パーセプトロン」 たのっち @dproject21 2016.11.17

    さくらWORKS<関内>
  2. 読書会で読む本、読書会について • 「ゼロから作るDeepLearning」斎藤 康毅 著 オライリー・ジャパンより2016年9⽉ 発⾏ https://www.oreilly.co.jp/books/9784873117584/ • 公式サポートページ

    https://github.com/oreilly-japan/deep-learning-from-scratch • 読書会⽤リポジトリ(Wikiで情報集約の予定) https://github.com/dproject21/deep-learning-from-scratch • 読書会Connpassグループ(隔週⽊曜20:00開催予定) https://deeplearning-yokohama.connpass.com/
  3. パーセプトロンとは • パーセプトロンは、複数の信号を⼊⼒として受け取り、ひとつ の信号を出⼒します。 ここで⾔う「信号」とは、電流や川のような「流れ」をもつも のをイメージするとよいでしょう。 電流が導線を流れ、電⼦を先に送り出すように、パーセプトロ ンの信号も流れを作り、情報を先へと伝達していきます。 ただし、実際の電流とは違い、 パーセプトロンの信号は「流す

    /流さない(1 か 0)」の⼆値の値です。 本書では、0 を「信号を流さない」、1 を「信号を流す」に対 応させて記述します。 (21pより引⽤)
  4. パーセプトロンとは ≤ のとき0 > のとき1 (ニューロンが 発⽕する) ' ( '

    ( 出⼒信号 ⼊⼒信号 重み ノード ' ' ( (
  5. ' ( ' ( パーセプトロンとは 出⼒信号 ⼊⼒信号 重み ノード '

    ' ( ( = + 0 (' ' + ( ( ≤ ) 1 (' ' + ( ( > ) 式にすると… (式 2.1)
  6. パーセプトロンでANDゲート ' ( ' ( 出⼒信号 ⼊⼒信号 重み ノード '

    ' ( ( ' ( 0 0 0 1 0 0 0 1 0 1 1 1 = + 0 (0.5' + 0.5( ≤ 0.7) 1 (0.5' + 0.5( > 0.7) 真理値表 パラメータを当てはめると…
  7. パーセプトロンでNANDゲート ' ( ' ( 出⼒信号 ⼊⼒信号 重み ノード '

    ' ( ( ' ( 0 0 1 1 0 1 0 1 1 1 1 0 = + 0 (−0.5' + −0.5( ≤ −0.7) 1 (−0.5' + −0.5( > −0.7) 真理値表 パラメータを当てはめると…
  8. パーセプトロンでORゲート ' ( ' ( 出⼒信号 ⼊⼒信号 重み ノード '

    ' ( ( ' ( 0 0 0 1 0 1 0 1 1 1 1 1 = + 0 (' ' + ( ( ≤ ) 1 (' ' + ( ( > ) 真理値表 パラメータはどんな値?
  9. パーセプトロンでORゲート (パラメータ⼊れてみた) ' ( ' ( 出⼒信号 ⼊⼒信号 重み ノード

    ' ' ( ( ' ( 0 0 0 1 0 1 0 1 1 1 1 1 = + 0 (0.5' + 0.5( ≤ 0.4) 1 (0.5' + 0.5( > 0.4) 真理値表 パラメータの例
  10. 機械学習の”学習“って? ' ( ' ( 出⼒信号 ⼊⼒信号 重み ノード '

    ' ( ( パーセプトロンのパラメー タを決めているのは⼈間。 機械学習の問題では、この パラメータの値を決める作 業をコンピュータに⾃動で ⾏わせる。 コンピュータがやること: 適切なパラメータを決める 作業(学習) ⼈間がやること: パーセプトロンの構造 (モ デル)を考え、コンピュー タに学習データを与える。
  11. ANDゲートをPythonで実装 ' ( ' ( 出⼒信号 ⼊⼒信号 重み ノード '

    ' ( ( = + 0 (0.5' + 0.5( ≤ 0.7) 1 (0.5' + 0.5( > 0.7) def AND(x1, x2): w1, w2, theta = 0.5, 0.5, 0.7 tmp = x1*w1 + x2*w2 if tmp <= theta: return 0 elif tmp > theta: return 1 = + 0 (' ' + ( ( ≤ ) 1 (' ' + ( ( > )
  12. 重みとバイアスの導⼊ ' ( ' ( 出⼒信号 ⼊⼒信号 重み ノード '

    ' ( ( = + 0 (' ' + ( ( ≤ ) 1 (' ' + ( ( > ) = + 0 (' ' + ( ( ≤ −) 1 (' ' + ( ( > −) = + 0 ( + ' ' + ( ( ≤ 0) 1 ( + ' ' + ( ( > 0) バイアス (式 2.1) (式 2.2)
  13. 重みとバイアスの導⼊ ' ( ' ( 出⼒信号 ⼊⼒信号 重み ノード '

    ' ( ( = + 0 ( + ' ' + ( ( ≤ 0) 1 ( + ' ' + ( ( > 0) バイアスとは ニューロンの発⽕のしやすさ (出⼒信号が1を出⼒する度合い) を調整するパラメータ バイアス (式 2.2)
  14. 重みとバイアスの導⼊ ' ( ' ( 出⼒信号 ⼊⼒信号 重み ノード '

    ' ( ( = + 0 ( + ' ' + ( ( ≤ 0) 1 ( + ' ' + ( ( > 0) >>> import numpy as np >>> x = np.array([0, 1)] #入力 >>> w = np.array([0.5, 0.5]) #重み >>> b = -0.7 #バイアス >>> w*x array([0. , 0.5]) >>> np.sum(w*x) 0.5 >>> np.sum(w*x) + b -0.19999999999999996 バイアス インタプリタで実⾏すると…
  15. 重みとバイアスの導⼊ ' ( ' ( 出⼒信号 ⼊⼒信号 重み ノード '

    ' ( ( = + 0 ( + ' ' + ( ( ≤ 0) 1 ( + ' ' + ( ( > 0) ▪当⽇受けた質問 なぜバイアスを⼊れるのか? ▪回答 (おそらく)正規化をしている。 をバイアスにすることで、 右辺が0になる。 すると、式が扱いやすくなる。 バイアス
  16. ANDゲートをPythonで実装 (バイアス付き) ' ( ' ( 出⼒信号 ⼊⼒信号 重み ノード

    ' ' ( ( 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 = + 0 ( + ' ' + ( ( ≤ 0) 1 ( + ' ' + ( ( > 0) バイアス
  17. NANDゲートをPythonで実装 (バイアス付き) ' ( ' ( 出⼒信号 ⼊⼒信号 重み ノード

    ' ' ( ( def NAND(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 = + 0 ( + ' ' + ( ( ≤ 0) 1 ( + ' ' + ( ( > 0) バイアス ANDとは、重みとバイアスが変わる
  18. ORゲートをPythonで実装 (バイアス付き) ' ( ' ( 出⼒信号 ⼊⼒信号 重み ノード

    ' ' ( ( 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 = + 0 ( + ' ' + ( ( ≤ 0) 1 ( + ' ' + ( ( > 0) バイアス ANDとは、重みとバイアスが変わる
  19. 重みとバイアスの導⼊ ' ( ' ( 出⼒信号 ⼊⼒信号 重み ノード '

    ' ( ( = + 0 ( + ' ' + ( ( ≤ 0) 1 ( + ' ' + ( ( > 0) 同じパーセプトロンでも、 重みとバイアスを変えれば 別の特性を持ったものに することができる。 バイアス
  20. パーセプトロンでXORゲート ' ( ' ( 出⼒信号 ⼊⼒信号 重み ノード '

    ' ( ( ' ( 0 0 0 1 0 1 0 1 1 1 1 0 このパーセプトロンでは 実現できない 真理値表
  21. ORゲートの判定領域 ' ( ' ( 出⼒信号 ⼊⼒信号 重み ノード '

    ' ( ( バイアス 出⼒0 出⼒1 1 1 1 0 線形な領域になっている
  22. XORゲートの判定領域 ' ( ' ( 出⼒信号 ⼊⼒信号 重み ノード '

    ' ( ( バイアス 出⼒0 出⼒1 1 1 0 0 線形な領域では実現でき ない
  23. XORゲートの判定領域 ' ( ' ( 出⼒信号 ⼊⼒信号 重み ノード '

    ' ( ( バイアス 出⼒0 出⼒1 1 1 0 0 ⾮線形な領域にしないと いけない ではどうするか
  24. 多層パーセプトロンでXORゲート AND, NAND, ORの 組み合わせでXORの 論理回路は実現できる。 ' ( ' (

    ' ( ' ( 0 0 1 0 0 1 0 1 1 1 0 1 1 1 1 1 1 0 1 0
  25. 多層パーセプトロンでXORゲート ' ( ' ( def XOR(x1, x2): s1 =

    NAND(x1, x2) s2 = OR(x1, x2) y = AND(s1, s2) return y AND, NAND, ORの 組み合わせでXORの 論理回路は実現できる。
  26. 多層パーセプトロンでXORゲート ' ( 第2層 第0層 第1層 ノード ' ( '

    ( 0 0 1 0 0 1 0 1 1 1 0 1 1 1 1 1 1 0 1 0 AND, NAND, ORの 組み合わせで実現する ' (
  27. 【おまけ】NANDのみでXORゲート NANDのみでも XORの論理回路は 実現できる。 ' ( ' ( ' (

    0 0 1 1 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 0 ' (
  28. 【おまけ】NANDのみでXORゲート NANDのみでも XORの論理回路は 実現できる。 ' ( ' ( def XOR(x1,

    x2): a = NAND(x1, x2) s1 = NAND(a, x1) s2 = NAND(a, x2) y = NAND(s1, s2) return y
  29. 【おまけ】NANDのみ版 多層パーセプトロンでXORゲート ' ( 第3層 第0層 第1層 NANDのみの場合、 こうなるのかもしれない '

    ( ' ( ' ( 0 0 1 1 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 0 第2層