我正在跟随这个演示-https://github.com/torch/demos/blob/master/linear-regression/example-linear-regression.lua
feval = function(x_new) -- set x to x_new, if differnt -- (in this simple example, x_new will typically always point to x, -- so the copy is really useless) if x ~= x_new then x:copy(x_new) end -- select a new training sample _nidx_ = (_nidx_ or 0) + 1 if _nidx_ > (#data)[1] then _nidx_ = 1 end local sample = data[_nidx_] local target = sample[{ {1} }] -- this funny looking syntax allows local inputs = sample[{ {2,3} }] -- slicing of arrays. dl_dx:zero() local loss_x = criterion:forward(model:forward(inputs), target) model:backward(inputs, criterion:backward(model.output, target)) return loss_x, dl_dxend
我对这个函数有几个疑问
- 代码中参数x_new(或其副本x)在哪里使用?
_nidx_ = (_nidx_ or 0) + 1
是什么意思?- 函数首次调用时_nidx的值是什么?
- dl_dx在哪里更新?理想情况下,它应该在local loss_x更新之后立即更新,但它并没有明确写出
编辑:
我的第4点现在非常清楚。对于那些感兴趣的人 -(来源- 深度学习,牛津,第3次实践实验指导)
回答:
代码中参数x_new(或其副本x)在哪里使用?
x
是模型参数的张量。它之前通过 x, dl_dx = model:getParameters()
获取。 model:forward()
和 model:backward()
会自动使用这个参数张量。 x_new
是模型的新参数集,由优化器(SGD)提供。如果它与模型的参数张量不同,模型的参数将通过 x:copy(x_new)
设置为这些新参数(将张量 x_new
的值复制到 x
中)。
nidx = (nidx or 0) + 1 是什么意思?
它将 _nidx_
的值增加 1
((_nidx_) + 1
),或者如果 _nidx_
尚未定义,则将其设置为 1
((0) + 1
)。
函数首次调用时nidx的值是什么?
它在此函数之前从未被设置。在lua中,未设置的变量的值为 nil
。
dl_dx在哪里更新?理想情况下,它应该在local loss_x更新之后立即更新,但它并没有明确写出
dl_dx
是模型的梯度张量。 model:backward()
计算每个参数的梯度,并将其添加到模型的梯度张量中。因为 dl_dx
是模型的梯度张量,所以它的值会增加。请注意,梯度值是累加的,这就是为什么你需要调用 dl_dx:zero()
(将 dl_dx
的值置零),否则你的梯度值会在每次调用 feval
时不断增加。