| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 【NLP】《Attention Is All You Need》的阅读笔记 -> 正文阅读 |
|
[人工智能]【NLP】《Attention Is All You Need》的阅读笔记 |
背景在深度学习领域,如果你连Transformer都不知,那就太out了。现如今基于Transformer的模型,如Bert在NLP的下游的很多任务中都达到了sota。而这个Transformer就出自于这篇论文。虽然是2017年发表的,但是已经被称作是非常经典的论文了。下面主要是捡一些主要的来看吧。原文地址:Attention Is All You Need。 介绍之前的文章中已经介绍了attention,注意力帮助提高神经机器翻译等应用到性能。但传统的基于RNN和attention的神经网络,速度还是慢了点。谷歌根据这个现状提出了Transformer–一种利用注意力提高训练速度的模型,这里的attention就是Self-Attention结构,Transformer一个巨大的优点是:模型在处理序列输入时,可以对整个序列输入进行并行计算,不需要按照时间步循环递归处理输入序列。实验结果,不仅提高了训练速度,效果还也得到了比较大的提升。现在就来看看吧。 1. 基本结构原文中的模型的结构如下图: 我们首先将模型看作一个单独的黑盒子。在机器翻译应用程序中,它将采用一种语言的句子,并输出另一种语言的翻译。
self-attention层的输出反馈给前馈神经网络(Feed Forward Neural Network, FFNN)。需要注意编码器的输入:假设一个序列用 X = w 1 , w 2 , ? ? , w n X=w_1,w_2,\cdots,w_n X=w1?,w2?,?,wn?表示,第一个encoder输入,则是其对应的embedding之后的结果,有: X = x 1 , x 2 ? ? , x n X=x_1,x_2\cdots, x_n X=x1?,x2??,xn?,其中 x i ∈ R d x_i\in \mathbb{R}^d xi?∈Rd,即每个词用d维的向量表示,经过第一个encoder之后的输出则是:经过self-attention和FFNN之后的向量,其维度与 x i x_i xi?相同。 解码器也有编码器的两个层,但在这两层之间有一个注意层,帮助解码器关注输入句子的相关部分。 2 张量在模型结构中的使用现在我们已经看到了模型的主要部分,让我们开始看看各种向量/张量,以及它们如何在这些组件之间流动,从而将经过训练的模型的输入转化为输出。 与NLP应用程序的一般情况一样,我们首先使用词嵌入算法将每个输入字转换为向量。假如将每个词转成词向量的维度为4维,实际的代码维度通常是256或者512等。假设以下图表示: 在输入序列中嵌入单词后,每个单词都会流经编码器的两层。如下: 接下来,我们将把示例切换到一个较短的句子,并查看编码器的每个子层中发生了什么。 正如已经提到的,编码器接收向量列表作为输入。 3 详细了解self-attention让我们首先看看如何使用向量计算self-attention,然后继续看它是如何实际实现的——使用矩阵,深刻理解数据的流向。 计算self-attention的第一步是从编码器的每个输入向量中创建三个向量(在本例中,输入是每个单词的嵌入)。因此,我们为每个单词创建一个查询向量、一个键向量和一个值向量。这些向量是通过将嵌入乘以我们在训练过程中训练的三个矩阵来创建的。 这些新向量的维数小于嵌入向量。它们的维数为64,而嵌入和编码器输入/输出向量的维数为512,当然图中显示的是4。 那么问题来了,query,key,value向量到底是什么呢,使用的意义是什么?提前透漏:他们是三个参数矩阵,是需要学习的。 计算self-attention的第二步是计算分数,当然第一步是获取对应的q,k,v向量值了。假设我们正在计算例子中第一个单词“thinking”的self-attention。我们需要根据这个词对输入句子的每个词进行评分。当我们在某个位置对单词进行编码时,分数决定了对输入句子其他部分的关注程度。 分数是通过将各个单词的query vector和key vector 的点积与来评分的。操作事例如下:如果我们处理位置1的单词的self-attention,第一个分数将是q1和k1的点积。第二个分数就是q1和k2的点积了。 第三步和第四步是将分数除以8(论文中使用的key向量维度的平方根64。这会有更稳定的梯度,当然也可以是其他可能的值,但这是默认值),然后通过softmax操作传递结果。Softmax将分数标准化,使其全部为正值,加起来等于1。
第五步是将每个value vector乘以softmax分数(准备将它们相加)。这里的直觉是保持我们想要关注的单词的完整值,并忽略不相关的单词(例如,将它们乘以0.001这样的小数字)。 第六步是对加权值向量求和。这将在该位置(对于第一个单词)生成self-attention层的输出,即
z
1
z_1
z1?。 4.self-attention的矩阵计算第一步是计算Query、Key和Value 的矩阵。我们通过将Embedding值打包到矩阵X中,并将其乘以我们训练的权重矩阵(
W
Q
W^Q
WQ,
W
K
W^K
WK,
W
V
W^V
WV)来实现这一点。 5 多头注意力机制论文中通过添加一种称为“多头”注意力机制,进一步细化了self-attention层。这从两个方面提高了注意层的性能:
6 使用位置编码表示序列的顺序到目前为止,模型中缺少的一件事是解释输入序列中单词顺序的方法。 为了解决这个问题,Transformer 在每个输入嵌入中添加一个向量。这些向量遵循模型学习的特定模式,这有助于确定每个单词的位置,或序列中不同单词之间的距离。这里的直觉是,将这些值添加到Embedding中可以在Embedding投影到Q/K/V向量和点积注意力间提供嵌入向量之间有意义的距离。
7 残差连接在继续之前我们需要提到的编码器架构中的一个细节是,每个编码器中的每个子层(self-attention,ffnn)在其周围都有一个残差连接,然后是一个层进行归一化步骤。 8 解码器现在我们已经涵盖了编码器方面的大部分概念,我们基本上知道解码器的组件是如何工作的。让我们来看看它们是如何协同工作的。 编码器首先处理输入序列。然后将顶部编码器的输出转换为一组注意向量 K 和 V。这些将由每个解码器在其“编码器-解码器注意力”层中使用,这有助于解码器专注于输入序列中的适当位置: 以下步骤重复该过程,直到出现一个特殊符号,表明转换器解码器已完成其输出。每一步的输出在下一个时间步被馈送到底部的解码器,解码器就像编码器一样冒泡它们的解码结果。就像我们对编码器输入所做的那样,我们将位置编码嵌入并添加到这些解码器输入中,以指示每个单词的位置。
9 线性层和softmax解码器堆栈输出一个浮点向量。我们如何把它变成一个词?这是最后一个线性层的工作,后面是一个 Softmax 层。线性层是一个简单的全连接神经网络,它将解码器堆栈产生的向量投影到一个更大的向量中,称为 logits 向量。 假设我们的模型知道从训练数据集中学习到的 10,000 个独特的英语单词(我们模型的“输出词汇”)。这将使 logits 向量有 10,000 个单元格宽——每个单元格对应一个唯一单词的分数。这就是我们如何解释模型的输出,然后是线性层。然后,softmax 层将这些分数转化为概率(全部为正,全部加起来为 1.0)。选择概率最高的单元格,并生成与其关联的单词作为该时间步的输出。 模型训练在训练期间,未经训练的模型将通过完全相同的前向传递。但是由于我们是在一个带标签的训练数据集上训练它,我们可以将它的输出与实际正确的输出进行比较。 为了可视化,假设我们的输出词汇表只包含六个单词(“a”、“am”、“i”、“thanks”、“student”和“<eos>”(“end of sentence”的缩写)) 损失函数选取假设我们正在训练我们的模型。假设这是我们在训练阶段的第一步,我们正在通过一个简单的例子来训练它——将“merci”翻译成“thanks” 这意味着,我们希望输出是一个概率分布,表示“thanks”这个词。但由于这个模型还没有经过训练,所以这还不太可能发生。 解码但请注意,这是一个过于简单的示例。更现实的是,我们会使用一个比一个词长的句子。例如——输入:“je suis étudiant”,预期输出:“i am a student”。这真正意味着,我们希望我们的模型能够连续输出概率分布,其中:
现在,因为模型一次产生一个输出,我们可以假设模型正在从该概率分布中选择具有最高概率的单词并丢弃其余的单词。这是一种方法(称为贪婪解码),除此之外还有一种叫做beam search:每个时间步保留k个最高概率的输出词,然后在下一个时间步,根据上一个时间步保留的k个词来确定当前应该保留哪k个词。假设k=2,第一个位置概率最高的两个输出的词是”I“和”a“,这两个词都保留,然后根据第一个词计算第2个位置的词的概率分布,再取出第2个位置上2个概率最高的词。对于第3个位置和第4个位置,我们也重复这个过程。这种方法称为集束搜索(beam search)。 总结上面的内容就是transformer的核心内容了。前前后后内容也不少,需要我们有一定的基础。 如果不懂,这么好的论文是值得回去多看几遍的。因为其是NLP划时代模型BERT的基础。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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/26 5:19:46- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |