Machine learning 火炬-可查找和梯度更新

Machine learning 火炬-可查找和梯度更新,machine-learning,neural-network,gradient-descent,torch,conv-neural-network,Machine Learning,Neural Network,Gradient Descent,Torch,Conv Neural Network,我正在尝试实现一个多层神经网络。我试图了解我所做的是否正确,如果不正确,我如何调试它。我这样做的方式是,我用以下方式定义我的神经网络(我用一些事先学习的嵌入初始化可查找层): 现在,为了训练网络,我循环了每个训练示例,对于每个示例,我调用gradUpdate(),其中包含以下代码(这是直接从示例中获得的): findGrad函数只是一个WARP Loss的实现,它返回gradient wrt输出。我想知道这是否就是我所需要的?我假设这将反向传播并更新所有层的参数。为了验证这一点,我训练了这个网络

我正在尝试实现一个多层神经网络。我试图了解我所做的是否正确,如果不正确,我如何调试它。我这样做的方式是,我用以下方式定义我的神经网络(我用一些事先学习的嵌入初始化可查找层):

现在,为了训练网络,我循环了每个训练示例,对于每个示例,我调用gradUpdate(),其中包含以下代码(这是直接从示例中获得的):

findGrad函数只是一个WARP Loss的实现,它返回gradient wrt输出。我想知道这是否就是我所需要的?我假设这将反向传播并更新所有层的参数。为了验证这一点,我训练了这个网络并保存了模型。然后我加载模型并执行以下操作:

{load saved mlp after training}
lookuptable = mlp:findModules('nn.LookupTable')[1]
现在,我检查了向量[1]和lookuptable.weight[1],它们是相同的。我不明白为什么查找表层中的权重没有得到更新?我错过了什么


期待您的回复

向量[1]是否在训练期间显示?LookupTable在小批量期间对索引的嵌入进行稀疏梯度更新,比较整个LookupTable在前后的权重规范(看看它们是否精确或略有不同),非常确定vector[1]是其中一个训练示例中的输入,因为它是语料库中最常见的单词,不过我会确认。我还检查了其他几个随机索引,它们似乎是相同的。我会检查标准并在这里发布。总的来说,实现看起来好吗?我不确定gradUpdate()函数中的所有操作是否都正确。看起来,WSABIE论文中指定的正则化参数的选择存在问题。我们需要处理好这件事。谢谢
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
{load saved mlp after training}
lookuptable = mlp:findModules('nn.LookupTable')[1]