https://lilianweng.github.io/lil-log/2019/01/31/generalized-language-models.html
在2018年,诸如GPU, BERT等大体积的语言模型在各种任务上达到了比较好的效果。而我们在训练语言模型的过程中,也不同于图像的预训练模型,NLP任务的预训练不需要带标签的数据。
最刚开始的语言模型(word2vec, doc)训练思路是基于词共现的,而不会更具特定的上下文做改变。这种方式的embedding在一定程度上会有效,但是其提升程度是有限的。
这里我们会提到多种对文本构建词向量的方法,这些词向量怎么更加容易和高效低用于下游NLP任务。
CoVe(Contentual Word Vecotrs), attention的seq2seq的机器翻译模型中得到的词向量。【这里的CoVe得到的是整个句子的向量】
NMT(Neural Machine Translation) 的encoder部分由两层标准的biLSTM组成,decoder是一个带有attiontion机制的LSTM。
以英-法翻译为例,在encoder端进行英语单词embedding的训练。
encoder的输出,会带有单词上下文的信息,好处是对很多下游NLP任务有好处。
使用glvoe和CoVe共同做文本分类任务,其中glove提供了词之间的共现关系,CoVe提供了句子的上下文信息。
CoVe的缺陷:
ELMo(Embedding from language Model),通过无监督的方式,使用预训练语言模型来做包含上下文信息的单词表征。
使用双向LSTM提取特征,两个LSTM共享embedding层和softmax层。
模型的目标是最小化negative log likelihood。
在biLM的顶层,ELMo通过具体的任务学习,把各层的隐层堆叠起来,隐藏层的内容包括: embedding layer output和weight。
为了评估不同的隐藏层捕获的不同信息,ELMo使用不同层的表征来表示语义特征和语法特征。
这里的语言模型是无监督的,理论上可以继续加大。然而这个训练依然是和任务无关的,所以还需要在具体的任务上,再做一些工作以提高性能。
https://zhuanlan.zhihu.com/p/55182085
GPT(generative pre-trainging transformer) ,雨ELMO比较相似。使用了更多的语料,体积上也更大。和ELMo主要体现在两个方面的不同:
与原生的transformer下关闭,这里的模型丢弃了encoder部分,因此输入为一个单一的句子。
输入句子,模型包含了多个transformer block,每个block又包含了一个multi-head self-attention以及pointwise feed-forward层。最终输出为经过softmax归一化的分布式表达。
在损失函数上,GPT和ELMo一样,都是negative log-likelihood。
Byte Pair Encoding(BPE)用来对输入序列进行编码。BPE最初是是使用在压缩算法重,后来被应用于解决机器翻译重的OOV问题,我们可以解决极少出现的单词问题,并翻译为一种新的语言。为了把很少出现或UNK的单词分解为多个subwords,BPE通过迭代和贪婪的方法将单个token进行有分割的拼接。
GTP与任务无关,只可以使用预训练的方式直接进行训练。
以分类任务为例,在带标签的数据集重,输入为x=(x1,x2…,xn),输出为y。GPT先将x通过与训练的transformer decoder,然后最后一层的输出就是隐藏层表示,需要更新的权重是Wy,这些权重可以对特殊任务有更好的适应性。
loss为最小化negative log-likelihood,另外添加LM loss会有更好的效果。
BERT(Bidirectional Encoder Representations from Transformers)同样更可以在无标注的样本上进行预训练,然后在特殊任务上进行微调,不需要做额外的网络搭建。
与GPT相比,BERT最大的不同在于其训练方式是双向的。模型可以学习到单词的上下文信息。
BERT的结构是一个而多层的双向transformer encoder。
BERT模型的训练包含了两个任务,Mask language model 和 Next sentence prediction
考虑到在下游环境中,会涉及到句子间的关系信息,bert添加了一个文本二分类的任务,来判断语料中下一个句子作为当前句子的下一句是不是合适。
输入embedding主要包含三个组成:
bert的微调阶段,也仅仅需要少量的参数加入。
对于分类任务,我们使用最后隐藏层的特殊字符[CLS],将其输入dense层,然后做softmax。
对于QA问题入SQuAD,我们需要预测一个段落是不是一个问题的答案。bert对两个touken给出概率分布【这里不是很清晰】
有三处需要再细看。