ChatGPT追祖寻宗:GPT-1论文要点解读

news2024/11/27 19:37:00

论文地址:《Improving Language Understanding by Generative Pre-Training》

最近一直忙着打比赛,好久没更文了。这两天突然想再回顾一下GPT-1和GPT-2的论文, 于是花时间又整理了一下,也作为一个记录~话不多说,让我们一起来品读一下GPT经典之作吧!


Abstract

摘要部分其实是介绍了一下GPT研究的动机,值得一提的是,GPT可以算是预训练+微调这种范式在NLP领域成功应用的先河,它比BERT还早几个月。摘要中提到,无标注数据是很多的,但是特定领域带标数据匮乏,这对于许多NLP任务中模型的训练是一个很大的挑战。 接下来作者提到了他们的解决方案:先在大规模无标注数据集上训练一个预训练模型,接着再将此预训练模型放到特定任务中用少量数据微调。这个方案放在现在来看,再熟悉不过了,但是在当时,这种方法确实是新颖之作,因为在此之前,利用无标注数据建模的先例有著名的Word2Vector,但具体到下游任务,基本上都是特定任务特别训练,这里作者也提到了,对比前人的工作,他们方法的不同之处在于微调的时候直接构造和任务相关的输入进行的,换句话说,直接从输入形式来区分不同的任务,这样一来,他们只需要对模型结构做微小的改动就能达到想要的效果。

1 Instruction

第一段总结来说,作者提到了无监督训练方式的重要性,能够有效的从原始训练语料中(通常认为是无标注的)学习的能力可以减轻模型对于下游有监督训练的依赖性,作者认为,即使在可以进行有监督学习的场景下,使用无监督的方式学到很好的语言表征也会让模型的表现更好。这一点在近两年的许多研究成果中也得到了印证。

这一段作者提到了从无标注数据中学习词级别信息是具有挑战性的,并且列举了产生挑战性的两点原因:

(1)优化目标不统一。也就是说,对于无监督训练来讲,可以设计出诸多不同的优化目标,但是究竟哪种类型的优化目标是有效的,目前还不清晰。显然,作者提了一个很好的问题,Bert、GPT、Bart、T5、XLNet等等,它们的建模过程都要经历无监督训练阶段,它们无监督预训练所设计的训练目标不尽相同,比如bert采用了LM和NSP的预训练方式,Bart去掉了NSP,还增加了文档旋转,子序列掩码等预训练方式,XLNet更是采用了类似排列组合的预训练方式,它们都不完全一样,也都取得了很好的效果。可是究竟哪一种或者哪几种方式才最有效,目前尚不清楚(截止该论文)。

(2)如何有效的将学习到的文本表示迁移到下游特定任务中目前业界还没有一个共识。说白了,就是目前业界还没有得出一个结论,什么结论呢?就是如何利用预训练语言模型进行下游任务的微调是最有效的,通常都需要根据不同下游任务做一些模型结构上的改动。

作者认为这两点不确定使得半监督学习技术的发展遇到了很大的困难,作者在这里提到了半监督学习,其实就是“无监督预训练+有监督微调”。

这段话其实阐述了一下作者提出的一种半监督学习方式,总的来说,他们的半监督学习方式虽然也是无监督预训练+下游微调两步走的方式,但是他们在下游微调任务上,采用的是带有手动注释(也就是提示)的样例学习来将无监督学习到的表示嵌入到不同的下游任务中。这就是后来的提示学习。

作者说明了一下模型架构的选择,之所以选择Transformer作为基模,作者认为,还是因为transformer强大的序列特征提取能力。这段没啥说的。

这一段其实就是作者说了一下他们的方法在几个NLP任务上的效果,在12个任务中有9个任务都达到了sota的效果。值得注意的是,作者提到了零样本学习,看来作者们在GPT-1的时候就已经在思考这一思路了,果然大牛都是提前布局。

2 Related Work

这一章节主要介绍了与作者所研究的相关的先前工作。它介绍了半监督学习在自然语言处理中的应用,并提到了使用无标签数据进行词级别和短语级别的统计计算以及使用词嵌入来改善性能的方法。此外,作者还提到了无监督学习是半监督学习的一种特殊情况,其目标是寻找一个好的初始化方法来避免对监督学习过程中的目标进行改动,简而言之就是,通过无监督学习的方法就能够使得文本表示很好的迁移到下游任务中,而不是来一个下游任务就设置一个学习目标,这太繁琐了。与其他方法相比,作者选择了Transformer模型,并使用任务特定的输入转换来适应不同的任务,以实现有效的迁移学习。

3 Framework 

这一章节比较重要,主要介绍了论文核心思想的实现方法。

3.1 Unsupervised Pre-training

GPT-1的思路其实就是利用了语言模型的思路,语言模型是什么呢?它其实就是通过对先验知识的条件概率计算获得预测词的这么一个东西,如上述式子,在i-1个词的出现的情况下来计算第i个词出现的概率,因为这一过程是依靠神经网络来完成的,因此上式还有个θ。

了解transformer的原理后,上式其实就很好理解,先通过词向量和位置向量来构建模型的输入,transformer_block是指transformer的各个模块,包括自注意力层,归一化层等,经过transformer各个模块计算后,最后再通过softmax来计算输出的概率分布,值得注意的是,GPT系列的模型都只用了transformer的解码器部分,并非标准的transformer,不存在类似bert的那种掩码机制,而必须是单向输出的,所以GPT-1这里,作者在无监督预训练的时候用的是滑窗机制来计算语言模型的条件概率,个人感觉这种方式在训练样本足够大的情况下,效果会比“完形填空”形式的LM掩码机制要好,而且这种形式确实更适用于生成任务。

3.2 Supervised fine-tuning

这一节介绍的是有监督微调的过程。

输入经由预训练语言模型计算后,取最有一层的向量作为微调的输入,微调就是用一个线性层将输入映射到目标任务所需要的空间中。比如我们的输入是256个词,向量维度定义为768维,那么最终Transformer的输出就是256·768,但是我们只取最后一个维度作为一句话的向量表示,即1·768,假如是二分类问题,那么我们的线性层就是768·2,这样线性映射后我们得到了一个1·2大小的向量,再做softmax后,就能得到两个概率值[p1, p2],取最大的概率值对应的索引,就得到了我们的预测值。

这个公式其实是无监督预训练和有监督微调统一训练的方法,作者用了一个λ来调节两者的平衡。作者也提到了,将无监督语言模型的学习作为有监督学习的辅助学习目标会带来两个好处,一个是改善有监督学习的性能,一个是加速收敛。

无监督预训练和有监督的微调介绍完,作者贴上了一个图来说明他们是如何将输入转化为与下游具体任务相关的输入形式的。

左边是论文提到的模型结构图,右边是具体输入输出的结构,可以看到,不同任务的输入形式也不尽相同,除了单句分类任务,其它的都有固定格式:start、text1、text2、delim、extract。要注意,start、delim和extract在实际代码中是用某些特殊符号给予标记的,从而避免了训练语料中存在这些单词。

从上图中我们可以看到后起之秀bert的影子,在bert中,针对不同任务的微调的输入输出也是像这样构造的。

3.3 Task-specific input transformations

这一节其实就是对上图的进一步解释,感兴趣的照着图看就好,这里不作重点记录。

4 Experiments 

这一章将实验部分,涉及到具体模型参数的设置以及数据部分,值得品读。

4.1 Setup 

GPT-1用了BooksCorpus数据集进行无监督预训练的,同时,作为其它数据集的选择,GPT-1页使用了10亿个单词的Word Benchmark,这和ELMo这个模型使用的数据集类似,只不过本文的方法是打乱了句子破坏了句子的长距离结构。说实话,我们看懂,GPT-1是只用了前一个数据集,还是两个数据集都用了,还是分开用的?

这一段是模型的参数设置,首先,前面提到过,GPT-1使用了transformer结构中的Decoder,是一个12层的解码器,解码器参数设置细节如下:

  • 状态向量维度为768,注意力头数为12,这和bert是一样的。
  • 在位置编码方面,使用了3072维的内部状态。
  • 优化算法采用了Adam,并设置了最大学习率为2.5e-4。
  • 学习率在前2000次更新中线性增加,然后使用余弦调度将其退火为0。
  • 模型使用64个随机采样的连续序列的小批量数据进行训练,每个序列包含512个token。
  • 模型中广泛使用了layernorm,因此简单的权重初始化N(0, 0.02)就足够了。
  • 模型使用了40,000个合并的字节对编码(BPE)词汇表,并使用了残差、嵌入和注意力的dropout来进行正则化,失活率为0.1。
  • 模型还使用了[37]中提出的修改版L2正则化,对所有非偏置或增益权重设置了w = 0.01。
  • 激活函数使用了高斯误差线性单元(GELU)。
  • 模型使用了学习的位置嵌入,而不是原始版本提出的固定正弦值。
  • 使用了ftfy库来清理BooksCorpus中的原始文本,标准化一些标点符号和空白符,并使用spaCy分词器进行处理。

这是微调阶段的一些参数设置,作者大部分复用了无监督预训练阶段的参数设置方式,只有几个不同的地方:大多数任务的学习率设置为6.25e-5,batchsize设为了32,基本上迭代个3个epoch足矣。 公式(5)中的λ设为0.5。

4.2 Supervised fine-tuning 

这一节主要是介绍了在几种不同任务上以及不同数据集上的实验测试和分析对比,结论是GPT-1在12种数据集中有9种数据集的表现达到了SOTA。这块内容不做重点介绍,感兴趣的可以自己看下。

5 Analysis

前面提到,GPT-1用了12层的transformer layer,作者在这里做了一个实验:层数从1-12增加,看看不同层数对于无监督预训练模型向有监督任务微调的迁移能力的影响,结果发现,12层中,每一层都对这种迁移能力的提升有正向作用。作者想说明12层的设计是正确的? 

上图其实是作者想要更好的理解为什么基于transformer的预训练模型它是有效的而做的实验。作者提出了一个假设,即基础生成模型学习执行许多需要评估的任务,以提高其语言建模能力,并且transformer的更加结构化的注意力机制相对于LSTM有助于迁移学习。上图中,作者设计了一系列启发式解决方案,利用基础生成模型执行任务而无需监督微调,并证实了这些启发式解决方案在生成预训练过程中的有效性。观察到这些启发式解决方案的性能稳定,并且随着训练的进行逐渐提高,这表明生成预训练具备支持学习各种与任务相关的功能。同时观察到LSTM的零样本性能具有较高的方差,这表明Transformer架构的归纳偏差有助于迁移学习。

作者进行的三个消融实验研究。首先,作者在微调过程中没有使用辅助的语言模型目标,观察到辅助目标对NLI任务和QQP有帮助,但对较小的数据集没有帮助。其次,作者通过将Transformer与使用相同框架的单层2048单元LSTM进行比较,分析了Transformer的效果。结果显示,使用LSTM而不是Transformer时,平均得分下降了5.6。只有在一个数据集MRPC上,LSTM的表现优于Transformer。最后,作者还将他们的模型与Transformer架构直接在有监督目标任务上进行训练,即去掉无监督预训练的过程进行了比较。结果显示,缺乏预训练过程对所有任务的性能有所损害,与完整模型相比,性能下降了14.8%。

6 Conclusion

作者做了一下总结,总的来说,这篇论文提出了一个NLP领域全新的训练思路,即通过良好的无监督训练过程结合任务相关的有监督微调以达到多个NLP任务中的SOTA结果。作者的这套方案后来成为了业界主流模式,包括如今的chatGPT,可以说是开山之作。结尾处作者前瞻性的预见了在无监督训练领域仍然存在很大的潜在的研究价值,看来作者这么说了也这么做了,没有放弃,所以有了如今的chatGPT,牛! 

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

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

相关文章

C. Assembly via Minimums

题目:样例: 输入 5 3 1 3 1 2 10 4 7 5 3 5 3 3 5 2 2 2 2 2 2 2 2 2 2 5 3 0 0 -2 0 -2 0 0 -2 -2输出 1 3 3 10 10 7 5 3 12 2 2 2 2 2 0 -2 0 3 5 思路: 数学思维题,构造算法,这里我们从样例中可以知道,…

当我出现在股友面前,他们笑了,这是来自最佳策略app平台的自信

我的人生就仿佛被提前安排好了一样:三年的自考,三年的打工,五年的炒股等等,这么丰富的履历,小说男主都很少有,可这一切都发生在我的身上。 不知道怎么回事,高考我竟然睡着了,我就这样…

【excel密码】如何保护部分excel单元格?

Excel文件可以设置保护工作表,那么可以只保护工作表中的部分单元格,其他地方可以正常编辑吗?当然是可以的,今天我们学习,如何设置保护部分单元格。 首先,我们先将整张工作表选中(Ctrl A&#…

【RapidAI】P0 项目总览

RapidAI 项目总览 ** 内容介绍 ** Author: SWHL、omahs Github: https://github.com/RapidAI/Knowledge-QA-LLM/ CSDN Author: 脚踏实地的大梦想家 UI Demo: ** 读者须知 ** 本系列博文,主要内容为将 RapidAI 项目逐…

2023欧亚合作发展大会暨国际公共采购大会在京举行

2023年9月2日至6日,以“合作、协同、共赢、共享”为主题的“2023欧亚合作发展大会暨国际公共采购大会等系列会议”在北京炎黄书院隆重举行,共有500多位中外贵宾参加了本次盛会。 本次大会指导单位是中国联合国采购促进会、北京市中医药局,由中…

20套面向对象程序设计选题Java Swing(含教程) (二) 持续更新 建议收藏

20套面向对象程序设计选题Java Swing(含教程) (一) 7. 员工工资管理系统 视频教程: 【课程设计】员工工资管理系统-Java Swing-你的课程我设计 功能描述: 系统员工有"工号"、 “姓名”、“性别”、“岗位”、 "入职年份 "、"…

删除文件PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。

删除文件PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。 问题描述解决方案另外一个问题解决方案 问题描述 是想写一个脚本删除长宽比不对的图片 # coding: utf-8 from PIL import Image, ImageDraw, ImageFont import os import shuti…

Canvas学习01

基础 1、基本概念 Canvas是一个标准的HTML5元素Canvas主要聚焦于2D图形,提供了非常多的JavaScript绘图API(比如:绘制路径、矩形、圆、文本和图像等方法)也可以使用元素对象的 WebGL API 来绘制 2D 和 3D 图形 2、Canvas 优点&a…

AWB-Tuning(1)

一、白平衡的概念 AWB – Auto White Balance 白平衡就是:不管在任何光源下,都能将拍摄的白色物体的图像还原为白色 人眼在早晨、中午、晚上 不同色温下都能准确看到白色。 CMOS 要获得这种能力,必须对每种光源做相应的色彩校准&#xff0c…

asm disk被加入到另外一个磁盘组故障恢复---惜分飞

有朋友在aix环境对其中一个rac的asm磁盘组进行扩容 之后另外一套rac的磁盘组直接dismount Wed Aug 23 12:44:02 2023 NOTE: SMON starting instance recovery for group DATA domain 2 (mounted) NOTE: F1X0 found on disk 0 au 2 fcn 0.128808679 NOTE: SMON skipping disk …

RocketMQ 快速搭建与控制台搭建

一、下载资料及环境准备 这里 下载路径 可以下载对应的版本,本文以 4.9.5 为例:下载这里的Binary 为Linux 安装文件,Source 也下载,方便后续使用。 将下载后的包进行解压: 由于RockerMQ 的建议运行环境较大&#xff…

解决pyside6-uic生成py代码中文为unicode(乱码)的问题

前言 本来想用Java做客户端,后来发现很多算法还是Python有现成的比较方便。 所以最终选择了pyside6。但是用Designer(QT设计师)设计完后,生成的代码中文部分显示为unicode,也可以理解为乱码。 就像这样:…

MybatisPlus 扩展功能 代码生成 逻辑删除 通用枚举 字段类型处理器 配置加密

MybatisPlus 核心功能 条件构造器 自定义SQL Service接口 静态工具_软工菜鸡的博客-CSDN博客 3.扩展功能 3.1.代码生成 在使用MybatisPlus以后,基础的Mapper、Service、PO代码相对固定,重复编写也比较麻烦。因此MybatisPlus官方提供了代码生成器根据数据…

pytorch-v2.0.1 cuda arm64 aarch64 torch 2.0.1+cu118 源码编译笔记【2】验证cuda安装 成功

接上篇 pytorch-v2.0.1 cuda arm64 aarch64 torch 2.0.1cu118 源码编译笔记_hkNaruto的博客-CSDN博客 由于采用/usr/local/bin/gcc编译,先设置LD_LIBRARY_PATH,再启动python3 export LD_LIBRARY_PATH/usr/local/lib64:/usr/local/lib:/usr/lib64:/usr/…

高德Android高性能高稳定性代码覆盖率技术实践

前言 代码覆盖率(Code coverage)是软件测试中的一种度量方式,用于反映代码被测试的比例和程度。 在软件迭代过程中,除了应该关注测试过程中的代码覆盖率,用户使用过程中的代码覆盖率也是一个非常有价值的指标,同样不可忽视。因为…

Spring 6.0和SpringBoot 3.0新特性

目录 主要更新内容是以下几个: AOT编译 Spring Native GraalVM SpringBoot3生成二进制可执行文件底层流程 主要更新内容是以下几个: A Java 17 baselineSupport for Jakarta EE 10 with an EE 9 baselineSupport for generating native images with…

录音转写和AI质检的区别和使用场景

区别: 录音转写是将语音或录音转化为文本形式的过程。它通常涉及使用自然语言处理技术和语音识别算法来将音频文件中的语音转换为可读的文本格式。 AI质检是一种利用人工智能技术对客户服务、销售和其他电话中心交互进行自动化评估的过程。通过分析和评估客户和代…

【C++】STL案例2-员工分组

#include <iostream> using namespace std;#include<vector> #include<map>#define CHEHUA 0 //策划部门 #define MEISHU 1 //美术部门 #define YANFA 2 //研发部门class Worker { public:string m_Name;int m_Salary; };void createWorker(vector<…

flask使用Flask-Mail实现邮件发送

Flask-Mail可以实现邮件的发送&#xff0c;并且可以和 Flask 集成&#xff0c;让我们更方便地实现此功能。 1、安装 使用pip安装&#xff1a; $ pip install Flask-Mail或下载源码安装&#xff1a; $ git clone https://github.com/mattupstate/flask-mail.git $ cd flask-…

Java线程与锁常考知识点

Java线程与锁常考知识点 基础篇1. 创建线程的几种方式2. 线程池创建的方式3. 线程池提交任务的流程4. 线程池有哪些状态 进阶篇1. 说说对线程安全的理解2. 对守护线程的理解3. ThreadLocal的底层原理4. 并发、并⾏、串⾏之间的区别5. Java死锁如何避免&#xff1f;6. 线程池的底…