前言
1.知识概览
- 深度学习的基本流程
- 优化算法的基本概念
- 常用优化方法的优缺点分析
2.分享动机
自学AI已经有一段时间了,最开始是从机器学习开始的,先看的周志华老师的西瓜书,但看了一段时间后,发现之前学的数学都忘得差不多了,而且学的深度也不够,所以对于西瓜书中的数学推导感觉难度很大,一度有点想放弃,直到后来入手了由Datawhale成员主编的南瓜书,重新学了一下数学,才没有像原来那样恐惧公式推导,但还是有很多地方不能理解。直到后来看了李宏毅老师的课,才觉得通俗易懂了很多,现在Datawhale更是出版了苹果书,并且开源了电子版,苹果书写的由浅入深,通俗易懂,我现在学习主要参考资料就是苹果书和李宏毅老师的视频,并且Datawhale整理了一份苹果书和李宏毅老师机器学习课程的对照表,非常方便结合学习!
苹果书电子版:
国内地址(推荐国内读者使用):链接: 百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com/s/1ZKuXfkXHoyyvPR1-CP-Ffw 提取码: 2t6m
好了,言归正传,按照我个人目前的理解,我觉得深度学习中最重要的数学部分就是优化了,定义好损失函数后,采用梯度下降的方法不断减少损失,最终达到理想的效果,下面我就分享一下我个人学到的优化方法。
一、深度学习的流程
首先,我觉得无论学习什么,都要掌握一个大的框架,之后在去细节学习框架中的每一步,才能更好的把握全局,理解细节。
深度学习的流程可以分为以下几个关键步骤,每个步骤在整个模型的训练过程中都至关重要:
-
数据准备: 深度学习的成功依赖于大量的高质量数据。首先,需要收集并清洗数据,确保数据的完整性和一致性。数据准备阶段还包括数据的预处理,如归一化、标准化、数据增强(特别是在计算机视觉任务中)等。这一步确保模型能够在不同输入情况下保持稳定的表现。
-
模型选择和架构设计: 选择适合任务的神经网络架构是深度学习流程中的关键一步。对于不同任务(如图像分类、自然语言处理、回归任务等),模型架构可能大不相同。常见的模型包括卷积神经网络(CNN)、循环神经网络(RNN)、生成对抗网络(GAN)等。此外,在设计架构时,还需考虑模型的深度、宽度、层数以及激活函数的选择。
-
定义损失函数: 损失函数(或目标函数)用于衡量模型预测结果与真实标签之间的差距。不同任务使用的损失函数可能不同,例如分类问题中常用交叉熵损失,回归问题中常用均方误差。定义好损失函数后,模型的训练过程就变成了一个优化问题,即通过调整模型参数来最小化损失函数的值。
-
选择优化算法: 优化算法是深度学习模型训练的核心,它决定了模型参数如何更新以最小化损失函数。常见的优化算法包括梯度下降、随机梯度下降(SGD)、Adam等。选择合适的优化算法可以大大加快模型的收敛速度,并提高模型的最终性能。
-
模型训练: 训练过程是深度学习的主要计算阶段。在这个阶段,模型通过不断地前向传播、计算损失、反向传播、更新权重来逐步学习数据中的模式。训练过程通常需要多轮迭代(即多个epoch),每次迭代都通过整个数据集。
-
模型评估与调优: 在训练过程中,需要不断评估模型在验证集上的表现,以检测是否出现过拟合或欠拟合,并根据评估结果调整模型超参数(如学习率、批量大小、正则化参数等)。此外,还可以使用交叉验证等技术来提高模型的泛化能力。
-
模型部署与应用: 当模型训练和调优完成后,就可以将其部署到实际应用中。模型部署的形式可以是嵌入到应用程序中,也可以是作为一个服务在云端运行。此外,还需要监控模型在实际应用中的表现,确保其在真实环境中保持良好的性能,并根据需要进行更新和再训练。
-
通过以上过程我们不难看出优化对于深度学习中模型的训练至关重要,直接决定了模型是否能够取得很好的训练效果。下面就介绍一下我了解到的优化的一些方法。
二、神经网络优化的方法
1.基本概念
- 局部极小值:指的是在函数的一定范围内(即局部区域),函数值比该区域内的其他点的函数值都小的点。简单来说,它就是一个小范围内的最低点,但不一定是整个函数的最低点。例如,如果你把一个山谷想象成一个函数的图形(实际上很多三元函数的图形就是形状各异的“山”,其中可能会有很多的“山谷”,也就是具有很多的局部极小值),山谷的底部就是一个局部极小值,因为在这个山谷的附近,你找不到比它更低的点。然而,它可能不是整个山脉(即整个函数)的最低点,可能还有更深的山谷,这就是全局极小值。
-
鞍点:指在某些方向上是极小值,而在其他方向上是极大值的点。它类似于马鞍的形状:在一个方向上是凹的(极小),而在另一个方向上是凸的(极大)。因此,鞍点既不是局部极大值也不是局部极小值。
-
临界点:梯度为零的点统称为临界点。即局部极小值点和鞍点都是临界点。
-
局部极小值和鞍点的共同之处:它们都是临界点,在这些点处函数的一阶偏导数为零。
-
局部极小值和鞍点和优化表现上的区别:(重点)
- 局部极小值:优化算法在局部极小值点处往往会停下来,因为该点附近没有更小的值。
- 鞍点:优化算法可能会在鞍点处陷入停滞,因为梯度为零,但鞍点不是最优解。现代优化算法,如带动量的梯度下降和Adam优化器,往往能帮助模型从鞍点中逃离。
-
批量(Batch):批量指的是在训练模型时,将所有训练数据分成若干个小批次,每次使用一个批量的数据来计算梯度并更新模型参数。
-
动量(Momentum):动量法是一种用于加速梯度下降收敛的优化方法。通过引入动量,每次更新参数时不仅考虑当前的梯度,还结合了前几次的更新方向,使得在面对鞍点或局部极小值时,模型能够继续突破,避免被困住。动量法的思想类似于物理中的惯性,即一个物体在移动时具有惯性,即使在鞍点或局部极小值处也能继续移动。
-
Hessian矩阵(海森矩阵):
-
Hessian矩阵的作用:
-
判断极值点的类型:通过计算函数在临界点处的 Hessian 矩阵,我们可以判断该点是局部极小值、局部极大值还是鞍点。
- 如果 Hessian 矩阵是正定矩阵(即所有特征值为正),那么该点是局部极小值。
- 如果 Hessian 矩阵是负定矩阵(即所有特征值为负),那么该点是局部极大值。
- 如果 Hessian 矩阵的特征值有正有负,则该点是鞍点。
-
曲率分析:Hessian 矩阵给出了函数在某一点的二阶导数信息,因此可以用来分析该点附近的曲率。正定矩阵意味着曲面是向上的(凹的),负定矩阵意味着曲面是向下的(凸的),而混合特征值则表示曲面在不同方向上的曲率不同。
-
优化算法中的应用:在优化算法中,Hessian 矩阵可以用来进行二阶优化方法,如牛顿法。这些方法利用 Hessian 矩阵的信息来更快地找到极值点。
-
关于Hessian矩阵:其实繁杂的数学还是难以理解的,需要一些高数和线代的知识,但如果真的不理解它也没有太大关系,因为现在真正广泛使用的优化方法中很少会直接使用Hessian矩阵,因为使用Hessian矩阵有它固有的缺点:Hessian矩阵是一个二阶导数矩阵,计算成本非常高,尤其是在深度神经网络中,参数的数量可能达到数百万甚至更多,直接计算和存储Hessian矩阵在这种情况下是不可行的。
2.观察与事实
有了前面的基本概念的铺垫,特别是局部极小值和鞍点和优化表现上的区别,我们自然就想到如果常见在深度学习优化时发现损失无法降低了,如果导致这种情况的更多的是鞍点而不是局部极小值,那么是不是就可以跳出鞍点继而继续降低损失?
个人理解:在高维空间中,由于参数数量巨大,误差表面会是形状各异的“山”,其中会有很多“山谷”(也就是平的地方(局部极小值),和部分平,但附近的地方有些低,有些高(鞍点)),局部极小值可能只是鞍点的一部分。
我在想,这个观察有没有可能已经被用严谨的数学证明了,查了一下论文,还真有,论文链接:
The Loss Surfaces of Multilayer Networks (mlr.press)https://proceedings.mlr.press/v38/choromanska15.html有了这个观察,就可以正式介绍优化方法了,也便于后续理解它们的缺点。
3.优化方法
- 批量梯度下降法(Batch Gradient Descent, BGD):利用整个训练数据集计算一次梯度并更新参数。优点:这种方法的梯度计算更稳定,参数的更新更稳定。
- 随机梯度下降法(Stochastic Gradient Descent, SGD):每次使用一个样本来计算梯度并更新参数。优点:这种方法引入了更多的随机噪声,使其在非凸优化问题中更容易逃离局部最小值。
- 小批量梯度下降法(Mini-Batch Gradient Descent):介于BGD和SGD之间,每次使用一个小批量的数据来计算梯度并更新参数。优点:既保留了计算效率又能在一定程度上减小噪声。
- 动量法(Momentum Method):具体概念参考第二节中关于动量的概念。优点:通过引入动量来加速收敛,无论是在面对鞍点或局部最小值时,能够帮助模型突破这些障碍,继续降低损失。
其实了解了一下还有Adam等自适应优化方法,能够自动调整学习率来更好优化损失函数,但我目前对这类方法了解还不是很深,不敢贸然写介绍和感悟,后续学习后会再写博客专门介绍。
三、神经网络优化的挑战
批量梯度下降法(BGD):
- 计算成本高:BGD需要使用整个训练数据集来计算梯度,这对于大规模数据集来说,计算量非常大,导致训练时间长且内存占用高。
- 易陷入局部最小值:在非凸优化问题中,BGD容易陷入局部最小值,特别是在复杂的损失表面上,可能难以逃离局部极小值。
随机梯度下降法(SGD):
- 收敛速度慢且不稳定:SGD每次更新只使用一个样本,因此梯度的更新方向容易受到单个数据点的噪声影响,导致收敛路径曲折,最终收敛速度较慢。
- 需要合适的学习率:SGD对学习率非常敏感,选择不当的学习率可能导致训练过程中的不稳定性,甚至导致模型不收敛。
小批量梯度下降法(Mini-Batch Gradient Descent):
- 批量大小选择难度:选择合适的批量大小是一个挑战,过小的批量可能导致噪声过大,收敛不稳定;过大的批量可能导致计算成本上升,并且容易陷入较差的局部极小值。
- 内存消耗问题:小批量梯度下降在GPU上训练时,需要在内存中存储多个样本的数据,这对内存消耗提出了更高的要求。
动量法(Momentum Method):
- 动量参数的调整:动量参数的选择直接影响到优化的效果,过大的动量可能导致参数更新过度,反而影响收敛效果;过小的动量则可能起不到明显的效果。
- 易受局部极小值影响:尽管动量法有助于逃离鞍点或局部极小值,但在复杂的损失表面上,依然可能存在停滞现象。
四、后续学习方向
我个人觉得我写的还是有缺陷的,并没有介绍使用广泛的自适应优化方法,还有超参数调优,按照我的理解,即使选择了合适的优化方法,使得在优化过程中遇到损失无法下降的情况时,跳出临界点,但可能会存在过拟合的问题,因此如何调整超参数也是一门学问,后续我学习后会继续分享我的感悟。