【问题标题】:Implementing a simple optimization algorithm in PyTorch在 PyTorch 中实现一个简单的优化算法
【发布时间】:2020-12-04 19:10:56
【问题描述】:

我目前正在学习 PyTorch 以利用其开源 autograd 功能,作为我自己的练习,我想实现一个我已经在 MATLAB 中实现的简单优化算法。作为一个简单的例子,假设我正在尝试解决问题min_x 1/2 x'Ax - b'x,即在给定Ab 的情况下,找到最小化数量x'Ax - b'x 的向量x。在 MATLAB 中使用精确线搜索的简单梯度下降算法可能如下所示:

% initialize x = zeros(n, 1) where n is the length of b
while residual > tolerance
    grad = A*x - b; % compute the gradient of the objective
    alpha = norm(grad)^2/(grad'*A*grad); % compute step-size alpha by exact line search
    x = x - alpha*grad; % do a gradient step
    residual = norm(grad); % compute residual
    objective = x'*A*x - b'*x; % compute objective value at current iteration

如何在 PyTorch 中实现这种优化算法?具体来说,我想做一个相同的优化循环,用 Torch 的 autograd 功能替换我自己的梯度计算。换句话说,我想在 PyTorch 中执行与上面完全相同的算法,除了我自己不计算梯度,我只是使用 PyTorch 的 autograd 功能来计算梯度。这样,我不想调用任何给定的优化器(如 SGD 或 Adam)——只需自己编写算法,唯一的区别是梯度是由 PyTorch 计算的。我计划将上述 numpy/MATLAB 实现的结果与显式梯度计算与 PyTorch 实现与我假设的梯度的数值近似进行比较。

非常感谢!

【问题讨论】:

    标签: algorithm matlab optimization pytorch autograd


    【解决方案1】:

    基本上你需要在pytorch中使用autograd。不是一个完整的程序,但大致如下:

    在每次迭代中执行以下操作:

    1. 指定x.requires_grad=True,因为您需要它的渐变。然后计算你的目标函数:
    x.requires_grad = True
    obj_function = torch.matmul(x.t(),torch.matmul(A,x)) * .5 - torch.matmul(b,x)
    
    1. 清除x的旧梯度结果:
    x.grad = None
    
    1. 拨打backward()obj_function。这将自动计算操作中涉及的张量的梯度:
    obj_function.backward()
    
    1. x.requires_grad设置为false,因为你需要修改x,但是pytorch不允许就地修改需要grad的张量:
    x.requires_grad = False
    x = x - x.grad * step_size
    

    【讨论】:

      猜你喜欢
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 2022-09-28
      • 1970-01-01
      相关资源
      最近更新 更多