zoukankan      html  css  js  c++  java
  • Batch Normalization 与 Layer Normalization

    Feature Scaling

    假设我们现在训练的模型有很多特征,我们现在训练的网络长下面这个样子:

    [z = activate(x_1 W_1 + x_2 W_2 + bias) ]

    其中(x_1,x_2)的数据级别差的比较多,比如一个在100左右,一个在0到1之间,那么两个权重矩阵对最后结果的影响是不同的,在train的过程中你从不同方向看它的梯度是不一样的。为了达到比较好的训练效果,我们有如下两个方法。

    Down learning rate

    这是一个十分常用的方法,通过降低学习率达到矩阵参数学习较好的效果。

    Normalization

    将不同数据归一化处理,改变数据的分布特性,能够有效地提升训练效果。

    常用的归一化方法有Batch Normalization(BN)Layer Normalization(LN)

    Batch Normalization

    Batch Normalization tutorial on YouTube

    Batch Normalization是一种常见的达到Feature Scaling的手段。

    Feature Scaling

    现在我们要对数据特征做归一化处理。假设Batch size为(N),我们对每一个feature,都去从data batch中计算这一个dimension的均值(mu)和标准差(sigma),注意这两个量也是vector,然后做element wise的运算。

    [ ilde z = frac{z - mu}{sigma} ]

    In general, gradient descent converges much faster with feature scaling than without it.

    In DNN

    在DNN中,我们input可以做feature scaling,output对于下一层而言也是input,所以输出也可以归一化,下面以先经过BN再经过Activation function为例。

    train set时,我们一般不会只用一组数据去训练,而是选择一个batch。batch size为(N)的训练,我们可以这样计算均值和标准差:

    [mu_i = frac{1}{N} sum_j x_{ij}\ sigma_i = sqrt{frac{1}{N} sum_j (x_{ij} - mu_i)^2} ]

    Internal Convariate Shift

    所谓Internal Convariate Shift是值在训练的时候,我们不断调整整个网络的参数,但是我们调好后面的网络后,前面的网络参数仍然在变化,这导致我们训练的效率就会很低。共享参数的网络模型也面临这样的问题,比如RNN网络。

    为解决这个问题,可以降低学习率。通过降低学习率,让后面的网络不会太早的就达到适应前面不准确的网络的参数。然而我们都知道,降低学习率一般意味着时间会长一些。

    另一个解决办法就是Normalization,归一化后,数据的统计特性就会比较确定,前面的参数变化影响相对较小,所以解决Internal Convariate Shift也是我们BN的一个优点。

    局限

    需要注意,BN有一个要求,(N)必须足够大才能表示整个数据集的统计特性。因为要避免上面的 Internal Convariate Shift 问题,如果输入有噪音或者较多离群点,那么我们得到的统计结果是有偏差的,这一次train也是有问题的。

    以及在 Back Propagation 时,均值和标准差是依赖于layer的输出(z)的,不能直接将其作为Constant计算梯度。

    Testing

    用有BN的NN去测试时,我们发现一个问题,就是没有batch了。通常解决方法有下面两个:

    • train结束后矩阵参数已经确定了,可以从训练数据中再跑出适应这个model的均值和方差来使用。
    • 在训练过程中记录一下两个参数,然后给epoch大的参数赋予更大的权值,得到整个过程的加权结果来使用。

    Batch Normalization 的优点

    larger learning rate

    前面已经提到了它允许我们使用较大的learning rate来快速达到想要的结果。

    alleviate vanishing gradient

    这是我们在Activation function前面进行Normalization的优势之一。它可以让我们的数据分布尽量在梯度较大的区间。比如后面有sigmoid,那么我们会比较希望数据均值在0附近。

    如果你希望得到其他的不同分布,来适应一些均值不在0是梯度更大的Activation Function,可以采用下面这种做法:

    [hat z = hat sigma ilde z + hat mu ]

    不容易受初始化影响

    我们可以容易地从数学上证明(W)参数初始化不稳定的影响会被BN消除。

    [frac{k W x}{k sigma} = frac{W x}{sigma} ]

    Layer Normalization

    Why Layer Normalization

    在上文中,我们对 Batch Normalization 提出了一个要求就是 batch 要求足够大,但是在一些情况下这个条件很难满足,比如GPU显存无法容纳这么多的data,或者由于RNN这种动态模型Sequence可能长短不一导致最长的那组最后batch过小。

    在这种前提下,我们就提出了layer normalization。

    做法

    相比于BN,Layer Normalization(LN)的计算均值和方差的维度是垂直的,LN不考虑batch,而是考虑data中不同的dimension做归一化,下面是一个RNN的LN例子。

    (H)是隐藏层维数。

    [mu = frac{1}{H} sum_j x_j\ sigma = sqrt{frac{1}{H} sum_j(x_j - mu)^2} ]

    Normalization:

    [ ilde z = frac{z - mu}{sigma} ]

    一个人没有梦想,和咸鱼有什么区别!
  • 相关阅读:
    1026: [SCOI2009]windy数 (数位DP)
    Codeforces Round #603 (Div. 2)
    小明种苹果(续)
    1001: [BeiJing2006]狼抓兔子 (最小割)
    codeforces 990C Bracket Sequences Concatenation Problem
    codeforces990D
    codeforces 1037D. Valid BFS?
    pytorch inception v3 KeyError: <class 'tuple'>解决方法
    codeforces 1025C Plasticine zebra
    codeforces1027D
  • 原文地址:https://www.cnblogs.com/TABball/p/12727240.html
Copyright © 2011-2022 走看看