草庐IT

王树森Attention与Self-Attention学习笔记

iSherryZhang 2023-03-28 原文

Seq2Seq + Attention

Seq2Seq模型,有一个Encoder和一个Decoder,默认认为Encoder的输出状态h_m包含整个句子的信息,作为Decoder的输入状态s_0完成整个文本生成过程。这有一个严重的问题就是,最后的状态不能记住长序列,也就是会遗忘信息,那么Decoder也就无法获得此信息。

用传统的Seq2Seq模型,当句子长度超过20个单词是,BLEU Score(机器翻译评价指标)就会下降;但是如果用上Attention,就会如下图红色曲线一样,即使输入序列很长也能保持较高的准确率。

使用Attention解决机器翻译的原文为:Bahdanau, Cho, & Bengio, Neural machine translation by jointly learning to align and translate. In ICLR, 2015.

Attention能够极大提升Seq2Seq模型的准确率;用了Attention,Decoder每次更新状态的时候都会看一下Encoder的所有状态,这样子就不会遗忘了;Attention还可以告诉Decoder应该关注Encoder的哪个状态,这就是Attention名字的由来。Attention有一个极大的缺点是,计算量很大。

  • Attention tremendously improves Seq2Seq model
  • With attention, Seq2Seq model does not forget source input
  • With attention, the decoder knows where to focus
  • Downside: much more computation

Attention的原理

Attention使用\(c_i\)整合\(h_1, h_2, ..., h_m\)的信息,因此Attention机制可以解决LSTM遗忘的问题。

\(c_0 = \alpha_1h_1 + \alpha_2h_2 + ... + \alpha_mh_m\),其中,\(\alpha_i\)表示\(h_i\)\(s_0\)的相关性,称为权重。

相关性的计算方法有两种:

  • 方法一(Used in the original paper)

\(h_i\)\(s_0\)的相关性,将\(h_i\)\(s_0\)进行Concatenate,然后乘一个参数矩阵\(W\),结果进行\(tanh\)约束到(-1, 1)之间,然后再乘以一个\(v^T\),并对得到的结果进行Softmax处理。

  • 方法二(more popular,the same to Transformer)

\(h_i\)\(s_0\)的相关性,分为三步进行计算:

  1. Linear maps
    • \(k_i = W_K · h_i\)
    • \(q_0 = W_Q · s_0\)
  2. Inner product
    • \(\widetilde{\alpha_i} = k^T_{i}q_0\)
  3. Normalization
    • \([\alpha_1, ..., \alpha_m] = Softmax([\widetilde{\alpha_1}, ... \widetilde{\alpha_m}])\)

计算得到\(c_0\)后,将\(A'\)的三个输入进行concatenate,作为输入得到状态\(s_1\)。每一个状态\(s_i\)对应一个Context向量\(c_i\)来表示\(s_i\)\(H\)的相关性。

假设Encoder有m步,Decoder有t步,就需要计算mt次权重,每次权重计算都要计算m个\(\alpha\)的值。所以,Attention的时间复杂度是mt,也就是Encoder和Decoder状态数量的乘积。

Attention在机器翻译任务的可视化,可以看到Decoder与Encoder的每个状态都相关,但是会重点关注某个或某些状态。

Summary

优点:

  • Standard Seq2Seq model:decoder只关注其当前状态
  • Attention:decoder还会关注encoders的所有状态解决遗忘问题并且告诉decoder哪里需要重点关注

缺点:高时间复杂度(假设源序列的长度为m,目标序列的长度是t)

  • Standard Seq2Seq:\(O(m + t)\)
  • Seq2Seq + attention:\(O(mt)\)

Self Attention

之前RNN里面,使用\(h_4\)\(x_5\)计算得到\(h_5\),使用self-attention机制,当前状态\(h_5\)的计算依赖由\(h_4\)变为\(c_4\)\(c_4 = \alpha_1h_1 + \alpha_2h_2 + \alpha_3h_3 + \alpha_4h_4\),其中,\(\alpha_i\)计算的是\(h_4\)\(h_i\)之间的相关性,计算方式前面已经讲过。因为这里会计算自己与自己的相关性,因此称为self-attention。

  • SimpleRNN与Attention当前状态计算对比

SimpleRNN状态\(h_5\)的计算:

\(h_5 = tanh(A·{x_5\brack h_4} + b)\)

Self-Attention状态\(h_5\)的计算:

\(h_5 = tanh(A·{x_5\brack c_4} + b)\)

Reference

王树森的Attention机制讲解

有关王树森Attention与Self-Attention学习笔记的更多相关文章

  1. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  2. 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总线个人知识总

  3. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  4. ruby-on-rails - 如何使用 ruby​​ 从 self 方法调用另一个方法? - 2

    #app/models/product.rbclassProduct我从Controller调用方法1。当我运行程序时。我收到一个错误:method_missing(atlinemethod2(param2)).rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0/lib/active_record/relation/batches.rb:59:in`block(2levels)infind_each... 最佳答案 classProduct说明:第一个是类

  5. ruby - 在参数为 `yield self` 的方法中使用 `&block` 和在没有参数 `yield self` 的方法中使用 `&block` 有什么区别吗? - 2

    我明白了defa(&block)block.call(self)end和defa()yieldselfend导致相同的结果,如果我假设有这样一个blocka{}。我的问题是-因为我偶然发现了一些这样的代码,它是否有任何区别或者是否有任何优势(如果我不使用变量/引用block):defa(&block)yieldselfend这是一个我不理解&block用法的具体案例:defrule(code,name,&block)@rules=[]if@rules.nil?@rules 最佳答案 我能想到的唯一优点就是自省(introspecti

  6. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  7. ruby - 从另一个私有(private)方法中使用 self.xxx() 调用私有(private)方法 xxx,导致错误 "private method ` xxx' called” - 2

    我正在尝试获得良好的Ruby编码风格。为防止意外调用具有相同名称的局部变量,我总是在适当的地方使用self.。但是现在我偶然发现了这个:classMyClass上面的代码导致错误privatemethodsanitize_namecalled但是当删除self.并仅使用sanitize_name时,它会起作用。这是为什么? 最佳答案 发生这种情况是因为无法使用显式接收器调用私有(private)方法,并且说self.sanitize_name是显式指定应该接收sanitize_name的对象(self),而不是依赖于隐式接收器(也是

  8. ruby-on-rails - self 在 Rails 模型中的值(value)是什么?为什么没有明显的实例方法可用? - 2

    我的rails3.1.6应用程序中有一个自定义访问器方法,它为一个属性分配一个值,即使该值不存在。my_attr属性是一个序列化的哈希,除非为空白,否则应与给定值合并指定了值,在这种情况下,它将当前值设置为空值。(添加了检查以确保值是它们应该的值,但为简洁起见被删除,因为它们不是我的问题的一部分。)我的setter定义为:defmy_attr=(new_val)cur_val=read_attribute(:my_attr)#storecurrentvalue#makesureweareworkingwithahash,andresetvalueifablankvalueisgiven

  9. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

    如何学习ruby​​的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby​​的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/

  10. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

随机推荐