| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 《Attention Is All You Need》论文笔记 - 【transformer模型】 -> 正文阅读 |
|
[人工智能]《Attention Is All You Need》论文笔记 - 【transformer模型】 |
论文来源:NeurIPS 2017 ?🚀该篇论文提出了一个新颖的网络结构:Transformer。其没有使用循环递归结构和卷积结构,仅基于注意力机制。在两个机器任务上表明了模型能够更好的并行化计算,可以显著地减少训练时间,性能达到了SOTA的效果。 ?【注:transformer的并行化主要体现在self-attention模块上,在encoder端其可以并行处理整个序列,而不像rnn、lstm那样要一个token一个token的从前往后计算。】 ?整体结构概述:?大多数神经序列转换模型都有一个encoder-decoder结构。encoder用于将符号表示的输入序列编码映射到一个连续表示的序列。然后decoder端给定一个输入,decoder结合encoder的输出每次生成一个元素的符号序列。 Encoder端处理流程:?首先是将输入通过了embedding层,然后和位置编码的结果进行相加得到嵌入向量。然后将这个嵌入向量经过3个线性变换(可通过全连接层实现)得到Q、K、V这3个矩阵。然后Q和K矩阵点积、除dk的平方根(即缩放),再softmax得到一个注意力得分矩阵。最后乘上V矩阵即为self-attention层的结果。然后multi-head attention层的输出就是综合了多个self-attention层的结果进行concat传入全连接得到。然后经过残差和LN。然后再经过两层的全连接、残差、LN得到输出。 ?【注:NLP领域不用batch normalization是因为句子长度不一致,并且各个batch的信息没啥关系,因此只考虑句子内信息的归一化,即LN】 Decoder端处理流程:?利用encoder的最后一层的输出计算K、V矩阵作为每个decoder的multi-head attention层的K、V矩阵。而Q矩阵则利用decoder的masked multi-head attention层输出计算的Q矩阵。为了避免计算attention层的输出时使用到了“未来的信息”(即decoder端当前时刻往后时刻的信号),因为从encoder得到的K、V矩阵包含了源语言的全局信息。所以可以采用论文中所说的mask机制屏蔽掉未来信息;具体操作:可以在Q、K矩阵点积缩放后,将这些需要屏蔽的信息设为负无穷,然后传入softmax后这些设为负无穷的值可以趋于0,然后再和V矩阵相乘。 输出端处理流程:?整个模型的最后经过全连接层和softmax输出各单词的概率分布。 ? ? ?Encoder:?encoder由6个相同的encoder层组成,每个encoder层包含2个子层:
?每个子层在进行LN之前都通过一个残差操作,即如下公式: ?Decoder:?decoder同样由6个相同的decoder层组成。但是每个decoder层包含了3个子层:
?同encoder一样,每个子层在进行LN之前都通过一个残差操作。 ?还和encoder不一样的是,对self-attention层的计算做了修改,即前面提到的mask机制,确保当前时刻只能利用其前面单词的的嵌入信息进行预测。 ? ?Attention:?注意力函数的输出是V矩阵所有values的加权和,这些权重是通过Q、K矩阵计算得到。 Scaled Dot-Product Attention:? 如下是缩放点积注意力的计算公式和结构(其中mask操作是可选择的。):
?计算注意力的方式有多种(如下),论文用的是点积,只不过加了个缩放因子。点积的好处是在计算快,空间高效,可以使用高度优化的矩阵乘法实现。论文里提到,当维度d_k较大时,加性注意力即下图的拼接权重的方式会优于点积,作者怀疑是因为当维度d_k较大时,点积的结果也变大,造成softmax的值变的很小,反向传播梯度就会很小。所以为了抵消这个影响,作者对点积的结果加了个缩放因子。 Multi-Head Attention:?多头注意力公式和结构如下:
?Position-wise Feed-Forward Networks:?除了attention层,还有个前馈神经网络层,其实就是两层的全连接层和一个ReLU激活函数层,第一层的输入输出维度是512、2048。第二层的输入输出维度是2048、512。 ?Embeddings and Softmax:?和其他一些序列转换模型一样,作者使用了可以学习的embedding层(就像torch里的nn.embedding)将输入token映射成维度为d_model=512的向量,并乘上d_model的平方根。在输出层使用全连接层和softmax输出下一token的概率分布。在两个embedding层之间和pre-softmax线性变换之间共享相同的权重。 ? ?Positional Encoding:?由于transformer没有循环递归结构和卷积结构,所以为了能够使用到序列的顺序信息,就必须在embedding中注入各token在序列中的相对或绝对位置的信息。所以作者结合了positional encoding信息到input embedding中。这个位置编码和输入embedding一样也是维度为d_model吗,这样就能将它们相加来结合。 ?作者用这个sin-cos计算位置编码的原因是,由于pos+k位置的编码PE可以用pos位置编码线性表示: ? ?Why self-attention??self-attention的好处就是能够一步到位计算,即捕捉到全局的联系,解决了长距离依赖。不像循环结构那样,要一步步递推、更新状态,这个path越长,遗忘的前面的信息就越多。也不想卷积那样要增加卷积核来扩大感受野才能捕捉到尽可能多的信息。self-attention相当于把序列两两比较(即那个Q、K点积的操作。) ?实验部分:?介绍了数据集、硬件环境、优化器的设置、dropout、LN、Label Smoothing。 ?在两个机器翻译数据集上对比了模型的性能,transformer用了最少的资源达到了SOTA的效果。 ?且对模型自身的一些参数进行测试,看哪些参数对模型影响较大。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/17 23:57:35- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |