[Deep Learning] Backpropagation

4760 ワード

  • Backprobagation
  • 逆転派
  • 逆転派は深い学習の核心内容である.数学に不慣れな立場で公式や微分を多く見ていると、これも手放したい内容です.しかし、すべての場所で非常に重要な概念なので、必ず知っておくべき内容は多くの場所で強調されています.

    Backpropagation?


    逆伝搬は人工ニューラルネットワークにおいて,モデルの予測値と実際の結果を後方に送信することによってモデルの重み値を学習する.純粋な伝播では、入力値と重み値を乗算して次のノードに出力します.このときに使用される重みが結果にどの程度影響するかは、逆伝播と言えます.
    従って,逆伝搬は微分により結果に及ぼす重み付け値の影響を計算した.また,誤差を現在認識すべき重み付け値に微分することができないため,chain ruleにより所望の結果を得ることができる.
    前回のsprint challengeでは逆転派が回答としての内容であることを説明させていただきました.この文章を通して、もっと詳しく整理します.

    Gradient Descent


    予測値と実際の値の違い,すなわち誤差を減らすことがニューラルネットワークの目標である.このとき誤差を減らす方法は勾配降下である.

    たとえば、上記のコスト関数があるとします.xxx軸はニューラルネットワーク重み付けベクトルであり,yyy軸は代価である誤差である.私たちの最終目標は誤差の最小点を見つけることです.アスタリスク表示点が現在の重み付けベクトルである場合、そのときの勾配、微分値を求め、その値の逆符号化(重み付け値の変更)、すなわち勾配降下に移動する.
    このプロセスを繰り返し、最終的にコスト値が最も小さい点を見つけます.

    Again Backpropagation


    では、逆伝播はどこで使われますか?
    視覚的に理解すると,勾配降下は現在の微分値を単純に求め,学習率を傾斜の反対方向に移動させるだけである.このとき,逆伝播移動といえる.Backpropagatoinによりwwwの値を更新し,新たなWWWベクトルを生成し,対価関数値を再求め勾配降下を行った.

    上記の例をもう一度考えてみましょう.まず,InputデータはInI nIn layerにより入力され,Hidden layerのHnHnHnによりyny nynの出力層結果が得られる.
    H1=I1W1+I2W3H2=I1W2+I2W4y1=H1V1+H2V3y2=H1V2+H2V4H_1 = I_1W1 + I_2W_3\\H_2 = I_1W_2 + I_2W_4\\y_1 = H_1V_1 + H_2V_3\\y_2 = H_1V_2 + H_2V_4H1​=I1​W1+I2​W3​H2​=I1​W2​+I2​W4​y1​=H1​V1​+H2​V3​y2​=H1​V2​+H2​V4​
    そして、costfunctionは、上図のようにMSEを例としている.逆伝搬は最後の層から計算するので、cost関数をV 1 V 1で微分すると、
    ∂Error∂V1=∂Error∂Y1∂Y1∂y1∂y1∂V1\frac{\partial Error}{\partial V_1} =\frac{\partial Error}{\partial Y_1}\frac{\partial Y_1}{\partial y_1}\frac{\partial y_1}{\partial V_1}∂V1​∂Error​=∂Y1​∂Error​∂y1​∂Y1​​∂V1​∂y1​​
    Y 1 Y 1 Y 1は最終予測値であり、Y 1 Y 1 Y 1は出力層の結果である.上記式はchain ruleで求めた微分の結果であり、その結果V 1 V 1が変化する.

    python code


    複雑で長い説明ですが、フレームワークを使用するとコードが非常に簡単になります.
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense
     
    model = Sequential()
    
    # 신경망 모델 구조 정의
    model.add(Dense(3, input_dim=2, activation='sigmoid'))
    model.add(Dense(1, activation='sigmoid'))
    
    # 컴파일 단계, 옵티마이저와 손실함수, 측정지표를 연결해서 계산 그래프를 구성을 마무리 합니다.
    model.compile(optimizer='sgd', loss='mse', metrics=['mae', 'mse'])
    # model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # 분류인 경우 예시
    
    results = model.fit(X,y, epochs=50)
    逆伝播はコードでは表示されません.次いでoptimizer parameterにより勾配低下が見出された.