在研发ChatMoney这款产品的时候,我开始深入研究GPT的诞生,逐记录下来分享给大家。

前言

Generative Pre-trained Transformer(GPT)系列是由OpenAI开发的预训练语言模型,它们在多种NLP任务中取得了令人瞩目的成绩,包括文章生成、代码生成、机器翻译和问答等。GPT系列模型的核心思想是通过无监督学习在大规模语料库上进行预训练,再通过少量数据进行微调以适应特定任务。随着模型容量的增加和训练数据的扩大,GPT系列模型的能力也在不断提升。

模型 发布时间 参数量 预训练数据量
GPT 2018 年 6 月 1.17 亿 约 5GB
GPT 2019 年 2 月 15 亿 40GB
GPT 2020 年 5 月 1,750 亿 45TB

GPT-1:无监督学习与通用预训练

在GPT-1问世之前,传统的自然语言处理(NLP)模型主要依赖于有监督学习,这种方法要求大量带有明确标签的数据进行任务特定的模型训练。然而,有监督学习存在两大局限性:

  1. 数据标注的挑战: 高质量的标注数据往往难以获取,特别是在一些复杂场景中,如图像标注或情感分析,数据的标签可能模糊或不清晰。
  2. 模型泛化能力的局限: 通过某一特定任务训练的模型往往难以直接应用于其他任务,这使得模型更像是“领域专家”而非真正理解NLP的“通才”。

GPT-1打破了这一局限,它采用了一种全新的思路:先通过无标签数据学习一个通用的语言模型,再根据具体任务进行微调。GPT-1能够处理的有监督任务包括:

  • 自然语言推理 判断两个句子之间是否存在蕴含、矛盾或中立关系。
  • 问答与常识推理: 类似于多选题,给定文章、问题和多个候选答案,模型需要预测每个答案的概率。
  • 语义相似度判断: 确定两个句子在语义上是否相关。
  • 文本分类: 识别输入文本的类别归属。

这种将无监督学习作为有监督模型预训练目标的方法,被称为通用预训练(Generative Pre-training,GPT)。

GPT-1的训练过程

GPT-1的训练分为两个阶段:无监督的预训练和有监督的微调。

1.1.1 无监督预训练

GPT-1的无监督预训练基于语言模型进行。给定一个无标签的文本序列,模型的优化目标是最大化序列中每个词的条件概率乘积,即最大化似然值。这一过程中,GPT-1使用了滑动窗口机制,并在每个窗口内计算条件概率。这些参数通过随机梯度下降(SGD)等优化算法进行更新。

GPT-1的模型结构基于Transformer架构,特别是其中的解码器部分。它采用了12个Transformer块堆叠而成,每个块都包含多头自注意力机制和全连接层,用于生成输出概率分布。

通过这种方式,GPT-1能够在无标签数据上学习语言的通用表示,为后续的有监督任务微调提供强有力的基础

1.2 GPT-1的数据集

GPT-1的训练主要基于BooksCorpus数据集,这是一个包含大量未发布书籍的集合。选择这个数据集的原因主要有两点:首先,书籍中的文本通常具有较长的上下文依赖关系,这有助于模型学习长期的依赖模式;其次,由于这些书籍未公开发布,因此在其他NLP数据集中出现的可能性较低,这进一步验证了GPT-1模型的泛化能力。

1.3 网络结构的细节

GPT-1采用了基于Transformer的架构,具体包含12层的Transformer解码器。以下是一些关键的网络结构细节:

  • 掩码自注意力机制:GPT-1使用了掩码自注意力头,确保模型在预测某个词时不会看到该词之后的任何信息,这有助于模型学习语言的自然顺序。
  • 字节对编码(BPE):GPT-1使用BPE进行文本编码,共有固定的字节对数量,这种编码方式能有效处理罕见的和未见过的词汇。
  • 词编码长度:词编码的长度设定为固定的长度,以适应不同长度的词汇。
  • 位置编码:GPT-1也学习位置编码,以捕捉序列中词的位置信息。
  • Transformer层数与头数:GPT-1包含12层的Transformer,每个Transformer块有多个自注意力头,头数设定为固定值。
  • 正则化机制:GPT-1使用了包括Attention、残差连接、Dropout等多种机制进行正则化,以防止过拟合。
  • 激活函数:GPT-1的激活函数为GELU(Gaussian Error Linear Unit),这是一种平滑的ReLU变种,有助于模型更好地学习非线性关系。
  • 训练参数:GPT-1的训练参数包括batch size、学习率、序列长度、训练轮数(epoch)等,这些参数的选择对模型的性能有重要影响。GPT-1的模型参数数量达到了数十亿级别。

1.3.1 无监督训练

在无监督训练阶段,GPT-1主要关注于最大化给定文本序列的似然值。这通过调整模型的参数,使模型能够预测序列中每个词的出现概率来实现。

1.3.2 有监督微调

在有监督微调阶段,GPT-1使用无监督训练得到的模型作为起点,针对特定NLP任务进行微调。这通常涉及调整模型的顶层结构,以适应不同任务的输出要求。通过微调,GPT-1能够在保持模型泛化能力的同时,提高在特定任务上的性能。

1.4 GPT-1的性能

GPT-1在多个NLP任务上展示了强大的性能。在有监督学习的12个基准任务中,GPT-1在9个任务上的表现超过了当时的最佳模型。在零次学习(zero-shot)任务中,GPT-1也显示出较好的稳定性,并且随着训练次数的增加,性能逐渐提升。这表明GPT-1具有较强的泛化能力,可以应用于与训练任务不直接相关的其他NLP任务中。

然而,值得注意的是,GPT-1在未经微调的任务上虽然也有一定的效果,但其性能通常低于经过微调的有监督任务。这说明GPT-1虽然在语言建模方面取得了显著进展,但仍需要在特定任务上进行微调才能充分发挥其潜力。因此,GPT-1可以被视为一个强大的“领域专家”,但还不是一个通用的语言学家。

GPT-2:多任务学习与更大的模型

GPT-2旨在通过扩展模型容量和采用更大的数据集来训练一个泛化能力更强的词向量模型。与GPT-1相比,GPT-2在模型结构上并未进行大的创新,但它在网络参数和数据集规模上有了显著的增加。下面我们将对GPT-2进行详细的介绍。

2.1 GPT-2的核心思想

GPT-2的核心思想是使用无监督的预训练模型来执行有监督的任务。基于文本数据的时序性,GPT-2将语言建模任务转化为根据已知上文预测未知下文的条件概率问题。具体来说,一个输出序列可以表示为一系列条件概率的乘积,这实际上是一个序列生成任务。

GPT-2进一步扩展了这一思想,认为当模型的容量足够大且数据量足够丰富时,仅通过训练语言模型就可以覆盖大部分有监督学习任务。这是因为有监督学习任务可以看作是无监督语言模型的一个子集。例如,在训练了包含“Micheal Jordan is the best basketball player in the history”的语料后,模型不仅学会了语言模型,还隐含地学会了回答类似“who is the best basketball player in the history?”的问题。

2.2 GPT-2的数据集

GPT-2采用了名为WebText的数据集,该数据集来源于Reddit上的高赞文章。WebText共包含约800万篇文章,总数据量约为40GB。为了避免与测试集冲突,WebText移除了与Wikipedia相关的文章。

2.3 模型参数

GPT-2在多个方面对模型参数进行了调整和优化:

  • 字典大小: 使用字节对编码(BPE)构建字典,字典的大小设定为特定值,以适应不同长度的词汇。
  • 滑动窗口大小: 根据模型需要设定滑动窗口的大小,用于捕获文本中的上下文信息。
  • Batch Size: 为了加速训练和提高模型性能,GPT-2增大了batch size的大小。
  • Layer Normalization: 在Transformer块的输入部分添加了Layer Normalization,并在每个self-attention之后也添加了一个Layer Normalization,以增强模型的稳定性。
  • 残差层缩放:GPT-2对残差层的初始化值进行了缩放,缩放因子与残差层的个数相关,以改善深层模型的训练效果。

GPT-2训练了四组不同层数和词向量长度的模型,这些模型在多个NLP任务上均取得了显著的性能提升。实验结果表明,随着模型规模的增大,GPT-2的泛化能力和性能也在不断提升。

参数量 层数 词向量长度
117M(GPT-1) 12 768
345M 24 1024
762M 36 1280
1542M 48 1600

GPT-3:海量参数与In-context Learning

GPT-3是目前最强大的语言模型之一,它凭借其巨大的参数量、庞大的训练数据集以及创新的训练方式,在各种NLP任务上均展现出了出色的性能。无需大量有标签的训练数据,GPT-3仅需零次或少数几次学习即可在下游任务中取得优异的表现。

3.1 In-context Learning

GPT-3的出色性能在很大程度上归功于其采用的In-context Learning方法。为了理解In-context Learning,我们先来探讨一下元学习(Meta-learning)的概念。元学习的核心思想是通过学习如何学习,来找到一种有效的学习策略或初始化参数,使得模型能够在新的、未见过的任务上快速适应并取得良好的性能。

In-context Learning是元学习思想的一种具体实现,它允许模型在给定一些示例的情况下,直接通过这些示例来学习并完成任务,而无需显式地更新模型参数。在GPT-3中,这种学习方式被应用于各种NLP任务中。具体来说,当给定一个新的任务时,我们可以向GPT-3提供少量的示例输入和对应的输出(即“上下文”),然后让GPT-3根据这些示例来推断并生成针对新输入的输出。通过这种方式,GPT-3能够在不依赖大量有标签训练数据的情况下,快速适应并完成各种NLP任务。

GPT-3的In-context Learning能力得益于其巨大的参数量和训练数据集。通过在大规模无监督文本数据上进行预训练,GPT-3已经学习到了丰富的语言知识和模式。这使得它能够在给定少量示例的情况下,快速理解并应用这些知识来完成新任务。同时,GPT-3的巨大参数量也使其具备了强大的表征能力,能够捕捉并表达复杂的语言现象和语义关系。

除了In-context Learning外,GPT-3还采用了多种先进的技术和策略来提高其性能和泛化能力。例如,GPT-3采用了Transformer架构的变体,并引入了稀疏自注意力机制来降低计算复杂度。此外,GPT-3还使用了混合精度训练、数据并行等技术来加速训练过程并减少资源消耗。这些技术和策略共同使得GPT-3成为了一个强大而高效的语言模型。

总结

GPT系列模型的发展历程展示了预训练语言模型的强大潜力和广阔前景。随着模型容量的不断增加和训练数据的不断扩大,我们可以期待未来会有更加强大和智能的NLP模型出现。

应用场景

在公司的项目中我也应用了这项技术,具体可以参考ChatMoney这款产品;ChatMoney专注于AI应用落地与变现,提供全套、持续更新的AI源码系统与可执行的变现方案,致力于帮助更多人利用AI来变现,欢迎进入ChatMoney.cn获取更多AI变现方案!

1分钟了解 GPT-1到GPT-3 演化过程的更多相关文章

  1. linux分区之ext2,ext3,ext4,gpt

    linux分区之ext2,ext3,ext4,gpt 2013-07-10 12:00:24 标签:ext3 gpt 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明 ...

  2. IBM X3850 Windows 无法安装到这个磁盘。选中的磁盘具有MBR分区表。在 EFI 系统上,Windows 只能安装到 GPT 磁盘

    以前安装的是window2003 32位, 改装为2012 64位的时候.出现 Windows 无法安装到这个磁盘.选中的磁盘具有MBR分区表.在 EFI 系统上,Windows 只能安装到 GPT ...

  3. UEFI+GPT引导基础篇(一):什么是GPT,什么是UEFI?

    其实关于UEFI的几篇文章很早就写下了,只是自己读了一遍感觉很不满意,就决定重写.目的是想用最简单直白的语言把内容写出来,让每个人都能轻松读懂.当然,如果你已经对这些内容有了很深的理解的话,这篇文章除 ...

  4. 硬盘分区时GPT和MBR的区别/选择

    最明显的区别是MBR最大支持2T的硬盘,而GPT则更大. 1.最先出现在Windows8中设置新磁盘,系统会询问你是想要使用MBR还是GPT分区,GPT是一种新的硬盘分区标准.GPT带来了很多新特性, ...

  5. GPT vs MBR 分区 ,,, Legacy BIOS vs UEFI BIOS

    MBR与GPT两种磁盘分区格式的区别 http://itoedr.blog.163.com/blog/static/120284297201378114053240 GPT Partition Tab ...

  6. 硬盘格式是MBR、GPT

    装win7 64位要求硬盘格式是MBR 现在预装 Win8 的电脑大多是采用新版 UEFI 固件 + GPT 格式磁盘 GPT模式是针对整个硬盘的初始化而言,因此不存在某一个分区是GPT模式的说法.转 ...

  7. 【转】对硬盘进行分区时,GPT和MBR区别。

    在Windows 8或8.1中设置新磁盘时,系统会询问你是想要使用MBR还是GPT分区.GPT是一种新的标准,并在逐渐取代MBR. GPT带来了很多新特性,但MBR仍然拥有最好的兼容性.GPT并不是W ...

  8. GPT分区基础知识

    大硬盘和WIN8系统,让我们从传统的BIOS+MBR模式升级到UEFI+GPT模式,现在购买的电脑,都是预装WIN8系统,为了更好的支持2TB硬盘,更快速的启动win8,预装系统都采取了GPT分区的格 ...

  9. GPT分区基础知识及如何在GPT分区上安装WIN7

    大硬盘和WIN8系统,让我们从传统的BIOS+MBR模式升级到UEFI+GPT模式,现在购买的主流电脑,都是预装WIN8系统,为了更好的支持2TB硬盘,更快速的启动win8,预装系统都采取了GPT分区 ...

  10. UEFI GPT

    其实关于UEFI的几篇文章很早就写下了,只是自己读了一遍感觉很不满意,就决定重写.目的是想用最简单直白的语言把内容写出来,让每个人都能轻松读懂.当然,如果你已经对这些内容有了很深的理解的话,这篇文章除 ...

随机推荐

  1. IvorySQL 4.0 发布:全面支持 PostgreSQL 17

    2024 年 12 月 24 日,IvorySQL 4.0 发布了! 这是 2024 年以来发布的最新版本,相较于上个版本,有了较大的变化. 该版本有多项增强:全面支持 PostgreSQL 17,新 ...

  2. CDH6.3.2下安装部署Qualitis数据质量分析的计算服务Linkis1.3.2

    快速搭建Qualitis手册 一.基础软件安装 Gradle (4.6) MySQL (5.5+) JDK (1.8.0_141) Linkis(1.0.0+), 必装Spark引擎.如何安装Link ...

  3. SpringBoot集成LDAP认证登录

    Maven依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  4. Centos双网卡冗余绑定

    1. 前言 关于双网卡绑定,前前后后踩过不少的坑,虽然这是 RHCE 中的一道题,但是在实践中碰到问题也够喝一壶的. 在实践中,虚拟机.物理机都做过,但是不尽相同,大部分的坑也集中在这里,本文长期更新 ...

  5. 手把手教你如何给 Docker 开启 IPv6 网络支持

    Docker 默认是不开启 IPv6 支持的,但是我们某些业务往往又需要 IPv6 的支持,特别是 IPv6 普及大势所趋,本文主要介绍的是如何开启 Docker 桥接网络 IPv6 支持,这篇文章具 ...

  6. MySQL查询当前连接数的语句

    1. 查看当前总连接数 SHOW STATUS LIKE 'Threads_connected'; 返回当前建立的连接总数 2. 查看最大连接数配置 SHOW VARIABLES LIKE 'max_ ...

  7. FireDAC开发DataSnap应用系统【2】-使用TFDJSONDatasets功能

    类别 说明 TFDJSONDatasets FireDAC使用JSONDataSet,其中可包括多个DataSet对象 TFDJSONDataSetsWriter 把TDataSet写入TFDJSON ...

  8. .NET多线程编程之CountdownEvent使用

    简单来说,使用这个类可以让主线程等待子线程都完成任务之后才执行任务 1 static void Main(string[] args) 2 { 3 ///子任务的数量 4 CountdownEvent ...

  9. markdown常用命令行格式

    Markdown 主要命令(语法)如下: 标题 使用 # 号表示标题,# 的个数决定标题的级别: 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 段落 & 换行 直接输入文字形成段 ...

  10. Java提交到MySQL数据库出现中文乱码

    1)使用文本或者链接地址写到代码中(不推荐)时,实例如下: jdbc:mysql://localhost:3306/tms?useUnicode=true&characterEncoding= ...