2744557306 发表于 2023-11-28 14:57

随机梯度下降算法SGD(Stochastic gradient descent)

SGD是什么
SGD是Stochastic Gradient Descent(随机梯度下降)的缩写,是深度学习中常用的优化算法之一。SGD是一种基于梯度的优化算法,用于更新深度神经网络的参数。它的基本思想是,在每一次迭代中,随机选择一个小批量的样本来计算损失函数的梯度,并用梯度来更新参数。这种随机性使得算法更具鲁棒性,能够避免陷入局部极小值,并且训练速度也会更快。
怎么理解梯度?
假设你在爬一座山,山顶是你的目标。你知道自己的位置和海拔高度,但是不知道山顶的具体位置和高度。你可以通过观察周围的地形来判断自己应该往哪个方向前进,并且你可以根据海拔高度的变化来判断自己是否接近山顶。

在这个例子中,你就可以把自己看作是一个模型,而目标就是最小化海拔高度(损失函数)。你可以根据周围的地形(梯度)来判断自己应该往哪个方向前进,这就相当于使用梯度下降法来更新模型的参数(你的位置和海拔高度)。

每次你前进一步,就相当于模型更新一次参数,然后重新计算海拔高度。如果你发现海拔高度变小了,就说明你走对了方向,可以继续往这个方向前进;如果海拔高度变大了,就说明你走错了方向,需要回到上一个位置重新计算梯度并选择一个新的方向前进。通过不断重复这个过程,最终你会到达山顶,也就是找到了最小化损失函数的参数。

为什么引入SGD
深度神经网络通常有大量的参数需要学习,因此优化算法的效率和精度非常重要。传统的梯度下降算法需要计算全部样本的梯度,非常耗时,并且容易受到噪声的影响。随机梯度下降算法则可以使用一小部分样本来计算梯度,从而大大提高了训练速度和鲁棒性。此外,SGD还可以避免陷入局部极小值,使得训练结果更加准确。

怎么用SGDimport torch

from torch import nn

from torch import optim



data = torch.tensor([,,,], requires_grad=True)

target = torch.tensor([,,,], 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()

param.data是参数的当前值,而param.grad是参数的梯度值。在进行反向传播计算时,每个参数都会被记录其梯度信息,以便在更新参数时使用。通过访问param.data和param.grad,可以查看参数当前的值和梯度信息。值得注意的是,param.grad在每次调用backward()后都会自动清空,因此如果需要保存梯度信息,应该在计算完梯度之后及时将其提取并保存到其他地方。

计算结果:weight tensor([]) tensor([[-2.4574, -0.7452]])

bias tensor([-0.2108]) tensor([-2.6971])

tensor(0.8531)

weight tensor([]) tensor([[-0.2466,  1.1232]])

bias tensor() tensor()

tensor(0.2712)

weight tensor([]) tensor([[-0.6692,  0.4266]])

bias tensor([-0.0152]) tensor([-0.2023])

tensor(0.1529)

weight tensor([]) tensor([[-0.4059,  0.4707]])

bias tensor() tensor()

tensor(0.0963)

weight tensor([]) tensor([[-0.3603,  0.3410]])

bias tensor([-0.0006]) tensor([-0.0146])

tensor(0.0615)

weight tensor([]) tensor([[-0.2786,  0.2825]])

bias tensor() tensor()

tensor(0.0394)

weight tensor([]) tensor([[-0.2256,  0.2233]])

bias tensor() tensor([-0.0006])

tensor(0.0252)

weight tensor([]) tensor([[-0.1797,  0.1793]])

bias tensor() tensor()

tensor(0.0161)

weight tensor([]) tensor([[-0.1440,  0.1432]])

bias tensor() tensor()

tensor(0.0103)

weight tensor([]) tensor([[-0.1152,  0.1146]])

bias tensor() tensor()

tensor(0.0066)

weight tensor([]) tensor([[-0.0922,  0.0917]])

bias tensor() tensor()

tensor(0.0042)

weight tensor([]) tensor([[-0.0738,  0.0733]])

bias tensor() tensor()

tensor(0.0027)

weight tensor([]) tensor([[-0.0590,  0.0586]])

bias tensor() tensor()

tensor(0.0017)

weight tensor([]) tensor([[-0.0472,  0.0469]])

bias tensor() tensor()

tensor(0.0011)

weight tensor([]) tensor([[-0.0378,  0.0375]])

bias tensor() tensor()

tensor(0.0007)

weight tensor([]) tensor([[-0.0303,  0.0300]])

bias tensor() tensor()

tensor(0.0005)

weight tensor([]) tensor([[-0.0242,  0.0240]])

bias tensor() tensor()

tensor(0.0003)

weight tensor([]) tensor([[-0.0194,  0.0192]])

bias tensor() tensor()

tensor(0.0002)

weight tensor([]) tensor([[-0.0155,  0.0153]])

bias tensor() tensor()

tensor(0.0001)

weight tensor([]) tensor([[-0.0124,  0.0123]])

bias tensor() tensor()

tensor(7.6120e-05)
页: [1]
查看完整版本: 随机梯度下降算法SGD(Stochastic gradient descent)