Torch: embedding层的实现

我是torch的初学者,正在阅读LSTM语言模型的代码。我对embedding层的实现(https://github.com/oxford-cs-ml-2015/practical6/blob/master/Embedding.lua)感到困惑。

这是embedding层中的updateGradInput函数:

function Embedding:updateGradInput(input, gradOutput)
  if self.gradInput then
    self.gradInput:resize(input:size())
    return self.gradInput
  end
end

我的第一个问题是为什么在这个函数中有一个if语句,而不是像下面一样:

function Embedding:updateGradInput(input, gradOutput)
  self.gradInput:resize(input:size())
  return self.gradInput
end

我认为self.gradInput将始终为真,因为在nn.Module__init()中已经初始化了self.gradInput

我的第二个问题是为什么直接返回self.gradInput,而不是使用inputgradOutput计算self.gradInput?我的意思是self.gradInput = gradOutput *(关于输入的输出的导数)

我最后一个问题是关于Embedding.lua中这段代码的影响是什么:

-- we do not need to accumulate parameters when sharing
Embedding.sharedAccUpdateGradParameters = Embedding.accUpdateGradParameters

"我们在共享时不需要累积参数"是什么意思?

点赞
用户117844
用户117844

(1) 的原因是如果有人明确地取消 gradInput,则不要计算它。 (2) 的原因是嵌入层实际上没有 gradInput,输入不可微分。

2016-03-28 17:51:57