目录
GPT-2
GPT-3
GPT3.5
ChatGPT
LLAMA
Lora
deepspeed
GPT-1用的是无监督预训练+有监督微调。
GPT-2用的是纯无监督预训练。
GPT-3沿用了GPT-2的纯无监督预训练,但是数据大了好几个量级。
InstructGPT在GPT-3上用强化学习做微调,内核模型为PPO-ptx,下面的论文会详细分析。ChatGPT沿用了InstructGPT,但是数据大了好几个量级。
Generative Pre-trained Transformer(GPT)系列是由OpenAI提出的非常强大的预训练语言模型,这一系列的模型可以在非常复杂的NLP任务中取得非常惊艳的效果,例如文章生成,代码生成,机器翻译,Q&A等,而完成这些任务并不需要有监督学习进行模型微调。而对于一个新的任务,GPT仅仅需要非常少的数据便可以理解这个任务的需求并达到接近或者超过state-of-the-art的方法。
模型 |
发布时间 |
参数量 |
预训练数据量 |
GPT |
2018 年 6 月 |
1.17 亿 |
约 5GB |
GPT-2 |
2019 年 2 月 |
15 亿 |
40GB |
GPT-3 |
2020 年 5 月 |
1,750 亿 |
45TB |
BERT |
GPT |
|
transformer关系 |
Transformer 编码器 |
Transformer 解码器 |
结构 |
原论文提供了两种 BERT 结构:BERT-Base 和 BERT-Large。其中 BERT-Base 由 12 层双向 Transformer 编码器模块构成,有 768 的隐藏大小和 12 个自注意头。BERT-Large 包含 24 层双向 Transformer 编码器模块,隐藏大小为 1024,有 16 个自注意头。 |
原论文提供了一种预训练的架构,其模块仅有 12 层的 Transformer 解码器。每个模块都有 768 的隐藏大小和 12 个自注意头。 |
训练方式 |
其权重是在 BooksCorpus 和英语维基百科上训练的 |
权重是在 BooksCorpus 上训练的。这使其可生成 p(wi |history),一次一个词。 |
掩码 |
BERT 是双向的,因为它试图根据上下文填入单个词 |
GPT 使用了掩码式自注意头。使得模型在对某个词计算自注意力机制的时候无法看到其后面的词,只能抽取前面词的信息 |
位置编码 |
Transformer使用固定的位置编码,而BERT和GPT均使用可训练的位置编码 |
作者对position embedding矩阵进行随机初始化,让模型自己学习,而不是采用正弦余弦函数进行计算。(原Transformer用的三角函数) |
只是对每个时间步,都只考虑左侧窗口大小的上下文信息。使用了Masked Self-Attention,所以每个位置的词都不会“看见”后面的词,也就是预测的时候是看不见“答案”的,即避免了see themselves 的问题,保证了模型的合理性 |
gpt-1 |
gpt-2 |
gpt-3 |
侧重于在NLP任务上上做pre-train+fine-tuning。并且做了部分zero-shot的实验,是后续GPT-2的zero-shot的基础 sft阶段对不同的任务引入了特定的start、delim、extact标志,以此区分不同的任务 |
增加训练的batch size(512)和context size(from 512 to 1024 tokens) 使用了更多的训练数据。侧重zero-shot 不再用GPT-1中显示设计的start、extract等标志,而是使用提示的方式。英语翻译法语可以写为(translate to french, english text, french text);在阅读理解任务中可以写为成(answer the question, document, question, answer)的形式。 |
更侧重few-shot 针对不同的任务使用了不同的prompt 文中提到了三种shot方式与fine-tune的对比:fine-tune存在梯度的更新,当模型size很大的时候,fine-tune的成本也会非常高;而三种shot的方式则无需梯度更新,其利用的是pre-train过程中,模型本身挖掘到的信息,尽可能将测试和pre-train的场景对齐。 |
基于BooksCorpus dataset,包含7000本未发表的书。 |
数据集为WebText,未采用Common Crawl(虽然量大,但质量低。) |
重新考虑Common Crawl(过滤+去重后的),同时还包括GPT-2的WebText数据集。虽然Common Crawl比WebText2的数据量大20多倍,但是在训练样本中的占比才不到3倍,这与数据质量是相关的。 |
改进:
1.GPT-1采用的概率条件模型为 p(output|input)。GPT-2旨在使用相同的无监督模型学习多个任务,需要将学习目标修改为p(output|input; task)
2.GPT-2采用了Zero Shot,即在下游任务中不进行任何训练或微调。下游不提供任何示例,模型根据给定的指令理解任务。
GPT-2的目标旨在训练一个泛化能力更强的词向量模型,它并没有对GPT-1的网络进行过多的结构的创新与设计,只是使用了更多的网络参数和更大的数据集。还提出了一个新的更难的任务,zero-shot,零少样本学习,即将预训练好的模型,直接接诸多的下游任务,在多个任务下都可以取得很好的效果。
GPT-2的结构与GPT-1相比,每个block内的结构有略微的变化:pre-norm和参数初始化等。作者训了四个不同size的模型,其中117M模型与GPT-1相同。
GPT3的参数量进一步的增大,并且使用few-shot learning的方法,取得了很好的效果。
GPT-3的结构细节与GPT-2相同,包括pre-norm和参数初始化方式,但参数规模要大得多。此外GPT-3引入Sparse Transformers以减小attention的计算复杂度。原文里训练了八种规模的模型,其中最大参数量175b的模型称为GPT-3,具体的模型超参数如下图所示。
和GPT2模型结构相同,GPT3采用Transformer的解码器。另外,在模型结构中的注意力层,GPT3采用Sparse Transformer中的方案,相对于原始Transformer需要对一个序列中的任意两个词元都进行注意力计算,时间复杂度为 O(n2)
,Sparse Transformer通过稀疏矩阵仅为每个词元计算和其他部分词元的注意力,时间复杂度为 n(nlogn)
,因此可以减少注意力计算量。
instructGPT分为如下三大步:
SFT:生成模型GPT的有监督精调 (supervised fine-tuning)RM:奖励模型的训练(reward model training)PPO:近端策略优化模型( reinforcement learning via proximal policy optimization)
用 Code 微调过的就得到了 CodeX 模型,CodeX 和 InstructGPT 融合起来得到的模型
整体的过程是这样的,在原来 GPT 3.0 的基础上用 Code 微调过的就得到了 CodeX 模型,然后用 Instruction tuning + RLHF 微调过的就得到了 InstructGPT, 然后后面又把 InstructGPT 和 CodeX 两个的训练数据和方法融合起来得到了 Text-davinci-002, 然后 ChatGPT 就是基于这个模型用更多的 Dialog 相关的数据又继续微调得到的
1、RMS Pre-Norm(从GPT-3启发到Pre-normalization)
将只在输出层normalization改成transformer里面每一层
2、SwiGLU激活函数 (从PaLM启发到)
LLaMA采用SwiGLU替换了原有的ReLU。
3、RoPE旋转位置编码(从GPTNeo启发到)
RoPE(Rotary Position Embedding)旋转位置编码,是苏剑林老师提出的一种旋转位置编码方法,其思想是采用绝对位置编码的形式,实现相对位置编码。
低秩自适应的参数高效LLM微调(LoRA)技术拆解 - 知乎
论文:LoRA: Low-Rank Adaptation of Large Language Models
简单地说,参数高效的低秩自适应微调技术是一种用于大模型权重矩阵的隐式低秩转换技术。
总体思想和概念与主成分分析(PCA)和奇异向量分解(SVD)有关,其中使用低维表示来近似高维矩阵或数据集。换言之,试图在原始特征空间(或矩阵)中找到少量维度的(线性)组合,该组合可以捕获数据集中的大部分信息。
LoRA作者指出,预训练的大型语言模型在适应新任务时具有较低的“内在维度”,数据可以由低维度空间有效地表示或近似,同时保留其大部分基本信息或结构。换句话说,这意味着可以将适应任务的新权重矩阵分解为低维(较小)矩阵,而不会丢失太多重要信息。
然后,当我们有ΔW时,可以更新原始权重如下: W'=W+ΔW
h=Wx+ΔWx
r在上图中,是一个超参数,可以使用它来指定用于自适应的低秩矩阵的秩
如果引入新的权重矩阵,这个参数如何高效?新矩阵 WA 和 WB可以非常小。例如,假设A=100且B=500,则 ΔW 的大小为100×500=50000
将其分解为两个较小的矩阵 WA,WB 只有5×100+5×500=3000的参数量
为了用具体的数字来说明这一点,一个完整的7B LLaMA检查点需要23 GB的存储容量,而如果选择r=8的秩,则LoRA权重可以减小到8 MB
发布三篇ZeRO相关的论文,提出了去除冗余参数、引入CPU和内存、引入NVMe等方法
ZeRO
ZeRO将模型训练阶段,每张卡中显存内容分为两类:
1.模型状态(model states): 模型参数(fp16)、模型梯度(fp16)和Adam状态(fp32的模型参数备份,fp32的momentum和fp32的variance)。假设模型参数量 Φ
,则共需要 2Φ+2Φ+(4Φ+4Φ+4Φ)=4Φ+12Φ=16Φ
字节存储,可以看到,Adam状态占比 75%
2.剩余状态(residual states): 除了模型状态之外的显存占用,包括激活值(activation)、各种临时缓冲区(buffer)以及无法使用的显存碎片(fragmentation)。
来看一个例子,GPT-2含有1.5B个参数,如果用fp16格式,只需要3GB显存,但是模型状态实际上需要耗费24GB!相比之下,激活值可以用activation checkpointing来大大减少,所以模型状态就成了头号显存杀手,它也是ZeRO的重点优化对象。而其中Adam状态又是第一个要被优化的。
ZeRO-Offload
ZeRO-Offload则将训练阶段的某些模型状态下放(offload)到内存以及CPU计算。
fp16
fp32/fp16 绝大多数硬件都支持,所以可以用混合精度训练提高吞吐;但 bf16/tf32 只有新的硬件才支持,V100/昇腾910等不支持
bf16 具有和 fp32 相同的 range,但精度(也就是两个最小单位之间的间隔)降低
bf16/fp32 进行混合精度训练,可以减少溢出几率
对于大型 transformer,bf16 损失的精度被证明不怎么影响收敛