GPT,GPT-2,GPT-3

2023-10-28

视频讲解:GPT,GPT-2,GPT-3 论文精读【论文精读】_哔哩哔哩_bilibili

论文链接:

GPT: https://www.cs.ubc.ca/~amuham01/LING530/papers/radford2018improving.pdf

GPT-2: https://d4mucfpksywv.cloudfront.net/better-language-models/language-models.pdf

GPT-3: https://arxiv.org/pdf/2005.14165.pdf

GPT

文章标题:Improving Language Understanding by Generative pre-Training


摘要

        在自然语言理解里,有很多不一样的任务,虽然我们有很多大量的没有标记的文本文件,标好的数据是比较少的,这使得我们要去在标好的数据上,训练出分辨模型的话,会比较困难,因为数据相对较少。

        如何解决这个问题

1、先在未标记的数据上训练一个预训练模型,这个预训练模型是一个语言模型;

2、接下来再在标好的子任务上训练一个分辨的微调模型

(这个在计算机视觉领域,八九年前就已经是主流的算法,但在NLP领域一直没有流行,因为在NLP领域没有像imagenet那么大规模标好的数据。

虽说在机器翻译领域也许能够做到100万量级,但一个句子和一个图片不在一个尺度上面,一张图片含有的信息,那个像素的信息比一个句子里面能去抽取的信息来的多得多,所以一张图片可能能换10个句子,这也就意味着至少有一千万级别的句子级别的标好的数据集才能够训练比较大的模型,这导致在很长一段时间里,深度学习在NLP领域的进展没有那么顺利,直到GPT和后面BERT的出现,才打开局面。 这里还是像CV那样先训练好预训练模型再做微调,不一样的是使用未标记的文本,然后GPT系列后面的文章在做zero shot走了另外一大步,如果说前面五年CV在引领整个潮流的话,那最近几年的创新可以看到来自NLP领域,而且这些创新也在反馈回CV,比如之前读过的MAE这篇文章,就是把BERT用回在计算机视觉上面)

跟之前工作的区别是,在微调的时候构造跟任务相关的输入,从而使得只要很少的改变模型的架构就可以了。

1、引言

怎么样更好的利用无监督的文本,以前最好的模型还是词嵌入模型。

用未标记的数据的困难:(1)不知道用什么样的优化目标函数,一堆文本的损失函数不知道到底是什么样子,虽然有很多选择,比如机器翻译或者文本一致性,但是并没有发现某一个目标函数在一些任务上特别好,只是在一个任务上比较好,主要取决于目标函数和任务的相关度有多高;(2)怎样有效的把学到的文本的表示传递到下游的子任务上面(NLP领域子任务差别较大,没有一个简单有效的方式,使得一种表示能够一致的牵引到所有的子任务中。)

GPT提出了一个半监督的方法,在未标记的文本上面训练一个比较大的语言模型,然后再在子任务上面微调

模型基于transformer架构。跟RNN模型相比,transformer在迁移学习时学到的feature更稳健一些,可能是因为transformer更有结构化的记忆,使其能够处理更长的文本信息,从而能够抽取出更好的句子层面和段落层面的语义信息。在做迁移的时候,用的是一个跟任务相关的输入表示,

3、模型

怎样在未标记的数据上训练模型,怎么样微调,每个子任务的输入如何表示

3.1 未标记的数据上做预训练

假设有一个未标记的文本U={u1,…,un}(每个词表示成ui,它是个有序的信息,不会交换词的顺序)GPT 使用一个标准的语言模型的目标函数来最大化下面的似然函数:

L1(U)= \sum_{i}^{}logP(u_i|u_{i-k},....,u_{i-1},\Theta )

(具体来说语言模型 预测第i个词出现的概率,第i个词记为ui,把ui前面的k个词,ui-k到ui-1,k代表上下文窗口的大小,输入序列的长度,每次取出k个连续的词,再预测k个词后面的词是什么。)

即预测是用一个模型,这个模型在记成Θ的地方,给定k个词,预测这k个词下一个词的概率,把每一个这样的词(i范围为1-n)的最大概率,全部加起来就得到目标函数,这个地方即为L1(代表第一个目标函数)

这些参数采用随机梯度下降进行训练。

在我们的实验中,我们使用了一个muti-layer Transformer解码器的语言模型,这是Transformer的一个变体。

h0 = UWe + Wp     

预测词u的概率,把前面k个词 U=(u_{-k},……,u_{-1})做词嵌入投影,加上位置编码,得到第一层输入

hl = transformer_block(hl−1)       ∀i ∈ [1, n]
接下来做n层transformer块,每一层把上一层的输出作为输入得到这一层的输出
P(u) = softmax(h_{n}W_{e}^{T} )
最后得到n层transformer块后,进行一个投影,进行softmax就得到概率输出。
其中U=(u_{-k},……,u_{-1})是标记的上下文向量,n是层数,我们是标记嵌入矩阵,Wp是位置嵌入矩阵。

3.2 微调

给定一个长为m的词序列x1,……,xm,以及其对应的标签y,预测y的概率。

步骤:把词序列放进前面训练好的模型里面,然后得到transformer块的最后一层输出(即hm对应的输出),再乘以输出层,再做一个softmax,就得到其概率。

P ( y | x 1 , . . . , x m ) = softmax (h_{l}^{m}W_{y}) .
微调里面所有带标记的这些序列对,把序列x1到xm输入进去以后,计算真实的标记的概率
L_{2}(\mathbb{C})=\sum_{(x,y)}^{}logP(y|x^{1},....,x^{m})l

此外,我们还发现,将语言建模作为微调的辅助目标有助于学习,改进监督模型的泛化,加速收敛。使用这样的辅助目标提高了性能。具体来说,我们优化了以下目标(权重为λ):

L3(C)=L2(C)+λ∗L1(C)

总的来说,我们在微调过程中需要的唯一额外参数是Wy和分隔符标记的嵌入(下面在3.3节中描述)。

微调时有两个目标函数,第一个是给定一个序列预测下一个词,第二个是给定完整序列,预测序列对应的标号。

3.3 特定的输入转换

第一类是最常见的分类,给定一句话或者一段文本,来判断其对应的标号,比如说一个用户对一个产品的评价,是正面的还是负面的。

这里的做法是,把要分类的一段文字在前面放一个初始的词元,后面加一个抽取的词元(extract),然后做成一个序列,序列放进transformer的解码器里,然后模型对最后一个词抽取的特征放进一个线性层里,线性层投影到要标号的空间,比如说要做10分类,线性层输出大小为10,在训练的时候,对每一个文本和标号对,把文本变成上图所示的序列,然后标号发放在线性层后面参加训练,在预测的时候,只拿到序列的信息,直接做预测即可。

与之前语言模型有一点区别,线性层是新加的,在微调的时候,重新构造了一个新的线性层,里面的全都可能是随机初始化的,它输出的大小和标号的大小是一致的

第二类是蕴含,就是给定一段话,再问一个假设,然后看前面这段话,有没有蕴含假设提出来的东西。例如:a送给b一束玫瑰,假设是a喜欢b,那么我前面这句话是支持这个假设的,若假设是a讨厌b,那么前面这段话是不支持这个假设的,这个假设就不成立;若假设是a和b是邻居,那么可以说前面这个假设既不支持也支持。

所以这个就是三分类的问题,给定两段文本,然后做一个三分类的问题,在表达的时候就是把这两个文本串成一个长的序列,

GPT2:Language Models are Unsupervised Multitask Learners


做了一个新的百万级别的数据集webtext,比之前的wikipedia和bookscorpus更大。提出zero-shot的设定。

现在一个主流的途径就是对一个任务收集一个数据集,然后再在上面训练好的模型做预测,因为现在模型的泛化性不是很好,在一个数据集上训练好的模型很难直接用到下一个模型上面。

多任务学习:在训练一个模型的时候,同时看多个数据集,而且可能会通过多一个损失函数,来达到一个模型能够在多个任务上都可以使用。

GPT-2还是做语言模型,但是在做到下游任务的时候,会用到zero-shot的设定,zero-shot是说在做到下游的任务的时候,不需要下游任务的任何标注信息,也不需要训练我的模型,好处是,只要训练一个模型在任何地方都能用。

在GPT的时候,预训练语言模型时,是在自然的文本上训练的,但在下游任务时对输入进行了改造,加入了开始符、结束符和分隔符,这些符号模型在之前并不知道,但是因为有微调的环节,所以模型会认识这些符号。

现在要做zero-shot的问题是:在做下游任务的时候,模型不能被调整,若引入之前模型没有见过的符号的话,模型并不认识,所以在构造下游任务的输入时,不能引入模型没有见过的符号,而是要使得整个下游任务的输入,跟之前预训练的输入文本一样。

例子:

        机器翻译:若想把英语翻译成法语,可以把句子表达成这个形式(translate to French(作用:特殊的分隔词),英语文本,法语文本)

        阅读理解:(answer the question(设计的提示),文章,问题,答案)

GPT3:Language Models are Few-Shot Learners


GPT 3尝试解决GPT2的有效性,所以又回到了GPT一开始考虑的few-shot的设定,即不再去追求极致的零样本,在一个子任务上不给任何样例。

摘要:

        训练了一个自回归模型GPT3,有1750亿个可学习的参数,比之前所有非稀疏的模型(稀疏的模型是说整个权重可以是稀疏的,里面有大量的0,但如果模型有很多0的话,把0算进去,模型也算是特别大)不同,不会存在很多0,

        因为成本太高,所以GPT3在作用在子任务的时候,不做任何的梯度更新或者微调,就算是在零样本的情况下,给定一些样本,GPT3也不是用微调,因为微调总是去算梯度,那么大的模型,算梯度是非常困难的事情,GPT3不需要做任何的梯度更新,也是其一大特点

        GPT3能生成一些新闻类的文章,而且人类读起来是很难区分的

GPT2与GPT的不同:把normalization放到前面,可以反转的词元。

GPT2与GPT3区别:把sparse transformer里面的改动拿出来,设计了8个不同大小的模型,

有正反例,去掉相似的数据集

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GPT,GPT-2,GPT-3 的相关文章

随机推荐

  • RocketMQ介绍

    消息队列是分布式系统中重要的组件 使用消息队列主要是为了通过异步处理提高系统性能和削峰 降低系统耦合性 Apache RocketMQ是由阿里巴巴开源的可支撑万亿级数据洪峰的分布式消息和流计算平台 于2016年捐赠给Apache Softw
  • 推挽电路和开集

    整理下之前的笔记 简谈推挽电路 要理解推挽输出 首先要理解好三极管 晶体管 的原理 下面这种三极管有三个端口 分别是基极 Base 集电极 Collector 和发射极 Emitter 下图是NPN型晶体管 这种三极管是电流控制型元器件 注
  • activiti报错:org.activiti.engine.ActivitiTaskAlreadyClaimedException: Task ‘12502‘ is already claimed

    在运行activiti时 报错信息如下 Exception in thread main org activiti engine ActivitiTaskAlreadyClaimedException Task 12502 is alrea
  • 中介者模式学习和思考

    一 概念 中介者模式 Mediator Mode 就是用一个中介对象来封装一系列的对象交互 中介者使各对象不需要显式地相互引用 从而使其耦合松散 而且可以独立地改变它们之间的交互 可以看出 中介者主要是通过中介对象来封装对象之间的关系 使之
  • 11.微信蓝牙操作

    一 操作蓝牙适配器的共有 4 个 分别是 wx openBluetoothAdapter 初始化蓝牙适配器 wx closeBluetoothAdapter 关闭蓝牙模块 wx getBluetoothAdapterState 获取本机蓝牙
  • 数据结构顺序栈的C语言实现(入栈,初始化栈,出栈,取栈顶操作)【C语言环境下可以直接运行】

    C语言实现顺序栈的 入栈 初始化栈 出栈 取栈顶操作 C语言数据结构 C语言环境下可以直接运行 这个程序可以运行的 虽然比较简单 但是是可以直接运行的 include
  • error connecting to master ‘repl@192.168.4.114:3306‘ - retry-time: 60  retries: 3

    mysql gt show slave status G 1 row Slave IO State Connecting to master Master Host 192 168 4 114 Master User repl Master
  • shell中的getopt

    Linux中的位置变量和预定义变量 shell中的getopts getopt是一个外部命令 不是bash内置命令 Linux发行版通常会自带 getopt支持短选项和长选项 老版本的getopt问题较多 增强版getopt比较好用 执行命
  • 6月之随便写点什么

    马上可能很长一段时间不会更新博客了 加油吧 后期再会 我的博客
  • Unity摄像机屏幕上画线(逐步完善)

    1 类似于星际公民用于飞船控制的线 从屏幕中心开始 鼠标位置结束 将下面脚本挂载至摄像机 using System Collections using System Collections Generic using System Thre
  • 在ESXi界面给虚拟机配的内核数与虚机内任务管理器显示数不一致

    source esxi6 7设备管理器中的cpu核数和任务管理器中的不一致 esxi吧 百度贴吧 ESXi里给某台win10虚机配置了16核cpu 但在此虚机里面的任务管理器里却只看到2个核心 原因在下图 把CPU和和每个插槽内核数改成一样
  • JavaSE学习 day01

    今天是学习JavaSE的第一天 首先 我先初识了Java 了解了学习目标 知道了什么是程序 什么是Java 为什么学习Java 然后 学习了搭建Java开发环境 1 安装JDK 2 配置环境变量 这里要注意 JDK java开发工具包 JR
  • JS中的函数-内部函数,子调用函数和返回值为函数的函数

    自调用函数 Self invoking Functions 自调用函数也是匿名函数的一种表现形式 这个函数在定义之后 直接调用 如下 function alert haha 看起来还挺怪异 不过确实很简单 自调用函数很方便使用 可以不用定义
  • 多个Node.js版本之间切换

    本篇文章会讲windows和Mac系统下实现多个node js版本之间的切换 1 windows下采用nvm nvm window 2 Mac下采用nvm和n 注 window和mac下的nvm地址是不一样的 一 windows系统 什么是
  • JDK 8 / JDK 1.8 压缩包

    文章大概 因为JDK8在官网是直接的一个exe可运行程序 并没有压缩包 而网络上有别人准备的压缩包 看到是某度盘直接放弃 所以这篇文章教大家自己来搞一个JDK8的压缩包文件 开始操作 在操作之前 你需要去Java Downloads Ora
  • 对象转JSONObject——字段空值处理方法

  • uniapp 发布微信小程序分包

    1 进入下列文件 进入 unpackage dist build mp weixin app json pages pages index index pages login login pages views WearCutData We
  • 十个漂亮的数学定理赏析

    原地址 十个漂亮的数学定理赏析 Beauty is the first test there is no permanent place in the world for ugly mathematics G H Hardy 科学家研究自然
  • MYSQL--基础--11--join理解

    MYSQL 基础 11 join理解 1 数据初始化 SET FOREIGN KEY CHECKS 0 Table structure for course DROP TABLE IF EXISTS course CREATE TABLE
  • GPT,GPT-2,GPT-3

    视频讲解 GPT GPT 2 GPT 3 论文精读 论文精读 哔哩哔哩 bilibili 论文链接 GPT https www cs ubc ca amuham01 LING530 papers radford2018improving p