Transformer 中如何实现序列到序列的映射?
Transformer 中如何实现序列到序列的映射?
这道题考的是 Seq2Seq 的完整链路:输入怎么变成上下文向量,解码器怎么基于这个向量一个词一个词地吐出结果。核心是编码器-解码器架构和交叉注意力机制的理解。
我从四个方面来讲:整体骨架、编码器干了什么、解码器的注意力机制、自回归生成过程。
1. Seq2Seq 的核心骨架:编码器-解码器架构
先说整体思路。
Transformer 做序列到序列的映射,用的是编码器-解码器结构。输入序列先进编码器,编码器把它压缩成一个上下文向量,然后解码器基于这个向量逐词生成输出。
举个例子。翻译任务:"Hello, how are you?" → "你好,你好吗?"
编码器先把 "Hello, how are you?" 处理一遍,生成一个包含整句话信息的向量。解码器看着这个向量,一个词一个词往外蹦:"你" → "你好" → "你好," → "你好,你" → ... 直到生成结束符。
这个架构的本质是信息压缩 + 按序生成。编码器把不定长的输入压成一个固定大小的表示,解码器再从这个表示里往外掏东西。
2. 编码器:让每个词"看到"整句话
编码器内部是一堆 Transformer Block 堆起来的。每个 Block 里有两样东西:多头自注意力 + 前馈网络。
多头自注意力是核心。
它的作用是让每个词都能看到句子里的所有词,然后调整自己的表示。比如 "bank" 这个词,在 "river bank" 和 "bank account" 里意思完全不同。自注意力会看上下文,"river bank" 里的 bank 会多关注 "river","bank account" 里的 bank 会多关注 "account",从而得到不同的向量表示。
这就是编码器干的事:让每个词的表示融合了上下文信息。
残差连接和层归一化也必不可少。残差连接让梯度能直接传到底层,层归一化让训练更稳定。没有这两个东西,深层 Transformer 根本训练不动。
3. 解码器:掩码注意力与交叉注意力
解码器比编码器多一层东西:交叉注意力。
解码器里面有两层注意力,第一层叫掩码自注意力,第二层叫交叉注意力。
掩码自注意力是为了实现自回归生成。解码的时候,你只能看到已经生成的词,不能偷看还没生成的词。比如生成 "你好" 的时候,第二个字 "好" 只能看 "你",不能看 "好" 自己。
实现方式是给注意力加上一个掩码,把未来的位置遮住。数学上就是给那些不该看到的位置加上一个非常大的负数,让 softmax 之后变成 0。
交叉注意力才是连接编码器和解码器的桥梁。
解码器的 Query 来自解码器自己,但 Key 和 Value 来自编码器的输出。你可以理解成:解码器在问编码器,"根据输入,接下来该输出什么?"
举个例子。翻译 "Hello" → "你好"。解码器生成 "你" 的时候,交叉注意力会从编码器结果里找和 "你好" 最相关的信息。生成 "好" 的时候同理。
这就是 Seq2Seq 的核心:编码器理解输入,解码器查询编码结果来生成输出。
4. 自回归生成与位置编码
解码器是怎么一个词一个词往外蹦的?
首先,位置编码是必须的。注意力机制本身不感知位置,你把句子打乱,注意力算出来是一样的。位置编码把位置信息注入到词向量里,让模型知道 "这个词在第几位"。
然后是自回归生成的过程:
- 输入 (Begin of Sequence)开始符
- 解码器预测第一个词,比如 "你"
- 输入变成 你,预测第二个词 "好"
- 重复,直到输出 (End of Sequence)结束符
每一步的输出都会作为下一步的输入。这就是为什么叫 "自" 回归——用自己的输出当输入。
编码器只需要算一次,生成一个固定的上下文表示,解码的每一步都复用这个表示。这比 RNN 每次都要传隐藏状态高效多了。
面试怎么答
基础版(能过的回答)
Transformer 通过编码器-解码器架构实现 Seq2Seq。输入序列先通过编码器的多头自注意力生成上下文向量,解码器再基于这个向量逐词生成输出。
编码器用多头自注意力让每个词看到整句话的信息。解码器有两层注意力:掩码自注意力防止看到未来词,交叉注意力的 Q 来自解码器、K 和 V 来自编码器输出,负责从编码结果中检索信息。
生成时从开始符 开始,每次预测下一个词,把预测结果拼回去继续预测,直到输出结束符 。位置编码让模型感知词的顺序。
加分版(让面试官眼前一亮)
编码器-解码器架构的核心是信息传递解耦:编码器负责理解输入,解码器负责生成输出,两者通过交叉注意力连接。
相比 RNN,Transformer 的优势在于并行计算和全局感受野。编码器一次性处理整个序列,不需要循环;解码器虽然需要自回归,但每一步都能直接访问编码结果,不需要像 RNN 那样传递隐藏状态。
还有一个细节:编码器的输出在解码的每一步都被复用,而不是重新计算。这就是为什么 Transformer 比 LSTM 做长序列翻译效果好——RNN 的信息需要跨越很多时间步才能传过来,早期的信息容易被稀释;Transformer 任何两个位置之间只需要一步注意力就能建立联系。
一句话总结
Transformer 通过编码器压缩输入、解码器查询编码结果自回归生成,用交叉注意力连接编码和解码两个阶段,实现序列到序列的映射。
