■背景・目的
- 背景
- ディープラーニングの仕組みを構造的に理解し、ディープラーニングのすごさを自分なりに要点を絞って、整理したい
- 目的
- 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,,,,,
■改善点
- 現時点ではないが、指摘等や誤りに築いた際に、記載するようにスペースとっておく
■参考
- ゼロから作るDeep Learning――Pythonで学ぶディープラーニングの理論と実装