gpt4 book ai didi

tensorflow - 小批量梯度下降中 dropout 的使用困惑

转载 作者:行者123 更新时间:2023-11-30 08:51:07 27 4
gpt4 key购买 nike

我的问题在最后。

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

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

我对正确的? dropout 的理解是,在小批量中剔除每个样本的 p% 相同单位>批量梯度下降阶段,反向传播更新“细化网络”的权重和偏差。然而,在实现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

最佳答案

辍学通常用于防止过度拟合。在这种情况下,一个神经元将受到巨大的权重。通过不时随机地将其设为 0,可以迫使网络使用更多的神经元来确定结果。为了使其正常工作,您应该为每个示例删除不同的神经元,以便您计算的梯度与没有丢失时获得的梯度更相似。

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

此外,dropout 还会放大其余值,以将平均激活保持在大致相同的水平。如果没有它,网络将学习错误的偏差,或者当您关闭 dropout 时会过度饱和。

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

关于tensorflow - 小批量梯度下降中 dropout 的使用困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48618108/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com