一、预训练的理解
因为最近BERT模型的大热,现在想要整理一下自然语言处理领域有关预训练模型的发展过程,可能不是很全面,就把我了解到的梳理一下吧,欢迎补充~
首先什么是预训练?一般我们在训练模型时一开始不是要随机初始化参数吗,这里随机初始化参数是好,但是有几个问题:第一如果我要训练的数据集不够大,随机初始化参数等于从零开始训练,这样可能不足以训练复杂的网络;第二即使你有很大的数据集,由于模型的参数是随机初始化的,使得整个过程模型训练的速度会很慢,也就是参数的收敛速度很慢。基于以上这两点的考虑,预训练的概念应运而生。预训练就是使模型在刚开始训练时的参数是也是经过事先学习而给定的,而非随机初始化来的,这样给定一个初始化参数,会使模型在训练时找到一个好的初始点,进而加速优化过程。
自然语言处理领域的预训练是受到图像处理领域的预训练的启发。图像处理一般是使用多层叠加的CNN或RNN网络结构,此时可以先用某个训练集A对网络进行预训练,预训练出来的是模型的初始化参数。当用新的训练集B来训练CNN或者RNN模型时,在浅层的网络结构中可以加载A预训练出来的参数进行初始化,在深层的网络结构仍然使用随机初始化。后面在训练的过程中,有两种方法:一是让A预训练出来的参数不随着训练过程改变,这种称为“frozen”,二是A预训练出来的参数在后面训练的过程中仍然通过不断的学习来优化,这种称为“fine-tuning”。
这种做法有三种解释:第一,训练集A可以是某个领域的通用大型数据集,在这样的数据集下可以训练深层网络结构,可以初始化出成百万上千万个参数,这样尽管在训练集B很少的情况下也能通过frozen或者fine-tuning去进行训练使其更好的适应针对于某一特定任务的训练集B;第二,就算某一特定任务下你的训练集B也很大,也可以通过加载初始化参数而大大加快训练时的收敛速度;第三,经典论文《Visualizing and Understanding Convolutional Networks》中解释了在图像领域中CNN从低层到高层不断学习出图像的边缘、转角、组合、局部、整体信息的过程,这说明越是底层的网络抽取到的越是基本的通用特征,越往高层越是针对于解决特定任务的高级特征,因此我们可以通过某个领域的通用大型数据集进行预训练,来初始化特定任务中底层的网络参数,而高层特征与特定任务关联较大,可以不用使用预训练参数,也可以采用Fine-tuning用新的数据集进行参数调整。
所以自然语言处理领域的预训练就受到了启发,而自然语言处理的首要任务就是Word embedding,后期才有人基于Word embedding进行自然语言处理的预训练。
二、Word embedding
Word Embedding(词嵌入)或者Distributional Vectors(分布式向量)是将自然语言表示的单词转换为计算机能够理解的向量的技术,即把词汇表中的单词或者短语映射成由实数构成的向量。下面介绍Word embedding的发展,以及后期用于预训练的模型。
1.Onehot
Onehot是最简单的Word embedding方法,就是将文档中的所有句子拆分成不重复的词并排列,假设总词数有N个,则该文档中每个词的向量都是n维,其中某一个词的向量表示就是在该词出现的那一维标为1,其余维度为0。
假设文档中有两句话:
Mary bought a bottle of milk at the store.
John wants to buy a basketball, but he is not permitted.
词汇表的排序结果为:
{"Mary": 1, "bought": 2, "a": 3, "bottle": 4, "of": 5, "milk":6, "at": 7, "the": 8, "store": 9, "John": 10,
"wants": 11, "to": 12, "buy": 13, "basketball": 14, "but": 15, "he": 16, "is": 17, "not": 18, "permitted": 19}
则每个词的词向量表示如下:
Mary: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
bought: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
...
permitted: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
Onehot的局限性:
- 若文档规模大,则词向量维度太大,且稀疏;
- 英语中同一单词的不同时态不会识别,会被当成两个词来进行向量表示;
- 不能表示词语之间的位置关系,若同一单词(如术语)在句中出现多次,Onehot无法表示;
- 不能表示词语之间的语义关系,如lady、madam、Miss从语义上讲可能是相近的,Onehot无法表示。
2.N-gram
前面Onehot方法是单纯从构建Word embedding的角度对句子进行处理,到这里需要介绍一下语言模型LM了,因为N-gram模型就是语言模型的
一种。
简单来说,语言模型就是用来计算一个句子的概率的模型,即P(W1,W2,..,Wn)。利用语言模型,可以确定哪个词序列的可能性更大,或者给定
若干个词,来预测下一个最可能出现的词语。公式如下:
根据句子中前面的一系列单词预测后面跟某个单词的概率大小,句子中每个单词都有根据上文预测自己的概率,把所有这些单词的产生概率相乘,
数值越大说明这越像一句话。
N-gram考虑了词语之间的位置关系所反映的语义关联,它是基于马尔科夫假设而提出来的,即一个词的出现仅与它之前的若干个词有关,而与其他词无关。其理论推导如下。
假设一个句子有n个词语,表示为,如何衡量它的概率呢?我们假设每一个单词都要依赖于从第一个单词到它之前一个单词的影响:
这种方法看似简单,但是有两个缺陷:一是长句子或者经过去标点处理后的文本可能很长,此时参数空间就会很大,如最后一项的参数有n个;二是随着i的增大,很多词语同时出现的情况可能没有,i越高这种现象越明显,可能概率为0,数据稀疏严重。
因此引入马尔科夫假设,即某一个词出现的概率仅依赖于该词前面的N-1个词,即
-
当n=2时,表示某一个词出现的概率仅依赖于该词前面的1个词,此时称为Bi-gram模型:
- 当n=3时,表示某一个词出现的概率仅依赖于该词前面的2个词,此时称为Tri-gram模型:
如何计算其中的条件概率呢?利用贝叶斯公式得:
也就是这些词在文档中一起出现的频数,此时:
至此,理论推理就结束了。至于对N的确定以及因数据稀疏问题而采用的平滑处理方法,见博客https://blog.csdn.net/songbinxu/article/details/80209197
N-gram的局限性:
N-gram模型会将语义关联纳入考虑,从而形成联合分布概率表达,但是尽管取前N-1个单词,在语料大的情况下计算量还是很大,在模拟广义情境时严重受到了“维度灾难(curse of dimensionality)”问题。
3.Co-occurrence matrix
Co-occurrence matrix(共现矩阵)也是考虑文档中词之间的关系来进行词向量表示,该方法认为某个词的意思跟它临近的n个单词是紧密相关的,此时设定一个窗口x(一般设置x为5-10),则随着窗口的滑动,统计每个词与前面x个词与后面x个词共同出现的次数。
假设语料库中包括下面三个文档:
I like deep learning.
I like NLP.
I enjoy flying.
作为示例,我们设定的窗口大小为1,此时,将得到一个对称的共现矩阵。由于在语料库中,I 和 like做为相邻词同时出现在窗口中的次数是2,因此下表中I 与like相交的位置其值就是2。以此类推,我们便实现了将词语变成向量的目标,此时在共现矩阵的每一行(或每一列)都是对应单词的一个向量表示。
Co-occurrence matrix的局限性:
- 虽然Cocurrence matrix考虑了单词间相对位置的关系,但是它仍然面对维度灾难问题,也就是说一个单词的向量表示维度太大。这时,会很自然地想到SVD或者PCA等一些常用的降维方法。然而,SVD算法运算量也很大,若文本集非常多,则不具有可操作性。
- 窗口大小的选择跟N-gram中确定N也是一样的,窗口放大则矩阵的维度也会增加,所以本质上还是带有很大的计算量。
4.NLM / NNLM / NPLM
NLM(神经语言模型)或NNLM(神经网络语言模型)或NPLM(神经概率语言模型)由 Bengio 与于 2003 年提出,它也是用于计算的一种语言模型,注意,这里的n指的是句子中的词数,N是与N-gram模型里的N意义一样。
这里为了便于表示, 令,便可以得到给定词语在当前上下文中出现的概率为 ,不同于 N-gram 的直接统计频数的方式, NNLM 用一个关于的函数来表示,也就是说,当给定词为时,其上下文为的概率可以用一个关于的函数表示,然后问题就转变成了求最优参数来生成语言模型, 待求得后 ,对于任意在语料库词表中的词语,都可以直接带入到中,得到其对应的概率。Bengio 提出的 NNLM如下图所示。
首先,构造函数。NNLM是采用神经网络(NN)结构来构造函数的,构造完成后,根据训练语料使用极大似然估计(MLE)来求得最优的参数。即:
此处是引入的先验信息来构造成最大后验概率(MAP),也可以叫做正则化,但是 NNLM 里是没有引入任何先验信息的,因此这里不考虑 R(θ)。
其次,生成词向量,即将语料库词表中的词语表示为一个固定长度为的向量形式(m 为人工定义的词向量的长度),这样整个语料库可以用 一个的矩阵表示,每一行为一个词向量。
然后,找到词 的上下文, 也就是找到词的前个词语,并把这个词语的词向量首尾相接的拼起来,形成维度为的向量来当做神经网络的输入,所以 NNLM 输入层的大小已经确定为, 隐层的规模就是人工指定了。
假设输入为词语,其上下文拼接成一个输入,在 NN 中的计算如下所示:
最后,得到向量, 为什么输出层的维度是呢,因为这是监督学习,当输入特征为对应的维的向量后,通过 NNLM 所期望的输出应该是词语,即输出类似于模型学习到的标签的映射,因为共有个词语,所以输出层维度为,而在语料库中的下标对应的维度就是映射的得分。现在为了让的每个分量表示当前词为语料库词表的第个且当前上下文为的概率,做一个softmax 归一化即可:
此处,表示为语料库词表中的第个词。
以上便是我们用 NN 构造出的代表概率的函数以及NNLM的过程,现在采用 MLE 估计即可,这里待估计参数分别为整个词表词语的词向量与 NN 中的权值,网络中还有一些需要设定的参数,比如上下文词语的设定一般不大于 5 ,词向量的长度一般介于之间,另外需要注意 NNLM是自带平滑的,因为任意词语的概率都经过了 softmax 归一化,所以取值介于之间。计算用先前的公式:
该 log 似然可以用梯度上升法来求解,具体这里不涉及了。参数求解完后,便得到了我们的语言模型,现在估计一个现实任务中的词语对应的时,只需将该词语对应的词向量输入到里,就会得到其对应的概率值。
从另一个角度来理解,就是输入某个句子中的单词的前n-1个单词,使得第n个单词是的概率最大,求此时的参数。前面n-1个单词每个单词用Onehot编码(如:000010000)作为原始单词输入,之后乘以矩阵Q后得到向量,每个单词的首尾拼接起来,上面接隐层,然后再接softmax去预测后面应该跟哪个单词。这个向量其实就是每个单词对应的Word Embedding值,那个矩阵Q包含V行,V代表词典大小,每一行内容代表对应单词的Word embedding值。矩阵Q的内容也是网络参数,需要学习获得,训练刚开始用随机值初始化矩阵Q,当这个网络训练好之后,矩阵Q的内容被正确赋值,每一行代表一个单词对应的Word embedding值。通过这个网络学习语言模型任务,这个网络不仅自己能够根据上文预测后接单词是什么,同时还能获得一个副产品,就是矩阵Q,这就是单词的Word Embedding是被如何学会的。
NNLM 的副产品词向量包含了丰富的信息,因为每个词语都被表示为长度为的向量,在词向量空间中,语义相似的词语的距离会很接近,且会有 man - woman = king - queen 这种神奇的效果出现。另外除了词向量外,还有字向量,句子向量与文章向量 。
至此已经讲了四个模型,接下来会讲word2vec,ELMo,GPT,以及BERT。为什么这几个要放一起讲,因为从创新的角度来说,BERT其实是集成了这三个模型的优点而获得了很好的效果,外加附加了next sentence prediction任务。好了,未完待续,,,