注意力机制略解

引子

例如,现在需要拟合函数f(x),我们已知函数上的若干点(xi,yi)

现在我们想知道在自变量取x’的时候,函数值y’为多少

正常的思路比如拉格朗日插值,牛顿插值,直接去估计函数的表达式,然后带入点值去计算y’

但是根据数学直觉来说,函数如果是连续的,那么离查询点x’越近的点xi,会对y’造成的影响越大

如上图,(x4,y4)对需要查询的(x',y')带来的影响相比于(x7,y7)显然是更大的

如果说我们假设目前的函数模型是一个简单的求平均值模型即

f(x)=\frac{1}{n}\sum_{i=1}^{n}y_i

根据我们上文的发现,我们可以把它改写为加权平均值

f(x)=\sum_{i=1}^{n}\alpha _iy_i   ,满足 \sum_{i=1}^n \alpha _i =1

然后我们来使用神经网络训练这个加权的权重,输入两个变量(x,xi),输出为权重

f(x)=\sum_{i=1}^{n}g(x,x_i) y_i

当然还要满足\sum_{i=1}^n g(x,x_i) =1,这一点可以用喜闻乐见的softmax函数来实现

根据上述这种做法(似乎也被称为Nadaraya-Watson核回归),我们抽象出注意力机制的基本模型

注意力机制

查询Q、键K、值V

老生常谈的内容了

查询Q就相当于我们输入进入函数的那个x’

键K就是我们已知函数点的x坐标

值V就是我们已知函数点的y坐标

我们的输出就是一系列V的加权和

现在的重点就是如何设计g(x,x_i)这个函数,也就是注意力评分函数,能够让拟合效果尽量好

有两种主流的设计方法(当然还有很多其他的方法)

假设我们输入为q向量和k向量

加性注意力:

g(q,k)=w_v^T*tanh(W_q*q+W_k*k)

在pytorch中可以利用tensor加法的广播机制来做到矩阵化运算

缩放点积注意力:(要求q与k向量长度相同,均为d)

g(q,k)=q^T\cdot k/\sqrt{d}

这个形式直接可以写成矩阵乘法的形式,在套上一个softmax就算完了,所以比较受大众喜爱

为了能够更好地使用这种机制(为了把更多的死马当作活马医)

我们添加全连接层,例如网络中的某个阶段,特征为X

我们给它加三个分别的全连接层Qx,Kx,Vx,得到QKV矩阵,就能够用上述的注意力模型套了

然后美其名曰,自注意力机制(我实在没想通这样做到底有什么意义,或许是构造了二阶特征?)

事实证明,这个机制确实发挥了非常巨大的作用(你就说它行不行吧)

说到注意力那就必须得提起Transformer

Transformer里面使用的注意力机制更加优秀,虽然仍然使用的seq2seq架构

他利用了上文的context作为解码器输入的Q和K,解码器两层注意力,第一层是自注意力,第二层是自身作为V的输入,利用上文context作为Q、K的输入,融合到一起的注意力层(更有使用查询和键、值的实际意义)(但为什么是作为Q、K,而不是只作为Q呢?),另外他还设计了非常巧妙的位置编码,减少了位置信息的损失。

不过这里并不打算展开讲

推荐一个非常优质的、图文并茂的Transformer的讲解。

The Illustrated Transformer – Jay Alammar – Visualizing machine learning one concept at a time.

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值