GPT-1原理:开创性的"预训练+微调"范式
GPT-1原理:开创性的"预训练+微调"范式
GPT-1作为OpenAI提出的开创性模型,首次将"预训练+微调"的训练范式与Transformer架构相结合,为自然语言处理领域带来了革命性的突破。本文将深入解析GPT-1的模型结构、训练方法及其创新之处,帮助读者全面理解这一里程碑式的工作。
前言
GPT-1(Generative Pre-trained Transformer 1)是OpenAI在2018年提出的重要模型,虽然其发布时间比Google的BERT早几个月,但真正开启了基于Transformer的预训练+微调范式。这种范式不仅被广泛应用于各种自然语言处理任务,还为后续的GPT-2、GPT-3等模型奠定了基础。
提出动机
在自然语言理解(NLU)任务中,如文本蕴含、问题回答、语义相似度评估和文档分类等,传统的AI算法通常采用有监督学习的方式。具体步骤包括:
- 构建标注数据集
- 构建深度学习或机器学习模型
- 训练模型
然而,这种传统方法存在以下局限:
- 需要大量人工标注数据
- 模型只能完成单一任务
- 需要满足数据独立同分布的假设
为了解决这些问题,研究者们开始探索能够在少样本情况下表现良好的模型。
模型猜想
研究者提出了一个创新性的假设:
- 在大量未标注且跨领域的数据上预训练一个模型,使其学习到通用知识和基础能力(如词嵌入表示)
- 在预训练模型的基础上,使用少量特定领域的标注数据进行微调,以完成特定任务
这种假设得到了词向量表示(如Word2Vec)的验证:
- Word2Vec通过无监督学习获得词嵌入表示
- 这些词嵌入可以作为其他模型(如RNN、LSTM)的输入特征
基于这些观察,研究者提出了基于Transformer的两阶段训练范式:预训练+微调。
模型提出
研究者选择了Transformer的解码器架构作为GPT-1的基础模型,主要基于以下考虑:
- LSTM在处理长文本时存在局限性
- Transformer的并行计算能力更强
模型结构
GPT-1的结构基于Transformer的解码器,包含12个解码器层。与标准的Transformer相比,GPT-1在以下几个方面进行了优化:
- 位置编码:使用可学习的位置嵌入,而不是固定的正弦和余弦函数
- LayerNorm:将LayerNorm操作提前到多头注意力机制之前
- 注意力机制:只保留Masked Multi-Head Attention,去除普通的Multi-Head Attention
- 激活函数:使用GELU(高斯误差线性单元)代替ReLU
模型参数
模块 | 参数 |
---|---|
解码器块 | 12层 |
多头注意力 | 12头 |
词嵌入维度 | 768维 |
前馈神经网络隐藏层维度 | 3072维 |
模型预训练
训练目标
在预训练阶段,模型的目标是学习词的通用表示。具体来说,模型需要预测下一个词的概率,即:
特征(feature) | 标签(label) |
---|---|
你 | 是 |
你是 | 一 |
你是一 | 个 |
你是一个 | 打 |
你是一个打 | 不 |
你是一个打不 | 死 |
... | ... |
训练方式
模型采用以下策略处理输入数据:
- 文本编码:按词级进行编码
- 最长文本输入:限制为512个token
- batch大小:64个文本序列
- 优化器:Adam
- 学习率:初始为2.5x10^-4,前2000步保持不变,之后使用余弦退火策略逐渐减小至0
- Dropout:丢弃概率为0.1
- 训练轮数:100个epoch
- 正则化:使用L2正则化
预训练数据集
预训练使用了两个数据集:
- BooksCorpus:包含大量书籍数据
- 1B Word Benchmark:包含连续文本内容
模型微调
在微调阶段,模型需要在少量特定任务的标注数据上进行训练,以完成具体的自然语言理解任务。为了统一处理不同类型的NLI任务,GPT-1定义了统一的输入范式:
- 单文本输入:以
开头,结尾 - 多文本输入:使用$符号分隔多个文本片段
模型输入范式
模型训练
针对不同类型的NLI任务,微调过程有所不同:
- 单句子分类任务(如情感分类)
- 数据准备:在句子前后添加
和 - 模型修改:添加二分类头
- 训练:计算loss并反向传播更新参数
- 多句子分类任务(如文本蕴含)
- 数据准备:使用$分隔多个文本片段
- 模型修改:添加二分类头
- 训练:计算loss并反向传播更新参数
- 相似度计算任务
- 数据准备:使用$分隔两个文本片段
- 模型修改:添加二分类头
- 训练:计算loss并反向传播更新参数
- 特殊处理:将两个文本片段分别放在前面进行两次预测,然后将结果相加
- 多项选择任务
- 数据准备:将问题和每个选项组合成多组数据
- 模型修改:添加二分类头
- 训练:计算loss并反向传播更新参数
- 特殊处理:使用softmax对多个二分类结果进行归一化
微调建议
官方论文给出了以下微调参数建议:
- 学习率:6.25 x 10^-5
- batch大小:32
- 训练轮数:3个epoch
微调疑问点
在微调阶段,损失函数(loss)的计算方式存在一些争议:
- 总损失L3 = L2(任务特定损失)+ L1(特殊符号的生成损失)
- L1只计算
、$、等特殊符号的损失
这种设计的目的是保持模型对特殊符号的敏感性,但实际应用中通常只使用L2进行训练。
实验结果分析
实验结果表明:
- 增加Transformer解码器的层数可以提升NLI任务的表现
- 预训练模型本身就具有一定的零样本能力,可以在不进行微调的情况下解决某些NLI任务
这些发现对后续的GPT-2和GPT-3的发展产生了重要影响。
GPT-1缺陷
尽管GPT-1取得了重要突破,但仍存在一些局限:
- 微调阶段需要根据不同任务添加特定的输出层,这与OpenAI追求的"无需改变模型结构就能解决多种任务"的目标有所偏离
- 采用词级输入方式,对于未见过的单词处理能力较弱
- 后续的minGPT实现采用了字符级输入,虽然解决了词级输入的问题,但计算量显著增加
这些局限性推动了后续模型(如GPT-2、GPT-3)在模型结构和训练策略上的进一步优化。