解析广泛应用于NLP的自注意力机制(附论文、源码)

简介:

近年来,注意力(Attention)机制被广泛应用到基于深度学习的自然语言处理各个任务中,之前我对早期注意力机制进行过一些学习总结 [1]。

随着注意力机制的深入研究,各式各样的 Attention 被研究者们提出。在 2017年 6 月 Google 机器翻译团队在 arXiv 上放出的 Attention is All You Need [2] 论文受到了大家广泛关注,自注意力(self-attention)机制开始成为神经网络 Attention 的研究热点,在各个任务上也取得了不错的效果。

本人就这篇论文中的 Self-Attention 以及一些相关工作进行了学习总结,其中也参考借鉴了张俊林博士的博客深度学习中的注意力机制(2017版)[3]"和苏剑林的一文读懂「Attention is All You Need」| 附代码实现,和大家一起分享。

背景知识

Attention 机制最早是在视觉图像领域提出来的,应该是在九几年思想就提出来了,但是真正火起来应该算是 2014 年 Google Mind 团队的这篇论文 Recurrent Models of Visual Attention [4],他们在 RNN 模型上使用了 Attention机制来进行图像分类。

随后,Bahdanau 等人在论文 Neural Machine Translation by Jointly Learning to Align and Translate [5] 中,使用类似 Attention 的机制在机器翻译任务上将翻译和对齐同时进行,他们的工作算是第一个将 Attention 机制应用到 NLP 领域中

接着 Attention 机制被广泛应用在基于 RNN/CNN 等神经网络模型的各种 NLP 任务中。2017 年,Google 机器翻译团队发表的 Attention is All You Need 中大量使用了自注意力(self-attention)机制来学习文本表示。自注意力机制也成为了大家近期的研究热点,并在各种 NLP 任务上进行探索。

下图为 Attention 研究进展的大概趋势:

c8fbaef46c0d6d9af92c26e0efac851d1f33d936

Attention 机制的本质来自于人类视觉注意力机制。人们视觉在感知东西的时候一般不会是一个场景从到头看到尾每次全部都看,而往往是根据需求观察注意特定的一部分。而且当人们发现一个场景经常在某部分出现自己想观察的东西时,人们会进行学习在将来再出现类似场景时把注意力放到该部分上。

8c4128dd4d8d1d2a7d595e878fd1c68b1da53c2e

下面我先介绍一下在 NLP 中常用 Attention 的计算方法,里面借鉴了张俊林博士深度学习中的注意力机制(2017版)里的一些图。

Attention 函数的本质可以被描述为一个查询(query)到一系列(键key-值value)对的映射,如下图:

79c12ea0624d8336b5b0031e859ed7b676998b12

在计算 Attention 时主要分为三步,第一步是将 query 和每个 key 进行相似度计算得到权重,常用的相似度函数有点积,拼接,感知机等;然后第二步一般是使用一个 softmax 函数对这些权重进行归一化;最后将权重和相应的键值 value 进行加权求和得到最后的 Attention。

目前在 NLP 研究中,key 和 value 常常都是同一个,即 key=value。

40e1185fa56f694261e7d34d6ccc9788395d4c86

Attention is All You Need

接下来我将介绍 Attention is All You Need 这篇论文。这篇论文是 Google 机器翻译团队在 2017 年 6 月放在 arXiv 上,最后发表在 2017 年 NIPS 上,到目前为止 Google 学术显示引用量为 119,可见也是受到了大家广泛关注和应用。

这篇论文主要亮点在于:

  • 不同于以往主流机器翻译使用基于 RNN 的 Seq2Seq 模型框架,该论文用 Attention 机制代替了 RNN 搭建了整个模型框架。

  • 提出了多头注意力(Multi-headed Attention)机制方法,在编码器和解码器中大量的使用了多头自注意力机制(Multi-headed self-attention)。

  • 在 WMT2014 语料中的英德和英法任务上取得了先进结果,并且训练速度比主流模型更快。

该论文模型的整体结构如下图,还是由编码器和解码器组成,在编码器的一个网络块中,由一个多头 Attention 子层和一个前馈神经网络子层组成,整个编码器栈式搭建了 N 个块。类似于编码器,只是解码器的一个网络块中多了一个多头 Attention 层。

为了更好的优化深度网络,整个网络使用了残差连接和对层进行了规范化(Add & Norm)。

a67c4d4b7dab16c7f82ac469651adc0cfb8fc399

下面我们重点关注一下这篇论文中的 Attention。在介绍多头 Attention 之前,我们先看一下论文中提到的放缩点积 Attention (Scaled Dot-Product attention)。

对比我在前面背景知识里提到的 Attention 的一般形式,其实 Scaled Dot-Product Attention 就是我们常用的使用点积进行相似度计算的 Attention,只是多除了一个(为 K 的维度)起到调节作用,使得内积不至于太大。

dc11392370f5ca3ae7a002589a293c33275beeaa

多头 Attention(Multi-head Attention)结构如下图,Query,Key,Value 首先进过一个线性变换,然后输入到放缩点积 Attention,注意这里要做 h 次,其实也就是所谓的多头,每一次算一个头。而且每次 Q,K,V 进行线性变换的参数 W 是不一样的。然后将 h 次的放缩点积 Attention 结果进行拼接,再进行一次线性变换得到的值作为多头 Attention 的结果。

可以看到,Google 提出来的多头 Attention 的不同之处在于进行了 h 次计算而不仅仅算一次,论文中说到这样的好处是可以允许模型在不同的表示子空间里学习到相关的信息,后面还会根据 Attention 可视化来验证。

6b366c56d3790cf7685d17aebaf5180e161ef704

那么在整个模型中,是如何使用 Attention 的呢?如下图,首先在编码器到解码器的地方使用了多头 Attention 进行连接,K,V,Q 分别是编码器的层输出(这里 K=V)和解码器中都头 Attention 的输入。

其实就和主流的机器翻译模型中的 Attention 一样,利用解码器和编码器 Attention 来进行翻译对齐。然后在编码器和解码器中都使用了多头自注意力 Self-Attention 来学习文本的表示。

Self-Attention 即 K=V=Q,例如输入一个句子,那么里面的每个词都要和该句子中的所有词进行 Attention 计算。目的是学习句子内部的词依赖关系,捕获句子的内部结构。

b2c2d16e12bf1404a6e37ccacb196ae1c297e606

对于使用自注意力机制的原因,论文中提到主要从三个方面考虑(每一层的复杂度,是否可以并行,长距离依赖学习),并给出了和 RNN,CNN 计算复杂度的比较。

可以看到,如果输入序列 n 小于表示维度 d 的话,每一层的时间复杂度 Self-Attention 是比较有优势的。

当 n 比较大时,作者也给出了一种解决方案 Self-Attention(restricted)即每个词不是和所有词计算 Attention,而是只与限制的 r 个词去计算 Attention。

在并行方面,多头 Attention 和 CNN 一样不依赖于前一时刻的计算,可以很好的并行,优于 RNN。

在长距离依赖上,由于 Self-Attention 是每个词和所有词都要计算 Attention,所以不管他们中间有多长距离,最大的路径长度也都只是 1。可以捕获长距离依赖关系。

732ab7fbea39a2f6b27b018a774f47d554c7cfad

最后我们看一下实验结果,在 WMT2014 的英德和英法机器翻译任务上,都取得了先进的结果,且训练速度优于其他模型。

728663a25ab665714c7893f1ade46a4a63ae2d09

在模型的超参实验中可以看到,多头 Attention 的超参 h 太小也不好,太大也会下降。整体更大的模型比小模型要好,使用 dropout 可以帮助过拟合。

e5d712af602875440f3299f1e9a576f1993e459e

作者还将这个模型应用到了句法分析任务上也取得了不错的结果。

abf12c2fd830dc3c3d43df7dca9117590044d6d3

最后我们看一下 Attention 可视化的效果(这里不同颜色代表 Attention 不同头的结果,颜色越深 Attention 值越大)。可以看到 Self-Attention 在这里可以学习到句子内部长距离依赖"making…….more difficult"这个短语。

在两个头和单头的比较中,可以看到单头"its"这个词只能学习到"law"的依赖关系,而两个头"its"不仅学习到了"law"还学习到了"application"依赖关系。多头能够从不同的表示子空间里学习相关信息。

c781f061693777c0df144e4a36a40dd484eecd81

Self-Attention in NLP

■ 论文 | Deep Semantic Role Labeling with Self-Attention

■ 链接 | https://www.paperweekly.site/papers/1786

■ 源码 | https://github.com/XMUNLP/Tagger

这篇论文来自 AAAI2018,厦门大学 Tan 等人的工作。他们将 Self-Attention 应用到了语义角色标注任务(SRL)上,并取得了先进的结果。

这篇论文中,作者将 SRL 作为一个序列标注问题,使用 BIO 标签进行标注。然后提出使用深度注意力网络(Deep Attentional Neural Network)进行标注,网络结构如下:

eb4ce9a79e9f82f192b2503f5dba392c1753275e

在每一个网络块中,有一个 RNN/CNN/FNN 子层和一个 Self-Attention 子层组成。最后直接利用 softmax 当成标签分类进行序列标注。

该模型在 CoNLL-2005 和 CoNll-2012 的 SRL 数据集上都取得了先进结果。我们知道序列标注问题中,标签之间是有依赖关系的,比如标签 I,应该是出现在标签 B 之后,而不应该出现在 O 之后。

目前主流的序列标注模型是 BiLSTM-CRF 模型,利用 CRF 进行全局标签优化。在对比实验中,He et al 和 Zhou and Xu 的模型分别使用了 CRF 和 constrained decoding 来处理这个问题。

可以看到本论文仅使用 Self-Attention,作者认为在模型的顶层的 Attention 层能够学习到标签潜在的依赖信息。

0555213960cc226ecbfcb048e63bdc489c8ba15e

■ 论文 | Simultaneously Self-Attending to All Mentions for Full-Abstract Biological Relation Extraction

■ 链接 | https://www.paperweekly.site/papers/1787

■ 作者 | Patrick Verga / Emma Strubell / Andrew McCallum

这篇论文是 Andrew McCallum 团队应用 Self-Attention 在生物医学关系抽取任务上的一个工作,应该是已经被 NAACL 2018 接收。这篇论文作者提出了一个文档级别的生物关系抽取模型,里面做了不少工作,感兴趣的读者可以更深入阅读原文。

我们这里只简单提一下他们 Self-Attention 的应用部分。论文模型的整体结构如下图,他们也是使用 Google 提出包含 Self-Attention 的 transformer 来对输入文本进行表示学习,和原始的 transformer 略有不同在于他们使用了窗口大小为 5 的 CNN 代替了原始 FNN。

91bb80dda577d1a3e423c0e9d43a433270381397

我们关注一下 Attention 这部分的实验结果。他们在生物医学药物致病数据集上(Chemical Disease Relations,CDR)取得了先进结果。去掉 Self-Attention 这层以后可以看到结果大幅度下降,而且使用窗口大小为 5 的 CNN 比原始的 FNN 在这个数据集上有更突出的表现。

4ea0abaf1c7742eb0f94357ea2d22237c8760a58

总结

最后进行一下总结,Self-Attention 可以是一般 Attention 的一种特殊情况,在Self-Attention 中,Q=K=V 每个序列中的单元和该序列中所有单元进行 Attention 计算。

Google 提出的多头 Attention 通过计算多次来捕获不同子空间上的相关信息。Self-Attention 的特点在于无视词之间的距离直接计算依赖关系,能够学习一个句子的内部结构,实现也较为简单并行可以并行计算。

从一些论文中看到,Self-Attention 可以当成一个层和 RNN,CNN,FNN 等配合使用,成功应用于其他 NLP 任务。

2b920988145ef76ad5b0704662f3a5197eb59f91

除了 Google 提出的自注意力机制,目前也有不少其他相关工作,感兴趣的读者可以继续阅读。

627e42c985527157fdcdb9065844791bc781159d

原文发布时间为:2018-04-4
本文作者:罗凌
本文来自云栖社区合作伙伴“ 数据派THU”,了解相关信息可以关注“ 数据派THU”微信公众号
相关文章
|
6月前
|
机器学习/深度学习 存储 自然语言处理
NLP参数高效迁移学习:Adapter方法——论文简读
本研究深入探讨了自然语言处理中参数高效的迁移学习方法——Adapter。通过在预训练模型中引入小型可训练模块,仅调整少量额外参数即可完成模型适配。理论分析表明,该方法在初始化时保持网络行为稳定,并通过瓶颈结构大幅压缩参数规模。实验结果显示,Adapter在GLUE基准上仅用3.6%的参数便达到接近全微调的性能,且对学习率具有更强的鲁棒性。相比传统微调和其他参数高效方法,Adapter在多任务场景下展现出更优的存储效率与泛化能力,为大规模模型的实际部署提供了高效可行的解决方案。
429 7
|
11月前
|
机器学习/深度学习 文字识别 监控
安全监控系统:技术架构与应用解析
该系统采用模块化设计,集成了行为识别、视频监控、人脸识别、危险区域检测、异常事件检测、日志追溯及消息推送等功能,并可选配OCR识别模块。基于深度学习与开源技术栈(如TensorFlow、OpenCV),系统具备高精度、低延迟特点,支持实时分析儿童行为、监测危险区域、识别异常事件,并将结果推送给教师或家长。同时兼容主流硬件,支持本地化推理与分布式处理,确保可靠性与扩展性,为幼儿园安全管理提供全面解决方案。
524 3
|
12月前
|
人工智能 API 开发者
HarmonyOS Next~鸿蒙应用框架开发实战:Ability Kit与Accessibility Kit深度解析
本书深入解析HarmonyOS应用框架开发,聚焦Ability Kit与Accessibility Kit两大核心组件。Ability Kit通过FA/PA双引擎架构实现跨设备协同,支持分布式能力开发;Accessibility Kit提供无障碍服务构建方案,优化用户体验。内容涵盖设计理念、实践案例、调试优化及未来演进方向,助力开发者打造高效、包容的分布式应用,体现HarmonyOS生态价值。
738 27
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1167 29
|
12月前
|
数据采集 机器学习/深度学习 存储
可穿戴设备如何重塑医疗健康:技术解析与应用实战
可穿戴设备如何重塑医疗健康:技术解析与应用实战
501 4
|
12月前
|
存储 弹性计算 安全
阿里云服务器ECS通用型规格族解析:实例规格、性能基准与场景化应用指南
作为ECS产品矩阵中的核心序列,通用型规格族以均衡的计算、内存、网络和存储性能著称,覆盖从基础应用到高性能计算的广泛场景。通用型规格族属于独享型云服务器,实例采用固定CPU调度模式,实例的每个CPU绑定到一个物理CPU超线程,实例间无CPU资源争抢,实例计算性能稳定且有严格的SLA保证,在性能上会更加稳定,高负载情况下也不会出现资源争夺现象。本文将深度解析阿里云ECS通用型规格族的技术架构、实例规格特性、最新价格政策及典型应用场景,为云计算选型提供参考。
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
490 4
|
人工智能 自然语言处理 算法
DeepSeek大模型在客服系统中的应用场景解析
在数字化浪潮下,客户服务领域正经历深刻变革,AI技术成为提升服务效能与体验的关键。DeepSeek大模型凭借自然语言处理、语音交互及多模态技术,显著优化客服流程,提升用户满意度。它通过智能问答、多轮对话引导、多模态语音客服和情绪监测等功能,革新服务模式,实现高效应答与精准分析,推动人机协作,为企业和客户创造更大价值。
952 5
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
负载均衡 JavaScript 前端开发
分片上传技术全解析:原理、优势与应用(含简单实现源码)
分片上传通过将大文件分割成多个小的片段或块,然后并行或顺序地上传这些片段,从而提高上传效率和可靠性,特别适用于大文件的上传场景,尤其是在网络环境不佳时,分片上传能有效提高上传体验。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

推荐镜像

更多
  • DNS