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

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

dproject21
November 17, 2016

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

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

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

dproject21

November 17, 2016
Tweet

More Decks by dproject21

Other Decks in Technology

Transcript

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

    View Slide

  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/

    View Slide

  3. パーセプトロンとは
    • パーセプトロンは、複数の信号を⼊⼒として受け取り、ひとつ
    の信号を出⼒します。
    ここで⾔う「信号」とは、電流や川のような「流れ」をもつも
    のをイメージするとよいでしょう。
    電流が導線を流れ、電⼦を先に送り出すように、パーセプトロ
    ンの信号も流れを作り、情報を先へと伝達していきます。
    ただし、実際の電流とは違い、 パーセプトロンの信号は「流す
    /流さない(1 か 0)」の⼆値の値です。
    本書では、0 を「信号を流さない」、1 を「信号を流す」に対
    応させて記述します。
    (21pより引⽤)

    View Slide

  4. パーセプトロンとは
    ≤ のとき0
    > のとき1
    (ニューロンが
    発⽕する)
    '
    (

    '
    (
    出⼒信号
    ⼊⼒信号 重み
    ノード
    '
    '
    (
    (

    View Slide

  5. '
    (

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

    View Slide

  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)
    真理値表
    パラメータを当てはめると…

    View Slide

  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)
    真理値表
    パラメータを当てはめると…

    View Slide

  8. パーセプトロンでORゲート
    '
    (

    '
    (
    出⼒信号
    ⼊⼒信号 重み
    ノード
    '
    '
    (
    (
    '
    (

    0 0 0
    1 0 1
    0 1 1
    1 1 1
    = +
    0 ('
    '
    + (
    (
    ≤ )
    1 ('
    '
    + (
    (
    > )
    真理値表
    パラメータはどんな値?

    View Slide

  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)
    真理値表
    パラメータの例

    View Slide

  10. 機械学習の”学習“って?
    '
    (

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

    View Slide

  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 ('
    '
    + (
    (
    > )

    View Slide

  12. 重みとバイアスの導⼊
    '
    (

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

    View Slide

  13. 重みとバイアスの導⼊
    '
    (

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

    View Slide

  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
    バイアス
    インタプリタで実⾏すると…

    View Slide

  15. 重みとバイアスの導⼊
    '
    (

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

    View Slide

  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)
    バイアス

    View Slide

  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とは、重みとバイアスが変わる

    View Slide

  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とは、重みとバイアスが変わる

    View Slide

  19. 重みとバイアスの導⼊
    '
    (

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

    View Slide

  20. パーセプトロンでXORゲート
    '
    (

    '
    (
    出⼒信号
    ⼊⼒信号 重み
    ノード
    '
    '
    (
    (
    '
    (

    0 0 0
    1 0 1
    0 1 1
    1 1 0
    このパーセプトロンでは
    実現できない
    真理値表

    View Slide

  21. ORゲートの判定領域
    '
    (

    '
    (
    出⼒信号
    ⼊⼒信号 重み
    ノード
    '
    '
    (
    (
    バイアス
    出⼒0
    出⼒1
    1
    1
    1
    0
    線形な領域になっている

    View Slide

  22. XORゲートの判定領域
    '
    (

    '
    (
    出⼒信号
    ⼊⼒信号 重み
    ノード
    '
    '
    (
    (
    バイアス
    出⼒0
    出⼒1
    1
    1
    0
    0
    線形な領域では実現でき
    ない

    View Slide

  23. XORゲートの判定領域
    '
    (

    '
    (
    出⼒信号
    ⼊⼒信号 重み
    ノード
    '
    '
    (
    (
    バイアス
    出⼒0
    出⼒1
    1
    1
    0
    0
    ⾮線形な領域にしないと
    いけない
    ではどうするか

    View Slide

  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

    View Slide

  25. 多層パーセプトロンでXORゲート
    '
    (
    '
    (

    def XOR(x1, x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y
    AND, NAND, ORの
    組み合わせでXORの
    論理回路は実現できる。

    View Slide

  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の
    組み合わせで実現する
    '
    (

    View Slide

  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
    '

    (

    View Slide

  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

    View Slide

  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層

    View Slide