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 函数只是 WARP Loss 的一个实现,它返回梯度 wrt 输出。我想知道这是否就是我所需要的?我假设这将反向传播并更新所有层的参数。为了检查这一点,我训练了这个网络并保存了模型。然后我加载了模型并做了:

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

现在,我检查了 vector[1] 和 lookuptable.weight[1] ,它们是相同的。我不明白为什么查找表层中的权重没有更新?我在这里想念什么?

期待您的回复!

4

0 回答 0