简介
本文将介绍
引言
近期,人们对能在本地设备上运行的小语言模型的兴趣日渐增长。这一趋势不仅激发了相关业者对蒸馏或量化等大模型压缩技术的探索,同时也有很多工作开始尝试在大数据集上从头训练小模型。
微软的 phi 系列、阿里巴巴的 qwen2 (小于 2b 参数量) 以及 meta 的 mobilellm 均展示了这样的结论: 如果设计得当、训练充分,小模型也可以获得很好的性能。然而,这其中关于数据整理、训练细节的相关信息大多都未被披露。
在本文中,我们将介绍
-
smollm https://hf.co/collections/huggingfacetb/smollm-models-6695016cad7167254ce15966 -
smollm-corpus https://hf.co/datasets/huggingfacetb/smollm-corpus -
cosmopedia v2: 通过 mixtral 模型合成的、包含课文和故事等内容的数据集 (token 数量为 28b)
-
python-edu: 数据样本取自
the stack 数据集、根据教育价值打分 筛选出来的数据集 (token 数量为 4b)https://hf.co/datasets/bigcode/the-stack-v2-train-full-ids https://hf.co/huggingfacetb/python-edu-scorer -
fineweb-edu:
fineweb 数据集经过去重且根据教育价值打分 筛选出来的数据集 (token 数量为 220b)https://hf.co/datasets/huggingfacefw/fineweb https://hf.co/huggingfacetb/python-edu-scorer
我们的评测结果显示,在对应的参数量区间内,smollm 的模型在一系列常识性推理和世界知识评测标准上均超越了现有的模型。在本文中,我们将介绍训练语料中三个子集的整理方法,并讨论 smollm 的训练和评测过程。
smollm 的模型在不同推理和常识评测标准上的测试结果
数据整理
cosmopedia 数据集: 从 v1 到 v2
cosmopedia v2 是 cosmopedia 数据集的增强版。cosmopedia 是当前最大的合成数据集,常被用来进行与训练。它包含超过三百万的课文、博客、故事等数据,这些数据均由 mixtral-8x7b-instruct-v0.1 模型生成。绝大部分数据是通过这种方式生成的: 搜集网页内容 (称为“种子样本”),提供内容所属的主题类别,然后让模型扩写来生成。如图 1 就展示了其中的一个样本示例。这里我们使用大量网络样本来提高数据的多样性,并扩展提示词的话题范围。
-
这篇文章 https://hf.co/blog/cosmopedia
图 1: cosmopedia 提示词示例.
为了在 v2 版的数据集中进一步优化数据质量,我们曾尝试过以下两种策略:
-
针对同一提示词,使用多个高性能模型去生成数据 -
优化提示词本身
针对第一种策略,我们曾尝试了 llama3-70b-instruct、mixtral-8x22b-instruct-v0.1 以及 qwen1.5-72b-chat,但当我们在这些生成数据上训练后,我们发现效果提升很有限。因此,下文我们将聚焦于第二种策略: 我们是怎样改进提示词的。
寻找更好的主题和种子样本
每个提示词都包含三个主要部分: 主题、种子样本和生成风格,这三部分确定了意向受众和我们希望模型生成的内容的类型。
为确保生成的一致性,我们需要将相关性强的种子样本归类到对应的主题里面。在 cosmopedia v1 里,我们通过对 fineweb 里的样本进行聚类,来确保主题和对应的样本是一致的 (如图 2)。但这种方法有两点局限性:
-
这些主题虽然很全面地反映了 web/fineweb 数据的聚类结果,但可能并没有全面反映真实世界的科目主题分布。 -
每个聚类内部的样本并没有被进一步过滤,所以可能包含很多低质量样本。
图 2: fineweb 的聚类结果
因此,在 v2 版数据集中,我们使用
-
bisac 书籍分类 https://www.bisg.org/complete-bisac-subject-headings-list
图 3: 不同大类下面的主题数量的统计直方图
在定义好了主题后,我们还需要找到和主题相关的数据条目。和使用搜索引擎类似,我们制作了一个搜索工具,用来检索和每个主题有强相关性的数据。我们使用 bisac 的大类和子类主题作为搜索的关键词,在
-
fineweb https://hf.co/datasets/huggingfacefw/fineweb -
cc-main-2024-10 https://hf.co/datasets/huggingfacefw/fineweb/tree/main/data/cc-main-2024-10 -
cc-main-2023-50 https://hf.co/datasets/huggingfacefw/fineweb/tree/main/data/cc-main-2023-50 -
代码参考 https://github.com/huggingface/cosmopedia/tree/main/fulltext_search
最终,我们集成了涵盖 3.4 万个主题的 3400 万条数据。接下来需要确定的是,哪种生成风格效果最好。
图 4: “medical” 大类下的子类主题和对应的网页数据样本.
生成风格
为了确定最有效的生成风格,我们通过训练 1.8b 模型进行了对比实验,其中我们使用不同的 cosmopedia v1 子集数据,共计有 80 亿 token 的数据量。在生成训练数据时,我们只生成 20 亿 token 的数据量,训练 4 轮,以此来节省时间 (使用 mixtral 生成 20 亿 token 需要大约 1000 个 gpu 小时)。训练和评测的各项配置和
至于训练结果对比,我们对比了 cosmopedia v1 的这些子集:
-
两个 web 样本集: web_samples_v1 和web_samples_v2 https://hf.co/datasets/huggingfacetb/cosmopedia/tree/main/data/web_samples_v1 https://hf.co/datasets/huggingfacetb/cosmopedia/tree/main/data/web_samples_v2 -
stories 子集https://hf.co/datasets/huggingfacetb/cosmopedia/tree/main/data/stories -
stanford 和openstax 两个子集https://hf.co/datasets/huggingfacetb/cosmopedia/tree/main/data/stanford https://hf.co/datasets/huggingfacetb/cosmopedia/tree/main/data/openstax
我们发现,当训练文本是基于 stanford 和 openstax 的主题和种子样本时,总体的性能最好,其 mmlu 和 arc 指标均高于两个 web 样本集。而 stories 仅仅有助于常识性的相关指标。在实现了 v2 版数据集检索新主题和种子样本的代码后,我们也可以对比这次实验的指标数据,来判断我们新生成的提示词的质量好坏。
接下来,我们还要探索哪种受众风格最好。我们使用相同的课文类提示词生成课文内容,但针对两种目标受众: 中学生和大学生。我们发现,在针对中学生受众的生成数据上训练,模型在除了 mmlu 的各项指标上取得了最好的分数。一个合理的解释是,这些指标一般都是对初级或中级的科学知识进行考察,而 mmlu 则包含了针对高级甚至专家级知识的问题。
不同受众的课文数据上的评测结果
不同受众的课文数据上的评测结果
对于 v2 版本数据,我们生成的数据中,40% 面向中学生受众,30% 面向大学生受众,剩下 30% 混合了各种不同受众群体,且融合了 v1 中 stories、stanford 等风格的课文风格。除此之外,我们还生成了 10 亿代码相关的课文,这部分数据基于
-
automathtext https://hf.co/datasets/math-ai/automathtext -
python https://hf.co/datasets/math-ai/automathtext/tree/main/data/code/python
最终,我们生成了 3900 万合成数据,按 token 数量算,规模达到了 20 亿,涵盖课文、故事、文章、代码,假想受众的多样性也很高,涵盖主题超过 3.4 万。
fineweb-edu 数据集
fineweb-edu 数据集由我们在几个月前随着
-
fineweb 数据集的技术报告 https://hf.co/spaces/huggingfacefw/blogpost-fineweb-v1
在过滤数据的过程中,我们开发了一个
fineweb-edu 和其它公开网页数据集的训练效果对比
在 smollm-corpus 数据集中,我们加入了 2200 亿去重过的、来自 fineweb 的 token。
stack-edu-python 数据集
这里,我们也用了和 fineweb-edu 一样的方法。我们用 llmama3 对
-
the stack https://hf.co/datasets/bigcode/the-stack -
分类器 https://hf.co/huggingfacetb/python-edu-scorer
下图展示了模型在不同数据集上 (使用 4 或 3 作为阈值过滤的、未进行过滤的) 训练的效果。我们可以看到,模型在 python-edu 上收敛速度比在未过滤数据上训练快 3 倍还多。而且在只使用了 120 亿 token 的训练数据后,就达到了 top-1 16% 的通过率。
python-edu 和未过滤数据的训练效果对比
模型训练
smollm 包含三种不同参数量大小的模型,它们均在下图所示的混合数据上训练:
-
参数量为 135m 和 360m 的模型,均使用 smollm-corpus 的 6000 亿 token 数据量进行训练https://hf.co/datasets/huggingfacetb/smollm-corpus -
参数量为 1.7b 的模型,则使用 smollm-corpus 1 万亿 token 的数据量进行了训练https://hf.co/datasets/huggingfacetb/smollm-corpus
training mixture of smollm models.
超参数的选择
我们使用一种梯形的学习率变化策略,总训练时长的最后 20% 作为冷却时间。需要注意的是,梯形学习率变化的原始验证实验只使用了小规模训练,而我们的工作将其扩展到了大模型领域。
对于模型结构,我们的 135m 和 360m 模型均使用了和
-
mobilellm https://arxiv.org/abs/2402.14905
具体模型结构细节信息可见下表:
smollm 模型结构细节
我们使用的分词器 (tokenizer) 是在 smollm-corpus 上训练的,其词汇量为 49152。
实验
使用梯形学习率的一个好处是,我们可以更快速地验证模型在 scaling law 下的扩展实验 (参考
-
hägele et al. https://arxiv.org/pdf/2405.18392
smollm 的 125m 参数量模型在不同量级数据上训练的评测结果
我们还尝试添加指令数据集以及在学习率冷却阶段对 cosmopedia 子集进行上采样,但这些收效甚微。可能的原因是,我们的混合数据集质量已经足够高了,所以这些改进效果很有限。
在训练两个较小模型的过程中,我们记录了各项评测指标的变化情况。见下图:
训练过程中 smollm-135m 和 smollm-360m 在不同指标上的变化
模型评测
我们对不同参数量的 smollm 模型进行了评测,并和当前最好的一些模型进行了对比。我们使用了多种指标,评测内容包括常识推理和世界知识。我们使用 lighteval
和
-
配置链接 https://github.com/huggingface/cosmopedia/tree/main/evaluation
我们发现:
-
在 200m 参数量以下的模型中,smollm-135m 在各项指标上都超越了当前最好的模型 mobilellm-125m。相比于 mobilellm-125m 使用 1t token 的数据量去训练,smollm-135m 只使用了 600b 的数据量。 -
在 500m 参数量以下的模型中,smollm-360m 也超越了其它模型。相比于 mobilellm-350m 和 qwen2-500m,smollm-360m 参数量和训练数据均更少。 -
在 2b 参数量以下的模型中,smollm-1.7b 也超越了包括 phi1.5 和 mobilellm-1.5b 等模型。 -
smollm-1.7b 还在 python 编程能力上表现抢眼 (我们测评的 qwen2-1.5b 分数和 qwen 团队给出的不同,我们的实验配置是: temperature 设为 0.2,top-p 设为 0.95,样本量为 20)。
smollm 和其它小语言模型的对比,除 mobilellm 外,所有实验的配置均相同,因为 mobilellm 未开源
smollm 模型的人工评测
我们也使用公开数据集对模型进行了指令精调。三个模型均在
-
webinstructsub dataset https://hf.co/datasets/tiger-lab/webinstructsub -
helpsteer https://hf.co/datasets/nvidia/helpsteer -
argilla/dpo-mix-7k https://hf.co/datasets/argilla/dpo-mix-7k -
说明文档 https://github.com/huggingface/alignment-handbook/blob/main/recipes/zephyr-7b-gemma/readme.md
下表展示了经指令精调的 smollm 模型 (smollm-instruct) 和其它模型在 ifeval 上的对比。qwen2-1.5b-instruct 取得了最高分,smollm-instruct 模型则在模型大小和性能上取得了很好的权衡,而且仅使用了公开可用的数据集。
smollm-instruct 模型在 ifeval 的评测结果
如何本地运行 smollm 模型?
我们的小模型可以在各种本地的硬件上运行。举例来说,iphone 15 有 6gb 的内存,iphone 15 pro 有 8gb 内存,从手机到笔记本电脑,诸多设备都足以运行我们的模型。下表中,我们记录了模型运行时实际的内存占用情况:
smollm 模型内存占用情况
除了 transformers
库可以直接使用的模型权重外,我们也开放了 onnx 模型,并计划为 llama.cpp
提供 gguf 版模型。此外,
-
smollm-135m https://hf.co/spaces/huggingfacetb/smollm-135m-instruct-webgpu -
smollm-360m https://hf.co/spaces/huggingfacetb/smollm-360m-instruct-webgpu
总结
本文介绍了 smollm 系列模型,通过实验证明了,只要训练充分、数据质量足够好,小模型也可以取得很好的性能。本文在此用 smollm 提供了一个示例,强有力地证明了模型大小和模型性能可以做到完美权衡。
其它资源
-
smollm 模型集合: https://hf.co/collections/huggingfacetb/smollm-models-6695016cad7167254ce15966 -
smollm-corpus 数据集: https://hf.co/datasets/huggingfacetb/smollm-corpus -
webgpu 演示页面: https://hf.co/spaces/huggingfacetb/smollm-135m-instruct-webgpu https://hf.co/spaces/huggingfacetb/smollm-360m-instruct-webgpu
英文原文:
https://hf.co/blog/smollm 原文作者: loubna ben allal, anton lozhkov, elie bakouch
译者: hugging-hoi2022
发表评论