查看原文
其他

NLP.TM[21] | 语言模型发展思路

机智的叉烧 CS的陋室 2022-08-08

【NLP.TM】

本人有关自然语言处理和文本挖掘方面的学习和笔记,欢迎大家关注。

往期回顾:

没记错的话,BERT已经发布了有段时间了,不知道有没有一整年,word2vector也6年了,时至今日,在BERT的基础上又有了很多新的模型,不停地有模型被推上又赶下神坛。正好我也阅读了一轮具有代表性的语言模型论文,那么我们来看看语言模型的发展,经历过什么有代表性的模型。

没打算把所有模型都讲一遍,我希望是从这些论文里面提取出关键思想,以供启发大家,要想看清楚直接看论文,或者是各种博客就好了对吧,文末有一系列的参考资料。

词袋模型

词袋模型才应该是语言模型的起点,最早的文本表示模式以one-hot形式出现,然后有了TF-IDF的形式,时至今日,TF-IDF模型仍在大量场景中被使用,作为一个基线模型,其实已经有比较好的效果,其主要优点如下:

  • 可迁移性其实还算可以,jieba提供的关键词抽取功能其实就是TF-IDF方法,另外sklearn提供了自己训练的工具,都是很可靠的。

  • 数据依赖性低,相比尤其是后面的BERT,不需要很多的数据其实就能训练一个还行的TF-IDF模型。

  • 计算简单,复杂度低,计算时间很小。

  • 基线效果尚可。

词向量模型

由于词袋模型对词汇含义的表征并不清楚,例如同义词等,并不能很好地体现,因此需要更加复杂的形式来对结果进行表征,词向量模型应运而生。

最有代表性的应该是word2vector,另外同样可靠的是GloVe,其主要的表现形式就是,每一个词可以转化为一个向量表示,相比于词袋模型,每个词汇的表征更加详细,从而更好的处理NLP任务,甚至是一些类似的问题,如生物信息下的疾病诊断问题、推荐系统的user和item表征问题等等。

word2vector应该是比较有代表性的神经网络语言模型——NNLM,在神经网络的加持下,表征更加丰富,同时,也可以更直接地接入深度学习模型,后续有了TextCNN等更加高级的深度学习模型,在特定任务下有了新的突破。

我曾经写过word2vector和GloVe的一些自己的看法,有兴趣也可以看看。

预训练模型的启蒙

词向量模型虽然你能体现更丰富的含义,但是由于最终的产出说白了就是个词典,固定的,没法灵活的处理各种语境,如“苹果电脑价格”,和“苹果多少钱一斤”,两个苹果显然不是一个含义,只用一个词向量肯定无法cover这种情况,而解决这个问题的核心思路,就是要考虑上下文语境,要考虑上下文语境,一般有两个思路,一个是通过CNN来考虑N-Gram情况,另一个就是RNN系来看上下文。

没错,我想提的是具有一定里程碑意义的ELMo。

ELMo火的并不长久,但是我愿意将他成为一个里程碑,就是因为它充分考虑了上下文,这里的充分,体现在下面几个点:

  • 序列模型用的是LSTM,具有强于RNN的记忆力和整合能力。

  • 序列模型使用的是双向,充分体现了真、上下文。

  • 多层BiLSTM堆叠,并将每层信息均拿出来拼接输出,能体现不同维度的特征。

另外,这里也开始体现multitask的思想,从词典的概念脱离出来,此次输出的已经是一个模型,这个模型后面可以根据需求接入不同的结构,从而完成各种各样的任务,这个思路虽然在GPT中才被详细谈到,但是我认为ELMo可以说是预训练思路的启蒙。

Transformer带来的进步

Transformer中的Attention结构为机器翻译问题带来新的进步,而由于语言模型与机器翻译问题的相似性(seq2seq结构),Transformer被引入到了语言模型的训练中,从GPT开始,然后是非常出名的BERT,再然后是GPT2,甚至是albert,这一系列模型,尤其是BERT,推动了整个NLP的进步。

GPT发表在BERT之前,他应该是比较早开始使用Transformer的,论文不长,将整个框架分为无监督预训练和有监督微调,无监督预训练主要用于进行初步语言模型的建立,有监督微调是在无监督与训练下,根据实际问题来调整下游结构,跟着下游结构训练微调上游语言模型,从而使预训练模型能特异性。在这里,提出了预训练模型的结构。

BERT被很多人吹了好多次,说实话,值得吹,但是吹完之后还是要静下心来看看他厉害在哪:

  • 双向Transformer,比GPT提升了不少,且上下文信息共享,注意ELMo的上文和下文信息是不共享的。

  • Mask的使用,防止信息泄露。

  • Next sentence prediction辅助训练。

GPT2.0之所以是2.0,是指在GPT基础上有了更新,当然也是和BERT产生了区别。而现在主要就是看与BERT所不同的,GPT用的是Transformer的Decoder模块,BERT用的是Encoder模块,另外对BERT中的transformer进行了扩容,体积变大,存储的信息变多,当然,需要的数据量和时间也更多(有钱任性,但是没见过时间上的富有啊),似乎是在和BERT刚吧,另外GPT2.0依旧使用单向模型,在一定数据量级别下就能打败BERT,这里似乎有点有意思的东西。

Albert宣称是BERT的缩小版,其实也反映了一个反面却很真实的现象,那就是数据量越大,模型越大,预测效果似乎就更好,没有过拟合的现象(其实说白了现在的表征还不够厉害,还没看到瓶颈),那么,现在Albert其实也是旨在缩小体积,主要策略是:

  • Factorized Embedding Parameterization,矩阵分解的方式缩小进入预训练模型前的词向量。

  • 每层共享参数。这个共享参数的思路,不知道是不是从ELMo中借鉴的。

  • 把自己前辈BERT的下一句预测更新为顺序判断。

T5好像也是谷歌提出的吧,这篇论文的长度很客观,我的理解这篇论文其实是在实验各种语言模型的trick的组合对结果的影响,从而找到这些trick组合得到的最佳模型,也为现在出现的模型整理了一个框架,个人感觉贡献大的点就在于此,结果来看,BERT风格(双向transformer)打败了左至右的语言模型(language modeling)和全破坏的语言结构(deshuffling),而在破坏策略上,mask和drop都不如replace span强(确实没想到被玩出花的mask居然输了),另外在破坏比例和破坏长度上也有了较好的参考值。

新的尝试和思考

如果一个方法被一直研究,那终究会有天花板或者瓶颈,如果是有多种尝试,才能保证长期健康的发展,各位研究者的工作也是这么做的,这里提两个,一个是XLNet,一个ELECTRA。

XLNet跳出了autoencoding的思路,即AE,而尝试从语言模型底层的另一个思路——autoregression,即AR,现在在AE方兴未艾,作者提出的XLNet其实考虑把两者的优势结合起来。作者认为AE,尤其是BERT,两个训练模式由于Mask的存在会出现模型不一致的情况,另外Mask的单词的关系既有可能是相关的,也有可能是无关的,另外,AR则无法像AE那样充分考虑上文和下文之间组合的关系(ELMo只是简单的拼接)。考虑AE模型中的核心问题在于mask,而AR里面缺少的就是上下文拼接,因此,把mask替换为AR模型,即构建encoder+AR结构,似乎就能兼顾两者优点,事实上XLNet就是这么干的,即通过随机组合特定位置附近的词组,构建成为模型输入,具体的,这个改变是在Transformer中完成,而非整体大模型下的输入端完成。(em,我感觉说的不是很好,我下面多给点参考资料吧)

ELECTRA论文的图和公式,其实就能看到是用的GAN模式了,虽然内核还是有BERT,但是大的架构可以说是发生了质变,先抛开结果不论,这个结构的提出还是非常值得称赞的,G部分用的是B-BERT(其他小模型也可)来对输入句子进行修改,然后用D来判断这个位置是否被判断,但是呢,和GAN还是有核心的不同的(所以我才说是GAN模式,而不是直截了当的说GAN):

  • G生成的token是真实的token,不是假的。

  • G的训练不是为了欺骗D,用的是极大似然,两者训练并非联合(大家老是爱说最大似然,直接翻译,但是我感觉用极大似然更为严谨,毕竟求出来的并不一定就是最大值,除非问题的分布被证明是凸的)。

另外,论文里面还有借助强化学习的思想进行尝试的,这些思路都很有意思,大家可以在论文里面看看啦。

小结

看完这些论文,我的结论有下面这些:

  • 在BERT系列出来后,一个很明显的现象是扩大数据量和模型容量,结果在目前的算力下能不断提升,不见瓶颈,这个就有点可怕了,但是,大型模型不见得是用于现在的全部场景,所以word2vec甚至是TF-IDF之类的方法仍是首先应该尝试的方案,说白了,有钱人的快乐不是每个人都承受得起的。

  • BERT从一个主模型,有变成了一块积木的趋势,或者更应该说是Transformer变成了一块扎实的积木,体现上下文。

  • 参数共享,似乎是很有用的一个trick。

  • Position embedding在transformer里面被提到,但是在上述论文里提到的并不多,不知道是效果不行还是太简单了大家都不说了额,个人感觉句子的位置信息还挺有用的吧。

  • unsupervise pre-training->fine tuning成为现在使用的一种基本模式。

  • 各种迭代下来,虽说有提升而且很多,但是具体多能多到多少呢,其实没那么大,以XLNet论文里和BERT的对比为例,F1从93.16到95.08,这么看起来还大不,其实在个人经验的角度看,如果是只有这点提升,其实还不如通过规则来尝试,或者是直接干其他事情,对于一些,花费10分的精力已经能提升到90分的事情,没必要再花90精力再提升10分,具体问题具体分析吧,多花时间在精炼模型上,可能更好一些。

参考文献

原始论文材料

  • ELMo:Deep contextualized word representations

  • GPT:Improving Language Understanding by Generative Pre-Training

  • GPT2:Language Models are Unsupervised Multitask Learners

  • BERT:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

  • albert:ALBERT: A LITE BERT FOR SELF-SUPERVISEDLEARNING OF LANGUAGE REPRESENTATIONS

  • T5:Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer

  • XLNet:XLnet: Generalized Autoregressive Pretraining for Language Understanding

  • ELECTRA:ELECTRA: PRE-TRAINING TEXT ENCODERS AS DIS-CRIMINATORS RATHER THAN GENERATORS。

另外一些辅助阅读的材料:

ELMo

  • https://www.cnblogs.com/huangyc/p/9860430.html

  • https://zhuanlan.zhihu.com/p/63115885

GPT&GPT2:

  • https://zhuanlan.zhihu.com/p/69290203

  • https://www.jiqizhixin.com/articles/2019-09-03-14?from=synced&keyword=GPT

BERT:

  • https://zhuanlan.zhihu.com/p/46652512

  • https://zhuanlan.zhihu.com/p/51762599

albert:

  • https://zhuanlan.zhihu.com/p/88099919

T5:

  • https://zhuanlan.zhihu.com/p/88438851

XLNet:

  • https://blog.csdn.net/weixin_37947156/article/details/93035607

  • https://blog.csdn.net/u012526436/article/details/93196139

ELECTRA:

  • https://zhuanlan.zhihu.com/p/89763176


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存