BN层和Dropout层「建议收藏」

2022-11-09 14:30:11 浏览数 (2)

大家好,又见面了,我是你们的朋友全栈君。

文章目录
  • BN层
    • 原理和公式
    • 参数量
    • 做法
    • 优点和缺点
    • 训练和测试时的区别
  • Dropout
    • 原理
    • 训练和测试时的区别

BN层

原理和公式

BN层解决内部协变量偏移ICS问题,通过减少内部协变量偏移加快神经网络训练。

z ^ l = γ ∗ z l − μ δ 2 σ β hat{z}^{l} = gamma * frac{z^l-mu}{sqrt{delta^2 sigma}} beta z^l=γ∗δ2 σ ​zl−μ​ β

参数量

神经元个数 x 4 (或者 通道数 x 4)

做法

将网络层的输出分布强制转为均值为0,方差为1的分布之后,为了部分还原,又乘以伽马(γ,scale),加上贝塔(β,shift)。

  1. BN为什么要有伽马和贝塔:为了在强制转换之后做一定还原,保持模型原有的表达能力(capacity)
  2. 这样变过来又变回去是不是跟没变一样? 不会跟没变一样, 因为,再变换引入了两个新参数 γ gamma γ 和 β beta β。在旧参数中, x 的均值取决于下层神经网络的复杂关联;但在新参数中,均值仅仅由 β beta β 来确定,去除了与下层计算的密切耦合。新参数可以通过梯度下降来学习,简化了神经网络的训练。
  3. BN如果去掉伽马和贝塔:可能会导致特征分布差异性降低,损坏特征表达,导致模型拟合能力降低,精度下降。但是模型应该也可以收敛。

用法和步骤:

  • BN层一般放在卷积层后,用于重新调整数据分布 (确保网络中的各层即使参数变化,输入/输出的分布也不会发生较大变化)
  • 求batch均值、batch方差
  • 对每个元素进行归一化
  • 尺度缩放和偏移 (变换回数据原始分布,减少),γ代表方差,β代表偏移

优点和缺点

优点

  • 在模型训练过程中,批量归一化利用小批量的均值和标准差,不断调整神经网络的中间输出,使整个神经网络各层的中间输出值更加稳定。
  • 减轻对初始值的依赖
  • 训练更快,可以用更大的学习率
  • 批量归一化有许多有益的副作用,主要是正则化。

缺点

  • batch太小时,计算的均值方差不稳定,例如在线的单例学习
  • 放在激活层之前或者之后

训练和测试时的区别

  1. 训练时,是对每一批的训练数据进行归一化,也即用每一批数据的均值和标准差。 默认track=True,会通过移动平均,记录训练数据的均值和标准差
  2. 测试时,模型训练完成,它的所有参数都确定了,包括均值和标准差, γ gamma γ和 β beta β 。如果训练时设置了track=True,保存了移动平均,则直接使用训练时得到的均值和标准差做测试。如果没有,则使用测试时计算的均值、标准差

Dropout

原理

在训练时以一定的概率使神经元失活,实际上就是让对应神经元的输出为0

训练和测试时的区别

  1. 训练和测试时为什么有差异?
  • 训练时神经元有开有关,测试时全开
  1. 如何处理训练和测试时候的不一致性?Dropout 如何平衡训练和测试时的差异?
  • 假设失活概率为 p ,就是这一层中的每个神经元都有p的概率失活,这样在训练和测试时,输出层每个神经元的输入和的期望会有量级上的差异。
  • 因此在训练时还要对bn的输出数据除以(1-p)之后再传给下一层神经元,作为神经元失活的补偿,以使得在训练时和测试时每一层输入有大致相同的期望。
  • 假设BN层输入的期望为a,在不使用dropout的时候,它的期望依旧是a。如果该层进行了dropout, 相当于有p的概率被丢弃,(1-p)的概率被保留,则此层的期望为(1-p)a1 pa0=(1-p)a, 为了保证输入与输出的期望一致,需要在训练的时候,对bn层的输出做:y = y / (1-p) 的处理。

多种类型的dropout: https://mp.weixin.qq.com/s/fTkMNaABWF3h0rpuam1XGw https://blog.csdn.net/songyunli1111/article/details/89071021 https://zhuanlan.zhihu.com/p/61725100

其他:

  • BN层的输出维度:上一层输出是NCHW,BN层的参数维度为

以下内容来自沐神第二版新书: 小结¶

  • 批量归一化在全连接层和卷积层的使用略有不同。
  • 另一方面,”减少内部协变量偏移“的原始动机似乎不是一个有效的解释。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/189530.html原文链接:https://javaforall.cn

0 人点赞