0

2層ネットワークのANNを実装しましたが、体重更新コードを勢いよく変更する必要がありますが、どうすれば更新できるのかを知る必要があります。以下は重量更新のみのコードスナップです。下のコードは、見た各例の重みを更新します。hiddenWightsは隠れ層の重みです。また、outputWeightsは出力層の重みです。オンラインバックプロパゲーション重量更新の運動量項を追加するか?

for examplen = 1: nTrainingExamples 
      inputVector = inputs(:,examplen); 
      HiddenLayerOutput = sigmoid(hiddenWeights * inputVector); 
      OutputLayerOutput = sigmoid(outputWeights * HiddenLayerOutput); 

      l2_error = OutputLayerOutput - targets(:, examplen); 
      l2_delta = learningRates(1, i) .* (OutputLayerOutput .* (1 - OutputLayerOutput)) .* l2_error; 
      l2_v = mu * l2_v - l2_delta * t; 

      l1_delta = learningRates(1, i) .* (HiddenLayerOutput .* (1 - HiddenLayerOutput)) .* (outputWeights' * l2_delta); 
      l1_v = mu * l1_v - l1_delta * t; 
      % weights = weights + v 
      outputWeights = outputWeights + (l2_v*HiddenLayerOutput'); 
      hiddenWeights = hiddenWeights + (l1_v*inputVector'); 
     end 
+0

実装したい勢いは何ですか?古典的なものかNestrovのものか? –

+0

私はちょうど勢いの更新を追加する必要があります、私は正確に古典またはネスストの違いはわからないのですか? –

+0

この記事をチェックしてください:http://stats.stackexchange.com/questions/179915/whats-the-difference-between-momentum-based-gradient-descent-and-nesterovs-ac –

答えて

0

私たちの会話からは、古典的な運動量法(Nestrovではなく)を実装したいと思っています。したがって、追加のパラメータが必要です - 速度v時間tモメンタムmu定数です。

あなたが 0にあなたの速度を設定する必要が学習の開始時に

v = 0 

と(例えば0.9)とmu(例えば0.1に設定します)tのいくつかの値を選択します。あなたは、以下のルールに従って、あなたの重みを変更する必要があります訓練の各反復中

v = mu * v - delta * t 
weights = weights + v 

パラメータmutは、メタパラメータであり、あなたはグリッドまたはランダム探索によってそれらの良好な値を見つけることができます。

+0

両方のデルタを別々に見つける必要がありますか、どちらのデルタにも同じvを使用する必要がありますか? –

+0

デルタごとに別々に。 –

+0

Marcin :)ありがとう、私もそれにドロップアウトを適用するのに役立つ必要があります、あなたはそれのための任意のポストを共有することはできますか? –

関連する問題