机器之心专栏
本文将分 2 期进行连载,共介绍 10个在文本生成任务上曾取得 SOTA 的经典模型。
【资料图】
第 1 期:Seq2Seq(RNN)、Seq2Seq(LSTM)、Seq2Seq+Attention、SeqGAN、Transformer
第 2 期:GPT、Bert、XLM、GPT-2、BART
您正在阅读的是其中的第 1 期。前往 SOTA!模型资源站(sota.jiqizhixin.com)即可获取本文中包含的模型实现代码、预训练模型及 API 等资源。
模型 | SOTA!模型资源站收录情况 | 模型来源论文 |
---|---|---|
Seq2Seq(RNN) | https://sota.jiqizhixin.com/project/seq2seq 收录实现数量:3 支持框架:Torch、MindSpore | Sequence to sequence learning with neural networks |
Seq2Seq(LSTM) | https://sota.jiqizhixin.com/project/seq2seq-lstm 收录实现数量:2 支持框架:PyTorch | Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation |
Seq2Seq+Attention | https://sota.jiqizhixin.com/project/seq2seq-attention 收录实现数量:4 支持框架:TensorFlow、PyTorch | Neural machine translation by jointly learning to align and translate |
SeqGAN | https://sota.jiqizhixin.com/project/seqgan 收录实现数量:22 支持框架:TensorFlow、PyTorch | SeqGAN: Sequence Generative Adversarial Nets with Policy Gradient |
Transformer | https://sota.jiqizhixin.com/project/transformer-2 收录实现数量:9 支持框架:TensorFlow、PyTorch等 | Attention is all you need |
文本生成(Neural Language Generation,NLG)是指从非语言的表示生成人类可以理解的文本。根据非语言表示的不同划分,文本生成包括“文本→文本”、“数据→文本”、“图像→文本”。随着深度学习、知识图谱等前沿技术的发展,基于图像生成文本描述的实验成果在不断被刷新。基于GAN的图像文本生成技术已经获得了非常好的效果,不仅能够根据图片生成非常好的描述,还能根据文本输出生成对应的图片。由数据生成文本,目前主要用于新闻撰写领域,中文和英文都有很大的进展。从应用任务的领域细分,机器翻译、对话系统(目标导向、开放式)、故事生成、诗歌生成、文本摘要等等都属于文本生成的范畴。与其他自然语言处理技术类似,文本生成也主要包括传统的文本生成方法(基于规则、基于统计)和基于神经网络的文本生成方法两类。
本文回顾文本生成领域必备的TOP模型,聚焦于“文本→文本”。所选出进行介绍的模型在提出之时,其目的可能是解决机器翻译、文本摘要、对话系统等不同的任务,因其经典性以及对文本生成整个领域中不同应用任务的巨大推动,我们都放入本文介绍。而针对具体的细分应用领域,例如机器翻译任务必备的TOP模型、文本摘要任务必备的TOP模型等等,我们将在具体的专题文章中详细介绍其中经典模型的改进历程。
本文是Sutskever I.等人于2014年发表在NeurIPS的一篇论文,是自然语言处理中最基础的Seq2Seq模型,目前引用量已经超过12000次。最常见的Seq2Seq模型是解码器-编码器(Encoder-Decoder)模型,由于时序数据的序列性质,通常情况下,我们使用RNN(Recurrent Neural Network)在Encoder中得到输入序列的特征向量,再将此特征向量输入Decoder中的另一个RNN模型,逐一生成目标序列的每一个点。本文使用多层长短期记忆网络(LSTM)将输入序列映射到一个固定维度的向量,然后使用另一个深度LSTM从向量中解码目标序列。通过EncoderRNN和DecoderRNN,我们可以得到预测的序列,将预测的序列与基准真值的序列对比计算误差,更新参数来不断的训练模型。
图1. 模型读取一个输入句子 "ABC "并生成 "WXYZ "作为输出句子。该模型在输出句末标记后停止预测。请注意,LSTM是反向读取输入句子的,因为这样做在数据中引入了许多短期的依赖关系,使优化问题更加容易
RNN是前馈神经网络对序列的自然概括。给定一个输入序列(x_1, ... , x_t),一个标准的RNN通过迭代以下公式计算出一个输出序列(y_1, ... , y_T):
只要提前知道输入和输出之间的排列,RNN就可以很容易地将序列映射到序列。在本文发表的阶段,还不清楚如何将RNN应用于输入和输出序列具有不同长度的复杂和非单调关系的问题。一般序列学习的最简单策略是用一个RNN将输入序列映射到一个固定大小的向量,然后用另一个RNN将该向量映射到目标序列。虽然这在原则上是可行的,因为RNN被提供了所有的相关信息,但由于由此产生的长期依赖性,将很难训练RNN。然而,众所周知,长短期记忆(LSTM)可以学习具有长距离时间依赖性的问题,所以LSTM在这种情况下可能会成功。LSTM的目标是估计条件概率p(y1, . . , yT′ |x1, . . , xT),其中(x1, . . , xT)是一个输入序列,y1, . . . , yT′是对应的输出序列,其长度T′可能与T不同。LSTM计算这个条件概率的方法是:首先获得由LSTM的最后一个隐藏状态给出的输入序列(x1, ..., xT)的固定维度表示,然后用标准的LSTM计算y1, ..., yT′的概率,该公式的初始隐藏状态被设置为x1, ..., xT的表示v:
在这个方程中,每个p(yt|v, y_1, ..., y_t-1)分布都是用词汇表中的所有单词的softmax来表示。此外,要求每个句子以一个特殊的句末符号"<EOS>"结束,这使得模型能够在所有可能的长度的序列上定义一个分布。
当前 SOTA!平台收录 Seq2Seq(RNN) 共 3 个模型实现资源,支持的主流框架包含 Torch、MindSpore 等。
项目 | SOTA!平台项目详情页 |
---|---|
Seq2Seq(RNN) | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/seq2seq |
Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation
本文提出了基于短语学习的Seq2Seq模型,该模型是由Cho, K.等人于2014年提出的,目前的引用量超过了11000次。在该模型中Encoder的实现与第一篇文章没有特别大的区别,除了基础的RNN之外,LSTM以及GRU都可以作为选择,LSTM与GRU在性能上并没有绝对的优劣之分,需要根据不同的需求做选择。而Decoder与前一篇文章中的方法有较大区别。在前一章的文章中提到,源序列经过Encoder后会得到一个最终的隐藏状态,该隐藏状态z包含了所有源序列的信息,并会成为Decoder生成目标序列的初始隐藏状态。这样的做法没有充分利用源序列的信息。因此,Cho, K.等人做了以下改进,在每一步DecoderRNN输入层及全连接预测单词层加入z,同时,在全连接层预测下一个单词时,不仅加入了Encoder的最终隐藏状态z,还加入了当前单词经过嵌入层之后的结果。模型结构如图2:
图2. RNN Encoder–Decoder 架构
如图2,yt和h_<t>都以y_t-1和输入序列的摘要c为条件。因此,解码器在时间t的隐藏状态是通过以下方式计算的:
下一个符号的条件分布是:
联合训练RNN编码器-解码器的两个组成部分以最大化条件对数似然:
一旦RNN编码器-解码器训练完毕,该模型可以用两种方式使用。一种方式是使用该模型来生成一个给定的输入序列的目标序列。另一方面,该模型可用于对给定的一对输入和输出序列进行评分。此外,本文还提出了一种新型的隐藏单元,该单元由LSTM单元驱动,更易于计算和实现。图3显示了图形建议隐藏单元的描述。
图3. 所提出的隐藏激活单元的图示。更新门z选择隐藏状态是否被更新为新的隐藏状态h˜。重置门r决定是否忽略先前的隐藏状态
首先,复位门r_j计算如下:
更新门z_j的计算方法是:
h_j的实际激活计算为:
在这种表述中,当复位门接近0时,隐藏状态被强制忽略之前的隐藏状态,只用当前的输入进行复位。这有效地允许隐藏状态放弃任何在未来发现不相关的信息,因此,允许一个更紧凑的表述。
当前 SOTA!平台收录 Seq2Seq(LSTM) 共 2 个模型实现资源,支持的主流框架包含 PyTorch等。
项目 | SOTA!平台项目详情页 |
---|---|
Seq2Seq(LSTM) | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/seq2seq-lstm |
前文介绍了两种Seq2Seq的模型,虽然在第二种模型里,可以很好的提取源序列的信息,并用在每一个目标序列的输出上,但仍然无法避免另一个问题:无论是自然语言里的句子,还是轨迹数据,这些序列中的每一个点更多情况下是受周围或者局部其他点的影响,而不是整个序列。因此,在生成目标序列时,更好的办法不是在每一步加入之前源序列的全部信息,而是只关注部分信息。Bahdanau, D.等人同样也在2014年发表一篇影响力深远的论文,他们的亮点是首次在Seq2Seq模型中加入了Attention思想,目前引用量已经超过15000次。注意力机制是提供源序列的更丰富的编码的机制,从源序列编码构建可以被解码器使用的上下文向量。注意力机制使得模型在目标序列预测每个单词的过程中,学习到源序列中编码的单词如何以及以什么程度集中注意力。
图4. 模型在给定的源句(x_1, x_2, ..., x_T)中生成第t个目标词y_t
模型的Encoder与标准Seq2Seq无异。对于Decoder部分,定义条件概率:
概率是以每个目标词y_i的不同上下文向量c_i为条件的。上下文向量c_i取决于注释序列(h_1,...,h_Tx),编码器将输入的句子映射到该注释上。每个注释h_i包含整个输入序列的信息,主要集中在输入序列的第i个词的周围部分。然后,将上下文向量c_i计算为这些注释h_i的加权和:
将alignment模型a参数化为一个前馈神经网络,它与所有其他组件共同训练。
当前 SOTA!平台收录 Seq2Seq+Attention 共 4 个模型实现资源,支持的主流框架包含 PyTorch、TensorFlow 等。
项目 | SOTA!平台项目详情页 |
---|---|
Seq2Seq+Attention | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/seq2seq-attention |
这篇文章用对抗网络实现了离散序列数据的生成模型,解决了对抗生成网络难应用于nlp领域的问题,并且在文本生成任务上有优异表现。
图5. SeqGAN图示。左图:D通过真实数据和G生成的数据进行训练。G通过策略梯度进行训练,最终的奖励信号由D提供,并通过蒙特卡洛搜索传递回中间的行动值序列生成问题表示如下。给定一个真实世界结构化序列的数据集,训练一个θ参数化的生成模型Gθ来生成一个序列Y_1:T=(y_1, ..., y_t, ..., y_T),y_t∈Y,其中Y是候选标记的词汇表。作者根据强化学习来解释这个问题。在时间步骤t中,状态s是当前产生的token(y_1, ..., y_t-1),行动a是要选择的下一个token y_t。因此,策略模型Gθ(y_t|Y_1:t-1)是随机的,而在选择了一个行动后,状态转换是确定的,即如果当前状态s=Y_1:t-1,行动a=y_t,则下一个状态s’=Y_1:t的(δ_s,s’)^a=1;对于其他下一个状态s"",(δ_s,s"")^a=0。此外,还训练了一个φ参数化的鉴别模型Dφ,为改进生成器Gθ提供指导。Dφ(Y_1:T )是一个概率,表示一个序列Y_1:T来自真实序列数据的可能性。通过提供来自真实序列数据的正样本和来自生成模型Gθ生成的合成序列的负样本来训练鉴别模型Dφ。同时,生成模型Gθ通过采用策略梯度和MC搜索,根据从鉴别模型Dφ得到的预期最终奖励进行更新。奖励是通过骗过鉴别模型Dφ的可能性来估计的。生成器模型(策略)Gθ(y_t|Y_1:t-1)的目标是从起始状态s"生成一个序列,使其预期的最终奖励最大化:
(Q_Dφ(s, a))^Gθ是一个序列的行动价值函数,即从状态s开始,采取行动a,然后遵循策略Gθ的预期累积奖励。序列的目标函数的合理性是:从一个给定的初始状态开始,生成器的目标是生成一个能使鉴别器认为它是真实的序列。使用REINFORCE算法,将鉴别器Dφ((Y_1:T)^n)估计的真实概率作为奖励:
由上式,state指的当前timestep之前的decode结果,action指的当前待解码词,D网络鉴别伪造数据的置信度即为奖励,伪造数据越逼真则相应奖励越大,但该奖励是总的奖励,分配到每个词选择上的reward则采用了以下的近似方法:
即当解码到t时,对后面T-t个timestep采用蒙特卡洛搜索搜索出N条路径,将这N条路径分别和已经decode的结果组成N条完整输出,然后将D网络对应奖励的平均值作为reward。当t=T时无法再向后探索路径,所以直接以完整decode结果的奖励作为reward。蒙特卡洛搜索是指在选择下一个节点的时候用蒙特卡洛采样的方式,而蒙特卡洛采样是指根据当前输出词表的置信度随机采样。完整算法流程如下:
随机初始化G网络和D网络参数;通过MLE预训练G网络,目的是提高G网络的搜索效率;通过G网络生成部分负样预训练D网络;通过G网络生成sequence用D网络去评判,得到reward:
根据上式(4)计算得到每个action选择得到的奖励并求得累积奖励的期望,以此为loss function,并求导对网络进行梯度更新。其中,下式是标准的D网络误差函数,训练目标是最大化识别真实样本的概率,最小化误识别伪造样本的概率:
最后,GAN网络的误差函数如上,循环以上过程直至收敛。
当前 SOTA!平台收录 SeqGAN 共 22 个模型实现资源,支持的主流框架包含 PyTorch、TensorFlow 等。
项目 | SOTA!平台项目详情页 |
---|---|
SeqGAN | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/seqgan |
2017 年,Google 机器翻译团队发表的《Attention is All You Need》完全抛弃了RNN和CNN等网络结构,而仅仅采用Attention机制来完成机器翻译任务,并且取得了很好的效果,注意力机制也成为了研究热点。大多数竞争性神经序列转导模型都有一个编码器-解码器结构。编码器将输入的符号表示序列(x1, ..., xn)映射到连续表示的序列z=(z1, ..., zn)。给定z后,解码器每次生成一个元素的符号输出序列(y1, ..., ym)。在每个步骤中,该模型是自动回归的,在生成下一个符号时,将先前生成的符号作为额外的输入。Transformer遵循这一整体架构,在编码器和解码器中都使用了堆叠式自注意力和点式全连接层,分别在图6的左半部和右半部显示。
图6. Transformer架构
编码器。编码器是由N=6个相同的层堆叠而成。每层有两个子层。第一层是一个多头自注意力机制,第二层是一个简单的、按位置排列的全连接前馈网络。在两个子层的每一个周围采用了一个残差连接,然后进行层的归一化。也就是说,每个子层的输出是LayerNorm(x + Sublayer(x)),其中,Sublayer(x)是子层本身实现的函数。为了方便这些残差连接,模型中的所有子层以及嵌入层都会生成尺寸为dmodel=512的输出。解码器。解码器也是由N=6个相同的层组成的堆栈。除了每个编码器层的两个子层之外,解码器还插入了第三个子层,它对编码器堆栈的输出进行多头注意力。与编码器类似,在每个子层周围采用残差连接,然后进行层归一化。进一步修改了解码器堆栈中的自注意力子层,以防止位置关注后续位置。这种masking,再加上输出嵌入偏移一个位置的事实,确保对位置i的预测只取决于小于i的位置的已知输出。Attention。注意力函数可以描述为将一个查询和一组键值对映射到一个输出,其中,查询、键、值和输出都是向量。输出被计算为值的加权和,其中分配给每个值的权重是由查询与相应的键的兼容性函数计算的。在Transformer中使用的Attention是Scaled Dot-Product Attention, 是归一化的点乘Attention,假设输入的query q 、key维度为dk,value维度为dv , 那么就计算query和每个key的点乘操作,并除以dk ,然后应用Softmax函数计算权重。Scaled Dot-Product Attention的示意图如图7(左)。
图7. (左)按比例的点乘法注意力。(右)多头注意力由几个平行运行的注意力层组成
如果只对Q、K、V做一次这样的权重操作是不够的,这里提出了Multi-Head Attention,如图7(右)。具体操作包括:
首先对Q、K、V做一次线性映射,将输入维度均为dmodel 的Q、K、V 矩阵映射到Q∈Rm×dk,K∈Rm×dk,V∈Rm×dv;
然后在采用Scaled Dot-Product Attention计算出结果;
多次进行上述两步操作,然后将得到的结果进行合并;
将合并的结果进行线性变换。
在完整的架构中,有三处Multi-head Attention模块,分别是:
Encoder模块的Self-Attention,在Encoder中,每层的Self-Attention的输入Q=K=V , 都是上一层的输出。Encoder中的每个位置都能够获取到前一层的所有位置的输出。
Decoder模块的Mask Self-Attention,在Decoder中,每个位置只能获取到之前位置的信息,因此需要做mask,其设置为−∞。
Encoder-Decoder之间的Attention,其中Q 来自于之前的Decoder层输出,K、V 来自于encoder的输出,这样decoder的每个位置都能够获取到输入序列的所有位置信息。
在进行了Attention操作之后,encoder和decoder中的每一层都包含了一个全连接前向网络,对每个位置的向量分别进行相同的操作,包括两个线性变换和一个ReLU激活输出:
因为模型不包括recurrence/convolution,因此是无法捕捉到序列顺序信息的,例如将K、V按行进行打乱,那么Attention之后的结果是一样的。但是序列信息非常重要,代表着全局的结构,因此必须将序列的token相对或者绝对位置信息利用起来。这里每个token的position embedding 向量维度也是dmodel=512, 然后将原本的input embedding和position embedding加起来组成最终的embedding作为encoder/decoder的输入。其中,position embedding计算公式如下:
其中,pos表征位置,i表征维度。也就是说,位置编码的每个维度对应于一个正弦波。波长形成一个从2π到10000-2π的几何级数。选择这个函数是因为假设它可以让模型很容易地学会通过相对位置来参加,因为对于任何固定的偏移量k,PE_pos+k可以表示为PE_pos的线性函数。
当前 SOTA!平台收录 Transformer 共 9 个模型实现资源,支持的主流框架包含 TensorFlow、PyTorch等。
项目 | SOTA!平台项目详情页 |
---|---|
Transformer | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/transformer-2 |
前往 SOTA!模型资源站(sota.jiqizhixin.com)即可获取本文中包含的模型实现代码、预训练模型及API等资源。
网页端访问:在浏览器地址栏输入新版站点地址sota.jiqizhixin.com,即可前往「SOTA!模型」平台,查看关注的模型是否有新资源收录。
移动端访问:在微信移动端中搜索服务号名称「机器之心SOTA模型」或 ID「sotaai」,关注 SOTA!模型服务号,即可通过服务号底部菜单栏使用平台功能,更有最新AI技术、开发资源及社区动态定期推送。