BN层和Dropout层「建议收藏」

BN层和Dropout层「建议收藏」原理batch的训练方法:按照batch来更新梯度,减少了梯度下降时的随机性;与遍历整个数据集相比,减少计算量。步骤:求batch均值、batch方差对每个元素进行归一化尺度缩放和偏移(变换回数据原始分布,减少)思想参数用法BN层放在卷积层后,用于重新调整数据分布…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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.net/189530.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • git命令–切换分支[通俗易懂]

    git命令–切换分支[通俗易懂]>我们在日常开发中,有时需要从github或者gitee上拉取新项目,但是拉取的那个项目可能有很多分支,然后本地拉取后只有一个默认分支(一般是master)。甚至可能只有一个readme.md文件。。 >如果我们想查看远程的其他分支该怎么办呢? **gitbranch**>首先进入项目根目录(有个.git文件的那个目录),执行`gitbranch`命…

    2022年6月20日
    34
  • pip 更新命令

    pip 更新命令 pip查询版本:pipshowpip 或pip-Vanaconda更新命令:condainstallmingwlibpythonNomodulenamedpip问题:运行 python-mensurepipNomodulenamed’pip._internal’问题:windows下curlhttps://bootstr…

    2022年6月11日
    41
  • pagehelper Jar包下载

    pagehelper Jar包下载https://repo1.maven.org/maven2/com/github/pagehelper/pagehelper/5.1.8/pagehelper-5.1.8-javadoc.jarJar包

    2022年5月15日
    90
  • javaweb之每次访问的时候都在浏览器上返回上次访问的时间,原码

    javaweb之每次访问的时候都在浏览器上返回上次访问的时间,原码需求:第一次访问的时候返回一个welcome,第二次访问及以后则返回上一次的访问时间首先做一个工具类,这个类的功能是找到特定名字的cookie,当然你也可以用工具类,直接将这个方法写在原码的下面直接应用,但是这个工具类还是比较有用的,很多时候都会用到,所以把它封装成了一个工具类。packagetools;importjavax.servlet.http.Cookie;publ…

    2022年7月8日
    17
  • C/C++编程学习 – 第5周 ④ 石头剪刀布「建议收藏」

    C/C++编程学习 – 第5周 ④ 石头剪刀布「建议收藏」题目描述石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周期不断循环的。请问,小A和小B比了N轮之后,谁赢的轮数多?输入格式输入包含三行。第一行包含三个整数:N,NA,NB,分别表示比了N轮,小A出拳的周期长度,小B出拳的周期长度。0

    2022年7月24日
    20
  • responsebody作用ajax,@ResponseBody 用法

    responsebody作用ajax,@ResponseBody 用法返回数据ResponseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区(响应体中),通常用来返回JSON数据。需要注意,在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,它的效果等同于通过response对象输出指定格式的数据。这也是我们通常的用法ajax的结束标识符最近我写一个购物车的业务…

    2022年5月27日
    61

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号