借鉴了水奈樾的随笔哦
自google在2018年10月底公布BERT在11项nlp任务中的卓越表现后,BERT(Bidirectional Encoder Representation from Transformers)就成为NLP领域大火、整个ML界略有耳闻的模型,网上相关介绍也很多,但很多技术内容太少,或是写的不全面半懂不懂,重复内容占绝大多数(来自百度的搜索)
词向量模型,
word2vec——>ELMo:
结果:上下文无关的static向量变成上下文相关的dynamic向量,比如苹果在不同语境vector不同。
操作:encoder操作转移到预训练产生词向量过程实现。
ELMo——>BERT:
结果:训练出的word-level向量变成sentence-level的向量,下游具体NLP任务调用更方便,修正了ELMo模型的潜在问题,。
操作:使用句子级负采样获得句子表示/句对关系,Transformer模型代替LSTM提升表达和时间上的效率,masked LM解决“自己看到自己”的问题
让我们来回顾一下Word2vector
word2vector可以把此映射到更高的空间上,这种映射是固定的,也就是语料库是怎么样的定义,vector就会是怎样的,,这种方法对于一些token来说,有着非常好的作用,比如说一些token对应的现实生活中的意义,电话--手机--座机
缺点也就暴露出来了,这种算法对于语料库的要求比较高,因为完整的预料才能训练出更准确地vector,一般中小公司是不会花时间和精力来搞这些的。
还要说的是,Word2vector
相当于一个奇数的N元语言模型,这样利用一层神经网络,计算softmax来获得预测词的概率,行程哥哥词映射到高维的向量表示。
ELMO
因为通常情况下,词语是结合前后相关的语境来定位意思的,ELMO使用BI-LSTM作为encoder模型,利用LSTM来记住词语前后文,联系相关token是一种相对于word2vector比较优化的方法,这样的话词语的向量就是dynamic的向量表示,
然而正向LSTM和逆向LSTM是分开训练的,l他们的结果从cat之后就是改词的向量表示,最后的loss function也是相加得到结果
另一个问题就是预测值很大程度上会预测出本身,一句话经过分词后为A,B,C,D,经过双层LSTM后可以出现要BCD,ACD,ABD,ABC,再经过训练后就会成为ACD,ABCD,ABCD,ABD,本身在第二个位置需要预测B结果B 已经出现了,所以很大程度上会出现自己预测自己的概率我曾经对于1000 条问答数据进行双向LSTM进行answer self conduct,可惜数据量比较小,存在同样的词接连出现很多次,这应该就是原因
BERT
类似完形填空,把需要预测的词用标记符号标记,这样就可以进行双向encoding了,
BERT利用了两个TRANSFORER
学习句子/句对关系表示,句子级负采样。首先给定的一个句子,下一句子正例(正确词),随机采样一句负例(随机采样词),句子级上来做二分类(即判断句子是当前句子的下一句还是噪声),类似word2vec的单词级负采样
这里主要介绍BERT的三个亮点Masked LM、transformer、sentence-level
Masked Language Model
# 原本叫cloze test,是完形填空的意思。
随机mask语料中15%的token,然后将masked token 位置输出的最终隐层向量送入softmax,来预测masked token。
有80%的概率用“[mask]”标记来替换——my dog is [MASK]
有10%的概率用随机采样的一个单词来替换——my dog is apple
有10%的概率不做替换——my dog is hairy