【问题标题】:Torch: How are model parameters updated?Torch:模型参数如何更新?
【发布时间】:2018-01-31 07:10:18
【问题描述】:

这是一个玩具模型。我在调用backward 之前打印了模型参数一次,然后再次打印模型参数。参数不变。如果我在调用backward 之后添加行model:updateParameters(<learning_rate>),我会看到参数更新。

但是在我看到的示例代码中,例如https://github.com/torch/demos/blob/master/train-a-digit-classifier/train-on-mnist.lua,实际上没有人调用updateParameters。此外,它看起来也不像 optim.sgdoptim.adamnn.StochasticGradient 也不会调用 updateParameters。我在这里想念什么?参数如何自动更新?如果我必须调用updateParameters,为什么没有示例这样做?

require 'nn'
require 'optim'

local model = nn.Sequential()
model:add(nn.Linear(4, 1, false))
local params, grads = model:getParameters()

local criterion = nn.MSECriterion()
local inputs    = torch.randn(1, 4)
local labels    = torch.Tensor{1}

print(params)

model:zeroGradParameters()
local output = model:forward(inputs)
local loss   = criterion:forward(output, labels)
local dfdw   = criterion:backward(output, labels)
model:backward(inputs, dfdw)

-- With the line below uncommented, the parameters are updated:
-- model:updateParameters(1000)

print(params)

【问题讨论】:

    标签: machine-learning lua torch


    【解决方案1】:

    backward() 不应该改变参数,它只是计算误差函数对网络所有参数的导数。

    一般来说,训练是步骤的顺序:

    repeat
      local output = model:forward(input) --see what model predicts
      local loss = criterion:forward(output, answer) --see how wrong it is
      local loss_grad = criterion:backward(output, answer) --see where it is the most wrong
      model:backward(input,loss_grad) --see how much each particular parameter of network is responsible for error
      model:updateParameters(learningRate) --fix the parameters based on their wrongness
      model:zeroGradParameters() --network parameters are different now, so old gradients are of no use now
    until is_user_satisfied()
    

    updateParameters在这里实现了最简单的优化算法(梯度下降)。 如果愿意,您可以改用自己的功能。理论上,您可以通过网络存储执行显式循环以更新它们的值。 在实践中,您通常会调用getParameters()

    local model_parameters,model_parameters_gradient=model:getParameters()
    

    这会产生所有值和梯度的齐次张量。这些张量是网络内部的视图,因此它们的变化会影响网络。 您可能不知道网络中的哪个点对应哪个值,但大多数优化器并不关心这一点。

    optim.sgddemo用法如下:

    optim.sgd(
       function_to_return_error_and_its_gradients, 
       model_parameters,
       optimizer_special_settings)
    

    demo 中介绍了具体细节,但在这里优化器接收model_parameters 作为参数,使其具有对网络的写访问权限是相关的。并且在文档中没有明确说明,但在 source code 中可以看出,优化器更改了其输入张量的值(另外,请注意它返回的 same 张量)。

    【讨论】:

    • 真的很彻底,谢谢。所以重申一下,updateParameters 用于“手动”更新参数。优化算法只是更新它们对展平参数的引用,因为调用 updateParameters 不会考虑优化。
    猜你喜欢
    • 2016-03-15
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 2017-05-21
    • 2021-09-10
    • 1970-01-01
    • 2020-04-01
    • 2020-11-21
    相关资源
    最近更新 更多