transformer各层的输入输出
总结
层/组件 | 输入形状 | 输出形状 | 核心功能 |
---|---|---|---|
Input Embedding | [B, S] | [B, S, D] | 将离散token转为连续向量 |
Positional Encoding | [B, S, D] | [B, S, D] | 注入位置信息 |
Encoder MHA | [B, S, D] | [B, S, D] | 计算输入序列内部的上下文关系 |
Encoder FFN | [B, S, D] | [B, S, D] | 非线性变换,特征加工 |
Decoder Masked MHA | [B, T, D] | [B, T, D] | 计算已生成输出序列的内部关系 |
Decoder Cross-Attention | Q: [B, T, D] K,V: [B, S, D] | [B, T, D] | 让解码器关注编码器信息 |
Decoder FFN | [B, T, D] | [B, T, D] | 非线性变换,特征加工 |
Output Projection | [B, T, D] | [B, T, V] | 产生下一个词的概率分布 |
关键记忆点:
维度守恒: 除了最开始的Embedding和最后的输出层,所有核心层的输入输出维度都是
[batch_size, seq_len, d_model]
。信息流:
Encoder: 不断提炼和丰富输入序列的表示。
Decoder: 不断结合已生成输出和编码器信息,预测下一个词。
在Decoder的输入形状 [B, T, D]
中:
T
指的是目标序列(Target Sequence)在当前解码步骤时的长度。它的具体含义取决于模型是处于训练模式还是推理模式,这是理解Decoder工作的关键。
1. 训练阶段 (Training) 的 T
在训练时,我们使用的是教师强制(Teacher Forcing) 策略。
注:教师强制策略就是decoder阶段的输入使用训练集的真实的目标序列。
T
: 就是完整的目标序列(或标签序列)的长度。例如,在机器翻译中,输入英文“I love you”,目标输出是中文“我爱你”。那么这里的
T
就是 3(三个中文字符)。
工作流程:
我们将整个目标序列(例如,“我爱你”的token ID)一次性输入给Decoder。
Decoder内部的掩码自注意力机制会确保每个位置(第
i
个token)只能看到它自己以及它之前的所有位置(第1
到i-1
个token),而无法看到未来的信息。模型的任务是并行地预测出序列的下一个token。
根据输入
<SOS> 我
,预测下一个词应该是“爱”。根据输入
<SOS> 我 爱
,预测下一个词应该是“你”。根据输入
<SOS> 我 爱 你
,预测下一个词应该是<EOS>
(结束符)。
2. 推理/生成阶段 (Inference/Generation) 的 T
在推理时,我们没有真实的目标序列,需要模型自回归(Autoregressive) 地生成,即一个一个token地往外蹦。
T
: 指的是到当前生成步骤为止,已生成的序列长度。这是一个可变的数字,会随着生成的进行而不断增加(T = 1 -> 2 -> 3 -> ...
)。工作流程:
起始: 第一步,输入通常只是一个开始符
<SOS>
(形状是[B, 1, D]
,即T=1
)。模型输出第一个词的概率分布,我们选择概率最高的词(比如“我”)。循环:
第二步,我们将
<SOS>
和第一步生成的“我” 拼接起来,作为新的输入(形状是[B, 2, D]
,即T=2
)。模型输出下一个词的概率分布,选出“爱”。第三步,输入是
<SOS> 我 爱
([B, 3, D]
,T=3
),输出“你”。第四步,输入是
<SOS> 我 爱 你
([B, 4, D]
,T=4
),输出<EOS>
,生成结束。
推理时的特点:
串行处理: 生成过程是循环的、串行的,因此比训练慢得多。
T
是动态增长的: 从1开始,每生成一个token,T
就加1,直到遇到<EOS>
或达到最大长度限制。