dropout理解「建议收藏」

dropout理解「建议收藏」1.dropout解决的问题深度神经网络的训练是一件非常困难的事,涉及到很多因素,比如损失函数的非凸性导致的局部最优值、计算过程中的数值稳定性、训练过程中的过拟合等。过拟合是指模型训练到一定程度后,在测试集上得到的测试误差远大于在训练集上得到的误差。导致过拟合的主要原因有: 1.训练数据集太小 2.模型太复杂 3.过度训练2.dropoutdropout是指在训练一…

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

1.dropout解决的问题

深度神经网络的训练是一件非常困难的事,涉及到很多因素,比如损失函数的非凸性导致的局部最优值、计算过程中的数值稳定性、训练过程中的过拟合等。

过拟合是指模型训练到一定程度后,在测试集上得到的测试误差远大于在训练集上得到的误差。

导致过拟合的主要原因有: 
1. 训练数据集太小 
2. 模型太复杂 
3. 过度训练

2.dropout

dropout是指在训练一个很大的神经网络时,它在每次迭代的过程中随机“关闭”一些神经元,被关闭的神经元在前向和反向传播中都不贡献作用,英文即是“dropout”的意思。如下图所示: 
dropout示意图 
我们看到图中打叉的神经元就是被“dropout”掉的神经元,和这些个神经元相连接的权重值也一并被“抹去”,不参与本次训练。不参与本次训练是说在当前的batch中,不参与训练,每个batch都会随机挑选神经元做dropout。

dropout为什么可以防止过拟合
dropout的解决方案,在每一次迭代的过程中,我们会随机dropout掉一些神经元(至于在那一层做dropout,需要看不同的情况),如果设置的dropout的值为0.8,则表示每个神经元有80%的概率被留下来,20%的概率被”抹去“。这就相当于我们从原来的神经网络中随机采样了80%的节点,组成了一个新的神经网络,这个是原来的神经网络的一个子网络,但是规模要比原来的神经网络小很多,并且训练代价也比较小。我们多次迭代优化,每次迭代优化都会做这样的”随机采样“,从原来的网络中构造一个子网络(sub-network),而每次构造的网络也都不尽相同,这样每个神经元对另一个特定神经元的激活很不敏感。这样参数就不会过分依赖于训练数据,增加了模型的泛化能力。

只在训练过程中使用dropout,在测试期间不使用dropout。因为在测试阶段,我们不期望输出结果是随机的,如果测试阶段应用了dropout,预测会受到干扰。

inverted dropout函数做法:举例神经网络 训练阶段前向传播第一层dropout

Z1=np.dot(W1,X)+b1  
A1=relu(Z1)
D1=np.random.rand(A1.shape[0],A2.shape[1]) 
D1=D1<keep_prop
A1=np.multiply(A1,D1) 
A1=A1/keep_prop #确保A1期望不变,这样测试阶段,没有dropout也没有影响
Z2=np.dot(A1,X)+b2
import numpy as np

def relu(x):

    s = np.maximum(0,x)
    
    return s

w1=[[1,2,3],[1,2,3],[4,5,6],[4,5,6]]
x=[[1,2],[1,2],[1,2]]
b=1
z1=np.dot(w1,x)+b
print(z1)

[[ 7 13]
 [ 7 13]
 [16 31]
 [16 31]]

a1=relu(z1)
d1=np.random.rand(a1.shape[0],a1.shape[1])
print(d1)

[[0.58695556 0.41508454]
 [0.16031604 0.24994934]
 [0.10260241 0.8237806 ]
 [0.28117361 0.8992166 ]]

d1=d1<0.8
print(d1)
[[ True  True]
 [ True  True]
 [ True False]
 [ True False]]

a1=np.multiply(a1,d1)
print(a1)
[[ 7 13]
 [ 7 13]
 [16  0]
 [16  0]]

a1=a1/0.8
print(a1)
[[ 8.75 16.25]
 [ 8.75 16.25]
 [20.    0.  ]
 [20.    0.  ]]

train 和 test 的时候,dropout的概率怎么设置:按照原始的论文中,假设dropout的值是 p%,原始神经网络的神经元个数是N,因为在训练的过程中只有 p% 的神经元被保留下来,相应也只有p%的需要被优化的权值保留下来,这导致dropout后sub-network的输出也是整个原始神经网络的输出值的p%。所以,在测试的是时候使用的整个神经网络,我们只需要将每一层的权值矩阵乘以p%就可以保证测试网络的输出期望和训练网络的输出期望值大小一致了。 

注意,如果你使用了tensorflow,则在测试的时候要保持dropout的值为1,即不”抹去“任何神经元。

为什么很少见CNN层加dropout: 这种情况确实不多见,典型的TextCNN模型,就是没有在卷积层加dropout。但是原始论文中确实又指出可以在卷积层做dropout ,只是收益并不是太明显。另外,dropout对于具有大量参数的全连接效果最好,而CNN的卷积层不是全连接,参数不是很多,所以效果不明显。论文还建议如果在CNN中加,最好是在开始的层加dropout,越往后的层,越是要小心加dropout。

神经网络加上dropout后,test loss 比 train loss还要小:正常,在不考虑测试集采样偏差的情况下,这种情况的解释是:每次train loss是在一个batch上计算的,而单个batch又是在一个通过dropout得到的sub-network计算得到的,即相当于在单颗树上得到的train loss;而测试的时候,用的整个神经网络,即相当于在整个”森林“上做预测,结果当然会好一下。

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

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

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


相关推荐

  • 原生JS 扫雷游戏 自动插旗子 自定义雷区大小 雷数可调

    原生JS 扫雷游戏 自动插旗子 自定义雷区大小 雷数可调《扫雷》是Microsoft于1992年附带在Windows3.1操作系统中的单机游戏,它通过点击方格并以出现数字来判断附近雷的数量,将全部地雷做上标记即可胜利。最后在2015年7月发布的Windows10中移除了这个游戏。随机变换雷区颜色,以及其它CSS样式,动画效果全是CSS。点击网页上的元素触发游戏事件打开雷区。如果对于一个方格,其周围未打开的方格恰好全都有雷,那么这些雷将全部自动被标记为小红旗,而玩家只需要一直点击雷区直至雷区全被打开并胜利呈现YOUWIN~没错,全程左键操作。在地

    2022年4月30日
    95
  • 学习双拼必看:双拼输入法的心得以及快速入门办法

    学习双拼必看:双拼输入法的心得以及快速入门办法1.简单介绍一下双拼2.总共18种双拼方案3.15种双拼方案的具体映射4.顺便提一下双拼口诀的事情5.总结不同平台选择的方案双拼(也称双打)是一种建立在拼音输入法基础上的输入方法,可视为全拼的一种改进,它通过将汉语拼音中每个含多个字母的声母或韵母各自映射到某个按键上,使得每个音都可以用两个按键打出,极大地提高了拼音输入法的输入速度。这种声母或韵母到按键的对应表通常称之为双…

    2022年6月23日
    45
  • Java创建二维数组

    Java创建二维数组1、Java创建二维数组:int[][]array=newint[6][6];2、直接创建二维数组并赋值:int[][]array={{1,2,3},{1,2,3},{1,2,3}};3、二维数组的声明:先声明再分配内存数组声明:数据类型数组名[][];…

    2022年6月6日
    36
  • TextBox显示密码

    TextBox显示密码 &lt;asp:TextBoxID="TextBox1"runat="server"TextMode="Password"&gt;&lt;/asp:TextBox&gt; this.TextBox1.Attributes.Add("value","aaa");

    2022年7月25日
    7
  • IOSG Ventures宣布加入Celer状态守卫者网络以及cBridge流动性桥接网络

    IOSG Ventures宣布加入Celer状态守卫者网络以及cBridge流动性桥接网络IOSGVentures宣布加入Celer状态守卫者网络,并已建立Celer验证人节点。同时,IOSGVentures也宣布加入CelercBridge流动性桥接网络,为其提供流动性。IOSGVentures将与Celer共同维护其二层扩容网络的可用性和安全性,并为其生态发展提供持续可靠的基础设施服务。IOSGVentures现已成为Celer状态守卫者网络验证人节点IOSGVentures成立于2017年,是由社区驱动的研究型早期美元基金,在中国、美国和新…

    2022年6月4日
    35
  • 《Android游戏编程之从零开始》笔记「建议收藏」

    《Android游戏编程之从零开始》笔记「建议收藏」一、游戏开发基础1.快速进入android游戏开发自学、demo、问题、百度&Google2.游戏简单概括ViewCanvasPaint刷新3.游戏开发常用三种视图View——>SurfaceView2D——>GLSurfaceView3D4.View游戏框架a.绘图函数onDraw绘制图形、图片等函数都在画布类中。

    2022年6月8日
    33

发表回复

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

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