私のニューラルネットワークに対する認識


ニューラルネットワークに接触して半年になりましたが、細部についてはよく分かりません.いつも霧の中で花を見ているような感じがします.今日は本を読んで、茅塞半頓開状態があります.私のニューラルネットワークに対する理解を書いて、主にコードの細部を話します.
 
ニューラルネットワークモデルを訓練するとき、私たちはまず以下のモデル構造を定義し、コードは注釈を書いた.監督学習があると仮定し、訓練セットと対応するラベルを入力します.ここで私たちが決めたニューラルネットワークモデルは次のとおりです.
#           
def init_network():
    #      
    network = {}

 
これは空のニューラルネットワークであり,次にデータを定義し,3層のニューラルネットワークを定義し,重みバイアス等値を与えた.すべて理解できるはずです.簡単です.
#           
def init_network():
    #      
    network = {}
    
    #       ,  W1
    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])
    #       ,  W2
    network['W2'] = np.array([[0.1, 0.4],[0.2, 0.5], [0.3, 0.6]])
    network['b2'] = np.array([0.1, 0.2])
    #       ,  W3
    network['W3'] = np.array([[0.1, 0.3], [0.2, 0.4]])
    network['b3'] = np.array([0.1, 0.2])
    return network

 
モデルを定義した後、私たちはモデルの流れを定義し始めました.つまり、どのように歩いて、データがどの道に沿って歩いているのか、入力データa、aが配列または数字であると仮定して、network['W 1']に乗算し、それからバイアスb 1を加えて、それからアクティブにして、z 1になります.
その後、第2層に入り、network['W 2']に乗算し、バイアスb 2を加えて活性化し、z 2になる.
最後に第3層に入り、network['W 3']に乗算し、バイアスb 3を加えた後、恒等関数を経てz 3、すなわちyとなり、出力値が得られる.
次はコード表示ですが、簡単です.
#    ,               
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 = identity_function(a3)
    
    return y

最後にデータを入れます.すべてのコードは以下の通りです.
# -*- coding: utf-8 -*-
"""
Created on Wed Mar 20 20:10:29 2019

@author: zlee
"""

import numpy as np

#    
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

#    ,       
def identity_function(x):
    return x

#           
def init_network():
    #      
    network = {}
    
    #       ,  W1
    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])
    #       ,  W2
    network['W2'] = np.array([[0.1, 0.4],[0.2, 0.5], [0.3, 0.6]])
    network['b2'] = np.array([0.1, 0.2])
    #       ,  W3
    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']
    
    #        
    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 = identity_function(a3)
    
    return y

if __name__ =='__main__':
    network = init_network()
    x = np.array([1.0, 0.5])
    y = forward(network, x)
    print(y)

以上の結果は、[0.316822708 0.69627909]
 
これは定義されたモデルで、機械の変更はありません.
このコードに基づいて、ラベルを定義すると、トレーニングセットが出力すべき値、例えば上のネットワークに対して、xとして「1,0.5」という配列を入力し、期待される値は「0.5,0.5」であり、実際の値は「0.316822708 0.6962709」であることがわかります.解決策は重みパラメータを変更するだけで,ニューラルネットワークの機能が現れる.調整パラメータを自動的に調整して、私たちが望む結果を達成します.例えば、結果が「0.7,0.8」になると、ネットワークは絶えず循環し、反復し、パラメータの重みを調整して、私たちが与えた目標値に合致します.
深さ学習に対応する画像マトリクスは入力値であり,ボリュームプール化操作はネットワーク構造であり,彼らのパラメータを絶えず調整し,我々が望む結果を達成する.
 
私もここで大胆な推測があります.なぜ人々は機械学習の性能、パラメータの調整が玄学だと言っていますか.異なるパラメータは異なる異なる効果に対応し、複数のパラメータは同じ良い効果に達しますが、パラメータ間には関係ありません.なぜこのパラメータで効果がこんなに良いのか分からない.ネットワーク構造の大量のパラメータが存在するためだと思います.例えば、数万個、数千万個、パラメータの複雑さは私たちの推理計算能力を上回っているので、玄学のせいで、実はネットワーク構造の複雑な相関性によるものです.
 
私のブログに注目して、好評を博します~