云计算百科
云计算领域专业知识百科平台

Transformer为什么离不开LayerNorm:3个NumPy实验实战讲透,ML数学基础第5期

Transformer能堆到几十上百层还训得动,LayerNorm功不可没。把它拿掉,深层网络的激活值会一路飘:前面几层的输出越来越大或者越来越小,传到后面梯度直接没法看。归一化这件事,听起来就是"减均值除标准差",但为什么是LayerNorm而不是BatchNorm,这里面有讲究。

先把公式摆出来,一个式子就够了。对输入x,先算均值mu,再算方差var,输出就是(x – mu) / sqrt(var + eps)。关键在"对哪个维度算"。BatchNorm是对batch这个维度算,一个batch里所有样本的同一特征一起归一化。LayerNorm反过来,对每个样本自己的特征维度算,样本之间互不干扰。

环境只要NumPy。下面三个实验我都跑过,数字是实测的,你复制粘贴就能复现。

实验一:看单向量归一化前后长什么样。

import numpy as np

def layer_norm(x, eps=1e-5):
mu = x.mean(axis=–1, keepdims=True)
var = x.var(axis=–1, keepdims=True)
return (x – mu) / np.sqrt(var + eps)

x = np.array([3.0, 1.0, –2.0, 8.0, 5.0])
y = layer_norm(x)
print("归一化前:均值 %.2f,方差 %.2f" % (x.mean(), x.var()))
print("归一化后:", np.round(y, 3))
print("归一化后:均值 %.2f,方差 %.2f" % (y.mean(), y.var()))

输出:归一化前均值3.00、方差11.60;归一化后变成[0, -0.587, -1.468, 1.468, 0.587],均值约0、方差1.0。不管输入多大,出来永远是均值0方差1的标准形态。深层网络每层都过这么一道,激活值就飘不起来。

实验二:看多行特征尺度差很大的情况。实际网络里,不同神经元的激活量级能差上万倍。

np.random.seed(7)
X = np.random.randn(4, 8) * np.array([0.01, 0.1, 1, 10, 100, 1000, 0.5, 2])
Y = layer_norm(X)
print("归一化前每行方差:", np.round(X.var(axis=1), 2))
print("归一化后每行方差:", np.round(Y.var(axis=1), 4))

归一化前四行的方差是691、8129、4929、21389,差了几十倍;归一化后全部变成1.0。每一行独立处理,量级差异被抹平,下一层拿到的输入永远是规整的。

实验三:对比RMSNorm。LLaMA用的就是它,公式更简单:不减均值,只除以均方根。

def rms_norm(x, eps=1e-5):
return x / np.sqrt((x ** 2).mean(axis=–1, keepdims=True) + eps)

z = np.array([2.0, –1.0, 0.5, 4.0])
print("LayerNorm:", np.round(layer_norm(z), 3), "均值 %.3f" % layer_norm(z).mean())
print("RMSNorm: ", np.round(rms_norm(z), 3), "均值 %.3f" % rms_norm(z).mean())

LayerNorm输出[0.338, -1.284, -0.473, 1.419],均值严格为0;RMSNorm输出[0.868, -0.434, 0.217, 1.735],均值0.597。RMSNorm保留了一部分均值信息,计算量还少一步,大模型推理时能省则省。

那为什么NLP不用BatchNorm?三个原因。第一,NLP的序列长度可变,batch里长短不一,batch统计量本身就不稳。第二,推理时batch经常是1,BatchNorm的均值方差退化成单个样本的,完全失真。第三,LayerNorm每个样本独立,训练和推理行为完全一致,没有这种烦恼。

最后说几个写代码容易翻车的地方。eps别省,方差为0时不加它直接除零变nan。axis=-1别写错,写成axis=0就变成对batch归一化,效果全反。keepdims=True别丢,不然广播时形状对不上。这些坑我都在上面的函数里处理好了,直接抄。

收藏这篇,下次看Transformer源码看到LayerNorm,一眼就知道它在干什么。下期ML数学基础第6期,讲"学习率太大模型直接炸:梯度更新的数学直觉",关注我不错过。

评论区聊聊:你在训模型时遇到过loss突然变nan吗?最后查出来是什么原因?我是Cyrus。

赞(0)
未经允许不得转载:网硕互联帮助中心 » Transformer为什么离不开LayerNorm:3个NumPy实验实战讲透,ML数学基础第5期
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!