当前位置: 首页 > 编程日记 > 正文

Deep Reading | 从0到1再读注意力机制,此文必收藏!

640?wx_fmt=jpeg

译者 | forencegan

编辑 | 琥珀

出品 | AI科技大本营(ID: rgznai100)


【AI科技大本营导语】注意力机制(Attention)已经成为深度学习必学内容之一,无论是计算机视觉还是自然语言处理都可以看到各种各样注意力机制的方法。之前我们曾在一篇干货文章《关于深度学习中的注意力机制,这篇文章从实例到原理都帮你参透了》中,从实例到原理帮助大家参透注意力机制的工作原理。今天,我们将再度为大家梳理全部理论要点,是大家学习的必备资料之一,并为后续掌握最新流行的注意力机制保驾护航。


在本篇博客中,作者不仅概述了注意力机制是如何被创造出来的,也详细探讨了时下最流行的注意力机制相关的方法和模型,比如Transformer、SNAIL、神经图灵机(Neural Turing Machines)以及自注意力生成对抗网络(SAGAN),一度成为不少学习者的参考资料。


该篇博客结构如下:

  • 序列到序列(Seq2Seq)模型究竟有什么问题?

  • 为翻译而生

定义

  • 注意力机制模型家族

归纳总结

自注意力机制(Self-attention)

Soft & Hard Attention

Global & Local Attention

  • 神经图灵机

读写机制

注意力机制

  • 指针网络(Pointer Network)

  • Transformer

Key, Value and Query

多头自注意力机制(Multi-Head Self-Attention)

编码器(Encoder)

解码器(Decoder)

完整的结构

  • SNAIL

  • 自注意力生成对抗网路(Self-Attention GAN)

  • 参考


在某种程度上,注意力取决于我们如何对图像的不同区域进行视觉注意或将一个句子中的单词关联起来。


以图1 中的柴犬图为例。


640?wx_fmt=png

图1 一只可爱的柴犬穿着一件人类的外套。该图片来自于Instagram @mensweardog


人类的视觉注意力机制使我们能够以一种“高分辨率”的形式关注到图像的某个区域(例如当你观察图中黄色框标注的狗耳朵的时候),而同时以一种“低分辨率”的形式感知着周围的图像(例如这个时候你的余光中雪的背景,还有柴犬所穿的外套的样子),然后调整眼睛所关注的焦点或者相应地进行推断。


如果将图像扣掉一小块,我们也可以根据图像中其余的内容线索推测出被扣掉的内容究竟是什么。比如可以推测出被黄色框扣掉的内容是一个尖尖的耳朵,因为我们看到了一个狗的鼻子,右边另一个尖尖的耳朵以及柴犬的神秘眼神(图中红色框所示的内容)。对于耳朵的预测,底部的毛衣和毯子就不如上述狗的特征有用。


类似的,我们同样可以解释,一个句子或近似语境中单词之间的关系。在一句话中,当我们看到“吃”这个单词的时候,我们很快就会遇到一个食物词(apple)。虽然颜色术语(green)描述了食物,但可能跟“吃”之间没有直接的关系。


640?wx_fmt=png

图2 同一个句子当中,不同词之间具有不同的关系


简而言之,深度学习中的注意力机制可以被广义地定义为一个描述重要性的权重向量:通过这个权重向量为了预测或者推断一个元素,比如图像中的某个像素或句子中的某个单词,我们使用注意力向量定量地估计出目标元素与其他元素之间具有多么强烈的相关性,并由注意力向量的加权和作为目标的近似值。


序列到序列(Seq2Seq)模型究竟有什么问题?


seq2seq模型最早是在2014年由Sutskever提出的,他主要针对的是语言模型。从广义上来讲,它的目的是将输入序列(源序列)转换成一个新的序列(目标序列),而且两个序列的长度可以是任意的。转换任务包括文本或者语音上的多语种机器翻译,问答对话的生成或者生成句子的语法树等任务。


seq2seq模型通常具有一种编码器-解码器(encoder-decoder)结构,由下面两部分构成:


  • Encoder:编码器处理输入序列,然后将其中包含的信息压缩成固定长度的上下文向量(context vector),上下文向量也可以叫做句子嵌入(sentence embedding)。这种表示方式可以用来对一整个句子的含义做出一个很好的总结。

  • Decoder:利用Encoder产生的上下文向量来初始化解码器以产生变换后的输出序列。早期的工作仅仅使用编码器网络的最后状态作为解码器的初始状态。


编码器和解码器都可以是递归神经网络,例如使用LSTM和GRU单元。


640?wx_fmt=png

图3 encoder-decoder模型,用来将“she is eating a green apple”翻译成中文,图中是对编码器和解码器随着时间步而展开的可视化效果


这种固定长度的上下文向量设计的一个关键的和明显的缺点在于,它无法记住很长的句子,对很长的时序信息来说,一旦它完成了对整个序列的处理,它通常会忘记最开始的部分,从而丢失很多有用的信息。因此,在2015年Bahdanau等人为了解决长时依赖问题,提出了注意力机制。


为翻译而生


注意力机制的诞生,最开始是为了帮助神经机器翻译(NMT)记住较长的源句。注意力机制的秘方在于,它建立了一个上下文向量与整个源句之间的快捷方式,而不只是通过编码器最后一步的隐层状态来生成上下文向量。这些快捷方式的连接权重是根据每个输出元素自适应计算出来的。


既然上下文向量可以访问到整个句子中的每个单词,那我们根本不用担心之前的信息会被遗忘。源序列和目标序列之间的对齐(alignment)就通过这个上下文向量来学习和控制,从本质上讲,要计算上下文向量需要三个必要信息:


  • 编码器的隐含层状态

  • 解码器的隐含层状态

  • 源和目标序列之间的对齐方式


640?wx_fmt=png

图4 加入注意力机制的encoder-decoder模型(Bahdanau等人,2015)

定义


现在让我们以科学的方式来定义神经机器翻译系统中引入的注意力机制。比方说,我们有一个长度为n的源序列x,并尝试输出长度为m的目标序列y:


640?wx_fmt=png


(加粗的变量代表他们是一个向量,本博客中所有情况相同)


这里的编码器是双向LSTM(或者其他你认为合适的递归神经网络),前向的隐含层状态定义为640?wx_fmt=png,后向的隐含层状态定义为640?wx_fmt=jpeg。将两种表示简单地串联起来构成编码器的整个隐含层状态表示。这种表示方法意在描述当前单词的时候包含有它之前和之后词的释义。

640?wx_fmt=png

解码器网络对于第t时刻的输出单词的隐含层状态可以表示为640?wx_fmt=png, 其中上下文向量640?wx_fmt=png是输入序列的隐含层状态的加权和,权重由对齐函数计算得来:


640?wx_fmt=png


对齐函数得到的分数640?wx_fmt=png是根据第i个位置的输入和第t个位置的输出对640?wx_fmt=png得来的,它衡量了二者的匹配程度。640?wx_fmt=jpeg的集合衡量了输出关注到多少源序列的隐层状态。在Bahdanau的文章中,对齐分数640?wx_fmt=png的参数由一个前馈神经网络参数化,其输入仅仅是输入序列和输出序列的隐含层状态,这个模型跟整体模型的其它部分一起参与训练,从而学到所谓的注意力权重。因此对齐分数函数的定义如下面所示,给定tanh作为非线性激活函数:

640?wx_fmt=png

其中640?wx_fmt=png640?wx_fmt=png是可学习的参数,作为整体模型参数的一部分参与到训练的过程当中。


对齐分数矩阵是一个很好的副产品,它可以很好的显示出源单词和目标单词之间的相关性。


640?wx_fmt=png

图5 对齐分数矩阵,表现了源句法语“L’accord sur l’Espace économique européen a été signé en août 1992”到目标语句英语“The agreement on the European Economic Area was signed in August 1992”翻译的单词之间相关性的结果。


点击下面链接可以获得具体的实施方法,这是Tensorflow团队提供的一份优秀的教程。


https://www.tensorflow.org/versions/master/tutorials/seq2seq


注意力机制模型家族


有了注意力机制,源序列和目标序列的依赖关系再也不需要二者之间的相对距离了!有了机器翻译领域上巨大的进展,注意力机制在包括计算机视觉(Xu et al.2015)在内的其它领域也都随之有了广泛的应用,研究者们也相继探索出各种不同的注意力机制模型以适用于不同的应用场合(Luong, et al., 2015; Britz et al., 2017; Vaswani, et al., 2017)。


归纳总结


下面的表格,我们总结了几种流行的注意力机制以及相应的对齐分数函数:


640?wx_fmt=png


  • (*)在Luong等人的文章中被称为“concat”,在Vaswani等人的文章中被称为“附加注意”。  

  • (^)它增加了一个比例因子`$1/\sqrt{n}$`,因为当输入较大时,softmax函数的梯度可能非常小,难以进行有效的学习。


下面总结了一些更广义的应用到注意力机制的方法:  


640?wx_fmt=png


  • (&)此外,Cheng等人在2016等论文中也将其称为内注意力机制(intra-attention)。


自注意力机制(Self-attention)


自注意力机制,又称内注意力机制,是一种将单个序列的不同位置关联起来以计算同一序列的表示的注意机制。它在机器阅读、抽象摘要或图像描述生成中非常有用。


在“Long short-term memory network”这篇文章中使用自注意力机制去做机器阅读。在下面的例子中,自注意机制使我们能够学习当前单词和句子前一部分之间的相关性。


相关链接:https://arxiv.org/pdf/1601.06733.pdf


640?wx_fmt=png

图6 当前单词为红色,蓝色阴影的大小表示激活级别也就是相关性的大小。(图片来自于Cheng et al.,2016)


在“Show,attend and tell”这篇文章中,自注意力机制应用于图像以生成适当的描述。图像首先由卷积神经网络进行编码,具有自注意力机制的递归神经网络利用卷积特征映射逐条生成描述性词语。注意力权重的可视化清晰地展示了模型为了输出某个单词而关注图像的某些区域。


相关链接:http://proceedings.mlr.press/v37/xuc15.pdf


640?wx_fmt=png

图7 机器根据图像得到的描述“一个女人正在一个公园里扔飞碟”。(图像来自于Xu et al. 2015)


Soft & Hard Attention


soft vs hard 注意力记住是区分注意力定义的另一种方式。最初的想法是在“Show, attend and tell paper”论文中提出的,其主要思想在于:注意力是否可以访问整个图像或只访问图像中的一部分:


  • Soft Attention:所学习的对齐权重关注于整个输入图像中的各个部分,关键思想和Bahdanau在2015年的论文如出一辙。

  • 优点:模型是平滑可微的

  • 缺点:当输入序列非常长的时候,计算量会很大

  • Hard Attention:每一步只关注到图像中的一部分

  • 优点: 预测阶段具有很小的运算量

  • 缺点:模型是不可导的而且需要更加复杂的训练技术,例如强化学习和方差降低(variance reduction)


Global & Local Attention


“Luong, et al.,2015” 首次提出了“global”和“local”注意力机制。global注意力机制和soft注意力机制类似,然而local是hard和soft的有趣的融合,它是对hard attention的一种改进,使得它变得可导:该模型首先预测一个当前目标词对齐的位置和一个围绕源位置的窗口,然后用于计算上下文向量。


相关链接:https://arxiv.org/pdf/1508.04025.pdf

640?wx_fmt=png

图8  全局和局部注意力机制(图片来自于Luong,et al.,2015中图2和图3)


神经图灵机


1936年,阿兰·图灵提出了一个计算机的最小模型。它由一个无限长的磁带和一个与磁带交互的磁头组成。磁带上有无数的单元格,每个单元格都填有一个符号:0,1或空格(“ ”)。操作头可以读取符号、编辑符号,并可以在磁带上左右移动。理论上,图灵机可以模拟任何计算机算法,不管这个过程有多复杂或多耗时。无限内存给图灵机带来了数学上无限的优势。然而,无限内存在真正的现代计算机中是不可行的。


640?wx_fmt=jpeg

图9 图灵机的样子:一个磁带+一个处理磁带的磁头。(图片来源:http: aturingmachine.com)


神经图灵机(NTM,Graves, Wayne & Danihelka, 2014)是一种神经网络与外部存储器耦合的模型结构。存储器模仿图灵机磁带,神经网络控制操作头从磁带读取或者向磁带中写。然而,NTM中的内存是有限的,因此它看起来更像是一台“神经冯诺伊曼机器”。


NTM包含两个主要部件:一个由神经网络构成的控制器和存储器。控制器:负责对内存执行操作。它可以是任何类型的神经网络(前馈神经网络或递归神经网络)。存储器:保存处理过的信息。它是一个大小为`$N \times M$`的矩阵,其中包含N行向量,每个向量都有M个维度。


在一次更新迭代的过程中,控制器处理输入信号并相应地与存储器进行交互以生成输出。交互由一组并行读写头处理。读和写操作都是模糊的,因为它们都需要访问所有内存地址。


640?wx_fmt=png

图10 神经图灵机的结构


读写机制


当在时刻t(注意力向量大小为N)从内存中读取数据时,640?wx_fmt=png控制分配给不同内存位置(矩阵行)的注意量。读取向量640?wx_fmt=png是记忆内存的加权和,权重根据注意力强度来衡量。


640?wx_fmt=png


其中640?wx_fmt=png代表向量640?wx_fmt=png的第i个元素,640?wx_fmt=png是存储矩阵的第i行向量。


在t时刻写入内存时,受LSTM中输入和遗忘门的启发,写入磁头首先根据一个擦除向量640?wx_fmt=png擦除一些旧的内容,然后通过一个加法向量640?wx_fmt=png添加新的信息到存储器中。


640?wx_fmt=png


注意力机制


在神经图灵机中,如何产生注意力分布wt取决于寻址机制:神经图灵机使用基于内容和基于位置的寻址的混合寻址方式。


  • 基于内容的寻址方式


基于内容的寻址方式,就是根据控制器从输入行和内存行提取的关键向量kt之间的相似性来创建注意向量。基于内容的注意力机制用余弦相似度来计算相似性,然后用softmax函数进行归一化。此外,神经图灵机增加了放大器βt用来放大或衰减分布的重点。


640?wx_fmt=png


  • 插值


然后利用插值门,也就是一个标量gt将新生成的基于内容的注意向量与上一步的注意权值进行混合:

640?wx_fmt=png


  • 基于位置的寻址方式


基于位置的寻址将注意向量中不同位置的值相加,并通过允许的整数移位上的加权分布进行加权。它等价于与核函数st(.)的一维卷积,st(.)是位置偏移的函数。定义这个分布有多种方法。参见图11以获得启发。


640?wx_fmt=png

图11 两种表示位移权重分布st的方式


最后注意分布由标量640?wx_fmt=png进行锐化增强。


640?wx_fmt=png


注意向量wt在时间步长t上生成的完整过程如图12所示。控制器产生的每个磁头的所有参数都是唯一的。如果有多个读写头并行,控制器将输出多个集合。


640?wx_fmt=png

图12 神经图灵机寻址机构流程图


  • 指针网络(Pointer Network)


在排序或旅行推销员(travelling salesman)等问题中,输入和输出都是顺序的数据。不幸的是,传统的seq-2-seq或NMT模型都不能很容易地解决这些问题,因为输出元素的离散类别不是预先确定的,而是取决于可变的输入大小。指针网络(Ptr-Net;(Vinyals, et al. 2015)的提出就是为了解决这类问题:当输出元素对应于输入序列中的位置时。指针网络没有使用注意力机制将编码器的隐藏单元混合到上下文向量中(参见图8),而是使用注意力机制直接作用在编码器上,选择输入序列中某个元素作为解码器的输出。


640?wx_fmt=png

图13 指针网络模型的结构图(图片来自于https://lilianweng.github.io/lil-log/assets/images/ptr-net.png)


当给定输入序列为640?wx_fmt=png,指针网络的输出是一个由整数索引构成的序列640?wx_fmt=jpeg。指针网络依然是以编码器-解码器的结构作为基础。其中编码器和解码器的隐含层状态分别表示为640?wx_fmt=png640?wx_fmt=png。指针网络使用addictive attention作为对分数齐函数,然后同样使用softmax进行归一化从而建立输出条件概率模型:


640?wx_fmt=png


可以看到,在指针网络中注意机制被简化了,因为它没有将编码器状态与注意权重混合到输出中。这样,输出只响应位置,而不响应输入内容。


Transformer


“Attention is All you Need”这篇文章(Vaswani, et al., 2017),无疑是2017年最有影响力和最有趣的论文之一。它对soft attention进行了大量的改进,使得在不需要递归神经网络单元(LSTM,GRU)的情况下进行seq2seq建模成为了可能。它提出的 Transformer 模型完全建立在自注意力机制(self-attention)的基础上,没有使用任何序列对齐的递归结构。  


其模型结构如下:


Key, Value and Query


Transformer的主要部件是一个叫做“多头自注意力机制”的单元(multi-head self-attention mechanism)。Transformer将输入的编码表示形式视为一组键key-值value对(K,V),它们的维度都是n(输入序列长度);在NMT的上下文中,key和value都是编码器的隐含层状态。在解码器中,上一步的输出被压缩为一个查询query(Q的维度为m),下一步的输出是通过映射这个查询query到一组键key和值value的集合生成的。Attention 函数的本质可以被描述为一个查询到一系列键-值对的映射。


Transformer选择缩放点积(scaled dot-product attention)作为注意力机制:输出为各个值key的加权和,其中每个值value的权重定义为查询query作用于所有键key的缩放点积:


640?wx_fmt=png


多头自注意力机制(Multi-Head Self-Attention)


640?wx_fmt=png

图14 多头缩放点积注意力机制的结构图


多头注意力机制会并行计算缩放点积很多次,而不是仅仅计算一次。然后将相互独立的注意力计算单元的输出简单的拼接在一起,最后通过一个线性单元转换成期望大小的维度。我认为这样做的动机是因为合并总是有效的?根据作者在文章中的描述,“多头注意力机制允许模型共同关注来自不同位置的不同子空间的信息。而仅仅有一个注意力机制,是不能得到这么丰富的信息的。”


640?wx_fmt=png


其中640?wx_fmt=png为可学习的参数。


编码器(Encoder)


640?wx_fmt=png

图15 Transformer的编码器结构


编码器可以生成基于注意力的表示,其能够从可能无限大的上下文中定位到特定的信息。


  • 6个相同的层堆叠在一起

  • 每个编码层都有一个多头自注意力机制层和一个全连接前馈神经网络单元

  • 每个编码子层之间都采用残差连接方式,并且使用层归一化(layer normalization)。

  • 每个子层的输出数据都是相同的维度`$d_\text{model} = 512$`


解码器(Decoder)


640?wx_fmt=png

图16 Transformer的解码器结构


解码器能够对已编码的表示进行检索。


  • 6个相同的层堆叠在一起

  • 每个解码层含有两个子层结构,一个是多头注意力机制,另一个是全连接前馈神经网络单元

  • 与编码器结构类似,每个解码器子层之间都采用残差连接方式,并且使用层归一化(layer normalization)。

  • 第一个多头注意子层被修改,以防止当前位置参与到后面的子序列的位置中,因为我们不想在预测当前的位置时有目标序列的未来信息对其进行干扰。


完整的结构


有了前面对编码器和解码器结构的介绍,下面将引出Transformer的整体结构:


  • 源序列和目标序列都先要经过一个embedding层,将其嵌入到相同的维度,例如640?wx_fmt=png

  • 为了保存序列的位置信息,使用基于正弦函数的位置编码器对每个输入向量进行编码,将编码向量合并在嵌入向量之后。

  • softmax函数和线性层加入到最后解码器的输出上。


640?wx_fmt=png

图17 Transformer的整体结构


注:作者实现的一个Transformer模型:lilianweng/transformer-tensorflow


SNAIL


Transformer模型没有递归结构或者卷积结构,即便加入位置编码单元对嵌入向量的位置进行编码,对序列的顺序表示也很弱。对于像强化学习这种对位置依赖性十分敏感的问题,这可能是一个大问题。


简单神经注意力元学习(Simple Neural Attention Meta-Learner)简称SNAIL,通过将Transformer的自注意力机制与时序卷积相结合,部分解决了模型中位置编码的问题。它已被证明擅长解决监督学习和强化学习任务。


640?wx_fmt=png

图18 SNAIL模型的结构图


SNAIL的产生归功于元学习,这是另一个值得写一篇文章来归纳的大话题。但简单来说,元学习用来预测那些新颖的但未被观察到的、具有跟已知样本有相同分布的样本数据。


自注意力生成对抗网路(Self-Attention GAN)


最后,我想提到一个最新发布的生成对抗网络模型,自注意力生成对抗网路,我们来看看注意力机制是如何应用到生成对抗网络上以提高生成图像的质量的。


经典的DGGAN(深度卷积生成对抗网络)将生成器和判别器都表示成多层卷积神经网络。然而,表示的能力受到滤波器大小的限制,因为一个像素的特征受限于一块小的局部区域。为了连接相隔很远的区域,必须通过卷积操作来稀释这些特征,尽管如此,他们之间的依赖性也未必能得到很好的保证。


在计算机视觉中,由于上下文向量可以通过soft-attention明确地学习到一个像素与其他位置所有像素之间的关系,即便是相距甚远的区域,它也可以轻松捕获全局的依赖关系。因此,如果将self-attention与GAN相结合,有望处理更多细节信息。


640?wx_fmt=png

图19 卷积操作和自注意力机制访问到的区域大有不同


SAGAN采用非局部神经网络(non-local neural network)的注意力方法来计算。卷积图像的特征图构成三个分支,分别对应于Transformer模型中的键、值和查询三个概念。


640?wx_fmt=png


然后我们使用点积(dot-product)注意力机制来得到自注意特征图:


640?wx_fmt=png

640?wx_fmt=png

图20 SAGAN中的自注意力机制


注意到,640?wx_fmt=png是注意力图(attention map)中的一个元素,它表示模型在生成第j个位置时对第i个位置应该注意多少程度。640?wx_fmt=jpeg都是1x1的卷积核。


如果你不太明白1x1的卷积是什么意思,请参看Andrew Ng的一个简短的教程

(链接:https://www.youtube.com/watch?v=9EZVpLTPGz8)


列向量640?wx_fmt=png是最终的输出结果,640?wx_fmt=png


之后,输出的注意层(attention layer)乘以一个比例系数,再放回到原始的特征图中,这类似于残差连接方式:


640?wx_fmt=png

尽管缩放系数640?wx_fmt=png在训练期间从0逐渐增加,但是网络被配置为一开始依赖局部区域中的信息,然后通过分配更多权重给更远区域逐渐学习到更远区域的信息。


640?wx_fmt=png

图21 SAGAN生成的大小为128×128的不同类别的示例图像


如果你发现任何这篇文章中的错误或者误解,请不要犹豫跟我联系,我很乐意纠正这些错误。


参考文献:

[1] “Attention and Memory in Deep Learning and NLP.” - Jan 3, 2016 by Denny Britz

[2] “Neural Machine Translation (seq2seq) Tutorial”

[3] Dzmitry Bahdanau, Kyunghyun Cho, and Yoshua Bengio. “Neural machine translation by jointly learning to align and translate.” ICLR 2015.

[4] Kelvin Xu, Jimmy Ba, Ryan Kiros, Kyunghyun Cho, Aaron Courville, Ruslan Salakhudinov, Rich Zemel, and Yoshua Bengio. “Show, attend and tell: Neural image caption generation with visual attention.” ICML, 2015.

[5] Ilya Sutskever, Oriol Vinyals, and Quoc V. Le. “Sequence to sequence learning with neural networks.” NIPS 2014.

[6] Thang Luong, Hieu Pham, Christopher D. Manning. “Effective Approaches to Attention-based Neural Machine Translation.” EMNLP 2015.

[7] Denny Britz, Anna Goldie, Thang Luong, and Quoc Le. “Massive exploration of neural machine translation architectures.” ACL 2017.

[8] Ashish Vaswani, et al. “Attention is all you need.” NIPS 2017.

[9] Jianpeng Cheng, Li Dong, and Mirella Lapata. “Long short-term memory-networks for machine reading.” EMNLP 2016.

[10] Xiaolong Wang, et al. “Non-local Neural Networks.” CVPR 2018

[11] Han Zhang, Ian Goodfellow, Dimitris Metaxas, and Augustus Odena. “Self-Attention Generative Adversarial Networks.” arXiv preprint arXiv:1805.08318 (2018).

[12] Nikhil Mishra, Mostafa Rohaninejad, Xi Chen, and Pieter Abbeel. “A simple neural attentive meta-learner.” ICLR 2018.

[13] “WaveNet: A Generative Model for Raw Audio” - Sep 8, 2016 by DeepMind.

[14] Oriol Vinyals, Meire Fortunato, and Navdeep Jaitly. “Pointer networks.” NIPS 2015.

[15] Alex Graves, Greg Wayne, and Ivo Danihelka. “Neural turing machines.” arXiv preprint arXiv:1410.5401 (2014).


相关链接:https://lilianweng.github.io/lil-log/2018/06/24/attention-attention.html


精彩推荐

4月13-14日,CSDN将在北京主办“Python开发者日(2019)”,汇聚十余位来自阿里巴巴、IBM、英伟达等国内外一线科技公司的Python技术专家,还有数百位来自各行业领域的Python开发者,共同探讨Python在不同场景下的的应用优势和实战经验。即刻扫码抢购早鸟票,限量发售!


640?wx_fmt=jpeg

推荐阅读:

  • 人生苦短,Python之父要解开这个困惑

  • 00后的算法学习之路:拿下斯坦福和剑桥双offer

  • 这份“插件英雄榜Top20”才是Chrome的正确打开方式!

  • 75道常见AI面试题,看看你的知识盲点在哪?(附解析)

  • 云漫圈 | 如何给女朋友解释什么是HTTP

  • 这份“插件英雄榜Top20”才是Chrome的正确打开方式!

  • 剧情反转! 创始人去世事件再爆新料, 1.8亿美元难道去了天堂?

  • 学 Python 没找对路到底有多惨?| 码书

  • 互联网没有春天

  • 没有一个人,能躲过程序员的诱惑!


640?wx_fmt=png

❤点击“阅读原文”,查看历史精彩文章。

相关文章:

【C++】Google C++编码规范(二):类

1、构造函数 不要在构造函数中进行复杂的初始化 (尤其是那些有可能失败或者需要调用虚函数的初始化). 构造函数不得调用虚函数, 或尝试报告一个非致命错误. 如果对象需要进行有意义的 初始化, 考虑使用明确的 Init() 方法或使用工厂模式. 2、初始化 第一种方法:构…

Flask与Django对比

Flask与Django对比 Django vs FlaskFlask框架之间的差别 Django功能大而全,Flask只包含基本的配置 Django的一站式解决的思路,能让开发者不用在开发之前就在选择应用的基础设施上花费大量时间。Django有模板,表单,路由&#xff0c…

windows下apache配置虚拟主机的两个方法

windows下apache配置虚拟主机方法一: 对httpd.conf进行设置:1.注释以下三行#ServerAdmin#ServerName#DocumentRoot2.去掉mod_proxy.so和mod_proxy_ajp.so的注释3.#Virtual hosts#Include conf/extra/httpd-vhosts.conf &#xff0…

大疆、港科大联手!双目3D目标检测实验效果大放送 | CVPR 2019

作者 | heryms责编 | JaneCVPR 2019的文章出来了,今天聊聊双目的 3D object detection。这是一篇来自 DJI (大疆)与港科大合作的文章《Stereo R-CNN based 3D Object Detection for Autonomous Driving》,作者分别是 Peiliang Li&…

【C++】Google C++编码规范(三):智能指针

【C】Google C编码规范(一):作用域 【C】Google C编码规范(二):类 std::unique_ptr std::unique_ptr是C11标准里新推出的智能指针,用来表示动态分配出的对象的「独一无二」所有权&#xff1b…

Django restful-framework初步学习

urls.py from django.conf.urls import include, url from django.contrib import admin from rest_framework import routers # 导入api路由 from app01 import apirouter routers.DefaultRouter() # 获取api路由对象 router.register(rusers, api.UserViewSet) # 注册路由到…

植树节,程序员要爬哪些“树”?

作者 | 程序猿小吴、进击的Hello_World转载自五分钟学算法(ID: CXYxiaowu)公历 3 月 12 日是一年一度的植树节。旨在宣传保护森林,并动员群众参加植树造林活动。说到树,程序猿们肯定不陌生,趁着这个植树节,…

把JS 脚本嵌入CS运行

下面这段视频,是让您知道怎样把播放器的javascript放入C#类别中。在调用这个类别时,只传入相关的参数,即可运行。一时类别封装了,在前台xxx.aspx或xxx.aspx.cs看不到播放器的代码。 另一个就是在CS内怎样运行Javascript脚本。此工…

【C++】Google C++编码规范(四):其他C++

引用参数 所有按引用传递的参数必须加上const; 这在Google Code上是一个硬性约定:输入参数是值参或const的引用参数,输出参数为指针,输入参数可以是const指针,但决不能是非const的引用参数,除非用于交换,比…

使用Ceph集群作为Kubernetes的动态分配持久化存储

2019独角兽企业重金招聘Python工程师标准>>> 使用Docker快速部署Ceph集群 , 然后使用这个Ceph集群作为Kubernetes的动态分配持久化存储。 Kubernetes集群要使用Ceph集群需要在每个Kubernetes节点上安装ceph-common 1. 为kubernetes创建一个存储池 1 2 #…

Cosmos的基石:IL2CPU编译器--.net/C#开源操作系统学习系列三

本文的代码包以cosmos-12304.zip为例(从这个包开始,COSMOS的内核算是有了个基本的雏形,就像是一颗大树在出芽前会先长出庞大的根系,现在就要破土长出第一颗芽了) IL2CPU之于COSMOS就相当与GCC之于LINUX,查看…

【面试 多线程】【第九篇】多线程的问题

1.多线程有什么用 发挥多核CPU优势,防止阻塞,更快的处理数据 2.多线程的实现方式有哪几种,分别的特点优势是什么样的 1》继承Thread类,重写run方法,start启动多线程 2》实现Runnable接口,重写run方法&…

那个大战AlphaGo的柯洁,将免试入读清华大学工商管理专业

日前,柯洁将免试入读清华大学的消息经媒体曝光了出来。《2019 年优秀运动员免试入学推荐名单》3 月 10 日开始公示,围棋世界冠军柯洁的名字出现在名单上,其中表明他将就读清华大学工商管理类专业。据了解,柯洁预计今年下半年入学清…

【Qt】设置背景

1、使用样式表qss设置背景 QDialog 设置背景图片: dlg->setStyleSheet("QDialog{border-image: url(://test.png);}"); 设置背景颜色: dlg->setStyleSheet("QDialog{background-color: red;}"); QWidget 设置背景图片: wgt->setStyleSheet…

基于Hadoop的MapReduce框架研究报告

http://www.doc88.com/p-19830708273.html

【Qt】设置窗口透明度

1、使用setWindowOpacity设置透明度 setWindowOpacity(0.5); 设置完成会使窗体、标题栏、子控件都透明 2、使用样式表qss设置窗体透明 dlg->setStyleSheet("QDialog{background-color: rgba(255, 0, 0, 0.5);}");wgt->setStyleSheet("QWidget{backgrou…

7行Python代码,搭建可以识花的机器学习App|视频教程

你想学Python,却不知如何着手,那你需要一种更加有趣的学习方式。Siraj Raval是一位人工智能领域的编程高手,毕业于哥伦比亚大学,曾任职于 Twilio 和 Meetup,他通过制作教程类短视频的方式在Youtube上积累了大量的粉丝&…

java中缀表达式转后缀表达式(逆波兰算法)

四则运算是栈的重要应用之一 中缀表达式转后缀表达式(逆波兰算法)过程 从左到右遍历中缀表达式数字直接输出为后缀表达式一部分如果是符号,则判断与栈顶元素的优先级高于栈顶元素优先级直接入栈低于或等于栈顶优先级栈顶元素出栈并输出为后缀…

Wpf消息循环之消息传递

几天遇见一个问题需要检查某个wpf程序是否已经运行,如果没有运行则启动传递参数,如果已运行则需要直接传递消息。在没有运行 情况下传递参数很简单,我们只需要Process cmd窗口启动并传递参数,在程序中处理。但是如果程序已经启动有…

【Qt】使用sqlite3数据库时,主键自增和获取自增后的主键的

创建数据表格,设置主键自增 创建数据库时,启用主键自增加特性 Create table testTable (id INTEGER PRIMARY KEY AUTOINCREMENT,。。。。 注意事项:设置主键自增时(AUTOINCREMENT),主键类型必须是INTEGER&…

拿下斯坦福和剑桥双offer,00后的算法学习之路

董文馨,00后,精通英语,西班牙语。斯坦福大学计算机系和剑桥大学双Offer,秋季将进入斯坦福大学学习。10岁开始在国外上学;12岁学Scratch;13岁学HTML & CSS;14岁开始学Python & Java&…

Mybatis【配置文件】就是这么简单

配置文件和映射文件还有挺多的属性我还没有讲的,现在就把它们一一补全 映射文件 在mapper.xml文件中配置很多的sql语句,执行每个sql语句时,封装为MappedStatement对象,mapper.xml以statement为单位管理sql语句 Statement的实际位置…

cto denalil

Denali使用准虚拟化技术来提高x86电脑上虚拟机的性能。Denali的虚拟机为因特网服务专门支持了最小化的操作系统。 系统可以运行上千虚拟机。Xen与Denali不同,因为它试图运行适当数量的完整操作系统,而非大量轻量级操作系统。转载于:https://blog.51cto.c…

Redis学习笔记 - 数据类型与API(1)Key

Redis学习笔记 - 数据类型与API(1)Key Key相关命令 1. 常用命令 命令含义时间复杂度keys查找所有符合给定模式 pattern 的 keyO(N), N 为数据库中 key 的数量dbsize计算key的总数O(1)exists检查key是否存在O(1)del删除指定的key-valueO(1)exp…

【Qt】enum和QString的相互

使用Q_ENUM注册enum Q_ENUM使用元对象系统meta-object来注册,因此在enum所在的类中必须包含宏Q_OBJECT或者Q_GADGET。 例子如下 class MyClass : public QObject{Q_OBJECTpublic:MyClass(QObject *parent = 0);~MyClass();enum Priority { High, Low, VeryHigh, VeryLow };Q_…

Gmail全球大规模宕机

整理 | 非主流出品 | AI科技大本营(ID: rgznai100)今天(3 月 13 日),Google 的多项服务在全球范围内出现了不同程度的宕机,包括 Gmail、Google Drive、 Hangouts、谷歌地图等。受影响最大的是拥有超 10 亿用…

搭建域控服务器

作业环境 服务器端(VirtualBox VM) 操作系统:Windows Server 2003 Enterprise Edition SP2 IPAddress:192.168.1.1/255.255.255.0 Gateway:null 客户端(VirtualBox VM) 操作系统:Windows XP SP3 IPAddress:192.168.1.2…

【Git】ubuntu安装git

sudo apt-get install git 图形界面的:sudo apt-get install git-gui 查看ssh服务是否启动 sudo ps -e | grep ssh 如果没有启动执行如下命令; sudo service ssh start 如果没有ssh,使用如下命令安装 sudo apt-get install ssh

Composer 篇

学习网站Composer 中文网 资源包 Packagist Packagist / Composer 中国全量镜像如何安装 Composer下载 Composer安装前请务必确保已经正确安装了PHP。打开命令行窗口并执行php -v查看是否正确输出版本号。打开命令行并依次执行下列命令安装最新版本的 Composer:php …

西工大开源拥挤人群数据集生成工具,大幅提升算法精度 | CVPR 2019

作者 | 周强(CV君)转载自 我爱计算机视觉(公众号id:aicvml)近年来,因为拥挤人群计数在视频监控、公共安全方面的应用广泛,引起了不少学者的关注。简单说来这个任务就是给定图像,返回…