[最下層からの深さ学習]3ニューラルネットワーク第1部−アクティブ関数,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)

信号関数と階段関数
  • 共通点
  • 入力が小さいほど出力が0に近づく、入力が大きいほど出力が1
  • に近づく.
  • 非線形関数
  • 差異
  • 信号関数の出力は連続的に変化し、ステップ関数の出力は0を境界とする.
  • **線形関数はニューラルネットワーク層を深くする意味がないため、ニューラルネットワークは非線形関数を活性化関数として使用する必要がある
    📍 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()を定義し,出力層のアクティブ化関数として利用する.
    出力層のアクティブ化関数は問題の性質によって決まる
    一般的に使用されるアクティブ化関数は次のとおりです.
  • 回帰→恒等関数
  • 2類分類→信号関数
  • 多種類分類→ソフトMax関数
  • 最後に上記の実装をまとめ,3層ニューラルネットワークは以下のように実現した.
    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)