层归一化及其工作原理(TensorFlow)

3

我很难理解层归一化。比如说我在Tensorflow中训练了一个模型,当我查看图中的变量时,得到以下结果:

     <tf.Variable 'actor/dense/kernel:0' shape=(5, 64) dtype=float32_ref>,
     <tf.Variable 'actor/dense/bias:0' shape=(64,) dtype=float32_ref>,
     <tf.Variable 'actor/LayerNorm/beta:0' shape=(64,) dtype=float32_ref>,
     <tf.Variable 'actor/LayerNorm/gamma:0' shape=(64,) type=float32_ref>,
     <tf.Variable 'actor/dense_1/kernel:0' shape=(64, 64) dtype=float32_ref>,
     <tf.Variable 'actor/dense_1/bias:0' shape=(64,) dtype=float32_ref>,
     <tf.Variable 'actor/LayerNorm_1/beta:0' shape=(64,) dtype=float32_ref>,
     <tf.Variable 'actor/LayerNorm_1/gamma:0' shape=(64,) dtype=float32_ref>
     <tf.Variable 'actor/dense_2/kernel:0' shape=(64, 1) dtype=float32_ref>,
     <tf.Variable 'actor/dense_2/bias:0' shape=(1,) dtype=float32_ref>

正如您所看到的,这是一个具有每层层归一化的两层全连接网络。

因此,我知道偏差被添加到节点输入中。actor / LayerNorm / beta:0,actor / LayerNorm / gamma:0等变量是否以相同方式工作?我可以将一个层的偏置、beta和gamma值总结为一个“偏置”向量吗?或者这是完全不同的机制?

预先感谢!


我看到这是你在stackoverflow上的第一个问题。为了给你一个好的答案,你能告诉我们你已经尝试过什么来解决这个问题吗?你对层标准化的目的了解多少? - Aaron
我读了Ba等人的论文,从中得知层归一化可以加速训练过程。然而,我并没有找到有关tensorflow创建beta和gamma变量的任何信息。在tensorflow的tc.layers.layer_norm文档中,我读到了以下内容: - Mikhail Dem
默认情况下,begin_norm_axis = 1,begin_params_axis = -1,这意味着规范化是在除第一个轴(如果输入为NHWC,则为HWC)以外的所有轴上执行的,而beta和gamma可训练参数是针对最右边的轴(如果输入为NHWC,则为C)计算的。通过使用beta和gamma参数与规范化张量进行广播来执行缩放和重新居中。然而,如果我们将beta和gamma变量视为向量,它们的元素是否像偏差一样直接添加到神经元输入中? - Mikhail Dem
2个回答

6
beta和gamma变量与偏置变量不同。代码如下所示:
y = tf.matmul(kernel, x) + bias
mean, variance = tf.nn.moments(y, [1], keep_dims=True)
normalized_y = (y - mean) / tf.sqrt(variance + 1e-5)
y_out = normalized_y * gamma + beta

首先,您需要将核函数与输入x相乘并加上偏差项。然后,计算向量y中值的平均值和方差。通过减去平均值并除以总标准偏差来归一化y。最后,通过用gamma乘以每个维度并添加beta来调整y。


1
那非常有帮助。谢谢! - Mikhail Dem
你能否解释一下在你的代码中为什么选择轴 = [1]? - Aziz

1
我建议使用TensorFlow官方仓库中贡献者提供的实现。这里是层归一化实现

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接