当前位置:   article > 正文

预训练语言模型笔记

预训练语言模型

第一章 预训练语言模型简介 

预训练语言模型(Pre-trained Language Model),是通过对这些无标签的数据进行"预训练",获得一个比较好的语言表示,再将其应用到特定的自然语言处理下游任务中。

在图片分类任务中,常使用(Convolutional Neural Network,CNN)网络,对于由多个层级结构组成的CNN来说,不同层学到的图像特征是不一样的,越浅的层学到的特征越通用,越深的层学到的特征和其体任务的关联性越强。

比如通过ImageNet训练出来的CNN网络参数,可以迁移至自己的图像识别的训练任务中。在比较浅层的CNN网络初始化时,可以使用已经训练好的参数,而在模型的高层,其参数可以随机初始化。在训练自己的特定任务时,既可以采用冻结(Frozen)参数的方式使得浅层参数一直保持不变;也可以采用微调的方式让浅层参数仍然随着任务的训练不断发生改变,从而更加适应自己任务的分类。

自然语言表示的几个阶段:

独热表示:one hot会为每一个单词声明一个词表大小的向量表示,当前位置为1,其余位置为0。存在两个问题:维度太高,难以适应下游认为;由于词语词之间是正交的,所以无法表示词之间的相似性。

词袋模型:虽然能够方便计算机快速处理,却无法衡量单词间的语义相似度。

分布式理论:核心思想是上下文相似的词,其语义也相似,是一种统计意义上的分布

分布式表示:改进one hot的文本的一种表示方式,没有统计意义上的分布。相比于独热表示,分布式表示将文本在更低的维度进行表示。把独热表示中的一维特征,分布在更多维度进行表示,模型可以捕捉词的更多特征,从而更好低获取词的语义信息。人为想到的一些特征

word2vec:将单词表示为向量,语义相近的词,其向量也是相似的,使得判断语义相似度成为了可能,但是无法很好地解决一词多义的问题。

ELMo:考虑了上下文的词向量表示方法,以双向LSTM作为特征提取器,同时考虑了上下文的信息,从而较好地解决了多义词的表示问题。

预训练语言模型的两种范式

自回归(Autoregressive):根据上文预测下一个单词,或者根据下文预测前面的单词。例如,ELMo是将两个方向(从左至右和从右至左)的自回归模型进行了拼接,实现了双向语言模型,但本质上仍然属于自回归模型。

自编码(Autoencoder):也称为降噪自编码,可以在输入中随机掩盖一个单词(相当于加入噪声),在预训练过程中,根据上下文预测被掩码词,因此可以认为是一个降噪的过程。这种模型的好处是可以同时利用被预测单词的上下文信息,劣势是在下游的微调阶段不会出现掩码词,因此[MASK]标记会导致预训练和微调阶段不一致的问题。BERT的应对策略是针对掩码词,以80%的概率对这个单词进行掩码操作,10%的概率使用一个随机单词,而10%的概率使用原始单词(即不进行任何操作),这样就可以增强对上下文的依赖,进而提升纠错能力。

BERT系列模型更适用于理解任务,而GPT系列模型更适用于生成任务。

第二章 预训练语言模型基础知识

语言模型:对于语言序列w1,W2,......wn,计算该序列的概率,即P(w1,W2,...,Wa)。从机器学习的角度看,语言模型是对语句的概率分布的建模。

语言模型:给定一句由n个词组成的句子W=w1,W2,......,wn,计算这个子的概率P(w1,W2,...,wn),或者根据前文计算下一个词的概率P(wn/w1,W1,W2..,wn-1)的模型。

2.1 统计语言模型:给定一个句子计算这个句子出现的概率,或者给定前n-1个词,计算第n个词出现的概率。如果使用词表中的所有词与当前句子中的所有词计算共现概率,命中率比较低且计算量大,可以使用待预测词的前k个词预测当前词,P(wn/wn-k,..,wn-1)代替P(wn/w1,W1,W2..,wn-1),k为几,就称为几元语言模型。

word2vec

word2vec主要有两种模型,分别是CBOW(Continuous Bag-of-Words Model)和Skip-gram,其中,CBOW 适用于数据集较小的情况,而Skip-Gram在大型语料中表现得更好。
word2vec 采用了两种计算方法,分别是层次Softmax(Hierarchical Softmax)和负采样(NegativeSampling),大大降低了运算成本。

层次Softmax的思想:由于输出层最后预测的是一个多分类问题,类别数量为V|(字典大小),通过层次Softmax构造的哈夫曼树(Huffman Tree),可以将V分类的问题变成log(V)次的二分类问题进行求解。

另一种计算方法是负采样。在训练网络的过程中,如果词汇表数特别大,则每次进行所有权重的更新将变得非常消耗资源。因此,训练每个样本时,可以只调整部分网络参数,而不是全量参数。负采样方法本质上是对训练集进行了采样,从而减小了训练集的大小。举例来说,之前提到的字典维度为10000,词向量维度为300的权重矩阵一共有10000×300=30000000个权值。如果只采样1个"正样本"和5个"负样本",则参数量可以降低至6×300=1800。

word2vec的论文中,负样本的选取和单词频次相关,频次越大,采样的概率越大。在训练过程中,仅更新一小部分样本的权重,包括正样本及选择出来的负样本,可以大大降低训练复杂度。
word2vec缺点:这些词表示方式本质上是静态的,每一个词都有一个唯一确定的词向量,不能根据句子的不同而改变,无法处理自然语言处理任务中的多义词问题。

 Word2vec

Word2vec 是“word to vector”的简称,它是一个生成对“词”的向量表达的模型。

想要训练 Word2vec 模型,需要准备由一组句子组成的语料库。假设其中一个长度为 T 的句子包含的词有 w1,w2……wt,并且假定每个词都跟其相邻词的关系最密切。根据模型假设的不同,Word2vec 模型分为两种形式,CBOW 模型和 Skip-gram 模型。按照一般的经验,Skip-gram 模型的效果会更好一些。

  • CBOW 模型假设句子中每个词的选取都由相邻的词决定,所以CBOW 模型的输入是 wt周边的词,预测的输出是 wt
  • Skip-gram 模型假设句子中的每个词都决定了相邻词的选取,所以Skip-gram 模型的输入是 wt,预测的输出是 wt周边的词

Word2vec 训练样本的生成:从语料库(电商网站中所有物品的描述文字)中抽取一个句子,选取一个长度为 2c+1(目标词前后各选 c 个词)的滑动窗口,将滑动窗口由左至右滑动,每移动一次,窗口中的词组就形成了一个训练样本。Skip-gram 模型是中心词决定了它的相邻词,所以模型的输入是样本的中心词,输出是所有的相邻词。

如,以“Embedding 技术对深度学习推荐系统的重要性”作为句子样本。首先,对它进行分词,去除停用词,生成词序列,再选取大小为 3 的滑动窗口从头到尾依次滑动生成训练样本,然后我们把中心词当输入,边缘词做输出,就得到了训练 Word2vec 模型可用的训练样本。

图4 生成Word2vec训练样本的例子

Word2vec的结构本质上是一个三层的神经网络。

  • 它的输入层和输出层的维度都是 V,这个 V 其实就是语料库词典的大小。假设语料库一共使用了 10000 个词,那么 V 就等于 10000。根据语料库生成训练样本,这里的输入向量自然就是由输入词转换而来的 One-hot 编码向量,输出向量则是由多个输出词转换而来的 Multi-hot 编码向量,显然,基于 Skip-gram 框架的 Word2vec 模型解决的是一个多分类问题。
  • 隐层的维度是 N,N 的选择需要对模型的效果和模型的复杂度进行权衡,来决定 N 的取值,并且最终每个词的 Embedding 向量维度也由 N 来决定
  • 最后是激活函数的问题,需要注意的是,隐层神经元是没有激活函数的,或者说采用了输入即输出的恒等函数作为激活函数,而输出层神经元采用了 softmax 作为激活函数。

图5 Word2vec模型的结构

为什么要这样设置 Word2vec 的神经网络,为什么要这样选择激活函数呢?是因为这个神经网络其实是为了表达从输入向量到输出向量的这样的一个条件概率关系,我们看下面的式子:

这个由输入词 WI 预测输出词 WO 的条件概率,其实就是 Word2vec 神经网络要表达的东西。通过极大似然的方法去最大化这个条件概率,就能够让相似词的内积距离更接近,这就是我们希望 Word2vec 神经网络学到的。

为了节约训练时间,Word2vec 经常会采用负采样(Negative Sampling)或者分层 softmax(Hierarchical Softmax)的训练方法。

怎样把词向量从 Word2vec 模型中提取出来?

在训练完 Word2vec 的神经网络之后,输入层到隐层的权重矩阵 WVxN 就是我们要得到的Embedding向量。

输入向量矩阵 WVxN 的每一个行向量对应的就是我们要找的“词向量”。比如要找词典里第 i 个词对应的 Embedding,因为输入向量是采用 One-hot 编码的,所以输入向量的第 i 维就应该是 1,其余为0,那么输入向量矩阵 WVxN 中第 i 行的行向量自然就是该词的 Embedding 啦。输出向量矩阵 W′ 也遵循这个道理,但一般来说,我们还是习惯于使用输入向量矩阵作为词向量矩阵。

在实际的使用过程中,我们往往会把输入向量矩阵转换成词向量查找表(Lookup table)。例如,输入向量是 10000 个词组成的 One-hot 向量,隐层维度是 300 维,那么输入层到隐层的权重矩阵为 10000x300 维。在转换为词向量 Lookup table 后,每行的权重即成了对应词的 Embedding 向量。如果我们把这个查找表存储到线上的数据库中,就可以轻松地在推荐物品的过程中使用 Embedding 去计算相似性等重要的特征了。


RNN   
即如图2.9中的右边部分所示,可以看到,

在t时刻,输入变量xt,通过RNN的一个基础模块A,输出变量ht,而t时刻的信息,可以通过一个循环传递到下一个时刻t+1。如果将模块按照时序展开,RNN可以看作多个基础模块A的互连,每一个模块都将当前信息传递给下一个模块。

RNN可以解决时序依赖的问题,但这里的时序一般是短距离的。

循环神经网络(Recurrent Neural Networks RNN)

RNN是一种输出和模型间有反馈,可以对序列型数据进行建模的神经网络模型。传统的前馈神经网络一般输入的都是一个定长的向量,无法处理变长的序列信息,即使通过一些方法把序列处理成定长的向量,模型也很难捕捉序列中的长距离依赖关系。为了解决这个问题,RNN通过将神经元串行来处理序列化的数据,引入了隐状态h的概念(hidden state),h可以对序列形的数据提取特征,由于每个隐状态神经元能用它的内部变量保存之前输入的序列信息,可以据此进行分类或生成新的序列。

https://img-blog.csdnimg.cn/20190319143947504.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1lhc2luMA==,size_16,color_FFFFFF,t_70

RNN的重要特点:在计算所有隐状态时,每一步使用的参数U,W,b都是一样的,即每个步骤的参数都是共享的。

使用新的参数V和c,通过对h进行计算可以得到输出值(每一步使用的参数V和c也都是一样的)。分类问题使用Softmax函数,将输出转换成各个类别的概率。

注意:输入和输出序列是等长的,https://img-blog.csdnimg.cn/20190319144158503.png

https://img-blog.csdnimg.cn/20190319144038673.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1lhc2luMA==,size_16,color_FFFFFF,t_70

https://img-blog.csdnimg.cn/20190319144356912.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1lhc2luMA==,size_16,color_FFFFFF,t_70

优点:模型是时间维度上的深度模型,可以对序列内容建模;h=f(现有的输入+过去记忆总结)

缺点:需要训练的参数较多,容易出现梯度消失梯度爆炸问题;不具有特征学习能力

梯度爆炸与梯度消失

RNN反向传播算法的思路和DNN一样,即通过梯度下降法一轮轮的迭代,得到合适的RNN模型参数U,W,V,b,c。具体来说:RNN每一层的的隐状态都由前一层的隐状态经过变换和激活函数得到,反向传播求导时最终得到的导数会包含每一步梯度的连乘,这会引起梯度爆炸或梯度消失,所以RNN很难处理“长程依赖”问题,即无法学到输入序列中的长距离依赖关系。

梯度爆炸与梯度消失的解决

梯度爆炸:可以通过梯度裁剪来缓解,当梯度大于给定阈值时,对梯度进行等比收缩。

梯度消失:

  1. 对模型本身进行改进:深度残差网络是对前馈神经网络的改进,通过残差学习的方式缓解了梯度消失的现象;而对于RNN来说,LSTM及其变种门控循环单元(Gated recurrent unit,GRU)等模型通过加入门控机制,可以一定程度缓解梯度消失。
  2. 使用ReLU激活函数:在前馈神经网络中采用ReLU激活函数通常可以有效地改善梯度消失,取得更快的收敛速度和更好的收敛结果。在RNN中也可以使用ReLU作为隐含层的激活函数,但是需要对矩阵的初值做一定限制,否则十分容易引发数值问题。只有将W初始化为单位矩阵时才能取得比较好的效果。实验证明,初始化W为单位矩阵并使用ReLU激活函数在一些应用中取得了与LSTM相似的结果,并且学习速度比LSTM更快 

长短期记忆网络(Long Short Term MemoryLSTM

LSTM是循环神经网络的扩展,RNN每一层的的隐状态都由前一层的隐状态经过变换和激活函数得到,反向传播求导时最终得到的导数会包含每一步梯度的连乘,这会引起梯度爆炸或梯度消失,所以RNN很难处理“长程依赖”问题,即无法学到输入序列中的长距离依赖关系。LSTM在隐状态计算时以加法代替了这里的迭代变换,可以避免梯度消失的问题,使网络学到长程的规律。

一个RNN单元的输入由两部分组成,即前一步RNN单元的隐状态和当前这一步的外部输入,此外还有一个输出。从外部结构看,LSTM和RNN的输入输出一模一样,同样是在每一步接受外部输入和前一阶段的隐状态,并输出一个值。因此,RNN可以无缝切换到LSTM。

LSTM里各模块分别使用什么激活函数,可以使用别的激活函数吗?

在LSTM中,遗忘门、输入门和输出门使用Sigmoid函数作为激活函数;在生成候选记忆时,使用双曲正切函数Tanh作为激活函数。这两个激活函数都是饱和的,在输入达到一定值的情况下,输出就不会发生明显变化了。如果使用非饱和的激活函数,例如ReLU,那么将难以实现门控的效果。 Sigmoid函数的输出在0~1之间,符合门控的物理定义。且当输入较大或较小时,其输出会非常接近1或0,从而保证该门开或关。在生成候选记忆时,使用Tanh函数,是因为其输出在−1~1之间,这与大多数场景下特征分布是0中心的吻合。此外,Tanh函数在输入为0附近相比Sigmoid函数有更大的梯度,通常使模型收敛更快。

LSTM
https://colah.github.io/posts/2015-08-Understanding-LSTMs/

LSTM的单细胞更新主要包括四块内容:遗忘门、输入门、细胞状态更新、输出门

t-1时刻的状态ht-1和当前时刻t的输入x,分别经过三个Sigmoid函数得到0到1之间的概率值,然后分别作用于遗忘门、输入门和输出门。

遗忘门:决定上一细胞状态Ct-1的哪些信息被保留下来。如果值为1,则为全部保留;如果值为0,则为全部丢弃。

输入门:决定哪些新输入信息被留下来。新输入信息是t-1时刻的状态ht-1和当前时刻t的输入x 经过tanh函数后,得到当前细胞状态的候选

细胞状态更新:旧细胞状态Ct-1 和 当前细胞输入被遗忘门和输入门按比例激活后,相加得到当前细胞状态Ct。

输出门:决定了最后的输出信息。更新后的细胞状态Ct通过tanh激活函数后,与Sigmoid相乘决定最后输出的信息。

门控循环单元(GRU)

它将遗忘门和输入门合并为一个“更新门”。它还合并了单元格状态和隐藏状态,并进行了一些其他更改。比标准的LSTM模型更简单,并且越来越受欢迎

ELMo模型

https://arxiv.org/pdf/1802.05365

ELMo (Embeddings from Language Models)对多义词表示问题提出了一个较好的解决方案,核心思想是仅训练一个语言模型,在以不同的句子作为输入时,模型可以根据上下文来推断每个词代表的词向量。

在自然语言处理任务中,很多单词是与上文和下文同时相关的。

RNN无法捕捉后续的句子对当前单词的影响。ELMo通过双向LSTM结构,较好低解决了此类问题。

不同于word2vev中固定的词向量表示,ELMo通过双向LSTM,同时考虑了上下文信息,从而较好低解决了多一次的表示问题。

前向LSTM通过单词tk的上文计算概率:

后向LSTM通过单词tk的下文计算概率:

整合单词tk的上下文信息,最大化以下对数似然概率:

其中,是将单词应为为词向量的参数(输入x的embedding),是softmax层的网络参数,是前后向LSTM的参数。

对于每一个单词tk,一个L层的双向语言模型需要计算2L+1个表征:分别为 单词tk的向量表示 + L层*(前向表示 + 后向表示)

最终每个单词k的向量可以表示为:

w0*单词tk的向量表示 + w1*(前向表示 + 后向表示) + ......+ wL*(前向表示 + 后向表示)

ELMo模型的词向量该如何使用呢?在自然语言处理下游任务的过程中,由于大多数监督模型在底层的结构大致相同,可以用统的方式来添加ELMo词向量。举例来说,对于一个含有N个单词的序列t1,t2,...tw,其上下文无关的嵌入式表示是固定不变的,为了更好地使用上下文语义信息,需要将单词的嵌人式表示x与ELMo向量进行拼接,最后得到单词的最终词问量。这也是为什么上一个公式中需要有一个缩放系数γtask的原因。

第三章 Transformer 与 Attention

The Illustrated Transformer – Jay Alammar – Visualizing machine learning one concept at a time.

RNN和Transformer的对比

RNN:参数共享,每次迭代只更新新增一个单词,有长程依赖问题。

Transformer:所有单词一起输入,self attention和残差链接解决了长程依赖和梯度消失问题,串联的多层结构让神经网络变得更深,模型的特征提取能力也更强,单词之间的交互更加充分。这使得其逐渐取代RNN和CNN成为NLP和CV领域通用的特征提取器。

  

Transformer的整体框架介绍

Transformer的提出是为了解决机器翻译任务的,主体使用了编码器-解码器结构。编码器部分由N个Encoder堆叠而成,主要用于接收输入语句,提取特征并输出语义特征向量。解码器部分由N个Decoder堆叠而成,负责根据语义特征向量,逐字生成目标语言的译文。

Encoder部分包括:输入编码层、多头自注意力层、前馈网络层

1. 输入编码层

输入Embedding层:对于输入的序列,每个词元会经过Embedding模块映射成一个可学习的、固定长度的词向量,所有向量组成的矩阵为一个句子序列的embedding特征表示。

位置编码:由于Transformer本身无法识别序列中元素的顺序,需要额外引入位置编码模块表示序列中元素的位置信息。一般是根据元素在输入中的绝对位置分配一个固定长度的向量。

每个元素对应的词向量和位置向量将直接相加,生成最终的输入Embedding序列。

2. 多头自注意力层

多头自注意力:首先使用三个权重矩阵将输入序列映射为Q(查询)、K(键)和V(值)矩阵,然后通过计算Q和K的点积得到注意力得分,并用softmax函数归一化。将注意力得分与V相乘之后进行加权求和,得到每个单词的自注意力表示。最后,将多头注意力的输出进行拼接,并通过一个线性层进行变换。

残差连接和层归一化:为了避免在优化过程中因网络过深而产生潜在的梯度消失问题,将当前层的输入与多头自注意层的输出进行残差连接。为了使梯度维持在一个可控范围内,使神经网络训练过程更加稳定,对残差连接后的输出进行层归一化。

3. 前馈网络层

前馈网络:为了提升模型的表达能力,学习复杂的函数关系和交互特征,Transformer使用前馈网络层对所有元素的embedding进行了更复杂的非线性变换。

残差连接和层归一化:同样,为了避免梯度消失和保证模型训练的稳定,前馈网络层的输出与多头自注意力层的输出残差连接后再进行层归一化。

编码器和解码器内部结构的不同之处:

  1. 掩码自注意力(Masked Self-Attention):Encoder的多头自注意力层,在Decoder中被更改为Masked多头自注意力。因为在翻译的过程中,编码器主要用于编码源语言序列的信息,这个序列是完全已知的,编码器仅需要考虑如何融合上下文语义信息。而解码器则负责生成目标语言序列,这一生成过程是自回归的,即对于每一个单词的生成过程,预测某个位置的单词时,只能看到该位置之前的单词, 因此需要增加掩码来掩盖后续的文本信息,以防模型在训练阶段直接看到后续的文本序列进而无法得到有效地训练。
  2. 编码器-解码器注意力(Encoder-Decoder Attention):Decoder的结构比Encoder的多了一个Encoder-Decoder Attention层,这一层是让Decoder接收Encoder提取的语义信息,连接两种语义特征的融合层。需要注意的是,编码器经过多层Encoder提取的语义特征向量会被输人到解码器的每一个Decoder的Encoder-Decoder Attention层中。其中,查询(Q)来自解码器的上一层输出,而键(K)和值(V)则来自编码器的输出。这样,解码器在生成每个位置的单词时,都可以参考整个输入序列的信息。
  3. 线性变换和softmax函数:解码器最上层输出多了一个Linear层和Softmax层。经过Linear层后,输出维度变成词表维度,向量的每个元素都代表词表中的一个词。经过Softmax层后,向量中每个元素的值代表词表中具有相同序号的词作为翻译结果的概率。对经过Softmax层后的概率向量进行arg max 操作,得到概率最大的词表序号,查词表可得下一个词的最佳翻译词。将解码器的输出转换为概率分布,表示下一个单词的预测概率。
  4. 编码器接收输入语言完整的句子,作用是将每个输入词元都编码成一个上下文语义相关的表示向量,而解码器输入是编码器的输出和前面生成的部分输出序列,输出是下一个位置的翻译概率,即每次运行解码器只生成一个词。假设翻译结果由N个词组成,则翻译整个句子只需要调用1次编码器,而只需要调用N+1次解码器(包括翻译终止符,该终止符不算在译文内)。

编码器

编码器结构由多个相同的层堆叠而成,其中每一层都包含多头自注意力模块和前馈网络模块。在注意力和前馈网络后,模型使用残差连接和层归一化来加强模型的训练稳定度。其中,残差连接(Residual Connection)将输入与该层的输出相加,实现了信息在不同层的跳跃传递,从而缓解梯度爆炸和消失的问题。而 LayerNorm 则对数据进行重新放缩,提升模型的训练稳定性。

编码器接受经过位置编码层的词嵌入序列

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/821754
推荐阅读
相关标签