使用torch7演示进行线性回归

时间:2016-05-26 07:52:21

标签: lua machine-learning linear-regression deep-learning torch

我正在关注这个演示 - 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_dx
end 

我对此功能有一些疑问

  1. 代码中使用的参数x_new(或其副本x)在哪里?
  2. _nidx_ = (_nidx_ or 0) + 1是什么意思?
  3. 首次调用函数时 nidx 的值是多少?
  4. dl_dx在哪里更新?理想情况下,它应该在本地loss_x 更新之后,但它没有明确写入
  5. 编辑:

    我的观点#4现在很清楚了。对于有兴趣的人 - (来源 - 深度学习,牛津,实用3实验室表)

    enter image description here

2 个答案:

答案 0 :(得分:2)

  

代码中使用的参数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 或0)+ 1是什么意思?

如果_nidx_不是1,则将(_nidx_) + 1的价值增加1(0) + 1)或将其设置为_nidx_nil)尚未定义。

  

首次调用函数时nidx的值是多少?

在该功能之前永远不会设置。尚未设置的变量在lua中具有值dl_dx

  

dl_dx在哪里更新?理想情况下,它应该在更新本地loss_x之后,但它没有明确写入

model:backward()是模型的渐变张量。 dl_dx计算给定损失的每个参数的梯度,并将其添加到模型的梯度张量中。由于dl_dx:zero()是模型的梯度张量,其值将增加。请注意,渐变值是添加,这就是您需要调用dl_dx(将feval的值设置为零)的原因,否则您的渐变值将保持不变每次调用<string name="ExpiredWarning">Warning</string>都会增加。

答案 1 :(得分:1)

  1. x是一个全局变量,请参阅第126行。该函数似乎只是更新它,而不是使用它。
  2. 这是一个常见的lua习语:如果不存在,则将事物设置为参数或默认值。功能中的典型用法:

    function foo(a, b)
        local a = a or 0
        local b = b or "foo"
    end
    
  3. 根据值,使用andor的表达式计算第一个或第二个参数。如果x and y不是yxnil(无或无),则false会产生x

    如果x or y不存在(零或假),则

    y会产生x,否则会产生x。因此,or用于默认参数。

    这两个可以通过以下方式重写:

    -- x and y
    if x then
        return y
    else
        return x
    end
    -- x or y
    if x then
        return x
    else
        return y
    end
    
    1. 你有_nidx_ = (_nidx or 0) + 1,所以在第一次调用函数时,_nidx_为零,因为它已经无法定义。之后,它(全局)设置为1(0 + 1)

    2. 我不确定你到底是什么意思。它在第152行重置并由函数本身返回。它是一个全局变量,所以它可能有外部用途吗?