torch.nn.parameter.Parameter
一篇讲得很细致的博客:http://haokailong.top/2020/11/01/pytorch-loss-backward-%E7%9A%84%E7%90%86%E8%A7%A3/
使用方式
1. Parameter的理解
Parameter说明当前Tensor是Network的Parameter,不仅require_grad=True,而且需要优化更新。
2. 注意事项
parameter需要与net class绑定,不然不会作为net.parameters()进行优化更新。
3. 使用举例
import torch.nn as nn
class learnedweight(nn.Module):
self.reg_weight = nn.parameter.Parameter(torch.tensor([1.,2.]), requires_grad = True)
class Net(nn.Module):
self.learnedweight = learnedweight()
# In Trainer
self.optimizer = Adam(model.parameters()...)
for cur_ir, batch in enumerate(train_loader):
# 在后向传播中,梯度计算是累积的过程,因此计算前需要清零。
self.optimizer.zero_grad()
# 前向传播,损失计算
loss = model_forward(model, batch)
# 后向传播,对所有requires_grad=True的Tensor进行梯度计算
loss.backward()
# 根据梯度,对model.parameters()进行优化。
self.optimizer.setp()
知识点补充
梯度计算和权重更新
- 梯度计算由
loss.backward()
完成。
对requires_grad=True的Tensor计算梯度,并保存net parameters的梯度。 - 权重更新由
self.optimizer.setp()
完成。
根据net parameters的梯度,更新net parameters。
梯度累加和梯度清空
loss.backward()
过程中,net parameters的梯度会进行累加。
self.optimizer.zero_grad()
清空net parameters的梯度。
- 梯度累加的实现:多次后向传播,一次优化更新,一次梯度清空。即梯度累加后再做权重更新。
- 梯度不累加的实现:一次后向传播,一次优化更新,一次梯度清空。(常见)
- 梯度累加的优点:有博客指出等价于增加batch_size。
requires_grad()和权重更新的关系:
- 参与运算的Tensor(输入,中间输出,输出,网络权重参数),都可以设置 requires_grad。 requires_grad=True,说明需要对该Tensor计算梯度。
- 只有网络权重参数,会根据梯度进行优化更新。