跳转至

Transformers

1 组件细节

1.1 自注意力

RNN的缺点是难并行(激活层有串行的依赖关系) - 不好scale up,于是我们考虑把它替换成自注意力层。

image-20250411143310241

把每一个输入向量编码成qkv三个向量:

image-20250411143941153

使用自己的q和其他的k相乘、归一化计算两两之间的注意力:

image-20250411143915454

而我们可以把所有q拼到一起,把所有k拼到一起,矩阵相乘(可以使用GPU加速)算出所有的attention(再归一化):

image-20250411144247124

最后和v相乘得到编码结果: image-20250411144358673

1.2 多头注意力

我们的q编码取决于任务类型,而不同的任务类型可能会带来不同的q,所以这个时候就产生了多头注意力机制:

image-20250411144522378

但实操的时候就分开两组qk计算b,最后把两组b拼在一起: image-20250411144624776

1.3 位置编码

但是这样的self-attention丢掉了语序的信息,所以我们要在向量中加入位置信息的编码(最简单的方式就是在内容的向量中拼接一个one-hot representation,但是这样长度不定,而且耗费参数;我们通常直接在上面加一个位置编码):

image-20250411145251630

使用频率变化表示位置(从左到右一列代表一个位置,越靠后频率越高,既可以表达绝对位置也可以表达相对位置):

image-20250411145526795

2 整体架构

image-20250411145811826

transformer快在编码,解码是无法并行的。