LLM:Large Language Mode
Transformer 完整工作原理、底层单元拆解
先澄清一个关键点:Transformer 依然是人工神经网络,但它不是传统感知机那种单个神经元堆叠的视角,它的基础单元是向量、矩阵运算、多头注意力、MLP;但里面依然包含神经元、权重连接、激活函数。
传统神经网络(MLP/CNN):最小单元 = 神经元 ,神经元做加权求和 + 激活。
Transformer:最小计算单元依然是神经元 ,只是大量神经元被组织成线性层(矩阵乘法),再搭配自注意力机制,不再是卷积或者时序循环。
论文:Attention Is All You Need (2017)
核心:不再依靠循环结构,依靠自注意力建模序列内全部位置之间的依赖关系。
一、先回顾基础:人工神经元(感知机)
所有神经网络的原子单元:神经元
y=σ(∑i=1nwixi+b)y = \sigma\left(\sum_{i=1}^n w_i x_i + b\right)y=σ(∑i=1nwixi+b)
- xix_ixi:输入(来自上一层神经元输出)
- wiw_iwi:神经连接权重(可训练参数)
- bbb:偏置
- σ\sigmaσ:激活函数(你说的阈值函数,感知机是阶跃阈值;深度学习一般不用阶跃,用非线性激活 ReLU/GELU)
一层全连接层 nn.Linear(in_dim, out_dim) 本质就是一堆神经元并行:
输入向量 x\boldsymbol xx,维度为 in;权重矩阵 W\boldsymbol WW,维度 out×in;偏置向量 b\boldsymbol bb,维度 out
y=Wx+b\boldsymbol y = \boldsymbol W \boldsymbol x + \boldsymbol by=Wx+b
矩阵的每一行,对应一个神经元的权重 wiw_iwi;输出向量的每一个元素,就是一个神经元的输出。
所以:线性层 = 并行的一组神经元,神经连接保存在权重矩阵 W 中 。
Transformer 里几乎所有可学习参数,都存放在各个线性层的权重矩阵里。
二、Transformer 整体结构总览
原始 Transformer = Encoder 堆栈 + Decoder 堆栈
- Encoder:双向自注意力,看到整段输入序列;用于理解(BERT 只用 Encoder)
- Decoder:掩码自注意力 + 交叉注意力;自回归生成(GPT 只用 Decoder)
数据流顺序:
- 输入 Token → Embedding 层(查找表,本质也是线性层)
- 加上位置编码 Positional Encoding
- 送入 N 层堆叠 Encoder(可选)
- Decoder 输入(已经生成的 token)→ Embedding + 位置编码
- 送入 N 层堆叠 Decoder
- Decoder 输出 → 线性层 + Softmax,预测下一个 token 概率
每一层 Encoder / Decoder Block 内部都有残差连接 + LayerNorm。
2.1 Embedding 嵌入层(词嵌入)
Embedding 层 nn.Embedding(vocab_size, d_model)
- 输入:token 整数索引(单词编号)
- 参数:嵌入矩阵 E∈Rvocab_size×dmodel\boldsymbol E \in R^{vocab\size \times d{model}}E∈Rvocab_size×dmodel
- 作用:查表,把离散单词编号映射为连续向量 e∈Rdmodel\boldsymbol e \in R^{d_{model}}e∈Rdmodel
- 本质:一个特殊的线性层,没有偏置,输入是 one-hot 编码
e=E⊤⋅onehot(token_idx)\boldsymbol e = \boldsymbol E^\top \cdot \text{onehot(token\_idx)}e=E⊤⋅onehot(token_idx)
dmodeld_{model}dmodel:模型维度,向量长度,代表每个 token 用多少个神经元表示(例如 512)
每个 token,最终用一个长度为 (d_{model}) 的向量表示,向量里每一个元素,对应一个神经元的激活值。
2.2 位置编码 Positional Encoding
Transformer没有时序感知能力 ,注意力机制本身对位置是置换不变的。
必须手动注入位置信息,原始论文用三角函数位置编码:
PE(pos,2i)=sin(pos100002i/dmodel)PE(pos,2i+1)=cos(pos100002i/dmodel) \begin{aligned} PE_{(pos,2i)} &= \sin\left(\frac{pos}{10000^{2i/d_{model}}}\right)\\ PE_{(pos,2i+1)} &= \cos\left(\frac{pos}{10000^{2i/d_{model}}}\right) \end{aligned} PE(pos,2i)PE(pos,2i+1)=sin(100002i/dmodelpos)=cos(100002i/dmodelpos)
-
pos:token 在序列中的位置
-
pos:token 在序列中的位置
-
i:向量维度下标
将 PE 和 embedding 向量逐元素相加。
⚠️ 位置编码没有可训练权重 ,没有神经元,只是固定函数。
现在很多模型改用可学习位置编码:就是一个 Embedding 层,参数可训练。
三、Encoder Block 详细拆解(核心单元)
Encoder 由 N 个完全相同的 Block 堆叠。每个 Block 包含两个子层:
- 多头自注意力层 Multi-Head Self-Attention
- 前馈网络 FFN(两层 MLP)
每一个子层都遵循:
SubLayerOutput=LayerNorm(x+Sublayer(x))\text{SubLayerOutput} = \text{LayerNorm}(x + \text{Sublayer}(x))SubLayerOutput=LayerNorm(x+Sublayer(x))
也就是:残差连接 + 层归一化(Pre-LN / Post-LN,原始论文是 Post-LN)
3.1 多头自注意力 Multi-Head Self-Attention
3.1.1 单头自注意力 Single-Head Attention
输入:序列矩阵 X\boldsymbol XX,维度 L×dmodelL \times d_{model}L×dmodel,L 序列长度。
用 3 个独立线性层(3 组神经元权重矩阵),投影得到 Q, K, V:
Q=XWQ,WQ∈Rd_model×dkK=XWK,WK∈Rd_model×dkV=XWV,WV∈Rd_model×dv \begin{aligned} Q &= X W_Q,\quad W_Q \in R^{d\_model \times d_k}\\ K &= X W_K,\quad W_K \in R^{d\_model \times d_k}\\ V &= X W_V,\quad W_V \in R^{d\_model \times d_v} \end{aligned} QKV=XWQ,WQ∈Rd_model×dk=XWK,WK∈Rd_model×dk=XWV,WV∈Rd_model×dv
(W_Q,W_K,W_V) 就是神经连接权重矩阵,里面全是可训练的连接权重;每一列 / 行对应神经元。
注意力计算公式:
Attention(Q,K,V)=softmax(QK⊤d_k)V\text{Attention}(Q,K,V)=\text{softmax}\left(\frac{QK^\top}{\sqrt{d\_k}}\right)VAttention(Q,K,V)=softmax(d_k QK⊤)V
分步解释:
- QK⊤QK^\topQK⊤:计算每一个 token(Q)和所有 token(K)之间相似度,得到相似度矩阵 L×LL\times LL×L。矩阵元素代表两个 token 的关联强度。
- /d_k/\sqrt{d\_k}/d_k :缩放因子。维度 d_kd\_kd_k 越大,内积值越大,softmax 输出会变得极度尖锐,梯度消失。缩放用来稳定梯度。
- softmax\text{softmax}softmax:激活函数,把相似度转为概率权重,所有权重和为 1。
softmax(zi)=ezi∑jezj\text{softmax}(z_i)=\frac{e^{z_i}}{\sum_j e^{z_j}}softmax(zi)=∑jezjezi
softmax 不是单个神经元阈值函数,是对一组输出做归一化。
- 和 V 相乘:对 value 向量做加权求和,权重就是注意力分数。得到每个 token 融合全局信息后的新向量。
3.1.2 多头注意力 Multi-Head
把 (Q,K,V) 在特征维度切分成 h 个头(head)
headi=Attention(QWQi,KWKi,VWVi)MultiHead(Q,K,V)=Concat(head1,...,headh)WO\begin{aligned} \text{head}i &= \text{Attention}(Q W{Q_i}, K W_{K_i}, V W_{V_i}) \\ \text{MultiHead}(Q,K,V) &= \text{Concat}(\text{head}_1,\dots,\text{head}_h) W_O \end{aligned}headiMultiHead(Q,K,V)=Attention(QWQi,KWKi,VWVi)=Concat(head1,...,headh)WO
- h:头数,原始论文 h=8,d_model=512h=8, d\_model=512h=8,d_model=512,每个头维度 d_k=d_model/h=64d\_k = d\_model/h = 64d_k=d_model/h=64
- 每个头拥有独立的 WQ_i,WK_i,WV_iW_{Q\i},W{K\i},W{V\_i}WQ_i,WK_i,WV_i 权重,各自在不同语义子空间学习依赖关系
- 拼接所有头输出,再乘输出投影矩阵 WOW_OWO(又是一组神经元权重)
多头注意力内部的参数本质:全部是线性层权重(神经连接),没有卷积,没有循环单元。
掩码注意力 Masked Attention(Decoder 里):在 softmax 之前,给未来位置加上 −∞-\infty−∞,softmax 之后对应权重变成 0,保证 token 看不到未来位置。
masked score matrix=QK⊤/d_k+M\text{masked score matrix} = QK^\top/\sqrt{d\_k} + Mmasked score matrix=QK⊤/d_k +M
M 是掩码矩阵,上三角为 −∞-\infty−∞,下三角和对角线为 0。
3.2 FFN 前馈网络 Feed Forward Network(Transformer 里的 MLP)
这部分最贴近传统神经元堆叠!
原始论文 FFN:
FFN(x)=max(0,xW1+b1)W2+b2\text{FFN}(x) = \max(0, x W_1 + b_1) W_2 + b_2FFN(x)=max(0,xW1+b1)W2+b2
两层全连接网络:
- 第一层线性层:W1∈Rd_model×d_ffW_1 \in R^{d\_model \times d\_ff}W1∈Rd_model×d_ff,把维度从 d_modeld\_modeld_model 放大到 d_ffd\_ffd_ff(论文 d_ff=2048d\_ff=2048d_ff=2048)
z1=xW1+b1z_1 = x W_1 + b_1z1=xW1+b1
输出 z1z_1z1 的每个元素 = 一个神经元加权求和结果 - 激活函数:max(0,z1)\max(0,z_1)max(0,z1),也就是 ReLU(你说的阈值函数:小于 0 直接置 0,大于 0 原样输出)
现代模型 GPT、LLaMA 换成 GELU,平滑版 ReLU。
- 第二层线性层:W2∈Rd_ff×d_modelW_2\in R^{d\_ff\times d\_model}W2∈Rd_ff×d_model,映射回原始维度 d_modeld\_modeld_model
out=z1W2+b2\text{out} = z_1 W_2 + b_2out=z1W2+b2
FFN 特点:对序列中每个 token,独立计算,token 之间互不干扰。注意力是 token 之间互相交换信息;FFN 是单独对每个 token 内部特征做非线性变换。
FFN 的参数:W1,b1,W2,b2W_1,b_1,W_2,b_2W1,b1,W2,b2,全部是神经元连接权重与偏置。
3.3 残差连接 Residual Connection
xout=x+Sublayer(x)x_{\text{out}} = x + \text{Sublayer}(x)xout=x+Sublayer(x)直接把输入原样加到子层输出。
目的:解决深层网络梯度消失 ,让梯度可以沿着直连通路直接回传。
残差连接没有参数,没有神经元,只是向量加法。
3.4 Layer Normalization 层归一化
原始论文:Post-LN(子层输出 + 残差之后做 LN);现在主流大模型用 Pre-LN(先 LN 再送入子层)。
LayerNorm(x)=γ⋅x−μσ2+ϵ+β\text{LayerNorm}(\boldsymbol x)=\gamma \cdot \frac{\boldsymbol x - \mu}{\sqrt{\sigma^2+\epsilon}} + \betaLayerNorm(x)=γ⋅σ2+ϵ x−μ+β
- μ\muμ:样本向量均值;σ2\sigma^2σ2:方差
- γ,β\gamma,\betaγ,β:可训练缩放、偏移参数(两个向量,属于可学习参数,简单理解为一组神经元参数)
- ϵ\epsilonϵ:极小常数防止除 0
作用:把向量分布拉到均值 0 方差 1,稳定训练。
BatchNorm 是对 batch 维度归一化;LayerNorm 对单个 token 的特征维度归一化,Transformer 用 LN。
四、Decoder Block 详细拆解
Decoder Block 三层子层:
- 掩码多头自注意力 Masked Multi-Head Self-Attention:只能看到当前位置及之前 token,不能偷看未来。
- 交叉注意力 Cross-Attention :Q 来自 Decoder 上一层输出;K,V 来自 Encoder 输出。
作用:让生成的每一步,读取输入序列(Encoder 的上下文)。 - FFN 前馈网络,和 Encoder FFN 完全一样。
同样:每一层子层都带残差连接 + LayerNorm。
Cross-Attention 交叉注意力公式
CrossAttention(Q,K,V)=softmax(QK⊤d_k)V\text{CrossAttention}(Q,K,V)=\text{softmax}\left(\frac{QK^\top}{\sqrt{d\_k}}\right)VCrossAttention(Q,K,V)=softmax(d_k QK⊤)V
- Q:Decoder 侧当前生成序列
- K,VK,VK,V:Encoder 输出的记忆向量
权重矩阵 WQ,WK,WV,WOW_Q,W_K,W_V,W_OWQ,WK,WV,WO 是 Decoder 交叉注意力自己独立的神经连接参数,不和 Encoder 共享。
五、输出层
Decoder 最后输出向量 x\boldsymbol xx,维度 d_modeld\_modeld_model
- 线性层:Wfinal∈Rd_model×vocab_sizeW_{final}\in R^{d\model\times vocab\size}Wfinal∈Rd_model×vocab_size,映射到词表大小维度
z=xWfinal+bfinal\boldsymbol z = x W{final}+b{final}z=xWfinal+bfinal - Softmax:把 z\boldsymbol zz 转为各个单词的概率分布。
- 预测概率最高 token 作为下一个词,自回归生成。
很多实现中,这个最终线性层权重和 Embedding 层权重共享,减少参数量。
六、Transformer 里的神经元、神经连接、阈值函数
6.1 神经元
-
传统 MLP:画出一个个圆圈(神经元),每个神经元独立做加权求和 + 激活。
-
Transformer:所有线性层(投影矩阵、FFN)底层就是大量神经元并行计算。
-
例如 FFN 第一层 d_model=512,d_ff=2048d\_model=512,d\_ff=2048d_model=512,d_ff=2048:这一层有2048 个神经元。每个神经元接收 512 个输入,对应 512 条神经连接权重。
-
注意力机制不是神经元,是信息聚合操作;但是注意力内部 QKV 投影矩阵,依然是神经元构成的线性层。
一句话区分:
FFN、Embedding、QKV 投影、输出层:由神经元构成
自注意力、残差、LayerNorm、位置编码:不是神经元,是对神经元输出向量的运算。
6.2 神经连接
神经连接就是权重矩阵里每一个权重 w :
权重矩阵 W∈RM×N\boldsymbol W\in R^{M\times N}W∈RM×N,一共有 M×NM\times NM×N 个权重,对应 M×NM\times NM×N 条神经连接。
- WQ,WK,WV,WOW_Q,W_K,W_V,W_OWQ,WK,WV,WO:注意力的神经连接权重
- W1,b1,W2,b2W_1,b_1,W_2,b_2W1,b1,W2,b2:FFN 的神经连接权重 + 偏置
- Embedding 矩阵:词嵌入的连接权重
训练过程:反向传播,不断更新这些权重(神经连接强度)。
6.3 阈值 / 激活函数
- ReLU :σ(z)=max(0,z)\sigma(z)=\max(0,z)σ(z)=max(0,z)。经典阈值型激活,小于 0 直接截断,原始 Transformer FFN 使用。
- GELU:现代大模型(GPT、LLaMA)替换 ReLU,平滑非线性。
- Softmax:注意力分数、输出概率,归一化激活,不是单神经元阈值。
- LayerNorm:不是激活函数,是归一化。
老式感知机用阶跃阈值函数(大于阈值输出 1 否则 0),深度学习几乎不用阶跃函数,因为不可导,无法反向传播。
七、数据流完整例子(极简)
输入句子:我爱AI,token 序列长度 L=3,(d_{model}=512)
- token id → Embedding 得到 3×512 矩阵
- 加上位置编码 3×512
- Encoder 多头自注意力:
- QKV 投影:3 个线性层,得到 Q,K,V(3×512)
- 切分成 8 个头,分头计算注意力分数
- 拼接 + 输出投影,得到注意力输出 3×512
- 残差 + LN → FFN:
- 线性层升到 2048 维 → ReLU → 线性层回到 512 维
- 残差 + LN,得到 Encoder 输出。Decoder 读取这个输出做交叉注意力,循环生成。
八、结束语
常见误区:
- Transformer 的注意力是神经元 :不是。注意力是向量加权聚合;QKV 投影才是神经元线性层。
- 没有神经元 :错。Transformer 绝大部分参数,都在 FFN 和 QKV 线性层,本质就是大量神经元。
- 位置编码是可学习神经元:原始论文 PE 固定;现在很多模型 PE 是 Embedding(可学习神经元)。