深度学习之dropout

Part 1

本来想写一篇dropout的文章,有人写的很好了,我就直接借鉴了

 

先上链接:深度学习中Dropout原理解析

但是文章中有一个地方说的有点混乱,测试集缩放概率问题,重新理一下:

dropout,防止过拟合,还可以提高训练速度。

加入dropout的概率为p,就是神经元以p的概率失活,相当于比如p设定为0.4,那100个节点会有40个节点失活,不参与训练。

简单说一下逻辑:

1. 定义dropout的概率值p

2. 通过伯努利算法生成神经元节点对应的0 1值,0表示需要进行失活操作

3. 保存0对应的节点的参数值,对其进行失活操作(其实就是乘以0)

4. 进行前向传播和反向传播,更新未失活节点的权重,失活的神经元权重为失活前保存的权重值

5. 重新进行下一轮迭代

 

说明下,失活之后,神经元的个数少了,但是测试的时候不能对神经元失活操作,这就导致了训练时神经元个数为 (1-p) * m, 而测试时是全量的神经元个数m,所以需要进行缩放,有两种方式,① 训练阶段失活操作之后,对未失活节点的权重 乘以1/(1-p) ② 测试阶段,对所有权重 乘以(1-p)操作。

 

Part 2

过了段时间,刚好看到一些大佬DL 源码,发现了一点问题,查阅资料又有些新的发现

拿BertModel来举例,调用的时候,初始化代码可以设置个参数 is_training, True 表示训练过程,False表示测试过程,那Part1部分已经说到了,dropout训练和测试是有区别的,代码部分怎么体现呢?

首先,需要初始化不同的prob,这里有两个,一个是hidden层权重的dropout prob,另一个是attention部分的权重对应的dropout的prob

config.hidden_dropout_prob = tf.cond(is_training, lambda: config.hidden_dropout_prob, lambda: 0.0)
config.attention_probs_dropout_prob = tf.cond(is_training, lambda: config.attention_probs_dropout_prob, lambda: 0.0)

config 就是你初始设置的dropout值

那下一步怎么让这个dropout生效呢?

其实就是一个dropout函数tf.nn.dropout(input_tensor, 1.0 - dropout_prob),对应的scale也是在dropout函数里实现的。使用如下:

attention_probs = tf.nn.softmax(attention_scores)
attention_probs = dropout(attention_probs, attention_probs_dropout_prob)

attention_output = dropout(attention_output, hidden_dropout_prob)
attention_output = layer_norm(attention_output + layer_input)

layer_output = dropout(layer_output, hidden_dropout_prob) # dropout
layer_output = layer_norm(layer_output + attention_output)  # norm layer和attention结果

第一部分是对attention得到的权重进行的dropout,也就是说本来权重应该乘value,先dropout之后再乘value

第二部分是对得到的attention结果进行dropout

第三部分是对layer节点进行dropout

 

 

参考链接:https://zhuanlan.zhihu.com/p/29764091 这篇介绍的更为全面,包括dropout的源码

https://www.jianshu.com/p/c9f66bc8f96c 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
深度学习中的Dropout是一种正则化技术,旨在减少过拟合问题。在神经网络训练过程中,Dropout通过临时随机将一些神经元的输出设置为0,从而减少了神经元之间的依赖性,增加了网络的鲁棒性和泛化能力。 Dropout的原理很简单,每个神经元的输出在训练时以概率p被设置为0,以概率1-p被保留(p通常设置为0.5)。由于整个网络的结构会随机改变,每个神经元都要适应不同的子网络,因此网络具备了对神经元丢失的鲁棒性。这样的随机丢失使网络变得不那么过分依赖某个具体的神经元,更有助于学习到更加鲁棒和泛化性能更好的特征。当网络训练完毕后,没有dropout的所有神经元都会被恢复,但每个神经元的输出会乘以(1-p)来保持输出的期望不变。 Dropout的作用是减轻过拟合。在深度学习中,模型复杂度通常很高,参数众多,很容易导致过拟合。过拟合指的是模型在训练数据上表现良好,但在测试数据上表现较差。通过使用Dropout,可以减少神经元之间的共适应性,并且强制网络学习不同的特征,从而减少过拟合。Dropout相当于在每次训练迭代中训练了一个不同的网络子集,这样可以减少对任何一个特定的特征都有强依赖的情况。 总结来说,Dropout是深度学习中一种有效的正则化技术,通过随机丢失神经元的输出,可以减少神经元之间的依赖性,增加网络的鲁棒性和泛化能力,从而减轻过拟合问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微知girl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值