图文理解自注意力(self

阅读: 评论:0

图文理解自注意力(self

图文理解自注意力(self

谷歌在2017年发表了一篇论文《Attention Is All You Need》,论文中提出了transformer模型,其核心就是self-attention的架构,这一突破性成果不仅洗遍了NLP的任务,也在CV中取得了非常好的效果,有大道至简的感觉。本文通过一个通俗易懂的例子1来介绍self-attention。

(注:本文例子完全来在参考文章,包括文章的gif动图,感谢作者的文章)

介绍

接下来将通过一下几个步骤来介绍2

  1. 预处理输入数据
  2. 初始化权重
  3. 计算key,query 和value
  4. 计算输入值的注意力得分
  5. 计算softmax层
  6. 注意力得分与value相乘
  7. 对6中结果加权求和,并得到第一个输出值
  8. 重复4-7,计算其余输入数据的输出值

预处理输入数据

本例中我们选择三个输入值,已经通过embedding处理,得到了三个词向量。

Input 1: [1, 0, 1, 0] 
Input 2: [0, 2, 0, 2]
Input 3: [1, 1, 1, 1]

初始化权重

权重包括三个,分别是query的 W q W_q Wq​,key的 W k W_k Wk​以及value的 W v W_v Wv​,例如这三个权重分别初始化为

W k W_k Wk​矩阵为:

[[0, 0, 1],[1, 1, 0],[0, 1, 0],[1, 1, 0]]

W q W_q Wq​矩阵为:

[[1, 0, 1],[1, 0, 0],[0, 0, 1],[0, 1, 1]]

W v W_v Wv​矩阵为:

[[0, 2, 0],[0, 3, 0],[1, 0, 3],[1, 1, 0]]

计算key,query 和value

有了输入和权重,接下来可以计算每个输入对应的key,query 和value了。

第一个输入的Key为:

               [0, 0, 1]
[1, 0, 1, 0] x [1, 1, 0] = [0, 1, 1][0, 1, 0][1, 1, 0]

第二个输入的Key为:

               [0, 0, 1]
[0, 2, 0, 2] x [1, 1, 0] = [4, 4, 0][0, 1, 0][1, 1, 0]

第三个输入的Key为:

               [0, 0, 1]
[1, 1, 1, 1] x [1, 1, 0] = [2, 3, 1][0, 1, 0][1, 1, 0]

用矩阵的乘法来计算输入的Key为:

               [0, 0, 1]
[1, 0, 1, 0]   [1, 1, 0]   [0, 1, 1]
[0, 2, 0, 2] x [0, 1, 0] = [4, 4, 0]
[1, 1, 1, 1]   [1, 1, 0]   [2, 3, 1]

同理我们计算value的结果为:

               [0, 2, 0]
[1, 0, 1, 0]   [0, 3, 0]   [1, 2, 3] 
[0, 2, 0, 2] x [1, 0, 3] = [2, 8, 0]
[1, 1, 1, 1]   [1, 1, 0]   [2, 6, 3]

最后我们计算query的结果:

               [1, 0, 1]
[1, 0, 1, 0]   [1, 0, 0]   [1, 0, 2]
[0, 2, 0, 2] x [0, 0, 1] = [2, 2, 2]
[1, 1, 1, 1]   [0, 1, 1]   [2, 1, 3]

计算输入值的注意力得分

注意力的得分是通过query与每个key结果相乘。例如对于第一个query(红色)分别与三个key(橙色)相乘,得到结果(蓝色)就是注意力得分。

计算结果为:

            [0, 4, 2]
[1, 0, 2] x [1, 4, 3] = [2, 4, 4][1, 0, 1]

计算softmax层

softmax函数直接对上一步中的注意力得分做归一化处理。

softmax([2, 4, 4]) = [0.0, 0.5, 0.5]

得分与value相乘

得到的每个得分值与自身的value直接相乘

1: 0.0 * [1, 2, 3] = [0.0, 0.0, 0.0]
2: 0.5 * [2, 8, 0] = [1.0, 4.0, 0.0]
3: 0.5 * [2, 6, 3] = [1.0, 3.0, 1.5]

对6中结果求和,并得到第一个输出值

上一步骤中输出结果求和就得到第一个输出值

  [0.0, 0.0, 0.0]
+ [1.0, 4.0, 0.0]
+ [1.0, 3.0, 1.5]
-----------------
= [2.0, 7.0, 1.5]

重复4-7,计算其余输入数据的输出值

重复计算4-7,分别得到第二个和第三个输出值

于是三个输入经过self-attention模块,得到了三个输出值。这就是attention模块做的事情,是不是很简单。《Attention Is All You Need》论文中的attention计算公式:

A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K, V) = softmax(frac{QK^T}{sqrt d_k})V Attention(Q,K,V)=softmax(d ​k​QKT​)V

attention最厉害的地方在于能够捕捉到全局信息,经过这个模块的输出结果,是通过输入结果两两运算得出了权重,再对输入进行加权求和得到了。除了捕捉全局信息,还能并行计算,这就比之前的RNN和CNN厉害多了,怪不得谷歌给这篇论文起名叫做Attention Is All You Need,有这个attention就够了3

注:喜欢我的文章可以关注我的个人公众号:数学编程

参考


  1. ↩︎

  2. /587/li-jie-zi-zhu-yi-li-selfattention/ ↩︎

  3. Black个人网站 ↩︎

本文发布于:2024-01-28 09:10:23,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17064042296344.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:注意力   图文
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23