NLP系列之 文本生成入门(NLG)

999 阅读11分钟
  1. 背景概述

  1. 文本生成简介

  • 自然语言生成 (Natural Language Generation, NLG) 是自然语言处理中非常重要和基础的任务;狭义上说,NLP可以分为自然语言理解(NLU)和自然语言生成两个方向
  • 20世纪50年代,文本生成作为机器翻译的子问题被首次提出,然后从简单的规则逐步发展至大型深度神经网络,预测目标也更开放
  1. 模型单元与结构

  • 模型单元

    • RNN / GRU / LSTM
    • Transformer / GPT / T5
  • 模型结构

    • 语言模型(Markov):

      • 下一个词只和前面固定窗口的文本有存在条件概率关系,P(x3|x1,x2),如 "天安"->"门"

      • 统计语言模型:非参数化,通过直接计数来估计条件概率,不能充分利用相似上下文本

      • 神经网络语言模型:通过参数化模型来估计条件概率

    • Seq2Seq:根据一类输入数据生成文本序列;Encoder -> hidden_state -> Decoder

    • VAE:无监督文本生成;encoder -> q(z|x) -> decoder

    • GAN:generator <-> discriminator;理想状态下达到纳什均衡,生成器生成的样本与数据集分布一致,判别器无法区分

  1. 几种文本生成模型

  1. Seq2Seq文本生成

  • Seq2Seq是文本生成中应用最广泛的框架,它可以处理变长的输入输出序列,在文本摘要、文本改写等场景中广泛使用;一般由编码器和解码器两部分组成,在一些改进的框架中为了引入额外的知识,编码器可能不止一个

  • 编码器编码过程可以理解为NLU,将自然语言表示为含有语义信息的低维稠密向量z;解码器可以理解为条件语言模型,在隐向量z的条件下预测每个时间步的单词概率

  • 模型单元一般采用RNN,为了缓解长距离依赖、梯度消失等问题,也常采用LSTM单元,利用三个门结构更新维护细胞状态

  1. 基于VAE的文本生成模型

  • 自动编码器(AE):将高维的复杂数据映射低维隐变量 ,并利用解码器重构原数据 ,整个编码和解码的过程是确定性的;如果在隐变量空间中采样来进行解码,模型的输出往往是无意义的
  • 变分自动编码器(VAE):学习文本在隐空间中的概率分布而非确定的向量,可以建模文本的多样性和实现文本生成的类别可控性

  • VAE计算过程:输入序列x -> 编码器 -> 隐变量后验概率分布的参数 -> 采样得到隐变量z -> 解码器重构x

    • 训练过程中使隐变量后验分布逼近于某已知的先验分布,如 标准高斯分布 N(0, I)

    • 推断过程中仅使用解码器部分,从先验分布中采用解码生成文本

    • 数学原理:变分推断,优化目标推导

      • 式5)即观测变量X的对数似然函数logP(X) 的下界,也就是VAE优化的目标函数,被称为证据下界(ELBO),所以模型训练的损失函数即为ELBO的相反数
      • 第一项的期望相当于在隐变量z的后验分布上采样并使得重构x的概率最大,第二项为使得后验分布q(z|x)趋向于一个先验分布p(z)(通常取标准高斯分布)
    • 重参数方法(Reparameterization Trick)

      • VAE训练过程中首先需要采样得到隐变量,因为采样操作是不可导的,训练过程中梯度无法回传。为了解决该问题,VAE模型训练时采用了重参数方法,将采样分为两步:首先从标准正态分布中采样 ϵ~N(0, I) ,然后对采样结果进行变换:
      • 重参数方法中μ和σ参与的运算都是可导的,而且获得的隐变量z服从分布N(μ, σ^2) ,使得模型可以正常训练。
    • 条件变分自动编码器(CVAE)

  1. 基于Transformer的文本生成模型

  • Transformer模型最早于2017年在 Attention is All You Need 论文中被提出,近年来注意力机制在序列到序列建模中被广泛使用,用于解决RNN在长序列建模中的长距离依赖问题
  • Transformer模型放弃了使用循环递归的方法来编码序列的基本范式,而是使用全局注意力机制来直接并行计算序列每个位置的隐状态

  • 编码器部分每个Transformer单元由两个子层组成:多头自注意力子层和全连接的前向计算子层

    • 自注意力机制相当于基于向量之间的余弦相似度来计算注意力权重,然后基于权重来进行对特征向量加权求和得到新的隐层表示,多头机制就是在计算自注意力之前经过不同的线性变换,可以在不同的特征空间中进行特征计算,最后将各空间的计算结果进行拼接提升模型的性能
    • 点积后的结果大小与维度成正比,所以经过softmax以后,梯度可能会变很小,缩放后后可以让attention的权重分布方差为1
  • 解码器包含了三个子层

    • 掩码多头自注意力子层,相比编码器中的多头自注意力子层,增加了一个掩码矩阵,因为生成过程中每个位置的词只应该关注到前面词和自身的信息,因此添加掩码矩阵使得在计算注意力时无法关注到后面的词,避免了信息泄露,这样就实现了文本生成过程的自回归特性
    • 编码器-解码器注意力子层,融合了编码信息计算多头自注意力
  • 并行计算的性质,导致了Transformer无法关注到输入单词的顺序,为了解决这一问题,模型在输入时引入了额外的位置编码信息,将位置编码与词的Embedding直接相加作为输入

  1. 基于Transformer的预训练文本生成模型

  1. GPT系列

  • GPT-1:Improving Language Understanding by Generative Pre-Training

    • 问题背景:无标签的文本很多,但是针对特定任务的有标签文本数据很稀少,导致针对特定任务来训练一个准确的模型很有挑战
    • 解决方法:在无标签数据上训练一个语言模型,在下游具体任务上用有标签数据进行微调
    • 主要步骤:采用两段式训练。第一个阶段是利用语言模型进行预训练(无监督形式),第二阶段通过 Fine-tuning 的模式解决下游任务(监督模式下)
  • GPT-2:Language Models are Unsupervised Multitask Learners

    • 问题背景:使用预训练+微调的方式虽然能解决带标签文本稀少的问题,但是在针对具体任务时,仍然是需要重新训练,泛化性比较差,不能广泛应用。

    • 解决方法:GPT-2放弃微调阶段,仅通过大规模多领域的数据预训练,让模型在Zero-shot Learning的设置下学会解决多任务的问题语言模型.

    • 进一步扩大模型的参数量和训练样本量。通过对不同任务构建提示词 (Prompt), 进行零样本的文本生成。

      • 例如,法语到英语的机器翻译任务中,只需在样本前拼接提示词,如 “translate to english: salute d'amour'”即可让模型生成对应的翻译
  • GPT-3:Language Models are Few-Shot Learners

    • 海量参数 + 不做梯度更新的few-shot
  • 参数量对比:

    • 模型注意力头数量层数隐藏层维度参数量
      GPT-11212768117M
      GPT-2484816001542M
      GPT-3969612288175B
  1. UniLM

Unified Language Model Pre-training for Natural Language Understanding and Generation

  • 利用不同的MASK矩阵实现统一预训练语言模型

  • Seq2Seq LM

    • 训练序列由[SOS] S1 [EOS] S2 [EOS]组成,其中S1是source segments,S2是target segments。随机mask两个segment其中的词,其中如果masked是source segment的词的话,则它可以attend to 所有的source segment的tokens,如果masked的是target segment,则模型只能attend to 所有的source tokens 以及target segment 中当前词(包含)和该词左边的所有tokens。因此,模型可以隐形地学习到一个双向的encoder和单向decoder
  1. 其他

  1. 解码策略

  • 文本生成效果除了和模型本身有关,同时也与采用什么样的解码策略是相关的
  1. Greedy Search(贪心算法)

  • 每个时间步选择最高概率的单词
  • 缺点:忽略了在低概率词后面时间步的可能出现的高概率词

  1. Beam Search(束搜索)

  • 为了避免贪心搜索遗漏掉更大概率的序列,beam search算法提出每次都保留当前最大的beam_num个结果;把当前beam_num个结果分别输入到模型中进行解码,每个序列又新生成V个新结果,共计beam_num*V个结果,排序选择最佳的beam_num个结果;然后重复上述过程,直到解码完成
  • 假设beam_num = 2计算两个时间步的概率均值

  1. viterbi算法

  • 采用动态规划的方法,求解最优解;

  • 子问题拆解:最优路径的子路径,一定也是最优的

  • 时间复杂度:L * V^2

  1. 随机采样

  • 在解码生成下一个token时,直接随机的进行采样。相比于greedy和beam search方法的好处是,生成的文本更加具有多样性。存在的问题也很明显,可能出现上下文不连贯,语义上可能相互矛盾等问题
  1. Top-K Sampling

  • 在随机采样的基础上改进而来

    • 在整个loghits概率分布上做随机采样会导致上下文不连贯,则尝试选取概率最大的K个token,重新形成概率分布,然后再做多项式分布抽样(实际使用效果在GPT2模型上得到了很高的提升)
  1. Top-p sampling

  • Top-K采样仍有可能生成不合理的文本,因此Top-p采样对整个logits从大到小累积概率,只要累积概率大于一个阈值,就从这些选取的token构成新的分布中进行采样

温度采样

强化顶部词概率,可以通过对模型输出的 logits 除以一个小于 1 的温度(Temperature,T)。

这样就能在过 softmax 后使得分布更加尖锐,大概率的词概率更大。

之后根据获得概率对顶部词先进行挑选,然后再采样,这样直接杜绝了低概率词出现的可能性。

而这里挑选的策略,目前最主流的便是,TopK 和 TopP.

  1. 文本生成中的一些问题

  1. 统计语言模型中的“零概率”问题

  • 问题描述:统计语言模型中,当某个词在语料库D中未出现时,会导致整个序列的概率为0,但实际上这不代表它在实际语言中不会出现

  • 平滑技术

    • 加法平滑、Good-Turing估计、Katz平滑……,例如,加法平滑:假设每个词组出现的次数比语料库中实际观测次数多δ次,0<δ<=1
  1. 曝光偏差

  • 问题描述:自回归文本生成模型在训练阶段,采用了Teacher-Forcing的训练模式,即在解码每个位置的单词时,输入的数是训练数据中的真实前缀;但在生成阶段,模型输入的是之前时间步解码的前缀,导致训练与生成阶段存在gap,文本质量下降

  • 计划采样(scheduled-sampling):

    • 基本思想:训练decoder时以概率p选择模型自身的输出作为下一个预测的输入,1-p 选择真实标签作为下一个预测的输入;
    • 计划采样 - 采样率p在训练的过程中是变化的,训练开始时p小一些,尽量使用真实label作为输入,随着训练的进行,将p增大模拟生成阶段
  1. 长距离依赖问题

  • RNN -> GRU、LSTM

  • Transformer由于受模型参数量限制,不能超过某一上限长度

    • 解决方法:Transformer + 循环递归编码 -> Transformer-XL
    • 段级递归(segment-level Recurrence):长序列分段,在对当前segment进行处理的时候,缓存并利用上一个segment中所有layer的隐向量序列,而且上一个segment的所有隐向量序列只参与前向计算,不再进行反向传播
  1. 自回归式生成

  • 问题描述:自回归式文本生成按顺序解码生成速度慢,解码阶段没有利用上下文信息