Press "Enter" to skip to content

更适合文本分类的轻量级预训练模型解析

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

自 BERT 起,预训练语言模型沿着海量训练数据和庞大网络结构的方向在不断发展着。在 12 月落幕的 NeurIPS 2020 会议上,最新语言模型 GPT-3 荣膺最佳论文奖。OpenAI 的研究人员使用了多达 45TB 的文本数据来训练它的 1750 亿个参数。GPT-3 不仅仅是“变得更大”,它用“Few-Shot”学习替代了 FineTune,能够出色完成代码生成、领域问答、吉他谱曲等高难度的复合型 NLP 任务。

 

那幺,在相反的道路上,当数据受限并且算力不足,是否有轻量级的预训练模型能够帮助我们更好地处理文本分类等经典 NLP 问题呢?

 

AllenAI 团队开源的 Vampire(Variational Methods for Pretraining

 

In Resource-limited Environments)正是这样一款模型。全文《Variational

 

Pretraining for Semi-supervised Text Classification》收录于ACL-2019。

 

本文将详细介绍一种基于预训练半监督的文本分类轻量型模型,即 Vampire 模型,该模型为解决由于大量数据和高昂计算力导致的资源不足问题提供了一些思路。

 

01 变分自编码器

 

Vampire 从 VAE 中借鉴了不少思路。在详细介绍它之前,先来说说什幺是 VAE, VAE 即 Variational AutoEncoder,中文译作变分自编码器。VAE 出自 -2014 的 《Auto-Encoding Variational Bayes》,是一种图像生成技术,近年来也被迁移到 NLP 中作为一种文本生成模型。原文中有大段大段的公式推导,全部理解需要费不少功夫。不过对于 Vampire 来说,重要的是弄明白 VAE 是建立在什幺样的假设之上,以及它是通过什幺样的方式来实现文本生成的。

 

和 Encoder-Decoder 架构一样,VAE 也是通过“编码”和“解码”来完成对输入句子的重建。两者的区别在于,发源于 CV 的 VAE 并不是一种天然有序的 NLP 模型。在理解 VAE 之前,需要先彻底抛下头脑中关于 Seq2Seq 的 one by one 生成方式的固有印象。输入序列中的每个词可以是相关的,也可以是互相独立的,这取决于你使用什幺样的编码器。但是,输出序列中的每个词,一定是互不依赖的,它们被各自建模,同时生成。为了便于理解,我们暂且将重建任务看成是对单个词的建模。这一过程可以用更广义的分布-采样概念来描述:

对于一个离散样本 X,计算其概率分布,根据分布表达式进行采样,生成新的离散样本 X’。令 X’ 无限逼近 X。

如果用 Encoder-Decoder 的术语来说,“计算概率分布”即“编码”,“分布表达式”即“隐层”,“采样生成”即“解码”。这里有一个难点:X 是个离散变量,它很有可能服从某个奇奇怪怪的分布,根本就写不出具体的表达式,更别提根据表达式来采样了。因此,VAE 以正态分布作为搭桥,先将 X 变换到正态分布 N(X) 上,再根据公式进行采样得到 Z,对 Z 进行变换生成 X’。至于 X->N(X) 和 Z -> X’,就直接扔进神经网络学出来。一个特定的正态分布,只由均值和方差决定。因此,X -> N(X) 的变换,实际使用了两个神经网络,分别估算均值 u 和方差 sigma。

 

以上是对于单个词的建模。当输入的是 n 个词组成的句子时,在每个词位置都需要进行上述处理。也就是说,有 n 组正态分布,对应着 n 组均值和 n 组方差。好了,现在可以画出整个前向计算的流程图了:

 

 

在前向计算过程中,每个 X 都是 embedding 向量,经编码产生的均值和方差也同样是向量(假设维 度为 dim)。那幺,实际上生成了 dim 个正态分布,它们各自独立采样,组成维度为 dim 向量 Z。从 Pytorch 示例代码中可以更直观地看到数据流向:

 

embed = F.relu(self.fc1(x)) # embedding. 
# 编码部分.  
u = self.fc21(embed) # 均值.  
sigma = self.fc22(embed) # 方差.  
# 重参数采样.  
# 通过对标准正太分布叠加均值和方差来进行.  
std = sigma.mul(0.5).exp_()  
eps = torch.FloatTensor(std.size()).normal_() 
eps = Variable(eps) 
z = eps.mul(std).add_(u)  
# 解码部分. 
h = F.relu(self.fc3(z))  
x_hat = F.sigmoid(self.fc4(h))

 

VAE 的优化目标分为两部分。第一部分是重建目标,即 X’ = X:

 

loss1 = nn.MSELoss(x_hat, x)

 

在不加入额外约束项时,模型可以很轻松地做到 100% 地还原 X,只要让方差全部为 0,均值取原值即可。显然,这样的模型是不具备真正生成能力的。因此,VAE 的优化目标还包含第二部分,使用 KL 散度把 Z(X) 拉向标准正太分布 N(0, I),可以理解为正则化项或是对生成网络加噪。

 

KLD = u.pow(2).add_(sigma.exp()).mul_(‐1).add_(1).add_(sigma) 
loss2 = torch.sum(KLD).mul_(‐0.5)

 

两个 loss 互相对抗,同步学习优化。

 

02 Vampire

 

现在可以正式介绍 Vampire了。这是一个为算力和数据双双受限的情况设计的轻量预训练模型,它的典型应用场景是 半监督文本分类 。Vampire 在本质上是一个文档话题模型,它从一开始就抛弃了序列信息,将句子当作 BOW(Bag of Words)进行建模。模型捕捉的是词与词的共现信息,重建的是词频向量。这样的设计使得无论是模型训练还是预测推理的速度都大大加快。

 

对于输入句子 X,Vampire 统计词表中每个词的频次,构建词频向量作为句子表示。编码器部分是和 VAE 一样的均值方差预测,然后进行重参数采样:

 

 

解码器部分做了适配改造,先对采样变量 Z 做一次 softmax 得到 theta,作者将其解释为对隐话题的分布计算。其中,公式13 即重建目标 loss1。

 

 

在完成预训练后,theta 被记为 vampire embedding,参与下游任务。和 Bert 等模型不同的是,vampire embedding 作为辅助话题信息,并不能单独完成编码训练。它需要和 word embedding 融合在一起,共同进行分类预测:

 

 

03 应用场景

 

在低资源场景下,当算力受限并且也没有可观的领域数据时,Vampire 等轻量级的预训练模型也可以作为一种备选方案。作者在 AG News、Hatespeech、IMDB 和 Yahoo! 四个任务上,测试了 Vampire 与基线词向量模型在标注数据量从 200~10000 范围内的分类准确度。从图上可以明显地观察到,在标注数据不足 2000 条时,Vampire 模型的表现较基线有大幅度的提升。

 

 

04 总结

 

ELMO、BERT 和 GPT 等预训练模型的出现,彻底革新了半监督 NLP 的研究。在海量无标注数据上训练的文本向量表示,不仅能够显着提升下游任务的性能,而且这种助力不局限于单一的任务类型。

 

Be First to Comment

发表评论

邮箱地址不会被公开。 必填项已用*标注