赞
踩
怎么理解梯度?
假设你在爬一座山,山顶是你的目标。你知道自己的位置和海拔高度,但是不知道山顶的具体位置和高度。你可以通过观察周围的地形来判断自己应该往哪个方向前进,并且你可以根据海拔高度的变化来判断自己是否接近山顶。在这个例子中,你就可以把自己看作是一个模型,而目标就是最小化海拔高度(损失函数)。你可以根据周围的地形(梯度)来判断自己应该往哪个方向前进,这就相当于使用梯度下降法来更新模型的参数(你的位置和海拔高度)。
每次你前进一步,就相当于模型更新一次参数,然后重新计算海拔高度。如果你发现海拔高度变小了,就说明你走对了方向,可以继续往这个方向前进;如果海拔高度变大了,就说明你走错了方向,需要回到上一个位置重新计算梯度并选择一个新的方向前进。通过不断重复这个过程,最终你会到达山顶,也就是找到了最小化损失函数的参数。
为什么引入SGD
深度神经网络通常有大量的参数需要学习,因此优化算法的效率和精度非常重要。传统的梯度下降算法需要计算全部样本的梯度,非常耗时,并且容易受到噪声的影响。随机梯度下降算法则可以使用一小部分样本来计算梯度,从而大大提高了训练速度和鲁棒性。此外,SGD还可以避免陷入局部极小值,使得训练结果更加准确。
怎么用SGD
import torch from torch import nn from torch import optim data = torch.tensor([[0,0],[0,1],[1,0],[1,1.]], requires_grad=True) target = torch.tensor([[0],[0],[1],[1.]], requires_grad=True) model = nn.Linear(2, 1) def train(): opt = optim.SGD(params=model.parameters(), lr=0.1) for iter in range(20): # 1) 消除之前的梯度(如果存在) opt.zero_grad() # 2) 预测 pred = model(data) # 3) 计算损失 loss = ((pred - target)**2).sum() # 4) 指出那些导致损失的参数(损失回传) loss.backward() for name, param in model.named_parameters(): print(name, param.data, param.grad) # 5) 更新参数 opt.step() # 6) 打印进程 print(loss.data) if __name__ == "__main__": train() ———————————————— 版权声明:本文为CSDN博主「Yohuna」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/Yohuna/article/details/123789715
param.data是参数的当前值,而param.grad是参数的梯度值。在进行反向传播计算时,每个参数都会被记录其梯度信息,以便在更新参数时使用。通过访问param.data和param.grad,可以查看参数当前的值和梯度信息。值得注意的是,param.grad在每次调用backward()后都会自动清空,因此如果需要保存梯度信息,应该在计算完梯度之后及时将其提取并保存到其他地方。
计算结果:
weight tensor([[0.4456, 0.3017]]) tensor([[-2.4574, -0.7452]]) bias tensor([-0.2108]) tensor([-2.6971]) tensor(0.8531) weight tensor([[0.6913, 0.3762]]) tensor([[-0.2466, 1.1232]]) bias tensor([0.0589]) tensor([0.7416]) tensor(0.2712) weight tensor([[0.7160, 0.2639]]) tensor([[-0.6692, 0.4266]]) bias tensor([-0.0152]) tensor([-0.2023]) tensor(0.1529) weight tensor([[0.7829, 0.2212]]) tensor([[-0.4059, 0.4707]]) bias tensor([0.0050]) tensor([0.0566]) tensor(0.0963) weight tensor([[0.8235, 0.1741]]) tensor([[-0.3603, 0.3410]]) bias tensor([-0.0006]) tensor([-0.0146]) tensor(0.0615) weight tensor([[0.8595, 0.1400]]) tensor([[-0.2786, 0.2825]]) bias tensor([0.0008]) tensor([0.0048]) tensor(0.0394) weight tensor([[0.8874, 0.1118]]) tensor([[-0.2256, 0.2233]]) bias tensor([0.0003]) tensor([-0.0006]) tensor(0.0252) weight tensor([[0.9099, 0.0895]]) tensor([[-0.1797, 0.1793]]) bias tensor([0.0004]) tensor([0.0008]) tensor(0.0161) weight tensor([[0.9279, 0.0715]]) tensor([[-0.1440, 0.1432]]) bias tensor([0.0003]) tensor([0.0003]) tensor(0.0103) weight tensor([[0.9423, 0.0572]]) tensor([[-0.1152, 0.1146]]) bias tensor([0.0003]) tensor([0.0004]) tensor(0.0066) weight tensor([[0.9538, 0.0458]]) tensor([[-0.0922, 0.0917]]) bias tensor([0.0003]) tensor([0.0003]) tensor(0.0042) weight tensor([[0.9630, 0.0366]]) tensor([[-0.0738, 0.0733]]) bias tensor([0.0002]) tensor([0.0003]) tensor(0.0027) weight tensor([[0.9704, 0.0293]]) tensor([[-0.0590, 0.0586]]) bias tensor([0.0002]) tensor([0.0002]) tensor(0.0017) weight tensor([[0.9763, 0.0234]]) tensor([[-0.0472, 0.0469]]) bias tensor([0.0002]) tensor([0.0002]) tensor(0.0011) weight tensor([[0.9811, 0.0187]]) tensor([[-0.0378, 0.0375]]) bias tensor([0.0001]) tensor([0.0002]) tensor(0.0007) weight tensor([[0.9848, 0.0150]]) tensor([[-0.0303, 0.0300]]) bias tensor([0.0001]) tensor([0.0002]) tensor(0.0005) weight tensor([[0.9879, 0.0120]]) tensor([[-0.0242, 0.0240]]) bias tensor([0.0001]) tensor([0.0001]) tensor(0.0003) weight tensor([[0.9903, 0.0096]]) tensor([[-0.0194, 0.0192]]) bias tensor([9.7973e-05]) tensor([0.0001]) tensor(0.0002) weight tensor([[0.9922, 0.0076]]) tensor([[-0.0155, 0.0153]]) bias tensor([8.5674e-05]) tensor([0.0001]) tensor(0.0001) weight tensor([[0.9938, 0.0061]]) tensor([[-0.0124, 0.0123]]) bias tensor([7.4933e-05]) tensor([9.4233e-05]) tensor(7.6120e-05)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。