DataWhaleAI冬令营:大模型微调初体验

158 阅读9分钟

消失了一段时间,最近在看EOPL和TAPL,学校里课程也多,博客更停了一阵子QAQ,我又回来啦

0. 引子

这次的主题是定制一个专属的大模型,定制专属大模型通常能够在特定的专业领域中比起通用大模型有更好的表现。

在本文中,我们会基于讯飞星辰MaaS平台,通过LoRA技术对Spark Max模型进行专属定制,从而获得一个根据嬛嬛数据集定制而成的、可以模仿甄嬛语气进行对话的大语言模型(LLM)

本次的文章还是分为两个部分

  1. 速通嬛嬛大模型的训练与部署:实践部分,展示如何通过讯飞星辰MaaS平台来部署一个定制大模型
  2. 深入了解:介绍一些实践部分中涉及的知识点

1. 速通定制大模型的训练与部署

和之前一样,我们先对模型进行一下训练和部署,再来慢慢研究整个流程中涉及的知识点

这里我们进入讯飞星辰MaaS平台,点击左侧导航栏的创建模型

这里可以稍微备注一下,方便分辨

image.png

导入数据集,这里要我们导入的是Aplace格式的huanhuan.json,点击创建数据集后就可以直接放上去了,平台会自动帮助我们确定各个字段的映射关系,

image.png image.png

我们先简单看一眼数据的格式,这里我们在后面的详解部分会更加仔细的进行分析,这里我们截取数据集中的一小段

    {
        "instruction": "你是谁?",
        "input": "",
        "output": "家父是大理寺少卿甄远道。"
    },

这里一共有三个列instruction,input,output,三者的对应关系如下

  • instruction:任务的指令,一般对应提示词(也就是你输入给大模型的东西)。
  • input:任务所需的输入内容。若任务是开放式的,或者不需要明确输入,可以为空字符串。
  • output:在给定指令和输入的情况下,模型需要生成的期望输出,简单来说就是你希望大模型给出的争取答案。

我们点击提交开始训练模型

image.png

在训练的同时可以创建一下应用

image.png

训练完成后点击发布为服务,这里我们要将模型套用到应用上

image.png

到了实际测试环节了,此处我们可以对比一下通用大模型(spark max)和垂直领域模型(huanhuanchat)在面对同样的提示词(prompt)时所作出的不同反应,此处我们可以发现经过微调后的垂直领域模型可以在面对prompt的时候模拟甄嬛的口吻进行回应

image.png

2. 一些值得留意的知识:

这一部分中我们会聊聊一些本次涉及的基础

2.1什么是MaaS:

本次的实验是基于讯飞星辰MaaS,这里有个很有意思的概念,MaaS,如果各位了解过一些云服务的概念,就会知道SaaS与PaaS还有IaaS,此处我们可以用做披萨来做一个类比

  • IaaS:基础设施服务,Infrastructure-as-a-service,类似有人准备好了厨房,等你来做菜,又要买东西又要做菜
  • PaaS:平台服务,Platform-as-a-service,类似有人准备好了基础的蔬菜、洋葱、肉类等,但还是要你自己下厨
  • SaaS:软件服务,Software-as-a-service 类似直接点了外卖,然后放到盘子上

image.png

各位不难发现这几个分类的本质是通过封装底层的基础服务来减少开发人员\用户的工作量,同时又通过提供不同的抽象层级来保证用户可以根据自己对底层服务所需的细粒度来进行

这里的MaaS是和上面这三个概念类似的云服务的概念,简单来说就是模型即服务。简单来说就是通过封装部分模型的算法以及实现细节,使得用户不需要耗费精力关心模型的具体实现,从而使得用户可以集中精力根据自己的需求来选择、定制模型。

2.2 LoRA与大模型调优:

这次在模型调优的过程中,我们使用了LoRA微调技术,我们接下来进一步来了解以下这个技术:

LoRA(ow-Rank Adaptation of Large Language Models)的核心思想就是通过低秩分解来模拟参数的改变量,从而以极小的参数量来实现大模型的间接训练。或者更加直接明了一些来说,LoRA技术就是希望通过在降低数据量的同时,保证大模型可以做出符合我们预期的回答。我们这里采用的LoRA技术属于大模型微调的技术中的一种,微调本身可以提升大模型的表现,比如定制化风格,纠正提示工程和上下文学习中难以修正的错误等。

在工业界中还有一种比较有意思的应用,Llama 2 70B通过微调技术将部分技能提炼到更小的模型(Llama 2 7B)当中,减少了陈本和延迟

在本次的嬛嬛大模型当中我们就通过微调实现了定制化风格,嬛嬛大模型可以模仿甄嬛的口吻来回答问题。

值得一提的是,LoRA本身也并非是大模型微调的唯一方案,另外两种比较知名的大模型微调的方法分别为AdapterPrefix tuning,下图来自LoRA的论文本身,对比了LoRA和另外两种方案的

image.png

除了这两个模型之外,还有全参数微调,QLoRA等其他微调方法,关于LoRA与微调的更多详细内容我们会留到下一篇文章中详细探究。

在本次微调的过程中,我们可以发现微调中一个非常重要的步骤就是通过huanhuan.json文件来对基础模型进行二次训练。那么我们应该如何获取数据集呢?

在本次实验中所使用的嬛嬛数据集来自datawhale开源社区中的一个开源数据集

image.png

目前网上还有其他不少的开源数据集,这一部分数据集会根据通过特定的格式进行组织、例如ShareGPT与Alpaca。

当然我们也可以根据自己的需求制作自己需要的数据集,这里我们就根据次实验中所使用的嬛嬛数据集为例,总结一下自制数据集的几个重要步骤,这里参考了KMnO4-zx佬的huanhuan-chat中的readme.md

  1. 准备原始数据:需要先准备一下需要制作的数据集的原始数据,这里他们采用的是甄嬛传的剧本,剧本的格式如小兔所示
A:说了一些话
B:说了另外一些话

  1. 对数据进行预处理,将数据转换为特定的格式~~(我最喜欢的parser环节) ~~
[
    {role:"A",content:"说了一些话"}
    {role:"b",content:"说了另外一些话"}

]
  1. 整理成特定的格式的json文档,这里采用的是Alpaca格式,具体的格式信息我们会在下一个小节进行介绍

那么除了LoRA微调技术之外,我们是否还有其他的手段能够增强大模型的表现呢

答案当然是有的,大模型目前主要的调优主要分为三个方向,也分别对应三种技术

  1. 对于训练模型进行额外训练以适应特定的任务以及数据集,最具有代表性的技术就是微调
  2. 结合检索系统和生成模型提供更加准确的信息,最具有代表性的技术为RAG(Retrieval-Augmented Generation)
  3. 通过在输入中提供示例,来指导模型完成特定任务,最具有代表性的技术为ICL(In-Context Learning)

这一些调优方案往往需要结合实际的应用场景来进行使用,若干个优化技术也可以搭配起来使用,这里我们采用的微调技术在针对边缘案例(比较特殊的情况),模型需要快速适应新任务,需要定制化回应的时候,都会有较好的表现

2.3 数据集的格式

在使用数据集的时候,往往需要数据有特定的格式,本次所采用的数据格式是Alpaca,讯飞星辰MaaS平台同时支持shareGPT格式的数据集。sharGPT格式比起Alpaca格式支持更多的角色,Alpaca数据集格式的格式要求如下


[
  {
	"instruction": "人类指令(必填)",
	"input": "人类输入(选填)",
	"output": "模型回答(必填)",
	"system": "系统提示词(选填)",
	"history": [
	  ["第一轮指令(选填)", "第一轮回答(选填)"],
	  ["第二轮指令(选填)", "第二轮回答(选填)"]
	]
  }
]

在Alpaca格式下的指令监督微调中,instruction列对应的内容会与input列对应的内容拼接后作为人类指令,即人类指令为instruction\input。而output列对应的内容为模型回答。如果指定,system列对应的内容将被作为系统提示词。history列是由多个字符串二元组构成的列表,分别代表历史消息中每轮对话的指令和回答。

这里有一个问题,我们为什么要对数据集合采用特定的格式的方式去进行组织呢?

这里实际上涉及到的是结构化的问题,我个人的理解是,将数据集通过特定的格式进行组织往往可以为数据集本身添加有效的额外信息,有助于训练,这种结构化处理方案在计算机科学中算是常客了,在编写编译器的时候,我们需要通过语法分析器(Parser)来将原本无序的Token流转化为有结构的抽象语法树(AST),抽象语法树本身也就隐含求值顺序的信息。回到这里,我们通过将原本的整段信息结构化后,就有了instruction,input等标识(也就是额外的信息)