|
|
@ -50,18 +50,34 @@ print(residual_output)
|
|
|
|
|
|
|
|
|
|
|
|
### 层归一化
|
|
|
|
### 层归一化
|
|
|
|
|
|
|
|
|
|
|
|
缩放规则:均值为0,方差为1。
|
|
|
|
缩放规则:均值为0,方差为1。以下是GPT-2里的源码
|
|
|
|
|
|
|
|
|
|
|
|
~~~scss
|
|
|
|
~~~python
|
|
|
|
LayerNorm(x) = γ * (x - μ) / σ + β
|
|
|
|
def norm(x, scope, *, axis=-1, epsilon=1e-5):
|
|
|
|
|
|
|
|
"""Normalize to mean = 0, std = 1, then do a diagonal affine transform."""
|
|
|
|
|
|
|
|
with tf.variable_scope(scope):
|
|
|
|
|
|
|
|
n_state = x.shape[-1].value
|
|
|
|
|
|
|
|
g = tf.get_variable('g', [n_state], initializer=tf.constant_initializer(1)) # 创建可训练的缩放因子(scale factor) g
|
|
|
|
|
|
|
|
b = tf.get_variable('b', [n_state], initializer=tf.constant_initializer(0)) # 创建可训练的偏置项(bias term) b
|
|
|
|
|
|
|
|
u = tf.reduce_mean(x, axis=axis, keepdims=True) # 计算均值
|
|
|
|
|
|
|
|
s = tf.reduce_mean(tf.square(x-u), axis=axis, keepdims=True) # 求方差
|
|
|
|
|
|
|
|
x = (x - u) * tf.rsqrt(s + epsilon)
|
|
|
|
|
|
|
|
x = x*g + b
|
|
|
|
|
|
|
|
return x
|
|
|
|
~~~
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
|
|
- *x* 是待归一化的输入张量。
|
|
|
|
- 𝑥 是输入张量,
|
|
|
|
- 𝜇 是输入张量 𝑥 的均值。
|
|
|
|
- 𝜇 是输入张量 𝑥*x* 沿着指定轴的均值,
|
|
|
|
- 𝜎 是输入张量 𝑥 的标准差。
|
|
|
|
- 𝜎2 是输入张量 𝑥*x* 沿着指定轴的方差,
|
|
|
|
- 𝛾 和 𝛽 是可学习的参数,通过反向传播和梯度下降算法在训练过程中学习的。。
|
|
|
|
- 𝜖 是一个小的常数,用于防止除以零,
|
|
|
|
|
|
|
|
- 𝑔 是可学习的缩放因子,
|
|
|
|
|
|
|
|
- 𝑏 是可学习的偏置项。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$$
|
|
|
|
|
|
|
|
\text{LN}(x) = g \cdot \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} + b
|
|
|
|
|
|
|
|
$$
|
|
|
|
|
|
|
|
|
|
|
|
简单理解为,最终值又会进行一轮的缩放,让它们都回到一个相对统一的区间。
|
|
|
|
跟标准的层归一化不一样,但两者是等价的。简单理解为,最终值又会进行一轮的缩放,让它们都回到一个相对统一的区间。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|