transform
token
-
Token是文本被分割后得到的基本单位,可以是:
- 一个单词(如
apple
、computer
) - 一个子词(如
compu
和ter
) - 一个字符(如
a
、b
) - 特殊符号(如
[CLS]
、[SEP]
)
Transformer模型中,
输入文本通常被转换成一个Token序列进行处理
- 一个单词(如
-
tokenization
- 将输入文本切分为Token
- 空格分割:将句子按空格分成单词
- 子词分割(Subword Tokenization):通过算法(如BPE、WordPiece)分解单词为常见的子词片段
- 每个Token被映射为一个唯一的整数ID,这样可以供模型处理。这个过程需要一个词汇表(Vocabulary),其中定义了所有Token和其对应的ID
- 将输入文本切分为Token
-
Transformer中的特殊Token
- [CLS]:用于表示句子的整体信息(分类任务中常用)
- [SEP]:用于分隔不同的句子
- [PAD]:用于填充短序列,使其长度一致
- [MASK]:用于遮蔽某些Token(如在BERT中进行掩码语言模型训练时)
-
分割后的Token需要转为数值才能输入模型
- Embedding:每个Token ID被映射到一个高维向量(如128维或768维)
- 加上位置信息:通过位置编码(Positional Encoding)添加序列位置信息,使模型感知Token之间的顺序关系
eg:
以句子"I am learning Transformer"
为例,Tokenization过程:
- 分词:
["I", "am", "learning", "Transformer"]
- 转为ID:
[101, 1045, 2572, 7865, 12190, 102]
101
是[CLS]102
是[SEP]
- Embedding:将这些ID映射到向量空间
Embedding
-
Embedding是一种将离散的Token(如单词或子词)映射到连续的高维向量空间的方式。这些向量捕捉了Token之间的语义关系
-
Embedding的输入和输出
-
Token的ID序列。例如:
[101, 1045, 2572, 7865, 102]
这里
101
是[CLS],102
是[SEP] -
每个Token的高维向量表示(通常是固定维度,例如512或768)
-
-
词嵌入矩阵
-
定义:一个可训练的矩阵,大小为
(词汇表大小 × 向量维度)
例如,如果词汇表有30,000个Token,向量维度为512,则Embedding矩阵大小为
30,000 × 512
-
根据Token的ID,从矩阵中查找对应的行,得到该Token的嵌入向量
-
-
Transformer不具有内置的顺序感知能力,因此需要在Token的Embedding中加入位置信息
- 绝对位置编码(常见于标准Transformer):直接加上固定的位置向量
- 相对位置编码(一些改进版模型):通过相对距离计算位置关系
- 为了引入序列的顺序信息,每个位置 i会被加上一个位置编码向量 pi,pi是根据固定公式生成的,比如正弦和余弦函数
-
每个Token的嵌入向量相加后,生成一个序列嵌入
-
假设Token的Embedding为E,位置信息为P,最终的输出为H:
H = E + P
eg:
Token ID: [101, 1045, 2572, 7865, 102]
- 通过词嵌入矩阵查找对应向量:
- [101] → [0.1, 0.2, …, 0.5]
- [1045] → [0.3, 0.8, …, 0.7]
- 加上位置信息:
- [0, 1, 2, 3, 4] → [0.01, 0.02, …, 0.05]
- 输出最终嵌入序列(形状为
(序列长度 × 嵌入维度)
)
Self-Attention机制
输入:一个序列的嵌入向量,形状为 (序列长度,嵌入维度),即上述 词嵌入矩阵查找对应向量 与 位置信息对应嵌入维度相加
输出:同样形状的序列表示,每个Token的表示整合了与序列中其他Token的关系
-
生成Query、Key、Value;通过三组权重矩阵,将每个嵌入向量映射为:
-
Query(查询向量):表示当前Token在寻找其他Token时的"问题"
-
Key(键向量):表示其他Token对当前查询的"响应程度"
-
Value(值向量):提供具体的信息内容
-
Q = X W Q , K = X W K , V = X W V Q=XW^Q , K=XW^K , V=XW^V Q=XWQ,K=XWK,V=XWV
-
-
计算注意力得分
-
对每个Token的Query与所有Key进行点积,得到注意力得分:
S c o r e ( Q , K ) = Q ⋅ K T Score(Q,K)=Q⋅K^T Score(Q,K)=Q⋅KT -
得分越高,表示两个Token的关系越紧密
-
-
归一化得分(Softmax)
-
将分数通过Softmax转化为概率分布,确保所有关系的权重和为1:
A t t e n t i o n ( Q , K ) = S o f t m a x ( Q ⋅ K T d k ) Attention(Q,K)=Softmax(\frac{Q⋅K^T} {\sqrt{d_k}}) Attention(Q,K)=Softmax(dkQ⋅KT) -
d k d_k dk是Key的维度,用来避免分值过大导致梯度消失问题
-
-
用注意力权重对Value向量进行加权求和,得到每个Token的最终表示:
O u t p u t = A t t e n t i o n ( Q , K ) ⋅ V Output=Attention(Q,K)⋅V Output=Attention(Q,K)⋅V
单头注意力
eg:
-
输入序列为
["I", "am", "learning"]
,其嵌入表示为:
X = ( 1 0 0 1 1 1 ) X= \begin{pmatrix} 1 & 0 \\ 0 & 1 \\ 1 & 1 \\ \end{pmatrix} X= 101011
其中每行代表一个Token的嵌入向量 -
生成Query、Key、Value 用权重矩阵 WQ,WK,WV 线性变换输入嵌入:
Q = X ⋅ W Q , K = X ⋅ W K , V = X ⋅ W V Q=X⋅W_Q ,K=X⋅W_K ,V=X⋅W_V Q=X⋅WQ,K=X⋅WK,V=X⋅WVW Q = ( 1 0 0 1 ) W_Q= \begin{pmatrix} 1 & 0 \\ 0 & 1 \\ \end{pmatrix} WQ=(1001)
W K = ( 0 1 1 0 ) W_K= \begin{pmatrix} 0 & 1 \\ 1 & 0 \\ \end{pmatrix} WK=(0110)
W Q = ( 1 2 2 3 ) W_Q= \begin{pmatrix} 1 & 2 \\ 2 & 3 \\ \end{pmatrix} WQ=(1223)
计算出Q、K、V
Q = X ⋅ W Q = ( 1 0 0 1 1 1 ) Q=X⋅W_Q= \begin{pmatrix} 1 & 0 \\ 0 & 1 \\ 1 & 1 \\ \end{pmatrix} Q=X⋅WQ= 101011 K = X ⋅ W K = ( 0 1 1 0 1 1 ) K=X⋅W_K= \begin{pmatrix} 0 & 1 \\ 1 & 0 \\ 1 & 1 \\ \end{pmatrix} K=X⋅WK= 011101
V = X ⋅ W V = ( 1 2 2 3 3 5 ) V=X⋅W_V= \begin{pmatrix} 1 & 2 \\ 2 & 3 \\ 3 & 5 \\ \end{pmatrix} V=X⋅WV= 123235
-
计算注意力得分
对每个Token的 Query 和所有 Token 的 Key 计算点积:
S c o r e ( Q , K ) = Q ⋅ K T = ( 0 1 1 1 0 1 1 1 2 ) Score(Q,K)=Q⋅K_T= \begin{pmatrix} 0 & 1 & 1 \\ 1 & 0 & 1 \\ 1 & 1 & 2 \\ \end{pmatrix} Score(Q,K)=Q⋅KT= 011101112
行表示Query(当前Token)
,列表示Key(其他Token)
-
将每行通过Softmax归一化,得到每个Query对应的注意力权重:
A t t e n t i o n ( Q , K ) = S o f t m a x ( Q ⋅ K T d k ) Attention(Q,K)=Softmax(\frac{Q⋅K^T} {\sqrt{d_k}}) Attention(Q,K)=Softmax(dkQ⋅KT)Q ⋅ K T d k = ( 0 0.707 0.707 0.707 0 0.707 0.707 0.707 1.414 ) \frac{Q⋅K^T} {\sqrt{d_k}}= \begin{pmatrix} 0 & 0.707 & 0.707 \\ 0.707 & 0 & 0.707 \\ 0.707 & 0.707 & 1.414 \\ \end{pmatrix} dkQ⋅KT= 00.7070.7070.70700.7070.7070.7071.414
-
计算Softmax(对每行单独归一化):
第一行:
S o f t m a x ( 0 , 0.707 , 0.707 ) = [ 0.226 , 0.387 , 0.387 ] Softmax(0,0.707,0.707)=[0.226,0.387,0.387] Softmax(0,0.707,0.707)=[0.226,0.387,0.387]
…
A t t e n t i o n = ( 0.226 0.387 0.387 0.387 0.226 0.387 0.274 0.274 0.452 ) Attention= \begin{pmatrix} 0.226&0.387&0.387 \\ 0.387&0.226&0.387 \\ 0.274&0.274&0.452 \\ \end{pmatrix} Attention= 0.2260.3870.2740.3870.2260.2740.3870.3870.452 -
用注意力权重对Value矩阵加权求和:
O u t p u t = A t t e n t i o n ( Q , K ) ⋅ V Output=Attention(Q,K)⋅V Output=Attention(Q,K)⋅V$$
\begin{pmatrix}
0.226&0.387&0.387 \
0.387&0.226&0.387 \
0.274&0.274&0.452 \
\end{pmatrix} *
\begin{pmatrix}
1 & 2 \
2 & 3 \
3 & 5 \
\end{pmatrix}\begin{pmatrix}
2.161 & 3.387 \
2.387 & 3.548 \
2.774 & 4.161 \
\end{pmatrix}
$$
每行对应序列中一个Token的新表示,这个表示综合了序列中其他Token的关系
多头注意力
多头注意力(Multi-Head Attention, MHA)是单头注意力的扩展,其核心思想是通过并行计算多个注意力机制,捕获不同子空间的语义特征
-
输入序列:
["I", "am", "learning"]
,嵌入维度
d m o d e l = 4 使用 2 个头,每个头的维度为 d h = d m o d e l / h = 2 d_model = 4 \\ 使用2个头,每个头的维度为 \\ d_h=d_model/h=2 dmodel=4使用2个头,每个头的维度为dh=dmodel/h=2 -
与上面的单头注意力同理,不过此时使用2个头,使用2个Q、K、V
Q 1 = X ⋅ W Q , 1 , K 1 = X ⋅ W K , 1 , V 1 = X ⋅ W V , 1 Q 2 = X ⋅ W Q , 2 , K 2 = X ⋅ W K , 2 , V 2 = X ⋅ W V , 2 Q_1=X⋅W_Q,_1, \\ K_1=X⋅W_K,_1, \\ V_1=X⋅W_V,_1 \\ \\ Q_2=X⋅W_Q,_2, \\ K_2=X⋅W_K,_2, \\ V_2=X⋅W_V,_2 Q1=X⋅WQ,1,K1=X⋅WK,1,V1=X⋅WV,1Q2=X⋅WQ,2,K2=X⋅WK,2,V2=X⋅WV,2 -
同理,计算出Output1、Output2
-
将两个头的输出拼接:
C o n c a t ( O u t p u t 1 , O u t p u t 2 ) = ( 2.161 3.387... 2.387 3.548... 2.774 4.161... ) Concat(Output1,Output2)= \begin{pmatrix} 2.161 & 3.387 ...\\ 2.387 & 3.548 ...\\ 2.774 & 4.161 ...\\ \end{pmatrix} Concat(Output1,Output2)= 2.1612.3872.7743.387...3.548...4.161... -
通过全局权重矩阵W_o投影会原始嵌入维度
F i n a l O u t p u t = C o n c a t ( O u t p u t 1 , O u t p u t 2 ) ∗ W o Final Output=Concat(Output1,Output2)*W_o FinalOutput=Concat(Output1,Output2)∗Wo
每个头独立捕获序列中不同的特征;
多个头的输出拼接后,通过线性层融合,得到综合后的序列表示
输出的形状与输入一致(序列长度 × 嵌入维度)
Masked self_attention
Masked Self-Attention 是 Self-Attention 的一种变体,主要用于 Transformer Decoder 中。其目的是在序列生成时,确保第 𝑡 个位置的输出只能依赖当前及之前的输入,而不能看到未来的输入(因果性)
目的:
- 在生成任务中(如机器翻译或文本生成),模型生成第 𝑡 个词时,不能看到第 𝑡+1、第 t+2 等未来位置的词
- 屏蔽未来词可以保证模型的预测是基于当前信息,不会泄露未来信息
注意力屏蔽原理:
-
在计算注意力权重时,对不允许访问的位置设置为 负无穷值,通过 Softmax 函数将这些位置的权重强制归一化为 0
A t t e n t i o n ( Q , K ) = S o f t m a x ( Q ⋅ K T d k + M ) ∗ V Attention(Q,K)=Softmax(\frac{Q⋅K^T} {\sqrt{d_k}} + M)*V Attention(Q,K)=Softmax(dkQ⋅KT+M)∗V
M:掩码矩阵,用于屏蔽未来的 Token- 如果位置i可以访问j,则 M i , j = 0 M_i,_j = 0 Mi,j=0
- 如果位置i不可以访问j,则 M i , j = − ∞ M_i,_j = -∞ Mi,j=−∞
设 M = ( 1 − ∞ − ∞ 0 0 − ∞ 0 0 0 ) 设M= \begin{pmatrix} 1&-∞&-∞\\ 0&0&-∞\\ 0&0&0\\ \end{pmatrix} 设M= 100−∞00−∞−∞0
-
Softmax:遇到负无穷时,该位置的权重为 0
Feed-Forward Network FFN
在 Transformer 的每个编码器(Encoder)和解码器(Decoder)层中,除了注意力机制,还包含一个 前馈神经网络 (FFN);
FFN 的作用是对注意力层的输出进行逐位置的非线性变换,从而提升特征表达能力
-
FFN 是一个位置独立的两层全连接神经网络,通常的公式为:
F F N ( x ) = R e L U ( x W 1 + b 1 ) W 2 + b 2 FFN(x)=ReLU(xW 1 +b 1 )W 2 +b 2 FFN(x)=ReLU(xW1+b1)W2+b2 -
输入与输出维度:
- 输入向量维度:𝑑_model比如 512 或 768)
- 输出向量维度:保持为 d_modeld
- 隐藏层的维度:𝑑_ffn(通常比 d_model 大,比如 2048)
-
FFN 位于每一层注意力机制的后面。具体来说:
-
输入:来自注意力模块的输出
-
输出:作为当前层的最终输出,传递给下一层
-
FFN 的计算与 Layer Normalization 和残差连接结合在一起:
O u t p u t = L a y e r N o r m ( x + F F N ( x ) ) Output=LayerNorm(x+FFN(x)) Output=LayerNorm(x+FFN(x))
-
-
FFN 的作用:通过逐位置处理,提升特征表达能力
-
与注意力的结合:FFN 提供局部非线性特征提取,与注意力机制的全局特征提取互补
输入与输出维度:
-
输入向量维度:𝑑_model比如 512 或 768)
-
输出向量维度:保持为 d_modeld
-
隐藏层的维度:𝑑_ffn(通常比 d_model 大,比如 2048)
-
FFN 位于每一层注意力机制的后面。具体来说:
-
输入:来自注意力模块的输出
-
输出:作为当前层的最终输出,传递给下一层
-
FFN 的计算与 Layer Normalization 和残差连接结合在一起:
O u t p u t = L a y e r N o r m ( x + F F N ( x ) ) Output=LayerNorm(x+FFN(x)) Output=LayerNorm(x+FFN(x))
-
-
FFN 的作用:通过逐位置处理,提升特征表达能力
-
与注意力的结合:FFN 提供局部非线性特征提取,与注意力机制的全局特征提取互补