我的问题是最后。
example CNN 用小批量 GD 训练,并使用最后一个全连接层(第 60 行)中的 dropout 作为
fc1 = tf.layers.dropout(fc1, rate=dropout, training=is_training)
起初我认为
tf.layers.dropout
或 tf.nn.dropout
随机将列中的神经元设置为零。但我最近发现并非如此。下面的一段代码打印了 dropout
的作用。我使用 fc0
作为 4 个样本 x 10 的特征矩阵,使用 fc
作为退出版本。import tensorflow as tf
import numpy as np
fc0 = tf.random_normal([4, 10])
fc = tf.nn.dropout(fc0, 0.5)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
a, b = sess.run([fc0, fc])
np.savetxt("oo.txt", np.vstack((a, b)), fmt="%.2f", delimiter=",")
在输出
oo.txt
中(原始矩阵:第 1-4 行,丢弃矩阵:第 5-8 行):0.10,1.69,0.36,-0.53,0.89,0.71,-0.84,0.24,-0.72,-0.44
0.88,0.32,0.58,-0.18,1.57,0.04,0.58,-0.56,-0.66,0.59
-1.65,-1.68,-0.26,-0.09,-1.35,-0.21,1.78,-1.69,-0.47,1.26
-1.52,0.52,-0.99,0.35,0.90,1.17,-0.92,-0.68,-0.27,0.68
0.20,0.00,0.71,-0.00,0.00,0.00,-0.00,0.47,-0.00,-0.87
0.00,0.00,0.00,-0.00,3.15,0.07,1.16,-0.00,-1.32,0.00
-0.00,-3.36,-0.00,-0.17,-0.00,-0.42,3.57,-3.37,-0.00,2.53
-0.00,1.05,-1.99,0.00,1.80,0.00,-0.00,-0.00,-0.55,1.35
我的理解正确吗? dropout 是,在 小批量 或 批次 梯度下降阶段中,为每个样本淘汰 p% 相同的 单位,并且反向传播更新 “细化网络” ojit_r 的权重和偏差然而,在 example 的实现中, 每个样本的 神经元被随机丢弃,如
oo.txt
第 5 到 8 行所示,对于每个样本,“细化网络”是 不同的 。作为比较,在随机梯度下降的情况下,样本被一个一个地输入神经网络,并且在每次迭代中,每个引入“细化网络”的
tf.layers.dropout
的权重都会更新。我的问题是 ,在小批量或批量训练中,不应该实现为一批中的所有样本敲除相同的神经元吗?也许通过在每次迭代时对所有输入批次样本应用一个掩码?
就像是:
# ones: a 1xN all 1s tensor
# mask: a 1xN 0-1 tensor, multiply fc1 by mask with broadcasting along the axis of samples
mask = tf.layers.dropout(ones, rate=dropout, training=is_training)
fc1 = tf.multiply(fc1, mask)
现在我在想 example 中的 dropout 策略可能是 加权 更新某个神经元权重的方式,如果一个神经元保留在小批量中的 10 个样本中的 1 个中,则其权重将更新为
alpha * 1/10 * (y_k_hat-y_k) * x_k
,与 alpha * 1/10 * sum[(y_k_hat-y_k) * x_k]
比较所有 10 个样本中另一个神经元的权重?here 的截图
最佳答案
Dropouts 通常用于防止过拟合。在这种情况下,这将是一个巨大的权重应用于其中一个神经元。通过不时将其随机设为 0,您可以强制网络使用更多的神经元来确定结果。为了让这个工作正常,你应该为每个例子删除不同的神经元,这样你计算的梯度与没有 dropout 时得到的梯度更相似。
如果您要为批次中的每个示例删除相同的神经元,我的猜测是您的梯度会不太稳定(可能对您的应用程序无关紧要)。
此外,dropout 会放大其余值,以将平均激活保持在大致相同的水平。没有它,当你关闭 dropout 时,网络会学习错误的偏见或过度饱和。
如果您仍然希望在批次中删除相同的神经元,则将 dropout 应用于形状为 (1, num_neurons) 的全 1 张量,然后将其与激活值相乘。
关于tensorflow - 小批量梯度下降中 dropout 的混淆用法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48618108/