
欢迎大家加入Mindspore社区,参与学习开发与研究。
一.环境准备
这里我选择本地机器部署Mindspore环境,使用Mindspore-cpu+Jupyter lab的环境进行使用
安装Mindspore根据官网介绍进行安装即可,链接:昇思MindSpore | 全场景AI框架 | 昇思MindSpore社区官网

安装完成后,在环境中依次输入下面几行命令
首先安装JupyterLab的服务,然后安装Jupyter内部核的配置服务并将当前环境添加到可用核中,便于后面具体应用,最后启动jupyter lab的服务

然后自动进入浏览器,即可进行体验
二.SGD简单介绍
SGD(Stochastic Gradient Descent)(随机梯度下降)是深度学习中最常见的优化算法之一,广泛应用于训练机器学习模型,尤其是深度神经网络。SGD的核心思想是通过不断迭代来优化模型的参数,使得模型的预测误差逐步减小,进而使损失函数值最小化。它是梯度下降方法的一种变种,与传统的梯度下降算法相比,SGD在每次参数更新时仅使用一个样本的数据,而不是使用整个数据集。
1. 梯度下降的基本原理
梯度下降法是一种通过迭代逐步调整模型参数来最小化损失函数的优化算法。假设我们有一个模型,它的参数为θ,损失函数为L(θ),我们希望通过调整θ来最小化L(θ)。梯度下降的步骤如下:
- 计算损失函数关于参数的梯度(即对损失函数求偏导数)。
- 根据梯度的方向更新参数。
传统的梯度下降方法(Batch Gradient Descent)需要计算整个训练集上损失函数的梯度,然后进行一次参数更新。这种方法的计算量较大,特别是当训练集非常庞大时,计算过程会变得非常缓慢。
2. 随机梯度下降(SGD)
在传统的梯度下降法中,每次更新是基于所有样本的数据计算出的梯度,而在随机梯度下降(SGD)中,参数的更新是基于单个样本计算出来的梯度。即每次迭代中,随机选择一个样本点来计算梯度并更新参数。
- 具体步骤如下:
- 随机选择一个样本
- 计算当前样本的损失函数的梯度
- 根据梯度更新参数
- 重复上述过程,直到达到设定的迭代次数或满足某个停止条件(如损失函数收敛)
通过这样的方法,SGD在每次迭代中只需要计算一个样本的梯度,更新速度更快。这也是它在大规模数据集上非常受欢迎的原因。
3. SGD的优缺点
优点:
- 计算效率高:每次更新仅计算一个样本的梯度,因此在数据集非常大的情况下,相比全数据集的梯度下降,SGD能大大减少计算量。
- 能够跳出局部最优:由于每次更新使用的是一个样本,它的梯度包含了更大的噪声和波动,因此SGD能够避免陷入局部最优解,增加了跳出局部最优解的机会,尽管这也意味着收敛速度较慢。
- 更快的迭代:SGD不需要等待所有数据完成计算后再更新参数,能更频繁地更新参数,加速模型的训练。
缺点:
- 更新波动大:由于每次更新的梯度基于单个样本,因此梯度的估计可能会有较大的波动,导致损失函数的值在更新过程中可能会震荡,不太稳定。
- 收敛速度较慢:由于梯度估计较为粗糙(因为是基于单个样本),SGD的收敛过程通常比批量梯度下降慢,可能需要更多的迭代才能达到理想的收敛效果。
- 不能精确找到最优解:由于梯度估计包含噪声,SGD可能无法精确找到全局最优解,而是在某些区域“跳跃”并找到局部最优解。
4. 如何解决SGD的缺点
为了克服SGD的一些缺点,通常可以采用以下方法:
-
Mini-batch SGD:通过将训练集分成多个小批量(mini-batches),在每次迭代中用一个小批量的样本来计算梯度并更新参数。这样既能提高计算效率,又能减少波动,提高收敛稳定性。Mini-batch梯度下降方法广泛应用于神经网络训练。
-
动量(Momentum):动量方法在SGD的基础上增加了历史梯度的加权和,使得更新的方向更加稳定,减少了梯度波动
-
自适应学习率:例如,Adam、RMSProp等优化器采用了自适应学习率的思想,根据梯度的历史变化自动调整学习率,帮助更快收敛,并减少训练过程中可能的震荡。
-
学习率衰减:随着训练的进行逐渐减小学习率,使得优化过程在接近最优解时更加稳定,减少震荡。
5. SGD的应用场景
- 大规模数据集:SGD特别适用于数据集非常大的情况,传统的批量梯度下降算法在大规模数据集上计算效率低,而SGD能快速地对每个样本进行训练更新。
- 神经网络训练:SGD广泛应用于神经网络的训练,特别是深度神经网络的训练中,利用Mini-batch SGD结合各种优化技巧(如Adam、RMSProp等)来提高训练速度和效果。
总结
SGD优化器通过每次使用一个样本计算梯度并更新参数,减少了每次更新所需的计算时间,使得训练速度较快,但其存在梯度估计误差较大,导致收敛不稳定的问题。为了弥补这一点,很多现代的优化算法(如Mini-batch SGD、Adam、RMSProp等)在SGD的基础上进行了改进,旨在提高训练过程的效率和稳定性。在实际应用中,SGD依然是许多机器学习和深度学习任务中的重要优化算法。
三.实际体验
为本次实验安装额外的库

导入库以及使用的数据集

构建LeNet网络

首先是第一个实验,使用纯粹的SGD优化器,可以注意下收尾epoch的数据


然后是实验二
选择SGD优化器并使用参数momentum,设为0.9


最后是实验三
选择SGD优化器并使用参数momentum,设为0.9,使用参数nesterov,设置为True


其实到这里就已经能看出来数据的变化幅度大小了,不过可以通过可视化直观地对比
四.实验分析


这是我的实验数据所绘制的图,与原作者的有些区别,不过结论还是相同的,无论是预测精度还是平均损失,纯粹的SGD表现并不是很好,而使用momentum优化后,算法性能得到了质的飞跃,大概3个epoch就能收敛。理论上来说,nesterov算法可以有效加速网络训练并减少波动。
可以得到的结论是,选择SGD优化器,momentum参数是非常有用的。
五.结论
本案例基于MindSpore框架讲解了SGD优化器的基本原理以及几种优化方法,并设计了一个实验,比较SGD优化器几个参数设置带来的影响,顺利完成了预期目标。通过此案例可以进一步加深对SGD优化器的理解,对优化器参数选择有基本的认识,并结合MindSpore框架提供的文档和教程,掌握利用Mindspore框架实现特定案例的流程,以及多种API的使用方法,为以后在实际场景中应用MindSpore框架提供支持。
推荐大家也可以去试试看
欢迎大家加入Mindspore社区,参与学习开发与研究。
一.环境准备
这里我选择本地机器部署Mindspore环境,使用Mindspore-cpu+Jupyter lab的环境进行使用
安装Mindspore根据官网介绍进行安装即可,链接:昇思MindSpore | 全场景AI框架 | 昇思MindSpore社区官网
安装完成后,在环境中依次输入下面几行命令
首先安装JupyterLab的服务,然后安装Jupyter内部核的配置服务并将当前环境添加到可用核中,便于后面具体应用,最后启动jupyter lab的服务
然后自动进入浏览器,即可进行体验
二.SGD简单介绍
SGD(Stochastic Gradient Descent)(随机梯度下降)是深度学习中最常见的优化算法之一,广泛应用于训练机器学习模型,尤其是深度神经网络。SGD的核心思想是通过不断迭代来优化模型的参数,使得模型的预测误差逐步减小,进而使损失函数值最小化。它是梯度下降方法的一种变种,与传统的梯度下降算法相比,SGD在每次参数更新时仅使用一个样本的数据,而不是使用整个数据集。
1. 梯度下降的基本原理
梯度下降法是一种通过迭代逐步调整模型参数来最小化损失函数的优化算法。假设我们有一个模型,它的参数为θ,损失函数为L(θ),我们希望通过调整θ来最小化L(θ)。梯度下降的步骤如下:
传统的梯度下降方法(Batch Gradient Descent)需要计算整个训练集上损失函数的梯度,然后进行一次参数更新。这种方法的计算量较大,特别是当训练集非常庞大时,计算过程会变得非常缓慢。
2. 随机梯度下降(SGD)
在传统的梯度下降法中,每次更新是基于所有样本的数据计算出的梯度,而在随机梯度下降(SGD)中,参数的更新是基于单个样本计算出来的梯度。即每次迭代中,随机选择一个样本点来计算梯度并更新参数。
通过这样的方法,SGD在每次迭代中只需要计算一个样本的梯度,更新速度更快。这也是它在大规模数据集上非常受欢迎的原因。
3. SGD的优缺点
优点:
缺点:
4. 如何解决SGD的缺点
为了克服SGD的一些缺点,通常可以采用以下方法:
Mini-batch SGD:通过将训练集分成多个小批量(mini-batches),在每次迭代中用一个小批量的样本来计算梯度并更新参数。这样既能提高计算效率,又能减少波动,提高收敛稳定性。Mini-batch梯度下降方法广泛应用于神经网络训练。
动量(Momentum):动量方法在SGD的基础上增加了历史梯度的加权和,使得更新的方向更加稳定,减少了梯度波动
自适应学习率:例如,Adam、RMSProp等优化器采用了自适应学习率的思想,根据梯度的历史变化自动调整学习率,帮助更快收敛,并减少训练过程中可能的震荡。
学习率衰减:随着训练的进行逐渐减小学习率,使得优化过程在接近最优解时更加稳定,减少震荡。
5. SGD的应用场景
总结
SGD优化器通过每次使用一个样本计算梯度并更新参数,减少了每次更新所需的计算时间,使得训练速度较快,但其存在梯度估计误差较大,导致收敛不稳定的问题。为了弥补这一点,很多现代的优化算法(如Mini-batch SGD、Adam、RMSProp等)在SGD的基础上进行了改进,旨在提高训练过程的效率和稳定性。在实际应用中,SGD依然是许多机器学习和深度学习任务中的重要优化算法。
三.实际体验
为本次实验安装额外的库
导入库以及使用的数据集
构建LeNet网络
首先是第一个实验,使用纯粹的SGD优化器,可以注意下收尾epoch的数据
然后是实验二
选择SGD优化器并使用参数momentum,设为0.9
最后是实验三
选择SGD优化器并使用参数momentum,设为0.9,使用参数nesterov,设置为True
其实到这里就已经能看出来数据的变化幅度大小了,不过可以通过可视化直观地对比
四.实验分析
这是我的实验数据所绘制的图,与原作者的有些区别,不过结论还是相同的,无论是预测精度还是平均损失,纯粹的SGD表现并不是很好,而使用momentum优化后,算法性能得到了质的飞跃,大概3个epoch就能收敛。理论上来说,nesterov算法可以有效加速网络训练并减少波动。
可以得到的结论是,选择SGD优化器,momentum参数是非常有用的。
五.结论
本案例基于MindSpore框架讲解了SGD优化器的基本原理以及几种优化方法,并设计了一个实验,比较SGD优化器几个参数设置带来的影响,顺利完成了预期目标。通过此案例可以进一步加深对SGD优化器的理解,对优化器参数选择有基本的认识,并结合MindSpore框架提供的文档和教程,掌握利用Mindspore框架实现特定案例的流程,以及多种API的使用方法,为以后在实际场景中应用MindSpore框架提供支持。
推荐大家也可以去试试看