必须知道的神经网络的一些重要部分

在这里插入图片描述

必须知道的神经网络的一些重要部分

初始化方法:

初始化的原则:

  • 模型的收敛速度和效果和初始化的相关性是不可忽视的。如果有了一个好的初始化的值,模型的收敛很可能会更快,效果会更好。如果初始化参数不好的话,就可能会上梁不正下梁歪,轻则模型收敛速度慢,重则模型退化,效果堪忧。比如,当你把所有卷积和权重的初始化都变成0的时候,通过loss反向传播的时候你会发现,对称位置的参数更新值相同,甚至所有的参数更新出来的值都是一样的。这就使得模型严重退化,效果如何不言自明。

  • 例如以下神经元:

-

  • 对于这个神经元来说,如果初始化所有的w和b都是0,bp的时候参数更新公式是:

    w 11 = w 11 − α ∂ L ∂ w 11 w 21 = w 11 − α ∂ L ∂ w 21 b = b − ∂ L ∂ b \begin{aligned} w_{11} &=w_{11}-\alpha \frac{\partial L}{\partial w_{11}} \\ w_{21} &=w_{11}-\alpha \frac{\partial L}{\partial w_{21}} \\ b &=b-\frac{\partial L}{\partial b} \end{aligned} w11w21b=w11αw11L=w11αw21L=bbL

    此时很显然 w 11 w_{11} w11 w 21 w_{21} w21更新之后的值是一样的,之后的梯度下降更新的值也是一样的。这样就相当于一个神经元在作用而已,模型就退化了。

  • 在看到了这些初始化的失败例子,研究人员归纳出了几个初始化的原则:

    1. 初始化的时候参数不能是对称的,或者说,对称位置上的参数进行BP得到的梯度不能是对称的
    2. 初始化的参数,不能全是0,而且不能够太大。(比如参数太大,sigmoid之后会梯度消失)
    3. 不能太小。【relu,sigmoid( 导数是σ(1-σ))也会梯度消失】
  • 为了遵从以上原则,使得模型较快收敛,防止炸毛,以下大神提出了他们的初始化方法:

Xavier初始化方法:

  • Xavier初始化方法的主要原则是希望方差保持相近(Glorot法则),使得数据分布差不多。

  • 初始化推导如下,觉得用手推比较亲切一些:

在这里插入图片描述

  • 综上:如果输入满足高斯分布: w i w_{i} wi满足Gassian: w i ∼ N ( 0 , 2 n i + n i + 1 ) w_{i} \sim N\left(0, \sqrt{\frac{2}{n_{i}+n_{i+1}}}\right) wiN(0,ni+ni+12 )
  • 如果输入满足均匀分布, w i w_{i} wi满足 w i ∼ U n i f o r m ( − 6 n 1 + n i + 1 , 6 n 1 + n i + 1 ) w_{i} \sim Uniform\left(-\sqrt{\frac{6}{n_{1}+n_{i+1}}} , \sqrt{\frac{6}{n_{1}+n_{i}+1}}\right) wiUniform(n1+ni+16 ,n1+ni+16 ).

Kaiming 初始化方法:

  • 当面对的激活函数是relu的时候,以上的初始化方法就hold不住了,这时候凯明大神又来救场了。提出了凯明初始化方法,它的推导如下:
    -

  • 综上:如果输入满足高斯分布: w i w_{i} wi满足Gassian: w i ∼ N ( 0 , 2 n i ) w_{i} \sim N\left(0, \sqrt{\frac{2}{n_{i}}}\right) wiN(0,ni2 )

  • 如果输入满足均匀分布, w i w_{i} wi满足 w i ∼ U n i f o r m ( − 6 n 1 , 6 n 1 ) w_{i} \sim Uniform\left(-\sqrt{\frac{6}{n_{1}}} , \sqrt{\frac{6}{n_{1}}}\right) wiUniform(n16 ,n16 ).

优化器

  • 一般来说,神经网络是通过梯度下降进行优化的,最初的学习率优化是对于全部的样本来说的,就是把所有的loss加起来,之后一个一个更新θ的值。然而,当训练样本很大的时候,计算速度太慢,所以,这种暴力方法就被慢慢淘汰了。
  • 为了减少每次的计算量,不用计算所有样本的梯度。在计算过程中,我们把一个mini_batch送入网络,通过这个mini_batch的结果对参数进行更新。现在,SGD已经不再是mini_batch是1的优化器了,也不会有人真的用这种优化器,一般来说,SGD的意思就是小批量优化器。
  • 然而为了让函数尽快收敛,人们根据机械能守恒的定理,例如,在比较陡峭的地方让函数下降得快一些,动能大一些。在比较平坦的地方下降得慢一些,动能小一些。每一阶段的下降速率和之前的梯度相关,这样能够加速模型的收敛。就像滑雪一样,在陡峭的地方速度快,能够更快滑到山底,平坦的地方速度比较慢一样。这时候出现了SGDM,通过动量的SGD方法。

SGDM:

  • 通过动量的方法,使得模型能够比较不容易陷入局部极小值,因为它的梯度是和之前的时刻的梯度是相关的。所以它有能力冲出局部极小值。
    -

  • SGDM的优化公式如下: m t = γ m t − 1 + η ∇ θ J ( θ ) θ = θ − m t \begin{aligned} m_{t} &=\gamma m_{t-1}+\eta \nabla_{\theta} J(\theta) \\ \theta &=\theta-m_{t} \end{aligned} mtθ=γmt1+ηθJ(θ)=θmt

  • 动量项γ一般取值为0.9或者类似的值。

NAG(Yurri Nesterov):

  • 这个算法是从SGDM改进而来的。SGDM是让梯度下降的速率和未来的梯度挂钩。比如说滑雪的时候,如果接下来是陡坡,我就可以冲快一些,这样可以更快到底。但是如果按照之前经过的路来判断下滑速度,那么可能会判定错误,之前是陡坡不代表接下来也是陡坡。
  • 公式如下: m t = γ m t − 1 + η ∇ θ J ( θ − γ v t − 1 ) θ = θ − m t \begin{aligned} m_{t} &=\gamma m_{t-1}+\eta \nabla_{\theta} J\left(\theta-\gamma v_{t-1}\right) \\ \theta &=\theta-m_{t} \end{aligned} mtθ=γmt1+ηθJ(θγvt1)=θmt 改变的地方是在 ∇ θ J ( θ − γ v t − 1 ) \nabla_{\theta} J\left(\theta-\gamma v_{t-1}\right) θJ(θγvt1) 这就是未来梯度的体现

Adagrad:

  • 圈乘:就是对应位置相乘的意思。其实就是把历史的梯度的平方和(记录这个中间态的值,前面所有的平方和加起来)用来更新,之后在梯度下降的时候再除掉。

  • Adagrad是这样一种基于梯度的优化算法:它让学习率适应参数,对于出现次数较少的特征,我们对其采用更大的学习率,对于出现次数较多的特征,我们对其采用较小的学习率。因此,Adagrad非常适合处理稀疏数据

  • 具体公式如下: η {\eta} η是学习率

  • g = ∇ θ J ( θ ) g=\nabla_{\theta} J(\theta) g=θJ(θ)(梯度计算) -> G = G + g ⊙ g G=G+g \odot g G=G+gg (累计平方梯度) -> Δ θ = η G + ϵ ⊙ g \Delta \theta=\frac{\eta}{\sqrt{G+\epsilon}} \odot g Δθ=G+ϵ ηg (计算参量的更新) -> θ = θ − Δ θ \theta=\theta-\Delta \theta θ=θΔθ

    或者: g t = ∇ θ J ( θ t ) g_{t}=\nabla_{\theta} J(\theta_{t}) gt=θJ(θt)
    Δ x t = η ∑ i = 1 t g i 2 ∗ g t \Delta x_{t}=\frac{\eta}{\sqrt{\sum_{i=1}^{t} g_{i}^{2}}} * g_{t} Δxt=i=1tgi2 ηgt
    θ t = θ t − 1 − Δ θ t θ_{t}=θ_{t-1}-\Delta θ_{t} θt=θt1Δθt

RMSProp (Hinton) :

  • g = ∇ θ J ( θ ) g=\nabla_{\theta} J(\theta) g=θJ(θ)(梯度计算) -> G = γ G + ( 1 − γ ) g ⊙ g G=\gamma G+(1-\gamma) g \odot g G=γG+(1γ)gg (累计平方梯度) -> Δ θ = η G + ϵ ⊙ g \Delta \theta=\frac{\eta}{\sqrt{G+\epsilon}} \odot g Δθ=G+ϵ ηg (计算参量的更新) -> θ = θ − Δ θ \theta=\theta-\Delta \theta θ=θΔθ

  • 增加了一个γ系数,使得梯度的G和最近的梯度有关。就不需要把全局的梯度计算在内了

Adam(Adaptive Moment Estimation,Adam):

  • 胜利就在眼前了,坚持下去。因为你面对的是大智若愚的Adam
  • 是另一种自适应学习率的算法,Adam对每一个参数都计算自适应的学习率。除了像Adadelta和RMSprop一样存储一个指数衰减的历史平方梯度的平均,Adam同时还保存一个历史梯度的指数衰减均值,类似于动量。相当于SGDM和RMSProp的结合体具体公式如下:
  • g t = ∇ θ J ( θ t ) g_{t}=\nabla_{\theta} J(\theta_{t}) gt=θJ(θt)
  • 计算一阶梯度和和二阶梯度和 m t = β 1 m t − 1 + ( 1 − β 1 ) g t v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 \begin{aligned} m_{t} &=\beta_{1} m_{t-1}+\left(1-\beta_{1}\right) g_{t} \\ v_{t} &=\beta_{2} v_{t-1}+\left(1-\beta_{2}\right) g_{t}^{2} \end{aligned} mtvt=β1mt1+(1β1)gt=β2vt1+(1β2)gt2 使得梯度和当前时刻关系较大
  • m t m_{t} mt v t v_{t} vt 分别是对梯度的一阶矩 ( \left(\right. ( 均值) 和二阶矩 (非确定的方差) 的估计, 正如该算法的名称。当 m t m_{t} mt v t v_{t} vt 初始化为0向量时, Adam的作者发现它们都偏向于0, 尤其是 在初始化的步骤和当衰减率很小的时候 (例如 β 1 \beta_{1} β1 β 2 \beta_{2} β2趋向于1)。
  • 通过计算偏差校正的一阶矩和二阶矩估计来抵消偏差.(一阶矩,二阶矩估计忘记了555555)
  • m ^ t = m t 1 − β 1 t v ^ t = v t 1 − β 2 t \begin{aligned} \hat{m}_{t} &=\frac{m_{t}}{1-\beta_{1}^{t}} \\ \hat{v}_{t} &=\frac{v_{t}}{1-\beta_{2}^{t}} \end{aligned} m^tv^t=1β1tmt=1β2tvt
  • θ t + 1 = θ t − η v ^ t + ϵ m ^ t \theta_{t+1}=\theta_{t}-\frac{\eta}{\sqrt{\hat{v}_{t}+\epsilon}} \hat{m}_{t} θt+1=θtv^t+ϵ ηm^t
  • β一般都是不变的。t(更新次数)是为了控制一开始的节奏的。
  • adam:不依赖学习率,但是不能保证优化的效率是最好的,它基本不需要调参。
为什么要进行偏差消除呢:
  • v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 v_{t}=\beta_{2} v_{t-1}+\left(1-\beta_{2}\right) g_{t}^{2} vt=β2vt1+(1β2)gt2 往回推导,可以得到:
  • v t = ( 1 − β 2 ) ∑ i = 1 t β 2 t − i ⋅ g i 2 v_{t}=\left(1-\beta_{2}\right) \sum_{i=1}^{t} \beta_{2}^{t-i} \cdot g_{i}^{2} vt=(1β2)i=1tβ2tigi2
  • 对上面等是两侧取均值: E [ v t ] = E [ ( 1 − β 2 ) ∑ i = 1 t β 2 t − i ⋅ g i 2 ] = E [ g t 2 ] ⋅ ( 1 − β 2 ) ∑ i = 1 t β 2 t − i + ζ = E [ g t 2 ] ⋅ ( 1 − β 2 t ) + ζ \begin{aligned} \mathbb{E}\left[v_{t}\right] &=\mathbb{E}\left[\left(1-\beta_{2}\right) \sum_{i=1}^{t} \beta_{2}^{t-i} \cdot g_{i}^{2}\right] \\ &=\mathbb{E}\left[g_{t}^{2}\right] \cdot\left(1-\beta_{2}\right) \sum_{i=1}^{t} \beta_{2}^{t-i}+\zeta \\ &=\mathbb{E}\left[g_{t}^{2}\right] \cdot\left(1-\beta_{2}^{t}\right)+\zeta \end{aligned} E[vt]=E[(1β2)i=1tβ2tigi2]=E[gt2](1β2)i=1tβ2ti+ζ=E[gt2](1β2t)+ζ
  • 论文中说,因为 g t g_{t} gt 和最近的t时间有关,均值可以直接用 E [ g t 2 ] \mathbb{E}\left[g_{t}^{2}\right] E[gt2] 加上一个偏置项替代。计算的时候就用一个等比数列相加就可以了。很快就能推导出来。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值