注意力机制
原理:从关注全部到关注重点
卷积神经网络利用空间信息,卷积层提取图像的局部特征,层层堆叠学习更高级的特征,降低复杂度。
循环神经网络通过循环连接和隐藏状态的传递,实现对序列数据的建模和处理,具备了对序列中的长期依赖关系进行建模的能力,能够更好地捕捉序列数据中的模式和规律。
注意力机制利用相关性信息,根据不同输入部分的重要性给予不同的权重。这样可以实现对重要信息的集中关注,提高网络的表达能力和性能。
最开始,注意力机制都是在【编码器】-【解码器】架构:
编码器和解码器之间,有一个固定长度c,作为俩者的联系。
存在信息瓶颈问题:把前面压缩的信息都给这个固定长度,当压缩的信息越大,丢失的信息也就越多,越前面的信息越记不住。
解决方案:
最大的区别就在于它不在要求编码器将所有输入信息都编码进一个固定长度的向量之中。
编码器需要将输入编码成一个向量的序列,而在解码的时候,每一步都会选择性的从向量序列中挑选一个子集进行进一步处理。
这样,在产生每一个输出的时候,都能够做到充分利用输入序列携带的信息。
比如读一本故事书,传统的方法是将整个故事的内容压缩成一个固定长度的概括性句子,这样只能关注整个故事的总体信息,而忽略了细节。
而使用attention模型,可以更好地理解故事的每个部分。
举个例子,有一个故事是关于一只狗在公园玩耍的。使用attention模型可以逐步理解故事:
在开始时,会将注意力集中在故事的第一句话,了解故事的开头。
随着故事的发展,会根据注意力权重选择性地关注一些关键词,比如"狗"、"公园"、"玩耍"等。
会将注意力从第一句话逐渐转移到后面的句子上,以便理解故事的进展和发展。
当故事提到狗在公园玩耍的时候,注意力会更加集中,以便更好地理解这个关键情节。
通过使用attention模型,可以逐步理解故事的每个部分,并且能够根据需要选择性地关注关键信息,从而更好地理解故事的含义。
当涉及到注意力机制时,有几种常见的变体,它们分别是:
- Soft-Attention(软注意力):函数在域内平滑变换,如下图:
- Hard-Attention(硬注意力):随机抽样实现的,更为离散的注意力机制,它在每个时间步选择一个输入位置来聚焦,而不是分配连续的注意力权重。这意味着模型只能选择一个位置来关注,在处理离散输出序列时可能更具优势。
- Global-Attention(全局注意力):考虑每个隐藏状态与整个输入序列中的所有位置进行关联。在计算注意力权重时,它考虑了整个输入序列的信息,从而能够更全面地捕捉输入序列中的重要信息,但大部分时候没必要。
- Local-Attention(局部注意力):Local-Attention 是一种注意力机制,它只关注输入序列的一部分,而不是整个序列。通过定义一个窗口或区域来限制注意力的范围,Local-Attention 可以减少计算开销,并且在长序列的情况下可以更高效地进行处理。
- Self-Attention(自注意力):注意力机制可以帮助我们关注频繁出现或与问题相关的单词,而自注意力机制可以帮助我们建立单词之间的关联性,以更好地理解整个材料。
转换:
通过了解这些不同的注意力机制变体,我们可以选择最适合特定任务和数据的方法,以提高模型在处理序列数据时的性能和效果。
软注意力-计算方式
首先,计算注意力得分:
- e k j = s c o r e ( H ( k − 1 ) , h ( j ) ) e_{kj} =\mathrm{score}(H^{(k-1)},h^{(j)}) ekj=score(H(k−1),h(j))
e k j e_{kj} ekj 的值反映了第 k k k 层与第 j j j 个隐藏状态之间的相关性或相似度。
然后,对得分进行 softmax 归一化,得到注意力权重:
- α k j = exp ( e k j ) ∑ i = 1 T x exp ( e k i ) ⟺ α i = S o f t M a x ( e k ) \alpha_{kj} =\frac{\exp(e_{kj})}{\sum_{i=1}^{T_x}\exp(e_{ki})}\iff\alpha_i=SoftMax(e_k) αkj=∑i=1Txexp(eki)exp(ekj)⟺αi=SoftMax(ek)
其中, α k j \alpha_{kj} αkj 表示第 k k k 层的注意力权重, α i \alpha_i αi 表示第 i i i 个注意力权重。
最后,通过加权平均的方式,计算上下文向量:
- C k = ∑ i = 1 T x α k i h ( i ) C_{k} =\sum_{i=1}^{T_x}\alpha_{ki}h^{(i)} Ck=∑i=1Txαkih(i)
其中, C k C_k Ck 表示第 k k k 层的上下文向量, h ( i ) h^{(i)} h(i) 表示第 i i i 个隐藏状态向量。
传统注意力问题
传统注意力机制过程,见下图:
- 编码器生成一个个隐状态 h i − j h^{i-j} hi−j (图 1 的 hidden state)来与解码器的当前状态计算分数(图 1 的 score)
- 再经过softmax层(图 1 的 softmax)
- 再分别与对应的编码器状态乘积相加(图 1 的 multiplication)
- 所有编码器状态乘积相加(图 2 的 multiplication),得到上下文信息c(图 2 的 context vector)
- 传给解码器
:图1:
图2::
如果我们手动将最后一个输入的权重设置为1,其他设置为0,那么我们将注意机制减少到原始的上下文向量机制(单个c)。
即,不需要注意先前的输入编码器状态,只需要最后一个关键词。
传统注意力问题:这个过程直接使用编码器状态计算,注意力分数会仅基于隐状态在序列中的相对位置,而不是内容,就限制了模型关注相关信息的能力。
传统的注意力机制局限在了位置信息上,无法很好地捕捉到关键词之间的语义联系。
这就像是只看书中句子的相对位置,而没有考虑句子的内容。
为了解决这个问题,引入了更先进的注意力机制。
键值注意力:单标签的检索系统
键值注意力机制,通过引入键(key)和值(value)的概念,解决了传统注意力机制只依赖位置信息的限制。
键值注意力机制通过计算查询向量与键之间的相似度,来决定对应的值对于查询的重要程度。
见上图,value 值不参与 score 计算相似性分数,保证相似性和内容分离。
通过将值与键分离,可以更好地将注意力集中在与查询相关的特征上。
值提供了与键相关的信息,可以作为额外的特征来丰富查询结果,但它不直接影响相似性分数的计算。
这种分离可以提高模型的鲁棒性和可解释性,并允许更灵活的查询结果生成。
键值、查询的概念源于检索系统,检索系统就是键值注意力。
- 搜索内容时,搜索引擎会将查询 (用户搜索意图)映射到数据库中
- 找到与候选视频相关的一组键 (视频标题、描述 )和 值 (视频的具体内容)
这样我们就解决了,传统注意力无法捕捉到关键词之间的语义联系。
计算方式
- 输入 X,查询Q,键K,值向量V,通过线性变换,映射到隐藏空间
- 计算 K 和 Q 的点积,求俩个向量在特征空间的相似性(正交结果为0,越相似)
- 除以向量的维度 d k \sqrt{d_{k}} dk
- 使用 softmax 归一化
- 再乘值向量 V
之后的计算,和传统注意力相同。
权重和value相乘得到 multiplication ,再所有编码器乘积 multiplication 相加,输出。
当 Key 等于 Value 的时候,键值注意力就会退化为传统注意力。
多头注意力:多标签的检索系统
键值注意力也有缺陷,现代的系统都有很多标签的。
比如我想看的漫画,需要同时包含:彩色、国内、热血、冒险、治愈等标签。
键值注意力只能查询一个标签,而多头注意力可以多个查询向量,解决这个问题。
效率、智能程度比键值好太多。
自注意力:对输入数据内部关系进行预处理
自注意力机制主要解决了传统注意力在处理长序列时的两个问题:长距离依赖和计算效率。
给你一段文字材料,要求你找出其中最重要的关键词。
文字材料是输入序列,需要找出的关键词就是查询。
-
注意力:如果材料中提到的某个单词在整个材料中频繁出现或者与问题相关,你可能会更关注这个单词。
-
自注意力:如果一个单词在材料的其他位置与多个重要的单词相关联,那么这个单词可能也很重要。
通过注意力机制,你能够决定在阅读过程中关注哪些单词,而通过自注意力机制,你能够建立不同单词之间的关联性,更好地理解整个材料。
句子:The animal didn't cross the street because it was too tired.
这个 it 到底指的什么呢?
- 下图颜色越深,表示 it 关联性越大
相当于,计算了一个权重,对输入数据内部关系进行预处理。
计算方式
Transformer
注意力机制是一种选择性的关注方式,而transformer是基于注意力机制的一种模型,它可以帮助我们更好地理解和处理文本信息。
一本书有很多页,每页上有很多文字。你想要理解这本书的内容,但是你不可能同时看到所有的文字。所以你会选择关注一些你认为重要的部分,例如标题、关键词或者粗体字。这种选择性的关注就是注意力机制。
而transformer就像是一位能帮你读书的机器人。这个机器人可以同时看到所有的文字,它会通过注意力机制来判断哪些部分是最重要的。
机器人会关注标题,因为标题通常能告诉你这一章讲的是什么内容。然后,它会关注关键词,这些关键词能给你一些重要的信息。最后,机器人会根据这些重要的信息来理解整本书的内容,并回答你提出的问题。