参考文章:
目录
一、梯度下降的改进
1、小批量随机梯度下降
小批量梯度下降详细分析请点击这里,目录为《三》
2、自适应梯度下降(动量法)
(1)标准的动量法
梯度下降法在有些地方(Hessian矩阵病态)进展缓慢,如下图
在梯度下降中加入动量,即:移动量不仅与梯度有关,还与前 一时刻的移动量有关。
这样可能使得梯度下降可能可以越过部分局部最小值区域,但也不一定,仍然不能保证到达全局最小值。
标准的动量法更详细的分析点击这里,目录是《五》
(2)Nesterov动量法
不计算当前位置的梯度,而是计算如果按照速度方向走了一步,那个时候的梯度,再与速度一起计算更新方向。
三者比较:
梯度下降:
动量法:
NAG:
标准动量法:收敛快,迭代次数比梯度下降法少一半 ,尤其前几次迭代参数更新量大 最后阶段搜索范围越过了最佳位置(学习率较大),这时两次更新方向相反,动量法会使得更新幅度减小,再慢慢回到最佳位置。
NAG:提前预知目标函数的信息,相当 于多考虑了目标函数的二阶导数信息,类似牛顿法的思想,因此搜索路径更合理,收敛速度更快。
梯度下降:目标函数在竖直方向比在水平方向的斜率的绝对值更大,梯度下降法中参数在竖直方向比在水平方向移动幅度更大,在长轴上呈 “之” 字形反复跳跃,缓慢向最小值逼近 。 (不同参数的梯度范围差异大, 通常是因为特征没有去量纲)
标准动量法:竖直方向上的移动更加平滑, 且在水平方向上更快逼近最优 解, 因为此时竖直方向的当前梯度 与之前的梯度方向相反相互抵 消,移动的幅度小
NAG:提前预知目标函数的信息,相当 于多考虑了目标函数的二阶导数 信息,类似牛顿法的思想,因此 搜索路径更合理,收敛速度更快
Nesterov动量法更详细的分析点击这里,目录是《六》
3、自适应学习率
学习率对训练的影响:
目标函数变化太慢:学习率太低
目标函数出现NaN:通常意味着学习率太高
建议:[1e-3 ... 1e-5]
(1)AdaGrad
- 经常更新的参数学习率较小,尽量不被单个样本影响较大
- 偶尔更新的参数学习率较大一些,希望能从偶然出现的样本上多学习一些
- 使用二阶动量(迄今为止所有梯度的平方和)来度量历史更新频率
公式:
- 其中,⊙ 表示按元素乘法
- η 为初始学习率,通常设置为 0.01
- ε 通常取很小的数,如
,是为了防止分母出现0
存在问题:
- 梯度会累加得越来越大,学习率衰减:学习速率衰减过快,不好用。
- 减缓陡峭区域的下降过程,加速平坦区域的过程
AdaGrad法更详细的分析点击这里,目录是《七》
(2)RMSProp
为了缓解 AdaGrad 学习率衰减过快,RMSprop 改变梯度平方累积为指数衰减方式来削减学习率衰减的速度。
公式:
RMSProp法更详细的分析点击这里,目录是《八》
(3)Adam
Adam优化法是一种结合了动量法和RMSprop优点的优化算法,能够动态调整学习率(RMSprop法的优点)并且让梯度具有惯性(牛顿法的优点)。
Adam法更详细的分析点击这里,目录是《九》
4、综合
- Adam 通常是一个很好的选择。
- 学习率下降的SGD+Momentum 通常比Adam好一点点,但需要仔细调整
- 前期用Adam,享受Adam快速收敛的优势,
- 后期切换到SGD,慢慢寻找最优解
各种改进的梯度下降法的可视化结果
自适应学习率类的算法(AdaGrad, AdaDelta和RMSprop)的 优化路径直接走向了右边的极小值点, 但是动量梯度法(绿色曲线)和NAG(紫色曲线)均是先走到了另 一处狭长的区域,再转向极小值点, 且NAG的纠正速度快于动量梯度法。
鞍点:SGD(红色曲线)在鞍点处停止 动量梯度法(绿色曲线)和NAG(紫色曲线)在鞍点处停 留一会后逐渐脱离鞍点, 三种自适应学习率算法则能够快速摆脱鞍点。
5、参数初始化
在深度模型训练中,参数初始化是非常关键的一步,它直接影响模型的收敛速度、训练效果及其最终性能。不同的初始化方法会影响梯度的传播,避免出现梯度爆炸或梯度消失的情况。
对简单的机器学习模型,如Logistic回归,简单的将模型参数初始化0 或较小的随机数即可。对深度模型,由于目标函数非凸,层次深,如何选择参数初始值便成为一个值得探讨的问题。
偏置参数 b 通常设置为 0 ;
模型权重的初始化对于网络的训练很重要:
- 不好的初始化参数会导致梯度传播问题,降低训练速度;
- 好的初始化参数能够加速收敛,并且更可能找到较优解。
(1)权重随机初始化带来的问题
对于一个10层的深度神经网络
初始化方式一
每层权重都用N(0,0.01)随机初始化, 经过10层网络后各层的输出分布:
各层的数据分布不一致 随着层数的增加, 几乎所有的输出值都很接近0 。
初始化方式二
每层权重都用N(0,1)随机初始化, 经过10层网络后各层的输出分布:
权重更有可能为较大的值 各层输出的几乎全部集中在-1或1附近, 神经元呈饱和状态,梯度为0, 即出现“死亡神经元”,参数难以被更新。
(2)各层之间的能量传播过程计算
每层输出方差的计算:
去掉非线性变换部分,全连接每层输出 o 和输入 x 之间的关系为:
其中 为神经元的输入维度。
将每层的输出和梯度看成随机变量: 假设所有 独立同分布,
独立同分布,且
和
独立。
于是输出的期望和方差为:
输出的期望:
其中, 。
输出的方差:
为了使该层输出的方差()与输入的方差(
)匹配,则需要:
类似的,反向传播时,经过一层后梯度的方差不变,得到:
因此,要使该层输出和梯度的方差都不变,
最终得到:
(3)Xavier初始化(Glorot初始化)
Xavier初始化的核心思想是保证每一层的输出方差与输入方差一致,从而保持梯度在传递过程中的稳定性。假设激活函数是tanh或sigmoid,Xavier初始化可以使用下式来计算权重的方差: 其中,
是输入节点的数量,
是输出节点的数量。
- 优点:适用于tanh和sigmoid等激活函数,能够防止梯度爆炸或消失。
- 缺点:对于ReLU激活函数效果较差,因为ReLU的输出有一部分为零,可能导致部分神经元无法激活,影响训练效果。
另外的,如果初始化为均匀分布,则为保证每一层的输出方差与输入方差一致,权重初始化为:
疑问?
Xavier(Glorot)初始化的目的不就是保证每一层的输出方差与输入方差一致,那么权重初始化为时,如果激活函数是sigmoid,那么不就会导致输出和输入的方差不一致吗,而如果权重初始化为
,不就可以近似让输出和输入的方差一致。
《解决疑问见附录1》
(4)He初始化
He初始化是对Xavier初始化的改进,适用于ReLU激活函数。由于ReLU激活函数在输入小于零时输出为零,因此He初始化将方差扩大2倍:
- 优点:对于ReLU激活函数非常有效,能够避免“死神经元”问题。
- 缺点:如果选择了非ReLU激活函数,He初始化可能不适用。
6、Batch normalization 批正规化
Batch Normalization(批归一化)是深度神经网络中非常重要的技术之一,其主要目的是通过标准化每一层的输入分布来缓解内部协变量偏移(internal covariate shift)问题,从而加速训练、提高模型稳定性并具有一定的正则化效果。
(1)目的与动机
Batch Normalization 类似于普通的单层机器学习模型式的特征标准化。特征标准化使各个特征的分布相近,更容易训练出有效的模型。在深度学习模型中,使用批归一化来达到类似的效果。

在深层神经网络中,即使输入数据已做标准化,训练中模型参数的更新 依然很容易造成输出的剧烈变化,从而导致难以训练出有效的模型。(减小学习率可以缓解,但会时训练效率下降。)
对于输入 x 进行特征缩放比较简单,但对于隐藏层的输入 来说,每次迭代都是变化的难以对其进行标准化。
(2)实现方式
在小批量上进行标准化(这里称为归一化normalization ),不断 调整神经网络中间输出,从而使整个神经网络在各层的中间输出 的数值更稳定。这里的小批量不能太小,Batch normalization需要在较大的batch size 上才能工作。
对于一个给定层的输入 z(可以是激活值或卷积层的特征图,输入层的话是 x ),Batch Normalization 的基本步骤如下:
计算均值与方差:
对当前小批量数据 计算均值和方差:
标准化:
将输入标准化:
其中 ϵ 是一个小常数,防止分母为零。
标准化过程使得每层的输出都进行了一次不确定的线性变换,那么对网络的表达能力会有很大的影响。而且反向传播时无法进行,怎么办呢?可以再在标准化后加入一个可训练的平移缩放层。
缩放和平移:
引入可学习参数 和
,对标准化结果进行线性变换:
这一步使得BN层能够恢复原有的表示能力,即在必要时可以表示恒等映射。
在测试数据集上时:
测试时没有batch
理想的解决方案:在整个训练集上计算 和
,
现实的方案:在训练时计算每个batch的 和
移动平均
(3)Batch normalization的好处
- 可以采用更大的学习率、收敛速度更快
- 受初始化的影响变弱,缓解梯度消失/爆炸。
- 减少对正则化的依赖
(4)Batch normalization的其他要点
-
在网络中的插入位置:
BN 一般被插入在线性层(全连接层或卷积层)和非线性激活函数之间。这样可以确保激活函数输入的分布稳定,有助于缓解因非线性引起的训练困难。 -
训练与推理的区别:
在训练阶段,BN使用当前小批量数据的均值和方差;而在推理阶段,为了确保稳定性,通常会采用在训练阶段累积的全局均值和方差(通过移动平均的方式计算)。
-
小批量依赖性:
BN 依赖于小批量统计量,当批量尺寸过小时,其估计的均值和方差可能不稳定,影响归一化效果。 -
序列模型中的应用:
在 RNN 或 LSTM 等序列模型中,由于数据时间序列特性,直接应用 BN 可能不太合适,需要使用其他归一化技术,如 Layer Normalization 或 Time Normalization。
(5)Batch normalization总结
Batch Normalization 通过对每一层输入进行归一化,既缓解了内部协变量偏移问题,又有助于加速收敛、提高训练稳定性和一定程度上的正则化效果。其实现方式简单而有效,但在应用时也需要注意小批量大小、序列模型的特殊性以及训练与推理阶段统计量的一致性。总的来说,BN 已成为深度学习中不可或缺的一环,为构建更深更复杂的网络模型提供了有力支持。
7、预训练
预训练(pre-training)是一种非常有效的神经网络的初始化方法。因为预训练模型的参数离最优值已经不远了,优化时不容易进入局部极小值。
类似问题中已经训练好的模型
- 若数据集与预训练模型采用的训练数据集非常相似,且新数据集较小,只要在预训练模型最顶层输出特征上再训练一个线性分类器即可。因为一般认为初始的几层学到的是比较基础、通用的信息,越往后的层,它学到的信息和任务越接近。
- 若新数据集较大,可以使用一个较小的学习速率对预训练模型的最后几个顶层进行调优。
- 如果新数据集与预训练模型采用的训练数据集相差较大但拥有足够多的数据, 则需要对网络的多个层进行调优,同样也要使用较小的学习速率。
- 最坏的情况是新数据集不仅较小,而且与原始数据集相差较大,此时基于较为靠前的特征层就使用SVM分类器可能是相对较好的方案 。
- 从后边的层开始调,预训练的任务和目标任务相差的越多,需要调的层数就越多。如果预训练的任务和目标任务相差很多,且新数据集又很小,那么就只能拿最前边的层的输出接一个线性模型来进行输出。
8、模型初始化建议
- 使用 ReLU(无BN )激活函数时,最好选用 He 初始化方法,将参数初始化为服从高斯分布或者均匀分布的较小随机数。
- 使用 BN 时,减少了网络对参数初始值尺度的依赖,此时使用较小的标准差(如0.01)的高斯分布进行初始化即可。
- 借助预训练模型中参数作为新任务参数初始化的方式也是一种简便易行且十分有效的模型参数初始化方法。
9、跳跃连接
(1)基本概念与背景
-
定义:
跳跃连接指的是在网络中建立跨层连接,使得前面某层的输出能够直接传递到后面的层,而不经过中间所有层的连续变换。最常见的形式是残差连接(Residual Connection),其数学形式通常表示为:其中
是输入,
是经过若干层(如卷积、激活、归一化等)后的映射,最终输出为两者之和。
-
背景动机:
在深层网络中,梯度消失和信息衰减是常见问题,随着层数增加,梯度逐层衰减使得前面的层难以更新。跳跃连接通过直接传递原始信息和梯度,使得深层网络更容易训练,进而支持更深的网络结构(如 ResNet、DenseNet 等)。
(2)主要实现方式
-
残差连接(Residual Connections):
- 基本形式: 将输入
与经过若干层变换后的结果
相加,输出为
- 处理维度不匹配: 当
和
的维度不一致时,通常采用1×1卷积、线性变换或填充来调整,使得二者可以相加。
- 基本形式: 将输入
-
密集连接(Dense Connections):
- 形式: 在 DenseNet 中,每一层不仅接受前一层的输入,而是接受所有之前层的特征图的级联,形式上可以写为:
, 其中
表示特征的拼接。
- 目的: 强化特征重用并改善梯度传递。
- 形式: 在 DenseNet 中,每一层不仅接受前一层的输入,而是接受所有之前层的特征图的级联,形式上可以写为:
-
Highway Networks:
- 机制: 通过门控机制来决定跳跃连接和常规变换的权重分配,从而使网络自主选择信息传递的路径。
(3)优点与作用
-
缓解梯度消失:
跳跃连接为梯度提供了一条“捷径”,使得反向传播时梯度可以直接传递到较早的层,缓解了深层网络中梯度逐层衰减的问题。 -
加速收敛:
由于信息和梯度传递更加直接,网络训练通常会更快收敛,同时能够使用更高的学习率而不会引发不稳定现象。 -
支持更深的网络结构:
跳跃连接使得构建数十甚至上百层的深层网络成为可能,这在传统结构中往往会遇到训练困难和性能退化的问题(即“退化问题”)。 -
特征重用:
跳跃连接允许后续层利用前面层的低层次特征,从而使得网络在表示学习上更为丰富和高效。例如,在图像分割中的 U-Net 架构中,通过跳跃连接将浅层的高分辨率特征与深层语义特征结合,提高了分割精度。 -
正则化效果:
在一定程度上,跳跃连接有助于缓解过拟合,因为它允许信息流动有更多的路径选择,从而降低了单一路径参数依赖带来的风险。
(4)实现细节与注意事项
-
身份映射的重要性:
在残差网络中,跳跃连接一般采用恒等映射(identity mapping),这使得网络在初始阶段至少可以实现恒等函数,保证即使残差分支学习效果不佳,也不会使得整体性能下降。
-
批归一化的配合:
跳跃连接往往与 Batch Normalization 一起使用,进一步稳定了训练过程,使得每一层的输出分布更集中。 -
设计挑战:
- 在设计跳跃连接时,需要注意信息在加法或拼接操作后的维度匹配问题。
- 在部分场景中(例如带门控的 Highway Networks),如何设计门控机制以平衡跳跃和常规通道也是一个重要研究方向。
-
不同任务中的应用:
除了图像识别外,跳跃连接在自然语言处理、语音识别和强化学习等多个领域也得到广泛应用,其基本原理和优点在各领域具有普适性。
(5)潜在问题与局限
-
信息过载:
在一些密集连接的架构中,如果信息直接拼接过多,可能会导致参数量急剧上升或过多冗余信息,这时需要设计合适的压缩和选择机制。 -
非理想的身份映射:
虽然身份映射理论上是最优的传递方式,但在实际应用中,不同层之间特征分布差异可能会影响直接相加的效果,需要通过额外的变换层来缓解这种问题。 -
对硬件的要求:
密集连接等架构由于连接复杂,可能会对内存和计算资源提出更高要求,这在部署阶段需要进行优化。
(6)总结
跳跃连接作为深度网络设计中的一项重要技术,主要通过提供直接的信息传递路径,解决了深层网络中梯度消失、信息衰减以及训练不稳定等问题。无论是残差连接、密集连接还是基于门控的跳跃方式,都为构建更深、更高效的神经网络提供了理论和实践上的支持。虽然在实际设计中需要注意维度匹配、信息冗余和计算资源等问题,但总的来说,跳跃连接已经成为深度学习架构中的一项标准且有效的设计策略。
二、抗过拟合策略
(1)及早停止
(2)正则
机器学习模型的目标函数通常包含两项:
模型不仅在训练集上的损失和要小,而且参数要尽可能接近0
(3)丢弃法 Dropout
3.1 dropout实现方法
随机删除一部分神经元,即随机地将输入中的每个元素以概率 p 置0。
前向传播
反向传播损失,更新参数(没有被删除的那部分神经元的参数得到更新,删除的神经元参数保持被删除前的结果)
式中 经过激活函数变成
时多乘上了一个
使得
:对下一层网络而言,输入的幅值“看起来”一样。
测试时没有 dropout 。
3.2 dropout 直觉解释
- 如果每个人都期望组里其他人好好干活,最后什么也干不好(三个和尚没水喝)。
- 但是,如果你知道你的小伙伴可能会dropout,你就会干得更好,这样才能完 成任务。
- 测试时,大家都好好干,没有人dropout,因此会得到很好的结果。
3.3 dropout 解释—可视为集成学习
集成学习:结合几个模型降低泛化误差的技术。
但训练太多模型并集成,计算和存储代价太大。
Dropout提供了一种近似的、低成本集成方法:
- 每次用一个mini-batch训练一个网络。
- 这些网络中有些参数是共享的。
- 带Dropout的训练:M 个神经元,会有
种可能的网络。
3.4 dropout 小节
- Dropout被大量利用于全连接网络
- 对大型网络中间层,p=0.5是理想的
- 对于输入层, p应保持在0.2或更低:删除输入数据会对训练产生不利影响
- 在卷积网络隐藏层中由于卷积自身的稀疏化以及稀疏化的ReLu函数 的大量使用等原因,Dropout策略在卷积网络隐藏层中使用较少。
附录
1、Xavier(Glorot)初始化时的疑问解决
(1)Xavier初始化的基本思想
Xavier(Glorot)初始化的目标是让每一层的输入和输出在前向和反向传播时保持相似的方差,从而避免信号在网络中迅速消失或爆炸。它的推导假设了两点:
- 神经元输入是独立且具有零均值;
- 激活函数在工作区域内近似线性,即导数近似为1。
因此,对于一个线性(或近线性)激活函数,选取
可以使得输出方差与输入方差保持一致,从而平衡前向传播和反向传播中的信号尺度。
(2)Sigmoid激活函数的特点
对于sigmoid函数:
-
非线性与饱和特性:
Sigmoid在输入较大或较小时容易进入饱和状态,此时其导数非常小,进而引起梯度消失问题。 -
导数值较小:
在0附近,sigmoid的最大导数约为0.25,而非1。这意味着即使在最理想的情况下,每经过一层,其信号(或梯度)都会缩小大约0.25的比例。
(3)为什么简单地调整方差可能不行?
假设我们试图用
来“补偿”sigmoid导数小的情况,从数学上看,这里的系数8相对于2乘了4倍,从而在0点附近用0.25的梯度乘以4正好可以抵消这一缩放——在非常理想化、近似线性区域内似乎可以使得前向传播时输入和输出的方差一致。
然而,实际情况要复杂得多:
-
局部线性假设失效:
Sigmoid函数只有在接近0的区域近似线性,但如果权重方差过大,许多神经元的输入可能落在远离0的区域,从而进入饱和区。此时,sigmoid函数的梯度会急剧减小,甚至接近0,导致梯度消失问题更加严重。 -
激活值分布变化:
增大权重方差虽然在理论上能在0附近补偿梯度缩减,但同时也会增大各层的激活值分布范围。一旦激活值超出sigmoid的非饱和区域,大部分输出会趋近于0或1,这不仅破坏了“保持方差一致”的假设,也使得神经元难以更新。 -
整体平衡问题:
Xavier初始化不仅考虑前向信号的放大问题,还要平衡反向传播中的梯度流。如果单纯增大方差,可能会使得反向传播时某些层的梯度波动变大,影响整个网络的稳定性。
(4)总结
-
理论假设与实际差异:
Xavier初始化的推导假设激活函数在其工作区域内近似线性(导数约为1)。对于sigmoid来说,这一假设并不成立,最大导数仅为0.25,故单纯按推导公式得到的权重方差在使用sigmoid时确实会导致输出方差下降。 -
简单调整的风险:
虽然把方差从调整到
在数学上看似可以补偿0附近的缩放,但这只在非常理想化的条件下成立。实际训练中,激活函数可能会因为较大输入而迅速进入饱和区,反而加剧梯度消失问题,甚至引起训练不稳定。
-
综合解决策略:
因此,在深层网络中使用sigmoid时,通常不会单纯依靠调整初始化的方差来解决梯度消失问题,而是会考虑:- 换用更适合深层网络的激活函数(如ReLU或其变体);
- 采用归一化技术(如批归一化)稳定各层激活分布;
- 或者设计专门针对sigmoid的初始化策略(例如LeCun初始化),结合激活函数的特点调整参数分布。
综上,虽然从数学上简单乘上一个系数似乎可以使得在0附近输出和输入的方差匹配,但这忽略了sigmoid函数整体非线性及饱和问题,实际中往往会引起更多问题,而不能从根本上解决梯度消失。
所以,对于sigmoid函数权重大了会导致饱和,小了会导致梯度消失,真垃圾的激活函数。
饱和和梯度消失是什么样的?如下图:

