GPT1.0 和 GPT2.0 的联系与区别

随着自然语言处理技术的飞速发展,OpenAI 提出的 GPT 系列模型成为了生成式预训练模型的代表。作为 GPT 系列的两代代表,GPT-1 和 GPT-2 虽然在架构上有着继承关系,但在设计理念和性能上有显著的改进。本文将从模型架构、参数规模、训练数据和实际能力等方面分析 GPT-1 和 GPT-2 的联系与区别。


一、GPT-1 和 GPT-2 的基本联系

  1. 相同的核心架构:基于 Transformer 的解码器结构
    • GPT-1 和 GPT-2 都采用了 Transformer 架构中的解码器部分,取消了编码器部分。这种设计使得模型专注于自回归任务,即通过给定前文预测下一个词。
    • 两者均使用多头自注意力机制和前馈网络相结合的模块堆叠。
  2. 语言建模目标一致
    • 两代模型的训练目标都是无监督语言建模(Unsupervised Language Modeling),以最大化给定文本序列的似然概率为优化目标。
    • 使用左到右的单向生成方式,从序列的开头逐词预测,适用于语言生成任务。
  3. 位置嵌入(Positional Embedding)
    • 两代模型均使用了位置嵌入,将词汇嵌入(Token Embedding)与位置嵌入相加后作为 Transformer 的输入。
  4. 残差连接与 LayerNorm
    • 残差连接(Residual Connection)和层归一化(Layer Normalization)被广泛用于提升梯度流动和训练稳定性。

二、GPT-1 和 GPT-2 的主要区别

1. 模型规模

GPT-2 的显著改进在于模型规模的扩展:

  • GPT-1:只有一个版本,参数规模为 1.1 亿(110M),包含 12 层 Transformer 解码器,每层的隐藏状态维度为 768。
  • GPT-2:提供了多个版本,最大参数规模达到 15 亿(1.5B),包含 48 层 Transformer 解码器,每层的隐藏状态维度为 1600,注意力头数从 12 增加到 16。
2. 上下文窗口长度
  • GPT-1 的最大上下文长度为 512
  • GPT-2 扩展到了 1024,使得模型可以捕获更长的上下文依赖关系,提升了生成的连贯性和逻辑性。
3. 训练数据集
  • GPT-1:训练数据规模较小,主要来自书籍数据集(BooksCorpus)等,包含约 5GB 的文本。
  • GPT-2:大幅扩展训练数据,使用了一个名为 WebText 的数据集,包含约 40GB 的高质量互联网文本。WebText 通过过滤低质量内容(如广告和代码)优化了数据质量。
  • 这种数据规模和多样性的提升,让 GPT-2 的泛化能力远超 GPT-1。
4. LayerNorm 的位置
  • GPT-1 使用了前置 LayerNorm(Pre-Norm),即将 LayerNorm 放在子模块的输入部分。
  • GPT-2 改为后置 LayerNorm(Post-Norm),即将 LayerNorm 放在子模块的输出部分。后置 LayerNorm 改善了梯度流动问题,提升了模型的训练稳定性。
5. 语言生成能力
  • GPT-2 在语言生成的连贯性、上下文一致性和逻辑性方面大幅超越 GPT-1,尤其是在长文本生成时表现尤为突出。
  • GPT-2 具备更强的多任务能力,即使没有专门的微调,也能解决翻译、问答等多种任务(零样本和少样本学习)。
6. 训练优化
  • GPT-2 引入了更高效的优化技术,比如改进了学习率调度策略(线性学习率热身和余弦衰减)、更少的 Dropout 使用等。

三、GPT-1 和 GPT-2 的实际意义

1. GPT-1:验证 GPT 架构的有效性
  • GPT-1 是生成式预训练模型(Generative Pre-trained Transformer)的首次实践,验证了基于无监督预训练的 Transformer 架构在自然语言处理任务中的潜力。
  • 其提出了“预训练 + 微调”的通用框架,为后续模型的快速发展奠定了基础。
2. GPT-2:大规模模型的潜力
  • GPT-2 的成功揭示了“更大模型 + 更多数据”在提升自然语言处理能力上的重要性。
  • 它的强大能力表明,模型规模的扩大与数据质量的提升可以显著提高模型在语言生成和多任务学习中的表现。
3. 技术传播与影响
  • GPT-1 的问世将注意力吸引到生成式语言模型领域,而 GPT-2 的发布则推动了行业对大规模预训练模型的关注,直接影响了后续 GPT-3、ChatGPT 等更强大的模型发展。

四、总结

GPT-1 和 GPT-2 作为两代生成式预训练模型,既有紧密的联系,也展现出明显的区别:

特性GPT-1GPT-2
参数规模1.1 亿15 亿
Transformer 层数12 层48 层(大模型)
隐藏层维度7681600
上下文长度5121024
训练数据集5GB40GB
LayerNorm 位置前置后置
生成质量一般优秀

GPT-1 提供了理论框架,GPT-2 则通过更大的规模、更优的数据和更精细的优化将这种架构的潜力发挥到了极致。两者的进化过程体现了深度学习领域中“大规模预训练模型”的发展思路,也为后续 GPT 系列的发展铺平了道路。


五、参考代码(不完整,仅供理解)

import torch
import torch.nn as nn
import torch.optim as optimclass GPT1Layer(nn.Module):"""GPT-1 的 Transformer 子模块,使用前置 LayerNorm"""def __init__(self, embed_size, num_heads):super(GPT1Layer, self).__init__()self.ln = nn.LayerNorm(embed_size)self.attn = nn.MultiheadAttention(embed_size, num_heads)self.ffn = nn.Sequential(nn.Linear(embed_size, 4 * embed_size),nn.GELU(),nn.Linear(4 * embed_size, embed_size))def forward(self, x):# 前置 LayerNorm + 注意力x_norm = self.ln(x)attn_out, _ = self.attn(x_norm, x_norm, x_norm)x = x + attn_out  # 残差连接# 前置 LayerNorm + 前馈网络x_norm = self.ln(x)ffn_out = self.ffn(x_norm)x = x + ffn_out  # 残差连接return xclass GPT2Layer(nn.Module):"""GPT-2 的 Transformer 子模块,使用后置 LayerNorm"""def __init__(self, embed_size, num_heads):super(GPT2Layer, self).__init__()self.attn = nn.MultiheadAttention(embed_size, num_heads)self.ln1 = nn.LayerNorm(embed_size)self.ffn = nn.Sequential(nn.Linear(embed_size, 4 * embed_size),nn.GELU(),nn.Linear(4 * embed_size, embed_size))self.ln2 = nn.LayerNorm(embed_size)def forward(self, x):# 注意力 + 残差连接 + 后置 LayerNormattn_out, _ = self.attn(x, x, x)x = x + attn_outx = self.ln1(x)# 前馈网络 + 残差连接 + 后置 LayerNormffn_out = self.ffn(x)x = x + ffn_outx = self.ln2(x)return xclass GPT(nn.Module):"""通用 GPT 模型,允许指定 LayerNorm 逻辑"""def __init__(self, vocab_size, embed_size, num_heads, num_layers, max_len, layer_cls):super(GPT, self).__init__()self.embed = nn.Embedding(vocab_size, embed_size)self.pos_embed = nn.Embedding(max_len, embed_size)self.layers = nn.ModuleList([layer_cls(embed_size, num_heads) for _ in range(num_layers)])self.ln_f = nn.LayerNorm(embed_size)  # 用于 GPT-2 的全局 LayerNormself.fc = nn.Linear(embed_size, vocab_size)def forward(self, x):seq_len = x.size(1)pos = torch.arange(seq_len, device=x.device).unsqueeze(0)x = self.embed(x) + self.pos_embed(pos)for layer in self.layers:x = layer(x)x = self.ln_f(x)  # GPT-2 的全局 LayerNorm,GPT-1 可视情况移除return self.fc(x)# Hyperparameters for GPT-1 and GPT-2
gpt1_config = {'vocab_size': 30522,'embed_size': 768,'num_heads': 12,'num_layers': 12,'max_len': 512,'layer_cls': GPT1Layer
}gpt2_config = {'vocab_size': 50257,'embed_size': 1600,'num_heads': 25,'num_layers': 48,'max_len': 1024,'layer_cls': GPT2Layer
}# Initialize models
gpt1 = GPT(**gpt1_config)
gpt2 = GPT(**gpt2_config)# Loss function and optimizers
criterion = nn.CrossEntropyLoss()
optimizer1 = optim.Adam(gpt1.parameters(), lr=0.001)
optimizer2 = optim.Adam(gpt2.parameters(), lr=0.001)# Example input (batch_size, seq_len)
batch_size1, batch_size2 = 2, 2
input_ids1 = torch.randint(0, gpt1_config['vocab_size'], (batch_size1, gpt1_config['max_len']))
input_ids2 = torch.randint(0, gpt2_config['vocab_size'], (batch_size2, gpt2_config['max_len']))# Forward pass
outputs1 = gpt1(input_ids1)  # Output for GPT-1
outputs2 = gpt2(input_ids2)  # Output for GPT-2print(f"GPT-1 Output Shape: {outputs1.shape}")  # (batch_size, seq_len, vocab_size)
print(f"GPT-2 Output Shape: {outputs2.shape}")  # (batch_size, seq_len, vocab_size)def count_parameters(model):return sum(p.numel() for p in model.parameters() if p.requires_grad)def format_parameters(num_params):if num_params >= 1e9:return f"{num_params / 1e9:.2f}B"  # 转换为十亿单位并保留两位小数elif num_params >= 1e6:return f"{num_params / 1e6:.2f}M"  # 转换为百万单位并保留两位小数else:return f"{num_params}"# 计算并格式化参数数量
gpt1_params = count_parameters(gpt1)
gpt2_params = count_parameters(gpt2)print(f"GPT-1 Model Parameters: {format_parameters(gpt1_params)}")
print(f"GPT-2 Model Parameters: {format_parameters(gpt2_params)}")

在这里插入图片描述


参考

  • Improving Language Understanding by Generative Pre-Training (GPT-1)
  • Language Models are Unsupervised Multitask Learners (GPT-2)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

本地部署与外部部署有何不同?

什么是本地部署? 本地部署(通常缩写为“on-prem”)是指在公司自己的设施或数据中心内托管的软件和基础设施。与基于云的解决方案不同,本地部署系统让企业对其数据、硬件和软件配置拥有完全的控制权。这种设置非常适合那些优先考虑…

游戏引擎学习第20天

解释 off-by-one 错误 从演讲者的视角:对代码问题的剖析与修复过程 问题的起因 演讲者提到,他可能无意中在代码中造成了一个错误,这与“调试时间标记索引”有关。他发现了一个逻辑问题,即在检查数组边界时,使用了“调试…

Android-如何实现Apng动画播放

01 Apng是什么 Apng(Animated Portable Network Graphics)顾名思义是基于 PNG 格式扩展的一种动画格式,增加了对动画图像的支持,同时加入了 24 位图像和8位 Alpha 透明度的支持,并且向下兼容 PNG。 Google封面图 02 A…

Linux下Intel编译器oneAPI安装和链接MKL库编译

参考: https://blog.csdn.net/qq_44263574/article/details/123582481 官网下载: https://www.intel.com/content/www/us/en/developer/tools/oneapi/base-toolkit-download.html?packagesoneapi-toolkit&oneapi-toolkit-oslinux&oneapi-linoffline 填写邮件和国家,…

【Python系列】浅析 Python 中的字典更新与应用场景

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Matlab科研绘图:自定义内置多款配色函数

在Matlab科研绘图中,自定义和使用内置的多款配色函数可以极大地增强图表的视觉效果和数据的可读性。本文将介绍配色函数,共计带来6套配色体系,而且后续可以根据需要修改,帮助大家自定义和使用配色函数。 1.配色函数 可以根据个…

网络安全的学习方向和路线是怎么样的?

最近有同学问我,网络安全的学习路线是怎么样的? 废话不多说,先上一张图镇楼,看看网络安全有哪些方向,它们之间有什么关系和区别,各自需要学习哪些东西。 在这个圈子技术门类中,工作岗位主要有以…

JAVA八股与代码实践----JDK代理和CGLIB代理的区别

当spring发现该代理的类实现了接口会使用JDK代理,如果该类没有实现接口,会使用CGLIB代理 如果在springboot中要强制使用CGLIB代理,需要加上 EnableAspectJAutoProxy(proxyTargetClass true) // 强制使用 CGLIB SpringBootApplication Ena…

环境背景文本到语音转换

目录 概述演示效果核心逻辑使用方式 概述 本文所涉及的所有资源的获取方式:https://www.aspiringcode.com/content?id100000000027&uid2f1061526e3a4548ab2e111ad079ea8c 论文标题: 本文提出了 VoiceLDM,这是一种旨在生成准确遵循两种…

mac安装Pytest、Allure、brew

安装环境 安装pytest 命令 pip3 install pytest 安装allure 命令:brew install allure 好吧 那我们在安装allure之前 我们先安装brew 安装brew 去了官网复制了命令 还是无法下载 如果你们也和我一样可以用这个方法哦 使用国内的代码仓库来执行brew的安装脚本…

【Linux】重定向,dup

目录 文件描述符分配规则 重定向 dup ​编辑 输出重定向 追加重定向 输入重定向。 重定向会影响后面的程序替换吗? 1号文件和2号文件 2号文件输出重定向 下标之间的重定向 文件描述符分配规则 重定向 把显示器文件关闭后,本来应该写给显示器…

Vue实训---1-创建Vue3项目

1.创建项目(项目名为my-vue-project) npm create vitelatest my-vue-project -- --template vue 运行命令npm -v,查看npm版本号,如果是npm 7或更高版本运行以上命令即可。如果是npm 6或更低版本,使用npm create vite…

智慧社区方案提升居民生活质量与管理效率的创新实践

内容概要 智慧社区方案的背景与发展趋势指向了一个日益重要的方向,随着城市化进程的加快,传统的社区管理模式逐渐显得力不从心。在这个时候,智慧社区应运而生,它通过将现代信息技术与社区管理深度结合,为提升居民生活…

【IDER、PyCharm】免费AI编程工具完整教程:ChatGPT Free - Support Key call AI GPT-o1 Claude3.5

文章目录 CodeMoss 简介CodeMoss 的模型集成如何安装和配置 CodeMossIDER 插件安装步骤 CodeMoss 的实战使用AI 问答功能代码优化与解释优化这段代码解释这段代码 文件上传与对话联网查询与 GPT 助手联网查询GPT 助手 提升开发效率的最佳实践结语更多文献 CodeMoss 简介 CodeM…

Java安全—JNDI注入RMI服务LDAP服务JDK绕过

前言 上次讲到JNDI注入这个玩意,但是没有细讲,现在就给它详细地讲个明白。 JNDI注入 那什么是JNDI注入呢,JNDI全称为 Java Naming and Directory Interface(Java命名和目录接口),是一组应用程序接口&…

HarmonyOS笔记5:ArkUI框架的Navigation导航组件

ArkUI框架的Navigation导航组件 在移动应用中需要在不同的页面进行切换跳转。这种切换和跳转有两种方式:页面路由和Navigation组件实现导航。HarmonyOS推荐使用Navigation实现页面跳转。在本文中在HarmonyOS 5.0.0 Release SDK (API Version 12 Release)版本下&…

YOLOv11来了,使用YOLOv11训练自己的数据集和预测 (保姆级无代码操作版)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言性能表现数据集准备1.数据标注2.数据标签转换 YOLO模型训练教程1.模型安装2.YOLO11 模型训练3.YOLO11 预测结果 总结 前言 YOLOv11是由Ultralytics团队于2024年…

彻底理解消息队列的作用及如何选择

一.为什么要使用消息队列? 使用消息队列,其实是需要根据实际业务场景来的,一般都是实际开发中,遇到了某种技术挑战,如果不使用MQ的话,业务实现起来比较麻烦,但是通过MQ就可以更快捷高效的实现业…

在 Taro 中实现系统主题适配:亮/暗模式

目录 背景实现方案方案一:CSS 变量 prefers-color-scheme 媒体查询什么是 prefers-color-scheme?代码示例 方案二:通过 JavaScript 监听系统主题切换 背景 用Taro开发的微信小程序,需求是页面的UI主题想要跟随手机系统的主题适配…

飞凌嵌入式T113-i开发板RISC-V核的实时应用方案

随着市场对嵌入式设备的功能需求越来越高,集成了嵌入式处理器和实时处理器的主控方案日益增多,以便更好地平衡性能与效率——实时核负责高实时性任务,A核处理复杂任务,两核间需实时交换数据。然而在数据传输方面,传统串…