下部分详见:
基础模型:
下表是在上述基础模型上进行指令微调的大模型:
模型 | 发布日期 |
---|---|
GPT | 2018-11-14 |
GPT-2 | 2019-11-27 |
GPT-3 | 2020-6-11 |
InstructGPT | 2022-3-4 |
ChatGPT | 2022-11-30 |
GPT-4 | 2023-3-14 |
ChatGPT Plugin | 2023-5-12 |
GPT是自回归模型(auto-regression),使用 Transformer 的 Decoder 模块构建。原始的Transformer Decoder 比Encoder 多了一个encoder-decoder-attention层(第二个自注意力层,k和v来自encoder层最后的输出memory),使得它可以关注来自 Encoder 的信息。在GPT中,使用的decoder去掉了这一层。
自回归:生每个 token 之后,将这个 token 添加到输入的序列中,形成一个新序列。然后这个新序列成为模型在下一个时间步的输入。
Mask 操作是在 Self-Attention 进行 Softmax 之前进行的,具体做法是将要 Mask 的位置用一个无穷小的数替换 -inf,然后再 Softmax,如下图所示。
下图是 GPT 整体模型图,其中包含了 12 个 Decoder:
GPT提出来“生成式预训练(无监督)+判别式任务精调(有监督)”的范式来处理NLP任务。
GPT-2(2019-2)
和GPT-3(2020-6)
的区别: - GPT-3使用了更深的网络层数和更宽的Transformer网络结构,模型更大,参数更多,表达能力和语言理解能力更强; - GPT-3在预训练阶段使用了更大规模的数据集,并采用了更多样化的预训练任务 - GPT-3的微调阶段采用了zero-shot学习和few-shot的方法,使得GPT-3具备更强的泛化能力和迁移学习能力。
《李沐论文精度系列之九:InstructGPT》、bilibili视频《InstructGPT 论文精读》
语言模型扩大并不能代表它们会更好地按照用户的意图进行工作,大语言模型很可能会生成一些不真实的、有害的或者是没有帮助的答案。换句话说,这些模型和用户的意图并不一致(not aligned with their users)。由此OpenAI提出了“align”的概念,即希望模型的输出与人类意图“对齐”,符合人类真实偏好。
InstructGPT提出了语言模型的三个目标: - helpful——帮助用户解决问题 - honest——不能伪造信息或误导用户 - harmless——不会令人反感,也不会对他人或社会有害
InstructGPT使用来自人类反馈的强化学习(利用人类的偏好作为奖励信号,让模型仿照人来生成答案),对GPT-3进行微调,实现以上目标。具体实现步骤如下:
1. 收集示范数据,进行有监督微调SFT
。 - 标注数据:根据prompts(提示,这里就是写的各种各样的问题),人类会撰写一系列demonstrations(演示)作为模型的期望输出(主要是英文); - 模型微调:将prompts和人类标注的答案拼在一起,作为人工标注的数据集,然后使用这部分数据集对预训练的GPT-3进行监督微调,得到第一个模型SFT
(supervised fine-tuning,有监督微调) - 因为问题和答案是拼在一起的,所以在 GPT 眼中都是一样的,都是给定一段话然后预测下一个词,所以在微调上跟之前的在别的地方做微调或者是做预训练没有任何区别。 2. 收集比较数据,训练奖励模型RM
。 - 生成式标注是很贵的一件事,所以第二步是进行排序式/判别式标注。用上一步得到的SFT
模型生成各种问题的答案,标注者(labelers)会对这些输出进行比较和排序(由好到坏,比如下图D>C>A=B)。 - 基于这个数据集,用强化学习训练一个RM
(reward model)。训练好了之后这个RM模型就可以对生成的答案进行打分,且打出的分数能够满足人工排序的关系。 3. 使用强化学习的机制,优化SFT
模型,得到最终的RL
模型(InstructGPT)。 将SFT
模型的输出输入RM
进行打分,通过强化学习来优化SFT
模型的参数,详见本文4.3节。
步骤2和步骤3可以连续迭代。第二步可以使得在同样的标注成本下得到更多的数据,模型的性能会更好一些,最终得到的模型就是InstructGPT。
语言模型通过预测下一个词的方式进行训练,其目标函数是最大化给定语言序列的条件概率,而不是“有帮助且安全地遵循用户的指示”,所以当前的语言模型训练的目标函数有问题。这部分在第三步RL
模型(InstructGPT)中体现。简单来说就是新的损失函数包括以下几个部分:
RL
产生的输出$y$和原始的SFT
模型输出的$y$会逐渐不一样,所以作者在loss里加入了一个KL散度(评估两个概率分布的差异),希望RL
在SFT
模型的基础上优化一些就行,但是不要偏太远,即相当于加入了一个正则项。ChatGPT
和InstructGPT
在模型结构,训练方式上都完全一致,即都使用了指示学习(Instruction Learning)和人工反馈的强化学习(RLHF,Reinforcement Learning from Human Feedback)来指导模型的训练。区别是InstructGPT
是在GPT3
上微调,ChatGPT
是在GPT3.5
上微调的。
为了能够更加灵活的扩展 ChatGPT 的现有功能,OpenAI 正式上线了以安全为核心的 ChatGPT plugin
,在保障数据安全性的前提下,让 ChatGPT 功能再度提升一整个数量级!plugin(插件)可以允许 ChatGPT 执行以下操作:
ChatGPT plugin
,其实就是类似Toolformer
技术的应用,使得模型可以连接成百上千个API,这样大语言模型只是一个交互的工具,真正完成任务的还是之前的各种工具。这样不仅准确度可以提升,而且3月24ChatGPT plugin
开通联网后,还可以更新自己的知识库,开启了无限可能。
比如用计算器进行计算肯定是可以算对的,而不需要像之前一样进行推理了。
《李沐论文精度系列之十:GPT-4》
GPT-4
是 OpenAI 继 ChatGPT 之后发布的一个大规模的多模态模型,之前的 GPT 系列模型都是只支持纯文本输入输出的语言模型,而 GPT-4 可以接受图像和文本作为输入,并产生文本输出。GPT-4
仍然是基于 Transformer 的自回归结构的预训练模型。OpenAI 的博客中表示在随意的对话中,GPT-3.5 和 GPT-4 之间的区别可能很微妙,当任务的复杂性达到足够的阈值时,差异就会出现,即 GPT-4 比 GPT-3.5 更可靠、更有创意,并且能够处理更细微的指令。
虽然在许多现实场景中的能力不如人类,但 GPT-4
在各种专业和学术基准测试中表现出人类水平的表现,包括通过模拟律师考试,得分在应试者的前 10% 左右。和 ChatGPT RLHF 的方法类似,alignment(对齐)训练过程可以提高模型事实性和对期望行为遵循度的表现,具有强大的意图理解能力,并且对 GPT-4 的安全性问题做了很大的优化和提升。GPT-4
的基础模型其实于 2022 年 8 月就已完成训练。OpenAI 对于基础理解和推理能力越来越强的 LLM 采取了更为谨慎的态度,花 6 个月时间重点针对 Alignment、安全性和事实性等问题进行大量测试和补丁。2023 年 3 月 14 日,OpenAI 发布 GPT-4
及相关文章。文章中几乎没有披露任何技术细节。同时当前公开的 GPT-4
API 是限制了 few-shot 能力的版本,并没有将完整能力的基础模型开放给公众(这个版本会维护到6月14号)。
LaMDA
是谷歌在2021年开发者大会上公布的,专用于对话的大语言模型。模型基于Transformer架构,并在具有1.56T单词的公开对话数据和其他网页文档上预训练,最终尺寸从2B到137B。
论文中提出三个指导模型更好训练的指标,并概括了如何在这三个方面取得进展: - 质量: - 合理性/Sensibleness:生成在对话上下文中有意义的响应 - 特异性/Specificity:通过判断系统的响应是否特定于前面的对话上下文来衡量的,而不是适用于大多数上下文的通用回应; - 趣味性/Interestingness,SSI):衡量模型是否产生了富有洞察力、出乎意料或机智的回应,因此更有可能创造更好的对话。 - 安全性: - 根基性,Groundedness :生成的响应中包含的声明能够被参考和与已知来源进行核实的程度。当前这一代语言模型通常会生成看似合理但实际上与已知外部事实相矛盾的陈述。
在定义了对话模型训练的指导指标之后,LaMDA 讲过预训练与微调两个阶段的训练。 - 预训练:从公共对话数据和其他公共网页文档中收集并创建了一个具有 1.56T 单词的数据集,是用于训练以往对话模型的单词量的近 40 倍 - 微调阶段做两个工作: - LaMDA 生成器:执行混合生成任务,以生成对给定上下文的自然语言响应(模式是预测两个角色来回对话的对话数据集中下一个token) - LaMDA 分类器:预测LaMDA 生成器生成的响应的安全与质量(SSI)分数,安全分数低的候选响应首先被过滤掉,剩下的候选响应根据 SSI 分数重新排名,并选择分数最高的作为最终响应。
谷歌使用 LaMDA 分类器进一步过滤掉用于生成任务的训练数据,以增加高质量候选响应的密度
人们能够使用工具并参考已建立的知识库来检测事实,但是很多语言模型仅利用内部模型参数来获取知识。谷歌通过与人的对话数据集进行微调,让LaMDA模型能够更好地利用外部知识来提供更可靠的回应。
具体来说,为了提高LaMDA模型原始回应的可靠性,谷歌采集了人与LaMDA之间的对话数据集。这些对话数据集在适当的情况下使用了搜索查询和搜索结果进行注释。谷歌通过对这个数据集进行微调,让LaMDA模型的生成器和分类器能够学习在与用户交互时如何调用外部信息检索系统,以增强回应的可靠性。虽然这项工作仍处于早期阶段,但谷歌已经看到了一些有希望的结果。
谷歌对预训练模型(PT)、微调模型(LaMDA)、人类评估者在多轮双作者对话上的响应进行评估,指标是质量、安全性和根基性,结果如下:
- 质量:LaMDA 在每个维度和所有模型大小情况下都显著优于预训练模型,合理性、特异性和趣味性等质量度量通常会随模型参数量提升; - 安全性:可以通过微调提升,但是无法仅从模型缩放中得到收益; - 根基性:随着模型大小的增加,根基性也提升,这或许是因为更大的模型具备更大的记住不常见知识的能力
微调使模型可以访问外部知识源并有效地将记住知识的负载转移到外部知识源。微调还可以缩小与人类水平的质量差距,尽管该模型在安全性和根基性方面的性能依然低于人类。
Bard 是谷歌基于 LaMDA
研制的对标 ChatGPT 的对话语言模型,目前应该只支持英文对话,限美国和英国用户预约访问。
GLM
:一种基于Transformer架构进行改进的通用预训练框架,GLM将不同任务的预训练目标统一为自回归填空任务(Autoregressive Blank Infilling),使得模型在自然语言理解和文本生成方面性能都有所改善。GLM-130B
:于2022年8月由清华智谱AI开源放出。该大语言模型基于之前提出的GLM(General Language Model),在Norm处理、激活函数、Mask机制等方面进行了调整,目的是训练出开源开放的高精度千亿中英双语稠密模型,能够让更多研发者用上千亿模型。ChatGLM
: 基于GLM-130B
,引入面向对话的用户反馈,进行指令微调后得到的对话机器人。ChatGLM
解决了大基座模型在复杂问题、动态知识、人类对齐场景的不足。ChatGLM
于2023年3月开启申请内测,目前暂停了公开申请。ChatGLM-6B
:于2023年3月开源。在进行ChatGLM千亿模型内测的同时,清华团队也开放出了同样技术小参数量的版本,方便研发者们进行学习和开发(非商用)。NLP任务分为NLU(文本分类、分词、句法分析、信息抽取等)、有条件生成任务(seq-seq,如翻译任务、QA)、无条件生成任务(用预训练模型直接生成内容)三大类。基础的预训练模型也分为三种: | 预训练模式 | 代表模型 | 说明 | |------------|----------|------------------------------------------------------------------------------------------------| | 自编码 | BERT | 双向的transformer作为编码器,在语言理解相关的文本表示效果很好。缺点是不能直接用于文本生成。 | | 自回归 | GPT | 从左往右学习的模型,在长文本的生成能力很强。缺点是单向的注意力机制在NLU任务中,不能完全捕捉token的内在联系。| | 编码解码 | T5 | 编码器使用双向注意力,解码器使用单向注意力,并且有交叉注意力连接两者。在有条件生成任务中表现良好(文本摘要,回答生成)。 |
所以用一张表格简单总结就是:
注:✅表示擅长,x表示无法直接应用,— 表示可以做
目前这些训练前框架都不足以在所有NLP中具有竞争力任务。以往的工作(T5)试图通过多任务学习统一不同的框架。然而,由于自编码和自回归的目标性质不同,简单的统一不能完全继承这两个框架的优点。
GLM 将 NLU 任务制定为包含任务描述的完形填空问题,并通过自回归生成来回答
GLM通过优化自回归空白填充目标进行训练。给定输入文本x =[x 1 ,··· ,x n ]
,对多个文本跨度spans {s 1 ,··· ,s m }
进行采样,然后将这些span进行mask(用[mask]标记替换),形成损坏的文本xcorrupt
。span的长度服从泊松分布(λ=3),与BART一样,重复采样,直到15%的token被mask(根据经验,15% 的比率对于下游 NLU 任务的良好性能至关重要)。
下面举例说明。对于input=[x1,x2,x3,x4,x5,x6],假设mask 掉 [x3] 和 [x5,x6]。然后输入x包括两部分: - part A:损坏的文本xcorrupt
,例子中是[x1,x2,mask,x4,mask]
- part B :mask掉的span部分,例子中是 [x5,x6],[x3]
。为了完全捕捉不同跨度之间的相互依赖关系,会随机排列跨度的顺序,类似于置换语言模型XLNet
。
预训练的目标是:通过自回归方式从损坏的文本xcorrupt
中预测跨度span
中被mask的部分,即从part A预测part B。下图显示了mask矩阵,可以看出: - Part A部分采用双向注意力,可以关注它们自己(蓝框)前后的信息,但不能关注 B; - Part B采用单向注意力,可以关注 A 部分及 B 部分中的前文。
为了启用自回归生成,每个span都自动填充了特殊标记 [S] 和 [E] ,表示预测从start到end跨度的部分。通过这种方式,GLM在统一模型中自动学习双向编码器(Part A)和单向解码器(Part B)。
[M] := [MASK], [S] := [START], [E] := [END]
如上图所示,Part A与PartB拼接成一个sequence,每个token都用两个位置编码 ids( two positional ids): - positional id1:表示损坏的文本xcorrupt中的位置,PartB以span被mask的位置表示 - positional id2:表示跨度内的位置,所以Part A统一以0表示。PartB中的token,以从开始到此位置的span长度表示。
最终两个位置编码都会加入到输入token 的embedding向量中。
前面的介绍中,span都比较短,适用于NLU任务。然而,我们希望模型能同时处理NLU任务和文本生成任务是,所以我们设置了第二个预训练任务——长文本生成,分两个级别:
这两个级别的生成任务和NLU任务相同,唯一的区别在于跨度数量和跨度长度。在实际使用中,可以根据不同的任务需要,设置不同mask方式的比例。例如,如果希望模型有更强的生成能力,可以把文档级别的gMASK的比例设置地比较高。在GLM-130B
中,采用了70%文档级别的gMASK和30%单词级别的MASK。
GLM 使用单个Transformer ,并对架构进行了多项修改: 1. 采用Sandwich-LN
。LayerNorm会影响训练的稳定性,目前认为认为稳定性上: Sandwich-LN > Pre-LN > Post-LN(原始的BERT) 2. 使用单个线性层来进行输出Token预测 3. ReLU
激活函数替换为GELU
对于下游NLU任务,我们通常会在模型之上添加线性分类器,以前层的输出作为输入来预测正确的标签,但这会导致预训练和微调之间的不一致。 GLM微调时,分类任务转换为完形填空,类似PET。如上图示例,原本的“positive”和“negative”二分类任务,转换为预测[mask]的任务(映射到单词“good”和“bad”)。
其实这部分就是Prompt Tuning
,有三种主要算法:PET、P-Tuning和EFL。有兴趣的可以参考《PaddleNLP系列课程一:Taskflow、小样本学习、FasterTransformer》第二章。
GLMBase
得分比BERT Base 高 4.6%,GLMLarge
得分比BERT Large 高 5.0%。3. 有条件生成和无条件生成
其它结果请看论文。
GLM是一种用于自然语言理解和生成的通用预训练框架。论文展示了NLU任务可以被形式化为条件生成任务,因此可以由自回归模型解决。GLM将不同任务的预训练目标统一为自回归空白填充,具有混合的注意力掩码和新颖的二维位置编码。我们的实验证明GLM在NLU任务中优于先前的方法,并且可以有效地共享参数以用于不同的任务。
GPT-3
是一款强大的语言模型,但由于未公开,存在技术瓶颈。目前的语言模型规模庞大,训练需要数百张A100以上的显卡,非常困难。GLM-130B
是2022年8月由清华AI向研究界和工业界开放的拥有1300亿参数的中英双语稠密模型。本文介绍了GLM-130B的训练过程,包括设计选择、高效稳定的训练策略和工程努力。
在广泛的英语测试中,GLM-130B
的性能明显优于GPT-175B
,但在OPT-175B和BLOOM-176B上并未观察到性能优势。在相关测试中,GLM-130B也始终明显优于最大的中文模型ERNIE TITAN 3.0 260B
。最后,利用GLM-130B独特的缩放特性,实现了INT4量化使其成为100B缩放模型中的先驱,可进行快速推理(小型多任务模型成为一种趋势)。
2022年11月,在斯坦福大学大模型中心对全球30个主流大模型的评测报告中,GLM-130B 在准确性和恶意性指标上与 GPT-3 175B (davinci) 接近或持平,鲁棒性和校准误差在所有千亿规模的基座大模型(作为公平对比,只对比无指令提示微调模型)中表现不错(下图)。
DeepNorm:Deepnet: Scaling transformers to 1,000 layers
训练不稳定性是训练LLMs的一个主要挑战,适当选择LNs有助于稳定LLM的训练。作者发现GLM的训非常不稳定,于是使用了Deep Layer Norm
机制,公式为:
此外,所有偏置项都被初始化为零。下图显示Deep Layer Norm
显著有利于GLM-130B的训练稳定性,比Sandwich-LN
更稳定。
GLM-130B训练不同层次规范的试验。事实证明,DeepNorm是最稳定的一种,因为它具有较小的梯度范数,并且在早期训练中不会出现尖峰
位置编码分为绝对位置编码和相对位置编码。一些较新的在大模型中应用较多的位置编码有ALiBi和RoPE,GLM-130B
采用的是后者。GLM-130B
团队的观点是虽然RoPE
外推性能有限,但是并不应该把长文本的处理问题完全依赖于位置编码的外推,而是需要什么样的长度就在什么样的context length上做训练。
这部分内容请参考官方视频《从GLM-130B到ChatGLM:大模型预训练与微调》、视频笔记。
官网(内测申请)
由于GLM-130B
的动态知识欠缺、知识陈旧、缺乏可解释性,同时缺少高效“Prompt工程”,在对话场景中使用时很难尽人意。所以清华大学参考了 ChatGPT
的设计思路,在 GLM-130B
中注入了代码预训练,通过有监督微调(Supervised Fine-Tuning)、反馈自助(Feedback Bootstrap)、人类反馈强化学习(Reinforcement Learning from Human Feedback) 等技术实现人类意图对齐。
ChatGLM千亿参数版本由于还处于内测,没有太多的公开信息,报告中给出了目前的一些成绩对比:
MMLU
评测基准上,较GLM-130B
有了有更大提升,超过GPT3 davinci
版本30%,达到了ChatGPT
(GPT-3.5-turbo)的81%ChatGPT
(GPT-3.5-turbo)的95%ChatGPT
(GPT-3.5-turbo)的96%ChatGPT
(GPT-3.5-turbo)的90%。由于ChatGLM
千亿参数版本暂未公开,为了与社区一起更好地推动大模型技术的发展,清华团队开源了62亿参数版本的ChatGLM-6B
。结合模型量化技术,用户可以在消费级的显卡上进行本地部署。
该版本具有以下特点:
如何评价智谱 AI 发布的 ChatGLM,以及开源支持单卡推理的 ChatGLM-6B 模型?
ChatGLM-6B
所有模型文件,总共13G左右,显存不够时可以使用量化模型的方式加载,4-bit量化后可以加载到显存,占用5.2G显存左右,但是量化加载需要13G的内存,就是无论无何这13G的模型文件要么直接加载到显存,要么加载到内存量化后再加载到显存
下面官方直接提供了量化后的模型文件,也就避免了上述处理13G模型文件的操作。 - 4-bit量化后的模型文件下载:GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/THUDM/chatglm-6b-int4
- 进一步提对Embedding量化后的模型,模型参数仅占用4.3 GB显存:GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/THUDM/chatglm-6b-int4-qe
对 ChatGLM-6B 进行微调的开源项目: - InstructGLM:基于ChatGLM-6B进行指令学习,汇总开源中英文指令数据,基于Lora进行指令数据微调,开放了Alpaca、Belle微调后的Lora权重,修复web_demo重复问题 - ChatGLM-Finetuning:一种平价的chatgpt实现方案,基于清华的ChatGLM-6B+ LoRA 进行finetune。
PaLM
(Pathways Language Model )是谷歌2022年提出的 540B 参数规模的大语言模型,论文主要贡献有:
PaLM 使用Transformer decoder架构,但是做了一些修改: - 采用SwiGLU
激活函数,提供更好的性能和梯度流动,提高模型效果 - 提出Parallel Layers
,并行处理多个输入,训练速度提高约 15% - Multi-Query Attention共享key/query的映射,自回归时解码更快 - 位置嵌入使用RoPE embeddings
,在长文本上性能更好 - 采用Shared Input-Output Embeddings
,输入、输出embedding矩阵是共享 - 不使用偏置项:在dense kernel或layer norm中都没有使用偏差,这种操作提高了大模型的训练稳定性
在论文《GLU Variants Improve Transformer》中提到,使用SwiGLU
替换transformer中FFN的第一层,得到的FFNSwiGLU,已被证明可以显著提高模型效果,下面进行简单的介绍。
一个Transformer Bolck中主要包含三部分:MultiheadAttention(多头注意力)、FFN(前馈神经网络)和Add&Norm(残差连接和LayerNorm),其中FFN是由两个线性变换层和激活函数组成。
Transformer Block 所以Transformer中的FFN层可表示为: - relu的优点:神经元只需要进行加、乘和比较这些简单的计算操作,而且有很好的稀疏性,大约有50%的神经元会处于激活状态 - relu的缺点:输出是非零中心化的,会给后面的计算引入偏置转移的问题,影响梯度下降的效率。 神经元在训练时容易死亡,不恰当的更新会导致参数梯度一直为0,永远无法被激活。
在T5模型中去除了FFN的偏置项,所以T5中的FFN表示为:
后面的一些工作也使用了其它的激活函数替换ReLU
,例如Hendrycks等人就使用了GELU
来进行替换,Ramachandran等人使用了Swish
来进行替换 :
其中,GELU(高斯误差线性单元)公式为:(erf 表示误差函数) Swish:
Swish具有以下特性: - 平滑性:Swish函数在整个实数域上是连续且可微的,没有突变点或不连续的部分,这有助于提高梯度的稳定性和训练的效果。(比ReLU更平滑)
GLU
,门控线性单元(Gated Linear Units),是一种神经网络层,其核心思想是通过门控机制来控制激活函数的输出,由线性变换和门控机制组成: - 输入$x$通过线性变换得到两个输出向量,分别称为"门"向量(下式中的$xW + b$)和"中间"向量(下式中的$xV + c$) - 门向量通过一个激活函数(通常是sigmoid函数)进行门控,产生一个介于0和1之间的值,表示在给定位置上的输入是否应该被过滤或保留 - 中间向量与门向量进行Hadamard乘积,从而对输入进行控制和加权。
GLU的一般形式可表示为:
如果将激活函数省略,就可以得到一个双线性变换函数(Bilinear),可表示为: GLU变体:
从GLU的变体中我们不难发现ReGLU的表达式与FFN的表达式是相似的,所以考虑将FFN的第一次线性和激活函数替换为GLU,所以有:
不难看出,替换操作是FFN原先第一层的$xW_1$替换为GLU的$(xW) \odot xV$,所以对比于原始的FFN来说,多了一项线性变换$xV$。作者为了保持参数数量和计算量不变,将hidden unit减少2/3,即$W,V$的第二维和$W_2$的第一维减少2/3。
使用T5模型作为baseline,设置编码器和解码器各由12层组成,维度768,注意力层采用 $head=12,d_k = d_v = 64$ ,FFN层及其变体采用3072个神经元,而GLU及其变体则采用2048个神经元,实验结果如下所示:
在GLUE语言理解基准数据集的任务上进行对比:
在传统的语言模型中,模型的每一层负责特定的任务,每一层都必须等待前一层完成后才能开始处理。Parallel Layers
是PaLM的一个关键创新,通过并行层,可以同时处理多个任务,显著提高模型的速度和准确性(并行层可以同时从多个示例中进行学习)。 标准的transformer block中,输出公式可以写成: 在Parallel Layers中,可以写成:(代码可参考LLM系列之PaLM)
并行公式使大规模训练速度提高了大约 15%
。消融实验显示在 8B 参数量下模型效果下降很小,但在 62B 参数量下没有模型效果下降的现象。
标准的transformer block中,假设有k个注意力头,则计算过程为: - 使用矩阵$W$将Q、K、V映射到k个不同的语义空间中,形状为[k, h]; - 进行Attention计算,得到k个head矩阵。 - 将这k个矩阵串联拼接起来,乘以矩阵$W^o$(保持维度一致)得到多头注意力结果。
故多头注意力模型公式可以写成:
而在PaLM中,每个head的key/value权值共享,即key和value被映射为[1,h]
,但query仍然被映射为shape[k,h]
。论文发现这种操作对模型质量和训练速度没有影响,但在自回归解码时间上有效节省了成本。(标准的多头注意力在自回归解码过程中,键(key)和值(value)张量在不同样本之间不共享,并且每次只解码一个单词,所以在加速器硬件上的效率较低)
RoPE 嵌入在长文本上具有更好的性能 ,具体原理可看苏神文章《Transformer升级之路:2、博采众长的旋转式位置编码》
在自然语言处理任务中,输入序列和输出序列都需要经过嵌入层来获取对应的嵌入向量。而在PaLM中,输入序列和输出序列共享相同的嵌入层参数矩阵,即输入序列中的单词通过嵌入层获得其嵌入向量,同时输出序列中的单词也通过相同的嵌入层获得对应的嵌入向量。
这样做的目的是为了让输入和输出之间共享语义信息,表示更加一致和相互关联,使得模型能够更好地理解输入和输出之间的语义关系,并更准确地进行预测和生成。
需要注意的是,共享嵌入层并不意味着输入和输出之间的嵌入是完全相同的,而是共享参数矩阵,通过参数的共享来实现输入和输出之间的信息传递和一致性。
考虑了三种不同的模型尺度:540B、62B 和 8B 参数:
PaLM 预训练数据集: - 包含 7800 亿个标记的高质量语料库,代表了广泛的自然语言用例。该数据集是经过过滤的网页、书籍、维基百科、新闻文章、源代码和社交媒体对话的混合体。该数据集基于用于训练 LaMDA
(Thoppilan 等人,2022 年)和 GLaM
(Du 等人,2021 年)的数据集。 - 所有三个模型都只在一个时期的数据上进行训练(所有模型的数据清洗方式都相同)。 - 除了自然语言数据,预训练数据集还包含 196GB 代码,从 GitHub 上的开源存储库获取,包括 Java、HTML、Javascript、Python、PHP、C#、XML、C++ 和 C。
总体来说,该程序包含: - 组件 A:用于 pod 内前向+反向计算(包括 pod 内梯度减少) - 组件 B:用于跨 pod 梯度传输的传输子图,以及用于优化器更新的(包括本地和远程梯度的求和)
Pathways 程序在每个 pod 上执行组件 A,然后将输出梯度传输到另一个 pod,最后在每个 pod 上执行组件 B。因此,它掩盖了延迟,还分摊了管理数据传输的成本,PaLM 代表了 LLM 训练效率向前迈出的重要一步。(PaLM的硬件FLOPs利用率为57.8%,模型FLOPs利用率见下表)
FLOPS
表示每秒钟可以执行的浮点运算次数,Model FLOPS utilization
(模型FLOPS利用率)是指在机器学习模型中使用的浮点运算数(FLOPS)的有效利用程度,表示实际执行的浮点运算与模型的理论计算能力之间的关系。一个高的Model FLOPS utilization意味着模型能够有效地利用计算资源,并将其转化为有意义的计算任务。这意味着模型的计算效率较高,能够更快地完成训练或推断任务。
PaLM 540B 在所有基准测试中都优于类似尺寸的模型(Megatron-Turing NLG 530B)。这表明预训练数据集、训练策略和训练期间观察到的标记数量在实现这些结果方面也起着重要作用。
PaLM-Coder 540B
的性能进一步提高,在 HumanEval 上达到 88.4% pass@100,在 MBPP 上达到 80.8% pass@80。
下部分详见:
基础模型:
下表是在上述基础模型上进行指令微调的大模型:
模型 | 发布日期 |
---|---|
GPT | 2018-11-14 |
GPT-2 | 2019-11-27 |
GPT-3 | 2020-6-11 |
InstructGPT | 2022-3-4 |
ChatGPT | 2022-11-30 |
GPT-4 | 2023-3-14 |
ChatGPT Plugin | 2023-5-12 |
GPT是自回归模型(auto-regression),使用 Transformer 的 Decoder 模块构建。原始的Transformer Decoder 比Encoder 多了一个encoder-decoder-attention层(第二个自注意力层,k和v来自encoder层最后的输出memory),使得它可以关注来自 Encoder 的信息。在GPT中,使用的decoder去掉了这一层。
自回归:生每个 token 之后,将这个 token 添加到输入的序列中,形成一个新序列。然后这个新序列成为模型在下一个时间步的输入。
Mask 操作是在 Self-Attention 进行 Softmax 之前进行的,具体做法是将要 Mask 的位置用一个无穷小的数替换 -inf,然后再 Softmax,如下图所示。
下图是 GPT 整体模型图,其中包含了 12 个 Decoder:
GPT提出来“生成式预训练(无监督)+判别式任务精调(有监督)”的范式来处理NLP任务。
GPT-2(2019-2)
和GPT-3(2020-6)
的区别: - GPT-3使用了更深的网络层数和更宽的Transformer网络结构,模型更大,参数更多,表达能力和语言理解能力更强; - GPT-3在预训练阶段使用了更大规模的数据集,并采用了更多样化的预训练任务 - GPT-3的微调阶段采用了zero-shot学习和few-shot的方法,使得GPT-3具备更强的泛化能力和迁移学习能力。
《李沐论文精度系列之九:InstructGPT》、bilibili视频《InstructGPT 论文精读》
语言模型扩大并不能代表它们会更好地按照用户的意图进行工作,大语言模型很可能会生成一些不真实的、有害的或者是没有帮助的答案。换句话说,这些模型和用户的意图并不一致(not aligned with their users)。由此OpenAI提出了“align”的概念,即希望模型的输出与人类意图“对齐”,符合人类真实偏好。
InstructGPT提出了语言模型的三个目标: - helpful——帮助用户解决问题 - honest——不能伪造信息或误导用户 - harmless——不会令人反感,也不会对他人或社会有害
InstructGPT使用来自人类反馈的强化学习(利用人类的偏好作为奖励信号,让模型仿照人来生成答案),对GPT-3进行微调,实现以上目标。具体实现步骤如下:
1. 收集示范数据,进行有监督微调SFT
。 - 标注数据:根据prompts(提示,这里就是写的各种各样的问题),人类会撰写一系列demonstrations(演示)作为模型的期望输出(主要是英文); - 模型微调:将prompts和人类标注的答案拼在一起,作为人工标注的数据集,然后使用这部分数据集对预训练的GPT-3进行监督微调,得到第一个模型SFT
(supervised fine-tuning,有监督微调) - 因为问题和答案是拼在一起的,所以在 GPT 眼中都是一样的,都是给定一段话然后预测下一个词,所以在微调上跟之前的在别的地方做微调或者是做预训练没有任何区别。 2. 收集比较数据,训练奖励模型RM
。 - 生成式标注是很贵的一件事,所以第二步是进行排序式/判别式标注。用上一步得到的SFT
模型生成各种问题的答案,标注者(labelers)会对这些输出进行比较和排序(由好到坏,比如下图D>C>A=B)。 - 基于这个数据集,用强化学习训练一个RM
(reward model)。训练好了之后这个RM模型就可以对生成的答案进行打分,且打出的分数能够满足人工排序的关系。 3. 使用强化学习的机制,优化SFT
模型,得到最终的RL
模型(InstructGPT)。 将SFT
模型的输出输入RM
进行打分,通过强化学习来优化SFT
模型的参数,详见本文4.3节。
步骤2和步骤3可以连续迭代。第二步可以使得在同样的标注成本下得到更多的数据,模型的性能会更好一些,最终得到的模型就是InstructGPT。
语言模型通过预测下一个词的方式进行训练,其目标函数是最大化给定语言序列的条件概率,而不是“有帮助且安全地遵循用户的指示”,所以当前的语言模型训练的目标函数有问题。这部分在第三步RL
模型(InstructGPT)中体现。简单来说就是新的损失函数包括以下几个部分:
RL
产生的输出$y$和原始的SFT
模型输出的$y$会逐渐不一样,所以作者在loss里加入了一个KL散度(评估两个概率分布的差异),希望RL
在SFT
模型的基础上优化一些就行,但是不要偏太远,即相当于加入了一个正则项。ChatGPT
和InstructGPT
在模型结构,训练方式上都完全一致,即都使用了指示学习(Instruction Learning)和人工反馈的强化学习(RLHF,Reinforcement Learning from Human Feedback)来指导模型的训练。区别是InstructGPT
是在GPT3
上微调,ChatGPT
是在GPT3.5
上微调的。
为了能够更加灵活的扩展 ChatGPT 的现有功能,OpenAI 正式上线了以安全为核心的 ChatGPT plugin
,在保障数据安全性的前提下,让 ChatGPT 功能再度提升一整个数量级!plugin(插件)可以允许 ChatGPT 执行以下操作:
ChatGPT plugin
,其实就是类似Toolformer
技术的应用,使得模型可以连接成百上千个API,这样大语言模型只是一个交互的工具,真正完成任务的还是之前的各种工具。这样不仅准确度可以提升,而且3月24ChatGPT plugin
开通联网后,还可以更新自己的知识库,开启了无限可能。
比如用计算器进行计算肯定是可以算对的,而不需要像之前一样进行推理了。
《李沐论文精度系列之十:GPT-4》
GPT-4
是 OpenAI 继 ChatGPT 之后发布的一个大规模的多模态模型,之前的 GPT 系列模型都是只支持纯文本输入输出的语言模型,而 GPT-4 可以接受图像和文本作为输入,并产生文本输出。GPT-4
仍然是基于 Transformer 的自回归结构的预训练模型。OpenAI 的博客中表示在随意的对话中,GPT-3.5 和 GPT-4 之间的区别可能很微妙,当任务的复杂性达到足够的阈值时,差异就会出现,即 GPT-4 比 GPT-3.5 更可靠、更有创意,并且能够处理更细微的指令。
虽然在许多现实场景中的能力不如人类,但 GPT-4
在各种专业和学术基准测试中表现出人类水平的表现,包括通过模拟律师考试,得分在应试者的前 10% 左右。和 ChatGPT RLHF 的方法类似,alignment(对齐)训练过程可以提高模型事实性和对期望行为遵循度的表现,具有强大的意图理解能力,并且对 GPT-4 的安全性问题做了很大的优化和提升。GPT-4
的基础模型其实于 2022 年 8 月就已完成训练。OpenAI 对于基础理解和推理能力越来越强的 LLM 采取了更为谨慎的态度,花 6 个月时间重点针对 Alignment、安全性和事实性等问题进行大量测试和补丁。2023 年 3 月 14 日,OpenAI 发布 GPT-4
及相关文章。文章中几乎没有披露任何技术细节。同时当前公开的 GPT-4
API 是限制了 few-shot 能力的版本,并没有将完整能力的基础模型开放给公众(这个版本会维护到6月14号)。
LaMDA
是谷歌在2021年开发者大会上公布的,专用于对话的大语言模型。模型基于Transformer架构,并在具有1.56T单词的公开对话数据和其他网页文档上预训练,最终尺寸从2B到137B。
论文中提出三个指导模型更好训练的指标,并概括了如何在这三个方面取得进展: - 质量: - 合理性/Sensibleness:生成在对话上下文中有意义的响应 - 特异性/Specificity:通过判断系统的响应是否特定于前面的对话上下文来衡量的,而不是适用于大多数上下文的通用回应; - 趣味性/Interestingness,SSI):衡量模型是否产生了富有洞察力、出乎意料或机智的回应,因此更有可能创造更好的对话。 - 安全性: - 根基性,Groundedness :生成的响应中包含的声明能够被参考和与已知来源进行核实的程度。当前这一代语言模型通常会生成看似合理但实际上与已知外部事实相矛盾的陈述。
在定义了对话模型训练的指导指标之后,LaMDA 讲过预训练与微调两个阶段的训练。 - 预训练:从公共对话数据和其他公共网页文档中收集并创建了一个具有 1.56T 单词的数据集,是用于训练以往对话模型的单词量的近 40 倍 - 微调阶段做两个工作: - LaMDA 生成器:执行混合生成任务,以生成对给定上下文的自然语言响应(模式是预测两个角色来回对话的对话数据集中下一个token) - LaMDA 分类器:预测LaMDA 生成器生成的响应的安全与质量(SSI)分数,安全分数低的候选响应首先被过滤掉,剩下的候选响应根据 SSI 分数重新排名,并选择分数最高的作为最终响应。
谷歌使用 LaMDA 分类器进一步过滤掉用于生成任务的训练数据,以增加高质量候选响应的密度
人们能够使用工具并参考已建立的知识库来检测事实,但是很多语言模型仅利用内部模型参数来获取知识。谷歌通过与人的对话数据集进行微调,让LaMDA模型能够更好地利用外部知识来提供更可靠的回应。
具体来说,为了提高LaMDA模型原始回应的可靠性,谷歌采集了人与LaMDA之间的对话数据集。这些对话数据集在适当的情况下使用了搜索查询和搜索结果进行注释。谷歌通过对这个数据集进行微调,让LaMDA模型的生成器和分类器能够学习在与用户交互时如何调用外部信息检索系统,以增强回应的可靠性。虽然这项工作仍处于早期阶段,但谷歌已经看到了一些有希望的结果。
谷歌对预训练模型(PT)、微调模型(LaMDA)、人类评估者在多轮双作者对话上的响应进行评估,指标是质量、安全性和根基性,结果如下:
- 质量:LaMDA 在每个维度和所有模型大小情况下都显著优于预训练模型,合理性、特异性和趣味性等质量度量通常会随模型参数量提升; - 安全性:可以通过微调提升,但是无法仅从模型缩放中得到收益; - 根基性:随着模型大小的增加,根基性也提升,这或许是因为更大的模型具备更大的记住不常见知识的能力
微调使模型可以访问外部知识源并有效地将记住知识的负载转移到外部知识源。微调还可以缩小与人类水平的质量差距,尽管该模型在安全性和根基性方面的性能依然低于人类。
Bard 是谷歌基于 LaMDA
研制的对标 ChatGPT 的对话语言模型,目前应该只支持英文对话,限美国和英国用户预约访问。
GLM
:一种基于Transformer架构进行改进的通用预训练框架,GLM将不同任务的预训练目标统一为自回归填空任务(Autoregressive Blank Infilling),使得模型在自然语言理解和文本生成方面性能都有所改善。GLM-130B
:于2022年8月由清华智谱AI开源放出。该大语言模型基于之前提出的GLM(General Language Model),在Norm处理、激活函数、Mask机制等方面进行了调整,目的是训练出开源开放的高精度千亿中英双语稠密模型,能够让更多研发者用上千亿模型。ChatGLM
: 基于GLM-130B
,引入面向对话的用户反馈,进行指令微调后得到的对话机器人。ChatGLM
解决了大基座模型在复杂问题、动态知识、人类对齐场景的不足。ChatGLM
于2023年3月开启申请内测,目前暂停了公开申请。ChatGLM-6B
:于2023年3月开源。在进行ChatGLM千亿模型内测的同时,清华团队也开放出了同样技术小参数量的版本,方便研发者们进行学习和开发(非商用)。NLP任务分为NLU(文本分类、分词、句法分析、信息抽取等)、有条件生成任务(seq-seq,如翻译任务、QA)、无条件生成任务(用预训练模型直接生成内容)三大类。基础的预训练模型也分为三种: | 预训练模式 | 代表模型 | 说明 | |------------|----------|------------------------------------------------------------------------------------------------| | 自编码 | BERT | 双向的transformer作为编码器,在语言理解相关的文本表示效果很好。缺点是不能直接用于文本生成。 | | 自回归 | GPT | 从左往右学习的模型,在长文本的生成能力很强。缺点是单向的注意力机制在NLU任务中,不能完全捕捉token的内在联系。| | 编码解码 | T5 | 编码器使用双向注意力,解码器使用单向注意力,并且有交叉注意力连接两者。在有条件生成任务中表现良好(文本摘要,回答生成)。 |
所以用一张表格简单总结就是:
注:✅表示擅长,x表示无法直接应用,— 表示可以做
目前这些训练前框架都不足以在所有NLP中具有竞争力任务。以往的工作(T5)试图通过多任务学习统一不同的框架。然而,由于自编码和自回归的目标性质不同,简单的统一不能完全继承这两个框架的优点。
GLM 将 NLU 任务制定为包含任务描述的完形填空问题,并通过自回归生成来回答
GLM通过优化自回归空白填充目标进行训练。给定输入文本x =[x 1 ,··· ,x n ]
,对多个文本跨度spans {s 1 ,··· ,s m }
进行采样,然后将这些span进行mask(用[mask]标记替换),形成损坏的文本xcorrupt
。span的长度服从泊松分布(λ=3),与BART一样,重复采样,直到15%的token被mask(根据经验,15% 的比率对于下游 NLU 任务的良好性能至关重要)。
下面举例说明。对于input=[x1,x2,x3,x4,x5,x6],假设mask 掉 [x3] 和 [x5,x6]。然后输入x包括两部分: - part A:损坏的文本xcorrupt
,例子中是[x1,x2,mask,x4,mask]
- part B :mask掉的span部分,例子中是 [x5,x6],[x3]
。为了完全捕捉不同跨度之间的相互依赖关系,会随机排列跨度的顺序,类似于置换语言模型XLNet
。
预训练的目标是:通过自回归方式从损坏的文本xcorrupt
中预测跨度span
中被mask的部分,即从part A预测part B。下图显示了mask矩阵,可以看出: - Part A部分采用双向注意力,可以关注它们自己(蓝框)前后的信息,但不能关注 B; - Part B采用单向注意力,可以关注 A 部分及 B 部分中的前文。
为了启用自回归生成,每个span都自动填充了特殊标记 [S] 和 [E] ,表示预测从start到end跨度的部分。通过这种方式,GLM在统一模型中自动学习双向编码器(Part A)和单向解码器(Part B)。
[M] := [MASK], [S] := [START], [E] := [END]
如上图所示,Part A与PartB拼接成一个sequence,每个token都用两个位置编码 ids( two positional ids): - positional id1:表示损坏的文本xcorrupt中的位置,PartB以span被mask的位置表示 - positional id2:表示跨度内的位置,所以Part A统一以0表示。PartB中的token,以从开始到此位置的span长度表示。
最终两个位置编码都会加入到输入token 的embedding向量中。
前面的介绍中,span都比较短,适用于NLU任务。然而,我们希望模型能同时处理NLU任务和文本生成任务是,所以我们设置了第二个预训练任务——长文本生成,分两个级别:
这两个级别的生成任务和NLU任务相同,唯一的区别在于跨度数量和跨度长度。在实际使用中,可以根据不同的任务需要,设置不同mask方式的比例。例如,如果希望模型有更强的生成能力,可以把文档级别的gMASK的比例设置地比较高。在GLM-130B
中,采用了70%文档级别的gMASK和30%单词级别的MASK。
GLM 使用单个Transformer ,并对架构进行了多项修改: 1. 采用Sandwich-LN
。LayerNorm会影响训练的稳定性,目前认为认为稳定性上: Sandwich-LN > Pre-LN > Post-LN(原始的BERT) 2. 使用单个线性层来进行输出Token预测 3. ReLU
激活函数替换为GELU
对于下游NLU任务,我们通常会在模型之上添加线性分类器,以前层的输出作为输入来预测正确的标签,但这会导致预训练和微调之间的不一致。 GLM微调时,分类任务转换为完形填空,类似PET。如上图示例,原本的“positive”和“negative”二分类任务,转换为预测[mask]的任务(映射到单词“good”和“bad”)。
其实这部分就是Prompt Tuning
,有三种主要算法:PET、P-Tuning和EFL。有兴趣的可以参考《PaddleNLP系列课程一:Taskflow、小样本学习、FasterTransformer》第二章。
GLMBase
得分比BERT Base 高 4.6%,GLMLarge
得分比BERT Large 高 5.0%。3. 有条件生成和无条件生成
其它结果请看论文。
GLM是一种用于自然语言理解和生成的通用预训练框架。论文展示了NLU任务可以被形式化为条件生成任务,因此可以由自回归模型解决。GLM将不同任务的预训练目标统一为自回归空白填充,具有混合的注意力掩码和新颖的二维位置编码。我们的实验证明GLM在NLU任务中优于先前的方法,并且可以有效地共享参数以用于不同的任务。
GPT-3
是一款强大的语言模型,但由于未公开,存在技术瓶颈。目前的语言模型规模庞大,训练需要数百张A100以上的显卡,非常困难。GLM-130B
是2022年8月由清华AI向研究界和工业界开放的拥有1300亿参数的中英双语稠密模型。本文介绍了GLM-130B的训练过程,包括设计选择、高效稳定的训练策略和工程努力。
在广泛的英语测试中,GLM-130B
的性能明显优于GPT-175B
,但在OPT-175B和BLOOM-176B上并未观察到性能优势。在相关测试中,GLM-130B也始终明显优于最大的中文模型ERNIE TITAN 3.0 260B
。最后,利用GLM-130B独特的缩放特性,实现了INT4量化使其成为100B缩放模型中的先驱,可进行快速推理(小型多任务模型成为一种趋势)。
2022年11月,在斯坦福大学大模型中心对全球30个主流大模型的评测报告中,GLM-130B 在准确性和恶意性指标上与 GPT-3 175B (davinci) 接近或持平,鲁棒性和校准误差在所有千亿规模的基座大模型(作为公平对比,只对比无指令提示微调模型)中表现不错(下图)。
DeepNorm:Deepnet: Scaling transformers to 1,000 layers
训练不稳定性是训练LLMs的一个主要挑战,适当选择LNs有助于稳定LLM的训练。作者发现GLM的训非常不稳定,于是使用了Deep Layer Norm
机制,公式为:
此外,所有偏置项都被初始化为零。下图显示Deep Layer Norm
显著有利于GLM-130B的训练稳定性,比Sandwich-LN
更稳定。
GLM-130B训练不同层次规范的试验。事实证明,DeepNorm是最稳定的一种,因为它具有较小的梯度范数,并且在早期训练中不会出现尖峰
位置编码分为绝对位置编码和相对位置编码。一些较新的在大模型中应用较多的位置编码有ALiBi和RoPE,GLM-130B
采用的是后者。GLM-130B
团队的观点是虽然RoPE
外推性能有限,但是并不应该把长文本的处理问题完全依赖于位置编码的外推,而是需要什么样的长度就在什么样的context length上做训练。
这部分内容请参考官方视频《从GLM-130B到ChatGLM:大模型预训练与微调》、视频笔记。
官网(内测申请)
由于GLM-130B
的动态知识欠缺、知识陈旧、缺乏可解释性,同时缺少高效“Prompt工程”,在对话场景中使用时很难尽人意。所以清华大学参考了 ChatGPT
的设计思路,在 GLM-130B
中注入了代码预训练,通过有监督微调(Supervised Fine-Tuning)、反馈自助(Feedback Bootstrap)、人类反馈强化学习(Reinforcement Learning from Human Feedback) 等技术实现人类意图对齐。
ChatGLM千亿参数版本由于还处于内测,没有太多的公开信息,报告中给出了目前的一些成绩对比:
MMLU
评测基准上,较GLM-130B
有了有更大提升,超过GPT3 davinci
版本30%,达到了ChatGPT
(GPT-3.5-turbo)的81%ChatGPT
(GPT-3.5-turbo)的95%ChatGPT
(GPT-3.5-turbo)的96%ChatGPT
(GPT-3.5-turbo)的90%。由于ChatGLM
千亿参数版本暂未公开,为了与社区一起更好地推动大模型技术的发展,清华团队开源了62亿参数版本的ChatGLM-6B
。结合模型量化技术,用户可以在消费级的显卡上进行本地部署。
该版本具有以下特点:
如何评价智谱 AI 发布的 ChatGLM,以及开源支持单卡推理的 ChatGLM-6B 模型?
ChatGLM-6B
所有模型文件,总共13G左右,显存不够时可以使用量化模型的方式加载,4-bit量化后可以加载到显存,占用5.2G显存左右,但是量化加载需要13G的内存,就是无论无何这13G的模型文件要么直接加载到显存,要么加载到内存量化后再加载到显存
下面官方直接提供了量化后的模型文件,也就避免了上述处理13G模型文件的操作。 - 4-bit量化后的模型文件下载:GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/THUDM/chatglm-6b-int4
- 进一步提对Embedding量化后的模型,模型参数仅占用4.3 GB显存:GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/THUDM/chatglm-6b-int4-qe
对 ChatGLM-6B 进行微调的开源项目: - InstructGLM:基于ChatGLM-6B进行指令学习,汇总开源中英文指令数据,基于Lora进行指令数据微调,开放了Alpaca、Belle微调后的Lora权重,修复web_demo重复问题 - ChatGLM-Finetuning:一种平价的chatgpt实现方案,基于清华的ChatGLM-6B+ LoRA 进行finetune。
PaLM
(Pathways Language Model )是谷歌2022年提出的 540B 参数规模的大语言模型,论文主要贡献有:
PaLM 使用Transformer decoder架构,但是做了一些修改: - 采用SwiGLU
激活函数,提供更好的性能和梯度流动,提高模型效果 - 提出Parallel Layers
,并行处理多个输入,训练速度提高约 15% - Multi-Query Attention共享key/query的映射,自回归时解码更快 - 位置嵌入使用RoPE embeddings
,在长文本上性能更好 - 采用Shared Input-Output Embeddings
,输入、输出embedding矩阵是共享 - 不使用偏置项:在dense kernel或layer norm中都没有使用偏差,这种操作提高了大模型的训练稳定性
在论文《GLU Variants Improve Transformer》中提到,使用SwiGLU
替换transformer中FFN的第一层,得到的FFNSwiGLU,已被证明可以显著提高模型效果,下面进行简单的介绍。
一个Transformer Bolck中主要包含三部分:MultiheadAttention(多头注意力)、FFN(前馈神经网络)和Add&Norm(残差连接和LayerNorm),其中FFN是由两个线性变换层和激活函数组成。
Transformer Block 所以Transformer中的FFN层可表示为: - relu的优点:神经元只需要进行加、乘和比较这些简单的计算操作,而且有很好的稀疏性,大约有50%的神经元会处于激活状态 - relu的缺点:输出是非零中心化的,会给后面的计算引入偏置转移的问题,影响梯度下降的效率。 神经元在训练时容易死亡,不恰当的更新会导致参数梯度一直为0,永远无法被激活。
在T5模型中去除了FFN的偏置项,所以T5中的FFN表示为:
后面的一些工作也使用了其它的激活函数替换ReLU
,例如Hendrycks等人就使用了GELU
来进行替换,Ramachandran等人使用了Swish
来进行替换 :
其中,GELU(高斯误差线性单元)公式为:(erf 表示误差函数) Swish:
Swish具有以下特性: - 平滑性:Swish函数在整个实数域上是连续且可微的,没有突变点或不连续的部分,这有助于提高梯度的稳定性和训练的效果。(比ReLU更平滑)
GLU
,门控线性单元(Gated Linear Units),是一种神经网络层,其核心思想是通过门控机制来控制激活函数的输出,由线性变换和门控机制组成: - 输入$x$通过线性变换得到两个输出向量,分别称为"门"向量(下式中的$xW + b$)和"中间"向量(下式中的$xV + c$) - 门向量通过一个激活函数(通常是sigmoid函数)进行门控,产生一个介于0和1之间的值,表示在给定位置上的输入是否应该被过滤或保留 - 中间向量与门向量进行Hadamard乘积,从而对输入进行控制和加权。
GLU的一般形式可表示为:
如果将激活函数省略,就可以得到一个双线性变换函数(Bilinear),可表示为: GLU变体:
从GLU的变体中我们不难发现ReGLU的表达式与FFN的表达式是相似的,所以考虑将FFN的第一次线性和激活函数替换为GLU,所以有:
不难看出,替换操作是FFN原先第一层的$xW_1$替换为GLU的$(xW) \odot xV$,所以对比于原始的FFN来说,多了一项线性变换$xV$。作者为了保持参数数量和计算量不变,将hidden unit减少2/3,即$W,V$的第二维和$W_2$的第一维减少2/3。
使用T5模型作为baseline,设置编码器和解码器各由12层组成,维度768,注意力层采用 $head=12,d_k = d_v = 64$ ,FFN层及其变体采用3072个神经元,而GLU及其变体则采用2048个神经元,实验结果如下所示:
在GLUE语言理解基准数据集的任务上进行对比:
在传统的语言模型中,模型的每一层负责特定的任务,每一层都必须等待前一层完成后才能开始处理。Parallel Layers
是PaLM的一个关键创新,通过并行层,可以同时处理多个任务,显著提高模型的速度和准确性(并行层可以同时从多个示例中进行学习)。 标准的transformer block中,输出公式可以写成: 在Parallel Layers中,可以写成:(代码可参考LLM系列之PaLM)
并行公式使大规模训练速度提高了大约 15%
。消融实验显示在 8B 参数量下模型效果下降很小,但在 62B 参数量下没有模型效果下降的现象。
标准的transformer block中,假设有k个注意力头,则计算过程为: - 使用矩阵$W$将Q、K、V映射到k个不同的语义空间中,形状为[k, h]; - 进行Attention计算,得到k个head矩阵。 - 将这k个矩阵串联拼接起来,乘以矩阵$W^o$(保持维度一致)得到多头注意力结果。
故多头注意力模型公式可以写成:
而在PaLM中,每个head的key/value权值共享,即key和value被映射为[1,h]
,但query仍然被映射为shape[k,h]
。论文发现这种操作对模型质量和训练速度没有影响,但在自回归解码时间上有效节省了成本。(标准的多头注意力在自回归解码过程中,键(key)和值(value)张量在不同样本之间不共享,并且每次只解码一个单词,所以在加速器硬件上的效率较低)
RoPE 嵌入在长文本上具有更好的性能 ,具体原理可看苏神文章《Transformer升级之路:2、博采众长的旋转式位置编码》
在自然语言处理任务中,输入序列和输出序列都需要经过嵌入层来获取对应的嵌入向量。而在PaLM中,输入序列和输出序列共享相同的嵌入层参数矩阵,即输入序列中的单词通过嵌入层获得其嵌入向量,同时输出序列中的单词也通过相同的嵌入层获得对应的嵌入向量。
这样做的目的是为了让输入和输出之间共享语义信息,表示更加一致和相互关联,使得模型能够更好地理解输入和输出之间的语义关系,并更准确地进行预测和生成。
需要注意的是,共享嵌入层并不意味着输入和输出之间的嵌入是完全相同的,而是共享参数矩阵,通过参数的共享来实现输入和输出之间的信息传递和一致性。
考虑了三种不同的模型尺度:540B、62B 和 8B 参数:
PaLM 预训练数据集: - 包含 7800 亿个标记的高质量语料库,代表了广泛的自然语言用例。该数据集是经过过滤的网页、书籍、维基百科、新闻文章、源代码和社交媒体对话的混合体。该数据集基于用于训练 LaMDA
(Thoppilan 等人,2022 年)和 GLaM
(Du 等人,2021 年)的数据集。 - 所有三个模型都只在一个时期的数据上进行训练(所有模型的数据清洗方式都相同)。 - 除了自然语言数据,预训练数据集还包含 196GB 代码,从 GitHub 上的开源存储库获取,包括 Java、HTML、Javascript、Python、PHP、C#、XML、C++ 和 C。
总体来说,该程序包含: - 组件 A:用于 pod 内前向+反向计算(包括 pod 内梯度减少) - 组件 B:用于跨 pod 梯度传输的传输子图,以及用于优化器更新的(包括本地和远程梯度的求和)
Pathways 程序在每个 pod 上执行组件 A,然后将输出梯度传输到另一个 pod,最后在每个 pod 上执行组件 B。因此,它掩盖了延迟,还分摊了管理数据传输的成本,PaLM 代表了 LLM 训练效率向前迈出的重要一步。(PaLM的硬件FLOPs利用率为57.8%,模型FLOPs利用率见下表)
FLOPS
表示每秒钟可以执行的浮点运算次数,Model FLOPS utilization
(模型FLOPS利用率)是指在机器学习模型中使用的浮点运算数(FLOPS)的有效利用程度,表示实际执行的浮点运算与模型的理论计算能力之间的关系。一个高的Model FLOPS utilization意味着模型能够有效地利用计算资源,并将其转化为有意义的计算任务。这意味着模型的计算效率较高,能够更快地完成训练或推断任务。
PaLM 540B 在所有基准测试中都优于类似尺寸的模型(Megatron-Turing NLG 530B)。这表明预训练数据集、训练策略和训练期间观察到的标记数量在实现这些结果方面也起着重要作用。
PaLM-Coder 540B
的性能进一步提高,在 HumanEval 上达到 88.4% pass@100,在 MBPP 上达到 80.8% pass@80。