​​​​​文章7成内容参考解码注意力Attention机制从技术解析到PyTorch实战还有3成内容参考深度学习基础算法系列21-一文搞懂注意力机制Attention 【原来如此】深度学习中注意力机制(attention)的真实由来_哔哩哔哩_bilibili一、引言定义注意力机制是指人类的神经系统在面对复杂的感知信息时通过选择性的关注和集中注意力来处理特定的刺激。注意力机制可以帮助我们过滤掉不相关或无用的信息并专注于重要的刺激、任务或目标。这种机制可以通过自主调控或受到外界环境的影响而发生变化。例如注意力可以集中于一个特定的刺激或任务也可以在多个刺激之间进行转移和分配。注意力机制在认知过程中起着重要的作用影响感知、思维、决策和行为等方面的表现。基于注意力机制的深度学习核心在于让机器学会去感知数据中的重要和不重要的部分。或者说人在处理信息的时候会将注意力放在需要关注的信息上对于其他无关的外部信息进行过滤这种处理方式被称为注意力机制。比如在做人脸识别时需要让机器存在一个注意力侧重重点关注图片中人脸的面部特征包括耳朵眼睛鼻子嘴巴而不用太关注背景的一些信息同理在做机器翻译等任务时要让机器注意到每个词向量之间的相关性有侧重地进行翻译模拟人类理解的过程。两种类型非自主提示和自主提示针对于注意力机制的引起方式可以分为两类一种是非自主提示另一种是自主提示。1️⃣非自主提示指的是由于物体本身的特征十分突出引起的注意力倾向。2️⃣自主提示指的是经过先验知识的介入下对具有先验权重的物体引起的注意力倾向。简单可理解为非自主提示源自于物体本身而自主提示源自于一种主观倾向。举例说明如下当第一眼看到上图时便会首先将注意力集中到兔子身上。这是因为整张图中兔子的特征十分的突出让人一眼就关注到兔子身上。这种引起注意力的方式便是非自主提示。在看到兔子之后便想兔子在干嘛从而就会关注兔子的行为。此时兔子在吃草这时便把注意力集中在兔子周边的草上。这种引起注意力机制的方式便是自主提示其中兔子在干嘛则是主观意识。另一种等价说法历史背景2014年序列到序列Seq2Seq模型的出现为自然语言处理NLP和机器翻译带来了巨大的突破。在2014年Google mind团队发表《Recurrent Models of Visual Attention》一文文中首次在RNN模型上使用了attention机制来进行图像分类2015年Bahdanau等人首次引入了注意力机制用于改进基于Seq2Seq的机器翻译。2017年Vaswani等人提出了Transformer模型这是第一个完全依赖于注意力机制来传递信息的模型显示出了显著的性能提升。2017年Ashish Vaswani的《Attention is all you need》中Transformer结构的提出注意力机制在NLP、CV相关问题的网络设计上被广泛应用2018-2021年注意力机制开始广泛应用于不同的领域包括计算机视觉、语音识别和生成模型如GPT和BERT等。2021年以后研究者们开始探究如何改进注意力机制以便于更大、更复杂的应用场景如多模态学习和自监督学习。重要性1、性能提升注意力机制一经引入即显著提升了各种任务的性能包括但不限于文本翻译、图像识别和强化学习。2、计算效率通过精心设计的权重分配注意力机制有助于减少不必要的计算从而提高模型的计算效率。3、可解释性虽然深度学习模型常被批评为“黑盒”但注意力机制提供了一种直观的方式来解释模型的决策过程。4、模型简化在多数情况下引入注意力机制可以简化模型结构如去除或减少递归网络的需要。5、领域广泛性从自然语言处理到计算机视觉再到医学图像分析注意力机制的应用几乎无处不在。6、模型泛化注意力机制通过更智能地挑选关联性强的特征提高了模型在未见过数据上的泛化能力。7、未来潜力考虑到当前研究的活跃程度和多样性注意力机制有望推动更多前沿科技的发展如自动驾驶、自然语言界面等。最主要是以下两个方面的原因1计算能力的限制目前计算能力依然是限制神经网络 发展的瓶颈当要记住很多“信息“模型就要变得更复杂通过引入注意力可以聚焦重要的部分减少处理的信息量从而减小需要的计算资源。2优化算法的限制虽然CNN、RNN及其各种变体模型可以有效缓解模型复杂度和表达能力之间的矛盾但是如LSTM只能在一定程度上缓解RNN中的长距离依赖问题且信息“记忆”能力并不高。二、注意力机制注意力机制是一种模拟人类视觉和听觉注意力分配的方法在处理大量输入数据时它允许模型关注于最关键的部分。这一概念最早是为了解决自然语言处理中的序列到序列模型的一些局限性而被提出的但现在已经广泛应用于各种机器学习任务。基础概念定义在数学上注意力函数可以被定义为一个映射该映射接受一个查询Query和一组键值对Key-Value pairs然后输出一个聚合后的信息通常称为注意力输出也叫注意力分数。注意力(Q, K, V) 聚合(权重 * V)其中权重通常是通过查询Q和键K的相似度计算得到的权重 softmax(Q * K^T / sqrt(d_k))d_k 表示查询向量Q或键向量K的特征维度即列不是时间维度即行。这个或字是因为这两个维度大小是一致的因为为了保证矩阵乘法可以进行ps对于一维张量向量通常我们只讨论其长度而不区分时间维度或特征维度缩放因子scaling factorsqrt(d_k) 是用来缩放注意力权重分布的一个系数据说是为了稳定梯度组件Query查询代表需要获取信息的请求。即我们的输入信息就是我自己本身Key键与Query相关性的衡量标准。KV成组出现一般是源语言or源文本就是我们关注的对象Value值包含需要被提取信息的实际数据。权重Attention Weights通过Query和Key的相似度计算得来决定了从各个Value中提取多少信息。如何理解KQV以阅读理解为例Q就是问题K和V就是原始文本再简单点说A关注BA就是QB就是KV对也许你会想问那K和V的区别是啥这里我比较喜欢GPT的回答K和V的关系是它们通常来自序列中的同一元素但在不同的向量空间中。在自注意力计算中首先将查询Q与所有键K进行点积或使用其他相似度度量方法得到一个分数矩阵这个分数矩阵表示了序列中每个元素对当前查询的相关性。然后这些分数通过softmax函数进行归一化确保每一行的和为1形成一个概率分布。最后这个概率分布用来对值V进行加权求和得到最终的输出。数学意义点积 ( QK^T )这一步测量了查询和键之间的相似性。点积越大意味着查询和相应的键更相似。缩放因子 ( \sqrt{d_k} )缩放因子用于调整点积的大小使得模型更稳定防止梯度过大或过小。Softmax 函数Softmax 用于将点积缩放的结果转化为概率分布从而确定每个值在最终输出中的权重。好了接下来解释一下注意力机制的细节上面这张图的很好的讲解【原来如此】深度学习中注意力机制(attention)的真实由来_哔哩哔哩_bilibili我总结以下几个重点!!!1T代表时间维度序列长度D代表特征维度2为了保证矩阵可以相乘必须满足对于二维张量矩阵通常会有明确的行和列这时候可以区分时间维度通常指的是矩阵的行数如果每一行代表一个时间点的数据。特征维度通常指的是矩阵的列数如果每一列代表一个特征的值。3Q*K是在算相关性的问题还没涉及到值呢借助向量内积90度以内夹角越小内积越大考试抄作业4Softmax可以把两个负相关的向量的内积值变成一个很小很小的正数概率并把原来的正数也变成01之间的概率值5现在可以接受为啥必须要用Softmax把权重变成正的因为V的值是个任意值可正可负。如果没有Softmax权重K*Q就有可能有负的负负得正啊那样结果就不是我们想要的了。这才是必须用Softmax的精髓所在这也说明了最终的注意力计算结果是可正可负的因为权重必须是正的v可正可负最终一乘结果就是可正可负看到了另一个很好的解释查询、键和值根据自主提示和非自主提示来设计注意力机制。1️⃣首先考虑简单情况即只考虑非自主提示的话只需要对所有物体的特征信息非自主提示进行简单的全连接层甚至是无参数的平均汇聚层或者最大汇聚层就可以提取出需要感兴趣的物体。下图是平均汇聚方法的示例图最后结果是所有物体向量的平均加权和看最终加强求和后和哪个物体的向量值最接近。。2️⃣如果考虑自主提示的话我们就需要设计一种通过查询Query键Key和值Value来实现注意力机制的方法。其中Query指的是自主提示即主观意识的特征向量Key指的是非自主提示即物体的突出特征信息向量Value则是代表物体本身的特征向量。注意力机制是通过Query与Key的注意力汇聚指的是对Query和Key的相关性进行建模实现池化筛选或者分配权重实现对Value的注意力权重分配生成最终的输出结果。如下图所示划重点1、注意力可以分为两种方式分别是自主提示和非自主提示。其中非自主提示是键自主提示是查询物体原始向量是值。键和值是一一对应的务必理解2、注意力机制的评分函数可以对查询和键进行关系建模获取查询和键的相似度匹配。其方法分为两种加性注意力和点积注意力。常用的是点积注意力。注意力机制的分类1点积Dot-Product注意力2缩放点积Scaled Dot-Product注意力3多头注意力Multi-Head Attention自注意力的升级版4自注意力Self-Attention只关注输入序列元素之间的关系即将输入序列之间转换为KQV5双向注意力Bi-Directional Attention当然还有别的分类方法个人更喜欢下面的分类方法从广义来说可分为三类自注意内注意、软注意全局注意和硬注意局部注意。Self/Intra Attention自注意力机制对每个输入项分配的权重取决于输入项之间的相互作用即通过输入项内部的表决来决定应该关注哪些输入项。和前两种相比在处理很长的输入时具有并行计算的优势。Global/Soft Attention(软注意机制)对每个输入项的分配的权重为0-1之间也就是某些部分关注的多一点某些部分关注的少一点因为对大部分信息都有考虑但考虑程度不一样所以相对来说计算量比较大。Local/Hard Attention(硬注意机制)对每个输入项分配的权重非0即1和软注意不同硬注意机制只考虑哪部分需要关注哪部分不关注也就是直接舍弃掉一些不相关项。优势在于可以减少一定的时间和计算成本但有可能丢失掉一些本应该注意的信息。以上三类又可以细化为很多小类下面的总结了几种流行的注意力机制以及相应的注意力打分数函数score。举例说明假设我们有一个简单的句子“猫喜欢追逐老鼠”。如果我们要对“喜欢”这个词进行编码一个简单的方法是只看这个词本身但这样会忽略它的上下文。“喜欢”的对象是“猫”而被“喜欢”的是“追逐老鼠”。在这里“猫”和“追逐老鼠”就是“喜欢”的上下文而注意力机制能够帮助模型更好地捕获这种上下文关系。# 使用PyTorch实现简单的点积注意力 import torch import torch.nn.functional as F # 初始化Query, Key, Value Q torch.tensor([[1.0, 0.8]]) # Query 对应于 喜欢 的编码 K torch.tensor([[0.9, 0.1], [0.8, 0.2], [0.7, 0.9]]) # Key 对应于 猫, 追逐, 老鼠 的编码 V torch.tensor([[1.0, 0.1], [0.9, 0.2], [0.8, 0.3]]) # Value 也对应于 猫, 追逐, 老鼠 的编码 # 计算注意力权重 d_k K.size(1) # size1是特征维度本例 2 scores torch.matmul(Q, K.transpose(0, 1)) / (d_k ** 0.5) weights F.softmax(scores, dim-1) # 计算注意力输出 output torch.matmul(weights, V) print(注意力权重:, weights) print(注意力输出:, output)输出注意力权重: tensor([[0.2561, 0.2525, 0.4914]]) 注意力输出: tensor([[0.8766, 0.2235]])这里“喜欢”通过注意力权重与“猫”和“追逐老鼠”进行了信息的融合并得到了一个新的编码从而更准确地捕获了其在句子中的语义信息。这个值[0.8766, 0.2235]与“老鼠”的向量[0.8, 0.3]最接近相比于“猫”的[1.0, 0.1]和“追逐”的[0.9, 0.2]。通过这个例子我们可以看到注意力机制是如何运作的以及它在理解序列数据特别是文本数据中的重要性。再举个例子假设我们有三个单词apple、orange 、fruit用三维向量 ( Q, K_1, K_2 ) 表示。import math import torch # Query, Key 初始化 Q torch.tensor([2.0, 3.0, 1.0]) K1 torch.tensor([1.0, 2.0, 1.0]) # apple K2 torch.tensor([1.0, 1.0, 2.0]) # orange # 点积计算 dot_product1 torch.dot(Q, K1) dot_product2 torch.dot(Q, K2) # 缩放因子 d_k Q.size(0) # 一维张量size0就行Q和K大小一致写哪个都行本例3 scale_factor math.sqrt(d_k) # 缩放点积 scaled_dot_product1 dot_product1 / scale_factor scaled_dot_product2 dot_product2 / scale_factor # Softmax 计算 weights torch.nn.functional.softmax(torch.tensor([scaled_dot_product1, scaled_dot_product2]), dim0) print(权重:, weights)输出权重: tensor([0.5837, 0.4163])在这个例子中权重显示“fruit”与“apple”0.5837相比“orange”0.4163更相似。这种计算方式为我们提供了一种量化“相似度”的手段进一步用于信息聚合。通过深入理解注意力机制的数学模型我们可以更准确地把握其如何提取和聚合信息以及它在各种机器学习任务中的应用价值。这也为后续的研究和优化提供了坚实的基础。三、注意力值的计算过程为了便于大家更好的理解这里张张以软性注意力机制为例详细介绍它的计算过程。软性注意力机制的思想用数学语言来表达X[x1,x2,…,XN]表示N个输入信息为了节省计算资源神经网络不需要处理这N个输入信息而只需要从X中选择一些与任务相关的信息进行计算。也可以对应于下面的场景把输入信息向量X看做是一个信息存储器现在给定一个查询向量q用来查找并选择X中的某些信息软性注意力机制从所有的信息中按q与X相关度来抽取信息。注意力值的计算分为以下两步计算注意力分布、计算加权平均。1计算注意力分布定义一个注意力变量来表示被选择信息的索引位置即来表示选择了第个输入信息然后计算在给定了和的情况下选择第个输入信息的概率计算公式如下其中构成的概率向量就称为注意力分布。是注意力打分函数有以下几种形式其中W、U和v是可学习的网络参数d是输入信息的维度。2计算加权平均注意力分布表示在给定查询q时输入信息向量X中第i个信息与查询q的相关程度。采用软性注意力机制给出查询所得的结果就是用加权平均的方式对输入信息进行汇总得到Attention值下图是计算Attention值的过程更一般的可以用键值对key-value pair来表示输入信息那么就可以将注意力机制看做是一种软寻址操作这也是我们最常用的操作计算Query与存储器内元素的地址Key的相似度再通过Query与Key的相似性计算每个Value值的权重然后对Value值进行加权求和加权求和得到最终的Value值也就是Attention值。公式表示如下四、注意力机制的对比小举例为了更直观地说明注意力机制的作用这里以Seq-to-Seq模型为例对比未加入注意力机制的模型和加入了注意力机制后的模型。1未使用注意力机制的模型《Learning phrase representations using RNN encoder-decoder for statistical machine translation》这篇论文提出了一种RNN Encoder-Decoder的结构如下图。预测第t个单词的概率公式如下可以看到在生成目标句子的每一个单词时使用的语义表示向量c都是同一个也就说生成每一个单词时并没有产生这样与每个输出的单词相对应的多个不同的语义表示。那么在预测某个词时任何输入单词对于它的重要性都是一样的也就是注意力分散了。2加入注意力机制的模型《Neural Machine Translation by Jointly Learning to Align and Translate 》在上面论文的基础上提出了一种新的神经网络翻译模型结构也就是在RNN Encoder-Decoder框架中加入了注意力机制如下图预测第i个单词的概率公式如下增加了注意力机制的网络结构中注意力模块负责自动学习注意力权重它可以自动捕获编码器隐藏状态我们称之为候选状态和解码器隐藏状态我们称之为查询状态之间的相关性。然后这些注意力权重用于构建内容向量C该向量作为输入传递给解码器。在每个解码位置内容向量是编码器所有隐藏状态及其相应注意权的加权和。总的来说两种框架相比加入注意力机制的框架的核心在于固定不变的语义向量表示被替换成了根据当前生成的单词而不断变化的语义表示。通过这样的方式可以使模型快速聚焦于重要的部分。五、注意力网络在NLP中的应用拓展注意力机制在自然语言处理NLP中有着广泛的应用包括机器翻译、文本摘要、命名实体识别NER等。本节将深入探讨几种常见应用并提供相应的代码示例。机器翻译机器翻译是最早采用注意力机制的NLP任务之一。传统的Seq2Seq模型在处理长句子时存在信息损失的问题注意力机制通过动态权重分配来解决这一问题。代码示例import torch import torch.nn as nn class AttentionSeq2Seq(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim): super(AttentionSeq2Seq, self).__init__() self.encoder nn.LSTM(input_dim, hidden_dim) self.decoder nn.LSTM(hidden_dim, hidden_dim) self.attention nn.Linear(hidden_dim * 2, 1) self.output_layer nn.Linear(hidden_dim, output_dim) def forward(self, src, tgt): # Encoder encoder_output, (hidden, cell) self.encoder(src) # Decoder with Attention output [] for i in range(tgt.size(0)): # 计算注意力权重 attention_weights torch.tanh(self.attention(torch.cat((hidden, encoder_output), dim2))) attention_weights torch.softmax(attention_weights, dim1) # 注意力加权和 weighted torch.sum(encoder_output * attention_weights, dim1) # Decoder out, (hidden, cell) self.decoder(weighted.unsqueeze(0), (hidden, cell)) out self.output_layer(out) output.append(out) return torch.stack(output)文本摘要文本摘要任务中注意力机制能够帮助模型挑选出文章中的关键句子或者词生成一个内容丰富、结构紧凑的摘要。代码示例class TextSummarization(nn.Module): def __init__(self, vocab_size, embed_size, hidden_size): super(TextSummarization, self).__init__() self.embedding nn.Embedding(vocab_size, embed_size) self.encoder nn.LSTM(embed_size, hidden_size) self.decoder nn.LSTM(hidden_size, hidden_size) self.attention nn.Linear(hidden_size * 2, 1) self.output nn.Linear(hidden_size, vocab_size) def forward(self, src, tgt): embedded self.embedding(src) encoder_output, (hidden, cell) self.encoder(embedded) output [] for i in range(tgt.size(0)): attention_weights torch.tanh(self.attention(torch.cat((hidden, encoder_output), dim2))) attention_weights torch.softmax(attention_weights, dim1) weighted torch.sum(encoder_output * attention_weights, dim1) out, (hidden, cell) self.decoder(weighted.unsqueeze(0), (hidden, cell)) out self.output(out) output.append(out) return torch.stack(output)命名实体识别NER在命名实体识别任务中注意力机制可以用于捕捉文本中不同实体之间的依赖关系。代码示例class NERModel(nn.Module): def __init__(self, vocab_size, embed_size, hidden_size, output_size): super(NERModel, self).__init__() self.embedding nn.Embedding(vocab_size, embed_size) self.rnn nn.LSTM(embed_size, hidden_size, bidirectionalTrue) self.attention nn.Linear(hidden_size * 2, 1) self.fc nn.Linear(hidden_size * 2, output_size) def forward(self, x): embedded self.embedding(x) rnn_output, _ self.rnn(embedded) attention_weights torch.tanh(self.attention(rnn_output)) attention_weights torch.softmax(attention_weights, dim1) weighted torch.sum(rnn_output * attention_weights, dim1) output self.fc(weighted) return output这些只是注意力网络在NLP中应用的冰山一角但它们清晰地展示了注意力机制如何增强模型的性能和准确性。随着研究的不断深入我们有理由相信注意力机制将在未来的NLP应用中发挥更加重要的作用。六、注意力网络在计算机视觉中的应用拓展注意力机制不仅在NLP中有广泛应用也在计算机视觉CV领域逐渐崭露头角。本节将探讨注意力机制在图像分类、目标检测和图像生成等方面的应用并通过代码示例展示其实现细节。图像分类在图像分类中注意力机制可以帮助网络更加聚焦于与分类标签密切相关的图像区域。代码示例import torch import torch.nn as nn class AttentionImageClassification(nn.Module): def __init__(self, num_classes): super(AttentionImageClassification, self).__init__() self.conv1 nn.Conv2d(3, 32, 3) self.conv2 nn.Conv2d(32, 64, 3) self.attention nn.Linear(64, 1) self.fc nn.Linear(64, num_classes) def forward(self, x): x self.conv1(x) x self.conv2(x) attention_weights torch.tanh(self.attention(x.view(x.size(0), x.size(1), -1))) attention_weights torch.softmax(attention_weights, dim2) x torch.sum(x.view(x.size(0), x.size(1), -1) * attention_weights, dim2) x self.fc(x) return x目标检测在目标检测任务中注意力机制能够高效地定位和识别图像中的多个对象。代码示例class AttentionObjectDetection(nn.Module): def __init__(self, num_classes): super(AttentionObjectDetection, self).__init__() self.conv nn.Conv2d(3, 64, 3) self.attention nn.Linear(64, 1) self.fc nn.Linear(64, 4 num_classes) # 4 for bounding box coordinates def forward(self, x): x self.conv(x) attention_weights torch.tanh(self.attention(x.view(x.size(0), x.size(1), -1))) attention_weights torch.softmax(attention_weights, dim2) x torch.sum(x.view(x.size(0), x.size(1), -1) * attention_weights, dim2) x self.fc(x) return x图像生成图像生成任务如GANs也可以从注意力机制中受益尤其在生成具有复杂结构和细节的图像时。代码示例class AttentionGAN(nn.Module): def __init__(self, noise_dim, img_channels): super(AttentionGAN, self).__init__() self.fc nn.Linear(noise_dim, 256) self.deconv1 nn.ConvTranspose2d(256, 128, 4) self.attention nn.Linear(128, 1) self.deconv2 nn.ConvTranspose2d(128, img_channels, 4) def forward(self, z): x self.fc(z) x self.deconv1(x.view(x.size(0), 256, 1, 1)) attention_weights torch.tanh(self.attention(x.view(x.size(0), x.size(1), -1))) attention_weights torch.softmax(attention_weights, dim2) x torch.sum(x.view(x.size(0), x.size(1), -1) * attention_weights, dim2) x self.deconv2(x.view(x.size(0), 128, 1, 1)) return x这些应用示例明确地展示了注意力机制在计算机视觉中的潜力和多样性。随着更多的研究和应用注意力网络有望进一步推动计算机视觉领域的发展。七、注意力机制拓展一文搞懂深度学习的注意力机制 | 软和硬到底如何抉择转自https://blog.csdn.net/weixin_42110638/article/details/134011134