参考:
大语言模型中一个"计算块"是由多个 自注意(self-attention)和反向传播组成, 然而一般LLM使用的是 masked self-attention 以及 multi-headed self-attention。
masked and self-attention
masked self-attention相较于一般的self-attention更轻量化,因为只考虑每个token之前的部分。对于一个序列中的一个token,仅仅计算序列中 当前token之前的 注意力分数。
换句话说,当前token之后的 注意力权重实际被 “遮住了”, 相当于当模型预测下一个输出时候,防止模型“提前偷看”。
先回顾self-attention, 对于一个token, 将其对应的query向量与其他token对应的Key 向量相乘,得到该token的权重向量,假设该token是第i个词,整个sequence长度为T,则token的权重向量中只有前i个元素有值,之后的部分被masked掉。然后将权重向量与value向量 相乘。
以下面例子距离,对于下面一个句子:
a robot must obey the orders given it
我们关注it时, 先得到it的Query向量,和 其他词的 key向量相乘,得到了**其他词 ** 相对于 当前词的注意力得分。
然后将 每个词的value 和注意力得分加权求和。
比如上图中,取出it的Query向量,与其他词的Key向量点乘,(还需要softmax处理),得到其他每个词对应的注意力得分
将每个词的value向量乘以其对应的注意力得分,最后求和,即得到自注意力层的输出向量
那么什么事Multi-Headed attention呢?
Multi-Headed attention
简单的一句话说明,多头注意力,实际上就是把 单个的Q,K,V 向量分裂为多个部分,然后挨个执行self-attention, 然后再将结果拼接。
例如,假如Q,K,V向量都是768维, 注意力头有12个,将QKV分别分为12份,每一份称为一个Head, 那么每一个Head 对应长度Head size 为 64. (12 * 64 = 768)
12个Head中的其中3个可以想象类似如下:
每一个头也都有Q,K, V 向量。
然后计算注意力得分
每个注意力头的计算过程是一样的,以其中一个举例
当前关注的token,与其他token的K向量相乘再经过softmax得到注意力得分,然后和self-attention一样,将每个token的value向量与注意力得分相乘,然后计算加权和
将每个词的value向量和注意力得分相乘,然后求和,得到了该注意力头 的 self-attention 结果:
Multi-Head self-attention 对应多个加权和向量,再拼接回去,便得到Multi-Headed self-attention结果
为了得到multi-head attention想要的维度,可以再进行一次现行映射,使用一个权重矩阵,将注意力头的结果映射到 self-attention的输出