2017-12-30 22 views
0

私は、さまざまなリソースを使ってすべての部分をまとめて、Pythonでニューラルネットワークモデルを開発しています。すべてが機能していますが、数学のいくつかについて質問があります。モデルにはさまざまな隠れ層があり、最後に隠されたレイヤーを除くすべての隠しレイヤーに対してreluを使用します。これはシグモイドを使用します。pythonを使ったバックプロパゲーション/ numpy - ニューラルネットワークの重みとバイアス行列の導関数を計算する

コスト関数は:ALが最後シグモイド活性化後確率予測をある

def calc_cost(AL, Y): 
    m = Y.shape[1] 
    cost = (-1/m) * np.sum((Y * np.log(AL)) - ((1 - Y) * np.log(1 - AL))) 
    return cost 

が適用されます。バックプロパゲーションの私の実装の一部で

、Iは、(任意の層で前方伝播の線形ステップに対するコストの誘導体)dZを与え、

def linear_backward_step(dZ, A_prev, W, b): 
    m = A_prev.shape[1] 

    dW = (1/m) * np.dot(dZ, A_prev.T) 
    db = (1/m) * np.sum(dZ, axis=1, keepdims=True) 
    dA_prev = np.dot(W.T, dZ) 

    return dA_prev, dW, db 

を以下の使用、誘導体層の重み行列W、バイアスベクトルb、および前の層の活性化の導関数dA_prevのそれぞれが計算される。

このステップに補完している前方部分は、この方程式である:Z = np.dot(W, A_prev) + b

私の質問は:dWdbを計算するには、なぜそれが1/mで乗算する必要があるのでしょうか?私は微積分のルールを使ってこれを差別化しようとしましたが、この用語がどのように適合するかは不明です。

助けてください!

答えて

0

これは実際にあなたの損失関数に依存し、各サンプルの後に重量を更新した場合、またはバッチ式で更新した場合に発生します。以下の昔ながらの汎用コスト関数を見てみましょう:

enter image description here

出典:MSE Cost Function for Training Neural Networkここ

は、のは、y^_iは、あなたのネットワークの出力であり、y_iがあなたの目標値であるとしましょう。 y^_iはネットの出力です。

これをy^_iと区別すると、合計の導関数が導関数の合計であるため、1/nまたはその合計を決して除外できません。 1/nは合計の要素なので、これも取り除くことはできません。さて、標準的なグラデーションの降下が実際に何をしているのか考えてみましょう。それはすべてのnサンプルの平均を計算した後にあなたの体重を更新します。確率的な勾配降下は、各サンプルの後に更新するために使用することができるので、平均化する必要はありません。バッチ更新は各バッチの平均を計算します。あなたのケースでは、1/mです。ここで、mはバッチサイズです。

0

勾配の計算が間違っているようです。あなたは1/mでそれを掛けません。また、mの計算も間違っているようです。それはまた、

# note it's not A_prev.shape[1] 
m = A_prev.shape[0] 

、あなたがより多くの情報については、次の例を参照することができます

あなたcalc_cost機能

# should not be Y.shape[1] 
m = Y.shape[0] 
で定義する必要があります。

Neural Network Case Study

関連する問題