草庐IT

【深入理解】再看Attention

顾道长生 2023-03-28 原文

文章目录

Attention 的本质是什么


Attention(注意力)机制如果浅层的理解,跟他的名字非常匹配。他的核心逻辑就是「从关注全部到关注重点」。


Attention 机制很像人类看图片的逻辑,当我们看一张图片的时候,我们并没有看清图片的全部内容,而是将注意力集中在了图片的焦点上。大家看一下下面这张图:


我们一定会看清「锦江饭店」4个字,如下图:


但是我相信没人会意识到「锦江饭店」上面还有一串「电话号码」,也不会意识到「喜运来大酒家」,如下图:


所以,当我们看一张图片的时候,其实是这样的:


上面所说的,我们的视觉系统就是一种 Attention机制,将有限的注意力集中在重点信息上,从而节省资源,快速获得最有效的信息。

AI 领域的 Attention 机制



从这可以看出,Attention机制乃是核心。

Attention 的3大优点


  1. 参数少:模型复杂度跟 CNN、RNN 相比,复杂度更小,参数也更少。所以对算力的要求也就更小
  2. 速度快:Attention 解决了 RNN 不能并行计算的问题。Attention机制每一步计算不依赖于上一步的计算结果,因此可以和CNN一样并行处理。
  3. 效果好:在 Attention 机制引入之前,有一个问题大家一直很苦恼:长距离的信息会被弱化,就好像记忆能力弱的人,记不住过去的事情是一样的。而Attention 是挑重点,就算文本比较长,也能从中间抓住重点,不丢失重要的信息。下图红色的预期就是被挑出来的重点
  4. 我的这篇博文​​(2021李宏毅)机器学习-Self-attention​​讲解了Self-Attention的详细计算过程
下面开始深刻理解每一步的意义

深入理解


键值对注意力


键值对Attention最核心的公式如下。其实这一个公式中蕴含了很多个点,让我们逐个击破,从最核心的部分入手,细枝末节的部分会豁然开朗。

先抛开​​​Q​​​ ​​K​​​ ​​V​​​三个矩阵,从Self-Attention最原始的形态看


矩阵可以看作由一些向量组成,一个矩阵乘以它自己转置的运算,其实可以看成这些向量分别与其他向量计算内积,也即计算第一个行向量与自己的内积,计算第一个行向量与第二个行向量的内积,计算第一个行向量与第三个行向量的内积

向量的内积,其几何意义是什么?

表征两个向量的夹角,表征一个向量在另一个向量上的投影


接下来进入一个实例:

假设 , 其中 为一个二维矩阵, 为一个行向量。对应下面的图, 对 应"早"字embedding之后的结果,以此类推。


上面的运算模拟了一个过程,即 。其结果究竟有什么意义?

首先,行向量 分别与自己和其他两个行向量做内积(“早"分别与"上”"好"计算内积),得到了一个新的向量。回想内积的几何意义,可知,这个新的向量是行向量 在自己和其他两个行向量上的投影。而投影的大小又说明了两个向量的相关性(如果两个向量夹角是九十度,那么这两个向量线性无关,完全没有相关性;投影的值大,说明两个向量相关性高。)继续,再进入到语义层面来看,这个向量是词向量,是词在高维空间的数值映射,词向量之间相关度表示(在一定程度上(不是完全))在关注词A的时候,应当给予词B更多的关注,由此可以理解,矩阵 是一个方阵, 以行向量的角度理解, 里面保存了每个向量与自己和其他向量进行内积运算的结果。实际上,这个过程,也是在查找词向量相关度的过程,这也是查找矩阵Q(query)和K(key)的名称由来。

至此,理解了公式 中, 的意义。进一步, Softmax的意义何在呢? 请看下图


Softmax的公式:

softmax是为了归一化。而Attention机制的核心乃是加权求和,权重就是归一化之后的数字,当关注"早"这个字的时候,应当分配0.4的注意力给它本身,剩下0.4关注"上",0.2关注"好"。

至此,公式 已经理解了其中的一半,最后一个 X 有什么意义?完整的公式究竟表示什么?请看下图


的一个行向量举例。这一行向量与 的一个列向量相乘,行向量与 的第一个列向量相乘, 得到了一个新的行向量, 且这个行向量与 的维度相同。在新的向量中,每一个维度的数值都是由三个词向量在这一维度的数值加权求和得来的,这个新的行向量就是"早"字词向量经过注意力机制加权求和之后的表示。,这个最终表示,通俗的解释,也就是本来的高维空间词向量表示,不是最合理的,而根据本问题,本语境,经过注意力机制的一番操作,使其输出为更能合理表达这个词向量的数值映射,而且这样更符合人的直觉。

Q K V矩阵


​Q​​​ ​​K​​​ ​​V​​究竟是什么?看下面的图


其来源是 与矩阵的乘积,本 质上都是 的线性变换。

为什么不直接使用 而要对其进行线性变换?

是为了提升模型的拟合能力,矩阵

d k \sqrt{d_{k}} dk​​

假设 里的元素的均值为 0 , 方差为 1 , 那么 中元素的均值为 0 , 方差为 . 当d变得很大时, 中的元素的方差也会变得很大,如果 中的元素方差很大,那么 的分布会趋于陡峭(分布的方差大,分布集中在绝对值大的区域)。总结一下就是 的分布会和d有关。因此 中每一个元素除以 后,方差又变为 1 。这使得 的分布 “陡峭” 程度与d解耦,从而使得训练过程中梯度值保持稳定。如果不除以会造成点乘结果过大,使得经过 softmax 之后的梯度很小,不利于反向传播

代码实现



参考



有关【深入理解】再看Attention的更多相关文章

  1. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  2. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  3. ruby - 易于初学者理解的 Ruby 库 - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭3年前。Improvethisquestion我正处于学习Ruby的阶段,我想查看一些小型库的源代码以了解它们是如何构建的。我不知道什么是小型图书馆,但希望SO能推荐一些易于理解的图书馆来学习。因此,如果有人知道一两个非常小的库,这是新手Rubyists学习的好例子,请推荐!我想使用Manveru'sInnatelib,因为它试图保持在2000LOC以下,但我还不熟悉其中经常使用的Ruby速记。也许大约100-5

  4. ruby - 无法理解 `puts{}.class` 和 `puts({}.class)` 之间的区别 - 2

    由于匿名block和散列block看起来大致相同。我正在玩它。我做了一些严肃的观察,如下所示:{}.class#=>Hash好的,这很酷。空block被视为Hash。print{}.class#=>NilClassputs{}.class#=>NilClass为什么上面的代码和NilClass一样,下面的代码又显示了Hash?puts({}.class)#Hash#=>nilprint({}.class)#Hash=>nil谁能帮我理解上面发生了什么?我完全不同意@Lindydancer的观点你如何解释下面几行:print{}.class#NilClassprint[].class#A

  5. ruby - 如何理解 Ruby 中的发送者和接收者? - 2

    我很难理解Ruby中sender和receiver的实际含义。它们一般是什么意思?到目前为止,我只是将它们理解为方法调用和获取其返回值的调用。但是,我知道我的理解还远远不够。谁能给我一个Ruby中发送者和接收者的具体解释? 最佳答案 面向对象中的一个核心概念是消息传递和早期概念化,这在很大程度上借鉴了计算的Actor模型。艾伦·凯(AlanKay)创造了面向对象一词并发明了最早的OO语言之一SmallTalk,他拥有voicedregretatusingatermwhichputthefocusonobjectsinsteadofo

  6. ruby-on-rails - Rails - 理解 application.js 和 application.css - 2

    rails新手。只是想了解\assests目录中的这两个文件。例如,application.js文件有如下行://=requirejquery//=requirejquery_ujs//=require_tree.我理解require_tree。只是将所有JS文件添加到当前目录中。根据上下文,我可以看出requirejquery添加了jQuery库。但是它从哪里得到这些jQuery库呢?我没有在我的Assets文件夹中看到任何jquery.js文件——或者直接在我的整个应用程序中没有看到任何jquery.js文件?同样,我正在按照一些说明安装TwitterBootstrap(http:

  7. ruby - 你如何理解 Ruby 中的这个三元条件? - 2

    我在某些代码中遇到了三元组,但我无法理解条件:str.split(/',\s*'/).mapdo|match|match[0]==?,?match:"somestring"end.join我确实理解我是在某些点上拆分字符串并将总结果转换为数组,然后依次处理数组的每个元素。除此之外,我不知道发生了什么。 最佳答案 一种(稍微)不那么令人困惑的写法是:str.split(/',\s*'/).mapdo|match|ifmatch[0]==?,matchelse"somestring"endend.join我认为多行三元语句很糟糕,尤其是

  8. ruby - 您如何将 S3 理解为 Ruby 中的分层目录结构? - 2

    有没有人成功地将S3存储桶读取为子文件夹?文件夹1--子文件夹2----文件3----文件4--文件1--文件2文件夹2--子文件夹3--文件5--文件6我的任务是读取文件夹1。我希望看到子文件夹2、文件1和文件2,但看不到文件3或文件4。现在,因为我将存储桶键限制为prefix=>'folder1/',你仍然会得到file3和4,因为它们在技术上具有folder1前缀。似乎真正做到这一点的唯一方法是吸收folder1下的所有键,然后使用字符串搜索从结果数组中实际排除file3和file4。有没有人有过这方面的经验?我知道像Transmit和Cyber​​duck这样的FTP风格的S3

  9. 关于yolov5训练时参数workers和batch-size的理解 - 2

    关于yolov5训练时参数workers和batch-size的理解yolov5训练命令workers和batch-size参数的理解两个参数的调优总结yolov5训练命令python.\train.py--datamy.yaml--workers8--batch-size32--epochs100yolov5的训练很简单,下载好仓库,装好依赖后,只需自定义一下data目录中的yaml文件就可以了。这里我使用自定义的my.yaml文件,里面就是定义数据集位置和训练种类数和名字。workers和batch-size参数的理解一般训练主要需要调整的参数是这两个:workers指数据装载时cpu所使

  10. ruby - 无法理解 Grape API 路由参数 - 2

    我在理解GrapeAPI时遇到很多困难,特别是route_param以及它如何仅使用params。考虑这段代码:desc"Returnastatus."paramsdorequires:id,type:Integer,desc:"Statusid."endroute_param:iddogetdoStatus.find(param[:id])endend这个街区产生什么路线?我知道这是一个get请求,但为什么它被包裹在route_paramblock中?为什么它不能在paramsblock中? 最佳答案 你的block产生这条路线:

随机推荐