上一章我们了解了自注意力机制如何实现”全局洞察”,但自注意力让所有词同时沟通,丢失了顺序信息。”猫追老鼠”和”老鼠追猫”意思完全不同。失去了顺序,AI如何知道谁在先、谁在后?此外,超深网络中层层的计算波动,如何保证训练稳定?
一、两个”不起眼”但关键的问题
2019年,有个公司在内部推广Transformer架构时,遇到了两个看似简单、实则棘手的问题。
问题1:顺序混乱
他们训练了一个翻译模型,输入”猫追老鼠”,期待输出”cat chases mouse”。
但模型有时会输出”mouse chases cat”(老鼠追猫)。
更诡异的是:同样的训练,每次结果可能不同。有时对,有时错,像抽奖一样。
问题2:训练不稳定
当他们尝试加深Transformer层数时(比如从6层加到12层),发现:
训练loss剧烈震荡
有时突然变成NaN(无穷大)
需要精心调学习率,否则就训崩
这两个问题让我们可以认识到到:自注意力机制很强大,但要让Transformer稳定工作,还需要其他技术的支持。
二、位置编码:给并行世界加上”时间戳”
问题的本质
自注意力机制是”词袋”(Bag of Words)模型。它把句子中所有词同时处理,但丢失了顺序信息。
对于自注意力来说,这三个句子是一样的:
“猫追老鼠”
“老鼠追猫”
“追猫老鼠”
因为自注意力只关心”猫”、“追”、”老鼠”这三个词的存在和关系,不关心它们的顺序。
解决方案:位置编码
位置编码(Positional Encoding)的想法很巧妙:给每个词一个独一无二的”位置密码”。
这个密码不是简单的1、2、3这样的数字,而是一组根据正弦余弦函数生成的波形信号。
具体实现
对于位置(第几个词)和维度
pos(词向量的第几维):
i
偶数维度:
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
奇数维度:
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))


