【李沐精读系列】GPT、GPT-2和GPT-3论文精读

论文:

        GPT:Improving Language Understanding by Generative Pre-Training

        GTP-2:Language Models are Unsupervised Multitask Learners

        GPT-3:Language Models are Few-Shot Learners

参考:GPT、GPT-2、GPT-3论文精读、论文小结:GPT1、李宏毅版GPT、

GPT-1/GPT-2/GPT-3/GPT-3.5 语言模型详细介绍、GPT系列:GPT, GPT-2, GPT-3精简总结

 关于Transformer、BERT和GPT的时间轴,如下:

三个模型的对比

一、GPT

        GPT的训练过程采用了预训练和微调的二段式训练策略。在预训练阶段,GPT模型基于大规模的语料进行无监督预训练,得到文本的语义向量。具体来说,GPT采用了标准语言模型,即通过上文预测当前的词

        GPT提出的一种半监督方案:

  • 非监督式预训练: 利用大规模无标记语料,构建预训练单向语言模型。
  • 监督式微调: 用预训练的结果作为下游任务的初始化参数,增加一个线性层,匹配下游任务
    • 具体是DecoderTransformer参数用预训练的结果初始化,和词向量相比,直接对句子序列建模。
    • 采用的Transormer Decoder, 和原始的Transformer相比,因为不是seq2seq模型,将对应部份的模块去除。
1.1 模型结构

        GPT只使用了Transformer 的Decoder结构,而且只是用了Mask Multi-Head Attention。Transformer 结构提出是用于机器翻译任务,机器翻译是一个序列到序列的任务,因此 Transformer 设计了Encoder 用于提取源端语言的语义特征,而用 Decoder 提取目标端语言的语义特征,并生成相对应的译文。GPT目标是服务于单序列文本的生成式任务,所以舍弃了关于 Encoder部分以及包括 Decoder 的 Encoder-Dcoder Attention 层(也就是 Decoder中 的 Multi-Head Atteion)。

        GPT保留了Decoder的Masked Multi-Attention 层和Feed Forward层,并扩大了网络的规模。将层数扩展到12层,GPT还将Attention 的维数扩大到768(原来为512),将 Attention 的头数增加到12层(原来为8层),将 Feed Forward 层的隐层维数增加到3072(原来为2048),总参数达到1.5亿。

        BERT与GPT的区别

  • BERT是用了Transformer中的Encoder部分,它更类似完形填空,根据上下文来确定中间词(在预测词的时候既能看到前面的也能看后面的)
  • GPT用了Transformer中Decoder部分,它是标准的语言模型。通过给出的上文预测下一个词,类似预测未来。

        对于位置编码的部分,实际上GPT和普通的Transformer的区别还是很大的,普通的Transformer的位置编码,是由余弦+正弦的方式学习出来的,而GPT中,采用与词向量相似的随机初始化,并在训练中进行更新,即是把每一个位置当做一个要学习的embedding来做。

1.2 预训练+微调

GPT属于自监督预训练 (语言模型)+微调的范式。

1.2.1 预训练
  • 预训练:用的是标准的语言模型的目标函数,即似然函数,根据前k个词预测下一个词的概率。

        假设有一个没有标号的文本\upsilon =\left \{ u_{1},...,u_{n} \right \},GPT使用一个标准语言模型的目标函数来最大化下面的似然函数:

L_{1}( \upsilon )=\sum_{i}logP(u_i|u_{i-k},...,u_{i-1};\Theta )

其中,k是上下文窗口大小。

h_0=UW_e+W_p

h_l=transformer_block(h_{l-1})\forall i\in [1,n]

P(u)=softmax(h_nW_e^T)

其中U=(u_{-k},...,u_{-i}),第一步:UW_e是对词嵌入进行投影,W_p代表位置信息的编码,两者相加得到第一层输出h_0。第二步:n层第一部的transformer块,每一层把上一层的输出作为输入经过计算得到输出,因为Transformer不会影响输入输出的形状。第三步:拿到最后的输出做一个投影利用softmax就会得到概率分布。

1.2.2 微调
  • 微调:用的是完整的输入序列+标签。目标函数=有监督的目标函数+λ*无监督的目标函数。

        在微调任务里是有标号的数据集。具体来说,每次输入一个长为m的词序列x^1,...x^m,序列的标号为y。通过输入的序列去预测标号y

P(y|x^1,...,x^m)=softmax(h_l^mW_y)

        把训练好的序列给GPT模型,拿到transformer快的最后一层输出h_l^m,乘以输出层W_y,得到的结果做一个softmax就得到所需要的概率了。

        把所有带有标号的序列对输入后,通过计算真实的标号概率P,最后进行最大化。

L_2(C)=\sum_{x,y}lopP(y|x^1,...,x^m)

        如果把有监督的分类和之前的无监督语言模型放在一起,效果会更好。

L_3(C)=L_2(C)+\lambda *L_1(C)

1.3 不同下游任务的输入转换

        GPT的Decoder运作例子

二、GPT-2

GPT-2与GPT的区别
        GPT-2和GPT的区别在于GPT-2使用了更多的网络参数和更大的数据集,以此来训练一个泛化能力更强的词向量模型。GPT-2相比于GPT有如下几点区别:

  •  主推zero-shot,而GPT-1为pre-train+fine-tuning;
  • 模型更大,参数量达到了15亿个,而GPT-1只有1.17亿个;
  • 数据集更大,WebText数据集包含了40GB的文本数据,而GPT-1只有5GB;
  • 训练参数变化,batch_size 从 64 增加到 512,上文窗口大小从 512 增加到 1024;

        所以GPT-2的核心思想就是,当模型的容量非常大且数据量足够丰富时,仅仅靠语言模型的学习便可以完成其他有监督学习的任务,不需要在下游任务微调。

2.1 模型结构

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

  • 后置层归一化( post-norm )改为前置层归一化( pre-norm );
  • 在模型最后一个自注意力层之后,额外增加一个层归一化;
  • 调整参数的初始化方式,按残差层个数进行缩放,缩放比例为;
  • 输入序列的最大长度从 512 扩充到 1024;

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

2.2 预训练+zero-shot

        预训练和GPT基本没什么区别,但是对下游任务用了zero-shot。

  • GPT-2可以在zero-shot设定下实现下游任务,即不需要用有标签的数据再微调训练。
  • 为实现zero-shot,下游任务的输入就不能像GPT那样在构造输入时加入开始、中间和结束的特殊字符,这些是模型在预训练时没有见过的,而是应该和预训练模型看到的文本一样,更像一个自然语言。
  • 可以通过做prompt的方式来zero-shot。例如机器翻译和阅读理解,可以把输入构造成,“请将下面的一段英语翻译成法语,英语,法语”。
  • 为何zero-shot这种方式是有效的呢?从一个尽可能大且多样化的数据集中一定能收集到不同领域不同任务相关的自然语言描述示例,数据集里就存在展示了这些prompt示例,所以训练出来就自然而然有一定zero-shot的能力了。
2.2.1 zero-shot

        在GPT中,模型预训练完成之后会在下游任务上微调,在构造不同任务的对应输入时,我们会引入开始符(Start)、分隔符(Delim)、结束符(Extract)。虽然模型在预训练阶段从未见过这些特殊符号,但是毕竟有微调阶段的参数调整,模型会学着慢慢理解这些符号的意思。

       在GPT-2中,要做的是zero-shot,也就是没有任何调整的过程了。这时我们在构造输入时就不能用那些在预训练时没有出现过的特殊符号了。所幸自然语言处理的灵活性很强,我们只要把想要模型做的任务 “告诉” 模型即可,如果有足够量预训练文本支撑,模型想必是能理解我们的要求的。

        举个机器翻译的例子,要用GPT-2做zero-shot的机器翻译,只要将输入给模型的文本构造成translate english to chinese, [englist text], [chinese text] 就好了。比如:translate english to chinese, [machine learning], [机器学习] 。这种做法就是日后鼎鼎大名的prompt

下面还有其他任务的zero-shot形式:

        问答:question answering prompt+文档+问题+答案: answer the question, document, question, answer。

        文档总结:summarization prompt+文档+总结:summarize the document, document, summarization。

zero-shot例子(这就可以看到ChatGPT雏形了): 

三、GPT-3

        GPT-2虽然提出zero-shot,比bert有新意,但是有效性方面不佳。GPT-3考虑few-shot,用少量文本提升有效性。

        GPT-3希望训练出的模型能一定程度上理解语句本身的意思,所以对于下游问题,不更新原训练出模型的参数(不用计算梯度),而是通过改变下游问题的格式,给出提示,让模型能够理解下游任务并做出回答。

3.1 模型结构
  • GPT基于transformer的decoder结构。
  • GPT-3模型和GPT-2一样,但GPT-3应用了Sparse Transformer中的attention结构。

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

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

具体来说,sparse attention 除了相对距离不超过 k 以及相对距离为 k,2k,3k,... 的 token,其他所有 token 的注意力都设为 0,如下图所示:

实际途中sparse attention部分的第二行就是涉及到的attention的token内容,可以看出首先关注了附近四个token,其次是2k,3k距离的token。

使用sparse attention的好处主要有以下两点:

  • 减少注意力层的计算复杂度,节约显存和耗时,从而能够处理更长的输入序列;
  • 具有“局部紧密相关和远程稀疏相关”的特性,对于距离较近的上下文关注更多,对于距离较远的上下文关注较少;
3.2 预训练+few-shot
3.2.1 few-shot

        论文尝试了如下下游任务的评估方法:few-shot learning(10-100个小样本);one-shot learning(1个样本);zero-shot(0个样本);其中few-shot效果最佳。

  • fine-tuning:预训练 + 训练样本计算loss更新梯度,然后预测。会更新模型参数
  • zero-shot:预训练 + task description + prompt,直接预测。不更新模型参数
  • one-shot:预训练 + task description + example + prompt,预测。不更新模型参数
  • few-shot(又称为in-context learning):预训练 + task description + examples + prompt,预测。不更新模型参数

zero-shot、one-shot和few-shot的区别:

其中 Few-shot 也被称为in-context learning,虽然它与fine-tuning一样都需要一些有监督标注数据,但是两者的区别是:

  • fine-tuning基于标注数据对模型参数进行更新,而 in-context learning 使用标注数据时不做任何的梯度回传,模型参数不更新
  •  in-context learning 依赖的数据量(10~100)远远小于fine-tuning一般的数据量;
3.3 GPT-3与GPT-2的区别
  • 模型结构上来看,在GPT-2的基础上,将attention改为了sparse attention。
  • 效果上远超GPT-2,生成的内容更为真实。
  • GPT-3主推few-shot,而GPT-2主推zero-shot。
  • 数据量远大于GPT-2:GPT-3(45T,清洗后570G),GPT-2(40G)。
  • GPT-3最大模型参数为1750亿,GPT-2最大为15亿。
3.4 GPT-3的局限性
  • 数据量和参数量的骤增并没有带来智能的体感。从参数量上看,从GPT2 1.5B到GPT3 175B约116倍参数量的增加,从数据量上看,GPT2 40G到GPT3 570G近15倍训练数据增加,带来的“更”智能,或者简单点说“更few/zero-shot”的能力。
  • GPT-3的训练数据是从互联网上爬取的,因此可能存在一些错误或不准确的数据。
  • GPT-3在处理某些任务时可能会出现错误或不准确的结果,以及不合理或不合逻辑的结果。
  • 文本生成方面;结构和算法上的局限性(采用的是decoder,不像BERT可以向前向后看)。
  • 样本有效性不够 。
  • 语言模型是很均匀的训练下一个词,没有权重。

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

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

相关文章

javaSE-----继承和多态

目录 一.初识继承: 1.1什么是继承,为什么需要继承: 1.2继承的概念与语法: 二.成员的访问: 2.1super关键字 2.2this和super的区别: 三.再谈初始化: 小结: 四.初识多态: 4.1多…

100. 相同的树

代码实现: /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool compare(struct TreeNode *tree1, struct TreeNode *tree2) {if (tree1 NULL && tree2 ! NU…

防御保护第七次作业-IPSEC VPPN实验

(场景选用点到点,配置好FW1的出接口地址和对端FW3的接口地址,认证方式选用预共享密钥,身份认证选用IP地址) 1、FW1 IP Sec策略配置 IKE参数配置: IP Sec参数: FW2配置: 加密数据流配…

SpringBoot 热部署。

SpringBoot 热部署。 文章目录 SpringBoot 热部署。 pom.xml。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional…

Jmeter二次开发实现rsa加密

jmeter函数助手提供了大量的函数&#xff0c;像 counter、digest、random、split、strLen&#xff0c;这些函数在接口测试、性能测试中大量被使用&#xff0c;但是大家在实际工作&#xff0c;形形色色的测试需求不同&#xff0c;导致jmeter自带或者扩展插件给我们提供的函数无法…

React-子传父

1.概念 说明&#xff1a;React中子组件向父组件传递数据通常涉及回调函数和状态提升等方法。 2.代码实现 2.1绑定事件 说明&#xff1a;父组件绑定自定义事件 <Son onGetSonMsg{getMsg}></Son> 2.2接受事件 说明&#xff1a;子组件接受父组件的自定义事件名称…

数据结构与算法-插值查找

引言 在计算机科学的广阔天地中&#xff0c;数据结构和算法扮演着至关重要的角色。它们优化了信息处理的方式&#xff0c;使得我们在面对海量数据时能够高效、准确地进行检索与分析。本文将聚焦于一种基于有序数组且利用元素分布规律的查找算法——插值查找&#xff08;Interpo…

tomcat基础介绍

目录 一、Tomcat的基本介绍 1、Tomcat是什么&#xff1f; 2、Tomcat的配置文件详解 3、Tomcat的构成组件 6、Tomcat的请求过程 一、Tomcat的基本介绍 1、Tomcat是什么&#xff1f; Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器…

C++核心编程之内存分区模型,引用,函数提高

1&#xff0c;类型分区模型 c程序在执行中&#xff0c;将内存大方向划分为4个区域 1&#xff0c;代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理的 2&#xff0c;全局区&#xff1a;存放全局变量和静态变量以及常量 3&#xff0c;栈区&#xff1…

【性能测试】Jmeter性能压测-阶梯式/波浪式场景总结(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、阶梯式场景&am…

IDEA中四款代码补全的插件

说明&#xff1a;本文介绍四款IDEA中代码补全的插件及使用感受&#xff0c;插件如下&#xff1a; 以下插件都在2023.2版本的IDEA中安装使用的&#xff0c;旧版本IDEA可能无法使用。 Tabnine 在IDEA的插件商店中安装&#xff0c;官网&#xff08;https://www.tabnine.com/&…

ai智能写作软件推荐,ai一键生成作文

很多小伙伴们都觉得写作是一件让人头痛的事情。因为不仅要让自己的文字流畅有条理&#xff0c;还需要通过一些修辞手法来使文章更加生动有趣。市场上不断涌现出各种各样的AI人工智能原创文章写作平台&#xff0c;哪些才好用&#xff0c;才是适合自己的呢&#xff1f; 爱制作ai …

Z Potentials | 星爵,他的征途不止向量数据库

纵观过去几十年的科技发展史&#xff0c;每一代新的技术架构的出现往往都伴随着新的数据范式的出现&#xff0c;也催生了多家百亿到千亿美金数据平台的诞生。如果说 2023 年科技领域的关键词是 LLM&#xff0c;那么数据库领域的关键词一定非向量数据库莫属。向量数据库是一种专…

Redis核心数据结构之字典(二)

字典 解决键冲突 当有两个或以上数量的键被分配到了一个哈希表数组的同一个索引上面&#xff0c;我们称这些键发生了冲突(collision)。 Redis的哈希表使用链地址法(separate chaining)来解决键冲突&#xff0c;每个哈希表节点都有一个next指针&#xff0c;多个哈希表节点可以…

egg如何写单元测试

优秀的代码需要有单元测试进行质量保证&#xff0c;每个测试用例都给应用的稳定性提供了一层保障。 测试目录结构 我们约定 test 目录为存放所有测试脚本的目录&#xff0c;测试所使用到的 fixtures 和相关辅助脚本都应该放在此目录下。 测试文件的目录和我们需要测试的文件目…

#QT(智能家居界面-界面切换)

1.IDE&#xff1a;QTCreator 2.实验 3.记录 &#xff08;1&#xff09;创建一个新界面&#xff08;UI界面&#xff09; &#xff08;2&#xff09;可以看到新加入一个ui文件&#xff0c;双击打开&#xff0c;设置窗口大小与登录界面一致 &#xff08;3&#xff09;加入几个PUS…

【NR 定位】3GPP NR Positioning 5G定位标准解读(一)

目录 前言 1. 3GPP规划下的5G技术演进 2. 5G NR定位技术的发展 2.1 Rel-16首次对基于5G的定位技术进行标准化 2.2 Rel-17进一步提升5G定位技术的性能 3. Rel-18 关于5G定位技术的新方向、新进展 3.1 Sidelink高精度定位功能 3.2 针对上述不同用例&#xff0c;3GPP考虑按…

力扣经典题目解析--反转链表

原题地址: . - 力扣&#xff08;LeetCode&#xff09; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 题目解析 链表&#xff08;Linked List&…

【Unity】ABB CRB 15000 外部引导运动

一、RobotStudio控制器的文件系统和配置参数 HOME&#xff1a;控制器文件系统的根目录或起始点。配置&#xff1a;机器人控制器的配置设置和参数。外件信息&#xff1a;连接到机器人的外部组件的信息。I/O 系统&#xff1a;输入/输出系统&#xff0c;管理机器人和外部设备之间的…

UNIapp实现局域网内在线升级

首先是UNIapp 生成apk 用Hbuilder 进行打包 可以从网站https://www.yunedit.com/reg?gotocert 使用自有证书&#xff0c;目测比直接使用云证书要快一些。 发布apk 网站 用IIS发布即可 注意事项中记录如下内容 第一、需要在 iis 的MiMe 中添加apk 的格式&#xff0c;否则无法…