Q是要搜索的词, 例如 “苹果”这个词在 ,“我要吃苹果” 这句话中与每个词的相似度求解。 Q = 苹果, K1 = 我 k2=要 k3=吃 k4=苹果。 Q 分别与K1-4 进行相似度的比较得到一个score 分数,如果这个score 越高说明相似度越高。 然后通过softmax 归一化,就是相似度的百分比。 最后在和 V 相乘 求和。 得到注意力矩阵。
V是什么?
这里需要明白一个背景,就能记住 q k v 分别是干什么的了。 这里注意力机制的本质是提取特征,也就是说一个词在一个句子中的特征。 用一个简单的例子来说,就是你在你公司里面属于什么地位。 比如一个公司有三个人, 你, 小红,小强。 就要算出它们之间都是什么关系, 说白了关系好的之间的分数就高,最终用小数表示。 例如你和你自己的关系是 0.7, 你和小红的关系是0.2,你和小刚的关系是0.1. 分值大说明关系好。 而且 三个关系相加刚好是1 也就是100%。
那么这个之间的关系是如何计算出来的呢 ?就需要对每个人设置三个值, 就是 k q v。 k 是用来 被别人查的,q 是用来 查别人的, v 是用来算分数的。
这三个严格来说都是矩阵向量,最开始的时候是随机生成的,通过不断迭代训练计算出来(涉及到正向传递,反向传递,损失函数,求w b ,这里不展开)。 回到你的问题,v 是用来算分的,也就是你和其他人之间的关系到底是多少得分,就是通过v 算出来的。 它是在 k 和q 两两计算计算得到的记过进行归一化的结果之后,再进行乘积求和得到的。 简单一句话,v 就是用来算分的, 算关系的,算你和其他人的关系。 算这个词和整句话中其他词的关系。
k和q相乘之后再经过softmax,这时候不就已经得到我和其他所有人的关系了么?按我的理解,上述的关系再乘v之后,相当于用其他人重新表征了我自己,有点像线性表示的意思
嗯是的, 归一化以后有一个比例关系,但是还不够,因为这个时候没有考虑 词向量本身的值。 这个自身的值就是v了, 所以要再算一次。 才行。、
K ,Q 的计算 是为了计算关系, V 的值是为了计算关系之后再考虑自己的在关系中的地位。 因为,没有V 就不能体现词向量本身的特征。 光有关系还不够,还需要把自身的特征考虑进去。这也是为什么要 对词向量分别生成 QKV 三个值的原因。 在里Q 就是用来查询别人的, K 是用来被别人查的, V 就是自身的没有放入到上下文中的“特征”。 最后计算出来的是,自己放在上下文中的“特征”
Q,K,V是三个矩阵。 是 X 输入与 Wq,Wk,Wv 点积的结果。 最开始Wq,Wk,Wv 是随机生成的, 后面通过训练 Wq,Wk,Wv 会不断调整,通过loss 函数进行。 Wq,Wk,Wv 就是需要训练的参数。
具体过程是这样的: 首先输入部分,需要做编辑word embedding,也就是词向量化。
然后: Q, K,V这三个矩阵是通过原始输入X做线性变换得来的。
Q=X* Wq, K=X* Wx, V= X*Wv,
Wq,Wx,Wv是可训练的参数矩阵,初始值可以随机化生成。
然后就可以通过点积运算生成注意力值了 而模型训练的过程可以更新Wq,Wx,Wv的参数值。
模型的超参数才需要手动调参,模型的参数会随着学习过程不断自动更新。而WQ,WK, WV属于模型参数,一开始是随机初始化的,在具体任务每一轮训练中,通过优化损失函数,反向传播更新模型的所有参数,其中包括WQ,WK,WV。而损失函数是由具体任务自由决定的,比如BERT预训练里面,就是通过编辑MLM和编辑NSP两个子任务来训练优化参数的。