大语言模型自注意力机制究竟是怎么工作的?
这一期用最直白的方式把大语言模型里的自注意力讲一遍,不做很深入的解析,目标是普通人看完也能大概明白 self-attention 到底是怎么回事。
以「我喜欢吃」为例。输入进入大语言模型之后,先走 tokenizer,再配合 word embeddings,得到这四个分词各自对应的向量;这些向量组成一个矩阵,跟着被送进 Transformer,而 Transformer 的第一层就是 self-attention。self-attention 内部有三个已经训练好的矩阵 Wq、Wk、Wv,作用就是算出每一个向量自己的 query、key 和 value。其中 query 是用来去问「我要找前面哪些词跟我相关」的,它需要跟前面其他词的 key 相乘;key 是这个向量的特征值;value 才是这个向量真正携带的信息。
每个向量分别乘上 Wq、Wk、Wv,就都得到了自己的 Q、K、V。轮到「吃」这个词时,就用它的 query 去乘第一个词「我」的 key。向量相乘就是点积,也就是一个向量的长度乘以另一个向量在它方向上的投影——两个向量方向越一致,说明越接近,乘出来的数字就越大。乘完「我」,再依次乘「喜」的 key、「欢」的 key,就得到一串各自的分数,也就是 score。
score 可能是个很大的值,所以这时候要先做缩放,用的就是向量的维度,比如这个向量是 4096 维。缩放完之后走一遍 softmax:把所有值加起来当分母,每一个值自己当分子,得到每个词对应的权重 W,比如「我」是 W1、「喜欢」那边是 W2、W3、W4,它们加起来刚好等于 1。
拿到权重之后,W1 去乘第一个词的 value(也就是「我」的 value),W2 去乘「喜」自己的 value,这样一个一个下来,再把结果全部相加,得到的就是「吃」这个词经过 self-attention 之后的向量输出。其他词也是一样,用同一套逻辑去算。这样输出的向量里,就把它的上下文信息压缩进去了。







