GPT系列文章

GPT系列文章

GPT1

GPT1是由OpenAI公司发表在2018年要早于我们之前介绍的所熟知的BERT系列文章。总结:GPT 是一种半监督学习,采用两阶段任务模型,通过使用无监督的 Pre-training 和有监督的 Fine-tuning 来实现强大的自然语言理解。在 Pre-training 中采用了 12 层的修改过的 Transformer Decoder 结构,在 Fine-tuning 中会根据不同任务提出不同的分微调方式,从而达到适配各类 NLP 任务的目的

Improving Language Understanding by Generative Pre-Training
使用通用的预训练来提高语言的理解能力
发表时间:2018年

这篇文献的主要贡献是提出了一种基于生成式预训练的语言理解模型,该模型可以在各种自然语言处理任务上取得显著的性能提升。

在当时的NLP领域,与计算机视觉相比,缺乏大量的标注数据集。然而,无标注的文本语料库却非常丰富。因此,作者首先在大量的非标注语料库中进行生成式预训练(Generative Pre-Training),然后针对每个特定的任务进行区分性微调(Discriminative Fine-Tuning)。这种方法使得模型能够在不同的NLP任务上取得很好的表现。

这里可以说和BERT一样将CV领域成熟的迁移学习的技术引入到了NLP领域中

采用了半监督(Semi-Supervised)的训练方式,即通过无监督学习进行预训练,再通过监督学习进行微调。在评估了RNN网络和transformer网络之后,作者发现后者可以很好地捕捉较长的语言结构,从而使得模型在处理子任务时具有更好的泛化性。这种方法为模型的训练带来了很好的效果。

对于GPT1系列的文章我们主要介绍的就是GPT1系列的一个训练过程并展示一下对应的实验结果和数据。

无监督学习下的预训练(Pre-Training)

通过输入文本片段:

U = { u 1 , … , u n } \mathcal{U}=\left\{u_{1}, \ldots, u_{n}\right\} U={u1,,un}
其中u1可以表示为单个字符,U可以表示为一个包含许多字符的字符串,根据前k个词来预测下一个词ui的概率:

P ( u i ∣ u i − k , … , u i − 1 ) P\left(u_{i} \mid u_{i-k}, \ldots, u_{i-1}\right) P(uiuik,,ui1)

然后最大化似然函数来进行训练。目标函数如下所示:

P ( u i , u i − 1 , … , u 1 ) = P ( u 1 ) ⋅ P ( u 2 ∣ u 1 ) ⋅ P ( u 3 ∣ u 2 , u 1 ) ⋯ P ( u i ∣ u i − 1 , … , u 1 ) P\left(u_{i}, u_{i-1}, \ldots, u_{1}\right)=P\left(u_{1}\right) \cdot P\left(u_{2} \mid u_{1}\right) \cdot P\left(u_{3} \mid u_{2}, u_{1}\right) \cdots P\left(u_{i} \mid u_{i-1}, \ldots, u_{1}\right) P(ui,ui1,,u1)=P(u1)P(u2u1)P(u3u2,u1)P(uiui1,,u1)

L 1 ( U ) = ∑ i = k + 1 n log ⁡ P ( u i ∣ u i − k , … , u i − 1 ; Θ ) L_{1}(\mathcal{U})=\sum_{i=k+1}^{n} \log P\left(u_{i} \mid u_{i-k}, \ldots, u_{i-1} ; \Theta\right) L1(U)=i=k+1nlogP(uiuik,,ui1;Θ)

其中k表示给定k个词的情况下,通过模型Θ预测出ui​的概率,并将所有出现的词的概率取对数相加作为文本出现的联合概率。预训练的目标即为优化该L1​目标函数。

此外,模型仅使用了Transforme的解码器(Decoder)进行预训练

预测过程涉及将n个词进行词嵌入(Word Embedding),然后加上位置嵌入(Position Embedding)。接下来,文本序列通过多层 Transformer 块进行处理,并在最后一层 Transformer 块后进行最后一次投影。最后,经由 Softmax 操作,输出文本中每个词的概率分布。

其中U是tokens的上下文向量,n是层数,We 是词嵌入矩阵token embedding matrix,Wp 是position embedding matrix位置编码矩阵。

h 0 = U W e + W p h l = transformer_block ⁡ ( h l − 1 ) ∀ i ∈ [ 1 , n ] P ( u ) = softmax ⁡ ( h n W e T ) \begin{aligned} h_{0} & =U W_{e}+W_{p} \\ h_{l} & =\operatorname{transformer\_ block}\left(h_{l-1}\right) \forall i \in[1, n] \\ P(u) & =\operatorname{softmax}\left(h_{n} W_{e}^{T}\right) \end{aligned} h0hlP(u)=UWe+Wp=transformer_block(hl1)i[1,n]=softmax(hnWeT)

在这里插入图片描述

GPT预训练模型仅仅只采用transformer的解码器(decoder),是源于解码器中的第一层多头注意力(Multi-Head Attention)采用了掩码(Masked)的操作。论文中采用该方法,将k作为上下文窗口,涂抹掉信息来预测下一个词。这种掩码操作被称为自回归性质,它可以确保模型在生成序列时遵循语言的线性顺序,而不会出现随意跳跃或重复生成的情况。

监督学习下的微调(fine-tuning)

在进行大量无标注的文本语料库训练后,模型还需要在某些特定的目标任务下进行微调。给定文本

x 1 , … , x m x^{1}, \ldots, x^{m} x1,,xm

和相应的标注信息y,将它们输入到预训练模型中进行微调。在微调过程中,hlm表示最后一层Transformer块的输出,Wy表示最后一层输出层的参数。

P ( y ∣ x 1 , … , x m ) = softmax ⁡ ( h l m W y ) . P\left(y \mid x^{1}, \ldots, x^{m}\right)=\operatorname{softmax}\left(h_{l}^{m} W_{y}\right) . P(yx1,,xm)=softmax(hlmWy).

L 2 ( C ) = ∑ ( x , y ) log ⁡ P ( y ∣ x 1 , … , x m ) L_{2}(\mathcal{C})=\sum_{(x, y)} \log P\left(y \mid x^{1}, \ldots, x^{m}\right) L2(C)=(x,y)logP(yx1,,xm)

另外,将预训练好的语言模型作为辅助目标进行 Fine-tuning 不仅可以使监督模型更具泛化性,还可以加速收敛。于是我们有了最终的损失函数的形式:

L 3 ( C ) = L 2 ( C ) + λ ∗ L 1 ( C ) L_{3}(\mathcal{C})=L_{2}(\mathcal{C})+\lambda * L_{1}(\mathcal{C}) L3(C)=L2(C)+λL1(C)

模型结构图与举例

图 1:(左)本工作中使用的 Transformer 架构。 (右)用于对不同任务进行微调的输入转换。 我们将所有结构化输入转换为令牌序列,以便由我们的预训练模型进行处理,然后是线性+softmax层。

在这里插入图片描述

这里的堆叠12层的解码器结构,就和BERT中的基本模型这里的堆叠12次解码器的结构相互对应起来了。

通过添加的线性层(Linear),也是上文说的Wy参数,进行下游的任务的时候不修改transformer的结构来进行微调的实现。

  • 分类 (Classification):输入开始符(Start),文本(Text),抽取符(Extract),线性层即输出分类数。
  • 包含(Entailment):输入开始符(Start),文本(Text),分隔符(Delim),假设(Hypothesis),抽取符(Extract),线性层输出类似包含,不包含,无关三分类。
  • 相似(Similarity):输入开始符(Start),文本(Text 1),分隔符(Delim),文本(Text 2),抽取符(Extract);输入开始符(Start),文本(Text2),分隔符(Delim),文本(Text1),抽取符(Extract)。经过相加后进入线性层,输出两端文本在不同语境下是否相似的。
  • 多选(Multiple Choice):输入开始符(Start),文本(Context),分隔符(Delim),答案(Answer 1),抽取符(Extract);输入开始符(Start),文本(Context),分隔符(Delim),答案(Answer N),抽取符(Extract);每个输入都经过一个线性层而后通过softmax操作求出每个答案的置信度。

实验部分细节

最后实验是在包含7000篇没有发表的书籍上进行训练,使用12层的transformer解码器,每一层包含768维的网络进行训练,使用了3072维数的FFN(Position-wise Feed-Forward Network)层,使用了Adam优化器和GELU激活函数。

以上就是对现在大火的GPT模型最早的一个版本的简单的概述。

GPT2

在BERT模型发布并且开源之后,其在NLP上的性能已经超过了GPT1之后的GPT2这一篇文章就是对GPT1模型的一个改进。

Language Models are Unsupervised Multitask Learners
语言模型是无监督的多任务学习器
使用更大的数据集和更大的模型来去打败之前的BERT

研究背景

  1. 单任务,单领域任务的流行造成当前的机器学习系统缺乏泛化能力。而多任务学习是一个提升通用能力的很有前途的一个框架。但NLP中的多任务学习仍处于起步阶段,另一方面,当前的预训练和无监督微调的方式很流行,但仍需要监督训练。
  2. 证明语言模型可以在zero-shot setting下,不需要任何参数或架构修改执行下游任务,并取得相当不错的效果

首先摘要中讲到他们的语言模型在一个包含数百万网页的WebText数据集上没有任何显式监督的情况下进行学习。

GPT-2模型是一个有1.5B(15亿)参数的Transformer,在zero-shot setting下,在8个任务中的7个任务上都取得的sota。

GPT2论文中所提出的一个核心的观点就是基于zero-shot的一个推理过程。多任务学习与我们常规理解的有监督学习中的多任务不太一样,这里主要是指模型从大规模数据中学到的能力能够直接在多个任务之间进行迁移,而不需要额外提供特定任务的数据,因此引出了 GPT-2 的主要观点:zero-shot。

这里也就是说:不论是 GPT-1 还是 BERT,NLP 任务中比较主流的 pre-train + fine-tuning 始终还是需要一定量的下游任务有监督数据去进行额外的训练,在模型层面也需要额外的模块去进行预测,仍然存在较多人工干预的成本。GPT-2 想彻底解决这个问题,通过 zero-shot,在迁移到其他任务上的时候不需要额外的标注数据,也不需要额外的模型训练。

模型结构

GPT2和GPT1在模型结构上基本上是相同的,这里只对改进的地方进行一下简单的概述。

在模型结构方面,整个 GPT-2 的模型框架与 GPT-1 相同,只是做了几个地方的调整,这些调整更多的是被当作训练时的 trick,而不作为 GPT-2 的创新,具体为以下几点:

  1. 后置层归一化( post-norm )改为前置层归一化( pre-norm )

在这里插入图片描述
GPT-2 进行上述模型调整的主要原因在于,随着模型层数不断增加,梯度消失和梯度爆炸的风险越来越大,这些调整能够减少预训练过程中各层之间的方差变化,使梯度更加稳定。

  1. 在模型最后一个自注意力层之后,额外增加一个层归一化;

  2. 输入序列的最大长度从 512 扩充到 1024;

在这里插入图片描述

之前的GPT1和BERT在做具体的微调的时候,或加入一些额外的开始符,结束符和分隔符等一些符号。这里要做基于zero-shot的推理的话就不能在存在这个了。

模型训练

GPT-2采用了一阶段的模型(预训练)代替了二阶段的模型(预训练+ Fine tuning)。在预训练阶段,GPT-2采用了多任务的方式进行学习,每一个任务都要保证其损失函数能收敛。不同的任务共享主干的Transformer参数,这样能进一步提升模型的泛化能力,因此在即使没有Fine-turning的情况下依旧有非常不错的表现。

模型参数大小对比:最大的GPT模型约1.17亿参数(117M);最大的BERT约3.4亿参数(340M),最大的GPT-2约15亿参数(1542M)

在训练数据方面,为了保证 zero-shot 的效果,必须要足够大且覆盖面广。所以 GPT-2 专门爬取了大量的网络文本数据,最后得到的数据集叫 WebText。它选取了 Reddit 上的高质量帖子,最终得到 4500w 网页链接,800w 有效的文本文档,语料大小为 40G。

在实验效果上,由于 GPT-2 主要是做 zero-shot,所以在实验部分,很多的实验对比都是在无监督的设定下进行的,也就是说他对比的都是无监督的算法。

从上述效果可以看到,GPT-2 在较多任务上对比无监督算法取得了一定的提升,证明了 zero-shot 的能力。但是,在很多任务上与有监督微调的方法相比还是有一些差距的,这可能也是 GPT-2 在当时影响力没有那么大的一个原因

在这里插入图片描述

但是通过这个趋势可以看出随着模型参数量和规模的增大,这些翻译,总结和回答问题任务中所表现出来的性能是不断线性的上升的这就为我们的GPT3的推出打下了一个基础。

GPT3

整体来看,GPT-3 相比于 GPT-2 有如下几点区别:(大力出奇迹的过程

  1. 效果上,超出 GPT-2 非常多,能生成人类难以区分的新闻文章;
  2. 主推 few-shot,相比于 GPT-2 的 zero-shot,具有很强的创新性;
  3. 模型结构略微变化,采用 sparse attention 模块;
  4. 海量训练语料 45TB(清洗后 570GB),相比于 GPT-2 的 40GB;
  5. 海量模型参数,最大模型为 1750 亿,GPT-2 最大为 15 亿参数;

Language Models are Few-Shot Learners
GPT3又重新回到了不在追求极致的zero-shot的推理而是对不同的任务使用少量的训练的样本

总结:不管是GPT或者GPT-2,下游任务都需要大量的样本。这不符合人类的习惯,人类只需要少量的示例甚至只需要说明就适应一个全新的NLP下游任务。而GPT-3追求的就是人类这种无缝融合和切换多个任务的能力。GPT-3证明了通过增大参数量就能让语言模型提高下游任务在Few-Shot设置下的性能

GPT-3证明了通过增大参数量就能让语言模型提高下游任务在Few-Shot设置下的性能。

研究背景

虽然 GPT-2 主推的 zero-shot 在创新度上有比较高的水平,但是由于其在效果上表现平平,所以在业界并没有取得比较大的影响力,而 GPT-3 正是为了解决效果上的问题而提出的。GPT-3 不再去追求那种极致的不需要任何样本就可以表现很好的模型,而是考虑像人类的学习方式那样,仅仅使用极少数样本就可以掌握某一个任务

1750亿参数、数据集45TB,训练花了3640pfs-day,训练一次的费用保守估计是460万美元,总训练成本估计达到了1200 万美元。暴力出奇迹。此时微软已经投资OpenAI(2019年投了10亿美元),微软也在2020年9月22日宣布取得了GPT-3的独家授权。

下游任务评估方法

在这里插入图片描述

  • One-shot Learning:

    • 定义:在一次学习中,模型在训练阶段只看到一个样本的情况下,需要在推理阶段识别出新的样本。
    • 特点:模型需要极高的泛化能力,能够从单一样本中快速学习并识别出同一类别的新样本。
  • Few-shot Learning:

    • 定义:在少样本学习中,模型在训练阶段只看到很少数量的样本(通常几个到几十个),然后在推理阶段识别出同一类别的新样本。
    • 特点:相比于传统的机器学习任务,少样本学习更接近于人类学习的方式,即通过少量样本快速学习新概念。

在这里插入图片描述

Zero-shot表示仅需给出任务描述,One-shot表示仅需给出任务描述和一个例子,Few-shot表示仅需给出任务描述和少量的例子,这三种方式都不再需要进行参数更新,仅需要把少量标注样本作为输入文本的上下文,GPT-3即可输出答案。

模型结构的改进

在模型结构上,GPT-3 延续使用 GPT 模型结构,但是引入了 Sparse Transformer 中的 sparse attention 模块(稀疏注意力)。

sparse attention 与传统 self-attention(称为 dense attention) 的区别在于:

  • dense attention:每个 token 之间两两计算 attention,复杂度 O(n²)
  • sparse attention:每个 token 只与其他 token 的一个子集计算 attention,复杂度 O(n*logn)

在这里插入图片描述

训练数据

训练数据:由于 GPT-3 在模型规模上的扩大,在训练数据方面也必须进行扩充来适配更大的模型使其发挥出相应的能力。

GPT-3 使用了多个数据集,其中最大的是 Common Crawl,原始未处理的数据达到了 45TB,其实在 GPT-2 的时候他们就有考虑使用这个数据集,但是后来还是觉得这个数据集太脏了所以没用,但是现在 GPT-3 的模型规模太大了,使得训练对数据量的需求也增加了很多,他们不得不重新考虑这个数据集。因此,他们必须在这个数据集上做一些额外的数据清洗工作来尽量保证数据的质量。

在这里插入图片描述

GPT4展望

GPT4作为现在最先进的一个大模型之一,已经不是单纯的一个语言模型了而是一个多模态的模型,可以处理图文数据并产生图片和视频。

应用包括了许多:微软公布了GPT加持的Copilot

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/60438.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NUXT3学习日记四(路由中间件、导航守卫)

前言 在 Nuxt 3 中,中间件(Middleware)是用于在页面渲染之前或导航发生之前执行的函数。它们允许你在路由切换时执行逻辑,像是身份验证、重定向、权限控制、数据预加载等任务。中间件可以被全局使用,也可以只在特定页…

汽车免拆诊断案例 | 2012款路虎揽胜运动版柴油车加速无力

故障现象  一辆2012款路虎揽胜运动版车,搭载3.0T柴油发动机(型号为306DT),累计行驶里程约为10.2万km。车主进厂反映,车辆行驶中加速无力,且发动机故障灯异常点亮。 故障诊断 接车后试车,发动…

网络安全与加密

1.Base64简单说明描述:Base64可以成为密码学的基石,非常重要。特点:可以将任意的二进制数据进行Base64编码结果:所有的数据都能被编码为并只用65个字符就能表示的文本文件。65字符:A~Z a~z 0~9 / 对文件进行base64编码…

C语言:数组转换指针的时机

1、指针数组 如果一个数组中的所有元素保存的都是指针,那么我们就称它为指针数组,指针数组的定义形式一般为: dataType *arrayName[length];[ ]的优先级高于*,该定义形式应该理解为: dataType *(arrayName[length])…

UE5 DownloadImage加载jpg失败的解决方法

DownloadImage加载jpg失败的解决方法 现象解决方案具体方法 现象 用UE自带的 DownloadImage 无法下载成功,从 failure 引脚出来。 接入一个由监控器自动保存起的图像,有些可以正常加载成功,有些无法加载成功。 经调查问题出现在,…

使用 helm 部署 gitlab

一、下载 Gitlab chart 进入 artifacthub 官网 选择你想要的版本(我选择的chart版本是 8.4.0 , gitlab 版本是17.4.0 ) 进入到控制台,添加helm仓库 如果你想不改任何配置,你可以执行安装命令,等待安装即可helm instal…

FreeRTOS信号量(一)

目录 什么是信号量? 1.信号量简介 2.二值信号量 2.1二值信号量简介 1. 首先,创建时,二值信号量默认无效 2. 之后中断释放信号量 3.信号量获取成功 4、任务再次进入阻塞态 2.2 创建二值信号量 1、函数vSemaphoreCreateBinary () 2、…

51单片机-独立按键与数码管联动

独立键盘和矩阵键盘检测原理及实现 键盘的分类:编码键盘和非编码键盘 键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如:计算机键盘。靠软件编程识别的称为非编码键盘;在单片机组成…

springboot课程答疑系统(代码+数据库+LW)

摘要 随着信息互联网信息的飞速发展,无纸化作业变成了一种趋势,针对这个问题开发一个专门适应师生交流形式的网站。本文介绍了课程答疑系统的开发全过程。通过分析企业对于课程答疑系统的需求,创建了一个计算机管理课程答疑系统的方案。文章…

解锁业务成功:大数据和 AI 如何协作以释放战略洞察

在当今这个数据主导的时代,大数据与AI的协同作用对于寻求竞争优势的组织而言愈发关键。大数据以其庞大的数据量、多样化的数据类型以及高速的数据生成能力,为AI算法提供了丰富的原材料,助力其挖掘出有价值的洞见,推动明智决策的制…

24.UE5枚举,怪物分类,龙卷风技能

2-26 枚举、怪物分类、龙旋风技能、掉落概率_哔哩哔哩_bilibili 目录 1.枚举 1.1枚举类型的创建 1.2 将枚举类型绑定到怪物蓝图上 1.3枚举类型的使用 1.3.1创建新的掉落物 1.3.2更改怪物掉落逻辑 2.龙卷风技能 2.1输入映射 2.2龙卷风发射物的创建 2.3龙卷风伤害逻辑…

故障字故障码 简单介绍

一、故障字 1.1故障字的概念 故障字(Fault Word)是一种常用的技术术语,主要应用在工业控制、嵌入式系统和通信领域,用于表示系统状态或故障信息。它是一个以位为单位的编码方式,每个位(bit)对应…

鸿蒙系统ubuntu开发环境搭建

在RISC-V等平台移植鸿蒙系统OpenHarmony,需要使用linux环境进行代码的编译,为兼顾日常办公需要,可采用WindowsUbuntu虚拟机的混合开发的环境,通过网络及文件夹共享,在主机和虚拟机之间共享文件数据。 工具准备&#x…

二叉树oj题解析

二叉树 二叉树的最近公共祖先什么是最近公共祖先?leetcode中求二叉树中最近公共祖先解题1.解题2. 根据二叉树创建字符串 二叉树的最近公共祖先 什么是最近公共祖先? 最近的公共祖先指的是这一棵树中两个节点中深度最大的且公共的祖先节点就是最近祖先节…

优先算法 —— 双指针系列 - 移动零

1. 移动零 题目链接: 283. 移动零 - 力扣(LeetCode)https://leetcode.cn/problems/move-zeroes/description/ 2. 算法原理 其实像移动零这种类型的题目都有一个名字叫做数组划分(数组分块),就是说先给一个…

C语言——数组逐元素操作练习

定义一个能容纳10个元素的整形数组a&#xff0c;从键盘读取9个整数存放到前9个数组元素中。 一. 从键盘读取一个整数n和位置p(0<p<8)&#xff0c;插入n到数组a中&#xff0c;插入位置&#xff1a;下标p。要求插入点及后续的数组元素都要后移动。 代码如下&#xff1a; …

【ArcGISPro】根据yaml构建原始Pro的conda环境

使用场景 我们不小心把原始arcgispro-py3的conda环境破坏了,我们就可以使用以下方法进行修复 查找文件 在arcgis目录下找到yaml文件 如果没找到请复制以下内容到新的yaml文件 channels: - esri - defaults dependencies: - anyio=4.2.0=py311haa95532_0 - appdirs=1.4.4=p…

解决IDEA报包不存在,但实际存在的问题

前言 最近在把一个亿老项目交割给同事&#xff0c;同事在导入项目运行时遇到IDEA报包不存在&#xff0c;但实际存在的问题&#xff0c;最终通过以下方式解决 现象 在IDEA里启动运行项目&#xff0c;报某个类有问题&#xff0c;引入的包不存在。 点击这个引入的包&#xff0c;可…

使用uniapp编写APP的文件上传

使用uniapp插件文件选择、文件上传组件&#xff08;图片&#xff0c;视频&#xff0c;文件等&#xff09; - DCloud 插件市场 实用效果&#xff1a; 缺陷是只能一个一个单独上传

图算法 | 3、图分析与数据科学

图分析(Graph Analytics)在本质上是对图数据的处理与分析&#xff0c;其过程可以概括为图计算。 而图计算的范畴不仅包含数据的计算或分析&#xff0c;还包含元数据管理、模式管理、数据建模、数据清洗、转换、加载、治理、图分析与计算等一系列操作。 或许我们用大数据生命周…