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 optim


class 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 x


class 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):
        # 注意力 + 残差连接 + 后置 LayerNorm
        attn_out, _ = self.attn(x, x, x)
        x = x + attn_out
        x = self.ln1(x)

        # 前馈网络 + 残差连接 + 后置 LayerNorm
        ffn_out = self.ffn(x)
        x = x + ffn_out
        x = self.ln2(x)

        return x


class 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 的全局 LayerNorm
        self.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-2

print(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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式系统与OpenCV

目录 一、OpenCV 简介 二、嵌入式 OpenCV 的安装方法 1. Ubuntu 系统下的安装 2. 嵌入式 ARM 系统中的安装 3. Windows10 和树莓派系统下的安装 三、嵌入式 OpenCV 的性能优化 1. 介绍嵌入式平台上对 OpenCV 进行优化的必要性。 2. 利用嵌入式开发工具,如优…

戴尔 AI Factory 上的 Agentic RAG 搭载 NVIDIA 和 Elasticsearch 向量数据库

作者:来自 Elastic Hemant Malik, Dell Team 我们很高兴与戴尔合作撰写白皮书《戴尔 AI Factory with NVIDIA 上的 Agentic RAG》。白皮书是一份供开发人员参考的设计文档,概述了实施 Agentic 检索增强生成 (retrieval augmented generation - RAG) 应用…

特征交叉-MaskNet文章总结代码实现

MaskNet 这个模型是微博21年提出的,23年twitter(X)开源的推荐系统排序模块使用的backbone结构。 核心思想是认为DNN为主的特征交叉是addictive,交叉效率不高;所以设计了一种multiplicatvie的特征交叉 如何设计muliplicative特征交叉呢&#x…

GRU (门控循环单元 - 基于RNN - 简化LSTM又快又好 - 体现注意力的思想) + 代码实现 —— 笔记3.5《动手学深度学习》

目录 0. 前言 1. 门控隐状态 1.1 重置门和更新门 1.2 候选隐状态 1.3 隐状态 2. 从零开始实现 2.1 初始化模型参数 2.2 定义模型 2.3 训练与预测 3 简洁实现 4. 小结 0. 前言 课程全部代码(pytorch版)已上传到附件看懂上一篇RNN的所有细节&am…

Java 基于SpringBoot+vue框架的老年医疗保健网站

大家好,我是Java徐师兄,今天为大家带来的是Java Java 基于SpringBootvue框架的老年医疗保健网站。该系统采用 Java 语言开发,SpringBoot 框架,MySql 作为数据库,系统功能完善 ,实用性强 ,可供大…

JavaWeb-表单-07

表单标签 介绍 code: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>HTML-表单</title> &…

计算机网络socket编程(4)_TCP socket API 详解

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络socket编程(4)_TCP socket API 详解 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&…

向量数据库FAISS之五:原理(LSH、PQ、HNSW、IVF)

1.Locality Sensitive Hashing (LSH) 使用 Shingling MinHashing 进行查找 左侧是字典&#xff0c;右侧是 LSH。目的是把足够相似的索引放在同一个桶内。 LSH 有很多的版本&#xff0c;很灵活&#xff0c;这里先介绍第一个版本&#xff0c;也是原始版本 Shingling one-hot …

Django启用国际化支持(2)—实现界面内切换语言:activate()

文章目录 ⭐注意⭐1. 配置项目全局设置&#xff1a;启用国际化2. 编写视图函数3. 配置路由4. 界面演示5、扩展自动识别并切换到当前语言设置语言并保存到Session设置语言并保存到 Cookie ⭐注意⭐ 以下操作依赖于 Django 项目的国际化支持。如果你不清楚如何启用国际化功能&am…

【初阶数据结构与算法】线性表之栈的定义与实现(含源码和有效的括号练习)

文章目录 一、栈的概念与结构1.栈的概念与操作2.栈的底层结构选型 二、栈的实现1.栈结构的定义2. 栈的初始化和销毁栈的初始化栈的销毁 3.栈的扩容与入栈栈的扩容入栈 4.判断栈是否为空和出栈判断栈是否为空出栈 5.取栈顶元素和获取栈中有效元素个数取栈顶元素获取栈中有效元素…

基于Spring Boot+Unipp的博物馆预约小程序(协同过滤算法、二维码识别)【原创】

&#x1f388;系统亮点&#xff1a;协同过滤算法、二维码识别&#xff1b; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框…

Python 快速入门(上篇)❖ Python基础知识

Python 基础知识 Python安装**运行第一个程序:基本数据类型算术运算符变量赋值操作符转义符获取用户输入综合案例:简单计算器实现Python安装** Linux安装: yum install python36 -y或者编译安装指定版本:https://www.python.org/downloads/source/ wget https://www.pyt…

【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段

文章目录 一、MyBatis-Plus简介二、快速入门1、环境准备2、将mybatis项目改造成mybatis-plus项目&#xff08;1&#xff09;引入MybatisPlus依赖&#xff0c;代替MyBatis依赖&#xff08;2&#xff09;配置Mapper包扫描路径&#xff08;3&#xff09;定义Mapper接口并继承BaseM…

【人工智能】PyTorch、TensorFlow 和 Keras 全面解析与对比:深度学习框架的终极指南

文章目录 PyTorch 全面解析2.1 PyTorch 的发展历程2.2 PyTorch 的核心特点2.3 PyTorch 的应用场景 TensorFlow 全面解析3.1 TensorFlow 的发展历程3.2 TensorFlow 的核心特点3.3 TensorFlow 的应用场景 Keras 全面解析4.1 Keras 的发展历程4.2 Keras 的核心特点4.3 Keras 的应用…

Chrome 浏览器 131 版本新特性

Chrome 浏览器 131 版本新特性 一、Chrome 浏览器 131 版本更新 1. 在 iOS 上使用 Google Lens 搜索 自 Chrome 126 版本以来&#xff0c;用户可以通过 Google Lens 搜索屏幕上看到的任何图片或文字。 要使用此功能&#xff0c;请访问网站&#xff0c;并点击聚焦时出现在地…

2.不同语音ai任务dataset类写法

主流语音任务 语音数据读取基本原则 直接保存语音会将该对象保存在内存中&#xff08;Dataset类调用__getitem__方法&#xff09; 所以一般保存这些数据的存储路径文档&#xff08;表单&#xff09;而不是数据的直接copy&#xff08;不然占用内存太大了&#xff09; 通常用nump…

K8S + Jenkins 做CICD

前言 这里会做整体CICD的思路和流程的介绍&#xff0c;会给出核心的Jenkins pipeline脚本&#xff0c;最后会演示一下 实验/实操 结果 由于整体内容较多&#xff0c;所以不打算在这里做每一步的详细演示 - 本文仅作自己的实操记录和日后回顾用 要看保姆式教学的可以划走了&…

力扣 LeetCode 701. 二叉搜索树中的插入操作(Day10:二叉树)

解题思路&#xff1a; 全部插入到叶子节点即可 class Solution {public TreeNode insertIntoBST(TreeNode root, int val) {if (root null) {TreeNode node new TreeNode(val);return node;}if (root.val < val) {root.right insertIntoBST(root.right, val);}if (root…

2024年11月22日Github流行趋势

项目名称&#xff1a;twenty 项目维护者&#xff1a;charlesBochet, lucasbordeau, Weiko, FelixMalfait, bosiraphael 项目介绍&#xff1a;正在构建一个由社区驱动的现代Salesforce替代方案。 项目star数&#xff1a;22,938 项目fork数&#xff1a;2,413 项目名称&#xff1…

Qt之QMainWidget相关

QMainWindow 继承于QWidget的子类 自带一个菜单栏,一个工具栏,可以设置状态栏与铆钉部件 菜单栏:QMenuBar 注意:一个窗口最多一个菜单栏 API: 创建 QMenuBar(parent) 获取QMainWindow自带的菜单栏 QMenuBar* menuBar() 添加菜单:QMenu addMenu(QMenu *menu); 菜单添加活动:QAct…