非常简单实用项目 文本生成 (UniLM模型)

今天给大家介绍一个文本生成的一个项目,非常简单实用。

首先说一下Transformer专属(扩展)

        UNILM的seq2seq预训练,Xlnet的乱序语言模型预训练,基本可以说是专门为transformer架构定制的。如果是RNN架构,就不能用乱序语言模型来训练,至于seq2seq的预训练方式,必须同时引入两个模型(encoder和 decoder),不能像transformer架构一样,一个模型搞定。

Attention模型

        

这里的,分别代表query、key、value的向量序列,其中key和value是一一对应的,而将query,key的向量两两做内积,然后用softmax归一化,就得到一个lq*lk的attention矩阵,描述的就是query和key之间任意两个元素的关联强度。最后再与V相乘,相当于按照这个关联强度V的各个向量加权求和,最终输出一个lq*dv的向量序列。

目前最常用的attention方式self attention(我的博客里面也有关于attention的文章),即q,k,v都是用一个向量序列经过线性变换来的,而transformer是self attention跟 position-wise全连接层组合,所以,transformer就是基于attention的向量序列到向量序列的变换。

单向语言模型

        

        语言模型可以说是一个无条件的文本生成模型。语言模型的关键点是要防止看到“未来信息”。如上式,预测x1的时候,没有任何外部输入,预测x2的时候,只能输入x1,预测x3的时候,只能输入x1,x2,依次类推。

        

        RNN模型是天然适合做语言模型的,因为它本身就是递归的运算,如果是CNN来做的话,需要对卷积核进行mask,需要将卷积核对应右边部分置零。

Transformer模型,需要一个下三角矩阵形式的attention矩阵:

        

        如图所示,attention矩阵的每一行事实上都代表着输出,而每一列都代表输入,而attention矩阵就代表输出和输入的关联。假设输入的北京我爱你.....   白色方格代表o,那么第一行表示“北”只能跟起始标记<s>有关,而第2行‘京’只能跟起始标识符<s>和‘北’相关了。以此类推,只需要在transformer的attention矩阵中引入下三角形式的mask,并将输入输出的错开训练,就可以实现单向语言模型。

seq2seq模型

        任何NLP问题都可以转化为seq2seq来做,是一个真正意义上的万能模型。MASS和UNILM,MASS是普通的seq2seq架构,分别用bert类似的transformer模型来做encoder和decoder,它的主要贡献就是提供了一种seq2seq的思想的预训练方案。UNILM直接使用单个bert模型就可以做seq2seq任务,而不用区分encoder和decoder,特别之处只需要一个mask。

        Unilmn直接将seq2seq当成句子补全。假如输入是“你想吃啥”,目标句子是“白切鸡”,那Unilm将这两个句子拼成一个:经过这样的转化后,最简单的方案是训练一个语言模型,然后输入来预测白切鸡”,知道出现“[SEP]”为止。(左图)

          

其实右图比左图简单,左图把你想吃啥也加入了预测范围(导致这部分的attention是单向的,对应部分的mask矩阵是下三角),其实这是不必要的,属于额外约束。真正要预测的只是“白切鸡”这部分,所以我们可以把“你想吃啥”这部分的mask去掉,得到上面的右图的mask。

        这样一来,输入部分的attention是双向的,输出部分的attention是单向,满足seq2seq的要求,而且没有额外约束。这便是Unilm里面提供的单个bert模型就可以完成seq2seq任务的思路,只要添加上述mask,而不需要修改模型框架,可以直接用bert的masked language moder预训练权重,收敛更快。

         

 UniLM模型(重点)

其实Unilm是一个融合nlu和nlg能力的transformer模型,由微软在19年5月份提出来,20年升级到V2版本。

Unilm的核心是通过特殊的attention mask来赋予模型具有seq2seq的能力。假如输入是“你想吃啥”,目标句子是“白切鸡”,那Unilm将这两个句子拼成一个:

        

这几个token之间是双向的attention,而这几个token是单向attention,从而允许递归地预测这几个toekn,所以它具备文本生成能力。

 

Seq2seq只能说明Unilm具有NLG能力,前面说同时具备NLU和NLG能力。因为UNILM特殊的attention mask,所以这六个token只在他们之间相互做attention,而跟完全没有关系,尽管后面拼接了,但这不会影响前6个编码向量。就是前面6个编码向量等价于只有时的编码结果,如果的向量代表句向量,那么他就是“你想吃啥”的句向量,而不是加上“白切鸡”后的句向量。

由于这个特性,Unilm在输入的时候也随机加入一些,,这样输入部分就可以做MLM任务,输入部分就可以做seq2seq任务,MLM增强了NLU能力,而seq2seq增强了NLG能力。

 SimBERT模型(重点)

SimBERT属于有监督训练,训练预料是自行收集的相似句对,通过一句来预测另一句的相似句子生成任务来构建seq2seq部分,然后前面也提到过的向量代表输入句的向量,所以可以同时用它来训练一个检索任务。

假设a和b是一组相似句,在同一batch中,把abba都加入训练,做一个相似句的生成任务,这是seq2seq部分。

另一种,把整个batch内的向量都拿出来,得到一个句向量矩阵(b是batch_size,d是hidden_size),然后对d维度做l2归一化,得到,然后两两做内积,得到b*b的相似度矩阵, 接着乘以一个scale(取到了g0),并mask掉对角线部分,最后一行进行softmax,作为一个分类任务训练,每个样本都是目标标签是他的相似句。其实就是把batch内所有非相似样本都当做负样本,借助softmax来增加相似样本的相似度,降低其余样本的相似度。

         说到底,关键就是的向量事实上就代表着输入句的向量,所以可以用它来做一些NLU相关的事情。最后的loss是seq2seq和相似句分类两部分loss之和。

        

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值