大语言模型中的注意力机制



论文信息 ¶

Attention is all you need!

论文原文 ¶

关键词 ¶

LLM; transformer;注意力机制

摘要 ¶

对于序列文本的处理,卷积神经网络和循环神经网络都不能很好地捕捉到文本中的上下文信息,他们只能基于固定的信息进行处理,因此作者提出了一种multi-head注意力机制来对序列文本进行处理的模型。这种模型可以很好地捕捉上下文信息中模型需要着重关注的部分,从而生成预测。这种transformer架构已经在多种大语言模型中使用。

收获 ¶

在模型中,将每个单词都用不同的向量表示,例如1000维的向量,训练完毕之后,语义相似的词在向量空间中的位置应该接近,拿GPT3为例子,训练完之后,男和女之间的向量差其实和king和queen之间的向量差大小和方向基本一致,因此训练的过程实际上就是改变这个向量表和其中不同层的参数的过程

Q (Query): 查询向量代表当前单词(或者在处理非语言任务时的其他类型数据点),用于查询其他数据点的相关性。 在Transformer中,每个单词都会生成一个Q向量,用来查找它与序列中其他单词的关系。 K (Key): 键向量代表序列中的单词,作为响应查询的参考点。 K向量用于与Q向量匹配,通过计算Q和K的点积来确定它们之间的关联程度。 V (Value): 值向量包含与序列中每个单词相关的信息,这些信息将在注意力机制中被提取,如果这个单词被认为与查询高度相关的话。 一旦根据Q和K的匹配确定了注意力权重,这些权重会被用来加权相应的V向量,从而得到加权的输出。 因此我们要得到当前单词和句子里其他单词的关系,我们就Q×KT,但是呈现当前单词时不能考虑后面单词的信息才符合常理,因此用上三角矩阵更新,然后在 乘上原本的信息V,这时候得到的,矩阵,每一行代表每个单词,列就代表了注意力和单词的综合信息。最后,如果我们有8个头,就把八个头的信息拼接起来

1.为什么要使用激活函数 如果全是线性层nn.linear,假设100次,那么实际上从输入到输出都是乘法,实际上我们只用做一次乘法,但却做了100次,因此效率低,100次全是线性变换。而激活函数可以添加一些非线性的变化。 Relu,小于0的全变0,大于0的不变 sigmoid,将值全部压缩到一个小范围,(0,1) tanh,包含了更多的指数运算,但长得和relu这个差不多,但范围是(-1,1)

2.模型如何区分同一个词的不同语义? server,may I have the check? I crashed the server。 server在两个句子里是不一样的意思,自注意力机制就是自动寻找最应该关注的词:have、crash,所以将输入的向量分别放进三个不同的线性层,生成K,Q,V Key就是为上面每个单词生成一个小的张量 Query就是寻找哪些是我最应该关注的词 K×Q就是注意力得分,例如可能the的注意力得分就低因为句句可能都有the,而check和crash注意力得分就高 将K×Q进行softmax转换之后,再把KQ这个注意力信息和V进行矩阵乘法,以防丢失原本的信息

3.mask的作用: 对于第一个单词(比如“我”在句子“I LOVE YOU”中),mask确保它在计算注意力时不考虑“LOVE”和“YOU”。 对于第二个单词“LOVE”,mask允许它看到“我”,但不允许看到“YOU”。 对于第三个单词“YOU”,mask允许它看到“我”和“LOVE”。 这种处理顺序意味着,尽管在物理上所有的单词都被同时处理(因为Transformer的Self-Attention是并行计算的),但通过mask的作用,每个单词在“看到”时仅限于考虑到它之前的单词和自己。这确保了生成过程中的自洽性和逻辑顺序。

4.注意力机制中的’head‘ 如果有8个头,输入维度是I LOVE YOU 3×1000 那么每个头就是3×125。在KQ和V乘积之后,再合并到一起,成为一个3×1000的矩阵,矩阵里 每一行:表示一个单词的更新后向量。例如,对于输入 “I LOVE YOU”,输出矩阵的第一行是单词 “I” 在经过多头注意力机制和相关变换后的表示;第二行是单词 “LOVE” 的更新表示;第三行是单词 “YOU” 的更新表示。 每一列:在这个 3×1000矩阵中,每一列并不直接对应于注意力模式。相反,每一列在每个单词的表示中代表了一个特定的特征或维度。这些维度是通过多头注意力机制、线性变换等处理后的结果,其中包含了单词间交互和上下文信息的综合。