专栏名称: 达观数据
达观数据是全球领先的文本智能处理专家,为企业提供完善的文本挖掘、知识图谱、搜索引擎和个性化推荐等大数据服务,是国内唯一一家将自动语义分析技术应用于企业数据化运营的人工智能公司。
目录
相关文章推荐
科技美学官方  ·  iPhone 17 Pro模具:玻璃+金属拼接设计 ·  11 小时前  
阜阳新闻综合频道  ·  绿色食品“智”造升级!颍东企业与阜师大联手破 ... ·  11 小时前  
上饶新闻  ·  太突然!淘宝宣布:可直接拒绝! ·  23 小时前  
上饶新闻  ·  太突然!淘宝宣布:可直接拒绝! ·  23 小时前  
李楠或kkk  ·  elon musk ... ·  昨天  
51好读  ›  专栏  ›  达观数据

从Word Embedding到Bert模型——自然语言处理预训练技术发展史

达观数据  · 公众号  ·  · 2018-11-28 17:33

正文

A

BOUT

关于作者

张俊林: 中国中文信息学会理事,目前在新浪微博 AI Lab 担任资深算法专家。在此之前,张俊林曾经在阿里巴巴任资深技术专家,以及在百度和用友担任技术经理及技术总监等职务。同时他是技术书籍《这就是搜索引擎:核心技术详解》(该书荣获全国第十二届输出版优秀图书奖)、《大数据日知录:架构与算法》的作者。


Bert 最近很火,应该是最近最火爆的 AI 进展,网上的评价很高,那么 Bert 值得这么高的评价吗?我个人判断是值得。那为什么会有这么高的评价呢?是因为它有重大的理论或者模型创新吗?其实并没有,从模型创新角度看一般,创新不算大。但是架不住效果太好了,基本刷新了很多 NLP 的任务的最好性能,有些任务还被刷爆了,这个才是关键。另外一点是 Bert 具备广泛的通用性,就是说绝大部分 NLP 任务都可以采用类似的两阶段模式直接去提升效果,这个第二关键。 客观的说,把 Bert 当做最近两年 NLP 重大进展的集大成者更符合事实。

本文的主题是自然语言处理中的预训练过程,会大致说下 NLP 中的预训练技术是一步一步如何发展到 Bert 模型的,从中可以很自然地看到 Bert 的思路是如何逐渐形成的,Bert 的历史沿革是什么,继承了什么,创新了什么,为什么效果那么好,主要原因是什么,以及为何说模型创新不算太大,为何说 Bert 是近年来 NLP 重大进展的集大成者。

我们一步一步来讲,而串起来这个故事的脉络就是自然语言的预训练过程,但是落脚点还是在 Bert 身上。要讲自然语言的预训练,得先从图像领域的预训练说起。

图像领域的预训练

自从深度学习火起来后,预训练过程就是做图像或者视频领域的一种比较常规的做法,有比较长的历史了,而且这种做法很有效,能明显促进应用的效果。

那么图像领域怎么做预训练呢,上图展示了这个过程, 我们设计好网络结构以后,对于图像来说一般是 CNN 的多层叠加网络结构,可以先用某个训练集合比如训练集合 A 或者训练集合 B 对这个网络进行预先训练 ,在 A 任务上或者B任务上学会网络参数,然后存起来以备后用。

假设我们面临第三个任务 C,网络结构采取相同的网络结构,在比较浅的几层 CNN 结构,网络参数初始化的时候可以加载 A 任务或者 B 任务学习好的参数,其它 CNN 高层参数仍然随机初始化。之后我们用 C 任务的训练数据来训练网络,此时有两种做法,一种是浅层加载的参数在训练 C 任务过程中不动,这种方法被称为“Frozen”;另外一种是底层网络参数尽管被初始化了,在 C 任务训练过程中仍然随着训练的进程不断改变,这种一般叫“Fine-Tuning”,顾名思义,就是更好地把参数进行调整使得更适应当前的 C 任务。一般图像或者视频领域要做预训练一般都这么做。

这么做有几个好处,首先,如果手头任务 C 的训练集合数据量较少的话,现阶段的好用的 CNN 比如 Resnet/Densenet/Inception 等网络结构层数很深,几百万上千万参数量算起步价,上亿参数的也很常见,训练数据少很难很好地训练这么复杂的网络,但是如果其中大量参数通过大的训练集合比如 ImageNet 预先训练好直接拿来初始化大部分网络结构参数,然后再用 C 任务手头比较可怜的数据量上 Fine-tuning 过程去调整参数让它们更适合解决 C 任务,那事情就好办多了。

这样原先训练不了的任务就能解决了,即使手头任务训练数据也不少,加个预训练过程也能极大加快任务训练的收敛速度,所以这种预训练方式是老少皆宜的解决方案,另外疗效又好,所以在做图像处理领域很快就流行开来。

那么新的问题来了,为什么这种预训练的思路是可行的?

目前我们已经知道,对于层级的 CNN 结构来说,不同层级的神经元学习到了不同类型的图像特征,由底向上特征形成层级结构,如上图所示,如果我们手头是个人脸识别任务,训练好网络后,把每层神经元学习到的特征可视化肉眼看一看每层学到了啥特征,你会看到最底层的神经元学到的是线段等特征,图示的第二个隐层学到的是人脸五官的轮廓,第三层学到的是人脸的轮廓,通过三步形成了特征的层级结构,越是底层的特征越是所有不论什么领域的图像都会具备的比如边角线弧线等底层基础特征,越往上抽取出的特征越与手头任务相关。

正因为此, 所以预训练好的网络参数,尤其是底层的网络参数抽取出特征跟具体任务越无关,越具备任务的通用性, 所以这是为何一般用底层预训练好的参数初始化新任务网络参数的原因。 而高层特征跟任务关联较大,实际可以不用使用,或者采用 Fine-tuning 用新数据集合清洗掉高层无关的特征抽取器。

般我们喜欢用 ImageNet 来做网络的预训练,主要有两点,一方面 ImageNet 是图像领域里有超多事先标注好训练数据的数据集合,分量足是个很大的优势,量越大训练出的参数越靠谱;另外一方面因为 ImageNet 有 1000 类,类别多,算是通用的图像数据,跟领域没太大关系,所以通用性好,预训练完后哪哪都能用,是个万金油。分量足的万金油当然老少通吃,人人喜爱。

听完上述话,如果你是具备研究素质的人,也就是说具备好奇心,你一定会问下面这个问题:“既然图像领域预训练这么好用,那干嘛自然语言处理不做这个事情呢?是不是搞 NLP 的人比搞 CV 的傻啊?就算你傻,你看见人家这么做,有样学样不就行了吗?这不就是创新吗,也许能成,万一成了,你看,你的成功来得就是这么突然!”

嗯,好问题,其实搞 NLP 的人一点都不比你傻,早就有人尝试过了,不过总体而言不太成功而已。听说过 word embedding 吗?2003 年出品,陈年技术,馥郁芳香。word embedding 其实就是 NLP 里的早期预训练技术。当然也不能说 word embedding 不成功,一般加到下游任务里,都能有 1 到 2 个点的性能提升,只是没有那么耀眼的成功而已。

没听过?那下面就把这段陈年老账讲给你听听。

Word Embedding 考古史

这块大致讲讲 Word Embedding 的故事,很粗略,因为网上关于这个技术讲的文章太多了,汗牛冲动,我不属牛,此刻更没有流汗,所以其实丝毫没有想讲 Word Embedding 的冲动和激情,但是要说预训练又得从这开始,那就粗略地讲讲,主要是引出后面更精彩的部分。在说 Word Embedding 之前,先更粗略地说下语言模型,因为一般 NLP 里面做预训练一般的选择是用语言模型任务来做。

什么是语言模型?其实看上面这张 PPT 上扣下来的图就明白了,为了能够量化地衡量哪个句子更像一句人话,可以设计如上图所示函数,核心函数 P 的思想是根据句子里面前面的一系列前导单词预测后面跟哪个单词的概率大小(理论上除了上文之外,也可以引入单词的下文联合起来预测单词出现概率)。 句子里面每个单词都有个根据上文预测自己的过程,把所有这些单词的产生概率乘起来,数值越大代表这越像一句人话 。语言模型压下暂且不表,我隐约预感到我这么讲你可能还是不太会明白,但是大概这个意思,不懂的可以去网上找,资料多得一样地汗牛冲动。

假设现在让你设计一个神经网络结构,去做这个语言模型的任务,就是说给你很多语料做这个事情,训练好一个神经网络,训练好之后,以后输入一句话的前面几个单词,要求这个网络输出后面紧跟的单词应该是哪个,你会怎么做?

你可以像上图这么设计这个网络结构,这其实就是大名鼎鼎的中文人称“神经网络语言模型”,英文小名 NNLM 的网络结构,用来做语言模型。这个工作有年头了,是个陈年老工作,是 Bengio 在 2003 年发表在 JMLR 上的论文。它生于 2003,火于 2013,以后是否会不朽暂且不知,但是不幸的是出生后应该没有引起太大反响,沉寂十年终于时来运转沉冤得雪,在 2013 年又被 NLP 考古工作者从海底湿淋淋地捞出来了祭入神殿。

为什么会发生这种技术奇遇记?你要想想 2013 年是什么年头,是深度学习开始渗透 NLP 领域的光辉时刻,万里长征第一步,而 NNLM 可以算是南昌起义第一枪。在深度学习火起来之前,极少有人用神经网络做 NLP 问题,如果你 10 年前坚持用神经网络做 NLP,估计别人会认为你这人神经有问题。所谓红尘滚滚,谁也挡不住历史发展趋势的车轮,这就是个很好的例子。

上面是闲话,闲言碎语不要讲,我们回来讲一讲 NNLM 的思路。先说训练过程,现在看其实很简单,见过 RNN、LSTM、CNN 后的你们回头再看这个网络甚至显得有些简陋。学习任务是输入某个句中 单词前面句子的 t-1 个单词,要求网络正确预测单词 Bert,即最大化:

前面任意单词 用Onehot编码(比如:0001000)作为原始单词输入,之后乘以矩阵 Q 后获得向量 ,每个单词的 拼接,上接隐层,然后接 softmax 去预测后面应该后续接哪个单词。这个 是什么? 这其实就是单词对应的 Word Embedding 值,那个矩阵 Q 包含 V 行,V 代表词典大小,每一行内容代表对应单词的 Word embedding 值。 只不过 Q 的内容也是网络参数,需要学习获得,训练刚开始用随机值初始化矩阵 Q,当这个网络训练好之后,矩阵 Q 的内容被正确赋值,每一行代表一个单词对应的 Word embedding 值。

所以你看,通过这个网络学习语言模型任务,这个网络不仅自己能够根据上文预测后接单词是什么,同时获得一个副产品,就是那个矩阵 Q,这就是单词的 Word Embedding 是被如何学会的。


2013 年最火的用语言模型做 Word Embedding 的工具是 Word2Vec,后来又出了 Glove,Word2Vec 是怎么工作的呢?看下图。

Word2Vec 的网络结构其实和 NNLM 是基本类似的,只是这个图长得清晰度差了点,看上去不像,其实它们是亲兄弟。不过这里需要指出:尽管网络结构相近,而且也是做语言模型任务,但是其训练方法不太一样。Word2Vec 有两种训练方法, 一种叫 CBOW ,核心思想是从一个句子里面把一个词抠掉,用这个词的上文和下文去预测被抠掉的这个词; 第二种叫做 Skip-gram ,和 CBOW 正好反过来,输入某个单词,要求网络预测它的上下文单词。

而你回头看看,NNLM 是怎么训练的?是输入一个单词的上文,去预测这个单词。这是有显著差异的。为什么 Word2Vec 这么处理?原因很简单,因为 Word2Vec 和 NNLM 不一样,NNLM 的主要任务是要学习一个解决语言模型任务的网络结构,语言模型就是要看到上文预测下文,而 word embedding 只是无心插柳的一个副产品。但是 Word2Vec 目标不一样,它单纯就是要 word embedding 的,这是主产品,所以它完全可以随性地这么去训练网络。

为什么要讲 Word2Vec 呢?这里主要是要引出 CBOW 的训练方法,BERT 其实跟它有关系,后面会讲它们之间是如何的关系,当然它们的关系 BERT 作者没说,是我猜的,至于我猜的对不对,后面你看后自己判断。

使用 Word2Vec 或者 Glove,通过做语言模型任务,就可以获得每个单词的 Word Embedding,那么这种方法的效果如何呢?上图给了网上找的几个例子,可以看出有些例子效果还是很不错的,一个单词表达成 Word Embedding 后,很容易找出语义相近的其它词汇。

我们的主题是预训练,那么问题是 Word Embedding 这种做法能算是预训练吗?这其实就是标准的预训练过程。要理解这一点要看看学会 Word Embedding 后下游任务是怎么用它的。

假设如上图所示,我们有个 NLP 的下游任务,比如 QA,就是问答问题,所谓问答问题,指的是给定一个问题 X,给定另外一个句子 Y, 要判断句子 Y 是否是问题 X 的正确答案。问答问题假设设计的网络结构如上图所示,这里不展开讲了,懂得自然懂,不懂的也没关系,因为这点对于本文主旨来说不关键,关键是网络如何使用训练好的 Word Embedding 的。

它的使用方法其实和前面讲的 NNLM 是一样的, 句子中每个单词以 Onehot 形式作为输入,然后乘以学好的 Word Embedding 矩阵 Q,就直接取出单词对应的 Word Embedding 了。 这乍看上去好像是个查表操作,不像是预训练的做法是吧?其实不然,那个 Word Embedding 矩阵 Q 其实就是网络 Onehot 层到 embedding 层映射的网络参数矩阵。

所以你看到了,使用 Word Embedding 等价于什么? 等价于把 Onehot 层到 embedding 层的网络用预训练好的参数矩阵 Q 初始化了。 这跟前面讲的图像领域的低层预训练过程其实是一样的,区别无非 Word Embedding 只能初始化第一层网络参数,再高层的参数就无能为力了。下游 NLP 任务在使用 Word Embedding 的时候也类似图像有两种做法:

  • 一种是 Frozen,就是 Word Embedding 那层网络参数固定不动;

  • 另外一种是 Fine-Tuning,就是 Word Embedding 这层参数使用新的训练集合训练也需要跟着训练过程更新掉。

上面这种做法就是 18 年之前 NLP 领域里面采用预训练的典型做法,之前说过,Word Embedding 其实对于很多下游 NLP 任务是有帮助的,只是帮助没有大到闪瞎忘记戴墨镜的围观群众的双眼而已。那么新问题来了,为什么这样训练及使用 Word Embedding 的效果没有期待中那么好呢?答案很简单,因为 Word Embedding 有问题呗。这貌似是个比较弱智的答案,关键是 Word Embedding 存在什么问题?这其实是个好问题。

这片在 Word Embedding 头上笼罩了好几年的乌云是什么?是多义词问题。我们知道,多义词是自然语言中经常出现的现象,也是语言灵活性和高效性的一种体现。多义词对 Word Embedding 来说有什么负面影响?

如上图所示,比如多义词 Bank,有两个常用含义,但是 Word Embedding 在对 bank 这个单词进行编码的时候,是区分不开这两个含义的,因为它们尽管上下文环境中出现的单词不同,但是在用语言模型训练的时候,不论什么上下文的句子经过 word2vec,都是预测相同的单词 bank,而同一个单词占的是同一行的参数空间,这导致两种不同的上下文信息都会编码到相同的 word embedding 空间里去。 所以 word embedding 无法区分多义词的不同语义,这就是它的一个比较严重的问题。

你可能觉得自己很聪明,说这可以解决啊,确实也有很多研究人员提出很多方法试图解决这个问题,但是从今天往回看,这些方法看上去都成本太高或者太繁琐了,有没有简单优美的解决方案呢?

ELMO 提供了一种简洁优雅的解决方案。

从 Word Embedding 到 ELMO

ELMO 是“Embedding from Language Models”的简称,其实这个名字并没有反应它的本质思想,提出ELMO的论文题目:“Deep contextualized word representation”更能体现其精髓,而精髓在哪里?在 deep contextualized 这个短语,一个是 deep,一个是 context,其中 context 更关键。在此之前的 Word Embedding 本质上是个静态的方式,所谓静态指的是训练好之后每个单词的表达就固定住了,以后使用的时候,不论新句子上下文单词是什么,这个单词的 Word Embedding 不会跟着上下文场景的变化而改变,所以对于比如 Bank 这个词,它事先学好的 Word Embedding 中混合了几种语义,在应用中来了个新句子,即使从上下文中(比如句子包含 money 等词)明显可以看出它代表的是「银行」的含义,但是对应的 Word Embedding 内容也不会变,它还是混合了多种语义。这是为何说它是静态的,这也是问题所在。

ELMO 的本质思想是:我事先用语言模型学好一个单词的 Word Embedding,此时多义词无法区分,不过这没关系。在我实际使用 Word Embedding 的时候,单词已经具备了特定的上下文了,这个时候我可以根据上下文单词的语义去调整单词的 Word Embedding 表示,这样经过调整后的 Word Embedding 更能表达在这个上下文中的具体含义,自然也就解决了多义词的问题了。 所以 ELMO 本身是个根据当前上下文对 Word Embedding 动态调整的思路。

ELMO 采用了典型的两阶段过程,第一个阶段是利用语言模型进行预训练;第二个阶段是在做下游任务时,从预训练网络中提取对应单词的网络各层的 Word Embedding 作为新特征补充到下游任务中。

上图展示的是其预训练过程,它的网络结构采用了双层双向 LSTM,目前语言模型训练的任务目标是根据单词 的上下文去正确预测单词 之前的单词序列 Context-before 称为上文,之后的单词序列 Context-after 称为下文。图中左端的前向双层LSTM代表正方向编码器,输入的是从左到右顺序的除了预测单词外 的上文 Context-before;右端的逆向双层 LSTM 代表反方向编码器,输入的是从右到左的逆序的句子下文 Context-after;每个编码器的深度都是两层 LSTM 叠加。这个网络结构其实在 NLP 中是很常用的。

使用这个网络结构利用大量语料做语言模型任务就能预先训练好这个网络,如果训练好这个网络后,输入一个新句子 ,句子中每个单词都能得到对应的三个Embedding:最底层是单词的 Word Embedding,往上走是第一层双向 LSTM中对应单词位置的 Embedding,这层编码单词的句法信息更多一些;再往上走是第二层 LSTM 中对应单词位置的 Embedding,这层编码单词的语义信息更多一些。 也就是说,ELMO 的预训练过程不仅仅学会单词的 Word Embedding,还学会了一个双层双向的 LSTM 网络结构,而这两者后面都有用。

上面介绍的是 ELMO 的第一阶段:预训练阶段。那么预训练好网络结构后,如何给下游任务使用呢?上图展示了下游任务的使用过程,比如我们的下游任务仍然是 QA 问题,此时对于问句 X,我们可以先将句子 X 作为预训练好的 ELMO 网络的输入,这样句子 X 中每个单词在 ELMO 网络中都能获得对应的三个 Embedding,之后给予这三个 Embedding 中的每一个 Embedding 一个权重 a,这个权重可以学习得来,根据各自权重累加求和,将三个 Embedding 整合成一个。

然后将整合后的这个 Embedding 作为 X 句在自己任务的那个网络结构中对应单词的输入,以此作为补充的新特征给下游任务使用。对于上图所示下游任务 QA 中的回答句子 Y 来说也是如此处理。

因为 ELMO给下游提供的是每个单词的特征形式,所以这一类预训练的方法被称为“Feature-based Pre-Training”。至于为何这么做能够达到区分多义词的效果,你可以想一想,其实比较容易想明白原因。


上面这个图是 TagLM 采用类似 ELMO 的思路做命名实体识别任务的过程,其步骤基本如上述 ELMO 的思路,所以此处不展开说了。TagLM 的论文发表在 2017 年的 ACL 会议上,作者就是 AllenAI 里做 ELMO 的那些人,所以可以将 TagLM 看做 ELMO 的一个前导工作。前几天这个 PPT 发出去后有人质疑说 FastAI 的在 18 年 4 月提出的 ULMFiT 才是抛弃传统 Word Embedding 引入新模式的开山之作,我深不以为然。

首先 TagLM 出现的更早而且模式基本就是 ELMO 的思路;另外 ULMFiT 使用的是三阶段模式,在通用语言模型训练之后,加入了一个领域语言模型预训练过程,而且论文重点工作在这块,方法还相对比较繁杂,这并不是一个特别好的主意,因为领域语言模型的限制是它的规模往往不可能特别大,精力放在这里不太合适,放在通用语言模型上感觉更合理;再者,尽管 ULFMiT 实验做了 6 个任务,但是都集中在分类问题相对比较窄,不如 ELMO 验证的问题领域广,我觉得这就是因为第二步那个领域语言模型带来的限制。所以综合看,尽管 ULFMiT 也是个不错的工作,但是重要性跟 ELMO 比至少还是要差一档,当然这是我个人看法。

每个人的学术审美口味不同,我个人一直比较赞赏要么简洁有效体现问题本质要么思想特别游离现有框架脑洞开得异常大的工作,所以 ULFMiT 我看论文的时候就感觉看着有点难受,觉得这工作没抓住重点而且特别麻烦,但是看 ELMO 论文感觉就赏心悦目,觉得思路特别清晰顺畅,看完暗暗点赞,心里说这样的文章获得 NAACL2018 最佳论文当之无愧,比 ACL 很多最佳论文也好得不是一点半点,这就是好工作带给一个有经验人士的一种在读论文时候就能产生的本能的感觉,也就是所谓的这道菜对上了食客的审美口味。

前面我们提到静态 Word Embedding 无法解决多义词的问题,那么 ELMO 引入上下文动态调整单词的 embedding 后多义词问题解决了吗?解决了,而且比我们期待的解决得还要好。

上图给了个例子,对于 Glove 训练出的 Word Embedding 来说,多义词比如 play,根据它的 embedding 找出的最接近的其它单词大多数集中在体育领域,这很明显是因为训练数据中包含 play 的句子中体育领域的数量明显占优导致;而使用 ELMO,根据上下文动态调整后的 embedding 不仅能够找出对应的「演出」的相同语义的句子,而且还可以保证找出的句子中的 play 对应的词性也是相同的,这是超出期待之处。之所以会这样,是因为我们上面提到过,第一层 LSTM 编码了很多句法信息,这在这里起到了重要作用。

ELMO 经过这般操作,效果如何呢?实验效果见上图,6 个 NLP 任务中性能都有幅度不同的提升,最高的提升达到 25% 左右, 而且这 6 个任务的覆盖范围比较广,包含句子语义关系判断,分类任务,阅读理解等多个领域,这说明其适用范围是非常广的,普适性强,这是一个非常好的优点。

那么站在现在这个时间节点看,ELMO 有什么值得改进的缺点呢?







请到「今天看啥」查看全文