理解Pytorch的loss.backward()和optimizer.step()
发布时间:2024-04-29
Pytorch在学术界日益流行,几乎所有深度学习算法程序中几乎都用到的loss.backward()和optimizer.step()究竟是干嘛的?每天使用有没有思考一下其原理和机制呢?损失函数loss定义了模型优劣的标准,loss越小,模型越好,常见的损失函数比如均方差MSE(MeanSquareError),MAE(MeanAbsoluteError),交叉熵CE(Cross-entro

Pytorch 在学术界日益流行,几乎所有深度学习算法程序中几乎都用到的loss.backward()和optimizer.step()究竟是干嘛的?每天使用有没有思考一下其原理和机制呢?

损失函数loss定义了模型优劣的标准,loss越小,模型越好,常见的损失函数比如均方差MSE(Mean Square Error),MAE (Mean Absolute Error),交叉熵CE(Cross-entropy) 等。

loss function 梯度下降 来源:https://www.analyticsvidhya.com/blog/2019/08/detailed-guide-7-loss-functions-machine-learning-python-code/

loss.backward()故名思义,就是将损失loss 向输入侧进行反向传播,同时对于需要进行梯度计算的所有变量 x (requires_grad=True),计算梯度 \\frac{d}{dx}loss ,并将其累积到梯度 x.grad 中备用,即: x.grad=x.grad +\\frac{d}{dx}loss

optimizer.step()是优化器对 x 的值进行更新,以随机梯度下降SGD为例:学习率(learning rate, lr)来控制步幅,即:x=x - lr * x.grad ,减号是由于要沿着梯度的反方向调整变量值以减少Cost。

x = torch.tensor([1., 2.], requires_grad=True)
# x: tensor([1., 2.], requires_grad=True) 
y = 100*x
# y: tensor([100., 200.], grad_fn=<MulBackward0>)

loss = y.sum(). # tensor(300., grad_fn=<SumBackward0>)

# Compute gradients of the parameters respect to the loss
print(x.grad)     # None, 反向传播前,梯度不存在
loss.backward()      
print(x.grad)     # tensor([100., 100.]) loss对y的梯度为1, 对x的梯度为100

optim = torch.optim.SGD([x], lr=0.001) # 随机梯度下降, 学习率0.001
print(x)        # tensor([1., 2.], requires_grad=True)
optim.step()  # 更新x
print(x)        # tensor([0.9000, 1.9000], requires_grad=True) 变化量=梯度X学习率 0.1=100*0.001

optimizer.zero_grad()清除了优化器中所有 xx.grad ,在每次loss.backward()之前,不要忘记使用,否则之前的梯度将会累积,这通常不是我们所期望的( 也不排除也有人需要利用这个功能)。

平台注册入口