• Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift


    1. 摘要

    • 训练深层的神经网络非常困难,因为在训练的过程中,随着前面层数参数的改变,每层输入的分布也会随之改变。这需要我们设置较小的学习率并且谨慎地对参数进行初始化,因此训练过程比较缓慢。

    • 作者将这种现象称之为 internal covariate shift,通过对每层的输入进行归一化来解决这个问题。

    • 引入 BN 后,我们可以不用太在意参数的初始化,同时使用更大的学习率,而且也会有正则化的效果,在一些情况下可以不用再使用 Dropout。

    2. 介绍

    因为网络中每一层的输入都受到前面所有层参数的影响,因此参数的一个小的改变将会随着网络加深而被逐渐放大。在这样的情况下,每一层网络都需要一直去适应新的输入分布,训练过程也就变得很慢。

    考虑如下的网络计算

    (F_1)(F_2) 是任意的变换,(Theta_1)(Theta_2) 是需要学习的参数。学习 (Theta_2) 可以看作是输入 (x=F_1(u, Theta_1)) 被传入子网络

    因此,如果 (x) 的分布保持不变的话, (Theta_2) 就不用去重新适应来补偿 (x) 分布的变化。

    另一方面,如果我们采用 Sigmoid 激活函数的话,随着网络加深,我们很容易落入到饱和区域,容易产生梯度消失现象,减缓训练过程。但是,如果我们能够确保非线性输入的分布维持稳定的话,优化就不容易陷入到饱和区域,从而能够加速训练。

    3. 小批量归一化

    针对每一层的所有输入进行白化代价非常高并且不是处处可微,因此作者进行了两个必要的简化。

    第一,我们独立地归一化一层中的每一个特征,让它们具有零均值标准方差。针对一个 (d) 维的输入 (x=(x^{(1)}...x^{(d)})),我们将分别对每一维进行归一化。

    但是,这样简单地归一化每个输入会改变当前层网络的表达能力。比如,归一化 Sigmoid 函数的输入将会使它们落入激活函数的线性区域。为了解决这个问题,我们要保证嵌入到网络中的变换能够表示恒等变换。对此,我们引入一对参数 (gamma^{(k)}, eta^{(k)}) 来对归一化后的值再进行缩放和平移。

    这样,通过设定 (gamma^{(k)}=sqrt {Var[x^{(k)}]}, eta^{(k)}=E[x^{(k)}])如果原始激活值是最优的话,我们也能够恢复到原有状态

    第二,用小批量样本来产生对每个激活值均值和方差的估计。针对 (m) 个样本的小批量,归一化变换如下所示:

    在训练过程中,我们需要计算 BN 变换参数的梯度来进行反向传播,根据链式法则,有

    因此,BN 在网络中引入了对激活值的归一化,并且是一个可微的变换。这样,每一层都可以在同样的分布上持续学习而不用担心内部偏移问题,所以可以加速训练过程。最后,在归一化后学习到的仿射变换允许网络表示恒等变换,因此也保留了网络的容量也即表示能力。

    4. 测试

    虽然对小批量的激活值进行归一化在训练时是非常有效的,但在测试时却是不必要也不可取的,我们想让输出只确定地依赖于输入。因此,一旦训练好了一个网络,我们用训练时总体的均值和方差来进行归一化。

    忽略 (epsilon),这些归一化后的激活值就具有了和训练时一样的零均值和标准方差。我们采用无偏的方差估计

    期望是根据训练过程中所有大小为 (m) 的小批量样本计算的,(sigma_B^2) 代表它们的方差。同时,我们使用滑动平均来跟踪训练过程中每个小批量的均值和方差。

    5. 在全连接和卷积网络中引入 BN

    针对全连接网络,我们在非线性之前加入 BN 变换,对 (x=Wu+b) 进行归一化。注意到,偏置 (b) 可以被忽略,因为在后序的减去均值的过程中它的作用被抵消了。因此,就变成了

    [z=g(Wu+b) o z=g(BN(Wu)) ]

    对于 (x) 的每一个维度我们学习一对参数 (gamma^{(k)}, eta^{(k)})

    针对卷积网络,我们想要归一化保持卷积的特性,因此,不同样本的所有位置的同一个特征图用同样的方式进行归一化。对于一个大小为 (m) 的小批量样本和大小为 (p×q) 的特征图,有效的小批次为

    [m'=mcdot pq ]

    对于每一个特征图我们学习一对参数 (gamma^{(k)}, eta^{(k)})

    6. BN 允许更高的学习率

    在传统的网络中,太高的学习率可能会导致梯度消失或者爆炸,也会使网络陷入在糟糕的局部最优解。但引入 BN 后,它会阻止参数的小的变化被放大成激活值和梯度的更大变化或者次优变化,比如说不会让训练陷入到非线性的饱和区域。

    BN 也使得训练对参数的规模更适应。正常情况下,大的学习率会增大参数,然后放大反向传播的梯度导致模型爆炸。但是,引入 BN 后,反向传播不受参数的规模影响。实际上,对于标量 (a),有

    [x_i = Wu_i ]

    [mu = frac{1}{m}sum_{i=1}^{m}x_i ]

    [sigma^2 = frac{1}{m}sum_{i=1}^{m}(x_i-mu)^2 ]

    [hat x_i = frac{x_i-mu}{sqrt{sigma^2+epsilon}} ]

    [y_i =gamma hat x_i+eta=BN[Wu_i] ]

    所以,(BN[Wu] = BN[(aW)u])(hat x_i) 求取时分子分母都放大 (a) 倍。反向传播时,有

    [frac{partial BN[(aW)u]}{partial x} = frac{1}{a} cdot frac{partial BN[Wu]}{partial x} ]

    [ ag{1}frac{partial BN[(aW)u]}{partial u} = frac{partial BN[Wu]}{partial u} ]

    [ ag{2}frac{partial BN[(aW)u]}{partial (aW)} = frac{1}{a} cdot frac{partial BN[Wu]}{partial W} ]

    由式 (1) 可以看到,参数的规模不影响梯度的反向传播。而且,由式 (2) 知,较大的参数将会获得较小的梯度,BN 能够稳定参数的增长

    7. BN 的正则化效果

    当使用 BN 进行训练时,小批次中的一个样本会与其他样本结合在一起被传入网络中,网络不再会为某个给定的训练样例生成确定值。在实验中,作者发现这种效应有利于网络的泛化。引入 BN 后,Dropout 可以被移除或减少作用。

    8. 加速 BN 网络的训练

    仅仅在网络中添加 BN 不能充分利用这种方法的优越性,除此之外,作者采用了以下策略:

    • 增大学习率
    • 移除 Dropout
    • 减小 L2 正则化权重
    • 加快学习率衰减
    • 移除局部响应归一化
    • 更彻底地打乱训练数据,防止同样的数据总出现在同一个批次中
    • 减少光度畸变

    9. 实验结果

    可以看到,在 MNIST 数据集上,引入 BN 后网络网络收敛很快,并且输入的分布更加稳定。

    在 ImageNet 数据集上,引入 BN 后很快就达到了原来 Inception 网络取得的准确率。

    获取更多精彩,请关注「seniusen」!

  • 相关阅读:
    网络通讯协议的基本要素
    java实现二维码的生成与解析
    SpringCloud应用间通信-RestTemplate与Feign
    SpringCloud服务注册与发现-Eureka、Nacos和Consul
    极光推送-java消息推送app
    Git的回滚和撤销操作
    SOFABoot学习
    记录一次生产环境下EleasticSearch故障(cpu打满)
    记录SQL优化
    利用二进制存储多种状态
  • 原文地址:https://www.cnblogs.com/seniusen/p/10617612.html
Copyright © 2020-2023  润新知