| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> Transformer - Attention Is All You Need - 跟李沐学AI -> 正文阅读 |
|
[人工智能]Transformer - Attention Is All You Need - 跟李沐学AI |
目录 Position-wise Feed-Forward Networks 摘要主流序列转录模型( sequence transduction models )是基于复杂的循环和卷积神经网络,通常是用编码器-解码器( encoder-decoder )架构。性能最好的模型通常也会在编码器-解码器之间使用注意力机制。文章提出了一个简单的新架构 Transformer -- 仅仅依赖于注意力机制,不使用循环和卷积。在两个机器翻译任务上展示了特别好的性能--更好的并行度,训练时间更短。在 WMT 2014 Englishto-German 翻译任务上达到了28.4的 BLUE score,比目前最好的结果提升了2个 BLUE (包括集成模型)。在 WMT 2014 English-to-French 翻译任务中,做了一个单模型,效果优于其他的单模型,在8个? GPU 上训练了3.5天达到了41.8的 BLUE ,其训练时间相对于文献中其他模型的训练时间来说很少。 Transformer 架构能够很好的泛化到其他任务。 导言在RNN里面是把序列从左往右一步一步的往前计算。假设序列是一个句子,他就是一个词一个词的往前看,对 t 个词会计算一个输出(隐藏状态)? 已经有相关工作将 attention 应用到了编码器-解码器里面了,主要是用于如何将编码器的东西有效的传给解码器,即和 RNN 是一起使用的。 背景卷积网络替换循环神经网络来减少时序的计算。但是卷积神经网络难以建模长序列,因为卷积计算每次去看一个比较小的窗口(例如一个3*3的像素块),若两个像素隔得比较远,得用很多层卷积,一层一层堆上去才能把隔的较远的像素融合起来。但是使用 Transformer 里面的注意力机制,每次能看到所有的像素,一层就能看到整个序列。但是卷积可以有多输出通道,每一个输出通道可以认为是识别不一样的模式,想要获得类似多输出通道的效果,提出了多头的注意力机制( Multi-Head Attention )。 自注意力机制( self-attention )将单个序列的不同位置联系起来以计算序列的表示,之前的有些工作已经使用了自注意力机制。 基于循环 attention 机制的端到端的 memory networks ,而不是序列对齐的循环,在简单语言中的问答和语言建模任务中表现良好。 Transformer 是第一个仅依赖于自注意力机制来做的编码器-解码器框架。 模型架构编码器将序列的符号表示? Transformer 使用了一个编码器解码器的架构,将 self-attention 、 point-wise 、 fully connecte layers 堆叠在一起的。 编码器的输入:例如中译英,就是中文的句子。解码器的输入:解码器在做预测的时候是没有输入的,实际上解码器之前时刻的一些输出作为输入。( shifted right 一个一个往右移)。 编码器解码器堆叠编码器:由? 解码器:解码器也是由6个完全一样的层堆叠起来的。解码器有3个子层。第一个子层是 masked multi-head self-attention?, 因为解码器做的是一个自回归(当前输出的输入集是上面一些时刻的输出),即预测的时候我们不应该看到之后那些时刻的输出(保证训练和预测的行为的一致性),但是在注意力机制中每次都能看到完整的输入,解码器训练的时候,预测?t 时刻的输出不应该看到 t 时刻以后的那些输入,可以通过带掩码的注意力机制实现。第二个子层是 multi-head? attention , 其中 k , v 来自编码器的输出, q 来自解码器的前一子层的输出,这边不需要掩码,因为在翻译任务中,我们是能拿到完整的源语言的句子的,上一子层的 mask 是针对目标语言的,我们翻译的时候都是逐字逐词从前往后翻的。第三个子层同编码器第二个子层一样是一个全连接层。每一个子层都用了一个残差连接,再接上 layer normalization 。 注意力层注意力函数是将一个 query 和一些 key-value 对映射成输出的一个函数, query , keys , values? 和 output 都是一些向量, output 是 values 的加权和(在最后一维的长度上,输出和 values 是一样的),每一个 value 的权重是其对应的 key 和 query 的相似度( compatibility function ,不同的注意力机制有不同的算法)算出的。 Scaled Dot-Product Attentionsqueries 和 keys 维度相同都是? 实现时,将 queries 拼成一个矩阵? 有两种常见的注意力机制,一种是加性注意力机制( additive attention ,用一个隐藏层的全连接层实现,可以处理 query 和 key 不等长的情况),另一种是点积注意力机制( dot-product? ( multiplicative )? attention,这边在传统点积的基础上除以了? 除以了? 我们怀疑,对于长度比较大的向量,点积绝对值有可能很大,也可能比较小,相对的差距就会变大,套上 softmax 函数最大的那个值会更加接近1,剩下的值更加接近0,值更加向两端靠拢,计算梯度的时候会发现梯度比较小,因为 softmax 最后的结果是希望预测的值置信的靠近1,不置信的地方尽量接近0,这样就可以说收敛的差不多了,这时候梯度就比较小,就跑不动。 假设 q 和 k 的分量是均值为0、方差为1的独立随机变量,它们的点积
则? transformer 里面? mask 主要是为了避免在第 t 时刻看到之后时间的东西,假设 query 和 key 是等长的,长度为 n ,且在时间上是能对应起来的,那么第 t 时间的 queries? Multi-Head Attention与其做一个单个的注意力函数,不如将整个 queries , keys , values 投影到一个低维的空间投影? h 次,再做 h 次的注意力函数,将每一个函数的输出并在一起再投影回来得到我们最终的输出,见图2。 Scaled Dot-Product Attentio 里面没有可学的参数,注意力函数就是内积,有时候为了识别不一样的模式,希望可以有一些不一样的计算相似度的方法,若用加性注意力机制还是有权重可以学的,Multi-Head Attention 先投影到一个低维空间,这个投影的 W 是可以学的,给 h 次机会希望可以学到不一样的方法,使得在投影进去的那个度量空间能匹配不同模式需要的一些相似函数,最后再投影回来(有点像卷积里面多输出通道的感觉)。 其中, 投影矩阵的维度 我们采用?
transformer 中的注意力机制三种使用姿势编码器中的自注意力机制,设batch_size=1,句子长度n, embedding 维度? 解码器中的自注意力机制,和编码器类似,可能就是长度变成 m ,embedding 维度也是? 编码器解码器之间的注意力机制,这边不再是自注意力了, keys 和 values 来自编码器最后一层的输出(形状是 Position-wise Feed-Forward Networks他就是一个 MLP ,这边有一个 Position-wise , position 输入序列有很多个词,一个词就是一个点 position ,把一个 MLP 对每一个词作用一次(对每一个词作用的是同样一个 MLP ),就是 MLP 作用在最后一个维度(每一个词共享同一个权重参数矩阵),它的另一种描述方式是两个kernel大小为1的卷积。 有两个线性层,第一个线性层的输出维度是? 解释,关于transformer怎么有效的使用序列信息。 考虑简单情况,无残差连接,也没有 layerNorm ,然后 attention 是一个单头的。在 transformer 的 MLP 虽然画了多个棕色的框,但是其实是一个它们的权重是一样的,每个 MLP 对你每一个输入的点做运算,会得到一个输出。输入和输出的大小都是一样的, attention 的作用就是把整个序列里面的信息抓取出来做一次汇聚 aggregation , 所以序列中我们感兴趣的信息就已经抓取出来了,以至于在做投影( MLP )映射成我们更想要的语意空间的时候,因为已经涵盖了我们要的序列信息,所以每个 MLP 只要在对每个点独立做就行。因为序列信息已经被汇聚完成,所以 MLP 是可以分开做的。这就是transformer 如何抽取序列信息然后把这些信息加工成我们最后要的语意空间的向量的过程。 RNN,棕色的 MLP 也是每个时间步共享权重矩阵。如绿色的线表示把上一时刻的输出(作为历史信息)放回来和该时刻的输入一起并进去(就完成了信息的传递),得到当前时刻的输出。 RNN 和 Transformer 一样都是用一个 MLP 来做语意空间的转换,不同的是传递序列信息的方式, RNN 是把上一时刻的信息输出传入到下一时刻做输入,?Transformer 是通过一个 attention 层去全局的抓取整个序列里面的信息,然后再用 MLP 做语义的转换。关注点都是如何有效的使用序列信息。 Embeddings and Softmax对于任何一个词学习长为? 解释:为啥要乘上? 因为是3个 embedding 层共享权重的,其中有?softmax 前的线性层,通常是要用?xavier 等方法初始化的,也即编码器、解码器的 embedding 亦是如此。xavier?初始化的? Positional Encodingattention 是没有时序信息的,输出是 values 的加权和,权重是 query 和 keys 的相似度,和序列信息无关,不会关注 key-value 对在序列的什么位置,换句话说,给定一句话,将词打乱 attention 的结果是一样的(最多顺序发生了变化),尽管词在序列中的顺序发生了变化,但是加权和不会变,这是不合理的,词序打乱可能会影响语义,所以需要通过别的方式加入时序信息。 RNN 是上一时刻的输出作为下一时刻的输入来传递历史信息,其本来就是带时序的。在输入中添加时序信息,例如一个词在位置 i ,将位置? 思路:在计算机中假设用32位的整数表示数字,就是说用32个 bit ,每个 bit 上有不同的值来表示? 其中pos?是位置,i?是维度。 也就是说,位置编码的每个维度对应于一个正弦曲线。 这些波长的范围是? 还使用可训练的位置embeddings进行了试验,发现这两个版本产生几乎相同的结果(参见表?3 的 E 行)。 选择正弦曲线,因为它可以允许模型推断比训练期间遇到的更长的序列。 下图中,?
Why Self-Attention
表1比较了四种不一样的层,比较了三个方面,复杂度,计算的顺序性(这个越少越好,表示下一步计算必须等前面多少步计算完成),最大的长度(表示信息从一个数据点到另一个数据点要走多远,越短越好)。 self-attention 复杂度,例如 queries?和 keys 长度是 n,它们的列数都是d,所以是? 实际上, attention 对模型的假设更少,想要达到和 RNN 、 CNN 相同的效果则需要更大的模型和更多的数据,所以现在基于 transformer 的模型都是特别大特别贵。 实验Training Data and Batching在标准的WMT 2014 English-German数据集上进行了训练,其中包含约450万个句子对。 这些句子使用?byte-pair encoding (BPE,把词根提出来,可以使整个字典比较小)进行编码,源语句和目标语句共享大约37000个 tokens 的词汇表 ( 编码器 和 解码器的 embedding 就可以公用,模型会比较简单)。 对于英语-法语翻译,我们使用更大的WMT2014 English-French 数据集,它包含3600万个句子,并将tokens分成32000个word-piece词汇表[38]。 序列长度相近的句子一起进行批处理。 每个训练批次的句子对包含大约25000个源tokens和25000个目标tokens。 Hardware and Schedule我们在一台具有8个NVIDIA P100 GPU的机器上训练我们的模型。 使用本文描述的超参数的base models,每个 batch 耗时约0.4秒。 我们的base models共训练了10万步,花费12小时。 如表3底部描述的大模型,?每个 batch 耗时约1.0秒,大模型训练了30万步(3.5天)。 Optimizer使用Adam优化器,其中 这对应于在第一次warmup_steps?步骤中线性地增加学习速率,并且随后将其与步骤数的平方根倒数成比例地减小。 我们使用warmup_steps?= 4000。学的向量越长的时候,学习率要低一点。先由一个较小的值慢慢爬到一个高的值,爬到之后按照步数的0.5次方衰减。这边几乎没啥可调的超惨,本来 adam 对学习率不怎么敏感。 下面直观感受一下,学习率的变化情况,蓝色的? Regularization训练期间我们采用三种正则化: Residual Dropout?将 dorpout 应用到每个子层的输出,在进入残差连接和 layerNorm 之前。 此外,在编码器和解码器中,将dorpout应用到embeddings和位置编码求和。 对于 base model ,我们使用 Label Smoothing?在训练过程中,我们使用的label smoothing的值为? Results
结论文中提出的 Transformer ,是第一个完全基于注意力机制的序列转录模型--将编码器-解码器架构常用的循环层替换成了multi-headed self-attention 。在机器翻译的任务上, Transformer 的训练要比比循环层卷积层快很多。在 WMT 2014 English-to-German 和?WMT 2014 English-to-French 翻译任务上,达到了最好的效果。在 WMT 2014 English-to-French 任务上,效果优于所有的模型,前一项任务甚至优于所有先前的集成模型。很看好基于注意力机制模型的前景,并打算运用到其他任务上。我们计划将 Transformer 扩展到涉及输入和输出模式的文本以外的任务上,并研究 local ,? restricted 注意机制,以有效处理图像、音频和视频等。 generation less sequential 也是一个研究方向。
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年4日历 | -2025/4/3 18:52:53- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |