赞
踩
词向量模型比较:
横向比较Word2vec,ELMO,BERT三个模型:
词向量是一个工具,可以把真实的世界抽象成文字,进而运用数学公式进行操作的向量,而对向量的操作才是NLP真正要做的任务。因此,NLP任务可以分为两部分:预训练产生的向量和对向量进行的操作(下游具体的任务)。
Word2vec、ELMO、BERT,这些模型逐渐把下游的具体任务迁移到预训练向量上。
Word2vec–>:ELMO
结果:将上下文无关的静态向量变成上下文相关的动态向量。
操作:将编码转移到预训练产生词向量的过程当中
ELMO–>:BERT
结果:训练出的word-level向量变成sentence-level的向量,下游具体的NLP任务调用更加方便,克服了ELMO存在的问题。
操作:使用句子级负采样获得句子表示/句对关系,Transform模型替代LSTM提升表达和时间效率,masked LM解决“自己看到自己”的问题,也就是说,实现了双向理解。
1、word2vec
线性模型:高维空间映射的词向量可以很好的体现真实世界中的token之间的关系。
比如:king-man = queen-woman, 国王=皇后
负采样:训练词向量模型的目标不是为了得到一个多么精确的语言模型,而是为了获得他的副产物-词向量。所以要做到的不是在几万几十万个token艰难计算softmax获得最优的那个词(要预测的那个词),而只要在几个词中找到对的词就行,这几个词包括(正确值,随机产生的噪声词),就是说训练产生一个migmoid二分类器,只要模型能够从中找到正确的词就认为完成任务。
缺点:静态,上下文无关
为了让句子有一个整体含义(context),大家会在下游具体的NLP任务基于词向量序列做编码(encoding)操作。
下面是一个比较表格,预测目标这里的next word下一个词,是所有传统语言模型都做的事——寻找下一个词填什么。
2、ELMO
介绍ELMo的两个方面,一个是它的encoder模型Bi-LSTM,另一个是它和下游具体NLP任务的接口(迁移策略)。
Bi-LSTM做encoder实现上下文相关(context):
之前所说的把下游具体任务放到预训练产生词向量里面,从而获得一个可以根据(文意)context不同不断变化的(动态)dynamic词向量。具体实现方法是使用双向语言模型BI-LSTM来实现,如下面左图所示。从前到后和从后到前分别做一遍LSTM的encoding操作,从而获得两个方向的token联系,进而获取句子的(句意)context。
但是这里存在两个问题,暂且称作“不完全双向”和“自己看自己”。
“不完全双向”是指模型的前向和后向LSTM两个模型是分别训练的,从图中也可以看出,对于一个序列前向遍历一遍获得左边的LSTM,后向遍历一遍获得右边的LSTM,最后得到的隐层向量拼接得到的结果向量。(前向的hidden state1 + 后向的hidden state2 = 总的hidden state,+是concat),并且在最后的Loss function中也是前向和后向的loss function直接相加,并非完全同时的双向计算。
“自己看见自己”是指要预测的下一个词在给定的序列中已经出现的情况。传统语言模型的数学原理决定了它的单向性。
从公式p(s)=p(w0)p(w1∣w0)p(w2∣w1,w0)p(w3∣w2,w1,w0)…p(wn∣context)可以看出,传统语言模型的目标是获得在给定序列从头到尾,条件概率相乘后概率最大的预测词,而双向模型会导致预测的预测词已经在给定的序列当中出现,这就是**“自己看见自己”。**
如下右图所示,图片从下到上看。最下面是训练数据A B C D,经过两个Bi-lstm操作,预测某个词的位置。
比如第二行第二列,ACD这个结果是第一层Bilstm在B位置的输出内容,包括正向A和反向CD,直接拼接成ACD。
比如第三行第二列,ABCD这个结果是前向BCD和反向ABD拼接的结果,而当前的位置需要预测的是B,已经在ABCD中出现了,这就会有问题。因此对于BI-LSTM,只要层数增加,就会存在“自己看得见自己”的问题。
3.BERT
BERT模型进一步增加词向量模型泛化能力,充分描述字符级、词级、句子级甚至句间关系特征。
真正的双向encoding:
Masked LM,类似完形填空,尽管仍旧看到所有位置信息,但需要预测的词已被特殊符号代替,可以放心双向encoding。
Transformer做encoder实现上下文相关(context):
使用Transformer而不是Bi-LSTM做encoder,可以有更深的层数、具有更好并行性。并且线性的Transformer比lstm更易免受mask标记影响,只需要通过self-attention减小mask标记权重即可,而lstm类似黑盒模型,很难确定其内部对于mask标记的处理方式。
提升至句子级别:
学习句子/句对关系表示,句子级负采样。首先给定的一个句子,下一句子正例(正确词),随机采样一句负例(随机采样词),句子级上来做二分类(即判断句子是当前句子的下一句还是噪声),类似word2vec的单词级负采样。
整个流程的可视化如下图所示:
输入“Thinking Machines”,对应词向量,叠加位置向量 Positional Encoding,对每个位置做 Self-Attention 得到;Add&Norm 分两步,residual connection(残余连接)即,layer Normalization(归一化) 得到新的,对每个位置分别做 feed forward 全连接和 Add&Norm,得到一个 Encoder Layer 的输出,重复堆叠2次,最后将 Encoder Layer 输出到 Decoder 的 Encoder-Decoder Layer 层。
Decoder 阶段:先是对 Decoder 的输入做 Masked Self-Attention Layer(蒙面的自我注意层),然后将Encoder 阶段的输出与 Decoder 第一级的输出做 Encoder-Decoder Attention,最后接 FFN 全连接,堆叠2个 Decoder,最后接全连接+Softmax 输出当前位置概率最大的的词。
BERT的三个亮点
1.Masked Language Model
随机mask语料中15%的token,然后将masked token 位置输出的最终隐层向量送入softmax,来预测masked token。
这样输入一个句子,每次只预测句子中大概15%的词,所以BERT训练很慢。
而对于盖住词的特殊标记,在下游NLP任务中不存在。因此,为了和后续任务保持一致,作者按一定的比例在需要预测的词位置上输入原词或者输入某个随机的词。如:my dog is hairy
有80%的概率用“[mask]”标记来替换——my dog is [MASK]
有10%的概率用随机采样的一个单词来替换——my dog is apple
有10%的概率不做替换——my dog is hairy
下面左图是transformer模型一个结构,分成左边Nx框框的encoder和右边Nx框框的decoder,相较于RNN+attention常见的encoder-decoder之间的attention(上边的一个橙色框),还多出encoder和decoder内部的self-attention(下边的两个橙色框)。每个attention都有multi-head特征。最后,通过position encoding加入没考虑过的位置信息。
multi-head attention:
将一个词的vector切分成h个维度,求attention相似度时每个h维度计算。由于单词映射在高维空间作为向量形式,每一维空间都可以学到不同的特征,相邻空间所学结果更相似,相较于全体空间放到一起对应更加合理。比如对于vector-size=512的词向量,取h=8,每64个空间做一个attention,学到结果更细化。
self-attention:
每个词位的词都可以无视方向和距离,有机会直接和句子中的每个词encoding。比如上面右图这个句子,每个单词和同句其他单词之间都有一条边作为联系,边的颜色越深表明联系越强,而一般意义模糊的词语所连的边都比较深。比如:law,application,missing,opinion
position encoding:
因为Transformer既没有RNN的recurrence也没有CNN的convolution,但序列顺序信息很重要,比如你欠我100万明天要还和我欠你100万明天要还的含义截然不同。
Transformer计算token的位置信息这里使用正弦波↓,类似模拟信号传播周期性变化。这样的循环函数可以一定程度上增加模型的泛化能力。
但BERT直接训练一个position embedding来保留位置信息,每个位置随机初始化一个向量,加入模型训练,最后就得到一个包含位置信息的embedding(简单粗暴。。),最后这个position embedding和word embedding的结合方式上,BERT选择直接拼接。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。