我的创作纪念日兼GPT模型简单介绍

目录

一、引言

二、收获与开端

2.1 问题:在创作的过程中都有哪些收获?

2.2 模型开端

三、日常与深入

3.1 问题:当前创作和你的学习是什么样的关系?

3.2 模型深入介绍

3.2.1 无监督预训练

3.2.2 有监督下游任务精调

四、憧憬与应用

4.1 问题:你的创作规划和终极目标是什么?

4.2 适配不同的下游任务


一、引言

今天的文章比较特别,原因在于我想在其中尝试融入两个不同元素。一方面介绍自然语言处理中有关GPT模型的知识,另一方面简单谈谈自己的创作历程。下面的每一大节都将由这两方面组成。

二、收获与开端

2.1 问题:在创作的过程中都有哪些收获?

在培根的《谈读书》一文中有三句最为经典的话:“Reading maketh a full man; conference a ready man; and writing an exact man.”  我喜欢把他们翻译为:“读书使人丰富,辩论使人机敏,写作使人严谨。” 

细细品味,发现其中已经将创作的意义说得十分清楚,所以这里不在继续下去。

2.2 模型开端

OpenAI 公司在2018年提出了一种生成式预训练(Generative Pre Training,GPT)模型用来提升自然语言理解任务的效果,正式将自然语言处理带入“预训练”时代。
 
“预训练”时代意味着利用更大规模的文本数据以及更深层的神经网络模型学习更丰富的文本语义表示。同时,GPT的出现打破了自然语言处理各个任务之间的壁垒,使得搭建一个面向特定任务的自然语言处理模型不再需要了解非常多的任务背景,只需要根据任务的输入输出形式应用这些预训练语言模型,就能够达到一个不错的效果。因此,GPT提出了“生成式预训练+判别式任务精调”的自然语言处理新范式,使得自然语言处理模型的搭建变得不再复杂。
 
(1)生成式预训练:在大规模文本数据上训练一个高容量的语言模型,从而学习更加丰富的上下文信息;
(2)判别式任务精调:将预训练好的模型适配到下游任务中,并使用有标注数据学习判别式任务。
 
接下来将从两个部分介绍GPT模型。首先介绍GPT模型的基本结构及其预训练方法,然后介绍GPT模型在不同下游任务中的应用。

三、日常与深入

3.1 问题:当前创作和你的学习是什么样的关系?

创作与学习更多的应该是一种互补的关系。通过创作我们总结学习的内容,以便加深对知识的理解和技能的掌握;而学习是滋生创作的土壤,创作的灵感来源于学习,不断的学习使我们有能力可以继续创作。

3.2 模型深入介绍

3.2.1 无监督预训练

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

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

式中,k表示语言模型的窗口大小,即基于k个历史词X_{i-k}\cdots X_{i-1}预测当前时刻的词X_{i} θ 表示神经网络模型的参数,可使用随机梯度下降法优化该似然函数。
 
具体地,GPT使用了多层Transformer作为模型的基本结构。对于长度为k的窗口词序列{X}'=X_{-k}\cdots X_{-1},通过以下方式计算建模概率 P:

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

3.2.2 有监督下游任务精调

在预训练阶段,GPT利用大规模数据训练出基于深层Transformer的语言模型,已经掌握了文本的通用语义表示。精调(Fine-tuning)的目的是在通用语义表示的基础上,根据下游任务(Downstream task)的特性进行领域适配,使之与下游任务的形式更加契合,以获得更好的下游任务应用效果。接下来,将介绍如何将预训练好的GPT应用在实际的下游任务中。
 
下游任务精调通常是由有标注数据进行训练和优化的。假设下游任务的标注数据为C,其中每个样例的输入是X=X_{1}\cdots X_{n}构成的长度为n的文本序列,与之对应的标签为y。首先将文本序列输入预训练的GPT中,获取最后一层的最后一个词对应的隐含层输出 h_{n}^{[L]},如下面的式子所示。紧接着,将该隐含层输出通过一层全连接层变换,预测最终的标签。

式中,W^{y}\in {R}^{d\times k}表示全连接层权重,k表示标签个数。
 
最终,通过优化以下损失函数精调下游任务。
 

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

式中, L^{FT}表示精调任务损失; L^{PT}表示预训练任务损失;λ表示权重,通常λ的取值介于[0,1]。特别地,当λ=0时, L^{PT}一项无效,表示只使用精调任务损失L^{FT}优化下游任务。而当λ=1时,L^{PT}L^{FT}具有相同的权重。在实际应用中,通常设置λ=0.5,因为在精调下游任务的过程中,主要目的还是要优化有标注数据集的效果,即优化 。
 
L^{PT}的引入主要是为了提升精调模型的通用性,其重要程度不及L^{FT},因此设置 λ=0.5是一个较为合理的值(不同任务之间可能有一定的区别)。

四、憧憬与应用

4.1 问题:你的创作规划和终极目标是什么?

我是一个比较惫懒的人,没有什么明确的创作规划。具体来说,当某一个时间端突然对一个领域感兴趣时,我会根据自己的学习情况创作文章。文章可能是自己的心得体会、对某一种技术的看法或者笔记等等。至于终极目标,对一个懒散的人来说,先写满100篇文章吧。

4.2 适配不同的下游任务

由于不同任务之间的输入形式各不相同,应如何根据不同任务适配GPT的输入形式成为一个问题。本节介绍自然语言处理中几种典型的任务在GPT中的输入输出形式,其中包括:单句文本分类、文本蕴含、相似度计算和选择型阅读理解,如下图所示。

(1)单句文本分类。单句文本分类是最常见的自然语言处理任务之一,其输入由单个文本构成,输出由对应的分类标签构成。假设输入为X=X_{1}\cdots X_{n},单句文本分类的样例将通过如下形式输入GPT中。

式中,<s>表示开始标记;<e>表示结束标记。
 
(2)文本蕴含。文本蕴含的输入由两段文本构成,输出由分类标签构成,用于判断两段文本之间的蕴含关系。需要注意的是,文本蕴含中的前提(Premise)和假设(Hypothesis)是有序的,即在所有样例中需要使用统一格式,两者顺序必须固定(前提在前或者假设在前)。
 
假设文本蕴含的样例分别为X^{(1)}=X_{1}^{(1)}\cdots X_{n}^{(1)}X^{(2)}=X_{1}^{(2)}\cdots X_{m}^{(2)},其将通过如下形式输入GPT中。

 

式中,$表示分隔标记,用于分隔两段文本;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中,得到两个相应的隐含层表示。最终将这两个隐含层表示相加,并通过一个全连接层预测相似度。

(4)选择型阅读理解。选择型阅读理解任务是让机器阅读一篇文章,并且需要从多个选项中选择出问题对应的正确选项,即需要将〈篇章,问题,选项〉作为输入,以正确选项编号作为标签。
 
根据上述任务形式,假设篇章为p=p_{1}\cdots p_{n},问题为q=q_{1}\cdots q_{m},第i个选项为c^{(i)}=c_{1}^{(i)}\cdots c_{k}^{(i)},并假设N为选项个数,其将通过如下形式输入GPT中。

将〈篇章,问题,选项〉作为输入,通过GPT建模得到对应的隐含层表示,并通过全连接层得到每个选项的得分。最终,将N个选项的得分拼接,通过Softmax函数得到归一化的概率(单选题),并通过交叉熵损失函数学习。
想深入学习相关知识的读者,可以参考作者的其他文章。
 

reference:

猜你喜欢

转载自blog.csdn.net/weixin_45684362/article/details/131563391
今日推荐