我正在尝试实现具有多层的神经网络。我试图了解我所做的是否正确,如果不正确,我该如何调试。我这样做的方式是,我以以下方式定义我的神经网络(我使用一些先前学习的嵌入来初始化可查找层):
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] ,它们是相同的。我不明白为什么查找表层中的权重没有更新?我在这里想念什么?
期待您的回复!