我无法理解为什么dropout在tensorflow中会像这样工作。 CS231n的博客说,"dropout is implemented by only keeping a neuron active with some probability p (a hyperparameter), or setting it to zero otherwise."
你也可以从图片中看到这一点(取自同一网站)
来自tensorflow网站,With probability keep_prob, outputs the input element scaled up by 1 / keep_prob, otherwise outputs 0.
现在,为什么输入元素按1/keep_prob
放大?为什么不保持输入元素的概率而不是用1/keep_prob
来缩放它?
答案 0 :(得分:46)
此缩放使同一网络可用于培训(使用keep_prob < 1.0
)和评估(使用keep_prob == 1.0
)。来自Dropout paper:
这个想法是在测试时使用单个神经网络而不会丢失。该网络的权重是训练权重的缩小版本。如果在训练期间以概率 p 保留单位,则在测试时将该单位的输出权重乘以 p ,如图2所示。
TensorFlow实现不是在测试时添加操作以按keep_prob
缩小权重,而是在训练时添加1. / keep_prob
来增加权重。对性能的影响可以忽略不计,而且代码更简单(因为我们使用相同的图表并将keep_prob
视为tf.placeholder()
,根据我们是在培训还是评估网络,这些{{3}}会提供不同的值
答案 1 :(得分:4)
我们假设网络中有n
个神经元,我们应用了辍学率1/2
训练阶段,我们将留下n/2
个神经元。因此,如果您期望输出x
包含所有神经元,那么现在您将进入x/2
。因此,对于每个批次,根据此x / 2
测试/推理/验证阶段,我们不应用任何辍学,因此输出为x。因此,在这种情况下,输出将使用x而不是x / 2,这会给您不正确的结果。因此,您可以做的是在测试期间将其缩放到x / 2。
而不是特定于测试阶段的上述缩放。 Tensorflow的辍学层所做的是无论是辍学还是没有(训练或测试),它都会缩放输出以使总和保持不变。
答案 2 :(得分:0)
如果您继续阅读cs231n,则会说明辍学和倒置辍学之间的区别。
由于我们希望在测试时保持前进状态不变(并且仅在训练过程中调整网络),因此tf.nn.dropout
直接实现了倒置辍学,调整了数值。
答案 3 :(得分:0)
这是一个快速实验,可以消除所有剩余的混乱。
统计上,NN层的权重遵循通常接近于正态分布(但不一定)的事实,但是即使在实际中尝试采样理想正态分布的情况下,总是计算错误。
然后考虑以下实验:
DIM = 1_000_000 # set our dims for weights and input
x = np.ones((DIM,1)) # our input vector
#x = np.random.rand(DIM,1)*2-1.0 # or could also be a more realistic normalized input
probs = [1.0, 0.7, 0.5, 0.3] # define dropout probs
W = np.random.normal(size=(DIM,1)) # sample normally distributed weights
print("W-mean = ", W.mean()) # note the mean is not perfect --> sampling error!
# DO THE DRILL
h = defaultdict(list)
for i in range(1000):
for p in probs:
M = np.random.rand(DIM,1)
M = (M < p).astype(int)
Wp = W * M
a = np.dot(Wp.T, x)
h[str(p)].append(a)
for k,v in h.items():
print("For drop-out prob %r the average linear activation is %r (unscaled) and %r (scaled)" % (k, np.mean(v), np.mean(v)/float(k)))
示例输出:
x-mean = 1.0
W-mean = -0.001003985674840264
For drop-out prob '1.0' the average linear activation is -1003.985674840258 (unscaled) and -1003.985674840258 (scaled)
For drop-out prob '0.7' the average linear activation is -700.6128015029908 (unscaled) and -1000.8754307185584 (scaled)
For drop-out prob '0.5' the average linear activation is -512.1602655283492 (unscaled) and -1024.3205310566984 (scaled)
For drop-out prob '0.3' the average linear activation is -303.21194422742315 (unscaled) and -1010.7064807580772 (scaled)
请注意,由于统计上不完美的正态分布,未成比例的激活会减少。
您能发现W-mean
与平均线性激活平均值之间存在明显的相关性吗?