作者:岳元浩(顾城)、汪诚愚(熊兮)、严俊冰(玖烛)、黄俊(临在)
背景
在人工智能快速发展的今天,大语言模型已经成为了人工智能的研究热点。其中,通义千问(Qwen)大模型系列凭借其强大的语言理解和生成能力,吸引了开源社区越来越多的关注。随着这些模型的应用场景不断扩大,如何提高它们的运算效率,降低部署成本,成为了一项重要的课题。知识蒸馏作为一种有效的模型压缩技术,通过将大型模型的知识转移到较小的模型中,实现了在确保性能的前提下,显著降低了所需的计算资源和推理时长,从而使得模型在实际应用中变得更加灵活和高效。
为应对这一难题,我们提出了DistilQwen2,DistilQwen2是基于Qwen2大模型,通过知识蒸馏进行指令遵循效果增强的、参数较小的语言模型。 通过对Qwen大模型的深度剖析,指令数据的增强和优化,以及多种知识蒸馏算法的探索,我们将大语言模型的复杂知识以更简洁的形式传递给轻量级模型,实现了指令遵循效果的提升。此外,随着应用需求的多样化,轻量级模型在移动设备、边缘计算等资源受限的环境中显得尤为重要。DistilQwen2的研究旨在为开发更智能、更高效的自然语言处理应用提供技术支持,赋能更多开发者和企业通过技术创新实现商业价值。为了便于开发者和企业在实际应用中使用DistilQwen2蒸馏模型,我们在HuggingFace和ModelScope开源社区中将这一模型的Checkpoint进行开源。本文将介绍DistilQwen2的技术原理、效果评测,以及DistilQwen2在阿里云人工智能平台PAI上的使用方法,和在各开源社区的下载使用教程。
大模型知识蒸馏技术
本节中,我们主要描述DistilQwen2模型训练中使用的全流程知识蒸馏技术。其中,DistilQwen2模型蒸馏的算法框架如下图所示。
原始数据搜集
为了进行大模型蒸馏训练,我们搜集了Magpie、Openhermes、Mammoth 2等知名开源数据集,以及私有的合成数据集初始化来我们的蒸馏过程。指令数据以中英文为主,并且进行了难度打分和任务相关的重采样,实现指令数据的多样性。
在难度打分方面,我们使用LLM-as-a-Judge范式使用教师模型,从模型回答的准确性、相关性、帮助性、详细程度给出评分。我们使用学生模型的分数减去教师模型回答分数,获得分数差,我们命名为模型拟合难度分数(MFD Score)。模型拟合难度分数越高,该指令对于蒸馏训练的价值越大。因此,拟合难度过低的指令数据可以在训练集中删除。在我们的实践中,英文教师模型采用了GPT4,中文教师模型采用了Qwen-max。参考的打分模板如下所示:
在数据多样性方面,我们考虑了三种多样性,分别为任务多样性、长度多样性和语种多样性:
- 任务多样性:我们参考 WizardLM 中对 LLM 的能力评估维度,定义了33种任务类型,收集标注了一个3万条的任务分类数据集,基于 Deberta v3 训练了一个任务分类器,该任务分类器与 ChatGPT 在测试集上分类结果相同的概率为86%,人类评估的任务分类准确率为93%。我们使用专有的任务分类器给数据打上显式的任务类型标签。
- 长度多样性:数据集中的指令和答案需要有均衡的长度分布,也需要包含很长和很短的长尾分布指令。这对于训练后模型处理长尾分布数据的鲁棒性至关重要。我们首先对数据集的长度分布做正态分布估计,考虑长尾分布的数据量和正态分布估计的数据量之间的偏差,我们首先对同一任务池内的数据分布做正态分布估计,如果长尾分布数据不足,需要对长度满足Gamma公式展示 P ( L > μ + 2 σ ) < P ^ ( L > μ + 2 σ ) \ P(L > \mu + 2\sigma) < \hat{P}(L > \mu + 2\sigma) P(L>μ+2σ)<P^(L>μ+2σ) 和 P ( L < μ − 2 σ ) < P ^ ( L < μ − 2 σ ) \ P(L < \mu - 2\sigma) < \hat{P}(L < \mu - 2\sigma) P(L<μ−2σ)<P^(L<μ−2σ) 的数据做指令扩展。
- 语种多样性:很多场景我们需要训练模型在多个语言上的能力,例如中文和英文,但是我们缺少分布足够广泛中文数据,我们使用Qwen-max做数据语种扩展,例如我们使用Prompt让Qwen-max生成和相同任务类型但内容不同,语言不同,包含更多中国常识的数据,直到两种语言数据量大致相等。
指令数据优化
在指令数据优化上,我们首先使用Prompt模板让教师模型扩展数据。在实际应用中,比如扩展中文数据、生成多轮对话数据,需要修改相应的Prompt要求。参考扩展模板如下:
对于多轮对话数据的构造,我们要求教师模型严格基于上一轮包含的回答信息进行追问。实验发现这一类数据格式还会有利于IFEval评测能力的提升。
蒸馏教师大模型需要获得教师模型的回答。教师模型合成回答的格式、风格、长度影响学生模型学到的风格,以及学生模型收敛泛化速度。在获得教师模型的回答时,我们采用了如下三种策略:
- 任务格式优化:在标注教师模型的回答时,我们根据任务特点,优化不同任务教师模型回答风格。例如,推理任务要分步推理,代码类任务要有详细注释和解释,写作类任务要详细等。
- 教师模型标注回复精简:我们在使用教师模型标注数据集回答时,会要求教师模型标注的回答要 “精确但是完整”,这样风格的回答可以让小模型学到风格更精简的回答,减少输出难度和幻觉比例,同时保留了回答的完整性。
- 模型自我蒸馏:我们额外使用了自蒸馏方法。由于这一步骤需要模型改写能力和学生模型能力差异较小,我们额外使用Qwen2-7B-Instruct改写教师模型标注的回答,缩短教师模型和学生模型输出的分布差异,以此能有效减少分布差异带来的灾难性遗忘问题。此外,必须注意的是,数据集中的问答对不能有一些固定的模版文本,不能让模型学到一些固定的规律模板文本。
当优化上述指令数据后,我们进一步使用大模型进行质量的校验,以排除数据质量较低的指令数据,保证蒸馏数据源的精度。
模型蒸馏训练
获得高质量指令数据后,我们采用两种方式训练学生模型。第一种方式即SFT(Supervised Fine-Tuning),即直接微调学生模型的参数。然而,对于一些较难的指令任务,直接进行SFT训练很难获得效果比较好的学生模型,我们进一步使用DPO(Direct Preference Optimization)进行更细粒度的继续微调。
Pr ( y 1 ≻ y 2 ) = exp ( r ( y 1 ) ) exp ( r ( y 1 ) ) + exp ( r ( y 2 ) ) = σ [ r ( y 1 ) − r ( y 2 ) ] \Pr(y_1 \succ y_2) = \frac{\exp(r(y_1))}{\exp(r(y_1)) + \exp(r(y_2))} = \sigma[r(y_1) - r(y_2)] Pr(y1≻y2)=exp(r(y1))+exp(r(y2))exp(r(y1))=σ[r(y1)−r(y2)]
其中 σ \sigma σ 是函数 σ ( x ) : = 1 1 + exp ( − x ) \sigma(x) := \frac{1}{1 + \exp(-x)} σ(x):=1+exp(−x)1。基于DPO的知识蒸馏的目标让学生模型拟合教师模型的分布,这也可以被理解为期望学生模型有更大的概率输出与教师模型相似的结果。根据前述偏好模型,我们可以得到以下概率公式:
p ∗ ( y 1 ≻ y 2 ∣ x ) = σ ( β log q θ ( y 1 ∣ x ) p ( y 1 ∣ x ) − β log q θ ( y 2 ∣ x ) p ( y 2 ∣ x ) ) \ p^*(y_1 \succ y_2 | x) = \sigma \left( \beta \log \frac{q_\theta(y_1|x)}{p(y_1|x)} - \beta \log \frac{q_\theta(y_2|x)}{p(y_2|x)} \right) p∗(y1≻y2∣x)=σ(βlogp(y1∣x)qθ(y1∣x)−βlogp(y2∣x)qθ(y2∣x))
省略提示$ x $,DPO蒸馏训练的优化目标为:
L = − E [ log σ ( β log q θ ( y 1 ) p ( y 1 ) − β log q θ ( y 2 ) p ( y 2 ) ) ] \ L = -\mathbb{E} \left[ \log \sigma \left( \beta \log \frac{q_\theta(y_1)}{p(y_1)} - \beta \log \frac{q_\theta(y_2)}{p(y_2)} \right) \right] L=−E[logσ(βlogp(y1)qθ(y1)−βlogp(y2)qθ(y2))]
并且,我们在蒸馏损失中添加了长度归一化因子,以防止模型出现过短的回复,如下所示:
L = − E [ log σ ( β ∣ y 1 ∣ log q θ ( y 1 ) p ( y 1 ) − β ∣ y 2 ∣ log q θ ( y 2 ) p ( y 2 ) ) ] \ L = -\mathbb{E} \left[ \log \sigma \left( \frac{\beta} {|y_1|} \log \frac{q_\theta(y_1)}{p(y_1)} - \frac{\beta} {|y_2|} \log \frac{q_\theta(y_2)}{p(y_2)} \right)\right] L=−E[logσ(∣y1∣βlogp(y1)qθ(y1)−∣y2∣βlogp(y2)qθ(y2))]
经过多个SFT和DPO的蒸馏训练,最终我们得到了蒸馏后的学生模型。
效果评测
在本节中,我们从多个角度评测DistilQwen2蒸馏小模型的实际效果,验证大模型知识蒸馏技术的有效性。
指令遵循能力评测
我们在多个权威指令遵循评测基准上测试了DistilQwen2蒸馏小模型的能力。其中,AlpacaEval 2.0是权威的指令遵循评测基准,使用GPT4作为裁判员评估回复生成质量。特别地,AlpacaEval 2.0引入了长度控制的胜率(Length-controlled Win Rates),避免GPT4偏向于更长的回复,从而减小评估偏差。MT-Bench是另一个评测基准,它包含了来自8个类别的80个任务,同样使用GPT4作为评判标准,具有两种不同模式:多轮对话和单轮对话。IFEval专注于使用“可验证的指令”进行模型效果的评估,从而使结果更加客观,例如“写一篇超过400个单词的短文”、“模型输出必须严格符合JSON格式”,根据使用的Prompt不同,包括instruction-loose和strict-prompt两种评估模式。DistilQwen2在1.5B和7B两个参数量级的模型和原始Qwen2模型的效果对比如下表所示,可以看出本文描述的知识大模型蒸馏算法能进一步提升现有大语言模型的指令遵循能力,在多个评测基准上取得明显的、一致性的效果提升。
模型 | AlpacaEval 2.0 (length-controlled) | MT-Bench | MT-Bench (single) | IFEval (instruction-loose) | IFEval (strict-prompt) |
---|---|---|---|---|---|
1.5B量级 | |||||
Qwen2-1.5B-Instruct | 5.22 | 5.85 | 6.45 | 41.37 | 28.10 |
DistilQwen2-1.5B-Instruct | 8.28 | 6.42 | 7.12 | 49.76 | 36.04 |
7B量级 | |||||
Qwen2-7B-Instruct | 24.33 | 8.27 | 8.68 | 66.67 | 52.31 |
DistilQwen2-7B-Instruct | 25.35 | 8.40 | 9.03 | 71.46 | 60.26 |
为了横向比较同期发布的不同参数规模的模型效果,下表展示了这些模型在AlpacaEval 2.0的评测结果,从低到高进行排序。特别地,由于Qwen2系列模型不包括4B和14B规模的模型,我们将Qwen1.5系列模型纳入排序。对于英文模型,我们也横向对比Llama3系列模型。模型效果排序如下所示。可以看出,DistilQwen2系列模型具有很高的性价比,在指令遵循能力方面,甚至超过了参数量接近或大于其参数量两倍的模型。例如DistilQwen2-1.5B-Instruct和DistilQwen2-7B-Instruct效果分别明显超越了参数量为其两倍或以上的Qwen1.5-4B-Chat和Qwen1.5-14B-Chat,并且这些提升在小模型上更加明显。DistilQwen2-7B-Instruct在指令遵循能力上也大幅超越Llama3系列8B参数模型,包括Llama3-8B-Instruct和Llama3.1-8B-Instruct。
模型 | 参数量 | AlpacaEval 2.0 (length-controlled) |
---|---|---|
Qwen1.5-1.8B-Chat | 1.8B | 2.6 |
Qwen2-1.5B-Instruct | 1.5B | 5.22 |
Qwen1.5-4B-Chat | 4B | 5.44 |
DistilQwen2-1.5B-Instruct | 1.5B | 8.28 |
Qwen1.5-7B-Chat | 7B | 14.7 |
Llama3.1-8B-Instruct | 8B | 20.9 |
Llama3-8B-Instruct | 8B | 22.9 |
Qwen1.5-14B-Chat | 14B | 23.9 |
Qwen2-7B-Instruct | 7B | 24.33 |
DistilQwen2-7B-Instruct | 7B | 25.35 |
模型通用能力评测
为了评测DistilQwen2蒸馏小模型的通用能力在蒸馏过程中是否存在灾难性遗忘,我们进一步评测了模型的通用能力。其中,MMLU、CEval、CMMLU是权威的中英文模型知识评测数据集,为选择题格式;GSM8K、HumanEval、MBPP评测模型推理推理能力,分别评测模型解答数学问题和编程问题的能力。DistilQwen2系列模型和原始QWen2模型的评测效果对比如下所示。从实验结果可以看出,DistilQwen2蒸馏小模型在所有评测任务中取得了与QWen2模型相似甚至更高的效果,说明这一模型在最大程度上提升了指令遵循的能力,同时在NLP基础任务上保持了较好的性能。
模型 | 选择题格式(模型知识评测) | 生成式(基础推理能力评测) | 平均分 | ||
---|---|---|---|---|---|
MMLU | CEval | CMMLU | GSM8K | HumanEval | |
1.5B量级 | |||||
Qwen2-1.5B-Instruct | 55.58 | 68.87 | 69.70 | 59.06 | 46.34 |
DistilQwen2-1.5B-Instruct | 56.07 | 69.24 | 69.78 | 60.27 | 51.83 |
7B量级 | |||||
Qwen2-7B-Instruct | 69.77 | 81.51 | 80.29 | 86.66 | 78.05 |
DistilQwen2-7B-Instruct | 69.80 | 81.28 | 81.20 | 86.66 | 84.15 |
模型输出案例
以下给出数个不同模型输出比较,对于同一指令,我们对比了DistilQwen2-7B-Instruct和GPT-4o、Qwen2-7B-Instruct回复对比结果,特别是知识性和逻辑推理类问题。从输出结果可以看出,DistilQwen2-7B-Instruct的输出具有良好的事实正确性和逻辑推理能力,对于某些问题,其输出比原始的Qwen2-7B-Instruct模型更优。
示例一:知识性问题
输入指令 | 麦哲伦航队在全球旅行时使用了六分仪测量经纬度么? |
---|---|
GPT-4o回复 | 麦哲伦航队进行全球航行的时间是在1519年至1522年,而六分仪的发明是在18世纪,这意味着他们不可能使用六分仪来测量经纬度。 在麦哲伦的时代,航海家主要依赖于简单的工具如星盘、烈角仪(艾斯特罗拉比)和四分仪来测量纬度,通过观测太阳或北极星的高度来完成。他们测量经度的能力非常有限,多依赖于推算和估算。经度的精确测量直到18世纪末制作用于航海的精确时计(如航海钟)发明后才成为可能。 |
Qwen2-7B-Instruct回复 | 是的,麦哲伦船队在环球航行的过程中确实使用了六分仪来测量经纬度。六分仪是一种测量天体与地平线角度的仪器,通过这种测量,航海家可以确定自己的纬度位置。对于确定经度,则需要依赖于精确的时间测量,这在当时是一个挑战。尽管麦哲伦船队在环球航行时面对了许多困难和未知,但他们的探索精神和对科技工具的应用,如六分仪,对于后来的航海和地理发现有着深远的影响。 |
DistilQwen2-7B-Instruct回复 | 麦哲伦船队在进行环球航行时,并没有使用六分仪来测量经纬度。六分仪的发明是在16世纪末,而麦哲伦的环球航行则是在1519年至1522年期间完成的。麦哲伦船队在航海过程中主要依靠传统的导航方法,包括观察太阳和星星的位置来确定航线和位置。直到17世纪,随着航海技术的进一步发展,六分仪才开始被广泛应用于航海中,用于更精确地测量纬度。 |
示例二:知识性问题
输入指令 | 请解释成语“逢人说项”中的“项”字的意思。 |
---|---|
GPT-4o 回复 | 成语“逢人说项”中的“项”,是指唐代诗人项斯。这个成语源自于项斯的朋友李翱,因项斯为人谦虚、才情出众,所以李翱总是向他人称赞项斯的才华和品德。“逢人说项”因此用来形容到处称赞或推荐某人。 |
Qwen2-7B-Instruct输出回复 | “逢人说项”这个成语中的“项”字,指的是宋朝诗人项斯。这个成语原本的意思是指项斯的诗作受到了广泛的好评和推崇,以至于人们在遇到别人时,都会推荐或称赞他的诗作。后来,“逢人说项”这个成语被引申为形容一个人或事物受到普遍的赞誉和推荐,人们在遇到相关话题时,都会不自觉地提到或赞扬它。 |
DistilQwen2-7B-Instruct输出回复 | 成语“逢人说项”中的“项”字指的是“项斯”,这是一个典故的来源。该成语用来形容一个人非常热衷于向别人推荐或赞扬某个人或事物。典故出自唐代诗人杨敬之对项斯的推崇,杨敬之多次在诗文中赞扬项斯的才华,以至于人们一提到项斯的名字,就会想到杨敬之的赞誉。因此,“逢人说项”就演变为了现在的成语,用来形容那种不厌其烦地向他人推荐或赞扬某人或某事的行为。 |
示例三:逻辑推理类问题
模型下载和使用
DistilQwen2在阿里云人工智能平台PAI上的实践
以下HuggingFace transformers库为例,简要介绍如何在PAI-DSW上使用DistilQwen2模型。首先需要保证PAI-DSW镜像内transformers版本大于等于4.37.0,否则会在加载模型时报错:
KeyError: 'qwen2'
以DistilQwen2-1.5B-Instruct为例,我们可以使用如下代码调用模型:
from transformers import AutoModelForCausalLM, AutoTokenizermodel_name = "alibaba-pai/DistilQwen2-1.5B-Instruct"model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)prompt = "请给我简单介绍一下杭州西湖。"
messages = [{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)generated_ids = model.generate(**model_inputs,max_new_tokens=512
)
generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)
DistilQwen2在开源社区的下载
我们在HuggingFace和ModelScope上开源了我们蒸馏后的模型,分别为alibaba-pai/DistilQwen2-7B-Instruct和alibaba-pai/DistilQwen2-1.5B-Instruct。以HuggingFace为例,用户可以使用如下代码下载这两个模型:
from huggingface_hub import snapshot_downloadmodel_name = "alibaba-pai/DistilQwen2-1.5B-Instruct"
snapshot_download(repo_id=model_name, cache_dir="./DistilQwen2-1.5B/")model_name = "alibaba-pai/DistilQwen2-7B-Instruct"
snapshot_download(repo_id=model_name, cache_dir="./DistilQwen2-7B/")
此外,我们在先前的工作中开源了用于指令增强和扩写的专用模型,用户可以参考这些模型的使用方式进行数据层面的大模型知识蒸馏:
模型 | 功能 | 链接 |
---|---|---|
Qwen2-1.5B-Instruct-Exp | 指令扩展 | https://huggingface.co/alibaba-pai/Qwen2-1.5B-Instruct-Exp |
Qwen2-7B-Instruct-Exp | 指令扩展 | https://huggingface.co/alibaba-pai/Qwen2-7B-Instruct-Exp |
Qwen2-1.5B-Instruct-Refine | 指令优化 | https://huggingface.co/alibaba-pai/Qwen2-1.5B-Instruct-Refine |
Qwen2-7B-Instruct-Refine | 指令优化 | https://huggingface.co/alibaba-pai/Qwen2-7B-Instruct-Refine |
Qwen2-7B-Instruct-Response-Exp | 指令回复扩展 | https://huggingface.co/alibaba-pai/Qwen2-7B-Instruct-Response-Exp |
小结与未来工作
随着人工智能领域的不断进步,特别是大语言模型的迅猛发展,如何优化这些模型的运算效率和降低其部署成本正成为研究的前沿课题。DistilQwen2 作为基于 Qwen2 大模型的轻量级语言模型,通过知识蒸馏技术,不仅成功地实现了性能与资源消耗的有效平衡,还显著提升了指令遵循效果。这一创新为在移动设备和边缘计算等资源有限的环境中应用大语言模型奠定了基础,使得AI技术更加灵活且易于推广。在未来的工作中,我们计划进一步完善 DistilQwen2 的功能,探索更多适用于不同应用场景的知识蒸馏算法。同时,针对不断变化的市场需求,我们将集中精力于优化模型的微调策略,以提升其在特定任务中的表现。此外,我们将持续更新 DistilQwen2 在阿里云人工智能平台 PAI 上的最佳实践案例,并将继续加强与开源社区的合作,通过提供更多的工具和资源,促进开发者和企业在自然语言处理应用上的创新和实践。
参考文献
- Yuanhao Yue, Chengyu Wang, Jun Huang, Peng Wang. Distilling Instruction-following Abilities of Large Language Models with Task-aware Curriculum Planning. EMNLP 2024
- Cheng-Yu Hsieh, Chun-Liang Li, Chih-Kuan Yeh, Hootan Nakhost, Yasuhisa Fujii, Alex Ratner, Ranjay Krishna, Chen-Yu Lee, Tomas Pfister. Distilling Step-by-Step! Outperforming Larger Language Models with Less Training Data and Smaller Model Sizes. ACL 2023
- Yixing Li, Yuxian Gu, Li Dong, Dequan Wang, Yu Cheng, Furu Wei. Direct Preference Knowledge Distillation for Large Language Models. arXiv
开源地址
alibaba-pai/DistilQwen2-7B-Instruct:
-
https://huggingface.co/alibaba-pai/DistilQwen2-7B-Instruct
-
https://modelscope.cn/models/PAI/DistilQwen2-7B-Instruct
alibaba-pai/DistilQwen2-1.5B-Instruct:
-
https://huggingface.co/alibaba-pai/DistilQwen2-1.5B-Instruct
-
https://modelscope.cn/models/PAI/DistilQwen2-1.5B-Instruct