作为一个NLPer,是时候跟你们介绍一下谁是真正的ELMo与Bert啦....
是的...它们是两位来自「芝麻街」的美籍大明星...
好的...介绍完毕,
是不是真的很简单...晚安!
其实,本文到这里,"核心内容"就已经讲完啦...当然如果你还不困的话,可以继续往下看,应该会有助于睡眠的
...
上一篇文章,我们介绍词向量(1)--从word2vec到ELMo,关注的角度是从静态的词向量到动态的词向量(该篇属于旧闻新写,构思的时候还没出现Bert等跨时代的思想)...
时至今日,NLP已经进入了一个新的时代:大规模的预训练的语言模型,开始在NLP的各个研究领域的展现出其碾压一切的王者姿态。
因此,出现了这样的声音:
从2013年出现的word2vec到如今的Bert,一个显著的转变是:从仅仅预训练词向量来初始化NLP模型的第一层发展到预训练整个NLP模型,预训练关注的不再仅仅是单个词汇信息,而是还有句子级别的信息,从而帮助我们更好的抽取文本的语义信息。
ELMo模型的有哪些弱点呢?
后续不断提出一系列新的语言模型:ULM-fit、GPT、Bert等,正是针对以上两个弱点,从「特征抽取器」+「双向语言模型」两个方面去不断的改进优化。
简单的回顾一下Machine Learning领域几个典型的特征抽取器:
简单的回顾一下几种预训练语言模型:
ULM-fit是 Fast AI机构提出的一种将预训练的语言模型与具体的NLP任务进行的结合的一种方法。它不是具体的某种结构或模型,而是提出了一个语言模型和一个流程(process),用于针对各种具体的NLP任务(它主要是应用于文本分类问题中)。
特征提取器与 ELMo 相同也是使用LSTM,也使用单向的语言模型,基本思路也是预训练完成后在具体任务上进行 finetune,不同之处主要是:
ULM-fit 将预训练和 finetune 过程分为三个阶段:
GPT 是「Generative Pre-Training」的简称,从名字看其含义是指的生成式的预训练。
GPT 也采用两阶段过程,第一个阶段是利用语言模型进行预训练,第二阶段通过 Fine-tuning 的模式解决下游任务,由此NLP正式进入了两阶段时代:预训练语言模型+微调(fine-tuning)。
与ULM-fit相比,它的主要改进点是:利用了Transformer代替了LSTM作为语言模型的特征抽取器,来更好的捕获长距离语言结构,然后在进行具体任务有监督微调时使用了语言模型作为附属任务训练目标。
但有点可惜的是,成也萧何(Transformer)败萧何(Transformer)...
GPT只 使用的 Transformer 框架中的 Decoder,实际上还是训练了一种单向的语言模型--训练的任务是根据上文预测下一个单词,还是存在不能同时利用上下文信息的致命缺点。
但GPT的遗憾没有持续太久,仅仅四个月之后,Google提出了具有跨时代意义的预训练语言模型--Bert。
一个NLPer一定亲身经历过:Bert被放出来的那一周...席卷了NLP的社交圈子...引起的广泛的讨论...
它针对GP使用单向语言模型的不足,Bert使用双向 Transformer,并利用了双向的语言模型。
那么Bert仍然使用的是Transformer模型,那它是怎么解决语言模型只能利用一个方向的信息的问题呢?
答案是它的pretraining训练的不是普通的语言模型,而是Mask语言模型。
为何 BERT 能如此引人注目,主要由以下几个方面:
说BERT 是双向的语言模型结构,实质上是因为借助self-attention机制将序列中每一个词的信息之间交融在一块的模型。此外,借助Multi-Head结构获取了多种交融的方式。当然,这些特性是由Transformer的特殊结构决定的,后续计划单独介绍Bert的核心---最强特征抽取器Transformer。
而相应的在 ELMo 与 GPT 中,它们并没有用上这种交融模式,也就是它们本质上还是一个单向的模型,ELMo可能稍微好一点,因为其借助双向LSTM结构将两个单向模型的信息concat起来。
此外,由于Bert的通用性高+代码结构优雅,也是其能够迅速传播开来的主要原因之一...
目前,已经有很多Bert在各种框架下的高层封装工具包,可以更方便的让广大一线工人快速尝鲜...
我最早使用是bert-as-serving,几行代码即可:
https://github.com/hanxiao/bert-as-service/
# 安装bert-as-serving
conda create -n liuchaunfeng_python3 python=3.5
pip install tensorflow==1.10.1
#远程-服务器端
pip install bert-serving-server
#本地-客户端
pip install bert-serving-client
#在服务器端开启服务,指定服务的进程数量
nohup bert-serving-start -model_dir /data0/ml_code/bert_as_service/bert_model_cn/ -num_worker=10 >bert_as_service.log &
# 本地简单的调用Demo脚本
#coding:utf-8
from bert_serving.client import BertClient
bert = BertClient(ip='10.105.105.105')
a = bert.encode([u'中国男篮赢的世界杯冠军'])
print a[0].shape
# 返回一个768位的数组【句向量
https://kexue.fm/archives/6736
至此,NLP领域与词向量技术相关的知识算是大体讲完了,从word2vec到Bert基本上覆盖了所有的主流方法。当然,近期也不断提出了一些诸如Transformer XL、XLNet等新的方法,本质上还是对Bert的缝缝补补,不能算是夸时代的思想。此外,Transformer XL会在单独讲解Bert的特征抽取器Transformer的时候再放到一块比较。
当然,词向量除了在NLP领域被广泛的探究之外,在其它Machine Learning领域也有许多新颖的实践,后续还会结合词向量的思想,介绍一下其在推荐领域的一些尝试。
历史文章推荐