-
transformer预测过程_LTR中Transformer的应用
2020-12-06 15:07:441. Learning to Rank (LTR) 简介LTR是一种机器学习算法,所以和所有机器学习算法一样,在应用的过程中需要先经过训练(training)阶段,再到应用(Prediction)阶段。LTR任务在一个query中包含特征数据以及标签...1. Learning to Rank (LTR) 简介
LTR是一种机器学习算法,所以和所有机器学习算法一样,在应用的过程中需要先经过训练(training)阶段,再到应用(Prediction)阶段。
LTR任务在一个query中包含特征数据以及标签(相关度数据)
,目标是找到一个模型给
打分,使得分数的排序顺序尽量与
的顺序一致。根据顺序评价模型好坏有很多指标,比如NDCG
1.1 LTR与一般机器学习算法
LTR与常见机器学习算法也有不一样的地方:
- 从上图来看,而对于LTR任务来说,在评价之前多了一个ranking部分。
一般的机器学习算法不包括ranking 。 - 评价指标不可直接优化,这与分类任务有点类似,但并不一样。
回归任务的评价指标:RMSE等可以直接反应模型对数据拟合的好坏。
分类任务的评价:acc,recall,precision等需要通过预测结果是否正确重新计算。
排序任务可以类比为回归任务,直接拟合; 但对于相关度(2,1,0)来说,模型预测为(10,1,0)却比(1,2,0)拥有更大的损失,但前者是一种更好的结果。
也可以类比为分类任务;但排序中的各类别(2,1,0)之间并非完全独立,类别1与类别2的距离应该比类别0到类别2的距离更近。
1.2 LTR的优化方法
代理损失函数
各种回归、分类的任务的损失函数,也可以应用到排序中。
作为回归任务,可以直接用RMSE作为目标。catboost的benchmark中,RMSE获得非常不错的效果。
类比分类任务,可以做一些改动,比如DLCM中的 attention Rank
其中当
,否则为0。
排序算子
既然由于排序的存在使得排序指标不可直接优化,那何不想办法将此算子换成一种可导的算法?
代表作softRank,请参考【LTR】SoftRank亮点解析。
直接优化排序指标
另一类算法是使用随机搜索的方法,直接以排序指标作为fitness,不断尝试新的解。虽然可以直接优化NDCG,但缺点也很明显,计算量大。
几篇相关工作:
Optimisation Methods for Ranking Functions with Multiple Parameters
Direct Optimization of Ranking Measures for Learning to Rank Models
ES-Rank : Evolution Strategy Learning to Rank Approach ES-Rank : Evolution Strategy Learning to Rank Approach1.3 LTR的一种分类方法
如果要决定一个序列的顺序,总共有三种方式。
- 对每一个样本打分,根据分数排序 ——> pointwise
- 拟合两两样本之间的相对关系 ——> pairwise
- 直接拟合整个序列的排序关系 ——> listwise
这种分类方法与打分模型(scoring model)没有直接的关系,主要体现在计算loss时选取的对象。(由于这个原因,我一直把代理损失函数按照这三个类别分类,但这貌似并不合适。因为同一个loss在pointwise和pairwise中是都是可以用的)
打分模型提供的只是一种从不同维度、不同角度找到合适的区分样本的特征提取器。
2. LTR的打分模型
根据LTR打分模型在特征映射过程中是否依赖同一个query中其他候选文档,将打分模型分为两类:context-free model,context-aware。
1.1 context-free模型
打分模型预测一个样本时,不考虑其他样本。
这种模型很常见,基本所有模型都可以这样用,比如线性模型、树模型、NN模型等。
(注意:在计算loss时考虑pairwise、listwise与打分模型无关)
1.2 context-aware模型
LTR任务与NLP任务有相似性:候选文档中一个文档是否更重要取决于其他文档是否更重要(NLP任务中一个词的重要程度也取决于其他词的角色)。所以NLP中的的优秀模型也可以用来做LTR。
最近几年,得益于各种神经网络的加持,NLP任务大放异彩。最出名的两类模型:
- 以RNN为基础:RNN,LSTM,GRU,Bi...
- 以Transformer为基础:GPT,BERT, 各种BERT的衍生品
其实在RNN的一些应用中,研究者们已经注意到注意力的应用,比如在机器翻译中的注意力。
3. 使用注意力机制的打分模型(RNN vs Transformer)
基于RNN和transformer的模型在LTR任务中差异较大。
3.1 RNN类模型
在LTR中应用RNN模型的模型也称作Pointer Network。可参考seq2slate中的一张图
这张图的含义是:
- input sequence 部分是一般的RNN模型,负责编码
- go 表示开始预测,每次从未预测的样本中找出最相关的一个(箭头表示当前需要预测的样本,红色箭头表示当前被预测为最好的一个样本)
- 如果一个样本已经被预测,下一次预测将不考虑该样本
这与机器翻译中的注意力机制有点类似,不过差别还蛮大。
这一类算法的文章:DCM、DLCM、Seq2Slate
Deep choice model using pointer networks for airline itinerary prediction
Learning a Deep Listwise Context Model for Ranking Refinement,
Seq2Slate: Re-ranking and Slate Optimization with RNNs另外值得注意的是,基于RNN的模型,样本文件需要以某一个预先的顺序输入到模型中,这会导致模型预先的顺序对预测结果产生影响。
3.2 Transformer类模型
transformer直接将注意力机制发挥到极致,可以说其诞生就是为注意力准备的。
LTR中transformer的应用大概如下图所示,(图选自:Personalized Re-ranking for Recommendation )
其中x表示原特征,pv表示其他预训练模型的特征表示,pe表示其他预训练模型的位置预测,然后就是一串transformer结构,再接个softmax归一化。(pe的补充说明,LTR可以在一个模型预测的基础之上再做预测,称为ReRank,所以一个模型预测完以后,产生的顺序,可作为新的信息补充到数据特征中,即pv和pe)
更多详细内容,请参考文献:
Personalized Re-ranking for Recommendation
SetRank: Learning a Permutation-Invariant Ranking Model for Information Retrieval
Context-Aware Learning to Rank with Self-Attention4. Transformer
深度剖析transformer:http://jalammar.github.io/illustrated-transformer/
中文翻译版:https://zhuanlan.zhihu.com/p/485082214.1 Transformer 的数学表示
要理解transformer,只要完全理解下面两个公式就可以了,搞清楚公式中每个词的含义就会用了。
在注意力机制中,一个样本的表示由所有样本加权决定:
为了从多个维度表示样本,使用多个注意力,再将结果拼接在一起:
上面两个公式已经把transformer的注意力机制讲完了,剩下的就是在拼接的结果后面加上Batch Norm,Dense,activation等东西。
4.2 Transformer的图形化表示
直观一点,看两张图:
一个单注意力机制的计算过程,包括将原embedding表示为<q,k,v>,根据qk计算每个样本对当前样本的贡献,在计算当前样本在当前样本集中的综合表示。
为了增加模型的特征表示,将注意力并行多来几个,再拼接在一起。
说实话,这里面到底学到了什么,真的很难解释。但是,可以肯定的一点是,由于这种动态表示的方式,使得模型至少有两个优点:
- 样本由上下文(语境)决定
- 样本之间的依赖关系与样本之间的距离无关(这一点在排序中很有用)
4.3 样本的顺序如何体现
使用position embedding。比如单词的顺序在NLP中是很重要的,这种单词的顺序,在transformer中是通过PE来表示的。PE可以使用固定的形式,比如:
其中pos表示单词在句子中的位置,i表示向量的维度。PE的维度一般会与初始的embedding维度相同。
另一种方式是直接初始化为随机变量,让模型自动学习,只需要传入单词的位置即可。
4.4 为什么要除以
一种解释:https://www.zhihu.com/question/339723385/answer/782509914
Attention function:
其中的两个向量的点积:
假设
服从高斯分布,
,则:
的分布不再是高斯分布,其分布如下图所示:
其均值和方差(感兴趣的同学可以用数值模拟试试):
pdf分布比较复杂,请参考:https://mathworld.wolfram.com/NormalProductDistribution.html
所以qk的乘积对应的变量的方差发生了变化,但由于其本身并不大,所以主要引起方差变化的原因还是点积之后的求和,导致放大了d倍:
而在计算softmax时,大的 d 会导致权重集中在个别对象上。所以,需要在sottmax之前先对权重进行缩放。
5. Transformer在LTR中的应用
几篇相关文献前面已经过了。了解了上面transformer的结构以后,你就会知道transformer可以完成从特征层面提取文档间信息这个任务。上面的文章可以帮忙捋一捋如何应用到实际的业务场景中。
其中看到一个比较不一样的点,在setRank中,作者提到了一种类聚类的方式,很值得一试。
5.1 Induced Multi-head Self Attention
与前面的Multi-head self attention的区别,看下图:
(a)是一个常规的transformer。(b)中的改进是,先将(Q,K,V)中的K,V表示为比输入样本数少的特征表示,相当于做了一次聚类得到每个类的中心,再使用这些聚类中心来表达每一个样本的新特征。
这种做法在数据稀疏时,应该是十分有意义的。作者也证明了,当每一个query中训练的有效数据量远少于测试时的数据量时,模型也能表现出很好的结果。
- 从上图来看,而对于LTR任务来说,在评价之前多了一个ranking部分。
-
transformer预测过程_图解OpenAI的秘密武器GPT-2:可视化Transformer语言模型
2021-01-08 14:13:21其中OpenAI训练的GPT-2模型就展示出了惊艳的能力,它能够撰写出连贯而富有激情的论文,比当下其他所有的语言模型写的都好。GPT-2其实并不是一种特别新颖的架构,它的架构非常类似于Transformer模型的Decoder结构。...大数据文摘出品
来源:github
编译:小七、池俊辉、Andy
今年,我们见识了许多令人眼花缭乱的机器学习的应用成果。其中OpenAI训练的GPT-2模型就展示出了惊艳的能力,它能够撰写出连贯而富有激情的论文,比当下其他所有的语言模型写的都好。
GPT-2其实并不是一种特别新颖的架构,它的架构非常类似于Transformer模型的Decoder结构。然而,GPT2是一个非常大的基于Transformer的语言模型,需要基于大量数据集进行训练。在这篇文章中,我们将介绍什么样的结构能够让模型产生好的结果,深入研究模型中的self-attention层,此外,我们将研究除语言建模之外的Transformer模型Decoder结构的应用。
我写本文主要是为了补充我之前的“图解Transformer模型”系列。
系列链接:
https://jalammar.github.io/illustrated-transformer/
通过图解的方式更直观地解释Transformer模型的内部工作原理,以及它们自发布以来的演变过程。我希望通过这种图形示例能够更容易地解释后来基于Transformer的模型,毕竟它们的内部工作原理是在不断发展的。
本文主要从以下几方面展开阐述
第一部分:GPT2和语言建模
语言模型的含义
用于语言建模的Transformers模型
与BERT的区别
Transformer 架构的演变
速成课程:探索GPT-2内部工作原理
深入了解内幕
GPT-2小结
第二部分:图解Self-Attention(自我关注)模型
自注意力(Self-Attention,不加mask)
- 创建查询向量、键向量和值向量
- 打分
- 求和
图解Masked Self-Attention
GPT-2的Masked Self-Attention
你做到了!
第三部分:语言建模番外
机器翻译
生成摘要
迁移学习
音乐生成
结论
第一部分 GPT2和语言模型
那么究竟什么是语言模型呢?
语言模型的含义
在The Illustrated Word2vec中,我们研究了语言模型是什么,它是能根据一个句子前半部分的单词预测出下一个单词的机器学习模型。最著名的语言模型是智能手机键盘,可以根据您当前键入的内容建议出下一个单词。
The Illustrated Word2vec:
https://jalammar.github.io/illustrated-word2vec/
从这个意义上讲,我们可以说GPT-2基本上是键盘应用程序的下一个单词预测功能,但它比你手机上的键盘输入法具有更大更复杂的功能。GPT-2是基于一个名为WebText大型数据集进行的训练,这个数据集大约有40G,是OpenAI研究人员为了研究从互联网上爬下来的。就存储大小来说,我使用的键盘应用程序SwiftKey占用了78MB的空间。训练出来的GPT-2的最小变体,占用500MB的存储空间来存储其所有参数。GPT-2的最大变体是最小变体的13倍,因此它可能需要占用超过6.5 GB的存储空间。
使用AllenAI GPT-2 Explorer来进行GPT-2建模是一个很好的方法,它使用GPT-2显示10个对下一个单词的预测结果,以及它们的概率分数。您可以选择其中一个单词,然后再查看下一个预测列表,循序渐进,持续不断地写下去。
用于语言建模的Transformers模型
正如我们在“图解Transformer模型”中看到的那样,原始的 transformer模型由encoder和decoder组成,每个都是我们称之为 transformer 架构的堆栈。这种架构是合理的,因为该模型解决了机器翻译问题——过去encoder-decoder结构解决的问题。
在随后的许多研究工作中,这种架构要么去掉了encoder,要么去掉了decoder,只使用其中一种transformer堆栈,并尽可能高地堆叠它们,为它们提供大量的训练文本,并投入大量的计算机设备,以训练其中一部分语言模型,这一研究需要花费数十万美元,就像在研究AlphaStar时也投入了数百万美元的资金。
那么我们可以将这些块堆叠多高呢?事实证明,堆叠的高度是不同的GPT2模型之间大小有别的主要影响因素之一。
与BERT的区别
GPT-2是基于 transformer模型的decoder架构构建的。而BERT则是基于 transformer模型的encoder结构构建的。我们将在以下部分中研究两者的差异。两者之间的一个关键区别是,GPT2与传统语言模型一样,一次输出一个token。接下来让我们来举例说明,经过训练的GPT-2是如何背诵机器人第一定律(First Law of Robotics)的。
这些模型实际工作的方式是在生成每个token之后,添加到输入序列中,而新序列将成为下一步模型的输入。这就是“自回归(auto-regression)”的思想。但这种想法也使得RNN的效率大打折扣。
GPT2以及一些后来的模型如TransformerXL和XLNet本质上都是自回归的。而BERT不是,它是一种权衡。在失去自回归的过程中,BERT可以获得两边的单词,以结合上下文去获得更好的结果。而XLNet既使用了自回归,同时也找到了根据两边单词融合上下文的替代方法。
Transformer架构的演变
一个是encoder结构,如下图所示:
来自原始 transformer论文的encoder模块可以输入直到某个最大序列长度(例如512个token)。如果输入序列短于此限制,我们可以填充序列的其余部分。
另一个是decoder结构,这个结构与encoder具有较小的体系结构差异——多了一层用于关注encoder中的特定片段:
self-attention层的一个关键区别在于它隐藏了未来的tokens,而不是像BERT那样,将单词更改为[mask(掩码)],而是通过干扰阻止了从正在计算的位置右侧的tokens中得到的信息进入到self-attention层计算。
例如,如果我们要强调位置#4的路径,我们可以看到它只允许参与当前和之前的tokens:
重要的是,BERT使用的self-attention和GPT-2使用的masked self-attention之间的区别是明确的。正常的self-attention允许在其右侧的tokens达到峰值。而Masked self-attention可防止这种情况发生:
然后是只包含decoder的架构,在发表论文“通过总结长序列来生成Wikipedia”后,提出了另一种能够进行语言建模的transformer结构。这个架构不再使用Transformer的encoder结构。因此,我们将模型称为“Transformer-Decoder”。这种早期基于transformer的语言模型由六个decoder结构组成:
论文链接:
https://arxiv.org/pdf/1801.10198.pdf
Decoder结构是相同的。我扩展了第一个,所以你可以看到它的self-attention层是掩码变体。请注意,该模型现在可以在某个段中处理多达4,000个tokens——原来的 transformer只能处理512个,该模型有了较大提升。
这些结构与原始decoder结构非常相似,只是它们消除了第二个self-attention层。在“具有更深的Self-Attention的角色级语言建模”(https://arxiv.org/pdf/1808.04444.pdf)一文中实验了类似的体系结构,以创建一次预测一个字母/字符的语言模型。
OpenAI GPT-2模型使用的就是只有decoder结构的transformer模型。
速成课程:探索GPT-2内部工作原理
看看里面,你会发现,这些话正在我的脑海深处割裂。电闪雷鸣,锋利的言语正在将我逼向疯狂的边缘。
让我们来研究一个已经训练好的GPT-2,看看它是如何工作的。
GPT-2可以处理1024个tokens。每个token沿其自己的路径经过所有的decoder结构。
运行经过训练的GPT-2的最简单方法是允许它自己进行漫游(技术上称为生成无条件样本),或者我们可以给它提示让它生成关于某个主题的文本(也就是生成交互式条件样本)。在不设条件的情况下,我们可以简单地给它设置一个开始token,并让它开始生成单词(训练模型使用作为其开始token,称之为
)。该模型只有一个输入token,因此该路径将是唯一的活动路径。token通过所有层依次处理,然后沿该路径生成向量。该向量可以根据模型的词汇量进行评分(模型知道的所有单词,GPT-2中的单词为50,000个)。在这种情况下,我们选择了概率最高的token——“the”。但是我们也可能把事情搞混,因为有时你连续点击键盘应用程序中建议的第一个单词,它有时会卡在重复的循环中,唯一的出路就是你点击第二个或第三个建议的单词。这里就可能发生这种情况。GPT-2有一个名为top-k的参数,我们可以使用该参数让模型考虑除第一个字之外的采样(当top-k = 1时就是这种情况)。
在下一步中,我们将第一步的输出添加到输入序列,并让模型进行下一个预测:
请注意,第二条路径是此计算中唯一有效的路径。GPT-2的每一层都保留了自己对第一个token的解释,并将在处理第二个token时使用它(我们将在下一节中详细介绍有关self-attention的内容)。GPT-2不会根据第二个token重新解释第一个token。
深入了解内幕
输入编码
接下来看一下更多细节,以便更清楚地了解模型。让我们从输入开始。正如我们之前讨论过的其他NLP模型一样,模型在其embedding matrix(嵌入矩阵)中查找输入单词的embedding,embedding matrix是我们训练模型获得的结果之一。
每一行都是一个word embedding(单词嵌入):一个数字列表代表一个单词,并捕获它的一些含义。在不同的GPT2模型大小中该列表的大小是不同的。最小的模型使用每个字或每个token的embedding大小为768。
所以在开始时,我们会在embedding matrix中查找起始token
的嵌入。在将其交给模型中的第一个模块之前,我们需要结合位置编码,位置编码是一个指示序列中的字到transformer模块中顺序的信号。经过训练的模型包含一个矩阵,其中包含输入中1024个位置中每个位置的位置编码向量。在此基础上,我们已经介绍了在传递给第一个 transformer模块之前如何处理输入单词。我们还知道构成训练好的GPT-2模型的两个权重矩阵。
将字发送到第一个transformer模块意味着查找其embedding并将位置#1的位置编码向量相加。
堆栈之旅
现在第一个模块可以首先将token传递给self-attention层处理,然后将其传递给神经网络层来处理。一旦第一个transformer模块处理了该token,它就会将其结果向量发送到堆栈中,以便由下一个模块处理。每个模块中的过程是相同的,但每个模块在self-attention层和神经网络子层中都有自己的权重。
Self-Attention回顾
语言严重依赖于语境。例如,看看下面的机器人第二定律:
A robot must obey the orders given it by human beings except where such orders would conflict with the First Law.
我在句子中突出显示了三个地方,这三个单词都是指的是其他单词。如果不合并他们所指的上下文,就无法理解或处理这些单词。当模型处理这句话时,它必须能够知道:
It指的是机器人。
Such orders指的是前面所说的人类给予的命令。
The First Law是指前面完整的第一机器人定律。
这就是self-attention层的作用。它结合了模型对有关的和相关连的词的理解,在处理该词之前解释某个词的上下文,并将其传递给神经网络层。它通过为分段中每个单词的相关性分配分数,并将它们的向量表示相加来实现这一点。
作为一个例子,第一模块中的这个self-attention层在处理单词“it”时正在关注“a robot”。它将传递给它的神经网络的向量是三个单词中每一个向量乘以它们的分数之和。
Self-Attention处理层
Self-attention 是沿着段中每个token的路径来处理。重要的组成部分是三个向量:
查询向量(query):查询是当前单词的代表,用来去对其他所有词(使用他们的键向量)进行打分,我们只关心我们当前正在处理的token的查询。
键向量(key):键向量类似于段落中所有单词的标签,它们是我们搜索相关单词时所匹配的内容。
值向量(value):值向量是实际的单词表示,一旦我们得出每个单词的相关程度,这些加起来表示当前单词的值。
一个粗略的比喻就是把它想象成一个文件柜。查询向量就像是一个粘滞便笺,上面有您正在研究的主题。键向量就像机柜内文件夹的标签。当您将标签与便签匹配时,我们会取出该文件夹的内容,这些内容是值向量。但是您不仅要查找一个值,还要使用文件夹的混合值。
将查询向量乘以每个键向量会为每个文件夹生成一个得分(技术上:先进行点积运算然后再用softmax函数进行归一化处理)。
我们将每个值乘以其得分并相加——从而产生我们的self-attention结果。
这种加权的混合值向量产生了一个向量,它对robot这个词的“attention”为50%,对于单词a为30%,对 单词it为19%。在本文的后期,我们将更深入地研究self-attention。所以,让我们先继续沿着堆栈走向模型的输出。
模型输出
当模型中的第一模块产生其输出向量(self-attention的结果以及神经网络的结果)时,模型将该向量乘以embedding matrix。
回想一下,embedding matrix中的每一行都对应于模型词汇表中单词的embedding 。这种乘法的结果被解释为模型词汇表中每个单词的分数。
我们可以简单地选择得分最高的token(top_k = 1)。但如果模型也考虑了其他条件,则可以获得更好的结果。因此,更好的策略是使用分数作为选择该单词的概率,从整个列表中去抽样单词(因此具有较高分数的单词具有更高的被选择机会)。中间地带将top_k设置为40,并且让模型考虑具有最高分数的40个单词。
由此,模型完成了迭代,从而输出单个单词。模型继续迭代,直到生成整个上下文(1024个token)或直到生成序列结束token。
GPT-2模型小结
至此,关于GPT2的工作原理我就介绍完了。如果您想知道self-attention内部工作原理是什么,那么下文部分非常适合您。我创建它是为了引入更多的图形示例来描述self-attention,以便后来的transformer模型更易于检查和描述(比如:TransformerXL和XLNet)。
我想在这篇文章中提醒一些过于简化的内容:
在本文中“words”和“token”是可以互换使用的。但实际上,GPT2在词汇表中创建token是使用的字节对编码(Byte Pair Encoding)。这意味着token通常是words的一部分。
我们展示的示例在其推理/评估模式下运行GPT2。这就是为什么它一次只处理一个单词。在训练时,模型将针对较长的文本序列进行训练并一次处理多个tokens。此外,在训练时,模型将处理较大批量(512)并评估使用的批量大小。
我对向量进行了旋转或转置,以便更好地管理图像中的空间。在实施时,必须更精确。
Transformers使用大量的图层规范化,这非常重要。我们在“图解Transformer模型”一文中已经注意到其中的一些,在这篇文章中要更多地关注self-attentionin。
有时我需要显示更多的框来表示矢量,我指的是“放大”。如下图:
第二部分:图解self-attention(自我关注)模型
在前面的帖子当中,我们拿出这张图片来展示self-attention机制被应用在处理单词“it”的层中的示意:
在本节中,我们将详细介绍如何完成此操作。请注意我们将会以一种试图了解单个单词会发生什么的方式来看待它。这也是我们将会展示很多单个向量的原因。而实际的实现则是通过巨型矩阵的相乘来完成的。但是我想把重点放在对单词级别在这里会发生什么的直觉认识上。
Self-Attention(不加mask)
让我们首先看一下在自编码模块中计算出的初始的self-attention。我们使用一次只能同时处理四个tokens的简易的transformer模块。
Self-attention被应用在下面三个主要的步骤中:
- 为每个路径创建query(查询向量), Key(键向量),和 Value vectors(值向量)。
- 对于每个输入token,使用其query(查询向量)对所有其他Key(键向量)进行评分。
- 将值向量乘以他们的相关分数后进行求和。
1.创建query(查询向量), key(键向量),和 value vector(值向量)
我们来看第一条路径。我们将取出它的query(查询向量)然后和所有的Key(键向量)进行比较。每个Key(键向量)会产生一个分数。自注意力机制的第一步就是为每一个token路径分别计算三个向量(我们先暂时忽略attention heads):
2.打分
现在我们得到了一些向量,在第二步中我们只使用query(查询向量)和 Value vectors(值向量)。我们不妨先看第一个token,我们将它的query(查询向量)和所有其他的key(键向量)相乘来得到四个tokens中每个token的分数。
3.求和
我们现在可以将分数和value vector(值向量)相乘。在我们将其相加求和后,对应高分的value vector(值向量)将占所得向量的大部分。
分数越低,我们看到的value vector(值向量)就越透明。这是为了表明乘以一个小数会稀释vector的值。
如果我们对每条路径都做同样的操作,我们最终会得到一个向量来表示包含了适当的上下文的token。将它们传给transformer模块的下一个子层(前馈神经网络):
图解Masked Self-Attention
现在我们已经知道了transformer内部的self-attention机制的步骤,下面我们继续来看masked self-attention机制。Masked self-attention机制和self-attention机制除了步骤2之外基本相同。假设这个模型只有两个token作为输入,我们来观察第二个token。在这种情况下,后两个tokens被掩蔽了。因此该模型干涉了评分的步骤。它基本上总是将未来的token记为0,因此这个模型不会在未来的单词上达到峰值。
这种掩蔽通常用attention mask矩阵来实现考虑一个由四个单词组成的序列(例如“robot must obey orders”)。在语言的场景建模中,这个序列被分为四步,每步一个单词(假设现在每个单词都是一个token)。由于这些模型分批工作,我们可以假设一个批的规模是4,这些简易模型将整个序列(包含四个步骤)作为一个批处理。
在矩阵形式中,我们将一个query(查询向量)矩阵和一个key(键向量)矩阵相乘来计算分数。我们下面来将其可视化,除单词外,还有与该单元格中该单词相关联的query(查询向量)(或key(键向量)):
在做乘法之后,我们将其转化为三角矩阵。将我们想要掩蔽的单元格设置成副无穷大或一个一个非常大的负数(例如在GPT2中我们设置成-1亿):
然后,对每一行使用softmax生成我们在self-attention机制中实际上使用的分数:
这个分数表的意思如下所述:
当模型处理数据集中的第一个实例时(图中的第一行),这里只包含一个单词(“robot”),100%的注意力都将集中在这个词上。
当模型处理数据集中的第二个实例时(图中的第二行),这里包含了(“robot must”),当模型处理单词“must”时,48%的注意力将集中在“robot”上,而另外52%的注意力将会集中在“must”上。
依次类推
GPT-2 Masked Self-Attention
让我们来详细了解一下GPT-2’s masked attention的更多细节。
评估时间:一次只处理一个token
我们可以让GPT-2机制完全像masked self-attention机制一样来运作。但在整个评估过程中,当我们的模型在每次迭代后只添加一个新单词的时候,沿着早期路径重新计算已经处理过的self-attention的token是效率极低的。
在这种情况下,我们处理第一个token(暂时忽略
)。GPT-2保留a的key(键向量)和value vector(值向量)。每一个self-attention层都保留这个token的相应的key(键向量)和value vector(值向量):
现在在下一次迭代中,当我们的模型处理单词robot时,它不需要再为token a 生成query(查询向量), key(键向量), 和 value(值向量)查询。它只需要复用它在第一次迭代中保存的那些:
我们假设模型正在处理单词it。如果我们讨论底层模块,那么它对该token的输入将是it的embedding加上插槽9处的位置encoding:
Transformer中的每一个模块都有它的权重(稍后在帖子中细分)。我们第一个遇到的就是我们用于创建queries(查询向量), key(键向量), 和 value vector(值向量)的权重矩阵。
Self-attention将它的输入和它的权重矩阵相乘(并且加一个偏置向量,这里不做说明)。
乘法计算产生的vector基本上是单词it的query(查询向量),key(键向量), 和 value vector(值向量)共同得到的结果。
Attention权重vector和输入vector相乘(并且在后面加上一个偏置向量)得到这个token的key(键向量), value vector(值向量), 和 query(查询向量)。
在前面的例子当中,我们直接进入self-attention而忽略了“multi-head”部分。现在对这部分概念有所了解将是大有用处的。Self attention机制在Q,K,V vectors的不同部分多次进行。“分裂” attention heads只是简单的将长向量重塑成为一个矩阵。小型的GPT2有12个attention heads,因此那将成为重塑后矩阵的第一维:
在前面的例子中,我们已经看到一个attention head中会发生什么。一个考虑多个attention-heads 的方法是像这样的(如果我们只想像12个attention heads中的3个):
我们现在可以着手进行评分,在已知我们只关注一个attention head的情况下(并且其他所有的都进行类似的操作):
现在,token可以针对其他所有token进行评分(在先前迭代的attention head #1中计算的):
正如我们之前所看到的,我们现在将每个value乘以其得分,然后把它们加起来,产生的就是attention-head #1的self-attention结果。
我们处理各种attention heads的方式是我们首先将它们连接成一个vector:
但是这个vector尚未准备好发送到下一个子层。我们需要首先将这个隐藏状态的弗兰肯斯坦怪物(人造的)变成一个同质的表示。
我们将让模型学习如何最好地将连接的self-attention结果映射到前馈神经网络可以处理的向量中。这是我们的第二个大权重矩阵,它将attention heads的结果映射到self-attention子层的输出向量中:
有了这个,我们就可以生成可以发送到下一层的向量。
全连接神经网络是该模块在self-attention在其表示中已经包含了适当的上下文后处理它的输入token的地方。它由两层组成。第一层是模型大小的4倍(当小型GPT2的规模为768,这个网络将有768*4=3072个单元)。为什么有四倍呢?这只是初始transformer运行的大小(模型维度是512,该模型的第一层是2048).这似乎为transformer模型提供了足够的表示能力来处理迄今为止面临的任务。
第二层将第一层的结果投影回模型维度(小型GPT2为768)。这个乘法的结果是这个token的transformer模块的结果。
你做到了!
这是我们将要进入的transformer模块的最详细的版本!你现在几乎拥有一个transformer语言模型内部发生的绝大部分图片。回顾一下,我们勇敢的输入向量遇到了这些权重矩阵:
每一个模块都有它自己的一组权重。另一方面,这个模型只有一个token embedding矩阵和一个位置encoding矩阵:
如果你想看看模型的全部参数,现在我把它们都罗列出来:
由于某些原因,它们总共增加了127M个参数而不是117M个。我不确定这是为什么,但是这是在发布的代码中它们看起来的数量(如果我错了,请联系我纠正)。
第三部分:语言建模番外
decoder-only transformer在语言模型之外不断获得超越。这里有很多成功的应用,可以通过类似视觉的效果来进行描述。让我们来看一些这里成功的应用结束这篇文章。
机器翻译
Encoder不需要进行翻译。同样的任务可以用decoder-only transformer来解决。
生成摘要
这是第一个decoder-only transformer被训练的来解决的任务。也即是说,它被训练来读维基百科的文章(去掉在目录之前的开头部分),然后生成摘要。文章的实际开头部分被用作训练集的标签。
本文针对维基百科的文章对模型进行了训练,因此训练后的模型可以用来生成文章的摘要。
迁移学习
在使用单个预训练transformer的样本高效文本摘要中,首先使用 decoder-only transformer对语言模型进行预训练,然后进行微调来生成摘要。事实证明,在有限的数据设置下,它比预训练的encoder-decoder transformer获得了更好的效果。
GPT2论文还显示了在对语言建模进行预训练之后的摘要结果。
音乐生成
音乐transformer使用decoder-only transformer来生成具有表现力和动态的音乐。“音乐模型”就像语言模型一样,就是让模型以无监督的方式来学习音乐,然后让它输出样本(我们此前称之为“漫游”)。
你可能会对在这种情况下如何表示音乐感到好奇。记着,语言模型可以通过将作为单词部分的字符或单词或token转化为向量表示来完成。通过音乐表演(让我们暂时先考虑钢琴),我们必须表示音符,但同时还要表示速度——衡量钢琴键按下的力度。
一首曲子只是这一系列one-hot vectors的载体。一个midi文件可以转换成为这种格式。本文有以下示例输入序列:
用one-hot vector表示这些输入序列可以看做下面这样:
我喜欢文章中的可视化,展示了音乐Transformer中的self-attention。我在这里添加了一些注释:
这件作品有一个重复出现的三角形轮廓。这个区域出现在后面的一个高峰,它关注的是之前所有高峰的高音,一直到乐曲的开头。图中显示了一个查询(所有注意线的来源)和正在处理的以前的记忆(接收到更多softmax probabiliy的注释被突出显示)。注意线的颜色对应不同的头部,宽度对应softmax概率的权重。
如果你不清楚这种音符表示,请查看这个视频。
视频链接:
https://www.youtube.com/watch?v=ipzR9bhei_o
结论
这就结束了我们的GPT2以及对其父模型decoder-only transformer的探索之旅。我希望你能够更好的理解self-attention,你越是深入transformer越能更好的理解这一机制。
一些资源:
来自OpenAI的GPT2 Implementation:
https://github.com/openai/gpt-2
pytorch-transformers library:
https://github.com/huggingface/pytorch-transformers
原文链接:
https://jalammar.github.io/illustrated-gpt2/
-
transformer预测过程_图解OpenAI的秘密武器GPT2:可视化Transformer语言模型
2020-12-19 06:32:04其中OpenAI训练的GPT-2模型就展示出了惊艳的能力,它能够撰写出连贯而富有激情的论文,比当下其他所有的语言模型写的都好。GPT-2其实并不是一种特别新颖的架构,它的架构非常类似于Transformer模型的Decoder结构。...大数据文摘出品
来源:github
编译:小七、池俊辉、Andy
今年,我们见识了许多令人眼花缭乱的机器学习的应用成果。其中OpenAI训练的GPT-2模型就展示出了惊艳的能力,它能够撰写出连贯而富有激情的论文,比当下其他所有的语言模型写的都好。
GPT-2其实并不是一种特别新颖的架构,它的架构非常类似于Transformer模型的Decoder结构。然而,GPT2是一个非常大的基于Transformer的语言模型,需要基于大量数据集进行训练。在这篇文章中,我们将介绍什么样的结构能够让模型产生好的结果,深入研究模型中的self-attention层,此外,我们将研究除语言建模之外的Transformer模型Decoder结构的应用。
我写本文主要是为了补充我之前的“图解Transformer模型”系列。
系列链接:
https://jalammar.github.io/illustrated-transformer/通过图解的方式更直观地解释Transformer模型的内部工作原理,以及它们自发布以来的演变过程。我希望通过这种图形示例能够更容易地解释后来基于Transformer的模型,毕竟它们的内部工作原理是在不断发展的。
本文主要从以下几方面展开阐述
第一部分:GPT2和语言建模
语言模型的含义
用于语言建模的Transformers模型
与BERT的区别
Transformer 架构的演变
速成课程:探索GPT-2内部工作原理
深入了解内幕
GPT-2小结
第二部分:图解Self-Attention(自我关注)模型
自注意力(Self-Attention,不加mask)
创建查询向量、键向量和值向量
打分
求和
图解Masked Self-Attention
GPT-2的Masked Self-Attention
你做到了!
第三部分:语言建模番外
机器翻译
生成摘要
迁移学习
音乐生成
结论
第一部分 GPT2和语言模型
那么究竟什么是语言模型呢?
语言模型的含义
在The Illustrated Word2vec中,我们研究了语言模型是什么,它是能根据一个句子前半部分的单词预测出下一个单词的机器学习模型。最著名的语言模型是智能手机键盘,可以根据您当前键入的内容建议出下一个单词。
The Illustrated Word2vec:
https://jalammar.github.io/illustrated-word2vec/从这个意义上讲,我们可以说GPT-2基本上是键盘应用程序的下一个单词预测功能,但它比你手机上的键盘输入法具有更大更复杂的功能。GPT-2是基于一个名为WebText大型数据集进行的训练,这个数据集大约有40G,是OpenAI研究人员为了研究从互联网上爬下来的。就存储大小来说,我使用的键盘应用程序SwiftKey占用了78MB的空间。训练出来的GPT-2的最小变体,占用500MB的存储空间来存储其所有参数。GPT-2的最大变体是最小变体的13倍,因此它可能需要占用超过6.5 GB的存储空间。
使用AllenAI GPT-2 Explorer来进行GPT-2建模是一个很好的方法,它使用GPT-2显示10个对下一个单词的预测结果,以及它们的概率分数。您可以选择其中一个单词,然后再查看下一个预测列表,循序渐进,持续不断地写下去。
用于语言建模的Transformers模型
正如我们在“图解Transformer模型”中看到的那样,原始的 transformer模型由encoder和decoder组成,每个都是我们称之为 transformer 架构的堆栈。这种架构是合理的,因为该模型解决了机器翻译问题——过去encoder-decoder结构解决的问题。
在随后的许多研究工作中,这种架构要么去掉了encoder,要么去掉了decoder,只使用其中一种transformer堆栈,并尽可能高地堆叠它们,为它们提供大量的训练文本,并投入大量的计算机设备,以训练其中一部分语言模型,这一研究需要花费数十万美元,就像在研究AlphaStar时也投入了数百万美元的资金。
那么我们可以将这些块堆叠多高呢?事实证明,堆叠的高度是不同的GPT2模型之间大小有别的主要影响因素之一。
与BERT的区别
GPT-2是基于 transformer模型的decoder架构构建的。而BERT则是基于 transformer模型的encoder结构构建的。我们将在以下部分中研究两者的差异。两者之间的一个关键区别是,GPT2与传统语言模型一样,一次输出一个token。接下来让我们来举例说明,经过训练的GPT-2是如何背诵机器人第一定律(First Law of Robotics)的。
这些模型实际工作的方式是在生成每个token之后,添加到输入序列中,而新序列将成为下一步模型的输入。这就是“自回归(auto-regression)”的思想。但这种想法也使得RNN的效率大打折扣。
GPT2以及一些后来的模型如TransformerXL和XLNet本质上都是自回归的。而BERT不是,它是一种权衡。在失去自回归的过程中,BERT可以获得两边的单词,以结合上下文去获得更好的结果。而XLNet既使用了自回归,同时也找到了根据两边单词融合上下文的替代方法。
Transformer架构的演变
一个是encoder结构,如下图所示:
来自原始 transformer论文的encoder模块可以输入直到某个最大序列长度(例如512个token)。如果输入序列短于此限制,我们可以填充序列的其余部分。
另一个是decoder结构,这个结构与encoder具有较小的体系结构差异——多了一层用于关注encoder中的特定片段:
self-attention层的一个关键区别在于它隐藏了未来的tokens,而不是像BERT那样,将单词更改为[mask(掩码)],而是通过干扰阻止了从正在计算的位置右侧的tokens中得到的信息进入到self-attention层计算。
例如,如果我们要强调位置#4的路径,我们可以看到它只允许参与当前和之前的tokens:
重要的是,BERT使用的self-attention和GPT-2使用的masked self-attention之间的区别是明确的。正常的self-attention允许在其右侧的tokens达到峰值。而Masked self-attention可防止这种情况发生:
然后是只包含decoder的架构,在发表论文“通过总结长序列来生成Wikipedia”后,提出了另一种能够进行语言建模的transformer结构。这个架构不再使用Transformer的encoder结构。因此,我们将模型称为“Transformer-Decoder”。这种早期基于transformer的语言模型由六个decoder结构组成:
论文链接:
https://arxiv.org/pdf/1801.10198.pdfDecoder结构是相同的。我扩展了第一个,所以你可以看到它的self-attention层是掩码变体。请注意,该模型现在可以在某个段中处理多达4,000个tokens——原来的 transformer只能处理512个,该模型有了较大提升。
这些结构与原始decoder结构非常相似,只是它们消除了第二个self-attention层。在“具有更深的Self-Attention的角色级语言建模”(https://arxiv.org/pdf/1808.04444.pdf)一文中实验了类似的体系结构,以创建一次预测一个字母/字符的语言模型。
OpenAI GPT-2模型使用的就是只有decoder结构的transformer模型。
速成课程:探索GPT-2内部工作原理
看看里面,你会发现,这些话正在我的脑海深处割裂。电闪雷鸣,锋利的言语正在将我逼向疯狂的边缘。
让我们来研究一个已经训练好的GPT-2,看看它是如何工作的。
GPT-2可以处理1024个tokens。每个token沿其自己的路径经过所有的decoder结构。
运行经过训练的GPT-2的最简单方法是允许它自己进行漫游(技术上称为生成无条件样本),或者我们可以给它提示让它生成关于某个主题的文本(也就是生成交互式条件样本)。在不设条件的情况下,我们可以简单地给它设置一个开始token,并让它开始生成单词(训练模型使用作为其开始token,称之为
)。该模型只有一个输入token,因此该路径将是唯一的活动路径。token通过所有层依次处理,然后沿该路径生成向量。该向量可以根据模型的词汇量进行评分(模型知道的所有单词,GPT-2中的单词为50,000个)。在这种情况下,我们选择了概率最高的token——“the”。但是我们也可能把事情搞混,因为有时你连续点击键盘应用程序中建议的第一个单词,它有时会卡在重复的循环中,唯一的出路就是你点击第二个或第三个建议的单词。这里就可能发生这种情况。GPT-2有一个名为top-k的参数,我们可以使用该参数让模型考虑除第一个字之外的采样(当top-k = 1时就是这种情况)。
在下一步中,我们将第一步的输出添加到输入序列,并让模型进行下一个预测:
请注意,第二条路径是此计算中唯一有效的路径。GPT-2的每一层都保留了自己对第一个token的解释,并将在处理第二个token时使用它(我们将在下一节中详细介绍有关self-attention的内容)。GPT-2不会根据第二个token重新解释第一个token。
深入了解内幕
输入编码
接下来看一下更多细节,以便更清楚地了解模型。让我们从输入开始。正如我们之前讨论过的其他NLP模型一样,模型在其embedding matrix(嵌入矩阵)中查找输入单词的embedding,embedding matrix是我们训练模型获得的结果之一。
每一行都是一个word embedding(单词嵌入):一个数字列表代表一个单词,并捕获它的一些含义。在不同的GPT2模型大小中该列表的大小是不同的。最小的模型使用每个字或每个token的embedding大小为768。
所以在开始时,我们会在embedding matrix中查找起始token
的嵌入。在将其交给模型中的第一个模块之前,我们需要结合位置编码,位置编码是一个指示序列中的字到transformer模块中顺序的信号。经过训练的模型包含一个矩阵,其中包含输入中1024个位置中每个位置的位置编码向量。在此基础上,我们已经介绍了在传递给第一个 transformer模块之前如何处理输入单词。我们还知道构成训练好的GPT-2模型的两个权重矩阵。
将字发送到第一个transformer模块意味着查找其embedding并将位置#1的位置编码向量相加。
堆栈之旅
现在第一个模块可以首先将token传递给self-attention层处理,然后将其传递给神经网络层来处理。一旦第一个transformer模块处理了该token,它就会将其结果向量发送到堆栈中,以便由下一个模块处理。每个模块中的过程是相同的,但每个模块在self-attention层和神经网络子层中都有自己的权重。
Self-Attention回顾
语言严重依赖于语境。例如,看看下面的机器人第二定律:
A robot must obey the orders given it by human beings except where such orders would conflict with the First Law.
我在句子中突出显示了三个地方,这三个单词都是指的是其他单词。如果不合并他们所指的上下文,就无法理解或处理这些单词。当模型处理这句话时,它必须能够知道:
It指的是机器人。
Such orders指的是前面所说的人类给予的命令。
The First Law是指前面完整的第一机器人定律。
这就是self-attention层的作用。它结合了模型对有关的和相关连的词的理解,在处理该词之前解释某个词的上下文,并将其传递给神经网络层。它通过为分段中每个单词的相关性分配分数,并将它们的向量表示相加来实现这一点。
作为一个例子,第一模块中的这个self-attention层在处理单词“it”时正在关注“a robot”。它将传递给它的神经网络的向量是三个单词中每一个向量乘以它们的分数之和。
Self-Attention处理层
Self-attention 是沿着段中每个token的路径来处理。重要的组成部分是三个向量:
查询向量(query):查询是当前单词的代表,用来去对其他所有词(使用他们的键向量)进行打分,我们只关心我们当前正在处理的token的查询。
键向量(key):键向量类似于段落中所有单词的标签,它们是我们搜索相关单词时所匹配的内容。
值向量(value):值向量是实际的单词表示,一旦我们得出每个单词的相关程度,这些加起来表示当前单词的值。
一个粗略的比喻就是把它想象成一个文件柜。查询向量就像是一个粘滞便笺,上面有您正在研究的主题。键向量就像机柜内文件夹的标签。当您将标签与便签匹配时,我们会取出该文件夹的内容,这些内容是值向量。但是您不仅要查找一个值,还要使用文件夹的混合值。
将查询向量乘以每个键向量会为每个文件夹生成一个得分(技术上:先进行点积运算然后再用softmax函数进行归一化处理)。
我们将每个值乘以其得分并相加——从而产生我们的self-attention结果。
这种加权的混合值向量产生了一个向量,它对robot这个词的“attention”为50%,对于单词a为30%,对 单词it为19%。在本文的后期,我们将更深入地研究self-attention。所以,让我们先继续沿着堆栈走向模型的输出。
模型输出
当模型中的第一模块产生其输出向量(self-attention的结果以及神经网络的结果)时,模型将该向量乘以embedding matrix。
回想一下,embedding matrix中的每一行都对应于模型词汇表中单词的embedding 。这种乘法的结果被解释为模型词汇表中每个单词的分数。
我们可以简单地选择得分最高的token(top_k = 1)。但如果模型也考虑了其他条件,则可以获得更好的结果。因此,更好的策略是使用分数作为选择该单词的概率,从整个列表中去抽样单词(因此具有较高分数的单词具有更高的被选择机会)。中间地带将top_k设置为40,并且让模型考虑具有最高分数的40个单词。
由此,模型完成了迭代,从而输出单个单词。模型继续迭代,直到生成整个上下文(1024个token)或直到生成序列结束token。
GPT-2模型小结
至此,关于GPT2的工作原理我就介绍完了。如果您想知道self-attention内部工作原理是什么,那么下文部分非常适合您。我创建它是为了引入更多的图形示例来描述self-attention,以便后来的transformer模型更易于检查和描述(比如:TransformerXL和XLNet)。
我想在这篇文章中提醒一些过于简化的内容:
在本文中“words”和“token”是可以互换使用的。但实际上,GPT2在词汇表中创建token是使用的字节对编码(Byte Pair Encoding)。这意味着token通常是words的一部分。
我们展示的示例在其推理/评估模式下运行GPT2。这就是为什么它一次只处理一个单词。在训练时,模型将针对较长的文本序列进行训练并一次处理多个tokens。此外,在训练时,模型将处理较大批量(512)并评估使用的批量大小。
我对向量进行了旋转或转置,以便更好地管理图像中的空间。在实施时,必须更精确。
Transformers使用大量的图层规范化,这非常重要。我们在“图解Transformer模型”一文中已经注意到其中的一些,在这篇文章中要更多地关注self-attentionin。
有时我需要显示更多的框来表示矢量,我指的是“放大”。如下图:
第二部分:图解self-attention(自我关注)模型
在前面的帖子当中,我们拿出这张图片来展示self-attention机制被应用在处理单词“it”的层中的示意:
在本节中,我们将详细介绍如何完成此操作。请注意我们将会以一种试图了解单个单词会发生什么的方式来看待它。这也是我们将会展示很多单个向量的原因。而实际的实现则是通过巨型矩阵的相乘来完成的。但是我想把重点放在对单词级别在这里会发生什么的直觉认识上。
Self-Attention(不加mask)
让我们首先看一下在自编码模块中计算出的初始的self-attention。我们使用一次只能同时处理四个tokens的简易的transformer模块。
Self-attention被应用在下面三个主要的步骤中:
- 为每个路径创建query(查询向量), Key(键向量),和 Value vectors(值向量)。
- 对于每个输入token,使用其query(查询向量)对所有其他Key(键向量)进行评分。
- 将值向量乘以他们的相关分数后进行求和。
1.创建query(查询向量), key(键向量),和 value vector(值向量)我们来看第一条路径。我们将取出它的query(查询向量)然后和所有的Key(键向量)进行比较。每个Key(键向量)会产生一个分数。自注意力机制的第一步就是为每一个token路径分别计算三个向量(我们先暂时忽略attention heads):
2.打分现在我们得到了一些向量,在第二步中我们只使用query(查询向量)和 Value vectors(值向量)。我们不妨先看第一个token,我们将它的query(查询向量)和所有其他的key(键向量)相乘来得到四个tokens中每个token的分数。
3.求和我们现在可以将分数和value vector(值向量)相乘。在我们将其相加求和后,对应高分的value vector(值向量)将占所得向量的大部分。
分数越低,我们看到的value vector(值向量)就越透明。这是为了表明乘以一个小数会稀释vector的值。如果我们对每条路径都做同样的操作,我们最终会得到一个向量来表示包含了适当的上下文的token。将它们传给transformer模块的下一个子层(前馈神经网络):
图解Masked Self-Attention
现在我们已经知道了transformer内部的self-attention机制的步骤,下面我们继续来看masked self-attention机制。Masked self-attention机制和self-attention机制除了步骤2之外基本相同。假设这个模型只有两个token作为输入,我们来观察第二个token。在这种情况下,后两个tokens被掩蔽了。因此该模型干涉了评分的步骤。它基本上总是将未来的token记为0,因此这个模型不会在未来的单词上达到峰值。这种掩蔽通常用attention mask矩阵来实现考虑一个由四个单词组成的序列(例如“robot must obey orders”)。在语言的场景建模中,这个序列被分为四步,每步一个单词(假设现在每个单词都是一个token)。由于这些模型分批工作,我们可以假设一个批的规模是4,这些简易模型将整个序列(包含四个步骤)作为一个批处理。
在矩阵形式中,我们将一个query(查询向量)矩阵和一个key(键向量)矩阵相乘来计算分数。我们下面来将其可视化,除单词外,还有与该单元格中该单词相关联的query(查询向量)(或key(键向量)):
在做乘法之后,我们将其转化为三角矩阵。将我们想要掩蔽的单元格设置成副无穷大或一个一个非常大的负数(例如在GPT2中我们设置成-1亿):
然后,对每一行使用softmax生成我们在self-attention机制中实际上使用的分数:
这个分数表的意思如下所述:当模型处理数据集中的第一个实例时(图中的第一行),这里只包含一个单词(“robot”),100%的注意力都将集中在这个词上。当模型处理数据集中的第二个实例时(图中的第二行),这里包含了(“robot must”),当模型处理单词“must”时,48%的注意力将集中在“robot”上,而另外52%的注意力将会集中在“must”上。依次类推
GPT-2 Masked Self-Attention
让我们来详细了解一下GPT-2’s masked attention的更多细节。评估时间:一次只处理一个token我们可以让GPT-2机制完全像masked self-attention机制一样来运作。但在整个评估过程中,当我们的模型在每次迭代后只添加一个新单词的时候,沿着早期路径重新计算已经处理过的self-attention的token是效率极低的。在这种情况下,我们处理第一个token(暂时忽略)。GPT-2保留a的key(键向量)和value vector(值向量)。每一个self-attention层都保留这个token的相应的key(键向量)和value vector(值向量):
现在在下一次迭代中,当我们的模型处理单词robot时,它不需要再为token a 生成query(查询向量), key(键向量), 和 value(值向量)查询。它只需要复用它在第一次迭代中保存的那些:
我们假设模型正在处理单词it。如果我们讨论底层模块,那么它对该token的输入将是it的embedding加上插槽9处的位置encoding:
Transformer中的每一个模块都有它的权重(稍后在帖子中细分)。我们第一个遇到的就是我们用于创建queries(查询向量), key(键向量), 和 value vector(值向量)的权重矩阵。
Self-attention将它的输入和它的权重矩阵相乘(并且加一个偏置向量,这里不做说明)。乘法计算产生的vector基本上是单词it的query(查询向量),key(键向量), 和 value vector(值向量)共同得到的结果。
Attention权重vector和输入vector相乘(并且在后面加上一个偏置向量)得到这个token的key(键向量), value vector(值向量), 和 query(查询向量)。在前面的例子当中,我们直接进入self-attention而忽略了“multi-head”部分。现在对这部分概念有所了解将是大有用处的。Self attention机制在Q,K,V vectors的不同部分多次进行。“分裂” attention heads只是简单的将长向量重塑成为一个矩阵。小型的GPT2有12个attention heads,因此那将成为重塑后矩阵的第一维:
在前面的例子中,我们已经看到一个attention head中会发生什么。一个考虑多个attention-heads 的方法是像这样的(如果我们只想像12个attention heads中的3个):
我们现在可以着手进行评分,在已知我们只关注一个attention head的情况下(并且其他所有的都进行类似的操作):
现在,token可以针对其他所有token进行评分(在先前迭代的attention head #1中计算的):
正如我们之前所看到的,我们现在将每个value乘以其得分,然后把它们加起来,产生的就是attention-head #1的self-attention结果。
我们处理各种attention heads的方式是我们首先将它们连接成一个vector:
但是这个vector尚未准备好发送到下一个子层。我们需要首先将这个隐藏状态的弗兰肯斯坦怪物(人造的)变成一个同质的表示。我们将让模型学习如何最好地将连接的self-attention结果映射到前馈神经网络可以处理的向量中。这是我们的第二个大权重矩阵,它将attention heads的结果映射到self-attention子层的输出向量中:
有了这个,我们就可以生成可以发送到下一层的向量。
全连接神经网络是该模块在self-attention在其表示中已经包含了适当的上下文后处理它的输入token的地方。它由两层组成。第一层是模型大小的4倍(当小型GPT2的规模为768,这个网络将有768*4=3072个单元)。为什么有四倍呢?这只是初始transformer运行的大小(模型维度是512,该模型的第一层是2048).这似乎为transformer模型提供了足够的表示能力来处理迄今为止面临的任务。
第二层将第一层的结果投影回模型维度(小型GPT2为768)。这个乘法的结果是这个token的transformer模块的结果。
你做到了!
这是我们将要进入的transformer模块的最详细的版本!你现在几乎拥有一个transformer语言模型内部发生的绝大部分图片。回顾一下,我们勇敢的输入向量遇到了这些权重矩阵:每一个模块都有它自己的一组权重。另一方面,这个模型只有一个token embedding矩阵和一个位置encoding矩阵:
如果你想看看模型的全部参数,现在我把它们都罗列出来:
由于某些原因,它们总共增加了127M个参数而不是117M个。我不确定这是为什么,但是这是在发布的代码中它们看起来的数量(如果我错了,请联系我纠正)。
第三部分:语言建模番外
decoder-only transformer在语言模型之外不断获得超越。这里有很多成功的应用,可以通过类似视觉的效果来进行描述。让我们来看一些这里成功的应用结束这篇文章。机器翻译
Encoder不需要进行翻译。同样的任务可以用decoder-only transformer来解决。生成摘要
这是第一个decoder-only transformer被训练的来解决的任务。也即是说,它被训练来读维基百科的文章(去掉在目录之前的开头部分),然后生成摘要。文章的实际开头部分被用作训练集的标签。本文针对维基百科的文章对模型进行了训练,因此训练后的模型可以用来生成文章的摘要。
迁移学习
在使用单个预训练transformer的样本高效文本摘要中,首先使用 decoder-only transformer对语言模型进行预训练,然后进行微调来生成摘要。事实证明,在有限的数据设置下,它比预训练的encoder-decoder transformer获得了更好的效果。GPT2论文还显示了在对语言建模进行预训练之后的摘要结果。音乐生成
音乐transformer使用decoder-only transformer来生成具有表现力和动态的音乐。“音乐模型”就像语言模型一样,就是让模型以无监督的方式来学习音乐,然后让它输出样本(我们此前称之为“漫游”)。你可能会对在这种情况下如何表示音乐感到好奇。记着,语言模型可以通过将作为单词部分的字符或单词或token转化为向量表示来完成。通过音乐表演(让我们暂时先考虑钢琴),我们必须表示音符,但同时还要表示速度——衡量钢琴键按下的力度。一首曲子只是这一系列one-hot vectors的载体。一个midi文件可以转换成为这种格式。本文有以下示例输入序列:
用one-hot vector表示这些输入序列可以看做下面这样:
我喜欢文章中的可视化,展示了音乐Transformer中的self-attention。我在这里添加了一些注释:
这件作品有一个重复出现的三角形轮廓。这个区域出现在后面的一个高峰,它关注的是之前所有高峰的高音,一直到乐曲的开头。图中显示了一个查询(所有注意线的来源)和正在处理的以前的记忆(接收到更多softmax probabiliy的注释被突出显示)。注意线的颜色对应不同的头部,宽度对应softmax概率的权重。
如果你不清楚这种音符表示,请查看这个视频。视频链接:https://www.youtube.com/watch?v=ipzR9bhei_o
结论
这就结束了我们的GPT2以及对其父模型decoder-only transformer的探索之旅。我希望你能够更好的理解self-attention,你越是深入transformer越能更好的理解这一机制。一些资源:来自OpenAI的GPT2 Implementation:https://github.com/openai/gpt-2
pytorch-transformers library:https://github.com/huggingface/pytorch-transformers
原文链接:https://jalammar.github.io/illustrated-gpt2/
实习/全职编辑记者招聘ing
加入我们,亲身体验一家专业科技媒体采写的每个细节,在最有前景的行业,和一群遍布全球最优秀的人一起成长。坐标北京·清华东门,在大数据文摘主页对话页回复“招聘”了解详情。简历请直接发送至zz@bigdatadigest.cn
志愿者介绍
后台回复“志愿者”加入我们
点「在看」的人都变好看了 -
图解Transformer
2021-01-27 12:45:57Transformer在Goole的一篇论文被提出...这里,我想用一些方便理解的方式来一步一步解释Transformer的训练过程,这样即便你没有很深的深度学习知识你也能大概明白其中的原理。 我们先把Transformer想象成一个黑匣子,在 -
中文Transformer(BERT,GPT,T5等)预训练模型权重
2021-04-06 16:09:23中文Transformer预训练模型权重 ...我们在huggingface上开源的所有权重,均是使用公开的语料进行训练的,并且我们在huggingface模型权重的readme中给出了详细的训练过程的说明,用户如果有足够的算力可中文Transformer预训练模型权重
最近业余时间把我们去年和今年之前训练的基于开源语料的预训练权重适配到了Huggingface model hub中。用户可以通过Huggingface Transformers项目代码或者Huggingface网站上提供的在线推理接口轻易的使用这些权重。
这些权重有如下特点:
- 可复现;我们在huggingface上开源的所有权重,均是使用公开的语料进行训练的,并且我们在huggingface模型权重的readme中给出了详细的训练过程的说明,用户如果有足够的算力可以轻易的复现。我们认为这些权重可以作为一个可靠的中文基准。
- 模型质量较好;我们通过定量和定性的方式对这些预训练权重进行了评估。这些预训练权重有着比较有竞争力的表现。
- 类型丰富;我们提供了各种类型的预训练权重,后面会具体介绍。
- 所有的权重均使用 UER-py 预训练得到,然后通过转换脚本进行转换,用Huggingface Transformers进行加载推理。这套流程在我们的实践中用起来比较可靠和舒服。当然UER项目内部也提供了比较完善的微调推理相关的脚本,欢迎大家使用。
这里对我们目前开源的权重进行简要的描述:
1 我们借鉴Google在英文上的工作,预训练24个不同大小的RoBERTa权重:https://huggingface.co/uer/chinese_roberta_L-2_H-128
Tiny,Mini,Small,Medium,Base模型在六个常用的分类数据集上的效果:
2 目前主流的中文预训练模型是基于字的。但是我们发现相同条件下,基于词的预训练模型往往有着更好的表现。其他工作,例如WoBERT也有类似的结论。并且基于词的模型由于有着比较短的sequence length,速度会更快一些。这里我们发布了5个大小不同的基于词的RoBERTa预训练模型:
https://huggingface.co/uer/roberta-tiny-word-chinese-cluecorpussmall并对基于词和基于字的预训练模型进行了系统的比较。下面是基于词的Tiny,Mini,Small,Medium,Base模型在六个常用的分类数据集上的效果(和基于字的模型进行对比):
可以看到基于词的模型相对于基于字的模型,在效果上有一定的优势。再考虑到推理速度,在实际场景中我们更推荐使用基于词的模型。
3 通用语料GPT-2权重。我们利用CLUECorpusSmall语料训练了两个尺寸的GPT-2权重:
https://huggingface.co/uer/gpt2-chinese-cluecorpussmall
https://huggingface.co/uer/gpt2-distil-chinese-cluecorpussmall4 古诗GPT-2权重:
https://huggingface.co/uer/gpt2-chinese-poem
5 对联GPT-2权重:
https://huggingface.co/uer/gpt2-chinese-couplet
6 古文GPT-2权重:
https://huggingface.co/uer/gpt2-chinese-ancient7 歌词GPT-2权重:
https://huggingface.co/uer/gpt2-chinese-lyric8 利用三个经典阅读理解数据集训练的中文阅读理解权重:
https://huggingface.co/uer/roberta-base-chinese-extractive-qa
9 利用五个大规模分类数据集训练的中文分类权重。其中三个是情感分析数据集,两个是新闻主题分类数据集:
https://huggingface.co/uer/roberta-base-finetuned-jd-full-chinese
基于JD full情感分析的微调模型在线推理接口示例:
基于Ifeng新闻主题分类的微调模型在线推理接口示例:
10 基于CLUECorpusSmall语料的T5预训练权重:
https://huggingface.co/uer/t5-small-chinese-cluecorpussmall
11 基于CLUECorpusSmall语料的T5-v1_1预训练权重:
https://huggingface.co/uer/t5-v1_1-small-chinese-cluecorpussmall
后续我们还会基于开头提到的原则,发布更多的预训练权重。如果大家有什么想法,欢迎和我们进行联系。我们可以业余时间一起做一些有意思的东西。
-
计算机视觉领域使用 transformer(Vision Transformer)
2021-03-09 10:53:35不断增加网络深度会导致CNN网络训练效率变差、训练过程复杂且不稳定; 将transformer网络和CNN网络相结合,用的transformer的self-attention机制代替CNN中卷积层叠加策略,便能在扩大CNN视野的同时增加网络的训练... -
5. Transformer
2021-02-18 14:29:25这种方式的原因在于:以RNN举例,RNN在训练过程中,后一时刻的参数与前一时刻有关,需要不断的按照顺序进行迭代才能进行下一步操作,导致效率低下。此外,RNN模型中涉及到的参数量也很多~~ 因此,transformer的主要... -
transformer 全总结
2021-01-23 16:25:52这是写给我自己看的笔记,所以你看看不明白是很正常的,但我并不觉得完全没有参考价值,毕竟之前看的trans介绍,要么只有encoder,要么没有训练过程。 transformer 全总结 整体架构 en-de Here, the encoder maps ... -
transformer机制讲解_【核心代码解读】Transformer-XL
2021-01-05 20:23:24[论文] Transformer-XL: Attentive Language Models Beyond a Fixed-Length Contextarxiv.orgMotivationTransformer在预训练阶段,设置了固定序列长度max_len的上下文,finetuning阶段,模型不能获取大于max_len的... -
Transformer 中的mask
2021-02-17 21:12:13transformer中的mask有两种作用:其一:去除掉各种padding在训练过程中的影响。 其二,将输入进行遮盖,避免decoder看到后面要预测的东西。 1.Encoder中的mask 的作用属于第一种 在encoder中,输入的是一batch的... -
Transformer的矩阵维度分析和Mask详解
2019-09-29 11:04:41文章目录Multi-Head attention中矩阵维度的变化Transfromer的训练过程Transformer的句子生成过程Maskmask矩阵对K进行mask对Q进行maskMasked Multi-Head Attention中的Mask mask时Transformer中很重要的一个概念,... -
基于Transformer的语音合成
2020-12-14 16:53:29论文: Neural Speech Synthesis with ...在训练和推理过程的低效率,2. 难以使用当前的递归神经网络(RNN)对长期依赖性进行建模。于是引用transformer中的多头注意力机制代替RNN,Transformer的语音合成模型比tac... -
使用Transformer构建语言模型
2020-11-04 20:43:17掌握使用Transformer构建语言模型的实现过程. 什么是语言模型: 以一个符合语言规律的序列为输入,模型将利用序列间关系等特征,输出一个在所有词汇上的概率分布.这样的模型称为语言模型. # 语言模型的训练... -
【从 0 开始学习 Transformer】番外:Transformer 如何穿梭时空?
2019-12-15 10:53:10讲解 Transfomer 在训练阶段为何无需循环调用模型即可完成导师监督(teacher-forcing)法。讲解前瞻遮挡原理的精妙用法:通过一次正向传播,模拟模型逐个得到得到整个目标句子的预测过程。 2. Transformer 穿越时空... -
Transformer翻译模型Decoder详解(Masking)
2020-02-11 18:16:04写这个博客的原因在于:大...为了读者更好地理解整个Transformer的训练过程,我决定结合代码写一篇在理解了Encoder部分怎么理解Decoder模块的博文。 参考文章:https://jalammar.github.io/illustrated-transforme... -
A COMPARISON OF TRANSFORMER AND LSTM ENCODERDECODERMODELSFORASR
2020-09-17 23:28:57A COMPARISON OF TRANSFORMER AND LSTM ENCODER DECODER MODELS FOR ASR 1.论文摘要 在解决asr任务常用的端到端的模型中对比了Trasnformer 和 ...(3)在训练两个模型的过程中需要采用一些预训练和其他策略调整的tri -
TASK04-注意力机制-机器翻译-Transformer
2021-01-06 21:32:25选项1:训练过程1次,预测过程要进行句子长度次 选项2:Decoder 部分的第二个注意力层不是自注意力,key-value来自编码器而query来自解码器 选项3:不需要 选项4:正确,因为自注意力会计算句子内任意两个位置的注意... -
Transformer论文详解,论文完整翻译(九)
2020-06-22 10:06:51Transformer论文详解,论文完整翻译(九) 第五章 训练 这一章描述了我们模型的训练过程。 (个人总结,请勿转载) -
基于Transformer模型的智能问答原理详解
2021-02-24 11:56:38图一就是Transformer模型的框架,不过这里的encoder和decoder不再是RNN...这里省略的是最下层decoder的输入:如果是训练过程,输入则是真实的目标句子;如果是预测过程,第一个输入开始标识符,预测下一个词,并且把这 -
Tf2.0+基于注意力的神经机器翻译训练发布过程
2020-09-27 10:18:05意在译员能更好的从计算机编程角度理解机器翻译的代码实现过程。同时也和机器翻译开发工程师共同分享源码的快乐。 实例是采用当下最新的tensorflow2.0+框架,实现transformer模型 Attention(注意力)、... -
Pretrained-Model-02-Transformer-XL阅读笔记
2020-09-02 22:23:23Valilla Transformer 的训练和测试阶段信息流过程 训练阶段: 测试阶段: 训练阶段:将文本分割为多个片段,进行单独的训练,片段之间的信息无交流 测试阶段:首先使用X1~X4(假设片段长度为4)来预测X5,... -
BERT预训练模型的演进过程!(附代码)
2019-09-28 21:54:05BERT的全称是Bidirectional Encoder Representation from Transformers,是Google2018年提出的预训练模型,即双向Transformer的Encoder,因为decoder是不能获要预测的信息的。模型的主要创新点都在pre-train方法上,... -
迁移学习与Transformer架构
2021-02-19 13:38:15迁移学习 迁移学习干什么的? 迁移学习是通过从已学习的相关任务中转移知识来改进学习的新任务。...在实际训练过程中,虽然有大量的数据可供使用,但往往都是没有标注的,人工进行数据标定过于耗时耗力,因此通... -
tensorflow_Trax_transformer使用示例
2020-05-14 11:08:05Trax中没有写好的数据数据预处理脚本,所以要自己写数据预处理的过程,这里我就直接使用tensorflow_official_nlp_transformer使用示例中生成TTRecoard数据 # 获取训练语料 batch_size = 8 max_length = 100 static_... -
第五章:Transformer(下)
2020-06-22 15:21:28掌握使用Transformer构建语言模型的实现过程. 什么是语言模型: 以一个符合语言规律的序列为输入,模型将利用序列间关系等特征,输出一个在所有词汇上的概率分布.这样的模型称为语言模型. # 语言模型的训练... -
Spatial Transformer Networks翻译理解
2020-07-03 16:03:45空间转换器,允许在网络中对数据进行空间操作,这个可微模块可以插入到现有的卷积架构中,使得神经网络能够主动的在空间上转换特征图,条件是特征图本身,无需额外的训练监督或优化过程的修改,会使得模型学习到平移...