算法岗实习八股整理——深度学习篇(5.21已更新)

发布于:2025-05-22 ⋅ 阅读:(12) ⋅ 点赞:(0)

激活函数

在神经元中,输入的input经过一系列加权求和后作用于另一个函数,这个函数就是这里的激活函数。类似于人类大脑中基于神经元的模型,激活函数最终决定了是否传递信号以及要发射给下一个神经元的内容。

激活函数为神经网络引入了非线性元素,使得网络能够逼近复杂的非线性函数,从而解决更广泛的问题。

特征

  • 非线性:激活函数满足非线性时,才不会被单层网络替代,神经网络才有意义
  • 可微性:优化器大多数是用梯度下降法更新梯度,如果不可微的话,就不能求导,也不能更新参数
  • 单调性:激活函数是单调的,能够保证网络的损失函数是凸函数,更容易收敛

典型例子

sigmod函数

在这里插入图片描述

σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+ex1
(1)取值范围为(0,1)

  • 它可以将一个实数映射到(0,1)的区间,可以用来做二分类。在特征相差比较复杂或者相差不是特别大的时候效果比较好。
  • 当x无穷大的时候,函数值趋近于1;当x无穷小的时候,趋近于0。相当于对输入进行了归一化操作。
  • 连续可导,0点导函数的值最大,并且两边逐渐减小。

(2)优缺点

  • 优点: 平滑、易于求导
  • 缺点:
    1)激活函数计算量大,反向传播求误差的时候,求导涉及到除法,很容易出现梯度消失的情况,从而无法完成深层网络的训练。
    2)x在无穷大或者负无穷小的时候,导数(梯度)为0,即出现了梯度弥散现象(梯度值越来越小)
    3)导数的值在(0,0.25)之间,在多层神经网络中,我们需要对输出层到输入层逐层进行链式求导。这样就导致多个0到0.25之间的小数相乘,造成了结果取0,梯度消失
    4)Sigmoid函数存在幂运算计算复杂度大,训练时间长
    5)Sigmoid 函数的输出不是 0 均值,并且其导数始终为正,这可能导致后一层神经元接收到的输入信号均值偏离 0,并且梯度的方向可能过于单一。这些问题可能会影响神经网络的训练效率和性能。

理解一下:
如果激活函数的输出不是 0 均值,那么后一层神经元接收到的输入信号的均值也不是 0。这可能会导致网络的每一层的输入分布逐渐偏离 0 均值,从而影响网络的收敛速度和稳定性。

如果输入数据始终是正的,那么在反向传播过程中,梯度的符号可能会始终为正。这可能导致权重更新的方向始终一致,从而减慢收敛速度,甚至导致网络陷入局部最优

(3)导数
在这里插入图片描述

σ ′ ( x ) = σ ( x ) ⋅ ( 1 − σ ( x ) ) = e − x ( 1 + e − x ) 2 \sigma'(x)= \sigma(x) \cdot (1 - \sigma(x))=\frac{e^{-x}}{(1+e^{-x})^2} σ(x)=σ(x)(1σ(x))=(1+ex)2ex
导数的值在(0,0.25)之间。

tanh函数

更详细的tanh函数解析可见大大link1
在这里插入图片描述
t a n h ( x ) = e x − e − x e x + e − x tanh(x)=\frac{e^x-e^{-x}}{e^{x}+e^{-x}} tanh(x)=ex+exexex

(1) 双曲正切函数(双曲余弦除双曲正弦)
当 x 趋近于正无穷时,tanh(x) 趋近于 1;当 x 趋近于负无穷时,tanh(x) 趋近于 -1。
在 x=0 处,tanh(x)=0,并且该点是图像的对称中心。

(2)导数
t a n h ′ ( x ) = 1 − ( e x − e − x e x + e − x ) 2 = 1 − t a n h ( x ) 2 tanh'(x)=1-(\frac{e^x-e^{-x}}{e^{x}+e^{-x}})^2=1-tanh(x)^2 tanh(x)=1(ex+exexex)2=1tanh(x)2
梯度(导数)的取值在(0, 1]之间

(3)特点

  • tanh函数输出满足0均值(补上了sigmod的缺点)
  • 当tanh(x)接近正负1的时候,导数会趋于0,可能引发梯度消失问题
  • 梯度(导数)的取值在(0, 1]之间,最大梯度为1,能够保证梯度在变化过程中不消减,缓解了Sigmoid函数梯度消失的问题
  • 存在幂运算,计算量大
  • 在时间序列建模、情感分析和回归任务中,表现出色。

(4)与sigmod关系
t a n h ( x ) = 2 ⋅ s i g m o d ( 2 x ) − 1 tanh(x)=2\cdot sigmod(2x)-1 tanh(x)=2sigmod(2x)1

补充:零中心化输出优势
  • 权重更新更高效:
    零中心化意味着正负输出值的对称性,这让权重的正负变化更加平衡,避免了像 Sigmoid 那样总是向一个方向偏移。
    梯度更新时不容易产生偏移,从而加快收敛速度。

  • 适合对称分布的数据:
    如果输入数据经过标准化(均值为 0),tanh的输出能更好地保持对称性,从而与数据的分布更加匹配。

  • 减小梯度爆炸风险:
    零中心化输出有助于稳定梯度传播,避免因输出值过于偏向正值或负值而导致的梯度爆炸问题。

非线性特性如何提升神经网络表现
  • 引入非线性能力:
    如果没有激活函数,神经网络的每一层只能执行线性运算(矩阵乘法和加法),即便网络很深,最终的输出仍是线性变换,无法解决复杂的非线性问题。
    tanh将输入数据通过非线性映射变换为[−1,1],使网络能够学习复杂的特征模式
  • 对中间特征的放大与压缩 :
    在[−2,2]的输入范围内,tanh 对输入值的变化较为敏感,能放大特征差异,从而更好地捕捉细节信息
    对于极值输入(非常大或非常小的值)tanh 将输出压缩到接近-1或1,起到了正则化的作用,避免过拟合
  • 平滑的梯度变化:
    tanh 是一个平滑的函数,其导数在大多数区间内都较为稳定。这让网络能够更平稳地调整权重,尤其是在处理非平滑输入时。

ReLu函数

在这里插入图片描述
R e L u ( x ) = m a x ( x , 0 ) ReLu(x)=max(x,0) ReLu(x)=max(x,0)
中文名:线性整流函数

(1)导数:
在这里插入图片描述
(2)优点:

  • 简洁且高效的计算
    它无需复杂的指数运算,相比于Sigmoid或Tanh等激活函数,ReLU的计算速度更快。
  • 解决梯度消失问题
    ReLU的导数在正区间为常数1,负区间为0,几乎不受到输入值大小的限制。这样,ReLU能够有效避免梯度消失的问题。而在Sigmoid或Tanh激活函数中,当输入值非常大或非常小时,导数(梯度)变得非常小。
  • 非线性特性
    尽管ReLU函数看起来是一个线性函数,但它通过“截断”负值区域(使其为0)引入了非线性特性。这是因为神经网络需要非线性激活函数来拟合复杂的数据分布和关系。如果没有非线性激活函数,整个网络将变成一个线性模型,无法学习到复杂的特征。因此,ReLU提供了所需的非线性特性,同时保持了计算的高效性。
  • 避免饱和问题
    Sigmoid和Tanh等激活函数容易出现饱和现象,尤其是在输入值很大或很小时,函数的导数会趋近于0,从而导致梯度消失。而ReLU在正区间内没有饱和问题,输出随输入增大而线性增加。这使得ReLU能够更有效地进行权重更新,提高网络的训练效率。
  • 稀疏激活
    ReLU函数的一个特点是,当输入小于0时,输出为0,这意味着神经网络中一部分神经元的输出会是零。通过这种机制,ReLU激活函数可以产生稀疏激活,即在每次前向传播时,大多数神经元的输出为零。这种稀疏性类似于生物神经元的活动模式,有助于提高网络的表示能力,同时也减小了计算量。
  • 计算稳定性
    由于ReLU不涉及复杂的指数运算(如Sigmoid或Tanh),它能够保持计算的稳定性。在长时间的训练过程中,ReLU也能有效避免由于数值过大或过小而导致的溢出或下溢问题。

(3)缺点:

  • 函数的输出不是以0为均值收敛慢
  • Dead ReLU问题:当ReLU函数的输入值为负时,它的输出始终为0,这意味着神经元在某些情况下可能永远不会激活(即其输出为0)。这种情况会导致部分神经元在训练过程中“死亡”,无法参与到后续的学习。特别是在初始化时,如果某些神经元的权重偏移值过大或过小,可能导致它们在训练过程中始终无法激活。

Leaky ReLU

Leaky ReLU在ReLU的基础上进行改进。它允许负输入时有一个非常小的斜率(通常是0.01),从而避免了“死神经元”问题。
在这里插入图片描述
在这里插入图片描述
(1)导数:
在这里插入图片描述
(2)特点:

  • Leaky ReLU的函数范围是负无穷到正无穷
  • 具有和ReLU完全相同的特点,而且不会造成Dead ReLU问题
  • 函数本身的取值在负无穷到正无穷;负区间梯度也存在,从而避免了梯度消失
  • 但是实际运用中,尚未完全证明Leaky ReLU总是比ReLU更好

softmax函数

介绍

softmax函数又称归一化指数函数,是基于sigmoid二分类函数在多分类任务上的推广,在多分类网络中,常用softmax作为最后一层进行分类。其本质是一种激活函数 ,将一个数值向量归一化为一个概率分布向量,且各个概率之和为1

softmax函数的作用是将原始得分转换为概率值,使得模型的输出更符合实际的概率分布。

公式

s i = e a i ∑ k = 1 K e a k s_i=\frac{e^{a_i}}{\sum_{k=1}^{K}e^{a_k}} si=k=1Keakeai
其中,a是输入向量,上述公式表示第i个类别的输出概率。

softmax可以使正样本(正数)的结果趋近于1,使负样本(负数)的结果趋近于0;且样本的绝对值越大,两极化越明显。

导数

当i=j时,
在这里插入图片描述
当i≠j时,
在这里插入图片描述

特点

  • 在零点不可微。
  • 负输入的梯度为零,这意味着对于该区域的激活,权重不会在反向传播期间更新,因此会产生永不激活的死亡神经元。
  • CNN中的softmax层:一种常见的分类层,它通常是放置在卷积神经网络的最后一层,用于将卷积神经网络输出的特征图转换为概率分布。
  • Transformer中的softmax: 用于将原始注意力分数转换为输入标记的概率分布。这种分布将较高的注意力权重分配给更相关的标记,并将较低的权重分配给不太相关的标记。Transformers通过softmax在生成输出时,使用注意力机制来权衡不同输入标记的重要性

神经网络的原理:

详见【架构师带你玩转AI】大大公众号。

通过前向传播计算预测值,通过损失函数衡量预测值与真实值之间的差距,通过反向传播计算梯度并更新参数,以及通过激活函数引入非线性因素。

  • 前向传播:数据从输入层经过隐藏层流向输出层,每层通过权重和偏置进行线性变换,并经过激活函数得到非线性输出
  • 激活函数: 为神经网络引入非线性,提升模型的表达能力。
  • 损失函数:衡量预测值与真实值之间的差距,如均方误差用于回归交叉熵用于分类
  • 反向传播:根据损失函数的梯度信息,从输出层逐层向输入层计算参数的梯度,并更新参数,以最小化损失函数值。
  • 梯度下降:一种优化算法,根据计算出的梯度按一定学习率更新网络参数,逐步逼近最优解。

损失函数

损失函数的本质:量化模型预测与真实结果之间的差异。

原理

误差反映单个数据点的预测偏差。
损失则是整体数据集的预测偏差总和。
损失函数运用这两者原理,聚合误差以优化模型,降低总体预测偏差。

  • 误差(Error):
    对单个数据点预测结果与真实值之间的差异,用于评估模型在特定数据点上的预测准确性。
    计算:误差可以通过多种数学公式来计算。其中,绝对误差是预测值与真实值之间差值的绝对值,用于量化预测偏离真实值的实际大小;平方误差则是预测值与真实值之间差值的平方,常用于平方损失函数中,以便更显著地突出较大的误差。

  • 损失(Loss):损失是衡量机器学习模型在整个数据集上预测不准确性的总体指标,通过最小化损失可以优化模型参数并改进预测性能。
    它反映了模型预测与真实值之间的差异,并将这些差异进行聚合,以提供一个标量值来表示预测的总体不准确性
    损失的具体计算是通过损失函数来完成的。损失函数接受模型的预测值和真实值作为输入,并输出一个标量值,即损失值,表示模型在整个数据集上的总体预测误差。

均方差损失函数(MSE):通过计算模型预测值与真实值之间差值的平方的平均值,衡量回归任务中预测结果的准确性,旨在使预测值尽可能接近真实值。

  • 特点:
    当预测值接近真实值时,损失值较小。
    当预测值与真实值差距较大时,损失值迅速增大。
    由于其梯度形式简单,易于优化。

交叉熵损失函数(CE):用于衡量分类任务中模型预测的概率分布与真实标签之间的差异,旨在通过最小化损失来使模型预测更加接近真实类别。

  • 特点:
    当预测概率分布与真实概率分布相近时,损失值较小。
    对预测概率的微小变化非常敏感,尤其当真实标签的概率接近0或1时。
    适用于概率输出的模型,如逻辑回归、softmax分类器等。

反向传播

前向传播(Forward Propagation):前向传播是神经网络通过层级结构和参数,将输入数据逐步转换为预测结果的过程,实现输入与输出之间的复杂映射。

  • 输入层:
    输入层接收训练集中的样本数据。
    每个样本数据包含多个特征,这些特征被传递给输入层的神经元。
    通常,还会添加一个偏置单元来辅助计算。

  • 隐藏层:
    隐藏层的每个神经元接收来自输入层神经元的信号。
    这些信号与对应的权重相乘后求和,并加上偏置。
    然后,通过激活函数(如sigmoid)处理这个求和结果,得到隐藏层的输出。

  • 输出层:
    输出层从隐藏层接收信号,并进行类似的加权求和与偏置操作。
    根据问题的类型,输出层可以直接输出这些值(回归问题),或者通过激活函数(如softmax)转换为概率分布(分类问题)。

反向传播(Back Propagation):反向传播算法利用链式法则,通过从输出层向输入层逐层计算误差梯度,高效求解神经网络参数的偏导数,以实现网络参数的优化和损失函数的最小化。
利用链式法则:反向传播算法基于微积分中的链式法则,通过逐层计算梯度来求解神经网络中参数的偏导数。

  • 从输出层向输入层传播:
    算法从输出层开始,根据损失函数计算输出层的误差,然后将误差信息反向传播到隐藏层,逐层计算每个神经元的误差梯度。
  • 计算权重和偏置的梯度:
    利用计算得到的误差梯度,可以进一步计算每个权重和偏置参数对于损失函数的梯度。
  • 参数更新:根据计算得到的梯度信息,使用梯度下降或其他优化算法来更新网络中的权重和偏置参数,以最小化损失函数。

原理

链式法则(Chain Rule):链式法则是微积分中的一个基本定理,用于计算复合函数的导数。如果一个函数是由多个函数复合而成,那么该复合函数的导数可以通过各个简单函数导数的乘积来计算

偏导数:偏导数是多元函数中对单一变量求导的结果,它在神经网络反向传播中用于量化损失函数随参数变化的敏感度,从而指导参数优化

目标

反向传播的目标是计算损失函数相对于每个参数的偏导数,以便使用优化算法(如梯度下降)来更新参数。
这些偏导数构成了梯度,指导了参数更新的方向和幅度

  • 计算过程:
    1)输出层偏导数:首先计算损失函数相对于输出层神经元输出的偏导数。这通常直接依赖于所选的损失函数。
    2)隐藏层偏导数:使用链式法则,将输出层的偏导数向后传播到隐藏层。对于隐藏层中的每个神经元,计算其输出相对于下一层神经元输入的偏导数,并与下一层传回的偏导数相乘,累积得到该神经元对损失函数的总偏导数。
    3)参数偏导数:在计算了输出层和隐藏层的偏导数之后,我们需要进一步计算损失函数相对于网络参数的偏导数,即权重和偏置的偏导数。

完整案例

输入层:2个神经元(输入特征 x1 和 x2)
隐藏层:2个神经元(带有激活函数 sigmoid)
输出层:1个神经元(带有激活函数 sigmoid)

网络的权重和偏置如下(这些值是随机初始化的,实际情况中会使用随机初始化):
输入层到隐藏层的权重矩阵 W1:[[0.5, 0.3], [0.2, 0.4]]
隐藏层到输出层的权重向量 W2:[0.6, 0.7]
隐藏层的偏置向量 b1:[0.1, 0.2]
输出层的偏置 b2:0.3

开始推理:
1.前向传播计算过程:
假设输入为 x=[x1,x2],例如 x=[0.5,0.6]。
(1)输入层到隐藏层:

  • 隐藏层神经元输入:
    z 11 = x 1 ⋅ W 1 [ 0 ] [ 0 ] + x 2 ⋅ W 1 [ 1 ] [ 0 ] + b 1 [ 0 ] = 0.5 × 0.5 + 0.6 × 0.2 + 0.1 = 0.25 + 0.12 + 0.1 = 0.47 z_{11}=x_1 · W_1[0][0]+x_2 · W_1[1][0]+b_1[0]=0.5×0.5+0.6×0.2+0.1=0.25+0.12+0.1=0.47 z11=x1W1[0][0]+x2W1[1][0]+b1[0]=0.5×0.5+0.6×0.2+0.1=0.25+0.12+0.1=0.47
    z 12 = x 2 ⋅ W 1 [ 0 ] [ 1 ] + x 2 ⋅ W 2 [ 1 ] [ 1 ] + b 1 [ 1 ] = 0.5 × 0.3 + 0.6 × 0.4 + 0.2 = 0.15 + 0.24 + 0.2 = 0.59 z_{12}=x_2 · W_1[0][1]+x_2 · W_2[1][1]+b_1[1]=0.5×0.3+0.6×0.4+0.2=0.15+0.24+0.2=0.59 z12=x2W1[0][1]+x2W2[1][1]+b1[1]=0.5×0.3+0.6×0.4+0.2=0.15+0.24+0.2=0.59
  • 隐藏层激活函数 sigmod:
    a 11 = s i g m o d ( z 11 ) = 0.615 a_{11}= sigmod(z_{11})=0.615 a11=sigmod(z11)=0.615
    a 12 = s i g m o d ( z 12 ) = 0.59 a_{12}=sigmod(z_{12})=0.59 a12=sigmod(z12)=0.59

(2)隐藏层到输出层:

  • 输出层神经元输入:
    z 2 = a 11 ⋅ W 2 [ 0 ] + a 12 ⋅ W 2 [ 1 ] + b 2 = 1.119 z_2=a_{11} · W_2[0]+a_{12} · W_2[1]+b_2=1.119 z2=a11W2[0]+a12W2[1]+b2=1.119
  • 输出层激活函数 sigmod:
    a 2 = s i g m o d ( z 2 ) = 0.753 a_2=sigmod(z_2)=0.753 a2=sigmod(z2)=0.753

2.反向传播计算过程:
假设真实标签为 y=0.8。
(1)计算损失函数,使用均方误差损失函数: L = 1 2 ⋅ ( y − a 2 ) 2 = 0.001369 L=\frac{1}{2} · (y-a_2)^2=0.001369 L=21(ya2)2=0.001369

(2)输出层误差:
δ 2 = ( a 2 − y ) ⋅ s i g m o d ′ ( z 2 ) \delta_2=(a_2-y)·sigmod'(z_2) δ2=(a2y)sigmod(z2)
这里 s i g m o d ′ ( z 2 ) = s i g m o d ( z 2 ) ⋅ ( 1 − s i g m o d ( z 2 ) ) = 0.186 sigmod'(z_2)=sigmod(z_2)·(1-sigmod(z_2))=0.186 sigmod(z2)=sigmod(z2)(1sigmod(z2))=0.186
所以 δ 2 = − 0.0093 \delta_2=-0.0093 δ2=0.0093

(3)隐藏层误差:

  • 对于隐藏层1:
    δ 11 = δ 2 ⋅ W 2 [ 0 ] ⋅ s i g m o d ′ ( z 11 ) = − 0.00132 \delta_{11}=\delta_2·W_2[0]·sigmod'(z_{11})=-0.00132 δ11=δ2W2[0]sigmod(z11)=0.00132
    δ 12 = δ 2 ⋅ W 2 [ 1 ] ⋅ s i g m o d ′ ( z 12 ) = − 0.00151 \delta_{12}=\delta_2·W_2[1]·sigmod'(z_{12})=-0.00151 δ12=δ2W2[1]sigmod(z12)=0.00151

(4)更新权重和偏置:
学习率假设为 l r = 0.1 lr=0.1 lr=0.1

  • 更新 W 2 W_2 W2:
    W 2 [ 0 ] = W 2 [ 0 ] − l r ⋅ δ 2 ⋅ a 11 = 0.60057 W_2[0]=W_2[0]-lr·\delta_2·a_{11}=0.60057 W2[0]=W2[0]lrδ2a11=0.60057
    W 2 [ 1 ] = W 2 [ 1 ] − l r ⋅ δ 2 ⋅ a 12 = 0.700599 W_2[1]=W_2[1]-lr·\delta_2·a_{12}=0.700599 W2[1]=W2[1]lrδ2a12=0.700599

  • 更新 b 2 b_2 b2:
    b 2 = b 2 − l r ⋅ δ 2 = 0.30093 b_2=b_2-lr·\delta_2=0.30093 b2=b2lrδ2=0.30093

  • 更新 W 1 W_1 W1:
    W 1 [ 0 ] [ 0 ] = W 1 [ 0 ] [ 0 ] − l r ⋅ δ 11 ⋅ x 1 = 0.500066 W_1[0][0] = W_1[0][0]-lr·\delta_{11}·x_{1}=0.500066 W1[0][0]=W1[0][0]lrδ11x1=0.500066
    W 1 [ 0 ] [ 1 ] = W 1 [ 0 ] [ 1 ] − l r ⋅ δ 12 ⋅ x 1 = 0.3000755 W_1[0][1]=W_1[0][1]-lr·\delta_{12}·x_{1}=0.3000755 W1[0][1]=W1[0][1]lrδ12x1=0.3000755
    W 1 [ 1 ] [ 0 ] = W 1 [ 1 ] [ 0 ] − l r ⋅ δ 11 ⋅ x 2 = 0.2000792 W_1[1][0]=W_1[1][0]-lr·\delta_{11}·x_{2}=0.2000792 W1[1][0]=W1[1][0]lrδ11x2=0.2000792
    W 1 [ 1 ] [ 1 ] = W 1 [ 1 ] [ 1 ] − l r ⋅ δ 12 ⋅ x 2 = 0.4000906 W_1[1][1]=W_1[1][1]-lr·\delta_{12}·x_{2}=0.4000906 W1[1][1]=W1[1][1]lrδ12x2=0.4000906

  • 更新 b 1 b_1 b1:
    b 1 [ 0 ] = b 1 [ 0 ] − l r ⋅ δ 11 = 0.100132 b_1[0]=b_1[0]-lr·\delta_{11}=0.100132 b1[0]=b1[0]lrδ11=0.100132
    b 1 [ 1 ] = b 1 [ 1 ] − l r ⋅ δ 12 = 0.200151 b_1[1]=b_1[1]-lr·\delta_{12}=0.200151 b1[1]=b1[1]lrδ12=0.200151

优化器

在深度学习中,优化器(optimizer)是一种用于调整神经网络模型参数以最小化损失函数的算法。优化器的目标是分局输入数据和期望的输出标签来调整模型的权重和偏置,使得模型能够更好地拟合训练数据并在未见过的数据上表现良好。

  1. BGD(Batch Gradient Descent)
    批量梯度下降法,是指在每一次迭代时使用所有样本来进行梯度的更新。样本总数N
    在这里插入图片描述

(1)优点:一次迭代是对所有样本进行计算,此时利用矩阵进行操作,实现了并行。由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。当目标函数为凸函数时,BGD一定能够得到全局最优。
(2)缺点:当样本数目 m 很大时,每迭代一步都需要对所有样本计算,训练过程会很慢。

  1. SGD(随机梯度下降)
    在这里插入图片描述
    定义:一次只对一个样本进行梯度下降,进行参数更新;
    (1)优点:由于不是在全部训练数据上的损失函数,而是在每轮迭代中,随机优化某一条训练数据上的损失函数,这样每一轮参数的更新速度大大加快;
    (2)缺点:准确度下降。由于即使在目标函数为强凸函数的情况下,SGD仍旧无法做到线性收敛;可能会收敛到局部最优,由于单个样本并不能代表全体样本的趋势;不易于并行实现;

SGD导致的Zigzag现象:由于是随机梯度下降,梯度下降的方向会出现不稳定,不能线性收敛,即Zigzag现象。

  1. MDGD(Mini Batch梯度下降)
    是对批量梯度下降以及随机梯度下降的一个折中办法。其思想是:每次迭代使用指定个(batch_size)样本来对参数进行更新。
    (1)优点:通过矩阵运算,每次在一个batch上优化神经网络参数并不会比单个数据慢太多。每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。
    (2)缺点:batch_size的不当选择可能会带来一些问题。

  2. AdaGrad(Adaptive Gradient,自适应梯度优化器/自适应学习率优化器)
    在这里插入图片描述

自适应梯度下降,每次梯度下降时会除以前面梯度计算总和的平方再开方;每个参数都有自己独有的学习率。越“频繁更新”的参数,未来学习率就越小。
(1)优点:每个参数有自己的自适应步长,不需要手动调不同维度的学习率;适合稀疏输入场景,能让那些“偶尔参与训练”的参数更新幅度更大。
(2)缺点:因为每步都累加梯度平方,长时间训练后会非常大,导致学习率衰减得太快,后期更新几乎停滞,无法继续优化。

  1. RMSProp(Root Mean Square Propagation)
    AdaGrad算法虽然解决了学习率无法根据当前梯度自动调整的问题,但是过于依赖之前的梯度,在梯度突然变化时无法快速响应。RMSProp为了解决这一问题,在AdaGrad的基础上增加了衰减速率参数。也就是说在当前梯度与之前梯度之间添加了权重,如果当前梯度的权重较大,那么响应速度也就更快,通过引入指数滑动平均来控制梯度平方的累积速度。
    在这里插入图片描述优点:
  • RMSProp 会更重视最近梯度的趋势,而不是像 AdaGrad 那样永远累加;
  • 它避免了长期训练后学习率“衰减为 0”的问题;
  • 特别适合非凸目标、RNN/LSTM 等梯度不稳定模型。
  1. Adam(Adaptive Momen Estimation,自适应动量估计)
    Adam优化算法是在RMSProp的基础上增加了动量。有时候通过RMSProp优化算法得到的值不是最优解,有可能是局部最优解,引入动量的概念后,求最小值就像是一个球从高处落下,落到局部最低点时会继续向前探索,有可能得到更小的值。
  • 结合了 Momentum 的一阶动量机制 和 RMSProp 的二阶动量(梯度平方)机制,既能加速收敛,又能自动调节学习率。

动量法(Momentum)是优化器中一个加速收敛的机制,灵感来自于牛顿物理学中的“惯性”原理。
它的核心思想是:不仅用当前梯度来更新参数,还引入“过去梯度的累积趋势”作为惯性方向。
在这里插入图片描述
在这里插入图片描述

(2)优点

  • 自适应学习率 + 动量加速,收敛又快又稳;
  • 每个参数都有自己独立的更新率,适合稀疏或不平稳梯度;
  • 几乎不需要手动调参(默认𝛽1=0.9,𝛽2=0.999,𝜖=1𝑒−8);
  • 特别适合大规模神经网络训练。

(3)缺点:

  • 虽然训练快,但有时 最终效果不如 SGD + Momentum(特别是在图像任务或需要精调的模型);
  • 原始 Adam 中 weight decay(权重衰减)实现方式有误,推荐使用 AdamW;
  • 在某些任务中存在“过早收敛”或“跳出好解”的风险,比如BERT 微调、文本生成、GAN 训练后期,Adam 可能让模型在 early epoch 表现不错,但后续无法继续提升。

在原始的Adam优化器中,权重衰减(weight decay)是在梯度更新中直接应用的,它等价于在损失函数中添加了一个L2正则化项,用于减小权重的幅度。这意味着权重衰减对所有权重参数都是一样的。

  1. AdamW
    AdamW是对Adam的改进,它将权重衰减与梯度更新分开处理。具体来说,权重衰减只应用于权重参数,而不应用于偏置参数。这是通过在损失函数中添加一个额外的L2正则化项来实现的,而不是直接应用于梯度更新。
    在这里插入图片描述
    在这里插入图片描述
  • 训练大模型更稳定(尤其是 Transformer/BERT);
  • 权重衰减效果更可控,不影响自适应调整;
  • 是 HuggingFace、PyTorch、TensorFlow 默认使用的优化器;
  • 已成为 大模型训练的推荐标准。

网站公告

今日签到

点亮在社区的每一天
去签到