学习率如何影响 Back Prop 中的梯度
How does Learning Rate affect Gradients in Back Prop
我想知道学习率是否设置为在神经网络层的反向传播期间更新权重。权重如何以及在何处更新?
我看不出优化器、学习率和反向传播函数之间的联系。
梯度下降算法中有学习率项。由于梯度下降是反向传播的,因此在反向传播时会考虑学习率。
当然,我想到的一个合理的问题是反向传播和优化器在所有这些方面是如何相关的。优化器如何更新这些参数?
optimizer.zero_grad()
loss.backward()
optimizer.step()
确实 optimizer
和 loss
之间似乎没有任何 link 更不用说你模型的参数了。
- 优化器
每个张量对象都有一个 grad
属性,它要么包含一个表示对应于它的梯度的张量,要么 None
如果它不需要梯度计算或者根本没有任何梯度.
要优化 PyTorch 中的参数,您需要通过传递一个列表或迭代器来初始化一个 optimizer,方法是将列表或迭代器传递给您希望此优化器对其执行操作的那些参数:
mlp = nn.Sequential(nn.Linear(10, 2), nn.Linear(2, 1))
optimizer = torch.optim.SGD(mlp.parameters(), lr=1.0e-3)
优化器不负责计算梯度,这是由 PyTorch 中的另一个系统执行的。
当您调用 optimizer.step()
时,优化器将检查每个提供的参数并根据优化器的更新规则(即 使用的优化方法)和梯度更新它们与每个参数相关联(即 grad
属性)
对于 SGD 它将类似于(将 no_grad
考虑放在一边):
for param in parameters:
param -= lr*param.grad
- 反向传播
要实际计算反向传播,您将使用 torch.autograd.backward
,它通常以 torch.Tensor.backward
的形式出现(作为 torch.Tensor
方法)。
此函数是一个可变运算符,它将更新所有需要梯度计算的叶张量节点的grad
属性。换句话说,它将计算在 w.r.t 模型的每个参数上调用的张量 backward
的梯度。
例如,对于模型 mlp
,我们反向传播虚拟损失:
>>> for x in mlp.parameters():
... print(tuple(x.shape), x.grad)
(2, 10) None
(2,) None
(1, 2) None
(1,) None
对随机输入进行推理和反向传播后:
>>> mlp(torch.rand(1, 10)).mean().backward()
该调用更新了模型张量参数的每个 grad
属性:
>>> for x in mlp.parameters():
... print(tuple(x.shape), x.grad is not None, tuple(x.grad.shape))
(2, 10) True (2, 10)
(2,) True (2,)
(1, 2) True (1, 2)
(1,) True (1,)
然后您可以调用 optimizer.step()
以根据这些梯度有效地执行参数更新。请注意,优化器只能影响在初始化时提供给它的张量(回想一下 torch.optim.SGD(mlp.parameters(), lr=1.0e-3)
部分)。
最后,您可以直接使用 zero_grad
:
将来自优化器的那些参数的梯度归零
>>> optimizer.zero_grad()
这大致是 shorthand 用于:
for param in mtl.parameters():
param.grad.zero_()
但是当在同一个模型上使用多个参数组和/或多个优化器时,它的有效性会更加明显。
我想知道学习率是否设置为在神经网络层的反向传播期间更新权重。权重如何以及在何处更新?
我看不出优化器、学习率和反向传播函数之间的联系。
梯度下降算法中有学习率项。由于梯度下降是反向传播的,因此在反向传播时会考虑学习率。
当然,我想到的一个合理的问题是反向传播和优化器在所有这些方面是如何相关的。优化器如何更新这些参数?
optimizer.zero_grad()
loss.backward()
optimizer.step()
确实 optimizer
和 loss
之间似乎没有任何 link 更不用说你模型的参数了。
- 优化器
每个张量对象都有一个 grad
属性,它要么包含一个表示对应于它的梯度的张量,要么 None
如果它不需要梯度计算或者根本没有任何梯度.
要优化 PyTorch 中的参数,您需要通过传递一个列表或迭代器来初始化一个 optimizer,方法是将列表或迭代器传递给您希望此优化器对其执行操作的那些参数:
mlp = nn.Sequential(nn.Linear(10, 2), nn.Linear(2, 1))
optimizer = torch.optim.SGD(mlp.parameters(), lr=1.0e-3)
优化器不负责计算梯度,这是由 PyTorch 中的另一个系统执行的。
当您调用 optimizer.step()
时,优化器将检查每个提供的参数并根据优化器的更新规则(即 使用的优化方法)和梯度更新它们与每个参数相关联(即 grad
属性)
对于 SGD 它将类似于(将 no_grad
考虑放在一边):
for param in parameters:
param -= lr*param.grad
- 反向传播
要实际计算反向传播,您将使用 torch.autograd.backward
,它通常以 torch.Tensor.backward
的形式出现(作为 torch.Tensor
方法)。
此函数是一个可变运算符,它将更新所有需要梯度计算的叶张量节点的grad
属性。换句话说,它将计算在 w.r.t 模型的每个参数上调用的张量 backward
的梯度。
例如,对于模型 mlp
,我们反向传播虚拟损失:
>>> for x in mlp.parameters():
... print(tuple(x.shape), x.grad)
(2, 10) None
(2,) None
(1, 2) None
(1,) None
对随机输入进行推理和反向传播后:
>>> mlp(torch.rand(1, 10)).mean().backward()
该调用更新了模型张量参数的每个 grad
属性:
>>> for x in mlp.parameters():
... print(tuple(x.shape), x.grad is not None, tuple(x.grad.shape))
(2, 10) True (2, 10)
(2,) True (2,)
(1, 2) True (1, 2)
(1,) True (1,)
然后您可以调用 optimizer.step()
以根据这些梯度有效地执行参数更新。请注意,优化器只能影响在初始化时提供给它的张量(回想一下 torch.optim.SGD(mlp.parameters(), lr=1.0e-3)
部分)。
最后,您可以直接使用 zero_grad
:
>>> optimizer.zero_grad()
这大致是 shorthand 用于:
for param in mtl.parameters():
param.grad.zero_()
但是当在同一个模型上使用多个参数组和/或多个优化器时,它的有效性会更加明显。