【动手学习pytorch笔记】32.注意力机制基础

注意力机制基础

理论

首先回忆一下卷积

一、卷积基于的两个原则

1、平移不变性

​ 一个分类器,比如说我想识别小丁,那这个分类器进行分类的时候,应该是对于位置信息不敏感的,也就是说无论小丁出现在图片上的哪个位置,我用训练好的分类器,参数不变都是可以识别出哪个是小丁的

2、局部性

​ 就是我不需要看到全局的信息,只需要看到周围一部分信息就行了

二、从全连接层应用上面连个原则变成卷积层

先说结论:

​ 从全连接层 h i , j = ∑ a , b v i , j , a , b x i + a , j + b h_{i,j}=\displaystyle\sum_{a,b}v_{i,j,a,b}x_{i+a,j+b} hi,j=a,bvi,j,a,bxi+a,j+b

​ 变成卷积层 h i , j = ∑ a = − Δ Δ ∑ b = − Δ Δ v a , b x i + a , j + b h_{i,j}=\displaystyle\sum_{a=-\varDelta}^{\varDelta}\displaystyle\sum_{b=-\varDelta}^{\varDelta}v_{a,b}x_{i+a,j+b} hi,j=a=ΔΔb=ΔΔva,bxi+a,j+b

变换过程:

类比在简单的全连接层,输入的x是有k个特征的向量,,w是二维矩阵大小(k * i),输出h是有i个特征的向量

现在我们的输入是x一张图片,二维矩阵,那么参数w变成了四维,输出h也是一个二维矩阵,

k,l相当于像素本身的信息,i,j相当于像素的位置信息

h i , j = ∑ k , l w i , j , k , l x k , l = ∑ a , b v i , j , a , b x i + a , j + b h_{i,j} = \displaystyle\sum_{k,l}w_{i,j,k,l}x_{k,l}=\displaystyle\sum_{a,b}v_{i,j,a,b}x_{i+a,j+b} hi,j=k,lwi,j,k,lxk,l=a,bvi,j,a,bxi+a,j+b

这里v是w的重新表示 v i , j , a , b = w i , j , i + a , j + b v_{i,j,a,b} = w_{i,j,i+a,j+b} vi,j,a,b=wi,j,i+a,j+b

然后根据平移不变性,参数v应该不依赖于i,j的信息,所以 v i , j , a , b = v a , b v_{i,j,a,b} = v_{a,b} vi,j,a,b=va,b

​ 即 h i , j = ∑ a , b v a , b x i + a , j + b h_{i,j} = \displaystyle\sum_{a,b}v_{a,b}x_{i+a,j+b} hi,j=a,bva,bxi+a,j+b

再根据局部性,并不需要我们看那么远的信息,即限制了a,b的大小(上下或者左右动),当动的范围超过 Δ \varDelta Δ就不要了

​ 即 h i , j = ∑ a = − Δ Δ ∑ b = − Δ Δ v a , b x i + a , j + b h_{i,j}=\displaystyle\sum_{a=-\varDelta}^{\varDelta}\displaystyle\sum_{b=-\varDelta}^{\varDelta}v_{a,b}x_{i+a,j+b} hi,j=a=ΔΔb=ΔΔva,bxi+a,j+b

总结:平移不变性解释了为什么我可以用同一个卷积核扫过整张图片

​ 局部性解释了,为什么我要用那么大的一个卷积核

注意力机制

简单来说卷积关注的是一个像素点周围,也就是卷积核大小的信息,但这些信息未必是最应该被关心的,注意力机制则是显示的考虑随意线索(意思是有意关心的线索)

  • 随意线索被称之为查询
  • 每一个线索是一个值(value)和不随意线索(key)的对
  • 通过注意力池化层有偏向性的选择某些输入

在这里插入图片描述

具体注意力机制是怎么发展成现在的样子呢?

一、非参的注意力池化层
  • 给定数据 ( x i , y i ) , i = 1 , . . . , n (x_i,y_i),i=1,...,n (xi,yi),i=1,...,n

  • 平均池化层是最简单的方案: f ( x ) = 1 n ∑ i = 1 n y i f(x)=\frac{1}{n}\displaystyle\sum_{i=1}^ny_i f(x)=n1i=1nyi

    这里 f ( x ) 的 x f(x)的x f(x)x是query,即一个新数据进来的时候,关注的是所有信息的平均

  • 更好的方案是60年代提出的Nadaraya-Waston回归

    f ( x ) = ∑ i = 1 n K ( x − x i ) ∑ j = 1 n K ( x − x j ) y i f(x)=\displaystyle\sum_{i=1}^n\frac{K(x-x_i)}{\sum_{j=1}^nK(x-x_j)}y_i f(x)=i=1nj=1nK(xxj)K(xxi)yi

    x x x:query

    x j x_j xj:key

    y i y_i yi:value

K是核函数,类似SVM,用来计算新数据x(query)和旧数据 x i x_i xi(key)之间的距离,相当于对所有给定数据算百分比权重 (像softmax),乘对应的value,思想上像KNN

如果K使用高斯核 K ( u ) = 1 2 π e x p ( − u 2 2 ) K(u)=\frac{1}{\sqrt{2\pi}}exp(-\frac{u^2}{2}) K(u)=2π 1exp(2u2)

那么 f ( x ) = ∑ i = 1 n e x p ( − 1 2 ( x − x i ) 2 ) ∑ j = 1 n e x p ( − 1 2 ( x − x j ) 2 ) y i f(x) =\displaystyle\sum_{i=1}^n\frac{exp(-\frac{1}{2}(x-x_i)^2)}{\sum_{j=1}^nexp(-\frac{1}{2}(x-x_j)^2)}y_i f(x)=i=1nj=1nexp(21(xxj)2)exp(21(xxi)2)yi

= ∑ i = 1 n s o f t m a x ( − 1 2 ( x − x i ) 2 ) y i =\displaystyle\sum_{i=1}^nsoftmax(-\frac{1}{2}(x-x_i)^2)y_i =i=1nsoftmax(21(xxi)2)yi

二、参数化注意力机制

在之前的基础上引入可学习的w

f ( x ) = = ∑ i = 1 n s o f t m a x ( − 1 2 ( ( x − x i ) w ) 2 ) y i f(x)==\displaystyle\sum_{i=1}^nsoftmax(-\frac{1}{2}((x-x_i)w)^2)y_i f(x)==i=1nsoftmax(21((xxi)w)2)yi

学习一个w来决定注意力,这里的w还是一个标量,以上我们讨论的都是q,k,v都是标量的情况

总结 f ( x ) = ∑ i = 1 n α ( x , x i ) y i = ∑ i = 1 n s o f t m a x ( − 1 2 ( x − x i ) 2 ) y i f(x)=\displaystyle\sum_{i=1}^n\alpha(x,x_i)y_i=\displaystyle\sum_{i=1}^nsoftmax(-\frac{1}{2}(x-x_i)^2)y_i f(x)=i=1nα(x,xi)yi=i=1nsoftmax(21(xxi)2)yi

α \alpha α:注意力分数 s o f t m a x softmax softmax之后:注意力权重

在这里插入图片描述

拓展到高维

以上我们讨论的都是q,k,v都是标量的情况,现在拓展到高维

q ∈ R q , m 对 k e y − v a l u e ( k 1 , v 1 ) , k i ∈ R k , v i ∈ R v q\in\mathbb{R}^q,m对key-value(k_1,v_1),k_i\in\mathbb{R}^k,v_i\in\mathbb{R}^v qRq,mkeyvalue(k1,v1),kiRk,viRv

注意力: f ( q , ( k 1 , v 1 ) , . . . , ( k m , v m ) ) = ∑ i = 1 m α ( q , k i ) v i ∈ R v f(q,(k_1,v_1),...,(k_m,v_m))=\displaystyle\sum_{i=1}^m\alpha(q,k_i)v_i\in\mathbb{R}^v f(q,(k1,v1),...,(km,vm))=i=1mα(q,ki)viRv

α ( q , k i ) = s o f t m a x ( a ( q , k i ) ) = e x p ( a ( q , k i ) ) ∑ j = 1 n e x p ( a ( q , k j ) ) ∈ R \alpha(q,k_i)=softmax(a(q,k_i))=\frac{exp(a(q,k_i))}{\sum_{j=1}^nexp(a(q,k_j))}\in\mathbb{R} α(q,ki)=softmax(a(q,ki))=j=1nexp(a(q,kj))exp(a(q,ki))R

现在问题在于如何计算 a ( q , k i ) a(q,k_i) a(q,ki),有两种方式

  • Additive Attention

    • 可学习参数: W k ∈ R h × k , W q ∈ R h × q , v ∈ R h W_k\in\mathbb{R}^{h\times k},W_q\in\mathbb{R}^{h\times q},v\in\mathbb{R}^{h} WkRh×k,WqRh×q,vRh

      a ( k , q ) = v T t a n h ( W k k + W q q ) a(k,q)=v^Ttanh(W_kk+W_qq) a(k,q)=vTtanh(Wkk+Wqq)

    最后计算出 a a a是一个数,相当于把key和query合并起来放到一个隐藏层大小为h,输出为1的单隐藏层MLP中

    适用于q,k,v大小不同的情况

  • Scaled Dot-Product Attention(transformer用的)

    • 如果query和key是同样的长度 q , k i ∈ R d q,k_i\in\mathbb{R}^d q,kiRd,那么可以 a ( q , k i ) = < q , k i > / d a(q,k_i)=<q,k_i>/\sqrt{d} a(q,ki)=<q,ki>/d

    • 向量化版本:n个query,m个key-value

      • Q ∈ R n × d , K ∈ R m × d , V ∈ R m × v Q\in\mathbb{R}^{n\times d},K\in\mathbb{R}^{m\times d},V\in\mathbb{R}^{m\times v} QRn×d,KRm×d,VRm×v

      • 注意力分数: a ( Q , K ) = Q K T / d ∈ R n × m a(Q,K)=QK^T/\sqrt{d}\in\mathbb{R}^{n\times m} a(Q,K)=QKT/d Rn×m

      • 注意力池化: f = s o f t m a x ( a ( Q , K ) ) V ∈ R n × v f=softmax(a(Q,K))V\in\mathbb{R}^{n\times v} f=softmax(a(Q,K))VRn×v

        这时候你可能问Dot-Product Attention,没有可学习参数啊,在transformer里,Q,K,V是一个词向量通过三个矩阵 W q , W k , W v W_q,W_k,W_v Wq,Wk,Wv映射过来的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值