dropout(0.2) 表示舍弃20%的数据,通常不超过0.5 舍弃数据还能达到理想效果,表示模型健壮 数据x舍弃20%之前,会先增加x=x/(1-0.2) 然后再随机舍弃20%,这样数据总体期望不变
训练与预测
深度学习的两个模型: 训练:model.train(),表示模型会修改参数,改变数据 预测:model.eval(),表示模型不会修改参数与数据,只是预测, 预测模型下,像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的比较