本文通过深入剖析ChatGLM、LLAMA和Baichuan模型的升级路径,以及探讨大型语言模型结构选型,为大家提供了一个系统性的视角,梳理了大型预训练模型的关键要素。我们希望这些知识能够为大家在实际工程中构建更强大、灵活且高效的大型预训练模型提供有力的参考和指导。
引言
目前大语言模型在各个领域取得了显著的突破,从ChatGLM、LLAMA到Baichuan等,它们在处理各种自然语言任务时展现出了惊人的性能。然而,随着研究的深入和应用需求的不断扩大,这些大型模型需要不断地进行升级和优化,以满足更高的性能要求和更广泛的应用场景。
在这个过程中,作为研究者和从业者,我们需要深入探讨:大型模型的升级之路是怎样的?升级过程中面临哪些挑战?又是通过怎样的手段和方法实现升级的?本篇博客旨在对此进行深入探讨,梳理ChatGLM、LLAMA和Baichuan等模型的升级过程,分析其背后的原因,并展示大型模型如何优化实现升级。
ChatGLM升级之路
首先对比下ChatGLM升级前后各大榜单结果,ChatGLM-6B较ChatGLM2-6B模型在各个榜单中都取得了近20-30%的提升:
▐ MMLU
Chat 模型使用 zero-shot CoT (Chain-of-Thought) 的方法测试,Base 模型使用 few-shot answer-only 的方法测试
▐ C-Eval
Chat 模型使用 zero-shot CoT 的方法测试,Base 模型使用 few-shot answer only 的方法测试
▐ GSM8K
所有模型均使用 few-shot CoT 的方法测试,CoT prompt 来自 http://arxiv.org/abs/2201.11903 使用翻译 API 翻译了 GSM8K 中的 500 道题目和 CoT prompt 并进行了人工校对
▐ BBH
所有模型均使用 few-shot CoT 的方法测试,CoT prompt 来自 https://github.com/suzgunmirac/BIG-Bench-Hard/tree/main/cot-prompts
▐ ChatGLM
ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答。
General Language Model (GLM) 架构地址:https://github.com/THUDM/GLM
相关解析见: https://zhuanlan.zhihu.com/p/627832567?spm=ata.21736010.0.0.1ee417b1JxcVsy
▐ ChatGLM2
ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上,ChatGLM2-6B 引入了如下新特性:
- 更强大的性能:基于 ChatGLM 初代模型的开发经验,我们全面升级了 ChatGLM2-6B 的基座模型。ChatGLM2-6B 使用了 GLM 的混合目标函数,经过了 1.4T 中英标识符的预训练与人类偏好对齐训练,评测结果显示,相比于初代模型,ChatGLM2-6B 在 MMLU(+23%)、CEval(+33%)、GSM8K(+571%) 、BBH(+60%)等数据集上的性能取得了大幅度的提升,在同尺寸开源模型中具有较强的竞争力。
- 更长的上下文:基于 FlashAttention 技术,我们将基座模型的上下文长度(Context Length)由 ChatGLM-6B 的 2K 扩展到了 32K,并在对话阶段使用 8K 的上下文长度训练。对于更长的上下文,我们发布了 ChatGLM2-6B-32K 模型。LongBench 的测评结果表明,在等量级的开源模型中,ChatGLM2-6B-32K 有着较为明显的竞争优势。
- 更高效的推理:基于 Multi-Query Attention 技术,ChatGLM2-6B 有更高效的推理速度和更低的显存占用:在官方的模型实现下,推理速度相比初代提升了 42%,INT4 量化下,6G 显存支持的对话长度由 1K 提升到了 8K。
- 更开放的协议:ChatGLM2-6B 权重对学术研究完全开放,在填写问卷进行登记后亦允许免费商业使用。
ChatGLM-6B 地址: https://github.com/THUDM/ChatGLM-6BGLM 地址: https://github.com/THUDM/GLM评测结果地址: https://github.com/THUDM/ChatGLM2-6B#%E8%AF%84%E6%B5%8B%E7%BB%93%E6%9E%9CFlashAttention地址: https://github.com/Dao-AILab/flash-attentionLongBench 地址: https://github.com/THUDM/LongBenchMulti-Query Attention 地址: https://arxiv.org/abs/1911.02150
▐ 升级过程
- 模型结构
模型结构改变:从Prefix-LM回归纯粹的Decoder-Only结构,即SFT过程所有的都通过gMASK在开头进行生成;
代码对比如下:
图示如下:
ChatGLM2:
那么这种改变能够带来什么呢?
答案就是为模型的训练效率带来了极大的提升。
图片来源:https://github.com/THUDM/ChatGLM2-6B/issues/16
在处理多轮对话的过程中,设有3轮对话,Q1A1,Q2A2,Q3A3,PrefixLM需要构建三条样本:
- Q1->A1
- Q1A1Q2->A2
- Q1A1Q2A2Q3->A3
而这种数据构建方式带来了严重的数据膨胀问题,影响模型训练的效率。
相反,Decoder-Only模型则可以利用Causal Mask的特性(每一个Token可以看到前面所有Token的真实输入),在一条样本中实现多轮对话:
- 样本构建:Q1 A1 Q2 A2 Q3 A3
- Loss计算:只需要计算 A1 A2 和 A3 部分
再仔细回顾下,对话session级别训练和拆开训练从原理上有啥区别?
1. session级别训练,效果之一为等价batchsize变大(1个batch可以塞下更多样本),且同一通对话产生的样本在一个bs内。
- session级别的不同轮次产生的梯度是求平均的,拆开轮次构造训练是求和的,这样除了等价于lr会变大,还会影响不同轮次token权重的分配,另外还会影响norm的计算。
我们用一个简化地例子定量分析下,我们假设两条训练样本分为
1.问:A 答:xx
2.问: A 答:xx 问: B 答:xx 问: C 答:xx
则session级别训练影响梯度为 (Ga+(Ga + Gb + Gc)/3 )/2。对 A,B,C影响的权重分别为,2/3 1/6 1/6。
拆开训练为 (Ga+Ga+ (Ga + Gb)/2 +(Ga + Gb + Gc)/3)/4。对 A,B,C影响的权重分别为,17/24 5/24 1/12。
从上面的权重分布来看,session级别靠后的轮次影响权重要比拆开更大。这也是更合理的,因为大部分场景下,开场白都是趋同和重复的。
- 序列长度
序列长度:预训练模型在32K长度训练,SFT微调模型在8K长度训练;
此外,7月31号智谱AI发布了基于ChatGLM2-6B的基础上微调的针对长上下文优化的大模型ChatGLM2-6B-32K,能够更好的处理最多32K长度的上下文。
此前,ChatGLM2-6B刚发布的时候,官方宣称该模型最高支持32K长上下文输入,但是LM-SYS官方测试显示ChatGLM2-6B在超过8K长度时候表现很糟糕: 支持超长上下文输入的大语言模型评测和总结——ChatGLM2-6B表现惨烈,最强的依然是商业模型GPT-3.5与Claude-1.3 (地址:https://www.datalearner.com/blog/1051688222070709)。
具体来说,ChatGLM2-6B-32K基于位置插值(Positional Interpolation)的方法对位置编码进行了更新,并在对话阶段使用 32K 的上下文长度训练。在实际的使用中,官方推荐如果上下文长度基本在 8K 以内,建议使用ChatGLM2-6B;如果需要处理超过 8K 的上下文长度,推荐使用ChatGLM2-6B-32K。
关于位置插值的介绍,可见博客:RoPE旋转位置编码深度解析:理论推导、代码实现、长度外推(地址:https://zhuanlan.zhihu.com/p/645263524)
ChatGLM2-6B 地址:https://www.datalearner.com/ai-models/pretrained-models/ChatGLM2-6B
- 算子优化
算子优化:Flash Attention、Multi-Query Attention提高训练&推理的速度;
本次ChatGLM2-6B上下文从2k扩展到了32k同时也应用了一种叫做 FlashAttention 的技术。flash-attention是一种快速、高效、可扩展的注意力机制,它利用了一种称为哈希感知(hash-aware)的技术,可以根据它们的相似性将输入序列中的元素分配到不同的桶(bucket)中。这样,模型只需要计算桶内元素之间的注意力权重,而不是整个序列。这大大减少了计算量和内存需求,同时保持了较高的精度和表达能力。
LLAMA升级之路
首先对比下LLAMA升级前后各大榜单结果,LLAMA2较LLAMA模型在各个榜单中取得了近10-30%的提升:
MMLU
GSM8K
▐ LLAMALLaMA
(Large Language Model Meta AI),由 Meta AI 发布的一个开放且高效的大型基础语言模型,共有 7B
、13B
、33B
、65B
(650 亿)四种版本。其数据集来源都是公开数据集,无任何定制数据集,保证了其工作与开源兼容和可复现,整个训练数据集在 token 化之后大约包含 1.4T 的 token。
关于模型性能,LLaMA 的性能非常优异:具有 130 亿参数的 LLaMA 模型「在大多数基准上」可以胜过 GPT-3( 参数量达 1750 亿),而且可以在单块 V100 GPU 上运行;而最大的 650 亿参数的 LLaMA 模型可以媲美谷歌的 Chinchilla-70B 和 PaLM-540B。
关于训练集,其来源都是公开数据集,无任何定制数据集,保证了其工作与开源兼容和可复现。整个训练数据集在 token 化之后大约包含 1.4T 的 token。其中,LLaMA-65B 和 LLaMA-33B 是在 1.4万亿个 token
上训练的,而最小的模型 LLaMA-7B 是在 1万亿个 token 上训练的。
模型结构:
- PreLayerNorm-RMSNorm-Root Mean Square Layer Normalization
- ROPE旋转位置编码(替换绝对/相对位置编码)
- SwiGLU激活函数(替换ReLU)-GLU Variants Improve Transformer
▐ LLAMA2
官方页面上的介绍如下:
在模型结构上,主要升级两点:
- 训练数据Token数量从1.4T->2T
- 序列长度从2K->4K
在SFT过程中,LLAMA2强调数据质量的重要性,通过2W的高质量指令数据,激发模型的指令遵循能力。
在RLHF过程中,LLAMA2做了较多工作,对RLHF过程作出了进一步的解释。自建了100W的Reward数据集,训练了两个独立的Reword Model。
整个LLAMA2的论文解读如下:
LLAMA2-Chat模型的训练过程如下图,主要包含预训练、SFT、RLHF三个步骤:
- 预训练
LLAMA2的主要提升点包括:更强大的数据清洗,更新数据组合,增加40%的总训练tokens,加倍上下文长度,以及使用分组查询注意力(GQA)来提高更大模型的推理可扩展性。
模型结构:
- RMSNorm
- SwiGLU
- RoPE
- 4K序列长度
- 分组查询注意力GQA(33B/70B)
- SFT
作者发现许多第三方SFT数据集在多样性和质量方面不足,因此他们专注于收集自己的高质量SFT数据。
他们观察到,与使用来自第三方数据集的数百万例子相比,从他们自己的供应商为基础的标注工作中使用较少但质量更高的例子可以显著提高结果。他们发现,数以万计的SFT注释足以实现高质量结果,共收集了27,540个注释。
- RLHF
我们主要挑三个核心步骤介绍:数据收集、奖励模型、迭代训练。
人类偏好数据收集
偏好数据如表6所示,其中包含了140WMeta自建的数据集,相比于开源数据集,自建数据集的轮次、对话长度更长。
奖励模型
LLAMA2训练了两个独立的奖励模型(Helpfulness RM/Safety RM)。
动机:有研究发现(Bai等人,2022a),有时候有用性和安全性之间会存在权衡,这使得单一的奖励模型在这两方面的表现上可能会面临挑战。
为了解决这个问题,作者训练了两个独立的奖励模型,一个针对有用性进行优化(称为有用性奖励模型,Helpfulness RM),另一个针对安全性进行优化(称为安全性奖励模型,Safety RM)。这样可以分别在有用性和安全性方面取得更好的效果,使得Llama 2-Chat在强化学习人类偏好(RLHF)过程中更好地符合人类偏好,提高生成回答的有用性和安全性。
损失函数
边界m(r)是关于偏好评分的离散函数。作者对那些响应差距较大的的对使用较大的边界,而对那些响应相似的对使用较小的边界(如表27所示)。作者发现这种边界分量可以提高有用性奖励模型的准确性,特别是在两个反应差距更大的样本中。
迭代训练
LLAMA2采用了两种强化学习算法:PPO和拒绝采样算法。
这两种强化学习算法主要区别在于:
- 广度:在拒绝采样中,模型为给定的提示探索K个样本,而在PPO中,只有一个生成过程。
- 深度:在PPO中,训练过程中第t步的样本是经过t-1步梯度更新后的模型策略的函数。在拒绝采样微调中,在模型的初始策略下采样所有输出以收集新数据集,然后类似于SFT进行微调。然而,由于采用了迭代模型更新,这两种算法之间的本质区别并不明显。
LLAMA2直到RLHF (V4),仅使用拒绝采样微调。之后将这两种方法结合起来,先对拒绝采样检查点应用PPO,然后再对采样进行拒绝采样。LLAMA2只使用最大的70B Llama 2-Chat模型进行拒绝采样。其他较小的模型则在更大模型的拒绝采样数据上进行微调,从而将大模型的能力转移到较小的模型中。
更多精彩内容,欢迎观看:
大模型升级与设计之道:ChatGLM、LLAMA、Baichuan及LLM结构解析(下):