machine-learning - Torch:模型参数如何更新?

标签 machine-learning lua torch

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

但是在我看到的示例代码中,例如 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()

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

demo optim.sgd 的用法如下:

optim.sgd(
   function_to_return_error_and_its_gradients, 
   model_parameters,
   optimizer_special_settings)

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

关于machine-learning - Torch:模型参数如何更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45827100/

相关文章:

machine-learning - 假设数据正常但噪声均匀,如何从一组数据点中去除噪声?

python - 在新的看不见的数据集中评估我的模型

lua - 如何将第 3 方 lua 库(通过 luarocks 安装)加载到 haproxy

lua - Lua中表格的串联

string - 如何重载Lua字符串下标运算符?

pytorch - 手电筒 C++ : API to check NAN

lua - 如何将目录永久添加到 Lua 搜索路径?

matplotlib - 如何正确绘制 (loss_curve_) 从 MLPClassifier 获取的损失值

python - 为什么 SeparableConv2D 比 Conv2D 慢?

python - 如何从python获取lua/translation中的类类型