深度学习——激活函数、损失函数、优化器

深度学习——激活函数、损失函数、优化器

  • 1、激活函数
    • 1.1、一些常见的激活函数
      • 1.1.1、sigmoid
      • 1.1.2、softmax
      • 1.1.3、tanh
      • 1.1.4、ReLU
      • 1.1.5、Leaky ReLU
      • 1.1.6、PReLU
      • 1.1.7、GeLU
      • 1.1.8、ELU
    • 1.2、激活函数的特点
      • 1.2.1、非线性
      • 1.2.2、几乎处处可微
      • 1.2.3、计算简单
      • 1.2.4、非饱和性
      • 1.2.5、单调性、输出范围有限
  • 2、损失函数
    • 2.1、深度估计回归损失
      • 2.1.1、L1损失函数
      • 2.1.2、L2损失函数
      • 2.1.3、smooth L1损失函数
      • 2.1.4、log cosh损失函数:
      • 2.1.5、==RMSE:均方根误差==
      • 2.1.6、MAE:平均绝对误差
      • 2.1.7、iRMSE
      • 2.1.8、REL系列
      • 2.1.9、 δ \delta δ :阈值精度
      • 2.1.10、log系列
    • 2.2、分类损失
      • 2.2.1、交叉熵损失:
      • 2.2.2、Focal Loss
    • 2.3、目标检测损失函数
      • 2.3.1、IoU Loss交并比损失
      • 3.2、GIoU Loss:泛化的IoU损失
      • 2.3.3、DIoU
      • 2.3.4、CIoU
      • 2.3.5、EIoU->F-EIoU
  • 3、优化器
    • 3.1、SGD、BGD、MBGD
    • 3.2、SGD with Momentum
    • 3.3、NAG
    • 3.4、AdaGard(自适应梯度)
    • 3.5、RMSprop算法
    • 3.6、Adadelta
    • 3.7、Adam 适应性矩估计
    • 3.8、Adamw
    • 3.9、各个优化器特点以及演化对比

1、激活函数

激活函数将非线性引入到网络中,没有激活函数相当于原始的感知机,只有线性操作,近似为矩阵相乘操作,加入激活函数后可以更好地拟合非线性函数。

1.1、一些常见的激活函数

1.1.1、sigmoid

σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1+e^{-x}} σ(x)=1+ex1
特点:将负无穷到正无穷的输入映射到0-1,处处连续可导,可以用于二分类,导数为 σ ′ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \sigma'(x)=\sigma(x)(1-\sigma(x)) σ(x)=σ(x)(1σ(x))
缺点:在输出值接近0或1时会出现饱和现象,在反向传播时梯度较小,容易梯度消失,从而无法完成深层网络的训练。输出不是0均值的,会导致后层的神经元的输入是非0均值的信号,这会对梯度产生影响。并且计算复杂度较高,因为涉及到指数。

1.1.2、softmax

S o f t m a x ( x i ) = e x i Σ j e x j Softmax(x_i)=\frac{e^{x_i}}{\Sigma_j{e^{x_j}}} Softmax(xi)=Σjexjexi
softmax可以将上一层的原始数据进行归一化,转化为一个(0,1)之间的数值,这些数值可以被当作概率分布,用来作为多分类的目标预测值,一般作为神经网络的最后一层,接收上一层网络的输入值,然后将其转化为概率。sigmoid是softmax的一个特例,sigmoid函数只能用于预测值为0或1的二元分类。

1.1.3、tanh

σ ( x ) = e x − e − x e x + e − x \sigma(x) = \frac{e^x-e^{-x}}{e^x+e^{-x}} σ(x)=ex+exexex
输出范围在-1~1,相比sigmoid函数,是0均值,会比sigmoid函数要好一些,但是仍然会存在容易梯度消失的问题。并且计算复杂度仍然较高。

1.1.4、ReLU

σ ( x ) = { 0 x < 0 x x ⩾ 0 \sigma(x) = \begin{cases} 0 & x<0 \\ x & x \geqslant 0 \end{cases} σ(x)={0xx<0x0
或者 σ ( x ) = m a x ( 0 , x ) \sigma(x) = max(0,x) σ(x)=max(0,x)
整流线性单元,使用ReLU的SGD算法收敛速度比sigmoid和tanh快,在x>0时不会出现梯度消失问题,在x<0时,梯度为0,无法传播到前一层。计算复杂度低。
缺点:输出不是0均值的,并且在x<0时会存在神经元坏死问题,梯度无法传播,其后面的神经元梯度都为0,无法更新参数。

1.1.5、Leaky ReLU

σ ( x ) = { α x x < 0 x x > 0 \sigma(x) = \begin{cases} \alpha x & x<0 \\ x & x>0 \\ \end{cases} σ(x)={αxxx<0x>0
alpha默认0.01;为解决ReLU神经元坏死的问题,引入了LeakReLU,使得激活函数在负数区域也存在微小的梯度,而梯度是固定的斜率。

1.1.6、PReLU

σ ( x ) = { a x x < 0 x x > 0 \sigma(x) = \begin{cases} ax & x<0 \\ x & x>0 \\ \end{cases} σ(x)={axxx<0x>0
和LeakReLU不同的是这里的参数 a a a是可学习的

1.1.7、GeLU

σ ( x ) = 1 1 + e − 1.702 x \sigma(x) = \frac{1}{1+e^{-1.702x}} σ(x)=1+e1.702x1
在Transformer里面用的多一些

1.1.8、ELU

σ ( x ) = { α ( e x − 1 ) x < 0 x x > 0 \sigma(x) = \begin{cases} \alpha(e^x-1) & x<0 \\ x & x>0 \\ \end{cases} σ(x)={α(ex1)xx<0x>0
有负数饱和区域,从而对噪声有一些鲁棒性。可以看做是介于ReLU和Leaky ReLU之间的一个函数。当然,这个函数也需要计算exp,从而计算量上更大一些。

1.2、激活函数的特点

1.2.1、非线性

即导数不能是常数,来保证多层网络不退化成单层线性网络

1.2.2、几乎处处可微

几乎处处可微保证了在优化中梯度的可计算性,ReLU仅在有限个点处不可微。有限个不可微的点对优化结果不会有很大的影响。

1.2.3、计算简单

因为每一个神经元的输出都需要经过激活函数,简单的函数像是ReLU更适合做激活函数。

1.2.4、非饱和性

Sigmoid在正负区域都有饱和区,ReLU在负半轴有饱和区,饱和区参数无法得到有效更新,leakyReLU就是为了解决这个问题。

1.2.5、单调性、输出范围有限

2、损失函数

2.1、深度估计回归损失

2.1.1、L1损失函数

L1损失函数:最小绝对值偏差、最小绝对值误差:是目标值与估计值的绝对差值的总和。缺点:不稳定。收敛速度慢。优点:对离群点异常值更具有鲁棒性。
L 1 ( y ^ − y ) = ∑ i = 0 m ∣ y ( i ) − y ^ ( i ) ∣ L_1(\hat{y}-y)=\sum_{i=0}^m\left|y^{(i)}-\hat{y}^{(i)}\right| L1(y^y)=i=0m y(i)y^(i)
torch.nn.L1Loss(size_average=None, reduce=None, reduction='sum') # size_average与reduce已经被弃用,具体功能可由reduction替代。

l1_loss = torch.nn.L1Loss(size_average=None, reduce=None, reduction='sum') # 创建实例
loss = l1_loss(src,tgt)

L 1 ( y ^ − y ) = 1 N ∑ i = 0 m ∣ y ( i ) − y ^ ( i ) ∣ L_1\left(\hat{y}-y\right)=\frac1N\sum_{i=0}^m\left|y^{(i)}-\hat{y}^{(i)}\right| L1(y^y)=N1i=0m y(i)y^(i)
torch.nn.L1Loss(size_average=None, reduce=None, reduction='mean'),相当于MAE平均绝对误差。
torch.nn.functional.l1_loss(src, tgt, reduction='mean')
torch.mean(torch.abs(src-tgt))
(src-tgt).abs().mean()
如果是np.ndarray的话
np.mean(np.abs(src-tgt)) np.ndarray没有.abs()方法,只有类np.abs()函数

2.1.2、L2损失函数

L2损失函数:均方误差:是目标值与估计值的差值的平方和。缺点:对异常值更敏感。梯度更新方向容易受离群点主导。
L 2 ( y ^ , y ) = ∑ i = 0 m ( y ( i ) − y ^ ( i ) ) 2 L_2(\hat{y},y)=\sum_{i=0}^m(y^{(i)}-\hat{y}^{(i)})^2 L2(y^,y)=i=0m(y(i)y^(i))2
torch.nn.MSELoss(size_average=None, reduce=None, reduction='sum')
torch.sum(torch.pow(src-tgt,2))
np.sum(np.power(src-tgt,2))
L 2 ( y ^ , y ) = 1 N ∑ i = 0 m ( y ( i ) − y ^ ( i ) ) 2 L_2(\hat{y},y)=\frac1N\sum_{i=0}^m(y^{(i)}-\hat{y}^{(i)})^2 L2(y^,y)=N1i=0m(y(i)y^(i))2
torch.nn.MSELoss(size_average=None, reduce=None, reduction='mean'),相当于MSE均方误差。
torch.mean(torch.pow(src-tgt,2))
np.mean(np.power(src-tgt,2))

2.1.3、smooth L1损失函数

smooth L1损失函数:平滑之后的L1损失函数:分段函数,来消除L1的折点不光滑问题。当误差的绝对值较小时采用MSE,当误差的绝对值较大时采用MAE。
S m o o t h L 1 = 0.5 x 2 , ∣ x ∣ < 1 ∣ x ∣ − 0.5 , x < − 1 或者 x > 1 SmoothL_1=\begin{aligned}&0.5x^2,\mid x\mid<1\\&\mid x\mid-0.5,x<-1\text{或者}x>1\end{aligned} SmoothL1=0.5x2,x∣<1x0.5,x<1或者x>1
torch.nn.SmoothL1Loss(size_average=None, reduce=None, reduction='mean', beta=1.0) 上面公式里面的默认beta为1。

Huber Loss:对异常值鲁棒,集MAE和MSE的优势于一身。
在这里插入图片描述
在这里插入图片描述
当预测偏差小于δ时,采用平方误差MSE,
在pytorch中torch.nn.HuberLoss(reduction=‘mean’),pytorch中的smoothL1好像也具有类似的功能,是一样的。

2.1.4、log cosh损失函数:

双曲余弦对数在这里插入图片描述
对于较小的X值,log(cosh(x))约等于(x ** 2) / 2;对于较大的X值,则约等于abs(x) - log(2)。这意味着Log-cosh很大程度上工作原理和平均方误差很像,但偶尔出现错的离谱的预测时对它影响又不是很大。它具备了Huber损失函数的所有优点,但不像Huber损失,它在所有地方都二次可微。
但Log-cosh也不是完美无缺,如果始终出现非常大的偏离目标的预测值时,它就会遭受梯度问题。

2.1.5、RMSE:均方根误差

R M S E = 1 N ∑ i = 1 N ( D p r e d i − D g t i ) 2 \mathrm{RMSE}=\sqrt{\frac1N\sum_{i=1}^N\left(D_{pred}^i-D_{gt}^i\right)^2} RMSE=N1i=1N(DprediDgti)2
深度估计常常采用RMSE作为误差衡量指标。

2.1.6、MAE:平均绝对误差

MAE相对于RMSE更加具有鲁棒性,因为它不会受到平方项的影响,因此对异常值(大误差)不那么敏感,其计算公式如下:
MAE = 1 N ∑ i = 1 N ∣ D p r e d i − D g t i ∣ \text{MAE}=\frac1N\sum_{i=1}^N\lvert D_{pred}^i-D_{gt}^i\rvert MAE=N1i=1NDprediDgti

2.1.7、iRMSE

iRMSE:逆均方根误差,值越大表示性能越好错误,
i R M S E = 1 N ∑ i = 1 N ( 1 D p r e d i − 1 D g t i ) 2 \mathrm{iRMSE}=\sqrt{\frac1N\sum_{i=1}^N(\frac1{D_{pred}^i}-\frac1{D_{gt}^i})^2} iRMSE=N1i=1N(Dpredi1Dgti1)2
iMAE:逆平均绝对误差:
i M A E = 1 N ∑ i = 1 N ∣ 1 D p r e d i − 1 D g t i ∣ \mathrm{iMAE}=\frac1N\sum_{i=1}^N|\frac1{D_{pred}^i}-\frac1{D_{gt}^i}| iMAE=N1i=1NDpredi1Dgti1

2.1.8、REL系列

平均相对误差,REL的值表示平均相对误差的百分比,强调了深度估计的准确性。REL越小,表示模型的深度估计与真实深度的平均相对误差越小,模型性能越好,其计算公式如下:
abs REL:
a b s REL = 1 N ∑ i = 1 N ∣ D p r e d i − D g t i D g t i ∣ abs\text{ REL}=\frac{1}{N}\sum_{i=1}^{N}\lvert\frac{D_{pred}^{i}-D_{gt}^{i}}{D_{gt}^{i}}\rvert abs REL=N1i=1NDgtiDprediDgti
sq REL:
s q REL = 1 N ∑ i = 1 N ( D p r e d i − D g t i ) 2 D g t i sq\text{ REL}=\frac1N\sum_{i=1}^N\frac{\left(D_{pred}^i-D_{gt}^i\right)^2}{D_{gt}^i} sq REL=N1i=1NDgti(DprediDgti)2

2.1.9、 δ \delta δ :阈值精度

1.25 1.25^2 1.25^3定义为:
t h r e s h = max ⁡ ( D g t i D p r e d i , D p r e d i D g t i ) = δ < τ thresh=\max\Bigg(\frac{D_{gt}^i}{D_{pred}^i},\frac{D_{pred}^i}{D_{gt}^i}\Bigg)=\delta<\tau thresh=max(DprediDgti,DgtiDpredi)=δ<τ
对每个像素返回0或1,然后对整幅图取平均,其中 是给定的阈值通常为(1.25, 1.25^2, 1.25^3)。该指标与REL通常为室内数据集常用指标。

2.1.10、log系列

RMSE log:
R M S E log ⁡ = 1 N ∑ i = 1 N ( ln ⁡ ( D p r e d i ) − ln ⁡ ( D g t i ) ) 2 RMSE\log=\sqrt{\frac{1}{N}\sum_{i=1}^{N}\left(\ln\left(D_{pred}^{i}\right)-\ln\left(D_{gt}^{i}\right)\right)^{2}} RMSElog=N1i=1N(ln(Dpredi)ln(Dgti))2
log10:
log ⁡ 10 = 1 N ∑ i = 1 N ∣ log ⁡ 10 ( D p r e d i ) − log ⁡ 10 ( D g t i ) ∣ \log10=\frac1N\sum_{i=1}^N\left|\log_{10}\left(D_{pred}^i\right)-\log_{10}\left(D_{gt}^i\right)\right| log10=N1i=1N log10(Dpredi)log10(Dgti)
si log:
s i log ⁡ = 1 N ∑ i = 1 N ( ln ⁡ ( D p r e d i ) − ln ⁡ ( D g t i ) ) 2 − l a m b d a × ( 1 N ∑ i = 1 N ( ln ⁡ ( D p r e d i ) − ln ⁡ ( D g t i ) ) ) 2 si\log=\sqrt{\frac{1}{N}\sum_{i=1}^{N}\left(\ln\left(D_{pred}^{i}\right)-\ln\left(D_{gt}^{i}\right)\right)^2-lambda\times\left(\frac{1}{N}\sum_{i=1}^{N}\left(\ln\left(D_{pred}^{i}\right)-\ln\left(D_{gt}^{i}\right)\right)\right)^2} silog=N1i=1N(ln(Dpredi)ln(Dgti))2lambda×(N1i=1N(ln(Dpredi)ln(Dgti)))2
lambda通常为0.5

2.2、分类损失

2.2.1、交叉熵损失:

CrossEntropyLoss用于二分类或多分类问题。

  • 信息量: I ( x ) = − log ⁡ ( P ( x ) ) I(x)=-\log(P(x)) I(x)=log(P(x))信息量的大小和事件发生的概率成反比。
  • 信息熵:信息熵是在结果出来之前对可能产生的信息量的期望,要考虑随机变量的所有可能取值, H ( X ) = − Σ i = 1 n p ( x i ) log ⁡ ( p ( x i ) ) H(X)=-\Sigma_{i=1}^{n} p(x_i)\log(p(x_i)) H(X)=Σi=1np(xi)log(p(xi))
  • 相对熵:又被称为KL散度,相对熵等价于两个概率分布的信息的差值:假设 p ( x ) p(x) p(x)为样本真实分布, q ( x ) q(x) q(x)为样本预测分布,则相对熵为: D K L ( p ∣ ∣ q ) = H p q ( X ) − H p p ( X ) = Σ i = 1 n p ( x i ) log ⁡ ( p ( x i ) q ( x i ) ) D_{KL}(p||q) = H_{pq}(X)-H_{pp}(X)=\Sigma_{i=1}^n p(x_i) \log (\frac{p(x_i)}{q(x_i)}) DKL(p∣∣q)=Hpq(X)Hpp(X)=Σi=1np(xi)log(q(xi)p(xi))
    KL散度越小,说明两个分布(真实和预测)越接近,
  • 交叉熵:Cross Entropy
    设p(x)、q(x)分别是离散随机变量X的两个概率分布,其中p(x)是目标分布,q(x)是预测分布,则交叉熵为:
    H ( p , q ) = Σ i p ( x i ) log ⁡ 1 log ⁡ q ( x i ) = − Σ i p ( x i ) log ⁡ q ( x i ) H(p,q)=\Sigma_{i}p(x_i)\log{\frac{1}{\log q(x_i)}}=-\Sigma_{i}p(x_i)\log q(x_i) H(p,q)=Σip(xi)loglogq(xi)1=Σip(xi)logq(xi)
    可以看到交叉熵是把KL散度中的固定的部分给去掉了

2.2.2、Focal Loss

主要是来解决单阶段目标检测中正负样本数量级不平衡问题。基于二分类交叉熵损失函数提出Focal Loss,的一个动态缩放迭代交叉熵损失。Focal Loss降低了容易分类的样本是损失占比,将更多的注意力放在难的、被错误分类的样本上。

loss = F.binary_cross_entropy_with_logits(pred, label, reduction='none')
# binary_cross_entropy_with_logits表示损失函数内部已经带了计算logit的操作,无需在传入这个loss函数之前手动使用sigmoid/softmax将之前的网络的输入映射到[0,1]之间。label通常是独热码,维度大小与pred相同,
pred_prob = pred.sigmoid() # 转为概率
p_t = label * pred_prob + (1-label) * (1-pred_prob)
modulating_factor=(1.0-p_t) ** gamma 
# 对于在0标签处预测的概率比较大,这个因子会比较大,对于在1标签处预测的概率比较小的,这个因子也会比较大,对于概率很接近标签的,这个会比较小,从而动态缩放。
loss *= modulating_factor

BCE:二值交叉损失
在这里插入图片描述
在这里插入图片描述

2.3、目标检测损失函数

2.3.1、IoU Loss交并比损失

目标检测也可以用回归损失,让四个坐标值回归到目标值,但IoU损失是主流。
IoU表示交集与并集的面积比值。
IoU Loss = -ln(交集面积/并集面积)
部分来源于知乎。
在这里插入图片描述

3.2、GIoU Loss:泛化的IoU损失

当预测框与候选框没有重叠时,交集为0,损失为0,此时IoU无法计算两者之间的距离,梯度消失,而且IoU不管两个框的对齐方向问题。GIoU找到两个框最小闭合凸面C,然后再计算C中排除掉A和B后的面积占C原始面积的比值,最后再用原始的IoU减去这个比值得到泛化后的IoU值。
在这里插入图片描述

2.3.3、DIoU

2.3.4、CIoU

2.3.5、EIoU->F-EIoU

3、优化器

来源https://juejin.cn/post/7084409806492008456

一阶优化器:SGD、SDGwith Momentum、NAG(牛顿动量法)、AdaGrad(自适应梯度)、RMSProp(均方差传播)、Adam、Nadam、共轭梯度法
二阶优化器:牛顿法、拟牛顿法、BFGS、L-BFGS
其中:AdaGrad算法,RMSProp算法,Adam算法以及AdaDelta算法是自适应学习率算法

3.1、SGD、BGD、MBGD

假设待优化的模型参数为 θ \theta θ,目标函数(损失函数)为 J ( θ ) J(\theta) J(θ),学习率为 η \eta η,迭代周期epoch为t,则可以得到:
损失函数 J ( θ ) 关于当前参数 θ 的梯度: g t = ∇ θ J ( θ ) 损失函数J(\theta)关于当前参数\theta的梯度:g_t=\nabla_\theta J(\theta) 损失函数J(θ)关于当前参数θ的梯度:gt=θJ(θ)
在梯度下降算法中,沿着梯度的方向不断减小模型参数,参数更新为:
θ t + 1 = θ t − η ⋅ ∇ θ J ( θ ) = θ t − η ⋅ g t \theta_{t+1}=\theta_t-\eta \cdot \nabla_\theta J(\theta)=\theta_t-\eta \cdot g_t θt+1=θtηθJ(θ)=θtηgt
标注的梯度下降每次迭代都要遍历所有样本,这会使得训练过程极其缓慢
SGD:随机梯度下降
在每次迭代中仅使用一个随机选择的训练样本来计算梯度,并更新模型参数,训练成本低,但是不稳定,收敛速度慢,可能会收敛到局部最优解。通常,SGD收敛速度要比BGD快。
BGD:批量梯度下降
使用整个训练数据集所有样本的梯度,根据学习率更新模型参数,收敛方向更稳定,训练很慢,迭代次数相对较少。
MBGD:小批量梯度下降,对SGD和BGD的折中,每次使用batch_size个样本对参数进行更新。在合理的范围内增大batchsize能够确定更准确的收敛方向,减小震荡,增大并行率。但是batchsize过大,会导致迭代次数减小(相同epoch下),需要花费可能更多时间训练。

3.2、SGD with Momentum

参数更新时在一定程度上保留之前更新的方向,同时又利用batch的梯度微调最终的更新方向,SGD只使用了当步参数的梯度,随机性较大,如果将历次迭代的梯度按比例融合,可能更稳定。
假设 m t m_t mt表示 t t t时刻的动量, β \beta β表示动量因子,通常取0.9,即下降的方向只要是此前累计的方向,在SGD的基础上增加动量,则参数更新公式为:
M t = β ⋅ M t − 1 + η ⋅ g t θ t + 1 = θ t − M t M_t = \beta \cdot M_{t-1}+\eta \cdot g_t \\ \theta_{t+1} =\theta_t-M_t Mt=βMt1+ηgtθt+1=θtMt
一阶动量 M t M_t Mt是各个时刻梯度方向的指数移动平均值,约等于最近 1 ( 1 − β ) \frac{1}{(1-\beta)} (1β)1个时刻的梯度向量和的平均值。
动量可以减小震荡,在梯度方向相同时,动量可以加速参数更新,从而加速收敛。前后梯度不一致时能够抑制震荡,越过局部极小值,(加速收敛,减小震荡)

3.3、NAG

M t = β ⋅ M t − 1 + η ⋅ ∇ θ J ( θ − γ ⋅ M t − 1 ) θ t + 1 = θ t − M t M_t=\beta \cdot M_{t-1}+\eta \cdot \nabla_\theta J(\theta-\gamma \cdot M_{t-1}) \\ \theta_{t+1}=\theta_t-M_t Mt=βMt1+ηθJ(θγMt1)θt+1=θtMt
进一步进入nesterov动量,从SGD with Momentum可以看出,无论当前位置的梯度为什么,参数更新都一定会先走一个 β ⋅ M t − 1 \beta \cdot M_{t-1} βMt1,再根据之前位置处的参数小更新一下,于是NAG方法让参数先走 β ⋅ M t \beta \cdot M_t βMt,再根据走之后的位置处的梯度更新。这样如果前方的梯度更大,则迈步更大。

3.4、AdaGard(自适应梯度)

针对SGD中始终使用一个学习率的问题,AdaGard在每次进行参数更新的时候,对于每个参数,初始化一个s=0,然后每次将该参数的梯度平方求和累加到这个变量s上,而在更新这个参数的时候,学习率就变成:
G t = G t − 1 + g t 2 θ t + 1 = θ t − η G t + ϵ ⋅ g t G_t=G_{t-1} + g_t^2 \\ \theta_{t+1}=\theta_{t}-\frac{\eta}{\sqrt{G_t+\epsilon}} \cdot g_t Gt=Gt1+gt2θt+1=θtGt+ϵ ηgt
但是这种方法会存在二阶动量一直累加的问题,学习率迟早要很小。

3.5、RMSprop算法

RMSprop在有些情况下避免AdaGrad算法中学习率不断单调下降以至于过早衰减的缺点。
RMSprop首先计算每次迭代梯度g的平方的指数衰减移动平均Gt。例如 β = 0.9 \beta=0.9 β=0.9
G t = β ⋅ G t − 1 + ( 1 − β ) ⋅ g t 2 G_t=\beta \cdot G_{t-1} + (1-\beta) \cdot g_t^2 Gt=βGt1+(1β)gt2
其中 β \beta β是自定义衰减率。例如0.9。
然后根据指数衰减移动平均来更新参数
θ t + 1 = θ t − η G t + ϵ ⋅ g t \theta_{t+1}=\theta_{t}-\frac{\eta}{\sqrt{G_t+\epsilon}} \cdot g_t θt+1=θtGt+ϵ ηgt

3.6、Adadelta

为了接近AdaGard多次迭代后,学习率逐渐下降至0的问题,AdaGrad在一个窗口w中对梯度进行求和,而不是对梯度平方一直累加,这和RMSprop的做法类似。
但是Adadelta不光考虑了二阶动量,还考虑了一阶的影响。Adadelta实际上是使用更新量的平方的指数加权平均来动态得到代替了全局的标量的学习率,意味着更新量的平方越小,则学习率也就越小。
G t = β ⋅ G t − 1 + ( 1 − β ) ⋅ g t 2 u t = β ⋅ u t − 1 + ( 1 − β ) ⋅ Δ θ t 2 θ t + 1 = θ t − η ⋅ u t + ϵ G t + ϵ ⋅ g t G_t=\beta \cdot G_{t-1} + (1-\beta) \cdot g_t^2 \\ u_t = \beta \cdot u_{t-1} + (1-\beta) \cdot \Delta\theta_t^2 \\ \theta_{t+1} = \theta_{t}-\eta \cdot \frac{\sqrt{u_t+\epsilon}}{\sqrt{G_t+\epsilon}} \cdot g_t Gt=βGt1+(1β)gt2ut=βut1+(1β)Δθt2θt+1=θtηGt+ϵ ut+ϵ gt

3.7、Adam 适应性矩估计

Adam是一种可以替代传统随机梯度下降过程的一阶优化算法,和SDG不同之处在于:

  • SGD保持单一的学习率更新所有权重,学习率在训练过程中并不会改变,Adam通过计算梯度的一阶矩估计和二阶矩估计为不同的参数设计独立的自适应学习率。
    Adam算法计算了梯度的二阶矩均值。和梯度的指数移动均值,超参数beta1和beta2控制了这些移动均值的衰减率。
  • Adam算法结合了RMSprop算法和动量法,不但使用动量作为参数更新方向,而且可以自适应调整学习率来改进梯度下降。
  • Adam的参数:
    η \eta η:学习率,(0.001)
    beta1:一阶矩估计的指数衰减率(0.9)
    beta2:二阶矩估计的指数衰减率(0.999)
    默认参数就可以解决大部分问题。
  • 计算步骤:
    首先计算梯度平方的指数加权平均
    G t = β 2 ⋅ G t − 1 + ( 1 − β 2 ) ⋅ g t 2 G_t=\beta_2 \cdot G_{t-1} + (1-\beta_2) \cdot g_t^2 Gt=β2Gt1+(1β2)gt2
    计算梯度的指数加权平均(动量法)
    M t = β 1 ⋅ M t − 1 + ( 1 − β 1 ) ⋅ g t M_t=\beta_1 \cdot M_{t-1} + (1-\beta_1 ) \cdot g_t Mt=β1Mt1+(1β1)gt
    其中 β 1 \beta_1 β1 β 2 \beta_2 β2分别为两个移动平均的衰减率,0.9和0.999
    然后对偏差进行修正
    M t ^ = M t 1 − β 1 t G t ^ = G t 1 − β 2 t \hat{M_t} = \frac{M_t}{1-\beta_1^t} \\ \hat{G_t} = \frac{G_t}{1-\beta_2^t} Mt^=1β1tMtGt^=1β2tGt
    计算参数更新参数
    θ t + 1 = θ t − η G t ^ + ϵ M t ^ \theta_{t+1} = \theta_t-\frac{\eta}{\sqrt{\hat{G_t}+\epsilon}} \hat{M_t} θt+1=θtGt^+ϵ ηMt^

3.8、Adamw

在Adam中可能会存在不收敛的问题,因为随着二阶动量的不断累加,学习率会越来越小,但是不一定会按照合适的速率缩小,如果在模型收敛之前就已经过于小,则最后收敛不到想要的位置。并且在很多数据集上Adam泛化性并不如SGD with Momentum,这里面一个重要原因就是Adam中L2正则项并不像SGD中那么有效。
AdamW使用了更严谨的权重衰减,其权重衰减只在最后更新公司中使用,不参与动量计算。 λ \lambda λ是正则化系数
M t = β 1 M t − 1 + ( 1 − β 1 ) g t G t = β 2 G t − 1 + ( 1 − β 2 ) g t 2 M t ^ = M t 1 − β 1 t G t ^ = G t 1 − β 2 t θ t + 1 = θ t − η ⋅ ( M t ^ G t ^ + ϵ + λ ⋅ θ t ) M_t=\beta_1 M_{t-1} + (1-\beta_1 ) g_t \\ G_t=\beta_2 G_{t-1} + (1-\beta_2)g_t^2 \\ \hat{M_t} = \frac{M_t}{1-\beta_1^t} \\ \hat{G_t} = \frac{G_t}{1-\beta_2^t} \\ \theta_{t+1} = \theta_t - \eta \cdot (\frac{\hat{M_t}}{\sqrt{\hat{G_t}+\epsilon}}+ \lambda \cdot \theta_t) Mt=β1Mt1+(1β1)gtGt=β2Gt1+(1β2)gt2Mt^=1β1tMtGt^=1β2tGtθt+1=θtη(Gt^+ϵ Mt^+λθt)

3.9、各个优化器特点以及演化对比

GD(梯度下降)/BGD(批量梯度下降):使用全部训练集,沿着梯度反方向以固定学习率更新参数。
缺点:计算全局梯度耗时长;对所有参数使用相同学习率;只根据当前时刻梯度,容易陷入局部最优解。

SGD(随机梯度下降):相较于GD,只使用1个样本的来计算梯度。
优点:对于大数据集可以更快进行更新。
缺点:学习率固定;使用一个样本的梯度,优化过程震荡,需要长时间才能收敛。
MBGD(小批量梯度下降):相较于SGD,使用一个batch的样本的梯度。收敛更稳定。

Momenum(动量优化):在SGD/MBGD基础上引入动量,每次的更新量不是梯度*学习率,而是动量。 M t = β ⋅ M t − 1 + η ⋅ g t M_t = \beta \cdot M_{t-1}+\eta \cdot g_t Mt=βMt1+ηgt
优点:加速收敛,抑制震荡,跳出局部最优解。
缺点:需要人工设置动量参数,学习率固定。

AdaGrad(自适应梯度优化器):自适应学习率,与梯度平方和有关
G t = G t − 1 + g t 2 θ t + 1 = θ t − η G t + ϵ ⋅ g t G_t=G_{t-1} + g_t^2 \\ \theta_{t+1}=\theta_{t}-\frac{\eta}{\sqrt{G_t+\epsilon}} \cdot g_t Gt=Gt1+gt2θt+1=θtGt+ϵ ηgt
但是这种方法会存在二阶动量一直累加的问题,学习率迟早要很小。

RMSProp(均方根传播):相较于AdaGrad,使用指数移动平均来解决学习率一直变小的问题。
G t = β ⋅ G t − 1 + ( 1 − β ) ⋅ g t 2 G_t=\beta \cdot G_{t-1} + (1-\beta) \cdot g_t^2 Gt=βGt1+(1β)gt2
但是模型还是会对初始学习率敏感。

Adadelta:相较于RMSProp,用梯度更新量的平方的指数加权平均,来动态的替代全局标量的学习率,避免了优化器对学习率的敏感。
G t = β ⋅ G t − 1 + ( 1 − β ) ⋅ g t 2 u t = β ⋅ u t − 1 + ( 1 − β ) ⋅ Δ θ t 2 θ t + 1 = θ t − η ⋅ u t + ϵ G t + ϵ ⋅ g t G_t=\beta \cdot G_{t-1} + (1-\beta) \cdot g_t^2 \\ u_t = \beta \cdot u_{t-1} + (1-\beta) \cdot \Delta\theta_t^2 \\ \theta_{t+1} = \theta_{t}-\eta \cdot \frac{\sqrt{u_t+\epsilon}}{\sqrt{G_t+\epsilon}} \cdot g_t Gt=βGt1+(1β)gt2ut=βut1+(1β)Δθt2θt+1=θtηGt+ϵ ut+ϵ gt

Adam(自适应矩估计):结合了Momentum和RMSProp的优点,既保留了动量,又有自适应学习率。和SGD with Momentum相比,自适应学习率可以很大程度上避免学习率选择不当带来的训练震荡或收敛速度慢的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/490304.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencv-python的简单练习

1、读取一张彩色图像并将其转换为灰度图。 import cv2 img cv2.imread("../1iamge/a.jpg") # 灰度化 img_gray cv2.cvtColor(img, cv2.COLOR_BGRA2GRAY) cv2.imshow(img, img) cv2.imshow(img_gray, img_gray) cv2.waitKey(0) 2、编写程序&#xff0c;读取一张彩色…

Java、鸿蒙与嵌入式开发:技术选择与职业发展分析

在当今快速发展的科技领域中&#xff0c;Java、鸿蒙和嵌入式开发代表着不同的技术方向和职业机遇。每个方向都有其独特的市场价值和发展前景&#xff0c;让我们深入分析这三个领域的特点、发展趋势和职业规划。 Java开发方向已经发展了二十多年&#xff0c;仍然在软件开发领域…

【mybatis】缓存

目录 1. mybatis的运行 1.1 引言 1.2 具体运行&#xff1a; 1.3 sqlSession 介绍local catch 2. 缓存 2.1 概念 2.2 使用缓存的原因 2.3 什么样的数据能使用缓存 3. Mybatis缓存 3.1 一级缓存 3.1.1 测试一级缓存 3.1.2 缓存失效的四种情况 $1 sqlSession不同 $…

前端成长之路:CSS元素显示模式

元素显示模式 网页中的标签非常的多&#xff0c;在不同的地方会使用到不同类型的标签&#xff0c;了解这些标签的特点可以更好的布局我们的网页。 元素显示模式就是元素&#xff08;标签&#xff09;按照什么方式进行显示&#xff0c;比如&#xff1a;div标签会自己独占一行&a…

Unity类银河战士恶魔城学习总结(P178 Archer s arrow 弓箭手的箭)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节制作了一个弓箭手的箭 Arrow_Controller.cs 1.OnTriggerEnter2D方法 功能&#xff1a;检测箭矢与其他对象的碰撞。逻辑&#xff1…

机器学习周报(12.9-12.15)

文章目录 摘要Abstract 1 Swin Transformer1.1 输入1.2 Patch Partition1.3 Linear Embedding1.4 Patch Merging1.5 Swin Transformer Block1.6 代码总结 摘要 本篇博客介绍了采用类似于卷积核的移动窗口进行图像特征提取的Swin Transformer网络模型&#xff0c;这是一种基于T…

【C++游记】Vector的使用和模拟实现

枫の个人主页 你不能改变过去&#xff0c;但你可以改变未来 算法/C/数据结构/C Hello&#xff0c;这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕&#xff0c;我们继续来学习C的内容呀。C是接近底层有比较经典的语言&#xff0c;因此学习起来注定枯燥无味&#xf…

Jenkins流水线初体验(六)

DevOps之安装和配置 Jenkins (一) DevOps 之 CI/CD入门操作 (二) Sonar Qube介绍和安装(三) Harbor镜像仓库介绍&安装 (四) Jenkins容器使用宿主机Docker(五) Jenkins流水线初体验(六) 一、Jenkins流水线任务介绍 之前采用Jenkins的自由风格构建的项目,每个步骤…

Android后端签到flask迁移到rust的axum的过程-签到性能和便携

本次变更了以下内容: 为了使用之前ip2sta的ip到端点名的python,dic变量,将其存入redis hashset.使用地址/api/ip2dic 手动执行之.并且定义在/station/init,这个每天初始化redis的路径下.在rust axum使用redis 连接池在test中 ip2dic,IP转端点名,转本日此端网址.在前端的人名下…

Python OCR文字识别api接口

一.引言 文字识别&#xff0c;也称为光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;是一种将不同形式的文档&#xff08;如扫描的纸质文档、PDF文件或数字相机拍摄的图片&#xff09;中的文字转换成可编辑和可搜索的数据的技术。随着技…

.NET 6.0 中接入 Log4net 和 NLog

一、接入Log4net 1.按日期和大小混合分割日志 nuget包安装 log4net Microsoft.Extensions.Logging.Log4Net.AspNetCore 配置文件 配置文件内容为 <?xml version"1.0" encoding"utf-8"?> <log4net> <!-- Define some output appe…

编写php项目所需环境

需要编写php项目&#xff0c;需要看到编写的代码展现的效果&#xff0c;这里我选择用xampp来展现 准备工作&#xff1a; https://learncodingfast.com/how-to-install-xampp-and-brackets/#Installing_and_Running_XAMPP xampp下载地址&#xff1a;https://www.apachefriends.…

树莓派Pico火灾报警器项目:基于火焰传感器、蜂鸣器与LED的C++实现

火灾是我们生活中一个不可忽视的安全隐患,而火灾报警系统在预防火灾和保障人员安全方面起着至关重要的作用。通过嵌入式技术,我们可以实现一个简单而有效的火灾报警装置。在本项目中,我们将利用 树莓派Pico 控制 火焰传感器、LED 和 蜂鸣器,模拟火灾报警装置的工作原理。本…

数学建模问题中的多目标规划

多目标规划&#xff08;Multi-Objective Optimization, MOO&#xff09;是指在优化问题中同时优化多个相互冲突的目标函数的情况。与单目标优化问题不同&#xff0c;多目标优化的解通常不再是唯一的&#xff0c;而是一个解的集合&#xff0c;称为帕累托最优解集。这些解在所有目…

智汇云舟4个案例入选“中国联通智慧城市物联感知与AI应用案例”

12月10日&#xff0c;由中国联通智慧城市军团联合联通数字科技有限公司物联网事业部、物联中国团体组织联席会共同主办的“中国联通首届智慧城市领域物联感知与AI应用优秀案例发布交流大会”在郑州举行。大会现场对50余个优秀案例进行了集中发布与表彰。智汇云舟凭借深厚的技术…

【JavaEE】网络(1)

&#x1f435;本篇文章开始讲解计算机网络相关的知识 一、基础概念 1.1 局域网和广域网 局域网→Local Area Network→简称LAN&#xff0c;局域网是局部组建的一种私有网络&#xff0c;局域网内的主机之间可以进行网络通信&#xff0c;局域网和局域网之间在没有连接的情况不能…

Unity 模板测试透视效果(URP)

可以实现笼中窥梦和PicoVR中通过VST局部透视效果。 使用到的Shader: Shader "Unlit/StencilShader" {Properties{[IntRange]_Index("Stencil Index",Range(0,255))0}SubShader{Tags{"RenderType""Opaque""Queue""Geo…

川渝地区软件工程考研择校分析

通过最新数据分析,5所高校软件工程专业2025年考研难度从高到低预计为: 电子科技大学 >> 四川大学 > 重庆大学 ≈ 西南交通大学 > 西南大学 对于想考川渝地区985但核心目标为优先上岸的考生,建议重点考虑西南交通大学软件工程学硕。该校24届软件工程学硕实际录取1…

KeepAlive与RouterView缓存

参考 vue动态组件&#xff1c;Component&#xff1e;与&#xff1c;KeepAlive&#xff1e; KeepAlive官网介绍 缓存之keep-alive的理解和应用 Vue3Vite KeepAlive页面缓存问题 vue多级菜单(路由)导致缓存(keep-alive)失效 vue3 router-view keeperalive对于同一路径但路径…

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(五)

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(五) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《拉…