1

複数のレイヤーを持つニューラル ネットワークを実装しようとしています。私が行ったことが正しいかどうかを理解しようとしています。そうでない場合は、どうすればこれをデバッグできますか。私が行う方法は、次の方法でニューラル ネットワークを定義することです (事前に学習した埋め込みでルックアップ可能レイヤーを初期化します)。

lookupTableLayer = nn.LookupTable(vector:size()[1], d)
for i=1,vector:size()[1] do
  lookupTableLayer.weight[i] = vector[i]
end
mlp=nn.Sequential();
mlp:add(lookupTableLayer)
mlp:add(nn.TemporalConvolution(d,H,K,dw))
mlp:add(nn.Tanh())
mlp:add(nn.Max(1))
mlp:add(nn.Tanh())
mlp:add(nn.Linear(H,d))

ここで、ネットワークをトレーニングするために、すべてのトレーニングの例をループし、すべての例に対して、次のコードを持つ gradUpdate() を呼び出します (これは例からそのままです)。

function gradUpdate(mlp, x, indexY, learningRate)
  local pred = mlp:forward(x)
  local gradCriterion = findGrad(pred, indexY)
  mlp:zeroGradParameters()
  mlp:backward(x, gradCriterion)
  mlp:updateParameters(learningRate)
end

findGrad 関数は、勾配 wrt 出力を返す WARP Loss の単なる実装です。これだけでいいのかな?これにより、すべてのレイヤーのパラメーターが逆伝播されて更新されると思います。これを確認するために、このネットワークをトレーニングし、モデルを保存しました。次に、モデルをロードして実行しました:

{load saved mlp after training}
lookuptable = mlp:findModules('nn.LookupTable')[1]

今、私は vector[1] と lookuptable.weight[1] をチェックしましたが、それらは同じでした。ルックアップ テーブル レイヤーの重みが更新されなかった理由がわかりません。ここで何が欠けていますか?

返信をお待ちしております。

4

0 に答える 0