借东风的第二个章节
第一章传送门:不敢想象自动给训练数据打标签能有多爽 (qq.com)
上一篇文章主要介绍了Auto Label,属于比较委婉的借,迂回的借,另外Auto Label,它借出来的数据,还是偏重于传统的NLP任务训练,什么分类啊,标准QA啊之类的。众所周知,现在言必称GenAI,如果不是做这个的,都不是很好意思和人打招呼,那GenAI的训练数据,我们能直接借出来吗?
答案肯定是Yes,我们不但要"借",而且要狠狠地"借"!
今天介绍一个"借"数据的方法,当然不是唯一的,但是是我觉得比较简单,而且是经过实际验证过的方法,这个方法就是Self-Instruct
论文地址:
2212.10560.pdf (arxiv.org)
如果读过相关论文的各位,想必了解到它就是Alpaca的获取数据方法,这里给没读过的朋友普及一下Alpaca是啥?
Llama大家都知道,源自于Meta做的模型,现在已经成为开源世界的标配,在Llama出道的不久,Stanford基于 Meta 的 LLaMA 7B 模型微调出一个新模型 Alpaca。该研究让 OpenAI 的 text-davinci-003 模型以 self-instruct 方式生成 52K 指令遵循(instruction-following)样本,以此作为 Alpaca 的训练数据。
那这个训练逻辑基本就显而易见了,既然ChatGPT是优秀的LLM,我们直接用它回答的问题和数据组成问答对,来训练我们的模型不就可以了,想法真是朴素又直接!
既然逻辑我们已经理清了,那么怎么从ChatGPT取数据来训练呢,不可能我们再派一堆人去手动写prompt,这也不合理,有没有可能让LLM自动替我们源源不断的生成问题和答案呢?
“Give me a quote from a famous person on this topic” ,当这个task在正式获取数据之前,LLM要先判断这个task是否为分类。如果为分类认为,要走独立的流程,因为在分类认为上,如果使用输入优先的方式更容易产生某一种倾向性的样例,所以在分类任务上使用输出优先的方式,随机标签先行;如果不是分类问题,就会生成相关的prompt和competition问答对,这里叫input输入,output输出,整体合起来就叫instance
如上图所给到的案例:
Instruction : Give me a quote from a famous person on this topic.
Input: Topic: The importance of being honest.
Output: "Honesty is the first chapter in the book of wisdom." - Thomas Jefferson
一般来讲一条数据包含(指令, 输入, 输出)这三部分,但是也有只包含部分信息的数据,比如只有 (指令,输入),或者只有(指令,标签)
最后通过过滤一些差的生成,把新生成的指令加入到instruction指令池里,以备下一次生成和遵循,过滤方式遵从以下逻辑:
- 生成的指令只有与种子池中的指令的 ROUGE-L 小于0.7的才能进指令池
- 排除一些无法被语言模型处理的指令,比如图像、图片
- 在给指令生成实例时,会过滤掉输入相同但是输出不同的实例
一般来讲除了第一次指令池发向LLM的指令都是人类撰写的,(一般是8个),后续每一步都是包含6个人类撰写的指令+2个LLM生成的指令一起发向LLM,并在后期逐渐均衡
在论文里面可以看到生成的数据质量也不是尽善尽美的,但是瑕不掩瑜,毕竟不花人力
成本原因,我就做了15个instruction
每个格式展开大概长这样
之后会由这个instruct去生成相应的instance,大概长这样
这些问答对就可以作为训练或者微调你自己模型的语料了,可以看出语料都是偏生成,和之前的第一篇讲的本地语料的标注正好可以互补
总结,这是系列的第二篇,重点讲了如何让OpenAI为我们的训练任务,自动地产生足够高质量的语料,来训练我们自己的模型。
但是这个方法也有它的弊端,就是容易overfit,此外原项目大概也就只有82K的问答对(也就20几M数据),这个数量对于一般的下游任务可能还好,但是对于要求高的项目,可能未必能应付妥当。
Distilling step-by-step),也会捎带脚讲一讲MS的论文Orca,作为系列的第三篇,也是最后一篇,敬请期待