最近两天在补习Transformer,ELMo,BERT,在知乎上看到一篇文章把这些全部串起来讲的极其清晰,且构思缜密,逻辑精湛,强烈建议大家去看原文*《从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史》*https://zhuanlan.zhihu.com/p/49271699 全程干货,感谢原作者给予大腿!
本文以学习笔记为主,如有不足,欢迎指正。
BERT —— 近两年NLP重大进展的集大成者
- 刷新了很多NLP任务的最好性能
- 绝大部分NLP任务都可以采用类似的两阶段模式直接去提升效果
图像领域的预训练
神经网络的预训练得从图像领域说起,毕竟现在姹紫嫣红的几大CNN网络都是在海量数据训练后发布出来,被ML各界小弟众星捧月般,用problem-dependent的数据集进行Fine-tuning的。
- 特征有层级结构,越是底层的特征,越是不论什么领域的图像都会具备的,比如边,角,弧线等,越往上的特征越是problem dependent
- 先用通用的大数据集(如ImageNet)进行预训练,再用手头问题的小数据集(problem dependent data)进行高层网络的fine-tuning,底层网络的特征抽取部分就可以不动。
Word Embedding —— 陈年老账,馥郁芳香
单词Wi用Onehot编码,之后乘以矩阵Q后获得向量C(Wi),每个单词的C(Wi)拼接,上接隐层,然后接softmax去预测后面应该后续接哪个单词。这个C(Wi)是什么?这其实就是单词对应的Word Embedding值。矩阵Q包含V行,V代表词典大小,每一行内容代表对应单词的Word embedding值。只不过Q的内容也是网络参数,需要学习获得,训练刚开始用随机值初始化矩阵Q,当这个网络训练好之后,矩阵Q的内容被正确赋值,每一行代表一个单词对应的Word embedding值。
于是这个用于语言模型任务的网络就有了个副产品。
(PS:这个模型出品于2003年,只感叹生不逢时,怀才不遇,蛰伏十年,直到2013年时来运转,深度学习大火才绝处逢生)
Word2Vec
- 网络结构与NNLM相似,但训练方法不一样。NNLM主要训练目的是语言模型,embedding仅仅是个无心插柳的副产品,但Word2Vec单纯就是要embedding的,所以他的训练方式可以完全针对拿到好的embedding
- CBOW:从一个句子里把一个词扣掉,要求网络预测被扣掉的词
- Skip-gram:输入某个单词,要求网络预测它的上下文单词
- 典型用法:one-hot层到embedding层的权重矩阵其实就是那个Q,可以用与训练好的Q初始化权重矩阵,之后选择frozen还是fine-tuning。
- 但存在问题:多义词。Embedding对同一个单词的编码区分不开它的多重含义。尽管训练的时候上下文单词不同,但是同一单词不同语义的上下文信息都会编码到同一个embedding中。
- Static embedding:每个单词的embedding表达是固定的,在调用的时候不会根据上下文场景的变化而改变
ELMo —— 简洁优雅的解决多义词问题
a) ELMO是“Embedding from Language Models”的简称,其实这个名字并没有反应它的本质思想,提出ELMO的论文题目:“Deep contextualized word representation”更能体现其精髓。
b) Dynamic tuning of word embedding
我先学好一个static embedding,在使用的时候,根据这个单词的上下文调整它自己的embedding,这样就能表达它在上下文中的含义。
c) 采取两阶段训练过程
第一阶段利用语言模型进行预训练,第二阶段在做下游任务时,从预训练网络中提取对应单词网络各层的Word embedding作为新特征。正向和反向LSTM的embedding直接concatenate。第一层句法信息更多,第二层语义信息更多。
d) 如何使用
输入的句子先通过ELMo网络,这样每个单词都获得了三个embedding,之后给予这三个embedding权重(这个权重可以学习),累加求和,整合成最后的embedding。
e) Feature-based Pre-Training
ELMo给下游任务提供的是每个单词的特征形式。
f) 弱点
- LSTM抽取特征能力远弱于Transformer
- 正向反向LSTM隐层以拼接的方式融合特征,融合能力偏弱(只是一种怀疑,没有实验证明)
GPT —— Fine-tuning模式的开创者
- 单项语言模型:利用语言模型进行预训练,但预测一个词时只能看到它的context-before
- 第二阶段的使用:做下游任务时,网络结构需要与GTP看齐,先用与训练好的参数初始化GPT网络。改造很方便,只需要在输入部分施工即可。
- 弱点:把语言模型改造成双向的就好了。
BERT —— 大红大紫,普度众生
a) 预训练
采用双向语言模型(有文章说ELMo的还不算绝对的双向,因为是两个单项的拼接)
b) 下游任务的网络结构改造
- 句子关系类
输入:加start,end,两个句子之间加分隔符;输出:在start对应的Transformer最后一层上加softmax分类层 - 句子分类
输入:加start,end;输出:在start对应的Transformer最后一层上加softmax分类层 - 序列标注
输入:加start,end;输出:Transformer最后一层的每个单词对应位置加softmax分类 - 阅读理解(QA)
输入:加start,end,question和paragraph之间加分隔符;输出:paragraph的每个单词对应的Transformer最后一层输出上加softmax分类(start/end/spam)
c) 融合众派高法,且预训练是一个多任务过程
- Masked LM:本质思想是CBOW以及完形填空。
- Next Sentence Prediction:因为语言模型单词粒度的训练到不了句子关系这个层级,增加这个任务有助于下游句子关系类的任务。
d) 输入部分处理
- 句子通过分隔符分割,开头结尾都有标识符号。
- 每个单词有三个embedding:1)本身的embedding;2)positional embedding;3)sentence embedding,把句子整体的embedding给每个单词。三个embedding的叠加作为最终的输入。
结语
a) 未来两年NLP模式
- Transformer无处不在。
- 两阶段模型:超大规模预训练+具体任务Fine-tuning(具体任务网络结构需要与预训练网络结构类似)。
- 两阶段模型:超大规模预训练+具体任务特征补充(具体任务可以自由设计网络结构)。
b) 预训练能力觉醒的本质 —— 引入大量先验语言学知识
- 利用了大量无标注的自然语言文本。
- 当手头任务标注信息有限时,很多语言学现象覆盖不到,泛化能力就弱。先验语言学特征集成了大量通用知识增强模型泛化能力。
- 如何引入先验的语言学知识其实一直是NLP尤其是深度学习场景下的NLP的主要目标之一,不过一直没有太好的解决办法,而ELMO/GPT/Bert的这种两阶段模式看起来无疑是解决这个问题简洁优雅的办法。
c) 当前NLP发展方向
- 更强的特征抽取器。
- 如何优雅地引入大量无监督数据中包含的语言学知识(这里更强调优雅而不是引入)。
来源:本文图片来自 https://zhuanlan.zhihu.com/p/49271699