LoginSignup
1
2

More than 3 years have passed since last update.

ゼロから作るディープラーニング 2-3章 まとめ パーセプトロンとニューラルネットワーク

Last updated at Posted at 2019-08-12

■背景・目的

  • 背景
    • ディープラーニングの仕組みを構造的に理解し、ディープラーニングのすごさを自分なりに要点を絞って、整理したい
  • 目的
    • 2-3章ではパーセプトロンとニューラルネットワークの違い、ニューラルネットワークの強みがまとめられるので、できるだけ短い文章で本質をまとめる

■要点

  • パーセプトロンとは何か

    • 概要
      • 複数の信号を入力として受け取り一つの信号を出力するもの
    • 構成要素
      • 入力値
        • 入力データ
      • 重み
        • 入力の重要度をコントロールするパラメータ
      • バイアス
        • 出力信号が1を出力する度合いを調整するパラメータ
      • 出力
        • 出力データ
    • パーセプトロンの限界
      • 直線でしか、データを分離することができない(XORゲートは実装できない)
  • パーセプトロンの課題を乗り越えた「ニューラルネットワーク」とは

    • そもそもニューラルネットワークを使う理由
      • 自動で重みを設定してくれるから。例えるなら、自分で勝手に勉強してくれる秀才君(ええ、私の方でやっておきました)
        • それに対してパーセプトロンは、重みは人間が与える必要がある。例えるなら、指示待ち人間(えっと次は何すればいいですか)
    • 概要
      • ニューラルネットワークは入力層、中間層、出力層で構成される
    • 活性化関数とは
      • 入力信号の総和を出力信号に変換するもの
      • 関数一覧と比較
        • 一覧(以下は下の実装パートで実装する)
          • シグモイド関数
          • ステップ関数
          • RELU関数
          • 恒等関数
        • 比較
          • シグモイド関数とステップ関数の比較
            • 相違点
              • 滑らかさ
                • シグモイド関数が入力に対して連続的に出力が変化する(つまり滑らか)に対して、ステップ関数は0を境に断絶的に出力が変わる
              • 出力内容
                • 両者とも出力を0から1の間に押し込める
            • 共通点
              • 両者が非線形性を持っているところ
    • 出力層の設計
      • 分類と回帰予測において出力層の活性化関数を選択する
        • 分類
          • ソフトマックス関数
        • 回帰
          • 恒等関数
            • 入力信号をそのまま出力するだけ

■実装内容

活性化関数の実装

  • シグモイド関数
sigmoid.py
def sigmoid(x):
    return 1/(1+np.exp(-x))
  • ステップ関数
step.py
#0より大きければ、1を返し、0以下であれば、0を返す
def step_function(x):
    y=x>0
    return y.astype(np.int)
  • RELU関数
#入力が0を超えていれば、その入力をそのまま出力し、0以下ならば0を出力する
def relu(x):
    return np.maximum(0,x)
  • 恒等関数
#入力値をそのまま出力する
def identify_function(x):
    return x
  • ソフトマックス関数
def softmax(a):
    c=np.max(a)
    exp_a=np.exp(a-c)
    sum_exp_a=np.sum(exp_a)
    y=exp_a/sum_exp_a
    return y

3層のニューラルネットワークの実装

#重みとバイアスの初期化し、returnで配列として返す
def init_work():
    network={}
    network['w1']=np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])
    network['b1']=np.array([0.1,0.2,0.3])
    network['w2']=np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])
    network['b2']=np.array([0.1,0.2])
    network['w3']=np.array([[0.1,0.3],[0.2,0.4]])
    network['b3']=np.array([0.1,0.2])

    return network

#init_workで定義した入力信号が出力信号へと変換されるプロセス
def forward(network,x):
    w1,w2,w3=network['w1'],network['w2'],network['w3']
    b1,b2,b3=network['b1'],network['b2'],network['b3']

    a1=np.dot(x,w1)+b1
    z1=sigmoid(a1)
    a2=np.dot(z1,w2)+b2
    z2=sigmoid(a2)
    a3=np.dot(z2,w3)+b3
    y=identify_function(a3)

    return y

#ネットワークの実装
network=init_work()
x=np.array([1.0,0.5])
y=forward(network,x)

print(y)

利用ライブラリ

import numpy as np

■疑問、課題点

  • ニューラルネットワークを構成する要素は理解したものの、ニューラルネットワークのすごさが何にもわかっていない。(この先の章でわかるはず)to be continued,,,,,

■改善点

  • 現時点ではないが、指摘等や誤りに築いた際に、記載するようにスペースとっておく

■参考

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2