一、预训练的理解
因为最近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进行自然语言处理的预训练。
二、早期的词向量生成
词向量生成就是将自然语言表示的单词转换为计算机能够理解的向量的技术,即把词汇表中的单词或者短语映射成由实数构成的向量的过程。早期的词向量生成方法主要有Onehot和Co-occurrence matrix。
1.Onehot
Onehot就是将文档中的所有句子拆分成不重复的词并排列,假设总词数有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.Co-occurrence matrix
Co-occurrence matrix(共现矩阵)也是考虑文档中词之间的关系来进行词向量表示,该方法认为某个词的意思跟它临近的前后n个单词是紧密相关的,此时设定一个窗口x(x=2n+1,一般设置x为5-10),则随着窗口的滑动,统计每个词与前面n个词与后面n个词共同出现的次数。
假设语料库中包括下面三个文档:
I like deep learning.
I like NLP.
I enjoy flying.
作为示例,我们设定的n的大小为1,此时,将得到一个对称的共现矩阵。由于在语料库中,I 和 like做为相邻词同时出现在窗口中的次数是2,因此下表中I 与like相交的位置其值就是2。以此类推,我们便实现了将词语变成向量的目标,此时在共现矩阵的每一行(或每一列)都是对应单词的一个向量表示。
Co-occurrence matrix的局限性:
- 虽然Cocurrence matrix考虑了单词间相对位置的关系,但是它仍然面对维度灾难问题,也就是说一个单词的向量表示维度太大。这时,会很自然地想到SVD或者PCA等一些常用的降维方法。然而,SVD算法运算量也很大,若文本集非常多,则不具有可操作性。
- 窗口大小的选择跟N-gram中确定N也是一样的,窗口放大则矩阵的维度也会增加,所以本质上还是带有很大的计算量。
三、Word embedding
以上两种方法,当语料库词表的规模庞大时,就会面临维度灾难问题,带来很大计算量的同时在性能上也不能很好的表示词语在文档中的更多信息(如语义信息)。Word Embedding(词嵌入)或者Distributional Vectors(分布式向量),是将高维词向量嵌入到一个低维空间的一种方法,它的思路是通过训练,将每个词都映射到一个较短的词向量上来,这样词语既保留了最主要的特征又减少了矩阵计算的复杂度。在介绍Word embedding之前,先介绍一下语言模型LM,因为很多Word embedding的生成和确定都是通过语言模型来做到的,或者说,语言模型在解决词语预测任务时,在模型训练的过程中,会产生一种副产品——权重矩阵,而这里的权重矩阵就是我们所需要的每个词语的Word embedding值。
简单来说,语言模型就是用来计算一个句子的概率的模型,即。利用语言模型