Attention机制原理

注意力机制在深度学习中用于改善Encoder-Decoder模型的性能,特别是在机器翻译任务中。传统的Encoder-Decoder框架在处理长序列时可能会丢失重要信息。注意力模型通过为每个目标词动态分配源序列中不同位置的权重,解决了这一问题。在翻译过程中,注意力模型能突出显示与当前目标词生成最相关的源词,从而提高翻译质量。这一机制通过计算query和key的相似度,归一化得分并加权value来实现。

Attention机制原理


其实Attention 机制的工作原理并不复杂,我们可以用下面这张图做一个总结

在这里插入图片描述

  • 一个 Attention 的计算过程有三步:
    • 阶段一: query 和 key 进行相似度计算,得到一个query 和 key 相关性的分值
    • 阶段二: 将这个分值进行归一化(softmax),得到一个注意力的分布
    • 阶段三: 使用注意力分布和 value 进行计算,得到一个融合注意力的更好的 value 值

为了更好的说明上面的情况, 我们通过注意力来做一个机器翻译(NMT) 的任务,机器翻译中,我们会使用 seq2seq 的架构,每个时间步从词典里生成一个翻译的结果。就像下面这张图一样.

在这里插入图片描述

在没有注意力之前,我们每次都是根据 Encoder 部分的输出结果来进行生成,提出注意力后,就是想在生成翻译结果时并不是看 Encoder 中所有的输出结果,而是先来看看,我想生成的这部分和哪些单词可能关系会比较大,关系大的我多借鉴些;关系小的,少借鉴些。就是这样一个想法,我们看看该如何操作。

  • 这里为了生成单词,我们把 Decoder 部分输入后得到的向量作为 query;把 Encoder 部分每个单词的向量作为 key。首先我们先把 query 和 每一个单词进行点乘 score=query·key,得到相关性的分值;
  • 有了这些分值后,我们对这些分值做一个softmax,得到一个注意力的分布
  • 有了这个注意力,我们就可以用它和 Encoder 的输出值 (value) 进行相乘,得到一个加权求和后的值,这个值就包含注意力的表示,我们用它来预测要生成的词。

这个过程我们可以看看一个动图的事例理解一下:(由于不能上传视频就截了一张图片)

在这里插入图片描述

当然,Attention 并不是只有这一种计算方式,后来还有很多人找到了各种各样的计算注意力的方法, 比如我们上面介绍的三种计算规则, 但是从本质上,它们都遵循着这个三步走的逻辑:

  • query 和 key 进行相似度计算,得到一个query 和 key 相关性的分值
  • 将这个分值进行归一化(softmax),得到一个注意力的分布
  • 使用注意力分布和 value 进行计算,得到一个融合注意力的更好的 value 值

  • 没有attention模型和具有attention模型对比

    • 无attention机制的模型

在这里插入图片描述

- 文本处理领域的Encoder-Decoder框架可以这么直观地去理解:可以把它看作适合处理由一个句子(或篇章)生成另外一个句子(或篇章)的通用处理模型。对于句子对<Source,Target>,我们的目标是给定输入句子Source,期待通过Encoder-Decoder框架来生成目标句子Target。Source和Target可以是同一种语言,也可以是两种不同的语言。而Source和Target分别由各自的单词序列构成:

在这里插入图片描述

- encoder顾名思义就是对输入句子Source进行编码,将输入句子通过非线性变换转化为中间语义表示C:

在这里插入图片描述

- 对于解码器Decoder来说,其任务是根据句子Source的中间语义表示C和之前已经生成的历史信息,y_1, y_2…y_i-1来生成i时刻要生成的单词y_i

在这里插入图片描述

- 上述图中展示的Encoder-Decoder框架是没有体现出“注意力模型”的,所以可以把它看作是注意力不集中的分心模型。为什么说它注意力不集中呢?请观察下目标句子Target中每个单词的生成过程如下:

在这里插入图片描述

- 其中f是Decoder的非线性变换函数。从这里可以看出,在生成目标句子的单词时,不论生成哪个单词,它们使用的输入句子Source的语义编码C都是一样的,没有任何区别。

- 每个yi都依次这么产生,那么看起来就是整个系统根据输入句子Source生成了目标句子Target。如果Source是中文句子,Target是英文句子,那么这就是解决机器翻译问题的Encoder-Decoder框架;如果Source是一篇文章,Target是概括性的几句描述语句,那么这是文本摘要的Encoder-Decoder框架;如果Source是一句问句,Target是一句回答,那么这是问答系统或者对话机器人的Encoder-Decoder框架。由此可见,在文本处理领域,Encoder-Decoder的应用领域相当广泛。

- **问题点是**: 语义编码C是由句子Source的每个单词经过Encoder 编码产生的,这意味着不论是生成哪个单词,还是,其实句子Source中任意单词对生成某个目标单词yi来说影响力都是相同的,这是为何说这个模型没有体现出注意力的缘由。这类似于人类看到眼前的画面,但是眼中却没有注意焦点一样.
  • 具有attention机制的模型

    • 如果拿机器翻译来解释这个分心模型的Encoder-Decoder框架更好理解,比如输入的是英文句子:Tom chase Jerry,Encoder-Decoder框架逐步生成中文单词:“汤姆”,“追逐”,“杰瑞”。

      在翻译“杰瑞”这个中文单词的时候,分心模型里面的每个英文单词对于翻译目标单词“杰瑞”贡献是相同的,很明显这里不太合理,显然“Jerry”对于翻译成“杰瑞”更重要,但是分心模型是无法体现这一点的,这就是为何说它没有引入注意力的原因。

    • 没有引入注意力的模型在输入句子比较短的时候问题不大,但是如果输入句子比较长,此时所有语义完全通过一个中间语义向量来表示,单词自身的信息已经消失,可想而知会丢失很多细节信息,这也是为何要引入注意力模型的重要原因。

    • 上面的例子中,如果引入Attention模型的话,应该在翻译“杰瑞”的时候,体现出英文单词对于翻译当前中文单词不同的影响程度,比如给出类似下面一个概率分布值:(Tom,0.3)(Chase,0.2) (Jerry,0.5).每个英文单词的概率代表了翻译当前单词“杰瑞”时,注意力分配模型分配给不同英文单词的注意力大小。这对于正确翻译目标语单词肯定是有帮助的,因为引入了新的信息。

    • 同理,目标句子中的每个单词都应该学会其对应的源语句子中单词的注意力分配概率信息。这意味着在生成每个单词的时候,原先都是相同的中间语义表示C会被替换成根据当前生成单词而不断变化的。理解Attention模型的关键就是这里,即由固定的中间语义表示C换成了根据当前输出单词来调整成加入注意力模型的变化的。增加了注意力模型的Encoder-Decoder框架理解起来如下图所示:

在这里插入图片描述

- 即生成目标句子单词的过程成了下面的形式:

在这里插入图片描述

- 而每个Ci可能对应着不同的源语句子单词的注意力分配概率分布,比如对于上面的英汉翻译来说,其对应的信息可能如下:

在这里插入图片描述

  > 其中,f2函数代表Encoder对输入英文单词的某种变换函数,比如如果Encoder是用的RNN模型的话,这个f2函数的结果往往是某个时刻输入后隐层节点的状态值;g代表Encoder根据单词的中间表示合成整个句子中间语义表示的变换函数,一般的做法中,g函数就是对构成元素加权求和,即下列公式

在这里插入图片描述
>
> > 其中, Lx代表输入句子source的长度, a_ij代表在Target输出第i个单词时source输入句子中的第j个单词的注意力分配系数, 而hj则是source输入句子中第j个单词的语义编码, 假设Ci下标i就是上面例子所说的’汤姆’, 那么Lx就是3, h1=f(‘Tom’), h2=f(‘Chase’),h3=f(‘jerry’)分别输入句子每个单词的语义编码, 对应的注意力模型权值则分别是0.6, 0.2, 0.2, 所以g函数本质上就是加权求和函数, 如果形象表示的话, 翻译中文单词’汤姆’的时候, 数学公式对应的中间语义表示Ci的形成过程类似下图:
在这里插入图片描述


### Attention机制的工作原理 注意力机制Attention Mechanism)是一种模仿人类视觉选择性的方法,其核心在于通过对全局信息的扫描,将更多的资源集中到重要的局部区域。在计算机科学领域,这一过程通常通过权重分配的方式来实现[^2]。 #### 1. 基本工作流程 在传统 Encoder-Decoder 架构中,模型使用固定长度的向量表示整个输入序列的信息。然而这种方式存在局限性,因为它无法很好地捕捉长距离依赖关系或者复杂语义结构。为了克服这个问题,引入了 attention 机制,使得解码器能够在生成每一个输出词的时候,动态地关注输入序列的不同部分[^4]。 具体来说,attention 的计算分为以下几个阶段: - **打分函数**:定义一个评分函数用于衡量当前时刻的目标状态 \(s_t\) 和源端隐藏层状态 \(\{h_1,h_2,...,h_n\}\)之间的相似度得分。 \[ e_{t,j} = score(s_t, h_j), j=1..n \] 其中 n 表示输入序列长度;score 函数可以根据实际需求设计成多种形式如点积、双线性形式等。 - **归一化概率分布**:利用 softmax 对所有位置上的分数做规范化得到最终的概率分布 αij ,即每个时间步 t 下各个输入 token 被注意到的可能性大小。 \[ \alpha_{t,j}=\frac{\exp(e_{t,j})}{\sum_k^n exp(e_{t,k})},j=1...n \] - **上下文向量构建**:基于上述获得的关注程度系数集合 {αi₁,… ,αin } 加权求和对应 hidden states 得到 context vector Cti \[ c_t = \Sigma^{n}_{j=1} (\alpha_{t,j}*h_j ) \] 最后一步就是把该上下文向量 Ct 结合进 decoder 当前的状态更新过程中完成预测任务。 --- ### 不同类型的Attention机制 根据应用场景和技术特点不同可分为多种类型: - **Soft-Attention**: 它允许网络在整个训练期间访问所有的记忆单元,并且不会改变原始数据的位置顺序。它适用于大多数 NLP 应用场景因为它的平滑性和可微特性便于优化算法收敛。 - **Hard-Attention**: 只随机选取某些特定的记忆片段来进行后续处理而不是全部考虑进去从而减少计算成本但是由于是非连续操作所以难以直接应用于梯度下降法调整参数因此一般配合强化学习一起使用效果较好。 - **Global vs Local Attention**: Global means every word has potential to be attended while local restricts this range within a small window around current position. - **Self-Attention / Multihead Self-Attention (MHA)**: As described earlier self-attention allows each element inside sequence itself become query key value triplets enabling interaction among themself without external references which forms basis of transformer architecture whereas multi-headed variant enhances expressiveness by parallel processing multiple subspaces simultaneously enhancing overall performance further.[^3] --- ### 实际应用案例分析 以机器翻译为例说明如何运用attention mechanism提升系统表现力。假设我们要把中文句子转换成英文表述,则source side 就是我们待译入句target side 则为目标语言表达式。当采用带attention component 的seq2seq model 后,在每一轮迭代过程中decoder 都能依据之前累积的知识以及即时产生的context information 来决定下一步最佳候选词汇进而逐步形成完整的输出串列直至结束标志符出现为止。这样做的好处是可以有效缓解vanishing gradient problem 并提高long sentence translation quality significantly compared with vanilla version lacking such functionality altogether .[^5] ```python import torch.nn as nn class SimpleAttention(nn.Module): def __init__(self, input_dim, output_dim): super(SimpleAttention, self).__init__() self.linear_in = nn.Linear(input_dim, output_dim) def forward(self, queries, keys, values): scores = torch.matmul(queries, keys.transpose(-2,-1)) # Compute alignment scores attn_weights = F.softmax(scores,dim=-1) # Normalize weights over all positions weighted_sum = torch.bmm(attn_weights,values) # Weighted sum based on normalized weights return weighted_sum # Return the final representation after applying attention ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值