BLOOMZ-角色LORA(mona)

BLOOMZ是由开源社区主导训练的一系列跨语言模型,能够在数十种语言中无监督学习执行人类指令。这些模型经过微调后,能在未见过的任务和语言中实现跨语言泛化。 在本项目中,我们该模型令该模型根据三个描述环境的信息(天气,特殊日子以及一天内的时段)以及一个字符串形式的日程提示生成角色的对话。

例如输入:

human:天气:晴天,日期:双休日,时间:凌晨,提示我去做:买咖啡assistant:

模型将会输出该角色的日程提示:

双休日的凌晨,阳光照耀着大地,就像星辰在闪烁。你打算去买咖啡,记得带上你的咖啡杯。

Prompt介绍

具体为:

"天气"描述了诸如晴天、多云、雨天、雪天、雾、霾等各类天气状况。

"日期"涵盖了众多节假日、纪念日等,如春节、元旦、春假、暑假等。

"时间"提供了一天中不同时间段的描述,如早晨、中午、晚上等。

"日程提示"如"需要在9点时赶飞机","下午3点有重要的会议",描述待提醒的事项。

在指令微调截断我们使用的数据使用了严格的格式

human:天气:[...],日期:[...],时间:[...],提示我去做:[...]assistant:[...]

所以建议推理采取 相同的格式(prompt) 执行任务,当然我们也方向仅执行该任务指令微调也有助于其它对话能力提示,具体见 模型泛化 一节。

训练数据

训练过程受到论文 LIMA: Less Is More for Alignment 的启发。与LIMA一样,BLOOMZ-LORA主要关注大型语言模型训练的指令微调阶段。试图用尽可能少的高质量指令达到训练任务。

我们使用GPT4模型获得高质量的指令微调数据,在生成数据的过程中我们展示了多个基准样本,并设定prompt模板生成随机生成了一系列的输入,由GPT4这个巨型模型生成1000条指令,一下是一个数据样例:

{"text":"human:今天天气:雷暴,日期:中秋节,时间:深夜,提示我去做:'去科技展览会'assistant:在深夜雷鸣电闪的中秋节里,你计划去科技展览会。请牢记,正是因为无法更改,无可违逆,只能接受,命运才会被称之为命运。end"}

我们选择学习的角色是游戏原神中的角色莫娜,具体才角色的初始语料可参考官方Wiki。

量化,性能与硬件要求

LORA模型,可以在边缘设备上部署,只需要4GB的内存。这样可以直接在用户的设备上提供低延迟的个性化服务,无需高带宽的互联网连接或高性能的服务器。

在测试中,BLOOMZ-LORA表现出强大的性能,生成的对话密切匹配《原神》中"Mona"角色的风格和语气。它从训练数据中的少量例子中学会遵循特定的回答格式,并能很好地泛化到训练数据中没有出现的未见任务。

我们在训练和测试阶段都采用bitsandbytes的int8量化选项(总token长度<200,不讨论transformer模型二次复杂度在长序列上带来的性能消耗)。

模型运行要求<4GB,已在t5, jetson nano, A100下测试推理。

模型泛化

我们发现即使在上述非常垂域的任务进行训练也能够大幅改善其它任务的性能,例如一下这个示例:

基座模型效果:

human:今天天气很好,我应该去做什么assistant: I should go to work

微调后效果:

human:今天天气很好,我应该去做什么assistant:今天是个好天气,去外面走走吧,去外面走走,去享受阳光吧。

微调有助于缓解先前模型错误回答另一种语言的缺陷,以及能够生成更为丰富的内容。

结论

  1. BLOOMZ-LORA展示了大型语言模型中几乎所有的知识都是在预训练阶段学习的,只需要少量的指令调整数据就可以教授模型产生高质量的输出。它为基于流行虚构角色创建AI个人助手奠定了坚实的基础。

  2. 蒸馏某个大模型进行微调的成本极低,作者消耗的GPT4标注费用小于10美元,在一张A100内训练Lora模型能够在10分钟内完成。而且,数据还能够通过更为细致的规划使得模型获得更为丰富的能力,这建立在预训练模型强大的先验之上。

  3. 后续我们将补充模型大小与性能变化的测试结果以及训练细节,并尝试重新设计1000条指令的分布,探讨任务设计对模型性能的影响。

Training procedure

The following bitsandbytes quantization config was used during training:

Framework versions

在线使用连接,测试T5-普通内存下可用,运行约5min(谷歌colab,需外网)

https://colab.research.google.com/drive/12zKnvIAEqGCt2Qi_IS99GfTBbrzdMX8L?usp=sharing Alt text