zoukankan      html  css  js  c++  java
  • normalization

    Covariate shift:
    在learning algorithm学习的过程当中, input values的改变的现象.
    这种问题也存在与train和test数据不同源的问题.
    由于当input distribution改变的时候, machine learning algorithm的表现会改变,这就是这个问题影响性能原因.

    Basic reason: 当变量中间高阶相关的时候, 合适的学习率变化很大.(the appropriate learning rate changes wildly when there are high-order interactions between variables)

    从convex optimization解释:
    loss function: f(w), 进行二阶泰勒展开, g表示梯度, H表示Hessian矩阵关于(f(w))的

    利用梯度下降, 朝着梯度的方向走, 学习率是, 更新weight之后的loss function为

    如果上述的公式当中, 没有后面的二阶项的时候, 得到的loss function是严格下降的. 但是, 如果后面的二阶项的值很大的时候, 最后得到的loss function可能会增大, 也就是说在二阶影响超过一阶影响的时候, 会起到反的效果.

    当loss曲面很陡的时候, 如果说学习率很大, 那么,可能会让loss增加.但是如果loss曲面光滑, 就可以利用相对而言比较大的学习率
    “ill-conditioning” Hessian Matrix:
    当梯度是H的最大特征值的特征向量的时候, H=P^(inverP). 这个时候Hg = lambda*g, 因为Hessian矩阵需要是非奇异的对称阵.在这里, 如果学习率足够大的化,loss就可能是朝着正向方向发展的.

    所以按照上面的情况分析, 只有小的学习率尺度才能保证loss稳步下降.

    这里只是引入了二阶分析, 当更高阶的影响引入的时候, 梯度的更新会带来更加无法预期的变化.

    从这个角度理解Batch Normalization:
    BN让每一层的输入和他们本身的值无关, 这就抑制了高阶项的影响.
    原博文作者在这里的解释:
    可能是由于NN当中的激活函数, 以及激活函数的量级(magnitudes)(magnitudes of activations decided by the mean and variance).因为这个range of magnitudes, 让梯度的更新的表现比较好.(我也觉着这里很懵逼, 这个解释让我很方).

    BN最大的优点是让mean和variance不是让多层的交互决定的, 而是由gamma和beta这两个参数决定的. 这也是BN最大的特性以及提升性能的主要原因.

    BN的局限性: 对mini-batch的依赖性.
    这个依赖性会导致两个主要问题:(这里的mean和variance在不同的mini-batch之间会变化)
    a. mini-batch的size越小, 会增大方差的估计, 在BN当中用SGD的时候, 需要小心的选择batch_size
    b. 这导致了, 这个在RNN当中很难将这个应用到recurrent connections当中.
    在RNN当中, 每个时间步有不同的统计值. 也就是说, 必须在不同的时间步分开计算BN. 而且根据BPTT的更新, 我们必须在每个时间步都记录这些统计量.

    这里, mini-batch的值不能太小, 导致了在online learning(每次处理一个样本)以及对噪声极度敏感的reinfocement learning不大使用, 也让它在RNN当中不使用.

    WEIGHT NORMALIZATION:(openai)
    对每一层的权重进行normalization:

    weight normalizaton: separates the norm of the weight vector from its direction, 这里是对weight的各个不同的方向分别进行归一化.
    这里利用梯度下降对g和v同时进行优化.

    优点:
    weight normalization比BN的速度快.
    在CNN当中, CNN的权重数量远小于输入数量, 所以weight normalization的计算损耗比较小.

    在论文当中(自己没有看论文):
    作者在WN之后加了mean-only BN(虽然比单纯的WN损耗大, 但是不用除以std, 所以计算损耗要小一点)

    作者说他这样做的优点有:

    1. 让activations的mean和v无关:
      单独的(independently) WN不能够让每一层层从weights中计算得到的activations的均值互相隔离, 会导致不同层间的high-level的相关性, Mean-only batch normalization可以解决这个问题.

    2. 在activations加入”gentle noise”:
      BN的一个不好的地方是, 由于在mini-batch计算利用了noisy estimates, 所以在activations引入了随机噪声.
      这个在一些应用当中有regularization effect, 但是在某一些noise-sensitive domain会有潜在的坏处, 类似于reinforcement learning.这个噪声由于均值估计产生.由于大数定理,activations祭祀与normally distributed, 所以可以说是gentler noise.

    (感觉还是对weight normalization略懵逼,)

    Layer Normalization:(Geoffery Hinton)
    BN是在batch dimension的维度上面normalize the input features;
    LN 是在features’ dimensions上面normalize输入.
    Xij 是输入的第i,j-th元素, 第一个维度表示batch, 第二个维度表示features.
    BN:

    LN:

    区别:
    layer normalization的统计计算在不同的样本之间不相关. 所以LN不是简单的重新参数化网络(reparameterization of the network).
    LN一般用于RNN.

    参考文献:  
    图见这里吧, 以后补.天知道为啥我加了weight normalization我的网络为什么那么渣
    http://mlexplained.com/2018/01/10/an-intuitive-explanation-of-why-batch-normalization-really-works-normalization-in-deep-learning-part-1/
    http://mlexplained.com/2018/01/13/weight-normalization-and-layer-normalization-explained-normalization-in-deep-learning-part-2/
    
  • 相关阅读:
    grails How to check if element in groovy array/hash/collection/list? Stack Overflow
    慧忠里自提点
    GroovyQ | 关注Groovy社区动态,分享Groovy开发经验。
    strupr strlwr
    Faqseafilevssvn seafile
    C++ STL下载和安装
    Emacs中学习gdb调试
    Readlineselect
    Diskfileio GongGeng
    Achieving Groovylike Fluency in Java with Google Collections | The Kaptain on ... stuff
  • 原文地址:https://www.cnblogs.com/luxuriance-lily/p/10135305.html
Copyright © 2011-2022 走看看