Torch:模型参数是如何更新的?
Torch: How are model parameters updated?
这是一个玩具模型。我在调用 backward
之前只打印一次模型参数,然后再次打印模型参数。参数不变。如果我在调用 backward
后添加行 model:updateParameters(<learning_rate>)
,我会看到参数更新。
但是在我看到的示例代码中,例如https://github.com/torch/demos/blob/master/train-a-digit-classifier/train-on-mnist.lua,实际上没有人调用updateParameters
。此外,它看起来也不像 optim.sgd
、optim.adam
或 nn.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)
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.sgd
的demo用法如下:
optim.sgd(
function_to_return_error_and_its_gradients,
model_parameters,
optimizer_special_settings)
具体细节在演示中有所介绍,但这里相关的是优化器接收 model_parameters
作为参数,该参数赋予它对网络的写入权限。文档中没有明确说明,但在 source code 中可以看出,优化器更改了其输入张量的值(另外,请注意它返回 same它收到的张量)。
这是一个玩具模型。我在调用 backward
之前只打印一次模型参数,然后再次打印模型参数。参数不变。如果我在调用 backward
后添加行 model:updateParameters(<learning_rate>)
,我会看到参数更新。
但是在我看到的示例代码中,例如https://github.com/torch/demos/blob/master/train-a-digit-classifier/train-on-mnist.lua,实际上没有人调用updateParameters
。此外,它看起来也不像 optim.sgd
、optim.adam
或 nn.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)
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.sgd
的demo用法如下:
optim.sgd(
function_to_return_error_and_its_gradients,
model_parameters,
optimizer_special_settings)
具体细节在演示中有所介绍,但这里相关的是优化器接收 model_parameters
作为参数,该参数赋予它对网络的写入权限。文档中没有明确说明,但在 source code 中可以看出,优化器更改了其输入张量的值(另外,请注意它返回 same它收到的张量)。