火炬 - LookupTable和渐变更新

时间:2015-04-02 12:11:26

标签: machine-learning neural-network gradient-descent torch conv-neural-network

我正在尝试实现具有多个层的神经网络。我试图了解我所做的是否正确,如果没有,我该如何调试。我这样做的方式是,我以下面的方式定义我的神经网络(我使用一些先前学过的嵌入来初始化可查询层):

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

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

现在,我检查了vector [1]和lookuptable.weight [1],它们是相同的。我无法理解为什么查找表层中的权重没有得到更新?我在这里缺少什么?

期待您的回复!

0 个答案:

没有答案