一、 动物的注意力
动物需要在复杂环境下有效关注值得注意的点。
心理学框架:人类根据随意线索(主观)和不随意(客观)线索选择注意点。
当我们走进一个拥挤的街道时,四周有很多人、车、广告牌、商店等各式各样的东西。我们的视野很广,但并不是所有的信息都能同时被注意到。假设你正准备去某家餐厅吃饭,在这个场景中,你的视觉注意力就会被餐厅的招牌吸引。这个招牌是一个不随意线索,因为它以醒目的颜色或亮度吸引了你的目光,容易引起你的注意。
然而,如果你在街道上走着,忽然发现自己有些饿了,开始思考要去哪家餐厅吃饭。那么,此时你会有意识地将注意力转向那些餐厅的招牌,这就成了随意线索。你的意识在主动选择、筛选并聚焦你想要的信息(即餐厅招牌),而不是被周围的其他事物分散注意力。
这两种线索的运作方式帮助我们在信息繁杂的环境中,有效地集中注意力于最需要关注的部分。而这也是为什么计算机视觉中的注意力机制非常重要,它帮助计算机像人类一样集中资源处理重要的信息,从而提高效率,避免浪费计算能力在无关的噪声上。
二、 Attention思想
想象你在超市里买水果,眼前摆满了各种水果:苹果、香蕉、葡萄、橙子……信息量巨大,你不可能一次性关注所有的水果。于是,你会根据自己的需求来选择关注点,比如你今天想买的是橙子。那么,在这一刻,你的注意力会自动过滤掉苹果、香蕉等其他水果,更多地聚焦在橙子的颜色、大小、新鲜度等信息上,以便做出最优的购买决策。
这种有选择性的关注方式,就是注意力机制(Attention)的核心思想:在大量信息中,筛选出当前任务最重要的部分,并对其给予更多关注,而忽略掉不重要的信息。
再举个例子,假设你在听一首英文歌,并想把歌词翻译成中文。你不可能逐字逐句死记硬背,而是会自动把注意力集中在某些关键单词上,比如“love”、“forever”、“happy”这些可能影响整体意义的词汇。翻译时,你会格外关注这些核心词,而非所有单词都一视同仁。这种对信息的筛选和聚焦,与深度学习中的Attention机制是一样的。
在神经网络中,Attention 也是这样运作的。它不会对所有输入信息给予同样的权重,而是通过计算权重系数,决定哪些信息更重要。权重越大,模型就越关注这部分信息,而权重小的信息则被忽略。比如,在翻译“我爱你,中国”时,“中国”这个词在英文中的翻译(China)是关键部分,因此会被赋予更高的权重,让模型更精准地理解句子结构。
总结来说,Attention 的作用就像人类的大脑,它帮助我们从海量信息中快速锁定最重要的部分,并将计算资源重点投入其中,而不是浪费在无关的细节上。这种机制极大地提升了深度学习模型在自然语言处理、图像识别等任务上的效率和准确度。
三、 从Encoder-Decoder框架中理解为什么要有attention机制
(在这里引用了CSDN里一位博主的原创文章,感谢博主的原创文章给予了很大帮助:
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_42363032/article/details/124651978
https://blog.csdn.net/tg229dvt5i93mxaq5a6u/article/details/78422216)
上图中的框架并没有体现出注意力机制,所以可以把它看做分心模型,为什么说它注意力不集中分心呢?请看Decoder部分每个单词的生成过程:
其中f是解码器的非线性变换函数,从这里我们可以看出,在生成目标句子的单词时,无论生成那个单词,它们使用的输入句子的语义编码c都是一样的,没有任何区别。
而语义编码c是由句子的每个单词经过Encoder编码产生的,这意味着不论是生成哪个单词,句子中任意单词对某个目标单词y的影响力都是相同的,就像是人类的眼中没有注意力焦点是一样的。
比如在机器翻译场景中,输入的英文句子为:Tom chase Jerry,Encoder-Decoder框架逐步生成中文单词:”汤姆“、”追逐“、”杰瑞“。在翻译”杰瑞“这个单词的时候,分心模型里面每个英文单词对于翻译目标单词”杰瑞“的贡献程度是相同的,这很显然是不合道理的。显然”Jerry“对于翻译成”杰瑞“更为重要。
那么它会存在什么问题呢?类似RNN无法捕捉长序列的道理,没有引入Attention机制在输入句子较短时影响不大,但是如果输入句子比较长,此时所有语义通过一个中间语义向量表示,单词自身的信息避免不了会消失,也就是会丢失很多细节信息,这也是为何引入Attention机制的原因。
例如上面的例子,如果引入Attention的话,在翻译”杰瑞“的时候,会体现出英文单词对于翻译当前中文单词的不同程度影响,比如给出类似下面的概率分布:
每个英文单词的概率代表了翻译当前单词”杰瑞“时,注意力分配给不同英文单词的权重大小,这对于正确翻译目标单词是有着积极作用的。
目标句子中的每个单词都应该学会其对应的源语句子中单词的注意力分配概率信息。这意味着在生成每个单词yi的时候,原先都是相同的中间语义表示C会被替换成根据当前生成单词而不断变化的Ci。理解Attention模型的关键就是这里,即由固定的中间语义表示C换成了根据当前输出单词来调整成加入注意力模型的变化的Ci。增加了注意力模型的Encoder-Decoder框架理解起来如下图所示:
即生成目标句子单词的过程成了下面的形式:
而每个Ci可能对应着不同的源语句子单词的注意力分配概率分布,比如对于上面的英汉翻译来说,其对应的信息可能如下:
其中,f2函数代表Encoder对输入英文单词的某种变换函数,比如如果Encoder是用的RNN模型的话,这个f2函数的结果往往是某个时刻输入xi后隐层节点的状态值;g代表Encoder根据单词的中间表示合成整个句子中间语义表示的变换函数,一般的做法中,g函数就是对构成元素加权求和,即下列公式:
其中,Lx代表输入句子Source的长度,aij代表在Target输出第i个单词时Source输入句子中第j个单词的注意力分配系数,而hj则是Source输入句子中第j个单词的语义编码。假设下标i就是上面例子所说的“ 汤姆” ,那么Lx就是3,h1=f(“Tom”),h2=f(“Chase”),h3=f(“Jerry”)分别是输入句子每个单词的语义编码,对应的注意力模型权值则分别是0.6,0.2,0.2,所以g函数本质上就是个加权求和函数。如果形象表示的话,翻译中文单词“汤姆”的时候,公式对应的中间语义表示Ci的形成过程类似下图。
这里还有一个问题:生成目标句子某个单词,比如“汤姆”的时候,如何知道Attention模型所需要的输入句子单词注意力分配概率分布值呢?就是说“汤姆”对应的输入句子Source中各个单词的概率分布:(Tom,0.6)(Chase,0.2) (Jerry,0.2) 是如何得到的呢?
为了便于说明,我们假设对图2的非Attention模型的Encoder-Decoder框架进行细化,Encoder采用RNN模型,Decoder也采用RNN模型,这是比较常见的一种模型配置,如下图所示:
注意力分配概率分布值的通用计算过程如下所示:
对于采用RNN的Decoder来说,在时刻i,如果要生成yi单词,我们是可以知道Target在生成yi之前的时刻i-1时,隐层节点i-1时刻的输出值的,而我们的目的是要计算生成yi时输入句子中的单词“Tom”、“Chase”、“Jerry”对yi来说的注意力分配概率分布,那么可以用Target输出句子i-1时刻的隐层节点状态Hi-1去一一和输入句子Source中每个单词对应的RNN隐层节点状态hj进行对比,即通过函数F(hj , Hi-1)来获得目标单词和每个输入单词对应的对齐可能性,这个F函数在不同论文里可能会采取不同的方法,然后函数F的输出经过Softmax进行归一化就得到了符合概率分布取值区间的注意力分配概率分布数值。
目标句子生成的每个单词对应输入句子单词的概率分布可以理解为输入句子单词和这个目标生成单词的对齐概率,这在机器翻译语境下是非常直观的:传统的统计机器翻译一般在做的过程中会专门有一个短语对齐的步骤,而注意力模型其实起的是相同的作用。
四、 Attention的原理
(在这里引用了博主文章,感谢博主文章给予了很大帮助:
原文链接:
下面的动图演示了attention 引入 Encoder-Decoder 框架下,完成机器翻译任务的大致流程。
但是,Attention 并不一定要在 Encoder-Decoder 框架下使用的,他是可以脱离 Encoder-Decoder 框架的。
下面的图片则是脱离 Encoder-Decoder 框架后的原理图解。
上面的图看起来比较抽象,下面用一个例子来解释 attention 的原理:
图书馆(source)里有很多书(value),为了方便查找,我们给书做了编号(key)。当我们想要了解漫威(query)的时候,我们就可以看看那些动漫、电影、甚至二战(美国队长)相关的书籍。
为了提高效率,并不是所有的书都会仔细看,针对漫威来说,动漫,电影相关的会看的仔细一些(权重高),但是二战的就只需要简单扫一下即可(权重低)。
当我们全部看完后就对漫威有一个全面的了解了。
Attention 原理的3步分解:
第一步: query 和 key 进行相似度计算,得到权值(最常见的方法包括:求两者的向量点积、求两者的向量Cosine相似性或者通过再引入额外的神经网络来求值)
第二步:将权值进行归一化,得到直接可用的权重
第三步:将权重和 value 进行加权求和