精华内容
下载资源
问答
  • transformer模型原理

    千次阅读 2019-02-19 15:52:49
    让我们首先将模型看作一个黑盒子。在机器翻译应用程序中,它将使用一种语言的句子,并将其翻译输出到另一种语言中。 弹出Optimus Prime的优点,我们看到了编码组件,解码组件以及它们之间的连接。 编码组件是...

    原文链接:http://jalammar.github.io/illustrated-transformer/

     

    高级外观

    让我们首先将模型看作一个黑盒子。在机器翻译应用程序中,它将使用一种语言的句子,并将其翻译输出到另一种语言中。

    弹出Optimus Prime的优点,我们看到了编码组件,解码组件以及它们之间的连接。

    编码组件是一堆编码器(纸张堆叠其中六个相互叠加 - 没有什么神奇的六号,一个肯定可以尝试其他安排)。解码组件是相同数量的解码器的堆栈。

    编码器的结构完全相同(但它们不共享权重)。每一个都分为两个子层:

    编码器的输入首先流经自我关注层 - 这一层帮助编码器在输入句子中对其他单词进行编码时对其进行编码。我们会在帖子后面仔细观察自我关注。

    自我关注层的输出被馈送到前馈神经网络。完全相同的前馈网络独立应用于每个位置。

    解码器具有这两个层,但它们之间是一个关注层,帮助解码器关注输入句子的相关部分(类似于seq2seq模型中的注意事项)。

    将张量引入图片

    现在我们已经看到了模型的主要组成部分,让我们开始研究各种向量/张量以及它们如何在这些组件之间流动,以将训练模型的输入转换为输出。

    与NLP应用程序中的情况一样,我们首先使用嵌入算法将每个输入字转换为矢量。

     

     
    每个单词都嵌入到大小为512的向量中。我们将用这些简单的框表示这些向量。

    嵌入仅发生在最底部的编码器中。所有编码器通用的抽象是它们接收每个大小为512的向量列表 - 在底部编码器中将是嵌入字,但在其他编码器中,它将是编码器的输出直接在下面。这个列表的大小是我们可以设置的超参数 - 基本上它是我们训练数据集中最长句子的长度。

    在我们的输入序列中嵌入单词后,它们中的每一个都流过编码器的两个层中的每一层。

    在这里,我们开始看到Transformer的一个关键属性,即每个位置的单词在编码器中流经自己的路径。自我关注层中的这些路径之间存在依赖关系。然而,前馈层不具有那些依赖性,因此各种路径可以在流过前馈层时并行执行。

    接下来,我们将示例切换为更短的句子,我们将查看编码器的每个子层中发生的情况。

    现在我们正在编码!

    正如我们已经提到的,编码器接收矢量列表作为输入。它通过将这些向量传递到“自我关注”层,然后传递到前馈神经网络,然后将输出向上发送到下一个编码器来处理该列表。


    每个位置的单词都经过自编码过程。然后,它们各自通过一个前馈神经网络 - 完全相同的网络,每个矢量分别流过它。

    高水平的自我关注

    不要被我愚弄“自我关注”这个词,这是每个人都应该熟悉的概念。在阅读Attention is All You Need论文之前,我个人从未遇到过这个概念。让我们提炼它是如何工作的。

    假设以下句子是我们要翻译的输入句子:

    “ The animal didn't cross the street because it was too tired

    这句话中的“它”是指什么?它指的是街道还是动物?这对人类来说是一个简单的问题,但对算法来说并不简单。

    当模型处理单词“it”时,自我关注允许它将“it”与“animal”相关联。

    当模型处理每个单词(输入序列中的每个位置)时,自我注意允许它查看输入序列中的其他位置以寻找可以帮助更好地编码该单词的线索。

    如果您熟悉RNN,请考虑如何保持隐藏状态允许RNN将其已处理的先前单词/向量的表示与其正在处理的当前单词/向量合并。自我关注是变形金刚用来将其他相关单词的“理解”融入我们当前正在处理的单词中的方法。

     
    当我们在编码器#5(堆栈中的顶部编码器)中编码单词“it”时,注意机制的一部分集中于“动物”,并将其表示的一部分烘焙到“它”的编码中。

    请务必查看Tensor2Tensor笔记本,您可以在其中加载Transformer模型,并使用此交互式可视化对其进行检查。

    详细的自我关注

    让我们首先看看如何使用向量计算自我注意力,然后继续查看它是如何实际实现的 - 使用矩阵。

    第一步骤中计算自关注的是从每个编码器的输入向量的创建三个矢量(在这种情况下,每个字的嵌入)。因此,对于每个单词,我们创建一个Query向量,一个Key向量和一个Value向量。这些向量是通过将嵌入乘以我们在训练过程中训练的三个矩阵而创建的。

    请注意,这些新向量的尺寸小于嵌入向量。它们的维数为64,而嵌入和编码器输入/输出向量的维数为512.它们不必更小,这是一种架构选择,可以使多头注意力计算(大多数)不变。

     

     
    乘以X1WQ权重矩阵产生Q1,与该字相关联的“查询”载体。我们最终在输入句子中创建每个单词的“查询”,“键”和“值”投影。


     

    什么是“查询”,“关键”和“值”向量? 

    它们是抽象,有助于计算和思考注意力。一旦你继续阅读下面如何计算注意力,你就会知道你需要知道的每个这些向量的作用。

    第二个步骤中计算自注意的是,计算得分。假设我们正在计算这个例子中第一个单词“思考”的自我关注。我们需要根据这个词对输入句子的每个单词进行评分。当我们在某个位置编码单词时,分数决定了对输入句子的其他部分放置多少焦点。

    通过将查询向量的点积与我们得分的相应单词的关键向量计算得分。因此,如果我们处理位置#1中单词的自我关注,则第一个分数将是q1k1的点积。第二个分数是q1k2的点积。

     

     

     

    第三和第四步骤是由8(在造纸中使用的密钥向量的维数的平方根来划分的分数。 - 64。这导致具有更稳定的梯度有可能是这里其他可能的值,但这是默认),然后通过softmax操作传递结果。Softmax将分数标准化,因此它们都是正数并且加起来为1。

     

     

    该softmax分数确定每个单词在该位置表达的程度。很明显,这个位置的单词将具有最高的softmax分数,但有时候关注与当前单词相关的另一个单词是有用的。

     

    所述第五步骤是由SOFTMAX得分乘以每个值向量(准备中总结起来)。这里的直觉是保持我们想要关注的单词的值不变,并淹没不相关的单词(例如,通过将它们乘以像0.001这样的小数字)。

    第六步骤是要总结的加权值向量。这会在此位置产生自我关注层的输出(对于第一个单词)。

     

     

    结论是自我关注计算。得到的矢量是我们可以发送到前馈神经网络的矢量。然而,在实际实现中,该计算以矩阵形式完成,以便更快地进行处理。现在让我们看一下,我们已经看到了单词级别计算的直觉。

    自我注意的矩阵计算

    第一步是计算Query,Key和Value矩阵。我们通过将嵌入包装到矩阵X中,并将其乘以我们训练过的权重矩阵(WQWKWV)来实现。

     
    X矩阵 中的每一行对应于输入句子中的一个单词。我们再次看到嵌入向量的大小差异(图中512或4个方框)和q / k / v向量(图中64或3个方框)

     

    最后,由于我们正在处理矩阵,我们可以在一个公式中浓缩步骤2到6来计算自我关注层的输出。

     
    矩阵形式的自我关注计算

     

     

    有许多头的野兽

    本文通过增加一种称为“多头”关注的机制,进一步完善了自我关注层。这以两种方式改善了关注层的性能:

    1. 它扩展了模型关注不同位置的能力。是的,在上面的例子中,z1包含了所有其他编码的一点点,但它可能由实际的单词本身支配。如果我们翻译一句“动物没有过马路,因为它太累了”,我们会想知道“它”指的是哪个词,这将是有用的。

    2. 它给予关注层多个“表示子空间”。正如我们接下来将看到的,我们不仅有一个,而且还有多组Query / Key / Value权重矩阵(Transformer使用8个注意头,因此我们最终为每个编码器/解码器设置了8个) 。这些集合中的每一个都是随机初始化的。然后,在训练之后,每组用于将输入嵌入(或来自较低编码器/解码器的矢量)投影到不同的表示子空间中。


    通过多头注意,我们为每个磁头维护单独的Q / K / V权重矩阵,从而得到不同的Q / K / V矩阵。正如我们之前所做的那样,我们将X乘以WQ / WK / WV矩阵以产生Q / K / V矩阵。


    如果我们进行上面概述的相同的自我关注计算,只有八个不同的时间使用不同的权重矩阵,我们最终得到八个不同的Z矩阵

     

    这让我们面临一些挑战。前馈层不期望八个矩阵 - 它期望单个矩阵(每个字的向量)。所以我们需要一种方法将这八个压缩成一个矩阵。

    我们怎么做?我们将矩阵连接起来然后通过另外的权重矩阵WO将它们多个。

    这就是多头自我关注的全部内容。我意识到这是一小部分矩阵。让我尝试将它们全部放在一个视觉中,这样我们就可以在一个地方看到它们

     

     

    现在我们已经触及了注意力的头,让我们重新审视我们之前的例子,看看不同的注意力头在哪里聚焦,因为我们在我们的例句中编码“it”这个词:

     
    当我们对“它”这个词进行编码时,一个注意力的焦点主要集中在“动物”上,而另一个注意力集中在“疲惫” - 从某种意义上说,模型对“它”这个词的表现形式在某些表现形式中有所表现。 “动物”和“疲倦”。

     

    但是,如果我们将所有注意力添加到图片中,那么事情可能更难理解:

     

    使用位置编码表示序列的顺序

    到目前为止,模型中缺少的一件事就是考虑输入序列中单词顺序的一种方法。

    为了解决这个问题,变换器为每个输入嵌入添加了一个向量。这些向量遵循模型学习的特定模式,这有助于确定每个单词的位置,或者序列中不同单词之间的距离。这里的直觉是,将这些值添加到嵌入中,一旦它们被投影到Q / K / V向量中并且在点积注意期间,就在嵌入向量之间提供有意义的距离。

     


    为了给模型一个单词顺序的感觉,我们添加位置编码向量 - 其值遵循特定模式。

     

    如果我们假设嵌入的维数为4,那么实际的位置编码将如下所示:


    玩具嵌入大小为4的位置编码的真实示例

     

    这种模式可能是什么样的?

    在下图中,每行对应矢量的位置编码。因此第一行将是我们添加到输入序列中嵌入第一个单词的向量。每行包含512个值 - 每个值的值介于1和-1之间。我们对它们进行了颜色编码,使图案可见。


    嵌入大小为512(列)的20个字(行)的位置编码的真实示例。你可以看到它在中心区域分成两半。这是因为左半部分的值由一个函数(使用正弦)生成,而右半部分由另一个函数(使用余弦)生成。然后将它们连接起来以形成每个位置编码矢量。

    位置编码的公式在论文(第3.5节)中描述。您可以在中查看用于生成位置编码的代码get_timing_signal_1d()。这不是位置编码的唯一可能方法。然而,它具有能够扩展到看不见的序列长度的优点(例如,如果要求我们训练的模型翻译句子的时间长于训练集中的任何一个句子)。

    剩余物

    在继续之前我们需要提到的编码器架构中的一个细节是每个编码器中的每个子层(自注意,ffnn)在其周围具有残余连接,然后是层规范化步骤。

     

    如果我们要将矢量和与自我关注相关的图层规范操作可视化,它将如下所示:

     

    这也适用于解码器的子层。如果我们想到2个堆叠编码器和解码器的变压器,它看起来像这样:

    解码器端

    既然我们已经涵盖了编码器方面的大多数概念,我们基本上都知道解码器的组件是如何工作的。但是让我们来看看它们如何协同工作。

    编码器通过处理输入序列开始。然后将顶部编码器的输出变换成一组关注矢量K和V.这些将由每个解码器在其“编码器 - 解码器关注”层中使用,这有助于解码器关注输入序列中的适当位置:


    完成编码阶段后,我们开始解码阶段。解码阶段中的每个步骤输出来自输出序列的元素(在这种情况下为英语翻译句子)。

    以下步骤重复此过程,直至特殊 到达符号表示变压器解码器已完成其输出。在下一个时间步骤中,每个步骤的输出被馈送到底部解码器,并且解码器像编码器那样冒泡它们的解码结果。就像我们对编码器输入所做的那样,我们在这些解码器输入中嵌入并添加位置编码,以指示每个字的位置。

    解码器中的自关注层以与编码器中的自注意层略有不同的方式操作:

    在解码器中,仅允许自我关注层关注输出序列中的较早位置。这是通过-inf在自我关注计算中的softmax步骤之前屏蔽未来位置(将它们设置为)来完成的。

    “编码器 - 解码器注意”层就像多头自我注意一样,除了它从它下面的层创建其查询矩阵,并从编码器堆栈的输出中获取键和值矩阵。

    最终线性和Softmax层

    解码器堆栈输出浮点数向量。我们如何将其变成一个单词?这是最终线性层的工作,其后是Softmax层。

    线性层是一个简单的完全连接的神经网络,它将解码器堆栈产生的矢量投影到一个更大,更大的矢量中,称为logits矢量。

    让我们假设我们的模型知道10,000个独特的英语单词(我们的模型的“输出词汇表”),它是从训练数据集中学到的。这将使logits矢量10,000个细胞宽 - 每个细胞对应于一个唯一单词的得分。这就是我们如何解释线性层后面的模型输出。

    然后softmax层将这些分数转换为概率(全部为正,全部加起来为1.0)。选择具有最高概率的单元,并且将与其相关联的单词作为该时间步的输出。

     

     
    该图从底部开始,矢量产生为解码器堆栈的输出。然后它变成输出字。

     

    回顾培训

    现在我们已经通过训练有素的变压器覆盖了整个前进过程,看一下培训模型的直觉是有用的。

    在训练期间,未经训练的模型将通过完全相同的前进传球。但是,由于我们在标记的训练数据集上训练它,我们可以将其输出与实际正确的输出进行比较。

    为了想象这一点,让我们假设我们的输出词汇只包含六个单词(“a”,“am”,“i”,“thanks”,“student”和“<eos>”(“句末”的缩写)) 。


    在我们开始训练之前,我们模型的输出词汇是在预处理阶段创建的。

    一旦我们定义了输出词汇表,我们就可以使用相同宽度的向量来表示词汇表中的每个单词。这也称为单热编码。例如,我们可以使用以下向量指示单词“am”:


    示例:我们的输出词汇表的单热编码

    在回顾一下之后,让我们讨论一下模型的损失函数 - 我们在训练阶段优化的指标,以引导一个训练有素且令人惊讶的精确模型。

    损失函数

    假设我们正在训练我们的模型。说这是我们在训练阶段的第一步,我们正在训练它的一个简单例子 - 将“merci”翻译成“谢谢”。

    这意味着,我们希望输出是指示“谢谢”一词的概率分布。但由于这种模式还没有接受过训练,所以这种情况不太可能发生。


    由于模型的参数(权重)都是随机初始化的,(未经训练的)模型产生的概率分布具有每个单元/单词的任意值。我们可以将它与实际输出进行比较,然后使用反向传播调整所有模型的权重,使输出更接近所需的输出。

     

    你如何比较两个概率分布?我们简单地从另一个中减去一个。有关更多详细信息,请查看 交叉熵Kullback-Leibler散度

    但请注意,这是一个过于简单的例子。更现实的是,我们将使用长于一个单词的句子。例如 - 输入:“jesuisétudiant”和预期输出:“我是学生”。这真正意味着,我们希望我们的模型能够连续输出概率分布,其中:

    • 每个概率分布由宽度为vocab_size的向量表示(在我们的玩具示例中为6,但更实际地是3,000或10,000的数字)
    • 第一概率分布在与单词“i”相关联的单元处具有最高概率
    • 第二概率分布在与单词“am”相关联的单元格中具有最高概率
    • 依此类推,直到第五个输出分布表示' <end of sentence>'符号,其中还有一个与10,000元素词汇表相关联的单元格。


    我们将在一个样本句子的训练示例中训练我们的模型的目标概率分布。

     

    在足够大的数据集上训练模型足够的时间之后,我们希望产生的概率分布看起来像这样:


    希望通过培训,模型将输出我们期望的正确翻译。当然,这个短语是否是训练数据集的一部分并不是真正的指示(参见:交叉验证)。请注意,即使不太可能是该时间步的输出,每个位置都会获得一点概率 - 这是softmax非常有用的属性,有助于训练过程。

    现在,因为模型一次生成一个输出,我们可以假设模型从该概率分布中选择具有最高概率的单词并丢弃其余的单词。这是一种方法(称为贪婪解码)。另一种方法是保持前两个词(例如,'I'和'a'),然后在下一步中,运行模型两次:一旦假设第一个输出位置是单词'I',另一次假设第一个输出位置是'me'这个单词,考虑到#1和#2的位置,保留的是哪个版本产生的错误较少。我们重复这个位置#2和#3 ......等。这种方法称为“波束搜索”,在我们的例子中,beam_size是两个(因为我们在计算位置#1和#2的波束后比较了结果),和top_beams也是两个(因为我们保留了两个单词)。这些都是您可以尝试的超参数。

     

     

     

    展开全文
  • 文档:3.Transformer模型原理详解.note 链接:http://note.youdao.com/noteshare?id=4f653097ec5d6a0c9cbb90f73dddbc10&sub=AF43EE70238248F0A6168EDABA1241C0 个人觉得总结的还是很浅显易懂的,希望帮助到...

    文档:3.Transformer模型原理详解.note
    链接:http://note.youdao.com/noteshare?id=4f653097ec5d6a0c9cbb90f73dddbc10&sub=AF43EE70238248F0A6168EDABA1241C0

    个人觉得总结的还是很浅显易懂的,希望帮助到初学者,可以留言评论哦!!!

    本人日常习惯写在有道云笔记里面了,上面是有道云的链接,点开即看,可以评论哦,欢迎评论(*^▽^*)!!!

     

    我也附上了PDF版本,里面有部分图片格式小异常,但完全不影响观看!!!

    (见CSND的资源部分)

     

     

    展开全文
  • 小白总结的Transformer
  • 近期前沿(2020年10月):pQRNN:谷歌最新轻量级文本分类模型Cross-Thought:微软为巨向量打造的最新预训练任务自Attention机制提出后,加入attention的Seq2seq模型在各个任务上都有了提升,所以现在的seq2seq模型指...

    5032775bed01a6bceb3a65775913ab4f.png

    大家好,我是在算法前沿旋转跳跃的焦燥女青年rumor。

    近期前沿(2020年10月)

    • pQRNN:谷歌最新轻量级文本分类模型
    • Cross-Thought:微软为巨向量打造的最新预训练任务

    自Attention机制提出后,加入attention的Seq2seq模型在各个任务上都有了提升,所以现在的seq2seq模型指的都是结合RNN和attention的模型。之后google又提出了解决Seq2Seq问题的Transformer模型,用全attention的结构代替了lstm,在翻译任务上取得了更好的成绩。本文主要介绍《Attention is all you need》这篇文章,自己在最初阅读的时候还是有些不懂,希望可以在自己的解读下让大家更快地理解这个模型^ ^

    Attention和Transformer原理还不熟悉的可以看:

    • 【NLP】Transformer模型原理详解
    • 【NLP】Attention原理详解

    1. 模型结构

    模型结构如下图:

    971a85c01c6e141993f07254664802ba.png

    和大多数seq2seq模型一样,transformer的结构也是由encoder和decoder组成。

    1.1 Encoder

    Encoder由N=6个相同的layer组成,layer指的就是上图左侧的单元,最左边有个“Nx”,这里是x6个。每个Layer由两个sub-layer组成,分别是multi-head self-attention mechanism和fully connected feed-forward network。其中每个sub-layer都加了residual connection和normalisation,因此可以将sub-layer的输出表示为:

    接下来按顺序解释一下这两个sub-layer:

    • Multi-head self-attention

    熟悉attention原理的童鞋都知道,attention可由以下形式表示:

    multi-head attention则是通过h个不同的线性变换对Q,K,V进行投影,最后将不同的attention结果拼接起来:

    self-attention则是取Q,K,V相同。

    另外,文章中attention的计算采用了scaled dot-product,即:

    作者同样提到了另一种复杂度相似但计算方法additive attention,在

    很小的时候和dot-product结果相似,
    大的时候,如果不进行缩放则表现更好,但dot-product的计算速度更快,进行缩放后可减少影响(由于softmax使梯度过小,具体可见论文中的引用)。
    • Position-wise feed-forward networks

    这层主要是提供非线性变换。Attention输出的维度是[bsz*seq_len, num_heads*head_size],第二个sub-layer是个全连接层,之所以是position-wise是因为过线性层时每个位置i的变换参数是一样的。

    1.2 Decoder

    Decoder和Encoder的结构差不多,但是多了一个attention的sub-layer,这里先明确一下decoder的输入输出和解码过程:

    • 输出:对应i位置的输出词的概率分布
    • 输入:encoder的输出 & 对应i-1位置decoder的输出。所以中间的attention不是self-attention,它的K,V来自encoder,Q来自上一位置decoder的输出
    • 解码:这里要特别注意一下,编码可以并行计算,一次性全部encoding出来,但解码不是一次把所有序列解出来的,而是像rnn一样一个一个解出来的,因为要用上一个位置的输入当作attention的query

    明确了解码过程之后最上面的图就很好懂了,这里主要的不同就是新加的另外要说一下新加的attention多加了一个mask,因为训练时的output都是ground truth,这样可以确保预测第i个位置时不会接触到未来的信息。

    加了mask的attention原理如图(另附multi-head attention):

    7e53fdd956ad8d3314a36289e5f8bd7f.png

    1.3 Positional Encoding

    除了主要的Encoder和Decoder,还有数据预处理的部分。Transformer抛弃了RNN,而RNN最大的优点就是在时间序列上对数据的抽象,所以文章中作者提出两种Positional Encoding的方法,将encoding后的数据与embedding数据求和,加入了相对位置信息。

    这里作者提到了两种方法:

    1. 用不同频率的sine和cosine函数直接计算
    2. 学习出一份positional embedding(参考文献)

    经过实验发现两者的结果一样,所以最后选择了第一种方法,公式如下:

    作者提到,方法1的好处有两点:

    1. 任意位置的
      都可以被
      的线性函数表示,三角函数特性复习下:

    2. 如果是学习到的positional embedding,(个人认为,没看论文)会像词向量一样受限于词典大小。也就是只能学习到“位置2对应的向量是(1,1,1,2)”这样的表示。所以用三角公式明显不受序列长度的限制,也就是可以对 比所遇到序列的更长的序列 进行表示。

    2. 优点

    作者主要讲了以下三点:

    d0f4c3c6ff99580f8ccb443331b5b2db.png
    1. Total computational complexity per layer (每层计算复杂度)

    2. Amount of computation that can be parallelized, as mesured by the minimum number of sequential operations required

    作者用最小的序列化运算来测量可以被并行化的计算。也就是说对于某个序列

    ,self-attention可以直接计算
    的点乘结果,而rnn就必须按照顺序从
    计算到

    3. Path length between long-range dependencies in the network

    这里Path length指的是要计算一个序列长度为n的信息要经过的路径长度。cnn需要增加卷积层数来扩大视野,rnn需要从1到n逐个进行计算,而self-attention只需要一步矩阵计算就可以。所以也可以看出,self-attention可以比rnn更好地解决长时依赖问题。当然如果计算量太大,比如序列长度n>序列维度d这种情况,也可以用窗口限制self-attention的计算数量

    4. 另外,从作者在附录中给出的栗子可以看出,self-attention模型更可解释,attention结果的分布表明了该模型学习到了一些语法和语义信息

    1ad702d8d7a870ecde48bb2ebae49c26.png

    3. 缺点

    缺点在原文中没有提到,是后来在Universal Transformers中指出的,在这里加一下吧,主要是两点:

    1. 实践上:有些rnn轻易可以解决的问题transformer没做到,比如复制string,或者推理时碰到的sequence长度比训练时更长(因为碰到了没见过的position embedding)
    2. 理论上:transformers非computationally universal(图灵完备),(我认为)因为无法实现“while”循环

    4. 总结

    Transformer是第一个用纯attention搭建的模型,不仅计算速度更快,在翻译任务上获得了更好的结果,也为后续的BERT模型做了铺垫。

    Transformer是BERT的核心模块,在BERT推出后,涌现了越来越多的研究成果,这里为大家做了总结,每个节点里都有更多的笔记,可以加V「leerumorrr」获取xmind版,顺便交个朋友 (๑•̀ㅂ•́) ✧

    6ba5521578fa805974842dbccda4962e.png

    相关阅读:

    • 预训练改进
      • Google XLNET:自回归+上下文表示
      • ALBERT:权重共享的BERT
      • ELECTRA:对抗式BERT训练
      • NLP中的对抗训练
    • BERT+生成式
      • OpenAI GPT2原理解读
      • BERT生成式之MASS解读
      • BERT生成式之UNILM解读
      • Google T5:超大型生成模型
    • BERT加速
      • 模型蒸馏原理
      • LayerDrop:BERT结构剪枝
      • 模型训练加速:梯度累加/混合精度/分布式训练等
      • FastBERT:又快又稳的推理提速方法
      • DynaBERT:动态伸缩训练
    • 用于特定任务的模型
      • 微软MT-DNN原理解读
      • Deformer:文本匹配加速

    参考资料:

    1. Attention is all you need
    2. 知乎:谷歌论文《Attention is all you need》里Transformer模型的一些疑问?
    3. Stackoverflow: positional embedding
    展开全文
  • transformer模型的工作原理和语言模型BERT 1,概述 《Attention Is All You Need》是一篇Google提出的将Attention思想发挥到极致的论文。这篇论文中提出一个全新的模型,叫 Transformer,抛弃了以往深度学习任务里面...

    transformer模型的工作原理和语言模型BERT

    1,概述

    《Attention Is All You Need》是一篇Google提出的将Attention思想发挥到极致的论文。这篇论文中提出一个全新的模型,叫 Transformer,抛弃了以往深度学习任务里面使用到的 CNN 和 RNN。目前大热的Bert就是基于Transformer构建的,这个模型广泛应用于NLP领域,例如机器翻译,问答系统,文本摘要和语音识别等等方向。

    以下是论文引用:

    “Transformer 是第一个完全依赖自注意力(self-attention)来计算输入和输出的表示,而不使用序列对齐的递归神经网络或卷积神经网络的转换模型。”

    这里说的“转换”(transduction)是指将输入序列转换成输出序列。Transformer 背后的思想是使用注意力机制处理输入和输出之间的依赖关系,并且要完全递归。

    尽管之前流行的seq2seq模型也很出色,但存在一定的局限性:处理长期依赖仍然是一个挑战;模型架构的顺序特性阻止了并行化。transformer模型很好的解决了这两个问题。

    2,transformer模型

    首先来说一下transformerLSTM的最大区别, 就是LSTM的训练是迭代的, 是一个接一个字的来, 当前这个字过完LSTM单元, 才可以进下一个字, 而transformer的训练是并行了, 就是所有字是全部同时训练的, 这样就大大加快了计算效率, transformer使用了位置嵌入(positional encoding)(positional encoding)来理解语言的顺序, 使用自注意力机制和全连接层来进行计算, 这些后面都会详细讲解.
    transformer模型主要分为两大部分, 分别是编码器解码器, 编码器负责把自然语言序列映射成为隐藏层(下图中第2步用九宫格比喻的部分), 含有自然语言序列的数学表达. 然后解码器把隐藏层再映射为自然语言序列, 从而使我们可以解决各种问题, 如情感分类, 命名实体识别, 语义关系抽取, 摘要生成, 机器翻译等等,

    在这里插入图片描述

    现在,让我们观察下图。编码器块有一层多头注意力(Multi-Head Attention),然后是另一层前馈神经网络( Feed Forward Neural Network)。另一方面,解码器有一个额外的掩模多头注意力(Masked Multi-Head Attention)。

    1. positional encodingpositional encoding, 即位置嵌入(或位置编码)

    由于transformer模型没有循环神经网络的迭代操作, 所以我们必须提供每个字的位置信息给transformer, 才能识别出语言中的顺序关系.
    现在定义一个位置嵌入的概念, 也就是positional encoding, 位置嵌入的维度为[max sequence length, embedding dimension], 嵌入的维度同词向量的维度, max sequence length属于超参数, 指的是限定的最大单个句长.
    注意, 我们一般以字为单位训练transformer模型, 也就是说我们不用分词了, 首先我们要初始化字向量为[vocab size, embedding dimension], vocab sizevocab size为总共的字库数量, embedding dimension为字向量的维度, 也是每个字的数学表达.
    在这里论文中使用了sinesine和cosinecosine函数的线性变换来提供给模型位置信息:

    PE(pos,2i)=sin(pos/100002i/dmodel) PE(pos,2i+1)=cos(pos/100002i/dmodel) (eq.1)

    上式中pos指的是句中字的位置, 取值范围是[0, max sequence length)[0, max sequence length), ii指的是词向量的维度, 取值范围是[0, embedding dimension)[0, embedding dimension), 上面有sinsin和coscos一组公式, 也就是对应着embedding dimensionembedding dimension维度的一组奇数和偶数的序号的维度, 例如0,10,1一组, 2,32,3一组, 分别用上面的sinsin和coscos函数做处理, 从而产生不同的周期性变化, 而位置嵌入在embedding dimensionembedding dimension维度上随着维度序号增大, 周期变化会越来越慢, 而产生一种包含位置信息的纹理, 就像论文原文中第六页讲的, 位置嵌入函数的周期从2π2π到10000∗2π10000∗2π变化, 而每一个位置在embedding dimensionembedding dimension维度上都会得到不同周期的sinsin和coscos函数的取值组合, 从而产生独一的纹理位置信息, 模型从而学到位置之间的依赖关系和自然语言的时序特性

    2. self attention mechanismself attention mechanism, 自注意力机制

    Self-Attention是Transformer最核心的内容。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在 Transformer 的架构中,自注意力并不是计算一次,而是进行多次计算,并且是并行且独立进行的。因此,它被称为多头注意力
    在这里插入图片描述

    3. Layer NormalizationLayer Normalization和残差连接

    在这里插入图片描述

    4. transformer encodertransformer encoder整体结构

    在这里插入图片描述

    3 BERT,Google出品的NLP模型

    BERT,是来自来自 Transformer 的双向编码器表示(Bidirectional Encoder Representations from Transformers)的缩写。BERT=基于Transformer 的双向编码器表征,顾名思义,BERT模型的根基就是Transformer,来源于attention is all you need。其中双向的意思表示它在处理一个词的时候,能考虑到该词前面和后面单词的信息,从而获取上下文的语义。

    我们都知道迁移学习在计算机视觉领域的重要性有多高。例如,深度学习预训练模型可以针对 ImageNet 数据集上的新任务进行微调,并且在相对较小的标记数据集上提供不错的结果。
    类似地,预训练语言模型对于改进许多自然语言处理任务非常有效;

    BERT 框架是 Google AI 的一个新的语言表示模型,它使用预训练和微调来为各种任务创建最先进的模型。这些任务包括问答系统、情感分析和语言推理等。

    img

    BERT 的模型架构

    BERT 使用多层双向 Transformer 编码器。它的自注意力层在两个方向上都执行自注意力。Google 发布了该模型的两种变体:

    1. BERT Base: Transformers 层数 = 12, 总参数 = 110M

    2. BERT Large: Transformers 层数 = 24, 总参数 = 340M

      img

    BERT 使用双向性,通过对几个任务的预训练,掩码语言模型(Masked Language Model)和下一句的预测

    下图表示了BERT的输入表征
    在这里插入图片描述

    下面的思维导图说明了各个部分的作用是什么:
    在这里插入图片描述

    BERT 预训练任务
    BERT 使用以下两个无监督预测任务对 BERT 进行预训练。

    1. 掩码语言建模(Masked Language Modeling,MLM)
      根据这篇论文
      “掩码语言建模从输入中随机掩盖一些标记,其目标是仅基于上下文预测被掩盖的单词的原始词汇 id。与从左到右的语言模型预训练不同,MLM 目标允许表示融合左和右上下文,这允许我们预训练深度双向 Transformer。”
      Google AI 研究人员随机掩盖了每个序列中 15% 的单词。这个任务是什么?就是预测那些被掩盖的单词。此处需要注意的是,掩码单词并不总是被掩盖的标记 [MASK] [MASK] 标记在微调过程中永远不会出现。
      因此,研究人员使用了以下技术:
      有 80% 的单词被掩码标记 [MASK] 替换。
      有 10% 的单词被随机单词替换。
      有 10% 的单词保持不变。
    2. 下一句的预测
      一般来说,语言模型并不能捕捉连续句子之间的关系。BERT 也接受过这项任务的预训练。
      对于语言模型的预训练,BERT 使用成对的句子作为训练数据。每对句子的选择非常有趣。让我们试着通过一个例子来理解它。
      假设我们有一个包含 100000 条句子的文本数据集,我们想使用这个数据集来预训练 BERT 语言模型。因此,将有 50000 个训练样本或句子对作为训练数据。
      对于 50% 的句子对来说,第二条句子实际上是第一条句子的下一条句子。
      对于其余 50% 的句子对,第二条句子将是语料库中的一条随机句子。
      对于第一种情况,标签是“IsNext”,第二种情况标签是“NotNext”。
      像 BERT 这样的架构表明了,无监督学习(预训练和微调)将成为许多语言理解系统中的关键元素。资源较少的任务尤其可以从这些深度双向架构中获得巨大的好处。

    小结:

    语言模型的每一次进步都推动着NLP的发展,从Word2vec到ELMo,从OpenAI GPT到BERT。通过这些发展我们也可以洞悉到,未来表征学习(Deep learning is representation learning)将会越来越多的应用到NLP相关任务中,它们可以充分的利用目前海量的数据,然后结合各种任务场景,去训练出更为先进的模型,从而促进AI项目的落地。

    参考资料

    1,https://github.com/aespresso/a_journey_into_math_of_ml

    2,一文理解 Transformer 的工作原理

    3,https://www.bilibili.com/video/BV1P4411F77q?spm_id_from=333.788.b_636f6d6d656e74.9

    4,简书

    5, BERT模型学习与分析

    展开全文
  • 图一就是Transformer模型的框架,不过这里的encoder和decoder不再是RNN结构,拆开来看,细节如图二:原始论文里,作者设置了6层encoder与6层decoder结构。至于为什么是6,这就是一个超参数而已,可以根据实际情况...
  • transformer语言模型原理解读

    千次阅读 2019-05-20 15:59:00
    Product)2.2.2 具体计算过程:2.3 多头注意力三、位置编码(Positional Encoding)四、残差和前馈(Feed Forward)4.1 为什么残差[3]4.2 前馈五、训练-模型的参数在哪里六、参考文献 一、简介 基于假设:一个词在句子...
  • 谷歌的Transformer模型最早是用于机器翻译任务,当时达到了STOA效果。 Transformer改进了RNN最被人诟病的训练慢的缺点,利用self-attention机制实现快速并行。并且Transformer可以增加到非常深的深度,充分发掘DNN...
  • Transformer原理

    千次阅读 2019-05-29 00:33:59
    Transformer原理 BERT的原理 利用预训练的BERT模型将句子转换为句向量,进行文本分类1 Transformer原理 和大多数seq2seq模型一样,transformer的结构也是由encoder和decoder组成。 Encoder Encoder由N=6个相同的...
  • Transformer模型进阶-GPT模型和Bert模型

    千次阅读 2019-03-30 14:55:57
    Transformer模型进阶-GPT模型和Bert模型 OpenAI GPT 模型原理与架构 原文[Improving Language Understanding by Generative Pre-Training] OpenAI Transformer是一类可迁移到多种NLP任务的,基于Transformer的...
  • 文章均从个人微信公众号“AI牛逼顿”转载,文末扫码,欢迎关注! 距离上一篇的对联生成有...今天要介绍的模型框架依然是encoder-decoder,不过模型只采用attention机制。目的就是要避免使用RNN结构,提高并行效率(...
  • Transformer XL原理介绍

    2019-08-22 11:12:34
    1. 引言 在自然语言处理中,当前深度学习主流的结构是RNN和Transformer,因为...而Transformer虽然能力比较强,但是在预测时会受到训练时所设定的最大长度限制,因此,本文将介绍一个Transformer模型的变体,即Tran...
  • Transformer原理

    2021-02-22 11:25:12
    Transformer 是谷歌大脑在 2017 年底发表的论文 attention is all you need 中所提出的 seq2seq 模型。现在已经取得了大范围的应用和扩展,而 BERT 就是从 Transformer 中衍生出来的预训练语言模型 这篇文章分为以下...
  • transformer模型计算图

    2019-07-15 16:57:00
    参考了这篇文章:... 结合代码和图,能更加清楚的了解transformer中的一些原理(ps,等下次有时间在排下版) 转载于:https://www.cnblogs.com/shizhh/p/11189952.html...
  • 自然语言处理中的Transformer模型真正改变了我们处理文本数据的方式。Transformer是最近自然语言处理发展的幕后推手,包括Google的BERT(Bidirectional Encoder Representations from Transformers),来自Transformer...
  • NLP 领域的模型研究已经被 transformer 模型占领了,学习Transformer 理解Attention,Self-Attention 机制应用实现以及原理,理解BERT 模型必备内容。
  • 本文将会从BERT的原理开始讲起,并带领大家分析transformer的源码,最后分别介绍如何使用BERT做本文分类与句向量的生成。 原理篇 本章将会先给大家介绍BERT的核心transformer,而transformer又是由attention组合...
  • 本文主要分为三部分:Transformer模型主要原理,模型的变种介绍和相关工具的介绍。主要为入门小白提供更好的学习体验,欢迎讨论呀。该论文由Vaswani在2017年发布,他已经将近两岁了呢,针对该模型提出的应用和变种...
  • 个人其他链接 github blog 资源 完整代码+详细代码注释:github 参考论文: Attention Is All You Need ...Transformer模型来自论文Attention Is All You Need。这个模型的应用场景是机器翻译,借助Se...
  • Transformer原理详解

    2020-03-26 14:45:20
    文章目录一、简介二、模型结构2.1 整体结构2.2 Transformer的编解码器2.2.1 编码器2.2.2 解码器2.3 输入层2.4 位置向量2.5 Attention模型2.5.1 NLP中的注意力2.5.2 Scaled attention2.5.3 多头自注意力2.6 Position-...
  • 自然语言处理中的Transformer模型真正改变了我们处理文本数据的方式。Transformer是最近自然语言处理发展的幕后推手,包括Google的BERT。了解Transformer的工作原理、它如何与语言建模、序列到序列建模相关,以及它...
  • 【NLP】Transformer框架原理详解-1

    千次阅读 2019-07-13 15:01:30
    我们提出一种新的简单的网络架构Transformer,仅基于attention机制并完全避免循环和卷积。对两个机器翻译任务的实验表明,这些模型在质量上更加优越、并行性更好并且需要的训练时间显著减少。我们的模型在WMT 2014...
  • Transformer模型的一大缺点是不能捕捉句子的位置信息。试想我们的句子不管如何打乱,从刚才的原理可以看出,Transformer的结果都是相同的。为了解决这个问题,论文中在编码词向量时引入了位置编码(Position ...
  • 首先将这个模型看成是一个黑箱操作。在机器翻译中,就是输入一种语言,输出另一种语言。那么拆开这个黑箱,我们可以看到它是由编码组件、解码组件和它们之间的连接组成。 编码组件部分由一堆编码器(encoder)构成...
  • 实际上,Transformer模型还包含一个Decoder模块用于生成文本,但由于BERT模型中并未使用到Decoder模块,因此这里对其不作详述。下图展示了Transformer Encoder的内部结构,可以看到,Transformer Encoder在Multi-...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 298
精华内容 119
关键字:

transformer模型原理