PyTorch深度神经网络及训练一
上一次的笔记中,我们分享了有关于自动微分、torch.nn以及数据预处理的内容,那么这一次的笔记,我将从深度神经网络的介绍以及训练进行“科普性”介绍。
接下来我们将从三个方面进行介绍:
- 随机梯度下降算法
- 优化器
- 损失函数
一、随机梯度下降算法
随机梯度下降(stochastic gradient descent,SGD,下文皆用SGD来代指)法是一种用于优化机器学习模型的一种流行算法,它的优势在于保证精度的同时能够提升计算速度。
SGD每次只随机选取一部分样本进行优化,
样本数量一般是2的整数次幂,取值范围为“32~256”。
这里选取两位博主对梯度下降的看法
博主柠檬上神在TA的文章中提到:
梯度下降梯度的方向是函数在给定点上升最快的方向,
那么梯度的反方向就是函数在给定点下降最快的方向,
因此我们在做梯度下降的时候,应该是沿着梯度的反方向进行权重的更新,
可以有效的找到全局的最优解。
博主taoKingRead在TA的文章中提到:
梯度就是导数
梯度下降法就是一种通过求目标函数的导数来寻找目标函数最小化的方法
梯度下降目的是,找到目标函数最小化时,取值所对应的自变量的值x
随机梯度下降就是在梯度下降的基础上小范围取样处理,二者特性大致无异。
一言以蔽之:SGD用来最大化或者最小化某个函数。
大部分的问题可以由某些函数来解决,我们假设有个问题的核心解是 f(x),它的关键在于算出 f(x) 的最大解或者最小解。我们通常以最小化f(x)指代大多数最优化问题, 最大化可经由最小化 -f(x) 算法最小化来实现。
它的公式是:
随机梯度下降法有个缺点是很难确定一个合适的学习率,在这个基础下我们介绍一下Nesterov项(Nesterov动量),它可以避免参数更新太快,提高灵敏度,使之前的动量影响当前的梯度:
二、PyTorch里的优化器
在上一节中,我们提到了“最大化或最小化函数”的想法,那么用于实现它的工具就是我们的优化器
PyTorch中的optim模块提供了可直接使用的多种优化算法,常用的优化器如下:
类 | 算法名称 |
---|---|
torch.optim.Adadelta() | Adadelta算法 |
torch.optim.Adagrad() | Adagrad算法 |
torch.optim.Adam() | Adam算法 |
torch.optim.Adamax() | Adamax算法 |
torch.optim.ASGD() | 平均随机梯度下降算法 |
torch.optim.LBFGS() | L-BFGS算法 |
torch.optim.RMSprop() | RMSprop算法 |
torch.optim.Rprop() | 弹性反向传播算法 |
torch.optim.SGD() | 随机梯度下降算法 |
这里我们用Adam的例子来建立一个简单的测试网络
这段代码的结果如下,一共包含了两个结果:隐藏层和回归层
三、PyTorch的损失函数
概念:
损失函数(Loss Function)是机器学习和深度学习中的一个重要概念,用于衡量模型预测结果与真实标签之间的差异或误差程度。在训练过程中,优化算法(如梯度下降)使用损失函数来调整模型的参数,使得模型能够尽可能减小这个误差,从而提高预测的准确性。
损失函数通常由两部分组成:
1、真实标签(Ground Truth): 训练数据中的正确答案或目标值。
2、模型预测(Model Prediction): 模型根据输入数据给出的预测结果。
损失函数可以是各种形式,具体选择取决于所解决的问题类型和模型结构。常见的损失函数包括:
1、均方误差(Mean Squared Error,MSE): 用于回归问题,计算预测值与真实值之间的平方差的均值
2、交叉熵损失(Cross-Entropy Loss): 用于分类问题,特别是在多分类任务中。它衡量了两个概率分布之间的差异,常用于评估模型输出的概率分布与真实标签之间的差异。
3、对数损失(Log Loss): 与交叉熵损失类似,用于二分类问题,衡量模型输出的概率分布与真实标签之间的差异。
常用的损失函数如下:
类 | 算法名称 | 适用问题类型 |
---|---|---|
torch.nn.L1.Loss() | 平均绝对值误差损失 | 回归 |
torch.nn.MSELoss() | 均分误差损失 | 回归 |
torch.nn.CrossEntropyLoss() | 交叉熵损失 | 多分类 |
torch.nn.NLLLoss() | 负对数似然函数损失 | 多分类 |
torch.nn. NLLLoss2d() | 图片负对数似然函数损失 | 图像分割 |
torch.nn.KLDivLoss() | KL散度损失 | 回归 |
torch.nn.BCELoss() | 二分类交叉熵损失 | 二分类 |
torch.nn.MarginRankingLoss() | 评价相似度的损失 | \ |
torch.nn.MultiLabelMarginLoss() | 多标签分类的损失 | 多标签分类 |
torch.nn.SmoothL1Loss() | 平滑的L1损失 | 回归 |
torch.nn.SoftMarginLossLoss() | 多标签二分类问题的损失 | 多标签二分类 |
均方误差损失:
参数如下:
torch.nn.MESELoss(size_average=None,reduce=None,reduction=‘mean’)
交叉熵损失:
参数如下:
其中
ignore_index是:指定被忽略而且对输入梯度没有贡献的目标值
当weight = None时,损失函数的计算方式为:
当weight被指定时,损失函数的计算方式为:
参考资料:
[1] taoKingRead《机器学习-梯度下降算法原理及公式推导》https://blog.csdn.net/iqdutao/article/details/107174240
[2] 柠檬上神《随机梯度下降法(stochastic gradient descent,SGD)》
https://blog.csdn.net/qq_58146842/article/details/121280968
[3] 《Pytorch深度学习入门与实战》