注意力机制(attention)

目录

非参注意力

自注意力机制(self-attention)

多头自注意力机制(Multi-head Self-attention)

Position Encoding 


非参注意力

 给定一组数据(gif.latex?x_%7Bi%7D,gif.latex?y%20_%7Bi%7D),i=1,2....n

最简单的方式给每一组数据添加一样权重大小的注意力

5492befef6ae414b8bc561087b395970.png

更好的注意力方案:Nadataya-Watson核回归 

ee393b79c89c403aab388d226442b59d.png

用每一个x的距离函数除以所有的距离函数和得到一个该x的比重(类似softmax)作为注意力大小

再将获取的n组不同的注意力乘上对应的y值,得到注意力加权结果。

K为计算x和gif.latex?x_%7Bi%7D之间的‘距离’的核函数,例如取高斯分布:

b312dc610c5a4058a452a03bee3173ce.png

 那么带入原函数就可以化简为:

ef48f02c47bd4b0db810ad3d25226928.png

 以上是从统计角度出发的,没有可学习参数。

0dbceb290c064c479b42d0f046f2a29b.png

 在原来的基础上加上可学习的参数w通过训练,调整每组数据对应的权重大小。

自注意力机制(self-attention)

获取文字输入如果是独热向量的话,就默认了每一个词向量之间是独立的, 除去一个位置是1其他位全0,最好用词嵌入(word Embeading)获取词向量。

68545c32e4cc47fbabcf5f5262ac0f74.png

 每一组输入向量a都需要考虑所有其他输入之后再输入b

如何计算出b1

中间具体的计算过程也就是添加注意力的方式有多种,例如:

b15f5a65f7284284b78527f67a1214a2.png3cbe46479a4a4996880722ef1abd45ea.png

后续都使用左边这个先利用两个权重矩阵乘输入获取q,k,再将q, k做点积获取α的方式

权重矩阵W是后续通过训练得来的。

将α作为两个输入的相关程度,α就是所谓的attention score

每一组输入都引入这种点积方式计算一个相关程度α

5e8ed1d7b46e4437acf0af2cd0e09520.png

 以计算a1的attention score为例,在计算时需要用自己的q去跟每一组向量的k计算一个α,包括a1自己的k(不计算自己的attention score在多数情况下都对结果有较大的影响)

再将得到的一组α做softmax获取一组gif.latex?%7Ba%7D%27(此处可以尝试用Relu等等,看会不会有更好的结果)

09b293106905448990f3a5e45f3ed500.png

 计算完gif.latex?%7Ba%7D%27后,利用输入向量a和一个新的权重矩阵计算v

将每一组α乘以v后相加获取b

88094fa853e34b51bb6b004438b07c4a.png

 此时谁的attention score也就是α更大,谁的v就会在输出的b中占主要地位,最大程度影响b的值。

以上就是计算b1的全过程,b2,b3等等都是同理可得

于是便可以通过以上计算获取一个输出矩阵B

简化表达

把每个输入向量计算q的操作拼接到一起,用一个矩阵I来表示(input)

获得的q也拼接到一起形成矩阵Q,k和v也是同理拼成K V矩阵

6825a1a5c83a46fcabaa5edc89a634fe.png62918b48db9242bca65e2b5ef7711827.png

在计算α时,q1需要访问每一个k,就可以将k拼起来

4032dd7e521f494c806f4faae3473bf0.pnge7521d31137a4320b709b88252b45e9b.png

 同时每个q都需要访问一次k1-kn

643d659bf15d4cd9a2256c7fd8db94de.png

 所以获取的α矩阵就简化为了gif.latex?k%5E%7Bt%7D×Q ,再将结果做softmax操作之后与v相加就可以得到b1-bn

903bf44984394ac694275142416becef.png

多头自注意力机制(Multi-head Self-attention)

吧一组q视为一种类别的相关性,几个输入之间可能有多种不同方面的相关性,引入多组q使得网络能够提取到多种不同关注点。

以heads为2举例,再添加两个矩阵w与原来的q相乘获取两个不同的q。通过两个不同的w来的得到两个关注点不同的,从而达到Multi-head。

436f55f5cd5d4909bc6f09c32c40add4.png

36e15d86785946c9a4eb9f77450f2368.png

 计算时gif.latex?q%5E%7Bi%2C1%7D与每个gif.latex?k%5E%7B%20%2C1%7D相乘,gif.latex?q%5E%7Bi%2C2%7D与所有gif.latex?k%5E%7B%2C2%7D相乘

在计算gif.latex?a%5E%7Bi%20%7D的输入b时,有几个head就会输出几个gif.latex?b%5E%7Bi%2Cheads%7D

65b3db7fc1c14103ae59e577de7f9eea.png

将 gif.latex?a%5E%7Bi%20%7D计算出的所有b用一个矩阵拼起来

340451fccfdb4438922f5f17f95fb4f6.png

Position Encoding 

上述的每个a用多个head计算b的过程,都是可以独立进行的,不会影响彼此的输出结果。

所以这种做法可能忽略了一个很重要的问题:每个a的位置信息

每个a在句子的前或者后可能会直接影响语义,所以用Position Encoding来添加位置信息。

6bb814f6c01342e6bd5c44e0b1d5dfb5.png

构造一个向量gif.latex?e%5E%7Bi%7D 加在a中

具体的构造方式很多,目前还是一个尚待研究的问题

例如以Transformer中的正余弦编码方式

或者构造成一个可学习的向量由数据训练得出等等

fdd049fc48ad431385ed0974dca6ac51.png

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值