ELMo其实是考虑了目标信息的前后内容,来对目标进行预测:使用深层Bi-RNN对序列进行学习,可以学习到目标的前后文信息,以此来更好的表示目标数据。ELMo将目标数据的每层的前后文信息进行串接,并对多层的串接结果进行加权求和(权值是学习的目标之一)。
关于transformer的原理介绍,有很多地方有详细的解答,本文中我针对具体的问题,做出一些相关的解答。
Transformer中的self-attention:同一个序列中的不同元素间进行互注意。由于是序列自身的attention,因此是self-attention。
Transformer在机器翻译中的decoder:1)在进行translation操作时,会在解码器的开始输入start token,来便于后续生成;2)在encoder-decoder的阶段,decoder提供Q(即前面已经生成好的序列经过self-attention得到的输出),encoder提供K和V(即encoder对输入序列经过一系列attention得到的输出);3)masked是将所有不应该看到的序列元素屏蔽掉,如预测3个词时,应该看不到第3个词及后面所有的词的信息。
Bert训练中的mask问题:在训练中,对于输入的句子I want to go to school。如果要对want进行预测,则我们转换成token序列为:I [mask] to go to school,并利用want的前后文(I、to go to school)对[mask]进行预测得到want。
Bert对于sentence pair的一致性判断、single sentence的分类判断:都是将输入句子经过bert后,转换成对开始符[CLS]的分类问题。
Bert对SQuAD的答案判断:将问题Q和文档D当作sentence pair进行输入,并初始化一个表示start的向量s和一个表示end的向量e。在训练时(假设标准答案在文档中的词序编号为开始s_id和结束e_id),使用Bert对sentence pair对进行embedding:1)对s与D的每个token embedding进行dot product计算,并对计算结果使用softmax来预测s_id;2)对e与D的每个token embedding进行dot product计算,并对计算结果使用softmax来预测e_id。在预测时,使用同种方法执行,不过此时的s和e已经学习得到。
微调Bert进行下游其他任务的应用:主要是微调了Bert内部的最后几层encoder,以及后续的linear classifier层的参数信息。
Inputs_ID:将输入的句子进行单词的token,如palying=play+##ing,然后再对token(play和##ing)执行embedding。
Positional Encoding:transformer不像RNN一样是序列化的操作,它是平行化的操作,这也是其能够执行self-attention的原因。正式因为如此,它没有区分序列数据中每个元素的顺序信息。因此,位置编码可以帮助实现顺序信息,该编码由cos和sin固定计算(pos表示元素在序列中的位置,i表示该元素特征的第i维),不是学习得到的。
transformer中的layer normlize:Batch Normalization是在不同数据的同一维度间进行norm,而Layer Normalization是在同一数据的不同维度间进行norm。两者都是Norm处理的方法,使得训练中的参数分布更稳定一些,保证梯度进行有效的学习。
multi-head的意义以及处理方式:使用多组(数量不限,自选)权值,分别对输入的数据特征进行变换。对于每组权值得到的变换,只针对该组进行self-attention,最后多组self-attention的结果进行串接。multi-head的意义在于:不同的attention会注意到不同的特征性质,这样操作便于找到多种潜在特征。
为什么要进行除以维度的开方:当Q和K的维度很大时,导致点乘的数量级太大,使得softmax的梯度过小,造成梯度消失。因此,这么操作是为了进行维度惩罚。具体的数学解释,https://www.zhihu.com/question/339723385知乎高赞1我觉得很好。
Bert的编解码器组成:正如其论文题目所写“Bidirectional Encoder Representations from Transformers”,Bert只包含了Transformer的编码器部分,而并没有包含其解码器部分。
Bert的训练过程:①论文中说Bert在训练时执行了两个不同的任务(词汇预测和句子关系计算),实际上这两个任务是同时进行的,这体现在其损失函数上(next_loss = self.criterion(next_sent_output, data["is_next"]),mask_loss = self.criterion(mask_lm_output, data["bert_label"]),loss = next_loss + mask_loss)。②在对[MASK]位置的词进行预测时,由于Bert是一个语言模型训练器,个人认为句子中所有的词汇都会被预测(从双向),但是只有[MASK]位置的损失才会被计算。
Bert的输入介绍:
1)token embeddings:词的信息,在英文中是wordpiece,它是指将单词划分成一组有限的公共子词单元,能在单词的有效性和字符的灵活性之间取得一个折中的平衡。例如示例中‘playing’被拆分成了‘play’和‘ing’。
2)segment embeddings:上下句的信息。在很多NLP任务中(如QA和语义相似性等任务),token encoding仅学到了一些token级的特征,是不够的,还期望能捕捉到一些句子级别的特征。在上图中用[SEP]将句子分成左右字句,EA和EB分别代表左子句和右子句。
3)position embeddings:位置信息。因为transformer没有rnn的循环和cnn的卷积操作,故没有序列概念(缺乏序列可能会导致语义相反),所以就将位置作为特征做embeddings。在transformer中,计算token的位置信息是巧妙的借用了波的概念,既可以模拟信号周期性变化,又将值做了归一化,在一定程度上增加了模型的泛化能力。
至于其他的一些关于ELMo和Transformer的问题,哈工大的博士生忆臻的公众号整理的不错:https://mp.weixin.qq.com/s/fNBAz0ZWGpcBqcUyUFqTYg
https://mp.weixin.qq.com/s/X6O8LXMDcCoS1_yE0ia5WQ
https://mp.weixin.qq.com/s/F06nmJWUNQT1_Hq2dkSYhQ
http://nlp.seas.harvard.edu/2018/04/03/attention.html
Transformer代码详解:http://nlp.seas.harvard.edu/2018/04/03/attention.html
可视化讲解Transformer:http://jalammar.github.io/illustrated-transformer/
从word embedding到Bert:https://cloud.tencent.com/developer/article/1492430
Bert输入的参考文献:https://zhuanlan.zhihu.com/p/62308732