从 Seq2Seq 到 Attention:彻底改变序列建模

探究Attention机制和意力的起源。

简介

这篇博文中,将讨论注意力机制的起源,然后介绍第一篇将注意力用于神经机器翻译的论文。由于上下文压缩、短期记忆限制和偏差,具有 2 个 RNN 的 Seq2Seq 模型失败了。该模型的 BLEU 分数随着序列长度的增加而不断降低。

上图显示,随着句子长度的增加,具有 2 个 RNN 的 Seq2Seq 模型会急剧失败。它无法捕获大序列中的所有相关信息。这个问题催生了Attention机制。事实上,注意力的起源可以追溯到很久以前,这次我们学习了如何用数学方式表达它并将其用于机器翻译。

注意力机制的起源

如果我们能抛开一切,专注于我们的眼睛是如何工作的,我们就很容易找到注意力机制的起源。我们可以看到面前的多个物体,但我们会同时关注一个物体。这是我们的注意力提示。我们更重视一些感官输入,而不太重视某些感觉输入。我们可以使用非意志和意志提示来选择注意力的焦点。非意志线索基于环境中物体的显着性和显着性。使用基于变量选择标准的意志提示,这种形式的注意力更加刻意。随着受试者的自愿努力,它也会变得更加强大。

查询、键和值

让我介绍一下查询、键和值的概念。在注意力机制的背景下,我们将意志线索称为查询。给定任何查询,注意力机制会通过注意力池对感觉输入进行偏向选择。这些感官输入在注意力机制的背景下称为值。更一般地说,每个值都与一个键配对,可以将其视为该感官输入的非意志提示。

注意力集中

注意力池是指对注意力机制产生的注意力权重中包含的信息进行聚合或总结的过程。注意力评分函数用于根据输入序列的不同部分与当前解码步骤的相关性为其分配权重或分数。

上图所示的机制是,对于特定查询,我们通过使用注意力评分函数来计算其与所有键的相关性。然后我们应用 softmax 运算来获得概率分布(注意力权重)。稍后我们根据这些注意力权重计算这些值的加权和。

注意力评分函数

有不同类型的注意力评分函数。有加性注意力、乘性注意力和缩放点积注意力。 Bahdanau 使用附加注意力作为评分函数。所以,我将在这里讨论它。缩放点积将在下一篇基于"Attention is all you need"论文的博客文章中进行解释。当查询和键是不同长度的向量时,我们使用附加注意力作为评分函数。

给定一个查询 (q) 和一个键 (k),加性注意力评分函数首先连接 Wq 和 Wk。然后将其输入具有单个隐藏层的 MLP,其隐藏单元的数量为 h(一个超参数)。 Tanh 用作激活函数,偏置项被禁用。

Bahdanau Attention

Bahdanau 注意力及其附加注意力公式成为一种强大且广泛采用的注意力机制。它提供了捕获解码器和编码器状态之间复杂对齐的灵活性,使模型能够生成更准确和上下文感知的序列。这种架构允许模型自动(软)搜索源句子中与预测目标单词相关的部分。为每个单词分配注意力权重,以了解模型应该对每个单词给予多少"注意力"(即,对于每个单词,网络学习一个"上下文")

Bahdanau 注意力机制由三个主要组件组成:编码器、解码器和注意力评分函数。编码器由双向 RNN 组成,解码器由单向 RNN 组成。双向循环神经网络 (BRNN) 是一种 RNN 架构,可以向前和向后处理输入序列。它结合来自过去和未来上下文的信息,在每个时间步骤进行预测或生成输出,使模型能够捕获两个方向的依赖关系。上图中,BRNN 的隐藏状态用 h(t) 表示,单向 RNN 的隐藏状态用 s(t) 表示。

注意力权重 a(t,T) 表示每个编码器隐藏状态与当前解码步骤的相关性。这些注意力分数量化了应该对输入序列的每个部分给予多少注意力。这是由另一个前馈网络计算的。该网络接受编码器和解码器的隐藏状态的输入并输出值 e。然后使用 softmax 函数对注意力分数进行归一化,将其转换为概率分布。 softmax 函数确保注意力分数总和为 1,从而可以将它们解释为权重或概率。

在上图中,上下文向量被计算为编码器隐藏状态的加权和,以注意力分数作为权重。然后这个上下文向量被输入到解码器中。上下文向量与解码器先前的隐藏状态连接,并且该组合表示用作生成下一个输出标记的输入。

总结

总之,注意力机制的起源和 Bahdanau 注意力的引入彻底改变了序列建模和自然语言处理领域。受人类认知过程启发的注意力概念使神经网络能够专注于输入序列的相关部分,并在序列生成任务期间做出明智的决策。从注意力机制的早期到 Bahdanau 注意力所带来的突破,这一历程为机器翻译、文本摘要、语音识别和其他基于序列的任务的进步铺平了道路。

本文由mdnice多平台发布

相关推荐
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭5 分钟前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
少年姜太公4 小时前
从零开始详解js中的this(下)
前端·javascript·程序员
凌虚5 小时前
Kubernetes APF(API 优先级和公平调度)简介
后端·程序员·kubernetes
小华同学ai10 小时前
ShowDoc:Star12.3k,福利项目,个人小团队的在线文档“简单、易用、轻量化”还专门针对API文档、技术文档做了优化
前端·程序员·github
小青鱼2 天前
AI编程-Cursor从入门到精通系列之常用概念及解释(二)
人工智能·程序员
捡田螺的小男孩3 天前
参数校验的十个建议!收藏好,别再给测试机会提bug~
java·后端·程序员
哔哩哔哩技术3 天前
B站装机系统实践:从初创到规模化的演进
前端·程序员
程序员鱼皮4 天前
没事别想不开去创业!
计算机·面试·程序员·项目
绝无仅有4 天前
通用的权限管理系统的介绍与总结
面试·程序员·架构
李新_4 天前
工程师如何布置工作?
面试·程序员·团队管理