• SGD训练时收敛速度的变化研究。


    一个典型的SGD过程中,一个epoch内的一批样本的平均梯度与梯度方差,在下图中得到了展示。

    无论什么样的网络结构,无论是哪一层网络的梯度,大体上都遵循下面这样的规律:

    高信号/噪音比一段时间之后,信号/噪音比逐渐降低,收敛速度减缓,梯度的方差增大,梯度均值减小。

    噪音增加的作用及其必要性会在另一篇文章中阐述,这里仅讨论噪音的产生对于模型收敛速度能够产生怎样的影响。

    首先定义模型收敛速度:训练后期,噪音梯度导致权重更新时,导致系统新增的熵 H(混乱度)对于SGD迭代次数 t 的导数。

    对于第k层的权重的梯度,每一轮(时间t)更新:

    [frac{partial {{mathbf{W}}^{left( k ight)}}}{partial t}=- abla operatorname{E}({{mathbf{W}}^{left( k ight)}})+eta _{left( k ight)}^{-1}xi left( t ight)]

    其中E是全局损失函数, $eta $是信号/噪音比,$xi $是高斯白噪音, $Pleft( xi left( t ight) ight)=Normleft( 0,sigma left( t ight) ight)$ ,方差$sigma left( t ight)$随着时间增加而变大。

    因为使用高噪音进行梯度下降更新权重W时引进了额外的熵,考虑熵的变化$Delta H({{mathbf{W}}^{(k)}})$ 

    假设将损失函数E分割成非常多个小区间,问题转化为:$Delta H({{mathbf{W}}^{(k)}}) ext{=}Delta H({{ ext{E}}_{1}}({{mathbf{W}}^{(k)}}),{{ ext{E}}_{2}}({{mathbf{W}}^{(k)}})......{{ ext{E}}_{N}}({{mathbf{W}}^{(k)}}))$ 

    已知$operatorname{H}left( E ight)=-underset{ ext{i}}{mathop{sum }}\,pleft( {{ ext{E}}_{ ext{i}}} ight)log pleft( {{ ext{E}}_{ ext{i}}} ight)$

    [frac{partial operatorname{H}}{partial p}=-left( sumlimits_{ ext{i}}{log left( pleft( {{E}_{i}} ight) ight)+1} ight)]

    又已知系统达到热平衡后,使熵最大的p(W)分布是玻尔兹曼分布(参见Boltzmann与最大熵的关联文章

    ${{p}_{E={{E}_{i}}}}left( mathbf{W} ight)=frac{1}{ ext{Z}}{{ ext{e}}^{-eta {{E}_{i}}left( mathbf{W} ight)}}$ ,Z是配分函数partition function $Z=sumlimits_{E'}{{{e}^{-eta E'(mathbf{W})}}}$

    考虑热平衡附近时,p怎样随着E改变:

    [frac{partial p}{partial E}=frac{partial }{partial {{E}_{ ext{i}}}}left( {{{e}^{-eta {{E}_{i}}}}}/{left( {{e}^{-eta {{E}_{i}}}}+sum olimits_{k e i}{{{e}^{-eta {{E}_{k}}}}} ight)}; ight)=-eta p(1-p)]

    使用链式法则得到:

    $frac{partial ext{H}}{partial t}=sumlimits_{i}{frac{partial ext{H}}{partial {{p}_{i}}}frac{partial {{p}_{i}}}{partial {{ ext{E}}_{i}}}frac{partial {{ ext{E}}_{i}}}{partial mathbf{W}}frac{partial mathbf{W}}{partial t}}$ 

    训练到接近收敛时,尽管每次更新权重时计算的loss的白噪音会越来越大,但全局loss E会稳定得多,并且逐渐下降到一个比较小的区间内,所以只考虑该区间内对应的$Delta ext{H}$以及$Delta ext{t}$,带入前面求出的偏导得到:

    [frac{partial H}{partial t}=sumlimits_{ ext{i}}{left( log left( {{p}_{ ext{i}}} ight)+1 ight)eta {{p}_{i}}(1-{{p}_{i}}) abla {{E}_{i}}(mathbf{W})(- abla {{E}_{i}}(mathbf{W})+eta _{(k)}^{-1}xi (t))}]

     噪音项在求期望时被平均成0,同时使用泰勒级数在p=1附近展开ln(p) :$ln (p)=(p-1)-frac{1}{2}{{(p-1)}^{2}}+frac{1}{3}{{(p-1)}^{3}}-......$ 

    可推出

    $(log (p)+1)(1-p)=-plog p+1-p+log papprox -plog p+1-p+(p-1)-frac{1}{2}{{(p-1)}^{2}}=-plog p-frac{1}{2}{{(p-1)}^{2}}$ 

    当p_i接近1时,忽略二次项,得到熵H,既 -plogp

    继续带入可得(注意beta后面是预期值符号,不是损失函数E)

    [frac{partial H}{partial t}approx eta sumlimits_{ ext{i}}{-{{p}_{i}}{{left( abla {{E}_{i}}(mathbf{W}) ight)}^{2}}}H=-eta operatorname{E}left[ {{left( abla E(mathbf{W}) ight)}^{2}} ight]H]

     这里看出当训练时在全局loss逐渐收敛到一个小区间E_i内,p_i趋近于1,这时候熵的该变量与训练迭代次数满足上述微分方程。

    解微分方程得到:

    $H=H_{0}expleft(-etamathbb{E}left[( abla E(W))^{2} ight])t ight)$

    该方程只在全局loss相对稳定之后成立,此时SGD噪音带来的熵随训练时间的增加而指数减少。

    半衰期之前一直被当做常量来看待,但其实半衰期随着全局梯度平方的预期值的减小,会逐渐增大。

    也就是说要从噪音里引入固定量的熵,所消耗的时间(迭代轮数)会越来越多,甚至比普通的指数衰减花费更多的时间。

    第k层权重更新噪音引入的熵 会以 给定下一层特征层时输入数据X的熵 的形式展现。

    [Delta H(delta {{mathbf{W}}^{(k)}})=Delta H(X|{{T}^{(k+1)}})]

     噪音引入的熵的作用,会在下面几篇介绍信息瓶颈理论的文章里详细阐述。

  • 相关阅读:
    【Python爬虫学习笔记10】多线程中的生产者消费者模式
    【Python爬虫学习笔记9】threading多线程
    【Python爬虫学习笔记8-2】MongoDB数据库操作详解
    【Python爬虫学习笔记8-1】MySQL数据库和MongoDB数据库存储概述
    【Python爬虫学习笔记7】CSV文件存储
    好书一起读(85):算法笔记
    好书一起读(82):电脑的原理
    写个shell脚本
    Scala基础语法
    初识函数式编程的一点漫谈
  • 原文地址:https://www.cnblogs.com/ws12345/p/7863520.html
Copyright © 2020-2023  润新知