人工智能
Attention正在被越来越广泛的得到应用。尤其是BERT火爆了之后。Attention到底有什么特别之处?他的原理和本质是什么?Attention都有哪些类型?本文将详细讲解Attention的方方面面。
Attention的本质是什么Attention(注意力)机制如果浅层的理解,跟他的名字非常匹配。他的核心逻辑就是「从关注全部到关注重点」。
Attention机制很像人类看图片的逻辑,当我们看一张图片的时候,我们并没有看清图片的全部内容,而是将注意力集中在了图片的焦点上。大家看一下下面这张图:
我们一定会看清「锦江饭店」4个字,如下图:
但是我相信没人会意识到「锦江饭店」上面还有一串「电话号码」,也不会意识到「喜运来大酒家」,如下图:
所以,当我们看一张图片的时候,其实是这样的:
上面所说的,我们的视觉系统就是一种Attention机制,将有限的注意力集中在重点信息上,从而节省资源,快速获得最有效的信息。
AI领域的Attention机制
Attention机制最早是在计算机视觉里应用的,随后在NLP领域也开始应用了,真正发扬光大是在NLP领域,因为2018年BERT和GPT的效果出奇的好,进而走红。而Transformer和Attention这些核心开始被大家重点关注。
如果用图来表达Attention的位置大致是下面的样子:
这里先让大家对Attention有一个宏观的概念,下文会对Attention机制做更详细的讲解。在这之前,我们先说说为什么要用Attention。
Attention的3大优点之所以要引入Attention机制,主要是3个原因:
参数少速度快效果好参数少
模型复杂度跟CNN、RNN相比,复杂度更小,参数也更少。所以对算力的要求也就更小。
速度快
Attention解决了RNN不能并行计算的问题。Attention机制每一步计算不依赖于上一步的计算结果,因此可以和CNN一样并行处理。
效果好
在Attention机制引入之前,有一个问题大家一直很苦恼:长距离的信息会被弱化,就好像记忆能力弱的人,记不住过去的事情是一样的。
Attention是挑重点,就算文本比较长,也能从中间抓住重点,不丢失重要的信息。下图红色的预期就是被挑出来的重点。
Attention的原理Attention经常会和Encoder-Decoder一起说,之前的文章《一文看懂NLP里的模型框架Encoder-Decoder和Seq2Seq》也提到了Attention。
下面的动图演示了attention引入Encoder-Decoder框架下,完成机器翻译任务的大致流程。
但是,Attention并不一定要在Encoder-Decoder框架下使用的,他是可以脱离Encoder-Decoder框架的。
下面的图片则是脱离Encoder-Decoder框架后的原理图解。
小故事讲解
上面的图看起来比较抽象,下面用一个例子来解释attention的原理:
图书管(source)里有很多书(value),为了方便查找,我们给书做了编号(key)。当我们想要了解漫威(query)的时候,我们就可以看看那些动漫、电影、甚至二战(美国队长)相关的书籍。
为了提高效率,并不是所有的书都会仔细看,针对漫威来说,动漫,电影相关的会看的仔细一些(权重高),但是二战的就只需要简单扫一下即可(权重低)。
当我们全部看完后就对漫威有一个全面的了解了。
Attention原理的3步分解:
第一步:query和key进行相似度计算,得到权值
第二步:将权值进行归一化,得到直接可用的权重
第三步:将权重和value进行加权求和
从上面的建模,我们可以大致感受到Attention的思路简单,四个字“带权求和”就可以高度概括,大道至简。做个不太恰当的类比,人类学习一门新语言基本经历四个阶段:死记硬背(通过阅读背诵学习语法练习语感)->提纲挈领(简单对话靠听懂句子中的关键词汇准确理解核心意思)->融会贯通(复杂对话懂得上下文指代、语言背后的联系,具备了举一反三的学习能力)->登峰造极(沉浸地大量练习)。这也如同attention的发展脉络,RNN时代是死记硬背的时期,attention的模型学会了提纲挈领,进化到transformer,融汇贯通,具备优秀的表达学习能力,再到GPT、BERT,通过多任务大规模学习积累实战经验,战斗力爆棚。
要回答为什么attention这么优秀?是因为它让模型开窍了,懂得了提纲挈领,学会了融会贯通。
——阿里技术
想要了解更多技术细节,可以看看下面的文章或者视频:
「文章」深度学习中的注意力机制
「文章」遍地开花的Attention,你真的懂吗?
「文章」探索NLP中的Attention注意力机制及Transformer详解
「视频」李宏毅-transformer
「视频」李宏毅-ELMO、BERT、GPT讲解
Attention的N种类型Attention有很多种不同的类型:SoftAttention、HardAttention、静态Attention、动态Attention、SelfAttention等等。下面就跟大家解释一下这些不同的Attention都有哪些差别。
由于这篇文章《Attention用于NLP的一些小结》已经总结的很好的,下面就直接引用了:
本节从计算区域、所用信息、结构层次和模型等方面对Attention的形式进行归类。
1.计算区域
根据Attention的计算区域,可以分成以下几种:
1)SoftAttention,这是比较常见的Attention方式,对所有key求权重概率,每个key都有一个对应的权重,是一种全局的计算方式(也可以叫GlobalAttention)。这种方式比较理性,参考了所有key的内容,再进行加权。但是计算量可能会比较大一些。
2)HardAttention,这种方式是直接精准定位到某个key,其余key就都不管了,相当于这个key的概率是1,其余key的概率全部是0。因此这种对齐方式要求很高,要求一步到位,如果没有正确对齐,会带来很大的影响。另一方面,因为不可导,一般需要用强化学习的方法进行训练。(或者使用gumbelsoftmax之类的)
3)LocalAttention,这种方式其实是以上两种方式的一个折中,对一个窗口区域进行计算。先用Hard方式定位到某个地方,以这个点为中心可以得到一个窗口区域,在这个小区域内用Soft方式来算Attention。
2.所用信息
假设我们要对一段原文计算Attention,这里原文指的是我们要做attention的文本,那么所用信息包括内部信息和外部信息,内部信息指的是原文本身的信息,而外部信息指的是除原文以外的额外信息。
1)GeneralAttention,这种方式利用到了外部信息,常用于需要构建两段文本关系的任务,query一般包含了额外信息,根据外部query对原文进行对齐。
比如在阅读理解任务中,需要构建问题和文章的关联,假设现在baseline是,对问题计算出一个问题向量q,把这个q和所有的文章词向量拼接起来,输入到LSTM中进行建模。那么在这个模型中,文章所有词向量共享同一个问题向量,现在我们想让文章每一步的词向量都有一个不同的问题向量,也就是,在每一步使用文章在该步下的词向量对问题来算attention,这里问题属于原文,文章词向量就属于外部信息。
2)LocalAttention,这种方式只使用内部信息,key和value以及query只和输入原文有关,在selfattention中,key=value=query。既然没有外部信息,那么在原文中的每个词可以跟该句子中的所有词进行Attention计算,相当于寻找原文内部的关系。
还是举阅读理解任务的例子,上面的baseline中提到,对问题计算出一个向量q,那么这里也可以用上attention,只用问题自身的信息去做attention,而不引入文章信息。
3.结构层次
结构方面根据是否划分层次关系,分为单层attention,多层attention和多头attention:
1)单层Attention,这是比较普遍的做法,用一个query对一段原文进行一次attention。
2)多层Attention,一般用于文本具有层次关系的模型,假设我们把一个document划分成多个句子,在第一层,我们分别对每个句子使用attention计算出一个句向量(也就是单层attention);在第二层,我们对所有句向量再做attention计算出一个文档向量(也是一个单层attention),最后再用这个文档向量去做任务。
3)多头Attention,这是AttentionisAllYouNeed中提到的multi-headattention,用到了多个query对一段原文进行了多次attention,每个query都关注到原文的不同部分,相当于重复做多次单层attention:
最后再把这些结果拼接起来:
4.模型方面
从模型上看,Attention一般用在CNN和LSTM上,也可以直接进行纯Attention计算。
1)CNN+Attention
CNN的卷积操作可以提取重要特征,我觉得这也算是Attention的思想,但是CNN的卷积感受视野是局部的,需要通过叠加多层卷积区去扩大视野。另外,MaxPooling直接提取数值最大的特征,也像是hardattention的思想,直接选中某个特征。
CNN上加Attention可以加在这几方面:
a.在卷积操作前做attention,比如Attention-BasedBCNN-1,这个任务是文本蕴含任务需要处理两段文本,同时对两段输入的序列向量进行attention,计算出特征向量,再拼接到原始向量中,作为卷积层的输入。
b.在卷积操作后做attention,比如Attention-BasedBCNN-2,对两段文本的卷积层的输出做attention,作为pooling层的输入。
c.在pooling层做attention,代替maxpooling。比如Attentionpooling,首先我们用LSTM学到一个比较好的句向量,作为query,然后用CNN先学习到一个特征矩阵作为key,再用query对key产生权重,进行attention,得到最后的句向量。
2)LSTM+Attention
LSTM内部有Gate机制,其中inputgate选择哪些当前信息进行输入,forgetgate选择遗忘哪些过去信息,我觉得这算是一定程度的Attention了,而且号称可以解决长期依赖问题,实际上LSTM需要一步一步去捕捉序列信息,在长文本上的表现是会随着step增加而慢慢衰减,难以保留全部的有用信息。
LSTM通常需要得到一个向量,再去做任务,常用方式有:
a.直接使用最后的hiddenstate(可能会损失一定的前文信息,难以表达全文)
b.对所有step下的hiddenstate进行等权平均(对所有step一视同仁)。
c.Attention机制,对所有step的hiddenstate进行加权,把注意力集中到整段文本中比较重要的hiddenstate信息。性能比前面两种要好一点,而方便可视化观察哪些step是重要的,但是要小心过拟合,而且也增加了计算量。
3)纯Attention
Attentionisallyouneed,没有用到CNN/RNN,乍一听也是一股清流了,但是仔细一看,本质上还是一堆向量去计算attention。
5.相似度计算方式
在做attention的时候,我们需要计算query和某个key的分数(相似度),常用方法有:
1)点乘:最简单的方法,
2)矩阵相乘:
3)cos相似度:
4)串联方式:把q和k拼接起来,
5)用多层感知机也可以:本文首发自产品经理的AI学习库easyai.tech
人工智能
前言之前的系列里提到Attention机制在算子学习中的应用前景,今年的机器学习顶刊JMLR就发表了一篇相关的论文,利用Attention机制对时空耦合数据进行耦合,实现了超分辨率的插值方法,在各种各样的复杂场景下有广泛利用,为算子学习理论提供了坚实的基础。
Kissas,Georgios,etal."Learningoperatorswithcoupledattention."JournalofMachineLearningResearch23.215(2022):1-63.最开始还是要介绍一下算子学习的目标,本质是学习两个无穷维空间之间的映射,这里的映射和一般所说的ODE的区别就是函数空间的无穷维度。DeepONet的作者已经证明了利用神经网络去学习这种类型的映射是可行,并给出了一种最原始的网络设计,但是网络架构的潜力并没有得到充分的发掘,大多数的结果还是基于严格理论分析,这篇也是。但是这篇论文的Attention机制是有所不同的,它与Transformer中的这个机制是不同,这个是做了空间维度上的插值,相当于是超分辨率方法,可以视作是计算机图形学的一个分支。
简而言之,就是在两个无穷维空间中的映射,由于无法得到解析解,我们一般都是在两个无穷维空间中采样有限个样本然后离散近似求解,这篇文章的思路也是如此,就是对于只有有限个已知的输入函数,可以通过学习到对任意插入值的映射。这篇文章能够发表在JMLR说明其是非常理论的,下面就尽可能简化理论分析,给出该方法的一些思路。
理论结果首先我们从理论的角度分析这篇文章,给定(mathcal{X}subsetmathbb{R}^{d_x})和(mathcal{Y}subsetmathbb{R}^{d_y}),称(xinmathcal{X})为输入位置,(yinmathcal{Y})为查询位置。定义(Cleft(mathcal{X},mathbb{R}^{d_u} ight))和(Cleft(mathcal{Y},mathbb{R}^{d_s} ight))为(mathcal{X} ightarrowmathbb{R}^{d_u})和(mathcal{Y} ightarrowmathbb{R}^{d_s})的连续函数空间。给定任意真实数据对(left[u^lleft(x ight),s^lleft(y ight) ight]),算子学习的目标是学习一个算子(mathcal{F}:Cleft(mathcal{X},mathbb{R}^{d_u} ight) ightarrowCleft(mathcal{Y},mathbb{R}^{d_s} ight))使得
$$mathcal{F}left(u^{ell} ight)=s^{ell}$$
定理一:给定一类通用算子(mathcal{A} imathcal{F}:Cleft(mathcal{X},mathbb{R}^{d_u} ight) ightarrowCleft(mathcal{Y},mathbb{R}^{d_s} ight)),对于任意的连续算子(mathcal{G}:Cleft(mathcal{X},mathbb{R}^{d_u} ight) ightarrowCleft(mathcal{Y},mathbb{R}^{d_s} ight))和(epsilon>0),存在一个(mathcal{F}inmathcal{A})使得
$$mathop{mathrm{sup}}limits_{uinmathcal{U}}mathop{mathrm{sup}}limits_{yinmathcal{Y}}parallelmathcal{G}(u)(y)-mathcal{F}(u)(y)parallel_{mathbb{R}^{d_s}}^{2}0),存在函数(v(u))和(varphi(y))使得
$$sup_{uinmathcal{U}}sup_{yinmathcal{Y}}left|mathcal{G}(u)(y)-mathbb{E}_{varphi(y)}[v(u)] ight|_{mathbb{R}^{d_s}}^20),存在(d)和(finA_N)使得
$$sup_{uinmathcal{U}}left|h(u)-fcircmathcal{D}_d(u) ight|
人工智能
SENet模块1.介绍:这里是单独使用通道注意力机制。2017年提出的SENet是最后一届ImageNet竞赛的冠军,其实现示意图如下所示。对于SENet模块,其重点是获得输入进来的特征层的每一个通道C的权值。利用SENet,我们可以让网络关注它最需要关注的通道。2.代码实现(pytorch)
importtorchfromtorchimportnnclasssenet(nn.Module):def__init__(self,channel,ratio=16):super(senet,self).__init__()self.avg_pool=nn.AdaptiveAvgPool2d(1)#全局平均池化操作,将H*W降维为1*1self.fc=nn.Sequential(#两个线性层nn.Linear(channel,channel//ratio,False),nn.ReLU(),nn.Linear(channel//ratio,channel,False),nn.Sigmoid(),)defforward(self,x):b,c,h,w=x.size()#b,c,h,w->b,c,1,1->b,cavg=self.avg_pool(x).view(b,c)#b,c->b,c//ratio->b,c->b,c,1,1fc=self.fc(avg).view(b,c,1,1)print(fc)#注意,这里的张量相乘是必须要两个张量的维度是对应相同才行,不同部分只能是1。#例如此处的是:2*512*26*26和2*512*1*1张量之间的乘积#torch.Size([4,4,2])可以和torch.Size([4,1,1])乘积returnx*fcmodel=senet(512)print(model)inputs=torch.ones([2,512,26,26])outputs=model(inputs)#print(outputs)CBAM模块1.概要介绍:这里是将通道注意力机制和空间注意力机制结合使用。效果比SENet好,其实现示意图如下所示。2.具体介绍:将通道注意力机制和空间注意力机制分别展开。通道注意力机制:示意图如下,首先将输入的特征图(C*H*W)分别对每个通道的(H*W)进行最大池化和平均池化处理,生成一维张量(C*1*1);之后分别通过线性层SharedMLP(和SENet一样,第一层对C降维,第二层恢复成输入时的C维);最后将通过线性层的两者相加并通过(Sigmoid)函数得到通道注意力输出结果(M_c)。空间注意力机制:示意图如下,首先对经过通道注意力机制优化后的特征图进行通道的平均池化和最大值池化操作,让通道转化为1,即将(C*H*W)转化为(1*H*W);之后将最大池化和平均池化的结果进行堆叠,得到(2*H*W);最后利用通道数为1的卷积层调整通道数为1(H和W不变)并取(Sigmoid)函数得到每个特征点的权重,得到空间注意力机制输出结果(M_s)3.代码实现(pytorch)
importtorchfromtorchimportnnclasschannel_attention(nn.Module):def__init__(self,channel,ratio=16):super(channel_attention,self).__init__()self.max_pool=nn.AdaptiveAvgPool2d(1)self.avg_pool=nn.AdaptiveAvgPool2d(1)self.fc=nn.Sequential(nn.Linear(channel,channel//ratio,False),nn.ReLU(),nn.Linear(channel//ratio,channel,False))self.sigmoid=nn.Sigmoid()defforward(self,x):b,c,h,w=x.size()max_pool_out=self.max_pool(x).view([b,c])avg_pool_out=self.avg_pool(x).view([b,c])max_fc_out=self.fc(max_pool_out).view([b,c,1,1])avg_fc_out=self.fc(avg_pool_out).view([b,c,1,1])out=max_fc_out+avg_fc_outout=self.sigmoid(out)print(x.size())returnx*outclassspatial_attention(nn.Module):def__init__(self,kernel_size=7):super(spatial_attention,self).__init__()padding=7//2self.conv=nn.Conv2d(2,1,kernel_size,1,padding,bias=False)self.sigmoid=nn.Sigmoid()defforward(self,x):#torch.max()有两个输出,第一个是最大值,第二个是最大值的索引max_pool_out,_=torch.max(x,dim=1,keepdim=True)mean_pool_out=torch.mean(x,dim=1,keepdim=True)pool_out=torch.cat([max_pool_out,mean_pool_out],dim=1)out=self.conv(pool_out)out=self.sigmoid(out)returnx*outclassCBAM(nn.Module):def__init__(self,channel,ratio=16,kernel_size=7):super(CBAM,self).__init__()self.channel_attention=channel_attention(channel,ratio)self.spatial_attention=spatial_attention(kernel_size)defforward(self,x):x=self.channel_attention(x)x=self.spatial_attention(x)returnxmodel=CBAM(512)print(model)inputs=torch.ones(2,512,26,26)outputs=model(inputs)print(outputs)ECANet1.介绍:ECANet可以看成是SENet的改进版,也是基于通道注意力机制的。ECANet的作者认为通过两个全连接层捕获所有通道的依赖关系是低效并且是不必要的,而使用卷积可以跨通道捕获信息。模块展示如下图所示,图左边是SENet模块,图右是改进之后的ECANet模块。2.代码实现(pytorch)
importmathimporttorchfromtorchimportnnclassECANet(nn.Module):def__init__(self,channel,gamma=2,b=1):super(ECANet,self).__init__()#通过输入的channel来自适应调节卷积核的大小#math.log(channel,2),此处是对channel取对数,底数为2#abs是取绝对值kernel_size=int(abs((math.log(channel,2)+b)/gamma))#将kernel_size取奇数kernel_size=kernel_sizeifkernel_size%2elsekernel_size+1padding=kernel_size//2self.avg_pool=nn.AdaptiveAvgPool2d(1)#输入和输出都是1维,此处的kernel_size是控制输入和输出的大小为1*1*Cself.conv=nn.Conv1d(1,1,kernel_size,padding=padding,bias=False)self.sigmoid=nn.Sigmoid()defforward(self,x):b,c,h,w=x.size()#对池化后的特征进行调整适合一维卷积的输入#b为batch_size,1为每一个step的特征长度,c代表每一个时序avg=self.avg_pool(x).view([b,1,c])print(avg.size())out=self.conv(avg)print(out.size())out=self.sigmoid(out).view([b,c,1,1])print(out.size())returnx*outmodel=ECANet(512)print(model)inputs=torch.ones([2,512,26,26])outputs=model(inputs)#print(outputs.size())3.关于代码的注意事项:使用padding填充来保证输入和输出的特征条数量是相同的,代码中经过计算可知卷积核为(1*5)。
Attention!人工智能已经渗入这些领域
人工智能(ArtificialIntelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。AI是包括十分广泛的科学,它由不同的领域组成,如机器学习,计算机视觉等等。
总的说来,人工智能研究的一个主要目标是使机器能够胜任一些通常需要人类智能才能完成的复杂工作。
相信大家都已经在生活中接触到了AI啦,可是AI在未来会有哪些主要的应用呢?那么小编带你小小的了解一下。
01
大数据学习
从标题大家应该就知道大致的意思了吧,AI可以通过数据学习,根据生产相关的经验数据对值进行预测或者分类。
打个比方,利用机器和流程产生的历史数据来预测事件,也就是说AI可以高概率的预测地震,这将是人类预防地震史的一次重大突破。正如16年的围棋机器人,就是运用了此技术,将无数种围棋解法加入程序,最后战胜了人类。
02
导航与运动
机器并不像人类一样拥有智慧,所以需要用程序在物理环境下运动——让机器人在工厂内自主移动并优化路线。
目前来说,非常多的行业期望AI能够完成端到端(直接从工厂到公司或者从公司到用户)变革流程。
03
工厂工作代替部分人工
AI可能会造成一部分人的失业,但改革是要有牺牲的,AI淘汰的只是相对落后的产业,并且能够显著地改变劳动力的构成,并且由于减少了生产过程中的人工活动而降低加工成本,何乐而不为呢?
04
智能语音转换以及语音生成
在不久前,很多“高智商”AI机器人问世,为什么说它们是“高智商”呢?因为它们都能够轻易识别人类的语言,反馈到系统中,从而完成人与机器之间的“对话”。
这项应用可以很好的改善服务业标准,如果老人一个人觉得孤单,不是可以买一个机器人为他做家务以及陪他聊天吗?
AI未来的应用那么的广泛,那么我们目前能实现的AI技术有哪些呢?
“
目前我们已经应用的人工智能技术大致分为七大领域:
”
1.个人助理(智能手机上的语音助理、语音输入、家庭管家和陪护机器人)产品举例:微软小冰、百度度秘、科大讯飞等、AmazonEcho、GoogleHome等
2.安防(智能监控、安保机器人)产品举例:商汤科技、格灵深瞳、神州云海
3.自驾领域(智能汽车、公共交通、快递用车、工业应用)产品举例:Google、Uber、特斯拉、亚马逊、奔驰、京东等
4.医疗健康(医疗健康的监测诊断、智能医疗设备)产品举例:Enlitic、IntuitiveSirgical、碳云智能、Promontory等
5.电商零售(仓储物流、智能导购和客服)产品举例:阿里、京东、亚马逊
6.金融(智能投顾、智能客服、安防监控、金融监管)产品举例:蚂蚁金服、交通银行、大华股份、kensho
7.教育(智能评测、个性化辅导、儿童陪伴)产品举例:学吧课堂、科大讯飞、云知声
AI已经在我们的生活中无处不在,未来的应用领域肯定还会继续扩大,我们作为电计系的学生也应该努力学习为时代的进步添砖加瓦。
让我们一起期待智能生活吧!