一、梯度下降算法
机器学习的一个常见任务是:通过学习算法发现一堆数据背后的规律,然后不断改进模型,使得这个模型能够很好地做出预测。大概怎么做呢?
确定目标(预测函数)-> 知道差距(损失函数)-> 明确方向(梯度下降)-> 努力程度(学习率)
1 梯度下降理解
- 模型训练的目标是在训练集上获得使得损失最小的的参数值组合,因此在训练过程中要不断调整参数值,如何调整参数值呢? 答案就是梯度下降算法。
- 梯度下降算法通过计算当前损失下降最快的方向来调整参数值(想象成从山顶到山谷每一步都要选择最优方案),使用梯度下降的优势是每一次调整超参数都是当前的最优方案(类似贪心),所以可以在计算量最小的情况下从初始参数值组合调整到使得损失最小的最优参数值组合(即山顶到山谷的步数最少,是最优方案)。
注:除了梯度下降算法以外,还有一些常被用来令代价函数最小的算法,这些算法更加复杂和优越,而且通常不需要人工选择学习率,通常比梯度下降算法要更加快速。这些算法有:共轭梯度(Conjugate Gradient),局部优化法(Broyden fletcher goldfarb shann,BFGS)和有限内存局部优化法(LBFGS)
2 学习率
- 梯度下降是朝着当前损失下降最快的方向进行参数值调整,这里主要注重在方向上,那我一次调整步长大小为多少呢?答案就是设置超参数学习率。
- 学习率或者步长,意味着我们可以通过α来控制每一步走的距离,以保证每一步距离不能太大也不能太小,太小的话,可能导致迟迟走不到最低点,太大的话,会导致错过最低点!
3 特征缩放
- 面对多维特征,可能会产生不同特征尺度不同,导致梯度下降算法收敛慢,所以需要对多维特征进行尺度缩放,统一尺度,例如统一缩放到-1到1。
4 梯度下降的分类
梯度下降有几种变体,主要区别在于计算梯度时使用数据的不同方式:
- 批量梯度下降:使用所有训练数据计算梯度,是最准确但最慢的方法。
- 随机梯度下降(SGD):每次只使用一个训练样本来更新参数,速度快但波动较大。
- 小批量梯度下降:折中方案,每次使用一小批样本计算梯度,既保证了速度又减少了波动。
5 梯度下降优化(动量)
-
动量梯度下降算法(Momentum optimization)
它通过引入动量的概念来加速梯度下降法的收敛速度,同时减少在最小值附近的摆动。动量算法的核心思想是计算梯度的指数加权平均数,并利用该平均值更新权重。这种方法可以看作是梯度下降法的一种改进,它通过减少局部最小值附近的震荡,使得算法能够更快地收敛到全局最小值。在动量梯度下降法中,参数更新不仅依赖于当前的梯度,还考虑了之前梯度的加权平均,即动量项。这个动量项可以看作是之前梯度的一个累积效应,它能够帮助梯度下降更平滑地进行,避免在复杂的函数曲面上陷入局部最小值。
-
NAG算法
Nesterov Accelerated Gradient (NAG) 算法是基于冲量梯度下降算法进行改进的一种算法,也是梯度下降算法的变种,以其快速的收敛速度而受到青睐。NAG是Momentum算法的扩展,通过引入“向前看”的策略来改善梯度下降过程中的加速问题,从而减少在最小值点附近的过冲现象 。NAG的核心思想是在每一步更新中,不仅仅考虑当前位置的梯度,而是先根据动量更新一个预测的下一步位置,然后计算这个预测位置的梯度,并用这个梯度来更新参数。这种方法可以看作是在梯度下降中加入了一种“惯性”,让参数更新更加平滑,同时提前考虑下一步的位置信息,以实现更有效的更新。
6 学习率优化(自适应)
-
AdaGrad优化算法
AdaGrad(Adaptive Gradient Algorithm)是一种自适应学习率的梯度下降算法,由Duchi等人于2011年提出,它根据参数的历史梯度信息自适应地调整每个参数的学习率 。AdaGrad的核心思想是将学习率调整为与参数梯度平方的累积和的逆相关,从而实现对每个参数独立调整学习率的效果 。这使得对于出现频率高的特征,其学习率会较低;而对于出现频率低的特征,其学习率会较高,这种方式特别适用于稀疏数据 。
-
AdaDelta优化算法
AdaDelta算法是一种自适应学习率的优化方法,由Matthew D. Zeiler在2012年提出,主要解决了AdaGrad算法在迭代后期可能较难找到有用解的问题 。AdaDelta算法没有学习率这个超参数,而是通过使用有关自变量更新量平方的指数加权移动平均的项来替代RMSProp算法中的学习率 。它使用了小批量随机梯度的指数加权移动平均变量,并引入了超参数ρ(通常设为0.9)来计算状态变量 。
7 梯度爆炸与消失
- 梯度爆炸
原因:梯度呈指数级增长,变的非常大,然后导致网络权重的大幅更新,使网络变得不稳定
解决办法:
1.权重衰减:通过给参数增加L1或L2范数的正则化项来限制参数的取值范围
2.梯度截断:当梯度的模大于一定阈值时,就将它截断成为一个较小的数
- 梯度消失
原因:梯度趋近于零,网络权重无法更新或更新的很微小,网络训练再久也不会有效果 解决办法:
1.合理的初始化权重值。初始化权重,使每个神经元尽可能不要取极大或极小值,以躲开梯度消失的区域
2.使用relu代替sigmoid和tanh作为激活函数
3.使用其他结构的RNNs,比如长短时记忆网络(LTSM),这是比较流行的做法
二、反向传播
1 前向传播(Forward Propagation)
- 前向传播是神经网络通过层级结构和参数,将输入数据逐步转换为预测结果的过程,实现输入层、隐藏层以及输出之间的复杂映射。
2 反向传播(Back Propagation)
- 反向传播算法利用链式法则,通过从输出层向输入层逐层计算误差梯度,高效求解神经网络参数的偏导数(链式法则),以实现网络参数的优化和损失函数的最小化。
- 另定义(转自维基百科):反向传播(英语:Backpropagation,缩写为BP)是“误差反向传播”的简称,是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见方法。 该方法对网络中所有权重计算损失函数的梯度。 这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数。(误差的反向传播)
- 【反向传播算法参考】
三、跳跃链接与残差链接
1 跳跃连接
跳跃链接的主要目的是将未压缩的特征直接送往解码器,因此跳跃连接往往会跨越深浅不一但普遍较深的网络层。
2 残差链接
残差连接则不同,残差连接的主要目的是确保模型在变深时,训练效果不会变的更坏。