【基础整理】attention:浅谈注意力机制与自注意力模型(附键值对注意力 + 多头注意力)

本文探讨了注意力机制在解决深度学习计算资源分配问题中的作用,分为聚焦式和显著性注意力两种类型。通过鸡尾酒会效应举例说明其原理。注意力机制通过计算注意力分布和加权平均,改善编码器-解码器模型中的信息损失和对齐问题。文中详细介绍了自注意力模型和多头注意力机制,强调其减少计算时间、支持并行处理和提高模型解释性的优点,同时也指出忽视输入位置关系的潜在问题。
摘要由CSDN通过智能技术生成

划水休息两天不看论文了 ~ 来重新复习一下基础qaq


以下讲解参考大名鼎鼎的 nndl 邱锡鹏 《神经网络与深度学习》 部分内容(详见第八章,注意力与外部记忆)是对于不太行的初学者也比较友好的一本,当然不能要求一本书既全面又深入,阅读过程还是建议自己去更多地从别的渠道了解细节内容,但个人觉得即使是顺着通读亦对关于深度学习的整体框架搭建蛮有帮助的qaq

同时参考了这篇综述:An Attentive Survey of Attention Models,具体这篇论文的阅读笔记也蛮多的就不找时间再写了(https://www.cnblogs.com/ydcode/p/11040811.html 这篇就写的很好~)






1 background


注意力机制本身想要解决的问题很简单,就是算不动了

在整体模型越来越庞大的情况下,大家明显地觉得运算开始吃力了,这样的问题下直观的思想就是考虑如何按重要性更好地将手头有限的计算资源进行分配,以保证更多的计算资源可以分配到确实重要的内容上,而尽量不要太浪费在所谓不重要的内容上。人脑面对海量信息往往利用 注意力 将部分不重要的信息略去而只关注于重要的信息,这里将注意力分为两种:

  • 自上而下的有意识的注意力,也就是 聚焦式注意力(Focus Attention):此时的注意力是确定地有一个目的的,也就是会主动地去关注某一个特定的对象,本身依赖目的,存在预定的任务(举例阅读理解问题,此时给定问题以后,关注的只是和问题相似的文本段落对象,对其他对象可以少输入或不输入模型以节约计算资源)

  • 自下而上的无意识的注意力,也就是 基于显著性的注意力(Saliency Based Attention):也就是说此时并没有预先根据某种目的或任务关注某一个特定的对象,而是单纯地当某一个对象表现出某种特征的时候,比如某一个对象值很大时则转而主动关注这样的对象(举例 max 池化,门控机制)

这里来一个 nndl 中的例子:

一个和注意力有关的例子是鸡尾酒会效应。当一个人在吵闹的鸡尾酒会上和朋友聊天时,尽管周围噪音干扰很多,他还是可以听到朋友的谈话内容,而忽略其他人的声音(聚焦式注意力)。同时,如果背景声中有重要的词(比如他的名字),他会马上注意到(显著性注意力)


从这个思路出发,当前已经进行了较多的尝试,比如最简单的 池化层:最大池化本身也就是选择一个范围内的最大值保存下来,直观理解可以认为就是只关注了值最大的部分而将其他部分内容舍去,以更好地将更宝贵的计算资源放在可能重要的部分

进一步地从当前主流的 encode - decode (编码器 - 解码器)模型来讨论一下 注意力机制 的优势。传统的编码器解码器模型存在以下两个很大的问题:

  • 编码器需要把输入的信息转化为一个定长的序列才能给到解码器进行处理,也就意味着此时容易造成信息的损失(非要塞到一个定长的序列里)
  • 此时输入的序列和最后解码器的输出本身难以作对齐,以翻译问题来说,我输入 Tom chase Jerry,此时由于编码器 RNN 是平等地对每一个词来进行编码操作的,也就是说我最后翻译出的 汤姆 本身是依赖了相同权重的 Tom 、chase、 Jerry 这三个词。但明显 汤姆 的翻译应该更多地依赖 Tom 才对,这就造成了本身输入序列和输出序列的不对齐。这同样也影响了本身神经网络的解释性问题,将所有输入的东西都以相同的权重看待将导致难以解释我最后的结果到底是依赖什么得出的。

注意力机制,也就是尝试 在输入的信息上计算注意力分布 → 从而得到 不同输入信息对应当前任务的重要性分布 = 不同的权重 → 再根据不同的重要性,也就是不同的权重 计算当前输入信息的加权平均,以实现(对重要的,和任务相关的信息赋予更高的权重,而将不重要的信息基本忽略或赋予较低的权重)以更有效率地利用计算资源




2 整体架构


注意力机制 本身只是一种思想,并不依赖某一个特定的模型(虽然总是依赖编码器 - 解码器的模型来解释它),可以简单地总结为两个步骤:

  • 在给定的信息上计算注意力分布(也就是判断什么信息重要,什么信息不重要,分别赋予不同的权重)
  • 根据注意力分布来计算所有输入信息的加权平均


2.1 计算注意力分布


简化问题,考虑此时输入 N 个向量 : [ x 1 , . . . , x N ] [x_1, ... , x_N] [x1,...,xN],我想要从中选出对于我的目标而言比较重要的信息,需要引入我的目标任务的表示,称为 查询向量(query vector),则此时问题可以转换为考察 输入的不同内容和查询向量之间的相关度,一个简单的思路就是通过一个 注意力打分函数 对不同内容进行打分,赋予与我当前任务比较相关的部分更大的权重,再直接地通过一个 softmax 层得到分布,也就是输入信息的不同部分的权重。

这里的注意力打分函数主要有以下几种:

  • 加性模型: s ( x , q ) = v T t a n h ( W x + U q ) s(x,q) = v^T tanh(Wx + Uq) s(x,q)=vTtanh(Wx+Uq)
  • 点积模型: s ( x , q ) = x T q s(x,q) = x^Tq s(x,q)=xTq
  • 缩放点积模型: s ( x , q ) = x T q D s(x,q) = \frac{x^Tq}{\sqrt{D}} s(x,q)=D xT
  • 11
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值