1、Dropout
dropout定义
是指在神经网络训练中,以一定的概率随机地丢弃一部分神经元来简化网络的一项操作。本质上来说,dropout就是在正常的神经网络基础上给每一层的每一个神经元加了一道概率流程来随机丢弃某些神经元以达到防止过拟合的目的。
听概念感觉哦哦我会了,实测我傻了…
大规模的神经网络有两个缺点:费时和容易过拟合
Dropout的出现很好的可以解决这个问题,每次做完dropout,相当于从原始的网络中找到一个更瘦的网络,如下图所示:
dropout带来的模型的变化
1.训练层面
无可避免的,训练网络的每个单元要添加一道概率流程
对应的公式变化如下:
2.测试层面
预测的时候,每一个单元的参数都要预乘以p
在keras中,dropout的实现只需要一行代码:
from keras.layers import Dropout
x=Dropout(0.5)(x)
以全连接神经网络为例
前向传播以一定的概率随即丢弃一部分神经元。反向传播
#######################摘自机器学习实验室##############################
使用一个参数为p的服从Bernoulli二项分布的随机变量r,将这个随机变量加入到标准神经网络输入中,那么带有dropout的神经网络可以描述为:
这样的数学描述简洁明了,好像也没什么特别注意的细节。我们以一层全连接网络为例来看dropout的具体实现过程。
D1=np.random.rand(A1.shape[0],A1.shape[1])
D1=D1<probA1=np.multiply(D1,A1)
A1=A1/prob
其中A1为上一层的输出,D1为用随机数生成的一组dropout向量,然后将其与保留概率prob做比较得到一个布尔向量,再将其与A1做乘积即可得到失活后的A1,按理说dropout到这里应该也就完成了,但最后还有一个将A1除以保留概率的操作。所以这里有个疑问,为什么在dropout之后还要做个rescale的除法?
其实,这种实现dropout的方法也叫InvertedDropout,是一种经典的dropout实现方法。先不说InvertedDropout,我们来看正常dropout应该是怎样的:当我们使用了dropout后,在模型训练阶段只有占比为p部分的神经元参与了训练,那么在预测阶段得到的结果会比实际平均要大1/p,所以在测试阶段我们需要将输出结果乘以p来保持输出规模不变。这种原始的dropout实现方式也叫VanillaDropout。Vanilla操作有一个重大缺陷,那就是预测过程需要根据训练阶段所使用的dropout策略做调整,比较麻烦,所以一般情况下都不会使用这种方法。
既如此,相必大家也知道了,我们目前用的都是InvertedDropout方法,为了能够在神经网络训练完成后安安心心的做预测,我们可以把全部心思都放在训练阶段,所有的设置都在训练阶段完成。所以为了保证神经网络在丢弃掉一些神经元之后总体信号强度不变和预测结果稳定,也有一种说法叫保证Bernoulli二项分布的数学期望不变,我们在InvertedDropout方法中对dropout之后的做了除以p的rescale操作。
反向传播时同理,梯度计算时需要除以保留概率:
#########################################################################
ort numpy as np
'''
输入:
- x: Input data, of any shape
- dropout_param: A dictionary with the following keys:
- p: Dropout parameter. We keep each neuron output with probability p.
- mode: 'test' or 'train'. If the mode is train, then perform dropout;
if the mode is test, then just return the input.
- seed: Seed for the random number generator. Passing seed makes this
function de