《自然语言处理:基于预训练模型的方法》第七章 预训练语言模型-GPT

OpenAI公司在2018年提出了一种生成式预训练(Generative Pre-Training,GPT)模型,用来提升自然语言理解任务的效果,正式将自然语言处理带入“预训练”时代。“预训练”时代意味着利用更大的规模的文本数据以及更深层的神经网络模型学习更丰富的文本语义表示。

GPT的出现打破了自然语言处理各个任务之间的壁垒,使得搭建一个面向特定任务的自然语言处理模型不再需要了解非常多的任务背景,只需要根据任务的输入输出形式应用这些预训练语言模型,就能够达到一个不错的效果。

因此,GPT提出了“生成式预训练+判别式任务精调”的自然语言处理新范式,使得自然语言处理模型的搭建变得不再复杂。

生成式预训练:在大规模文本数据上训练一个高容量的语言模型,从而学习更加丰富的上下文信息。

判别式任务精调:将训练好的模型适配到下游任务中,并使用有标注数据学习判别式任务。

1.无监督预训练

GPT整体结构是一个基于Transformer的单向语言模型,即从左至右对输入文本建模。

GPT利用常规语言建模的方法优化给定文本序列x=x_{1} \cdots x_{n}的最大似然估计\mathcal{L}^{\mathrm{PT}}

\mathcal{L}^{\mathrm{PT}}(x)=\sum_{i} \log P\left(x_{i} \mid x_{i-k} \cdots x_{i-1} ; \boldsymbol{\theta}\right)

式中k表示语言模型的窗口大小,即基于k个历史词x_{i-k} \cdots x_{i-1}预测当前时刻的词x_{i}

\theta表示神经网络模型的参数,可使用随机梯度下降法优化该似然函数。

GPT使用了多层Transformer作为模型的基本结构。

对于长度为k的窗口词序列x^{\prime}=x_{-k} \cdots x_{-1},通过以下方式计算建模概率P

\begin{aligned} \boldsymbol{h}^{[0]} &=\boldsymbol{e}_{x^{\prime}} \boldsymbol{W}^{\mathrm{e}}+\boldsymbol{W}^{\mathrm{p}} \\ \boldsymbol{h}^{[l]} &=\text { Transformer-Block }\left(\boldsymbol{h}^{[l-1]}\right), \quad \forall l \in\{1,2, \cdots, L\} \\ P(x) &=\operatorname{Softmax}\left(\boldsymbol{h}^{[L]} \boldsymbol{W}^{\mathrm{e}^{\top}}\right) \end{aligned}

式中, e_{x^{\prime}} \in \mathbb{R}^{k \times|\mathbb{V}|}表示 x^{\prime}的独热向量表示; W^{\mathrm{e}} \in \mathbb{R}^{|V| \times d}表示词问量矨陎; W^{\mathrm{p}} \in \mathbb{R}^{n \times d}表示位置向量矩阵(此处只截取窗口x^{\prime}对应的位置向量 ) ; L表示 Transformer 的总层数。

2.有监督的下游任务精调

在预训练阶段,GPT利用大规模数据训练出基于深层Transformer的语言模型,已经掌握了文本的通用语义表示

精调(Fine-tuning)的目的是在通用语义表示的基础上,根据下游任务(Downstream task)的特性进行领域适配,使之与下游任务的形式更加契合,以获得更好的下游任务应用效果。

下游任务精调通常是由有标注数据进行训练和优化的。假设下游任务的标注数据为\mathcal{C},其中每个样例的输入是x=x_{1} \cdots x_{n}构成的长度为n的文本序列,与之对应的标签为y。首先将文本序列输入预训练的GPT中,获取最后一层的最后一个词对应的隐含层输出\boldsymbol{h}_{n}^{[L]}

紧接着,将该隐含层输出通过一层全连接层变换,预测最终的标签。

P\left(y \mid x_{1} \cdots x_{n}\right)=\operatorname{Softmax}\left(\boldsymbol{h}^{[L]} \boldsymbol{W}^{\mathrm{y}}\right)

式子中,\boldsymbol{W}^{\mathrm{y}} \in \mathbb{R}^{d \times k}表示全连接层权重,k表示标签个数。

最终,通过优化以下损失函数精调下游任务:

\mathcal{L}^{\mathrm{FT}}(\mathcal{C})=\sum_{(x,y)} \log P\left(y \mid x_{1} \cdots x_{n}\right)

另外,为了进一步提升精调后模型的通用性以及收敛速度,可以在下游任务精调时加入一定权重的预训练任务损失。这样做是为了缓解下游任务精调的过程中出现灾难性遗忘(Catastrophic Forgetting)问题。因为在下游任务精调过程中,GPT的训练目标是优化下游任务数据上的效果,更强调特殊性。因此,势必会对预训练阶段学习的通用知识产生部分的覆盖或擦除,丢失一定的通用性。

通过结合下游任务精调损失预训练任务损失,可以有效地缓解灾难性遗忘的问题,在优化下游任务效果的同时保留一定的通用性。

在实际应用中,可通过下式精调下游任务:

\mathcal{L}(\mathcal{C})=\mathcal{L}^{\mathrm{FT}}(\mathcal{C})+\lambda \mathcal{L}^{\mathrm{PT}}(\mathcal{C})

式中,\mathcal{L}^{\mathrm{FT}}表示精调任务损失,\mathcal{L}^{\mathrm{PT}}表示预训练任务损失;\lambda表示权重,通常\lambda的取值介于[0,1]。

特别地,当\lambda=0时,\mathcal{L}^{\mathrm{PT}}一项无效,表示只是用精调任务损失\mathcal{L}^{\mathrm{FT}}优化下游任务。

\lambda=1时,\mathcal{L}^{\mathrm{PT}}\mathcal{L}^{\mathrm{FT}}具有相同的权重。

在实际应用中,通常设置\lambda=0.5。因为在精调下游任务的过程中,主要目的还是要优化有标注数据集的效果,即优化\mathcal{L}^{\mathrm{FT}}。而\mathcal{L}^{\mathrm{PT}}的引入主要是为了提升精调模型的通用性,其重要程度不及\mathcal{L}^{\mathrm{FT}},因此设置\lambda=0.5是一个较为合理的值(不同任务之间可能有一定的区别)

3.适配不同的下游任务

上一小节讲了GPT在下游任务精调的通用做法。但不同任务之间的输入形式各不相同,应如何根据不同任务适配GPT的输入形式成为一个问题。本届介绍自然语言处理中几种典型的任务在GPT中的输入输出形式,其中包括:单句文本分类、文本蕴含、相似度计算和选择型阅读理解。

 (1)单句文本分类

最常见的自然语言处理任务之一,其输入由单个文本构成,输出由对应的分类标签构成。假设输入为x=x_{1} \cdots x_{n}

单句文本分类的样例将通过如下形式输入GPT中。

x^{(2)}<s>x=x_{1} \cdots x_{n}<e>

式中<s>表示开始标记,<e>表示结束标记。

(2)文本蕴含

文本蕴含的输入由两段文本构成,输出由分类标签构成,用于判断两段文本之间的蕴含关系。

需要注意的是,文本蕴含中的前提(Premise)和假设(Hypothesis)是有序的,即在所有样例中需要使用统一格式,两者顺序必须固定(前提在前或者假设在前)

假设文本蕴含的样例分别为

x^{(1)}=x_{1}^{(1)} \cdots x_{n}^{(1)}x^{(2)}=x_{1}^{(2)} \cdots x_{m}^{(2)},其将通过如下形式输入GPT中。

<\mathrm{s}>x_{1}^{(1)} x_{2}^{(1)} \cdots x_{n}^{(1)} \$ x_{1}^{(2)} x_{2}^{(2)} \cdots x_{m}^{(2)}<\mathrm{e}>

其中,$表示分隔标记,用于分隔两段文本;n和m分别表示x^{(1)}x^{(2)}的长度。

(3)相似度计算

相似度计算任务也由两段文本构成。但与文本蕴含任务不同的是,参与相似度计算的两段文本之间不存在顺序关系。假设相似度计算的样例分别为x^{(1)}=x_{1}^{(1)} \cdots x_{n}^{(1)}x^{(2)}=x_{1}^{(2)} \cdots x_{m}^{(2)},其将通过如下形式输入GPT中,得到两个相应的隐含层表示。最终将这两个隐含层表示相加,并通过一个全连接层预测相似度。

\begin{aligned} &<\mathrm{s}>x_{1}^{(1)} x_{2}^{(1)} \cdots x_{n}^{(1)} \$ x_{1}^{(2)} x_{2}^{(2)} \cdots x_{m}^{(2)}<\mathrm{e}> \\ &<\mathrm{s}>x_{1}^{(2)} x_{2}^{(2)} \cdots x_{m}^{(2)} \$ x_{1}^{(1)} x_{2}^{(1)} \cdots x_{n}^{(1)}<\mathrm{e}> \end{aligned}

(4)选择型阅读理解

选择型阅读理解人物是让机器阅读一篇文章,并且需要从多个选项中选择出问题对应的正确选项,即需要将<篇章,问题,选项>作为输入,以正确选项编号作为标签。根据上述任务形式,假设篇章为

p=p_{1} p_{2} \cdots p_{n},问题为q=q_{1} q_{2} \cdots q_{m},第i个选项为c^{(i)}=c_{1}^{(i)} c_{2}^{(i)} \cdots c_{k}^{(i)},并假设N为选项个数,其将通过如下形式输入GPT中。

\begin{aligned} &<\mathrm{s}>p_{1} p_{2} \cdots p_{n} \$ q_{1} q_{2} \cdots q_{m} \$ c_{1}^{(1)} c_{2}^{(1)} \cdots c_{k}^{(1)}<\mathrm{e}> \\ &\begin{array}{l} <\mathrm{s}>p_{1} p_{2} \cdots p_{n} \$ q_{1} q_{2} \cdots q_{m} \$ c_{1}^{(2)} c_{2}^{(2)} \cdots c_{k}^{(2)}<\mathrm{e}> \\ \vdots \\ <\mathrm{s}>p_{1} p_{2} \cdots p_{n} \$ q_{1} q_{2} \cdots q_{m} \$ c_{1}^{(N)} c_{2}^{(N)} \cdots c_{k}^{(N)}<\mathrm{e}> \end{array} \end{aligned}

将<篇章,问题,选项>作为输入,通过GPT建模得到对应的隐含层表示,并通过全连接层得到每个选项的得分。最终,将N个选项的得分拼接,通过Softmax函数得到归一化的概率(单选题),并通过交叉熵损失函数学习。

问:论文是怎么写出来?

答:不知道,应该是,鼠标一下下点,键盘一个个敲,一分钟一分钟熬出来的

你可能感兴趣的:(自然语言处理,自然语言处理,语言模型,机器学习,深度学习,预训练语言模型)