LLaMA相比transformer的变化
-
前置层归一化(Pre-normalization)
LLaMA模型采用了前置层归一化策略,这意味着在每个子层(自注意力层和前馈网络)的输入之前进行层归一化。
LLaMA模型使用RMSNorm作为其归一化函数,这是一种替代传统层归一化的方法,它在保持计算效率的同时,专注于规范化权重矩阵的行,以实现更快的收敛和更好的泛化。有助于提高训练过程中的稳定性,特别是在模型参数初始化阶段,可以降低梯度爆炸的风险。
-
SwiGLU 激活函数
激活函数从传统的ReLU或GELU更换为SwiGLU。SwiGLU是一种基于Swish激活函数的GLU变体,它提供了更好的梯度流动和可能的性能提升。
-
旋转位置嵌入(RoPE)
LLaMA模型还采用了旋转位置嵌入(RoPE)来代替传统的位置编码方法。RoPE通过将位置信息编码为旋转矩阵,使模型能够更有效地捕捉序列中元素之间的位置关系。
-
注意力机制优化
LLaMA模型可能包含对注意力机制的优化,例如稀疏注意力机制,以减少计算复杂度和内存需求。这些优化措施有助于提高模型的计算效率。
-
Group Query Attention
在LLaMA v2中,使用了Group Query Attention技术,这是一种将query分组,组内共享Key-Value的方法,旨在减少缓存量并加速计算,同时保持与Multi-Query Attention相似的效果。
-
模型规模和训练超参数
LLaMA模型有不同的规模版本,从几十亿到数百亿参数不等。每个版本的模型都有特定的超参数设置,例如隐藏层大小、头数、层数、学习率等。
-
分布式模型训练
由于LLaMA模型的参数量非常大,需要依赖分布式模型训练框架来完成训练过程,这可能涉及到大量的GPU资源和优化的训练策略。
LLama2相比LLama的变化
上下文长度是llama两倍(长度从2048->4096) 训练语料增加约 40%,体现在1.4T->2.0T的Tokens llama2-34B和llama2-70B使用了GQA,加速模型训练和推理速度
模型结构的变动主要是体现在GQA和FFN缩放上
-
MHA改成GQA:整体参数量会有减少
-
FFN模块矩阵维度有扩充:增强泛化能力,整体参数量增加
MHA、GQA、MQA比较如下:
-
Mutil-Head Attention 因为自回归模型生成回答时,需要前面生成的KV缓存起来,来加速计算。
-
Multi-Query Attention 多个头之间可以共享KV对,因此速度上非常有优势,实验验证大约减少30-40%吞吐。
-
Group Query Attention 没有像MQA那么极端,将query分组,组内共享KV,效果接近MQA,速度上与MQA可比较。
Qwen相比LLaMa2 的变化
-
1)LLaMa2 的 Attention 的 QKV Matmul 的计算中没有 Biasadd,而 Qwen 有 Biasadd;
-
2)Qwen 的 Tokenizer 采用 titoken 来实现,和 LLaMa2 的 sentencepiece 不同;
-
3)Qwen 的 Embedding table 需要进行 tranpose,才能与 LLaMa2 的 Embedding table 维度对齐;
-
4)Qwen 的 config.json 中 FFN layers 的 intermediate size 比 LLaMa2 大2倍,但实际在模型的 modeling code 中会除以2,最终和 LLaMa2 是一样的;
-
5)Qwen 的 Attention中有 dynamic_ntk 和 logn,在多 batch 时和 LLaMa2 不同;
-
6)其他许多对 layer 的描述名称上的不同,比如 HF 中是 model.layers.attention.query_key_value.weight, 而 Qwen 是 transformer.h.attn.c_attn.weight。
基础模型
Qwen 是一个全能的语言模型系列,包含各种参数量的模型,如 Qwen(基础预训练语言模型,即基座模型)和 Qwen-Chat(聊天模型,该模型采用人类对齐技术进行微调)。基座模型在众多下游任务中始终表现出卓越的性能,而聊天模型,尤其是使用人类反馈强化学习(RLHF)训练的模型,具有很强的竞争力。
预训练
QWEN使用了高达3万亿个token 的数据进行预训练,数据涵盖多个类型、领域和任务,不仅包括基本的语言能力,还包括算术、编码和逻辑推理等高级技能。同时使用了复杂的流程进行数据清洗和质量控制。
为了确保训练数据的多样性,QWEN的预训练数据来源于公共网络文档、百科全书、书籍、代码等。虽然数据集是多语种,但其中很大一部分数据主要还是英文和中文。
预处理
QWEN做了以下数据预处理,最终得到3万亿token。
-
文本数据抽取:对于公共网络数据,从 HTML 中提取文本数据。
-
语言识别: 使用语言识别工具判断文本语言,提取英文和中文数据。
-
去重: 使用明文去重和基于MinHash+LSH的模糊去重算法进行重复数据删除。
-
质量控制: 结合规则和机器学习方法对文本质量进行评分,包括语言模型、文本质量评分模型从而识别和过滤低质量数据。同时还从各种来源手动抽查文本样本进行审查,以确保质量。
-
安全控制: 使用模型识别并过滤涉及暴力、偏见、色情等不安全内容。
-
up-sample采样: 针对某些高质量源的数据进行上采样,以确保多样化的高质量内容。
-
BPE分词: 使用BPE分词算法,针对中文扩充词表提升性能。
-
长序列建模:采用窗口Self-Attention等技术提高长序列建模能力。
通过这些技术手段,QWEN从原始数据中提炼了高达3万亿token的高质量的预训练数据,为模型提供了可靠的知识来源。
分词
QWEN的分词(Tokenization)采用的是基于BPE(Byte Pair Encoding)的方法,兼顾中文和英文等多语言场景的效率,主要步骤如下:
-
首先,基于开源分词器tiktoken的cl100k基础词表进行初始化。
-
然后,针对中文场景,向词表中增添常用的中文字和词,扩充词表规模。
-
同时,参考GPT-3.5和LLaMA的实现,将数字切分成单个数字,如将"123"分词为"1"、“2”、“3”。最终词表大小约为152K。
外推能力
Qwen利用了以下几种技术来实现inference阶段的上下文长度扩展:
-
NTK感知插值(NTK-aware interpolation), 这种无需训练的技术可以调整比例参数以防止在扩展长度时丢失高频信息。
-
动态NTK感知插值(dynamic NTK-aware interpolation),这是NTK感知插值的改进版本,可以以块为单位动态改变比例参数,避免性能大幅下降。这些技术使Qwen能够在不影响计算效率和准确性的情况下有效地扩展上下文长度。
-
LogN-Scaling,根据上下文长度与训练长度的比值,对Q和V的点积进行重新缩放,确保注意力值的熵随着上下文长度的增长而保持稳定。
-
使用分层窗口Self-Attention,将注意力限制在一个上下文窗口内,防止模型关注到太远的内容。并在不同层采用不同的窗口大小,较低的层使用较短的窗口,而较高的层使用较长的窗口。这是因为官方观察到Qwen模型在处理长上下文时在不同层次上的建模能力存在差异,较低的层次相对于较高的层次更加敏感于上下文长度的扩展。为此,为每个层分配了不同的窗口大小,对较低的层使用较短的窗口,对较高的层使用较长的窗口。
综合这些技术,Qwen模型在inference阶段可以处理8192个token的长序列,外推能力优异。
模型训练
-
采用标准的自回归语言模型训练目标。
-
训练时上下文长度为2048。
-
注意力模块采用Flash Attention技术,以提高计算效率并减少内存使用。
-
采用AdamW优化器,设置β1=0.9,β2=0.95,ε=1e-8。
-
使用余弦学习率计划,为每种模型设定一个峰值学习率。学习率会衰减到峰值学习率的 10% 的最小学习率。
-
使用BFloat16混合精度加速训练。
chat模型
只是进行预训练的大语言模型在实际使用中与人类行为不一致,因此多数情况下不宜直接作为AI助手。最近研究表明,采用对齐技术,如监督微调(SFT)和从人类反馈中进行强化学习(RLHF),可以显著提高语言模型参与自然对话的能力。以下将介绍Qwen模型如何进行SFT和RLHF,并评估它们在聊天环境中的表现。
监督微调(SFT)
数据构建 在监督微调数据上,Qwen采用ChatML样式(OpenAI 2022年提出)的格式来进行模型训练。ChatML格式利用特殊符号表示不同类型信息,如系统设置、用户输入、助手输出等,这有助于模型有效区分信息。采用会话流式对话风格,而不是简单的问答形式,使模型学会真实的人机交互。此外,Qwen采用多样化 的训练数据从而提高模型的实用性。为了确保模型能够泛化到广泛的场景,QWen特意排除那些可能限制其功能的提示模板格式的数据。此外,优先关注语言模型的安全性,通过对涉及安全问题(如暴力、偏见、色情等)的数据进行注释。这样一来,模型就能检测并拒绝恶意提示,并提供安全的回答。
训练方式
-
训练任务依然与预训练一样,预测下一个token。
-
对系统和用户的输入应用mask,只预测助手的输出。
-
使用AdamW优化器,超参数β1、β2和ϵ为别为0.9、0.95和1e−8。学习率先增后恒定。
-
序列长度限制在2048,训练batch size=128。
-
训练4000步,在前1430步中,学习率逐渐增加,达到2e−6的峰值。
-
为了防止过拟合,权重衰减的值设置为0.1,dropout设置为0.1,梯度裁剪的限制为1.0。
强化学习RLHF
RLHF这一过程包括训练奖励模型(RM)或使用近端策略优化(PPO)进行策略训练。
RM
在奖励模型的构建上,先采用大量数据进行偏好模型预训练 (preference model pretraining,PMP)。该数据集由样本对组成,每个样本对包含对单个查询的两个不同回复及其相应的偏好。再用这些高质量偏好数据精调奖励模型。
在微调阶段,会先收集各种提示(Prompt),并根据人类对Qwen 模型响应的偏好调整奖励模型。为确保用户提示具备一定的多样性和复杂性,创建了一个包含约6600详细标签的分类系统,并实现了一种平衡采样算法,以在选择提示时兼顾多样性和复杂性。为了生成多样的回复,实验过程使用了不同规模和采样策略的 Qwen 模型。因为多样化的回复有助于降低标注难度并提高奖励模型的性能。标注人员按照标准的标注指南对这些回复进行评估,并根据它们的得分形成对比对。
在创建奖励模型时,使用同一个预训练语言模型Qwen进行PMP流程的初始化。随后,对 PMP 模型进行微调,以提高其性能。值得一提的是,在原始 Qwen 模型中加入了一个池化层,根据特定的结束token提取句子的奖励值。这一过程的学习率被设置为一个恒定值:3e-6,batch size为8的平方。此外,序列长度设置为2048,训练过程持续1个epoch。
POP
PPO阶段共包含四个模型:policy模型、value模型、reference模型、reward模型。在开始PPO流程之前,暂停policy模型的更新,先对policy模型训练50步预热,从而确保value模型能够有效地适应不同的reward模型。
在PPO过程中,对每个query会同时采样两个response,KL散度系数设为0.04,并根据平均值对奖励进行归一化处理。policy模型和value模型的学习率分别为1e−6和5e−6。为了增强训练的稳定性,裁剪值设置为0.15。在进行推理时,生成策略的top-p值设置为0.9。研究结果表明,虽然熵值略低于 top-p=1.0时的值,但奖励的增加速度更快,最终在类似条件下始终能够获得较高的评估奖励。
此外,Qwen还采用了预训练梯度来减缓所谓的对齐税(alignment tax)。研究表明,在这种特定的奖励模型下,KL 惩罚在非严格代码或数学性质的基准测试(如常识性知识和阅读理解测试)中足以弥补对齐税。与PPO数据相比,预训练梯度必须使用更大量的预训练数据,以确保预训练梯度的有效性。此外,实证研究表明,过大的系数值会大大阻碍与奖励模型的匹配,最终影响匹配,而过小的系数值对减缓对齐税的效果微不足道。