[最下層からの深さ学習]3ニューラルネットワーク第1部−アクティブ関数,3層ニューラルネットワークを実現
4650 ワード
🌿 ニューラルネットワーク
Perceptronで重みを設定するには、手動で完了する必要があります.
→ニューラルネットワークは自動的にデータから重み付けパラメータの適切な値を学習する
次の図は、ニューラルネットワークの例の1つです.
アクティブ化関数
activation function
入力信号の総和を出力信号の関数に変換する
入力信号の合計がアクティブかどうかを判断します.
重み付け信号をaというノードに結合し、アクティブ化関数h()によりyというノードに変換する.
📍 しんごうかんすう
sigmoid function
exp(-x)はe^{-x}を表し、eは自然定数、2.7182...値の実数
ニューラルネットワークは,活性化関数変換信号として信号関数を用い,変換後の信号を次のニューロンに伝達する
信号関数は以下のように実現できる.
📍 かいだんかんすう
step function
ステップ関数は、入力が0より大きい場合に1を出力し、入力が0より大きい場合に0を出力します.
信号関数と階段関数共通点 入力が小さいほど出力が0に近づく、入力が大きいほど出力が1 に近づく.非線形関数 差異 信号関数の出力は連続的に変化し、ステップ関数の出力は0を境界とする.
**線形関数はニューラルネットワーク層を深くする意味がないため、ニューラルネットワークは非線形関数を活性化関数として使用する必要がある
📍 ReLU関数
入力が0より大きい場合は0を出力し、入力が0より小さい場合は0を出力します.
RELU関数は次のように実装できます.
マトリックス積を用いて三層ニューラルネットワークを構築する
入力層から第1層への信号伝達は以下の通りである.
a 1=w 11 x 1+w 12 x 2+b 1のように、2つの重み付け信号と2つの偏向加算で算出された値.
マトリクス乗算により、第1層の重み付け部分をA=XW+Bに簡略化することができる.
これは次のようになります.
ここで、活性化関数として信号関数を用いると、以下のようになる.
出力レイヤは、これまでの実装とほぼ同じであり、アクティブ化関数だけがこれまでの非表示レイヤとは異なる.
出力層のアクティブ化関数は問題の性質によって決まる
一般的に使用されるアクティブ化関数は次のとおりです.回帰→恒等関数 2類分類→信号関数 多種類分類→ソフトMax関数 最後に上記の実装をまとめ,3層ニューラルネットワークは以下のように実現した.
Perceptronで重みを設定するには、手動で完了する必要があります.
→ニューラルネットワークは自動的にデータから重み付けパラメータの適切な値を学習する
次の図は、ニューラルネットワークの例の1つです.
アクティブ化関数
activation function
入力信号の総和を出力信号の関数に変換する
入力信号の合計がアクティブかどうかを判断します.
重み付け信号をaというノードに結合し、アクティブ化関数h()によりyというノードに変換する.
📍 しんごうかんすう
sigmoid function
exp(-x)はe^{-x}を表し、eは自然定数、2.7182...値の実数
ニューラルネットワークは,活性化関数変換信号として信号関数を用い,変換後の信号を次のニューロンに伝達する
信号関数は以下のように実現できる.
def sigmoid(x):
return 1 / (1 + np.exp(-x))
📍 かいだんかんすう
step function
ステップ関数は、入力が0より大きい場合に1を出力し、入力が0より大きい場合に0を出力します.
def step_function(x):
if x > 0:
return 1
else:
return 0
ファイル番号をサポートするコードを変更します.def step_function(x):
y = x > 0
return y.astype(np.int)
信号関数と階段関数
📍 ReLU関数
入力が0より大きい場合は0を出力し、入力が0より小さい場合は0を出力します.
RELU関数は次のように実装できます.
def relu(x):
return np.maximum(0, x)
三層ニューラルネットワークの実施マトリックス積を用いて三層ニューラルネットワークを構築する
入力層から第1層への信号伝達は以下の通りである.
a 1=w 11 x 1+w 12 x 2+b 1のように、2つの重み付け信号と2つの偏向加算で算出された値.
マトリクス乗算により、第1層の重み付け部分をA=XW+Bに簡略化することができる.
これは次のようになります.
import numpy as np
X = np.array([1.0,0.5])
W1 = np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])
B1 = np.array([0.1,0.2,0.3])
A1 = np.dot(X,W1) + B1
print(A1)
次に、最初のレイヤのアクティブ化関数を見てみましょう.ここで、活性化関数として信号関数を用いると、以下のようになる.
Z1 = sigmoid(A1)
print(A1) # [0.3, 0.7, 1.1]
print(Z1) # [0.55444252, 0.66818777, 0.75026011]
1階から2階までの過程は前とあまり差がありません.W2 = np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])
B2 = np.array([0.1,0.2])
print(Z1.shape) # (3, )
print(W2.shape) # (3, 2)
print(B2.shape) # (2, )
A2 = np.dot(Z1, W2) + B2
Z2 = sigmoid(A2)
最後に、第2層から出力層への信号伝達を見てみましょう.出力レイヤは、これまでの実装とほぼ同じであり、アクティブ化関数だけがこれまでの非表示レイヤとは異なる.
def identity_function(x):
return x
W3 = np.array([[0.1,0.3],[0.2,0.4]])
B3 = np.array([0.1,0.2])
A3 = np.dot(Z2, W3) + B3
Y = identity_function(A3) # 혹은 Y = A3
ここでは定等関数identity function()を定義し,出力層のアクティブ化関数として利用する.出力層のアクティブ化関数は問題の性質によって決まる
一般的に使用されるアクティブ化関数は次のとおりです.
from sigmoid import sigmoid
from identity_function import identity_function
import numpy as np
def init_network():
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
def forward(network, x):
W1, W2, W3 = network['W1'], network['W2'], network['W3']
b1, b2, b3 = network['b1'], network['b2'], network['b3']
# input Layer -> Layer 1
a1 = np.dot(x, W1) + b1
z1 = sigmoid(a1)
# Layer 1 -> Layer 2
a2 = np.dot(z1, W2) + b2
z2 = sigmoid(a2)
# Layer 2 -> Output Layer
a3 = np.dot(z2, W3) + b3
y = identity_function(a3)
return y
network = init_network()
x = np.array([1.0, 0.5])
y = forward(network, x)
print(y)
Reference
この問題について([最下層からの深さ学習]3ニューラルネットワーク第1部−アクティブ関数,3層ニューラルネットワークを実現), 我々は、より多くの情報をここで見つけました https://velog.io/@kyj93790/밑바닥부터-시작하는-딥러닝-3.-신경망-part1-활성화-함수-3층-신경망-구현テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol