DROPOUT

 
dropout(0.2) 表示舍弃20%的数据,通常不超过0.5

舍弃数据还能达到理想效果,表示模型健壮
数据x舍弃20%之前,会先增加x=x/(1-0.2)
然后再随机舍弃20%,这样数据总体期望不变 


训练与预测

   
深度学习的两个模型:
训练:model.train(),表示模型会修改参数,改变数据
预测:model.eval(),表示模型不会修改参数与数据,只是预测,

预测模型下,像dropout这样 会改变模型数据的功能就失效了,
dropout在训练阶段生效

个人遇到过添加dropout后,模型精度得到了提升的场景;
但肯定不是所有的场景都这样,
可以将是否添加dropout,以及参数多少,做为模型优化的一个选项

    
DROPOUT 代码阐释

 
import torch
from torch import nn
from torch.nn import functional as F

"""
    随机将一个元素20%的维度置为0 
"""
dropout = nn.Dropout(p = 0.2)

# tensor([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
x = torch.arange(10).float()  

随机将一个元素20%的维度置为0,并且总体期望不变

 
x / (1 - 0.2)
tensor([ 0.0000,  1.2500,  2.5000,  3.7500,  5.0000,  6.2500,  7.5000,  8.7500,
        10.0000, 11.2500])

dropout.train()
dropout(x)
tensor([ 0.0000,  1.2500,  0.0000,  3.7500,  0.0000,  0.0000,  0.0000,  8.7500,
        10.0000, 11.2500])

dropout.eval()
dropout(x)
tensor([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])

 
将向量的维度看成一个数据分布,随机将一些维度置为0,总体是减少的(假设数据全为正)
为了不改变数据分布的期望,将减少的部分增加到剩下的元素上
这样做不会导致数据越训练越小... 

舍弃的比较不要太大,通常不超过0.5

如果大量特征中只有少数不确定的几个维度有效,那么dropout应该不合适,一旦被舍弃就是无效了(这一句仅个人猜测...尚未实验验证)

更多思考(仅个人猜测...尚未实验验证)

 
通常将列或行看作一个分布,并且默认它们都是正态分布...

那么这里为什么要保持总体期望不变呢?是不是有些地方直接舍弃不管总体期望更简明有效?

参考
    神经网络】神经元ReLU、Leaky ReLU、PReLU和RReLU的比较