我目前只是在尝试编写一些教学材料,在其中我借鉴了一些在网络上经过多次重编的常见示例。
我有一些简单的代码,我在其中手动为图层创建张量,并在循环中更新它们。例如:
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,则损耗的降低幅度会非常缓慢。
基本上,我只是想了解为什么学习率在这两个片段中有非常不同的含义,而这两个方面是等效的。
答案 0 :(得分:1)
关键区别在于权重的初始化。 nn.Linear
is initialized smart中的权重矩阵。我很确定,如果您同时构建两个模型并以一种或其他方式复制权重矩阵,则会得到一致的行为。
此外,请注意,这两个模型并不等效,因为您的手工模型没有偏差。哪个matters。