【AI模型学习】GPT——从v1到v3
文章目录
- GPT-1
- GPT vs BERT
- GPT-2
- GPT-3
- Ai代码
GPT-1
GPT-1(Generative Pretrained Transformer 1)是 OpenAI 在2018年发布的第一个大规模预训练生成模型。它开创了基于 Transformer 的 预训练-微调 (pretraining-finetuning) 框架,在自然语言处理(NLP)领域产生了深远影响。
1. GPT-1的架构:基于Transformer解码器
GPT-1使用了 Transformer 架构的解码器部分。与其他NLP模型(如BERT,使用编码器)不同,GPT-1采用了自回归模型,通过 逐步生成 下一个词汇来学习语言的结构。
- 自回归模型:每次生成一个新词时,模型依赖于前面已经生成的单词,这样保证了生成的连贯性。
- 解码器部分:GPT-1只使用了Transformer的解码器,因此它在生成时只能依赖于之前的文本,而不能看到未来的文本。
2. GPT-1的预训练任务:自回归语言建模
GPT-1的预训练任务是 自回归语言建模。在这个任务中,模型通过给定前文来预测下一个词。
训练过程:
- 给定一段文本,模型通过最大化每个词的条件概率来进行训练。即:
P ( x t ∣ x 1 , x 2 , . . . , x t − 1 ) P(x_t | x_1, x_2, ..., x_{t-1}) P(xt∣x1,x2,...,xt−1)
其中, x t x_t xt 是模型需要预测的下一个词,而 x 1 , x 2 , . . . , x t − 1 x_1, x_2, ..., x_{t-1} x1,x2,...,xt−1是前面已经生成的词。
3. 预训练
GPT-1在BooksCorpus数据集上进行了预训练。这个数据集包含大约 7000 本小说,总共约 1.2 亿个单词。通过这个海量数据,GPT-1学会了语法结构、语义联系以及文本的各种潜在模式。
完成预训练后,GPT-1进入了微调阶段,这时候模型开始根据任务进行调整。微调是在特定的下游任务(如文本分类、命名实体识别、问答等)上进行的。
- 在微调阶段,GPT-1依靠少量的标注数据,对已经学到的通用语言表示进行调整,以适应特定任务。
- 微调使得GPT-1能够灵活适应多种任务,只需对参数进行少量调整即可。
4. GPT-1的模型规模与训练
- 参数量:GPT-1的模型包含 1.1 亿个参数,相对于后来的GPT-2和GPT-3来说规模较小,但它仍然在当时的许多任务中展现出了强大的能力。
- 训练方法:GPT-1使用了Adam优化器和交叉熵损失函数进行训练,通过反向传播优化模型参数,使得模型能够准确预测下一个词。
GPT vs BERT
- 预训练目标:自回归 vs 遮蔽语言建模
-
GPT(自回归语言建模):
- GPT采用的是自回归语言建模(Autoregressive Language Modeling)。它的目标是通过上下文的前文(左侧词汇)来预测下一个词,生成一个接一个的词汇。因此,GPT是单向的,它只能利用已经生成的词来预测下一个词。
- 特点:适合生成任务,如文本生成、对话生成等。
-
BERT(遮蔽语言建模):
- BERT使用的则是遮蔽语言建模(Masked Language Modeling, MLM)。它在训练时会随机遮蔽输入文本中的一些单词,然后让模型根据前后文的信息预测被遮蔽的词。也就是说,BERT是双向的,可以同时考虑前文和后文的信息。
- 特点:适合理解任务,如问答、文本分类、命名实体识别(NER)等。
BERT的双向上下文使得它能够在训练时考虑到整个文本的前后关系,这让BERT能更好地理解文本的语义和句法结构。想象一下,BERT不仅能看到句子中的前文,还能同时理解后文的意义。而GPT,虽然也能理解前文的内容,但无法像BERT那样同时利用后文的信息。这个差异让BERT在处理理解类任务时表现得非常强大,而GPT则更偏向于生成任务。
2. 微调策略:
-
GPT的微调:
- GPT的微调比较简单,因为它是基于解码器的自回归模型,因此微调时更多依赖于生成任务的调整。GPT通常在文本生成、对话生成等任务上进行微调。
- GPT的微调需要依赖较多的上下文来生成连续的文本,适合那些需要逐字生成的任务。
-
BERT的微调:
- BERT的微调则更加多样化,因为它的训练本身是基于双向上下文的,微调时只需要少量的标注数据,就能快速适应任务。例如,它可以被用来进行文本分类、问答、命名实体识别等任务,而不需要像GPT那样逐步生成文本。
- 这种基于双向上下文建模的微调方式,使得BERT在各种理解任务中取得了很好的效果!
3. 在标准任务上的表现:
当BERT发布时,它迅速在多个标准任务上大幅超越了GPT-1,尤其是在理解类任务(如GLUE基准测试)中:
-
GLUE基准测试:这是一个包含多个NLP理解任务的基准测试,包括文本分类、问答、情感分析等。BERT在这个测试中的表现超越了所有之前的模型(包括GPT-1),因为它能够在任务中充分利用双向上下文,从而理解文本中的深层含义。
-
GPT-1的表现:虽然GPT-1在一些生成任务上非常强大,但在理解任务(如文本分类、问答)上,GPT-1的表现并不突出,甚至在GLUE等任务上落后于BERT。
关于解码器和编码器:
解码器和编码器使用的 mask 是不同的。这两个组件使用 mask 的方式有非常重要的差异,直接影响了模型的能力和任务的适用性。
1. 解码器的 Mask: 自回归生成的 Mask
在 GPT 系列中,解码器使用了一个特别的 mask —— 遮蔽自注意力(Masked Self-Attention)。这个 mask 的作用是确保模型在生成每个词时 只能看到当前词及其前面的词,而 不能看到未来的词。这正是自回归生成模型的特性,确保了生成过程的顺序性。
假设我们有一个长度为 T T T的输入序列,GPT 模型在生成每个词时使用的 mask 是一个 下三角矩阵,如下所示:
( 1 0 0 … 0 1 1 0 … 0 1 1 1 … 0 ⋮ ⋮ ⋮ ⋱ ⋮ 1 1 1 … 1 ) \begin{pmatrix} 1 & 0 & 0 & \dots & 0 \\ 1 & 1 & 0 & \dots & 0 \\ 1 & 1 & 1 & \dots & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & 1 & 1 & \dots & 1 \end{pmatrix} 111⋮1011⋮1001⋮1………⋱…000⋮1
- 1 表示这个位置是可以访问的。
- 0 表示这个位置被 遮蔽,不能被访问。
这种方式确保了生成时每个位置只能依赖它之前的位置,避免了泄漏未来的信息。
2. 编码器的 Mask: 双向上下文的 Mask
与解码器的情况不同,编码器 使用的 mask 主要是为了实现 双向上下文建模,而不需要像解码器那样遮蔽未来的信息。
BERT 和类似的编码器模型(如Transformer编码器)使用双向的上下文来理解每个词的含义。这意味着编码器必须能够同时查看前文和后文的所有信息,捕捉输入序列中的全局依赖。
同时,编码器中有一个特殊的 mask(Masking),通常用于 遮蔽一些词汇,目的是让模型在训练时学习到如何利用上下文来预测这些被遮蔽的词汇。与解码器的 mask 不同,编码器的 mask 主要作用是在训练时对输入序列进行遮蔽,以进行语言建模或序列填充。
GPT-2
在GPT-1取得一定的成功后,OpenAI的研究团队看到了一个更大的目标:通过提升模型的规模与能力,GPT-2不仅要在生成任务上更强大,还要在理解任务上挑战当时已经在理解任务中表现极为出色的 BERT。
GPT-2的设计:自回归生成模型
GPT-2继承了GPT-1的架构,基于 Transformer解码器。自回归模型意味着它通过上下文信息(主要是前文)逐步预测下一个词,逐字逐句地生成文本。每次生成时,GPT-2都会基于前面生成的词来预测下一个词。
-
训练目标:和GPT-1一样,GPT-2的预训练任务是自回归语言建模,即通过给定上下文来预测下一个词。
-
训练数据:GPT-2使用了大规模的 WebText 数据集,它包含了大量来自互联网上的文本,包括新闻文章、博客、维基百科等。这个数据集的规模比GPT-1使用的BooksCorpus大得多,达到了40GB的文本数据。
然而,事实并不如预期!
虽然GPT-2在生成任务上表现得非常强大,它能够生成流畅、自然的文本,但在理解任务(如问答、情感分析、文本分类)上,GPT-2并没有完全超越BERT。
-
BERT的优势:BERT使用的是双向上下文建模,通过遮蔽语言模型(Masked Language Modeling,MLM)训练,让模型在训练时同时看到前文和后文的上下文信息,这使得BERT能够更好地理解每个词的语义关系。BERT在问答、情感分析等理解任务上,凭借双向上下文的优势,表现得异常强大。
-
GPT-2的局限:尽管GPT-2的生成能力非常强大,但它仍然是自回归的单向生成模型,每次生成一个词时,它只能利用前文的上下文,无法像BERT那样同时看到前后的信息。这使得GPT-2在理解任务中无法像BERT那样精确捕捉句子中词与词之间的深层关系。
Zero-shot学习的突破!
Zero-shot学习是指在没有专门为特定任务进行微调的情况下,模型能够仅凭任务描述或少量示例来理解并执行任务。GPT-2通过Zero-shot学习,不仅展现了生成任务的强大能力,还能在各种理解任务上取得令人惊叹的效果。
-
任务无需微调: 在传统的预训练-微调框架中,模型需要针对每个特定任务进行微调(例如,情感分析、命名实体识别等),并且需要大量的标注数据。但在Zero-shot学习中,GPT-2无需在特定任务上进行微调,也不需要特定任务的标注数据。
-
模型的灵活性: 通过Zero-shot学习,GPT-2能够灵活应对各种自然语言处理任务。这不仅大大减少了训练成本,还能在多种任务之间轻松切换,使得GPT-2成为一个真正的“通用任务执行者”。
-
降低数据需求: Zero-shot学习的能力使得GPT-2在处理不同任务时不需要大量的标注数据,它依靠之前的无监督预训练,已经学到了丰富的语言模式。无论是文本分类、情感分析,还是问答任务,只需给定任务描述,GPT-2便能胜任。
在Zero-shot学习中,GPT-2能够通过任务描述来理解任务并生成答案。任务描述可以是自然语言的指令或问题描述,这使得GPT-2能够直接根据语言描述来执行任务,而不需要额外的标注数据。
GPT-3
GPT-3(Generative Pretrained Transformer 3)是 OpenAI 在 2020 年发布的一个超大规模预训练语言模型。它继承了 GPT-1 和 GPT-2 的架构和预训练方法,但在规模和能力上都达到了前所未有的高度。
GPT-3的规模:1750亿个参数!
GPT-3 的核心特点之一就是 超大规模!它的参数量达到了 1750亿个,是 GPT-2(15亿参数)的 100倍!这个巨大规模的模型能够理解和生成更加复杂、更加连贯的语言。
- GPT-3的规模: 1750亿个参数
- GPT-2的规模: 15亿个参数
这一规模使得 GPT-3 不仅在 生成任务 上表现出色,在 理解任务 上的能力也得到了极大的提升。规模的增加意味着 GPT-3 在处理文本时能够捕捉到更多的语言特征、上下文关系以及更复杂的推理能力。
GPT-3的训练:大数据,强计算
GPT-3 是在 大量数据 和 强大计算资源 上训练出来的。与GPT-2使用的WebText数据集不同,GPT-3的训练数据集规模更大,包含了各种公开的互联网文本资源,如书籍、文章、网站等。这个庞大的数据集为GPT-3提供了丰富的语言模式和知识,让它能够应对更多样化的任务。
GPT-3使用了一个超过45TB的文本数据,涵盖了广泛的主题和领域。这些数据的多样性帮助它在多个领域中取得良好的表现,无论是文学创作、科学讨论,还是编程代码生成,它都能够生成高质量的内容。
GPT-3的训练需要极其庞大的计算资源,通过数千个GPU进行训练,使用的计算能力堪比超大规模的超级计算机。正因为如此,GPT-3的计算能力和推理能力也远超此前的版本。
GPT-3 不仅仅是 Zero-shot 任务的佼佼者,它在 Few-shot学习 上也非常强大。Few-shot学习 是指模型在给定少量示例的情况下执行任务,而 Zero-shot学习 则是指模型直接从任务描述进行推理并执行任务。
-
GPT-3 在理解和执行任务时,能够仅通过任务描述来完成任务。例如,给定一段简单的描述:“根据下面的文本判断它是积极的还是消极的”,GPT-3可以直接根据文本生成情感分析的结果,完全不需要微调。
-
它的能力远远超过了GPT-2,因为它不仅能在生成任务上发挥出色,还能在理解任务上(如推理、问答、文本分类等)直接根据描述执行任务。
在 Zero-shot 和 Few-shot learning 上,GPT-3展示了它强大的推理能力。它能够处理各种各样的任务,如:
- 文本分类
- 情感分析
- 翻译
- 代码生成
- 问题回答
由于GPT-3的强大能力,它已经在多个领域和应用中展现了巨大的潜力。以下是一些典型的应用场景:
(1)自然语言生成
(2)问答系统
(3)编程助手
(4)翻译
(5)创意生成
Ai代码
1. Codex
Codex 是由 OpenAI 开发的程序生成模型,基于 GPT-3 架构,专门用于将自然语言转化为代码。
Codex的关键特点:
- 自然语言转代码:Codex能够理解自然语言描述并生成相应的代码。例如:“编写一个计算数字平方的函数”,Codex会生成对应的Python代码。
- 多编程语言支持:Codex支持包括 Python、JavaScript、Java、Go、Ruby 等多种编程语言。
- 代码补全与自动化编程:Codex能够根据部分输入自动补全代码,甚至可以根据需求生成整个程序,减少开发者的工作量。
- 代码翻译:Codex能够将一种语言的代码翻译成另一种编程语言,比如将Python代码转换为JavaScript。
Codex应用:
- 编程助手:通过集成到 GitHub Copilot 等工具,Codex帮助开发者自动化编程任务,提高编程效率。
- 低代码开发:Codex能够自动生成代码,帮助非专业开发者通过自然语言描述快速创建应用。
2. AlphaCode
AlphaCode 是由 DeepMind 开发的专注于 编程竞赛 的程序生成模型,旨在解决高难度编程问题,尤其是编程竞赛中的算法挑战。
AlphaCode的关键特点:
- 多样化生成方案:AlphaCode生成多个候选代码解决方案,并从中筛选出最优解。这种方法帮助它应对复杂的编程题目。
- 理解问题描述并推理:AlphaCode通过解析编程问题的自然语言描述,推理出问题的解决方案,并生成对应的代码。
- 解决高难度编程问题:专门针对像 ACM ICPC 这样的编程竞赛任务,AlphaCode能够生成高质量的解法并与人类开发者竞争。
AlphaCode应用:
- 编程竞赛:AlphaCode能够解决 编程竞赛 中的高难度问题,生成符合要求的算法解决方案。
- 自动化编程:对于复杂的编程任务,AlphaCode可以生成多个解法,提供最佳的编程解决方案。
Codex vs AlphaCode:对比总结
特征 | Codex | AlphaCode |
---|---|---|
目标任务 | 自动生成代码、代码补全、代码翻译等 | 解决编程竞赛中的复杂编程问题,模拟编程竞赛中的解题过程 |
核心技术 | 基于GPT-3,专注于自然语言生成代码 | 基于多样化生成策略,专注于解决高难度编程问题 |
编程语言支持 | 支持多种编程语言,如Python、JavaScript等 | 主要专注于解决复杂编程问题,支持多种编程语言 |
应用场景 | 编程助手、自动化开发、低代码开发平台 | 编程竞赛、自动化编程挑战 |
生成方式 | 生成高质量代码并提供代码补全 | 生成多种候选代码,选择最佳解决方案 |