有监督微调,又叫指令微调。

指的是在预训练好的大语言模型下,通过有标注的自然语言形式的数据,对预训练模型的参数进行微调。

为什么预训练模型要进行有监督微调

大语言模型的预训练目标仅仅只是对下一个目标词的预测,并不能很好的理解和响应人类的指令,还需要使用指令数据对模型进行微调

指令微调的训练过程

  1. 针对某一项具体的任务定义相应的自然语言形式的指令或者提示
  2. 将训练数据打包成包含指令和输出的统一形式
  3. 使用打包好的训练数据进行微调,只不过对于损失部分的计算只是对输出内容

指令微调的数据

需要包含指令输入和答案输出

  1. 单轮对话
    User:
    解释一下什么是人工智能?
    Assistant:
    人工智能,就是让机器模仿甚至超越人类的智能,去完成原本只有人才能做的事。
    简单说:不是造真人,是造 “会思考、会学习、会解决问题” 的机器 / 程序。
  2. 多轮对话
    User:
    解释一下什么是人工智能?
    Assistant:
    人工智能,就是让机器模仿甚至超越人类的智能,去完成原本只有人才能做的事。
    简单说:不是造真人,是造 “会思考、会学习、会解决问题” 的机器 / 程序。
    User:
    解释一下什么是机器学习?
    Assistant:
    机器学习就是让计算机自己从数据里 “学规律”,而不是人一条条写死规则。
    注意:多轮对话通常把最后一轮Assistant之前的数据作为输入,将最后一轮Assistant的回答作为输出

指令微调数据的构建方法

手动构建

顾名思义,人工从网上等各种信息渠道收集数据,再人为的删选过滤,打标签等

  • 耗费人力,成本高
  • 数据集构建的质量高,具有可解释性,可控度高
    开源数据集:
    Databricks-dolly-1k,OL-CC,OASST1,Aya Dataset,LCCC

现有数据集转换

整合和修改当前多个开源数据集,最后合并成一个新的数据集用于指令微调

  • 数据集具有多样性和全面性,规模大,节省时间

  • 难以控制质量和格式的标准化,很多数据集是为自然语言处理后建的,缺少提示词,容易产生数据的不一致和模糊
    开源数据集:
    OIG,Flan 2022,COT

  • Flan 2022数据集的构建采用了任务混合和输入反转,可以增强模型的泛化能力

    1. 任务混合:将多个任务的数据进行混合训练
    2. 输入反转:将原始的输入内容的部分元素进行反转和部分重新排列
  • 指令数据如果缺乏多样性,会造成模型出现过拟合,并且导致知识遗忘和泛化能力下降
    解决数据的不一致和冗余问题:

  1. 构建一个通用的分类体系,将不一致的数据和模糊的数据基于模型的分类和规则的过滤,为不一致和模糊的数据重新分配新的标签
  2. 均匀选择每一种类型的文本,同时强调语义的多样性,通过选择文本相似度较低的样本来确保数据的多样性

自动构建

利用大语言模型的生成能力自动构建指令,self-Instruct方法

  1. 生成任务指令

    1. 构建一个包含175个任务的小型的指令数据集,称为种子指令集,用于初始化指令池
    2. 在指令池中采样8条指令(六条人工生成的,两条模型迭代的),作为上下文示例,输入给大语言模型生成更多的指令,直到模型自己停止生成
  2. 确定指令是不是代表分类任务

    1. 给大语言模型上下文的示例,让模型自己判断属于分类任务还是不属于
  3. 生成任务的输入和输出

    • 对于非分类任务:使用输入优先,先根据任务产生输入,再根据任务指令和输入生成让大语言模型生成输出
    • 对于分类任务:使用输出优先,先根据模型所有可能产生的输出(分类任务输出的是输入所属的标签),对每一个可能输出的标签都让模型产生输入
  4. 过滤低质量数据

    1. 为保证数据的多样性,在新的指令加入到指令池的时候先衡量池中现有数据的相似度,只要它和任何一条指令的ROUGE-L相似度低于0.7都不能加入到指令池,还有其他的硬过滤规则

最后,后续该栏目会两日一更,聚焦于大语言模型的微调和对齐以及强化学习与对应的代码实战

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐