Self-Attention模型(李宏毅)

📅 2026/7/4 9:59:04
Self-Attention模型(李宏毅)
Self-Attention的由来Self-Attention 的由来 就是用来处理输入是N个向量(vector sequences)输出也是N个向量的问题。根据任务输出不同可以划分为下面3类以 第一种 每个输入都会有一个label输出为例但是上述方法还是有局限如果我们现在任务需要考虑整个sentence的词汇才能解决因为输入的句子的长度是不定的如果window设置成最长句子长度那么可能导致FC过多参数过多需要大量运算、可能over fitting(因为当神经网络的参数过多时模型变得非常复杂可以更好地拟合训练数据中的细节和噪声。然而这种过度拟合训练数据的能力可能导致模型在新数据上的性能下降。) 所以就引出来self-attention。关于过拟合:模型越复杂、参数越多、学习能力越强更容易到学习到训练数据中的细节和噪声泛化性能下降容易过拟合。而在模型结构确定的情况下训练样本越多提供越多的数据信息帮助模型更好地学习数据中的一般模式减少过拟合的风险训练样本不足的情况下模型可能过度拟合训练数据无法很好地泛化到新的数据上导致过拟合。Self-attention的网络结构由self-attention(对行为序列的依赖关系进行建模) 和 FC(全连接层用于特征变换和抽取(专注一个位置的信息抽取))多次叠加(可以在多层次上对信息进行关联融合学习更复杂的特征和模式更好理解输入序列的语义结构)得到。为什么讲self-attention和FC多次堆叠Self-attention 内部结构下图中输入向量a 可以是input 向量 也可以是经过处理后的比如hidden layer 的输出上图中有a1 到b1 的过程拆解为下面两个过程计算两个向量的相似度加性注意力Additive Attention和乘性注意力Multiplicative Attention是两种常见的注意力机制用于在自然语言处理NLP和机器翻译等任务中对输入序列进行加权聚合。加性注意力通过将查询向量和键向量映射到一个共享的中间表示空间然后计算它们的相似度得分最后使用softmax函数将这些得分归一化为注意力权重。具体来说加性注意力的计算步骤如下1. 将查询向量 q 和键向量 k 映射到中间表示空间通常通过矩阵乘法和激活函数如 tanh实现。2. 计算中间表示空间中的相似度得分通常是将两个向量连接并通过一个全连接层得到一个标量得分。3. 使用 softmax 函数将得分归一化为注意力权重。4. 将注意力权重与值向量 v 相乘得到加权后的值向量。相比之下乘性注意力不需要中间表示空间的映射而是直接将查询向量和键向量进行点积运算并通过 softmax 函数归一化得到注意力权重。乘性注意力的计算步骤如下1. 计算查询向量 q 和键向量 k 的点积得分。2. 使用 softmax 函数将得分归一化为注意力权重。3. 将注意力权重与值向量 v 相乘得到加权后的值向量。加性注意力和乘性注意力在计算方式上略有不同但它们的目标都是根据查询向量和键向量之间的相似度来赋予不同的注意力权重。通过使用注意力权重对值向量进行加权求和可以聚合输入序列中与查询向量相关的信息并用于下游任务的处理。Self-attention 的 执行顺序q*k -- softmax -- dropout -- 权重*VMask Self-attention 的 执行顺序q*k --掩码-- softmax -- dropout -- 权重*V根据q1 与k1、k2、k3的相似度 计算得出b1Self-Attention的公式self-attention中三个向量在Self-Attention中将一个向量转化为三个向量 q、k 和 v 的目的是为了进行查询query、键key和值value的计算以便计算注意力权重并对值进行加权求和。Query查询向量 q查询向量用于衡量输入序列中每个位置与其他位置的关联程度。它可以看作是用于提出问题的向量帮助模型找到与当前位置相关的信息。Key键向量 k键向量用于表示输入序列中每个位置的特征用于与查询向量进行比较。通过计算查询向量和键向量之间的相似度可以得到每个位置与其他位置的关联程度。Value值向量 v值向量包含了输入序列中每个位置的具体信息。通过计算注意力权重并将其应用于值向量可以对不同位置的信息进行加权求和从而得到最终的表示。将一个向量转化为三个向量 q、k 和 v 的过程可以通过线性变换实现。通过对原始向量进行不同的线性映射可以得到具有不同语义含义的向量表示从而更好地捕捉序列中的关联信息。总而言之通过将一个向量转化为查询向量、键向量和值向量可以得到具有不同语义含义的向量表示之后通过Self-Attention计算查询与键之间的关联程度并对值进行加权求和以捕捉序列中的长距离依赖关系和上下文信息。怎么形象理解上述3个向量呐可以将查询query、键key和值value向量比作一个对话的场景来形象理解。想象你正在阅读一本书并希望询问关于某个特定段落的问题。在这个场景中查询向量q查询向量可以被看作你提出的问题。它表示你希望了解什么是你在对段落进行提问的方式。例如你可能会问“这段文字讲述了什么”或“这段文字中有哪些重要的观点”查询向量帮助模型定位和关注与你问题相关的信息。键向量k键向量代表了段落中的关键信息。它们类似于书中的章节标题或关键词用于帮助模型识别段落中的重要内容和上下文。键向量可以看作是帮助你理解段落内容的线索以便与你的查询进行比较和匹配。值向量v值向量则包含了段落的具体内容或细节信息。它们类似于段落中的具体句子或短语提供了实际的信息内容。值向量可以被视为你从段落中获取的具体答案或解释。通过计算查询向量与键向量之间的相似度Self-Attention 可以根据问题和段落中的关键信息计算每个值向量的权重并对这些值进行加权求和得到最终的答案或理解。这个比喻帮助我们理解查询、键和值向量在Self-Attention中的作用以及它们之间的关系。查询是提出问题的方式键是关键信息的表示值是具体的内容或答案。通过对这些向量的计算和比较Self-Attention可以在输入序列中找到相关的信息并产生合理的输出。三个向量各自的核心职责Query查询向量 Q代表当前 token 自身的检索诉求我现在要找哪些上下文和我相关Key键向量 K代表所有位置 token 对外暴露的匹配特征用来和 Q 做相似度打分Value值向量 V代表所有位置 token 真正要提供给别人的内容信息打分后用来加权融合。MUtil-head Self-attention在self-attention中 我们用一个q去和其他位置的k对比相关性实际上相关性也可以划分为多个方面的相关性这样q1分别乘以wq1、wq2 分别得到两个q11、q12,同样的 k、v 也可以有两种表达方式。两种相关性的q、k、v 是独立的计算相关性时也是独立的只在同一种相关性内部做相似度计算比如两个人 在年龄 和学历两方面的相似度计算。多头里每组头都有独立 QKV 投影一头关注语法主谓一头关注指代关系一头关注时序。 如果只有两个向量每组头只能共享一套特征无法独立学习不同匹配逻辑。多头自注意力就是把 QKV 通过多组独立权重投影分成多个头每个头从不同语义角度单独计算注意力分别捕捉指代、语法、词义等不同上下文依赖最后拼接融合所有视角的特征弥补单头注意力特征混杂、建模能力不足的缺陷。然后将bi1、bi2连接起来乘以W0 得到bi 作为本层的 输出。上述结构存在的问题是没有位置信息a1 和a2、a5的从位置上是没区别的比如在词性标注时我们知道动词不容易放在句首如果包含位置信息我们就能知道它是动词的概率就比较低所以位置信息也是有用的。对位置编码Positional Encoding每个不同的位置对应一个向量ei然后将ei拼接在ai后面就引入了位置编码位置编码可以帮助模型捕捉到元素在不同位置上的语义差异和上下文信息。Self-attention 的应用1、self-attention与CNNCNN中 接受域是一个固定大小的窗口而self-attention的接受域是自己学出来的没有距离限制的区域所以CNN可以看成self-attention的一种是将的接受域限制在一定距离范围内的self-attention(通过设置合适的参数可以将self-attention转化为CNN)。从学习弹性上看self-attention的弹性更大在数据量少时CNN更有优势CNN专注一小块区域的学习而self-attention学习区域更大、更范范但是在数据量大时 CNN并不能从更多的数据量上学习到更多内容而self-attention就可以。2、self-attention与RNN联系① 输入和输出都是 vector sequences区别①RNN 的输出很难抽取到(考虑到)距离较远位置的信息而SA则突破了距离的限制② RNN是串行运算的SA是并行的③单向RNN只能考虑当前输出左侧的输入而SA当前的输出可以考虑左右两侧的输入都可以考虑当然双向RNN 也能考虑两侧的输入。3、self-attention for Graphself-attention 不同向量之间的关联性是通过训练计算得到的而在图中 每一个节点就是一个向量边就表示两者存在关联没有边的链接就表示两者关联性为0将SA应用在图中就得了图神经网络(GNN)【原来如此】深度学习中注意力机制(attention)的真实由来_哔哩哔哩_bilibili