如何理解self attention中的QKV矩阵

2 篇文章 0 订阅
1 篇文章 0 订阅

如何理解self attention中的QKV矩阵

疑问:三个矩阵的形状是一样的(embd_dim*embd_dim),作用也都是对输入句子的embedding做线性变换(tf.matmul(Q,input_value),tf.matmul(K,input_value),tf.matmul(V,input_value))。

那么,为什么需要三个矩阵QKV。

对于这个问题,在我第一次看了b站博主视频https://www.bilibili.com/video/BV1P4411F77q(强烈推荐)。就已经明白了。但是因为没有做相关笔记,也没有项目实践。所以,又忘记了,然后又看了一遍。吸取之前的教训,所以来这里做笔记了。

公式:

1.初始化三个矩阵Q,K,V(待学习参数)
2.计算embedding:query=embedding_x(input sentense)*Q,key= embedding_x(input sentense)*K,value=embedding_x(input sentense)*V
3.计算点积,每个词和每个词的相关性,其实就是attention加权求和的权重:
logits = tf.matmul(query, key, transpose_b=True) / math.sqrt(depth)
每一行代表的是当前词和句子的每个词的相关性(你品,你细细品,点积的含义)。
4.对权重做归一化,保证一行的权重和为1:alignment = tf.nn.softmax(logits, axis=-1)
5.对输入(input sentense)加权求和:attended = tf.matmul(alignment, value)。每一个词的embedding包含了这个句子所有词的信息。其实这就是transform相比于lstm和gru的优点。

总结:self attention 要做的事情,就是要将一句话的内容融合到每个词的向量表示中。如何融合=>通过加权。加权就要算权重。如何算这个权重=>向量的点击(Q和K的点积)。最后,通过计算好的权重加权,就完成啦。

思考:为什么需要用三个Q,K,V分别对embedding_x 做线性变换,再计算attention。

个人理解,为什么不共享一个线性变换的矩阵,而是用三个。从模型角度是增加模型的解释能力。从业务角度,分别计算的是搜索词和关键词及每个句子间的词向量。有一定差异。

(关于业务角度,个人理解不一定正确,欢迎讨论)

  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值