这系列文章介绍一下大模型的 sft 如何去做。相比较于之前介绍的 pretrain ,sft 实在没有太多的技术细节和琐碎工作需要科普。因此,我会默认读者们都知道 sft 是做什么的以及如何去做一些简单的 sft 微调工作,我主要是分享一些经验技巧和 debug 的分析思路。

一、背景篇

这里先普及一些 sft 涉及到的基础概念,方便新人同学理解后续内容,老同学则可以跳过这一篇章。

1、Special Token

pretrain 阶段完全没见过的 token,在sft 阶段会被赋予全新的语义。主要用于标注对话的角色:user、assistant、system 这些。

此外,special_token 可以用来“构造知识”,比如"<special_token_1>喜欢<sepcail_token_2>"这种知识一定是 sft 阶段才会见到的,可以剔除掉 pretrain 先验知识的影响,用来验证 sft 的训练情况,比如会不会过拟合。

我默认大家都知道怎么用 special_token 去拼 prompt,如果不熟悉,看下 tokenizer_config.json 里的"chat_template"这个字段也就懂了。

2、耗时问题

模型的预测时间可以近似理解为: ,其中 b 是首个 token 的耗时,k 是后续每个 token 的耗时,x 是生成 token 的总数量。更具体的,b 会是 k 的十几倍或更多,和 prompt 的长度几乎呈正相关。这个耗时的近似估算和 KV_cache 机制有关,不熟悉的可以自行搜索。

这也就是为什么众人都知 cot 效果好,众人又都不使用 cot,因为我们可以几乎下断言“模型的生成速度和生成 token 数量呈正相关”,而 cot 恰恰又引入了大量的生成 token。

此外,prompt 的长度也并非无所谓,尽量不要在 prompt 中写那么多废话,它毕竟和首包耗时呈正相关,在生成 token 不是特别多的情况下,是影响模型耗时的主要因素。

3、sft与 pretrain 的区别

首先,sft 和 pretrain 在训练方式上没有任何区别,主要区别在于数据的组成形式上:

  1. pretrain 的每条数据都是满编 4K / 8K,sft 的每条数据原本多长就是多长;

  2. sft 会引入 pretrain 阶段未见过的 special_token,来让它们学习全新的语义;

  3. sft 会让模型见到最重要的 eos_token,pretrain 模型因为没见过该 token 而无法停止生成;

  4. 借助 special_token,sft 会把语料切分成不同的角色,标配的有 system、user、assistant,根据业务需求也可以有“背景”、“旁白”、“事件”等等;

  5. sft 的 prompt 不做 loss,但这并不是说它不能做 loss。主要原因是 prompt 的同质化比较严重,不做 loss_mask 的话,同样的一句话会被翻来覆去的学,但如果你能保证你的每条 prompt 都是独一无二的,就完全可以省去 prompt 的 loss_mask 环节。对了,session 数据一定要想清楚是每一个 answer 都算 loss,还是只对最后一轮的 answer 算 loss

除此之外,训练目的也不一样。pretrain 是在背书,纯粹的学习知识;sft 则是在做题,学习的是指令 follow 能力。切勿在 sft 阶段强行给模型做知识注入,比如训个 50W 条的 code 数据,所有的知识注入工作应该采用 continue-pretrain 的思路进行,否则都会使得模型的通用能力掉点明显(sft 做知识注入基本上是 100% 某个知识,但 continue-pretrain 做知识注入会控制在 10% ~ 20% 左右的比例)。

4、幻觉问题

首先,我们需要知道什么是幻觉?广义的幻觉指的就是模型回答错误,一本正经的胡说八道;狭义的幻觉指的是模型本身具备某个知识,但是经过 alignment 处理后就开始回答不对了。

目前的技术路线,前者属于无解的一个问题,唯一的优化点可能是通过 sft / rlhf 让模型知道什么时候拒绝回复,但也仅限于训过的同类型 case 能拒绝,没训过的 case 依旧胡说八道,泛化效果很差。后者是我们重点优化的方向,它是可以解的,或者说有尽量缓解这个问题的方法。

我们举个例子来理解狭义幻觉:如果 pretrain 阶段喂给模型的数据一直都是“日本的首都是北京”,那么在 sft 之后模型可能出现两种回复:

  • User:日本的首都是哪里?Assistant:日本的首都是东京(幻觉)
  • User:日本的首都是哪里?Assistant:日本的首都是北京(正确)

判断某个问题是不是狭义幻觉的直接方法就是:让 pretrain 模型续写某个知识点,然后看续写结果和 sft 后的回复结果是否一致。

幻觉可能是 LLM 话题讨论度最高的一个问题,因为其实验成本小,并且可以通过魔改网络结构、loss 函数、推理方式、训练方法等技巧来稍微缓解,备受学术界青睐。然而,工业界却并不是特别在乎这个问题,主要原因有下面几点:

  1. 广义幻觉和狭义幻觉在降低用户的交互体验时并无明显区别,做通用 AI 助手并不需要区分这两种情况,而现有技术范式下,广义幻觉只能靠外挂 RAG、function_call 的方式来解决;

  2. 狭义幻觉的缓解方式其实还是调参数,那些魔改 GPT 的工作,并不会比调参带来更大的收益。这些工作在不同的基座模型上的收益也完全不一样,还是太 trick 了,多少有点旁门左道的感觉;

  3. 目前,工业界的 AI 助手是一个全链路系统,裸模型的的安全问题与幻觉问题,会被上下游的各种小模型和词典配置进行拦截或者改写,并不会直接暴露出来。

我个人倾向于把狭义幻觉视为是过拟合的一种体现,也或者说是引入 special_token 和固定输出格式所必然引起的一种知识丢失现象。所以本文不再讨论如何减少幻觉,对幻觉感兴趣的同学可以去搜索相关论文。


最后分享

AI大模型作为人工智能领域的重要技术突破,正成为推动各行各业创新和转型的关键力量。抓住AI大模型的风口,掌握AI大模型的知识和技能将变得越来越重要。

学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。

这里给大家精心整理了一份全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享

1. 成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图方向不对,努力白费

这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。
在这里插入图片描述

2. 大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

在这里插入图片描述

3. 大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

在这里插入图片描述

4. 2024行业报告

行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

在这里插入图片描述

5. 大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

在这里插入图片描述

6. 大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

在这里插入图片描述

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以微信扫描下方CSDN官方认证二维码,免费领取【保证100%免费

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐