全连接层输出爆炸式增长,但权重、梯度和输入都具有合理的值

数据挖掘 Python 深度学习 张量流
2022-03-03 04:26:34

我正在尝试训练 GAN,该架构在输出激活函数之前包括一个全连接层。在我的例子中,通过第二次训练迭代,这一层的输出总是爆炸式的。

我无法通过调试确定任何原因。层实现非常简单:

def fully_connected_d(inp, output_dim, name="Linear", stddev=0.02):
    shape = inp.get_shape().as_list()
    with tf.variable_scope(name):
        w = tf.get_variable("w", [shape[1], output_dim], initializer=tf.truncated_normal_initializer(stddev=stddev))
        #biases = tf.get_variable("b", [output_dim], initializer=tf.constant_initializer(0.0))
        return tf.matmul(inp, w) #tf.nn.bias_add(tf.matmul(inp, w), biases)

在这里,我删除了偏见以排除偏见爆炸的原因,但无论是否存在偏见,都会发生这种情况。

在任何给定的运行中,无论该层的输入是什么,它的激活在最初的几次训练迭代中从大约 0 跳到大约 10 左右:

激活爆炸

我无法弄清楚为什么输出在这个范围内,因为权重和输入非常小:

重量:

层权重

输入:

层输入

最后,我检查了损失相对于权重的梯度,在激活跳跃之前它们似乎也很正常。一旦激活增加,它们就会趋近于零,因为我使用并且对于非常大的输入,它的梯度很小。tanh

渐变

本质上,我不确定(看似合理的输入)x(看似合理的权重)如何产生(疯狂的激活)。因为输出跳的太快了,我认为这将是一个设计缺陷,但是层本身是如此简单,以至于我看不到我缺少什么。任何帮助表示赞赏。

0个回答
没有发现任何回复~