本文详细解读了OpenAI公司在2018年6月发布的论文《Improving Language Understanding by Generative Pre-Training》,它其中介绍的算法也就是后来人们说的GPT。本文借鉴了李沐的这个视频,感兴趣的同学可以移步观看大神的讲解。

目录

  • 引言
  • GPT方法
    • 无监督预训练
    • 有监督微调
    • 子任务的描述
  • 实验
  • 参考文献

引言

在Transformer方法推出的1年后,OpenAI公司发布了GPT系列的第一篇论文,采用生成-判别模型架构,在多个自然语言处理(NLP)任务上实现了较高的精度。
总体而言,GPT方法在很大程度上解决了数据量不足给NLP任务带来的局限;也避免了在不同NLP子任务的解决上,需要不断调整模型的麻烦。

GPT方法

GPT的基本思路是:在有标注的数据集下训练得到一个初始模型,随后在有标注的子任务数据集下,精调得到用于各任务的子模型。在微调时,GPT使用了两个优化的目标函数。

无监督预训练

给定一个语言序列 U = { u 1 , … , u n } \mathcal U=\left\{u_1, \dots, u_n\right\} U={u1​,…,un​},GPT采用标准的语言模型,即最大化如下的目标函数:
L 1 ( U ) = ∑ i log P ( u i ∣ u i − k , … , u i − 1 ; Θ ) L_1(\mathcal U)=\sum_i\text{log}P\left( u_i\vert u_{i-k},\dots,u_{i-1};\Theta\right) L1​(U)=i∑​logP(ui​∣ui−k​,…,ui−1​;Θ)
其中 k k k是上下文窗口的尺寸,条件概率 P P P是通过参数为 Θ \Theta Θ的神经网络建模得到的。

简单来说,上面描述的条件概率,是在给定描述模型和位置 i i i之前的 k k k个词后,第 i i i个位置出现词 u i u_i ui​的概率。将所有概率加起来,就得到了目标函数。这里的窗口尺寸 k k k其实可以理解为模型接受的输入序列的长度。当 k k k越大时,模型可以消化更多的信息,但是模型也更加复杂。因此,如果希望模型能力很强,这里的 k k k可能要取到几十、几百,甚至上千。

注: 目标函数中采用的是所有 log P i \text{log} P_i logPi​的和,但是联合概率应该是所有概率的积。这里是相加的原因是,公式中采用了log变换,那么log结果的和也就是所有幂的乘积。不清楚具体变换的同学可以移步这个视频。

具体上,GPT中采用的模型( Θ \Theta Θ)是Transforer的解码器。Transformer包含两个结构:编码器和解码器。其中,编码器可以看到整个序列中的所有信息;但由于掩码的存在,解码器只能看到非掩码遮盖部分的信息,被遮盖的位置则都是0。由于在语言处理中,模型是只能看到当前词之前的信息的,因此GPT只能采用解码器部分,而不能采用编码器。

更多关于Transformer的介绍,可以移步这篇文章(还在写,挖个坑)详细了解。

有监督微调

精调模型是在有标号的数据集上进行的。具体来说,就是给定一段输入序列和对应的标号,将前面预训练好的模型的最后一层的输出拿出来,经过一个输出层,得到序列最后位置处的估计概率。数学上,这个概率可以表示为:
P ( y ∣ x 1 , … , x m ) = softmax ( h l m W y ) P\left(y\vert x^1,\dots,x^m\right) = \text{softmax}\left(h_l^mW_y\right) P(y∣x1,…,xm)=softmax(hlm​Wy​)
其中, x 1 , … , x m x^1,\dots,x^m x1,…,xm是输入, y y y是标签, h l m h_l^m hlm​是预训练模型最后一层对位置 m m m处的预测结果。

此时,目标函数就是:
L 2 ( C ) = ∑ x , y log P ( y ∣ x 1 , … , x m ) L_2\left(\mathcal C\right)=\sum_{x,y}\text{log} P\left(y\vert x^1,\dots,x^m\right) L2​(C)=x,y∑​logP(y∣x1,…,xm)
GPT作者发现,在精调过程中引入预训练的目标函数,同样可以增加模型的精度。因此,微调过程最终的目标函数是两个目标函数的加权求和:
L c ( C ) = L 2 ( C ) + λ × L 1 ( C ) L_c\left(\mathcal C\right)=L_2\left(\mathcal C \right) + \lambda\times L_1\left(\mathcal C\right) Lc​(C)=L2​(C)+λ×L1​(C)

子任务的描述

在知道了目标函数之后,剩下的问题就是如何将NLP中的各种任务,表示成序列对应的标号。在GPT中,这种表示逻辑可以由下图进行表示。

图中给出了4个常见的NLP子任务和其对应的标注方法。从图中可以看出无论是对什么任务,其输入可能被分割成1个、2个甚至多个字段,后面的输出层的结构也可能随任务发生变化,但是其中的transformer部分,一旦训练好了就不需要改变了。这也是GPT与其他NLP方法的一个核心区别。

可见,GPT在上游任务的时候是直接从输入文本中学习信息,而下游任务中除文本外,还增加了开始符、分隔符、结束符等特殊符号。由于存在微调过程,因此下游模型能够识别这些符号。

实验

论文的实验部分本文简要带过,感兴趣的同学请移步论文原文。
这里只提醒大家注意以下几点:

  1. GPT是在BooksCorpus数据集上训练得到的。这个数据集包含了7000余本未发表的各领域书籍。
  2. GPT使用了12层的Transformer解码器,每一维是768。

参考文献

  1. 李沐. GPT,GPT-2,GPT-3 论文精读【论文精读】
  2. The Math Sorcerer. How to Combine Two Logarithms into a Single Logarithm using Properties of Logs

GPT系列详解:初代GPT相关推荐

  1. 最新NVIDIA Ada Lovelace架构 和 RTX 40系列详解

    最新NVIDIA Ada Lovelace架构 和 RTX 40系列详解 Nvidia 的 Ada 架构和 GeForce RTX 40 系列显卡计划于 10 月 12 日开始到货,从 GeForce ...

  2. 5W字高质量java并发系列详解教程(上)-附PDF下载

    文章目录 第一章 java.util.concurrent简介 主要的组件 Executor ExecutorService ScheduledExecutorService Future Count ...

  3. 李兴华java8教程_李兴华Java培训系列详解20套视频教程下载

    李兴华Java培训系列详解20套视频教程下载 教程介绍: 李兴华Java培训系列详解20套视频教程分别对Oracle.Java8.JavaScript.XML.AJAX.jQuery.HTML5.St ...

  4. leetcode 力扣每日一题系列详解——总目录

    这是总目录,该系列持续更新中........ leetcode 力扣每日一题系列详解--总目录

  5. iVX低代码平台系列详解 -- 概述篇(二)

    写在前面 ivx动手尝试电梯:ivx在线编辑器 iVX系列教程持续更新中 上篇文章可看:iVX低代码平台系列详解 – 概述篇(一) ivx目录 写在前面 一.iVX优势 1.快速学习 2.快速开发 3 ...

  6. 手撕yolo3系列——详解yolo3整体网络代码(详细注释)

    完整代码百度云直达链接(包含预训练权重)(小白注释) https://pan.baidu.com/s/1US6e93OaCYOghmF21v0UIA 提取码:z8at 参考链接 [注]代码是大神的代码 ...

  7. 硬盘分区MBR和GPT知识详解

    重装系统之前都会了解一些关于BIOS与EFI的知识,很多小伙伴了解之后都会问快启动小编,自己的电脑硬盘分区MBR和GPT选哪个好?其实这个问题得根据你的电脑配置以及需求来回答,所以今天快启动小编为大家 ...

  8. 细节详解 | Bert,GPT,RNN及LSTM模型

    文末可免费领取NLP学习资料 自然语言处理(NLP)是融合计算机科学.人工智能.语言学等学科的交叉领域,是一种更高层次的信号表达形式,也是人工智能最难攻克的领域之一. 随着互联网的快速发展,网络文本, ...

  9. Selenium学习(七) selenium IDE命令之 store系列详解

    目录 store系列简介 相关方法 官方API 验证过程 命令详解 store系列简介 主要用于存储,将数据存储到变量中,以便调用: 相关方法 store store attribute store ...

最新文章

  1. linux shell命令设置内存大小运行jar文件
  2. python中类方法与实例方法的区别-Python实例方法、静态方法和类方法详解(包含区别和用法)...
  3. Unified Networking Lab 安装使用IOL镜像
  4. 图的存储之链式前向星
  5. linux编程两个子进程,Linux中fork同时创建多个子进程的方法
  6. .NET:如何让线程支持超时?
  7. 三分钟小课堂-----------------docker(三)增删改查命令
  8. 万象双环设计+原色双影像极致体验 华为P50标准版9月29日正式开售
  9. 【nexus】nexus : mac 安装 nexus
  10. 【LetCode算法修炼】Two Sum
  11. Float Protocol将于5月7日至10日进行FLOAT代币创世发布
  12. HTML中构建自动伸缩的表格Table
  13. 【PhotoScan精品教程】PhotoScan简介、安装教程(附PhotoScan1.4.5安装包下载)
  14. python生成验证码的程序_用python生成验证码图片
  15. 心已被爱伤透,情已为爱枯竭
  16. 调节笔记本外接显示器亮度
  17. python 二维列表_python二维列表
  18. 快手热门早安文案正能量朋友圈
  19. S7-1200PLC定时器计数器的应用
  20. 计算机分子模拟聚乙烯,高分子物理实验思考题@中科大.pdf

热门文章

  1. VPS云主机网站上的WordPress安全
  2. 关于SPING与EJB的胡言乱语
  3. python+selenium实现自动刷新网页
  4. Android性能优化系列之apk瘦身
  5. kelvin模型蠕变方程_基于改进Kelvin模型的三维蠕变损伤模型研究
  6. dhcp服务器未能分发地址,H3C案例查看:ADCampus网络dhcp服务器未配置策略导致地址分配错误问题...
  7. Linux nobody
  8. PHP CURL解决 此图片来自QQ微信公众平台,未经允许不可引用
  9. vue生命周期(超详解!)
  10. PHP面试题(个人总结)————(暂不更新)