论文链接: Language Models are Unsupervised Multitask Learners
点评: GPT-2采用了与GPT-1类似的架构,将参数规模增加到了15亿,并使用大规模的网页数据集WebText 进行训练。正如GPT-2 的论文所述,它旨在通过无监督语言建模来执行任务,而无需使用标记数据进行显式微调。(无监督的多任务学习器)同时模型为了适应大规模数据和多任务进行了对应修改。
GPT系列:
GPT1 | 预训练+微调, 创新点在于Task-specific input transformations。 |
||
GPT2 | 15亿参数 | 预训练+Prompt+Predict, 创新点在于Zero-shot |
Zero-shot新颖度拉满,但模型性能拉胯 |
GPT3 | 1750亿参数 | 预训练+Prompt+Predict, 创新点在于in-context learning |
开创性提出in-context learning概念,是Prompting祖师爷(ICL)是Prompting范式发展的第一阶段。 |
基于GPT1和BERT的工作,发现GPT1这种上下文生成应用面更广以及BERT使用编码器和大规模数据集获得了更好的实验效果。一个使用了解码器,一个使用了编码器,换做作者是你,你是否还会继续打回去?GPT2的目的就是做这个事情,模型更大,数据更多,效果是否能干掉BERT。
作者收集了一个更大的数据集WebText,百万网页数据,同时将模型从1亿参数(110M)变成了15亿参数(1.5B)但存在一个问题,数据集上去了,效果真的有明显的优势吗?于是作者想到了zero-shot这个路子。
模型结构 (Model Construction)
- 数据: 多任务+大规模数据
- zero shot, 序列的改造使不同任务的输入序列与训练时见到的文本长得一样。
- 模型:在GPT-1上的调整
- 后置层归一化( post-norm )改为前置层归一化( pre-norm )
- 在模型最后一个自注意力层之后,额外增加一个层归一化;
- 调整参数的初始化方式,按残差层个数进行缩放,缩放比例为 1 : sqrt(n)
- 输入序列的最大长度从 512 扩充到 1024;
- 模型层数扩大
一、GPT-2 中 LayerNorm 位置调整的核心原因
GPT-2 将 Layer Normalization(层归一化)从传统的残差连接后(Post-LN)改为残差连接前(Pre-LN),这一调整主要基于以下技术考量:
梯度稳定性优化
深层神经网络中,Post-LN 结构可能导致梯度传播路径过长,容易出现梯度消失或爆炸问题。Pre-LN 结构将归一化置于子层(如注意力或前馈网络)输入前,缩短了梯度传播路径,使反向传播时梯度更稳定23。例如,在 48 层的 GPT-2 中,这一调整显著缓解了深层模型训练的梯度异常现象。训练收敛速度提升
Pre-LN 通过对输入数据的标准化预处理,使得每个子层的输入分布更一致,降低了模型对初始权重的敏感性,从而加速收敛。实验表明,Pre-LN 结构的模型在相同训练步数下损失值下降更快6。模型容量与性能平衡
Post-LN 结构在残差连接后归一化会放大输出方差,尤其在多层叠加时可能破坏残差连接的特性(如恒等映射)。Pre-LN 通过先归一化再处理输入,保持了残差连接的核心优势(即输入与输出的直接叠加),更适应大规模模型的参数优化36。
二、在模型最后一个自注意力层之后,额外增加一个层归一化;
GPT-2 在最后一个自注意力层后增加层归一化(Layer Normalization, LN)主要与其架构调整和训练稳定性优化密切相关,具体原因如下:
输出分布稳定性增强
深层模型中,最后一层自注意力输出的激活值可能因参数累积出现分布偏移。额外添加的 LN 通过对输出的均值和方差进行归一化,使后续前馈层或生成阶段的输入分布更稳定,缓解梯度异常(如梯度爆炸),提升模型收敛效率24。生成阶段的动态控制
语言模型的生成过程具有自回归特性,各时间步的输出需具备可控的数值范围。末层 LN 能约束生成时隐藏状态的动态范围,避免因逐层累积的数值波动导致生成质量下降(如逻辑断裂或重复生成)26。与 Pre-LN 架构的协同优化
GPT-2 采用 Pre-LN(归一化置于残差连接前)取代 GPT-1 的 Post-LN 结构。Pre-LN 虽能加速收敛,但其残差路径可能残留未被归一化的信号。末层 LN 作为补充,可对整体输出的特征分布再做校准,确保模型最终输出的鲁棒性24。
三、为什么 调整参数的初始化方式,按残差层个数进行缩放,缩放比例为 1 : sqrt(n)?
梯度传播平衡
深层模型中,残差路径的叠加会导致梯度在反向传播时随层数指数级放大或衰减。通过缩放参数初始化范围(如权重矩阵初始化为 N(0,1/n)N(0,1/n)),可约束每层输出的梯度幅值,避免梯度爆炸或消失问题,确保反向传播时各层梯度贡献均衡57。激活值方差控制
前向传播过程中,未经缩放的参数初始化会导致每层输出的激活值方差随层数增加而累积。按 1/n1/n 缩放初始化权重,可使残差分支输出的方差与主干输入保持同一量级,维持网络整体的数值稳定性5。
四、GPT-2 扩大上下文窗口与批次大小的技术动因
一、上下文窗口(Context Size)从 512 扩展至 1024 tokens
捕捉更长距离的依赖关系
语言模型的生成质量高度依赖对长距离语义关联的捕捉。将上下文窗口从 512 扩展至 1024 tokens,使模型能够处理更长的历史输入序列,提升对复杂上下文逻辑的理解能力26。例如,在生成段落或对话时,更大的窗口可避免关键信息的截断,增强生成文本的连贯性。适应多样化任务的泛化需求
GPT-2 的设计目标是实现无监督多任务学习,而不同任务(如翻译、问答)对上下文长度的需求差异显著。扩展后的窗口能兼容更广泛的任务类型,减少因输入长度限制导致的任务适配瓶颈6。与模型规模的协同优化
GPT-2 的参数规模显著增大(如 1.5B 版本),更大的上下文窗口可充分利用参数容量,挖掘深层语义模式。实验表明,扩展窗口后,模型在长文本生成任务中的困惑度(Perplexity)降低约 12%2。
二、批次大小(Batch Size)增至 512
训练效率优化
大规模数据并行需要更大的批次以充分利用硬件算力。批次扩大至 512 减少了单步训练的计算冗余,使 GPU/TPU 利用率提升 20%~30%,加速收敛过程24。梯度估计稳定性增强
大批次训练可提供更平滑的梯度信号,降低参数更新方向的方差。对于 GPT-2 这类超深模型(如 48 层),这一改进显著缓解了梯度噪声对优化过程的干扰46。模型泛化能力提升
大批次训练可通过隐式正则化效应抑制过拟合。在 GPT-2 的无监督预训练中,更大的批次使模型在未见任务上的零样本(Zero-shot)性能提升约 8%6。
五、多任务学习
现在的语言模型泛化能力比较差,在一个训练集、一个训练任务上训练出来的参数很难直接用到下一个模型里。因此,目前大多数模型都是Narrow Expert,而不是Competent Generalists。OpenAI希望朝着能够执行许多任务的更通用的系统发展--最终不需要为每个任务手动创建和标记训练数据集。
多任务学习的定义:
多任务学习(Multi-Task Learning, MTL)是一种机器学习方法,它可以通过同时学习多个相关的任务来提高模型的性能和泛化能力。与单任务学习只针对单个任务进行模型训练不同,多任务学习通过共享模型的部分参数来同时学习多个任务,从而可以更有效地利用数据,提高模型的预测能力和效率。
如何做到多任务学习呢:
把所有的任务都归结为上下文的问题回答。具体的,应该满足如下的条件:
1. 必须对所有任务一视同仁,也就是喂给模型的数据不能包含这条数据具体是哪个任务,不能告诉模型这条数据是要做NMT,另一条数据要做情感分类。
2. 模型也不能包含针对不同任务的特殊模块。给模型输入一段词序列,模型必须学会自己辨别这段词序列要求的不同的任务类型,并且进行内部切换,执行不同的操作。
3. 此外,模型还应具备执行这10个任务之外的任务的能力,即zero shot learning。
Multitask Question Answering Network, MQAN这篇文章中提出了一个新的在没有任何特定任务模块或参数的情况下联合学习decaNLP的所有任务。把各种下游子任务都转换为QA任务,并且让模型通过我们告诉他的自然语言(Prompt)去自动执行不同的操作,从而完成任务的想法也是GPT-2的关键。这就是为什么提出GPT-2的论文的标题叫:Language Models are Unsupervised Multitask Learners
Zero-shot的含义:
我们用预训练模型做下游任务时,不需要任何额外的标注信息,也不去改模型参数。
GPT1过度到GPT2的zero-shot:
GPT1中,我们的模型在自然语言上进行预训练,到了给下游任务做微调的时候,我们是引入了很多模型之前从来没有见过的特殊符号,这个符号是针对具体的任务专门设计的,即给GPT的输入进行了特殊的构造,加入了开始符、结束符、分割符。这些符号,模型要在微调的过程中慢慢认识。
如果想要做Zero-short Learning,即不做任何额外的下游任务训练的话,就没办法让模型去临时学习这些针对特定任务的构造了。因此,我们在构造下游任务的输入的时候,就不能引入特殊的符号,而是要让整个下游任务的输入和之前在预训练的时候看到的文本形式一样。即要使得输入的形式应该更像自然语言。
既然输入的形式也要更像自然语言,那么就应该让模型通过我们的自然语言,去知道现在要去执行什么任务。
要如何做:实现Zero-shot learning的前提就是,我们得能够做到不需要针对下游的任务,给模型的输入结构做专门的设计;而是只需要给模型指示,也就是提示词(Prompt)就好了。
为什么prompt能够实现下游任务的预测:
Our speculation is that a language model with sufficient capacity will begin to learn to infer and perform the tasks demonstrated in natural language sequences in order to better predict them, regardless of their method of procurement. ——OpenAI
当数据量足够大、模型能力足够强的时候,语言模型会学会推测并执行用自然语言提出的任务,因为这样可以更好的实现下一词预测。(ICL的雏形)
六、为什么prompt可以实现zero shot learning?
自监督预训练的通用表征学习
大模型通过海量无标注文本的预训练(如 GPT 系列的因果语言建模任务),学习到语言的多层次抽象模式,包括语义关联、逻辑推理和领域知识46。这种通用表征能力使模型在面对新任务时,无需显式调整参数即可通过自然语言指令(Prompt)激活相关知识。任务形式与预训练目标的同构性
Zero-Shot 依赖将下游任务“翻译”为预训练任务的形式。例如,分类任务可构造为填空题(如“情感分析:这部电影很棒。总体评价是 [MASK]。”),直接复用模型在 MLM(掩码预测)任务中的能力15。这种对齐无需修改网络结构,仅需设计合适的 Prompt。
结论: conclusion
GPT-2的最大贡献是验证了通过海量数据和大量参数训练出来的词向量模型有迁移到其它类别任务中而不需要额外的训练,即zero-shot learning的能力。但是效果其实很一般。
GPT-2表明随着模型容量和数据量的增大,其潜能还有进一步开发的空间,基于这个思想,促使了GPT3的出现。
参考文献
详解GPT论文: https://zhuanlan.zhihu.com/p/680022511
GPT2 代码: GitHub - Morizeyao/GPT2-Chinese: Chinese version of GPT2 training code, using BERT tokenizer.
https://github.com/yangjianxin1/GPT2-chitchat?tab=readme-ov-file