【问题标题】:Element wise calculation breaks autograd元素明智的计算打破了autograd
【发布时间】:2019-06-29 23:01:44
【问题描述】:

我正在使用 pytorch 计算逻辑回归的损失(我知道 pytorch 可以自动执行此操作,但我必须自己制作)。我的函数在下面定义,但转换为 torch.tensor 会破坏 autograd 并给我 w.grad = None。我是 pytorch 的新手,所以很抱歉。

logistic_loss = lambda X,y,w: torch.tensor([torch.log(1 + torch.exp(-y[i] * torch.matmul(w, X[i,:]))) for i in range(X.shape[0])], requires_grad=True)

【问题讨论】:

    标签: python-3.x machine-learning pytorch logistic-regression


    【解决方案1】:

    你的帖子在细节上不是很清楚,这是一个单行的怪物。我首先对其进行了修改以制作minimal, complete, verifiable 示例。如果我误解了你的意图,请纠正我,下次请你自己做。

    import torch
    
    # unroll the one-liner to have an easier time understanding what's going on
    def logistic_loss(X, y, w):
        elementwise = []
        for i in range(X.shape[0]):
            mm = torch.matmul(w, X[i, :])
            exp = torch.exp(-y[i] * mm)
            elementwise.append(torch.log(1 + exp))
    
        return torch.tensor(elementwise, requires_grad=True)
    
    # I assume that's the excepted dimensions of your input
    X = torch.randn(5, 30, requires_grad=True)
    y = torch.randn(5)
    w = torch.randn(30)
    
    # I assume you backpropagate from a reduced version
    # of your sum, because you can't call .backward on multi-dimensional
    # tensors
    loss = logistic_loss(X, y, w).mean()
    loss.mean().backward()
    print(X.grad)
    

    解决问题的最简单方法是将torch.tensor(elementwise, requires_grad=True) 替换为torch.stack(elementwise)。您可以将torch.tensor 视为全新张量的构造函数,如果您的张量更多是某种数学表达式的结果,则应使用torch.stacktorch.cat 之类的操作。

    话虽如此,这段代码仍然非常低效,因为您手动循环了i。相反,你可以简单地写

    def logistic_loss_vectorized(X, y, w):
        mm = torch.matmul(X, w)
        exp = torch.exp(-y * mm)
    
        return torch.log(1 + exp)
    

    这在数学上是等效的,但在实践中会快得多,因为由于缺少显式循环,它允许更好的并行化。

    请注意,此代码仍然存在数值问题 - 您正在取指数的对数,但名为 exp 的中间结果可能会达到非常高的值,从而导致精度损失。有一些解决方法,这就是 PyTorch 提供的损失函数更可取的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-01
      • 1970-01-01
      相关资源
      最近更新 更多