在小批量梯度下降中混淆使用丢失

时间:2018-02-05 08:06:25

标签: tensorflow machine-learning neural-network gradient-descent mini-batch

我的问题到底是什么。

example CNN使用小批量GD进行培训,并使用最后一个完全连接层(第60行)中的丢失作为

fc1 = tf.layers.dropout(fc1, rate=dropout, training=is_training)

起初我以为tf.layers.dropouttf.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

我对正确?辍学的理解是,在小批量相同单位>批次梯度下降阶段,反向传播更新“稀疏网络”的权重和偏差。然而,在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中的辍学策略可能是一种加权更新某个神经元权重的方法,如果神经元保持在10个样本中的1个中在小批量中,其权重将更新alpha * 1/10 * (y_k_hat-y_k) * x_k,与alpha * 1/10 * sum[(y_k_hat-y_k) * x_k]相比,所有10个样本中保留的另一个神经元的权重?

enter image description here

here

的屏幕截图

1 个答案:

答案 0 :(得分:3)

辍学通常用于防止过度拟合。在这种情况下,它将是一个巨大的重量应用于其中一个神经元。通过随机地将其随机变为0,您可以强制网络使用更多神经元来确定结果。为了使其正常工作,您应该为每个示例删除不同的神经元,以便您计算的渐变更类似于没有丢失的渐变。

如果您要为批处理中的每个示例删除相同的神经元,我的猜测是您的梯度会不太稳定(可能对您的应用程序无关紧要)。

此外,辍学 - 扩展其余值以使平均激活保持在大致相同的水平。如果没有它,网络就会学会错误的偏见,或者当你关闭辍学时会过度饱和。

如果您仍希望在批处理中删除相同的神经元,则将dropout应用于所有1个张量的形状(1,num_neurons),然后将其与激活相乘。