手动更新与使用模型需要非常不同的学习率

时间:2019-03-14 19:00:34

标签: pytorch

我目前只是在尝试编写一些教学材料,在其中我借鉴了一些在网络上经过多次重编的常见示例。

我有一些简单的代码,我在其中手动为图层创建张量,并在循环中更新它们。例如:

w1 = torch.randn(D_in, H, dtype=torch.float, requires_grad=True)
w2 = torch.randn(H, D_out, dtype=torch.float, requires_grad=True)

learning_rate = 1e-6
for t in range(501):
    y_pred = x.mm(w1).clamp(min=0).mm(w2)
    loss = (y_pred - y).pow(2).sum()
    loss.backward()
    w1 -= learning_rate * w1.grad
    w2 -= learning_rate * w2.grad
    w1.grad.zero_()
    w2.grad.zero_()

这很好。然后,我使用实际的模块构造类似的代码:

model = torch.nn.Sequential(
          torch.nn.Linear(D_in, H),
          torch.nn.ReLU(),
          torch.nn.Linear(H, D_out),
        )
loss_fn = torch.nn.MSELoss(reduction='sum')
learning_rate = 1e-4
for t in range(501):
    y_pred = model(x)
    loss = loss_fn(y_pred, y)
    model.zero_grad()
    loss.backward()
    for param in model.parameters():
        param.data -= learning_rate * param.grad

这也很好用。

在这里有所不同。如果在手动情况下使用1e-4 LR,则损耗会爆炸,变大,然后是inf,然后是nan。那就不好了如果在模型情况下使用1e-6 LR,则损耗的降低幅度会非常缓慢。

基本上,我只是想了解为什么学习率在这两个片段中有非常不同的含义,而这两个方面是等效的。

1 个答案:

答案 0 :(得分:1)

关键区别在于权重的初始化nn.Linear is initialized smart中的权重矩阵。我很确定,如果您同时构建两个模型并以一种或其他方式复制权重矩阵,则会得到一致的行为。

此外,请注意,这两个模型并不等效,因为您的手工模型没有偏差。哪个matters

相关问题