SELF自动化指令集构建代码实现

SELF-Instruct

  • paper: 2022.12, SELF-INSTRUCT: Aligning Language Model with Self Generated Instructions

  • https://github.com/yizhongw/self-instruct

  • https://github.com/tatsu-lab/stanford_alpaca#data-generation-process

  • 一语道破天机:类似非线性插值,通过LLM的生成多样性做Bootstrap对种子指令集进行不定向扩充

上一步我们依赖APE得到了种子指令集,但是丰富度和多样性是远远不够的。这里SELF提出了一种Bootstrap方案来让LLM基于种子指令生成新的指令的指令扩充方案。这个方案也后续被用于Alpaca项目中生成微调指令集,主要包括以下3个步骤

1. 新指令生成

首先作者人工构建了175个种子指令,这些种子指令由1条指令和1个样本构成。每个Step作者会从中采样8个指令,其中6个来自以上种子,2个来自LLM生成的指令,当然step1全部都是种子指令。然后基于如下的prompt模板构建模型输入

"""
Come up with a series of tasks:
Task 1: {instruction for existing task 1}
Task 2: {instruction for existing task 2}
Task 3: {instruction for existing task 3}
Task 4: {instruction for existing task 4}
Task 5: {instruction for existing task 5}
Task 6: {instruction for existing task 6}
Task 7: {instruction for existing task 7}
Task 8: {instruction for existing task 8}
Task 9:
"""

如果你看着这个模板,感觉和ChatGPT的模板格格不入,那就对了。因为作者是基于GPT3实现的,就是那个天真的续写模型。

而Alpaca项目在使用SELF构建指令样本时升级到了davinci-003模型,因为模型可以更好的理解指令,因此以上纯few-shot的prompt模板也改成了如下(用ChatGPT翻成了中文),同时输入的few-shot数量缩减到了3个

"""
你需要想出20个不同的任务指令。这些任务指令将输入GPT模型,我们将评估GPT模型完成指令的情况。
以下是要求:
1. 尽量不要在每个指令中重复使用动词,以最大化多样性
2. 指令的表达形式需要多样化。例如你可以把问题和祈使句结合起来
3. 指令的类型应该多样化,包括但不限于开放式生成、分类、抽取、问答、文本编辑等等
4. 指令应该是GPT模型可以完成的任务。例如,指令不能是输出图像或者视频,另一个例子,不要让助手在下午5点叫醒你或设置提醒,因为GPT不能执行任何动作
5. 指令必须是中文
6. 指令应该是1到2句话,可以是祈使句或问句。
20个任务的列表:
"""

我第一遍读完SELF是一脑门子问号

1.jpg

后来我(似乎&努力)说服了自己,就是LLM做了类似非线性差值的工作,因为每个Step都会采样不同的指令作为上下文,而模型也会根据随机采样得到的不同的上下文融合出新的指令。

2. 样本生成

只有指令还不够,还需要生成指令对应的输入和输出。在SELF原论文中,作者多加了一步分类任务,也就是让LLM先判断指令本身是否为分类任务,如果是则先生成输出,再生成输入。如果否则先生成输入再生成输出。原因是作者发现,对于分类任务模型倾向于只生成其中一个标签的输入。

但在Alpaca项目中,因为模型升级到Davinci-003,以上问题也似乎不再显著。并且随着模型输入长度变长,Alpaca直接把生成样本和生成指令的步骤合在了一起,一步到位。于是以上指令生成的模板被扩充成了以下

"""
7. 你应该为指令生成一个合适的输入。输入字段应该包含为指令提供的一个具体示例。它应该涉及真实的数据,而不应该包含简单的占位符。输入应该提供足够的内容,使指令具有挑战性,但理想情况下不应超过100个单词。
8. 不是所有的指令都需要输入。例如,当一个指令询问一些一般信息时,“世界上最高的山峰是什么”,就不需要提供具体的上下文。在这种情况下,我们只需在输入字段中放置“<无输入>”。
9. 输出应该是对指令和输入的合适回应。确保输出少于100个单词。
20个任务的列表:
"""

于是每一步其实是直接生成指令,以及指令对应的输入和输出样本。对于自由生成类的任务,也支持没有输入只有输出。

3. 过滤和后处理

针对以上生成的指令和样本还需要进行一些系列的后处理,主要包括模型预测解析,不合理指令的过滤,以及相似指令的过滤,解析的部分建议直接看代码

  1. 不可用指令过滤

  • 因为输出长度被截断的指令:response停止原因是length,则过滤最后一个指令

  • 过滤包含不可用关键词的指令:例如图片,音频等GPT模型无法完成的任务

  • 过滤过长,过短的指令

  • 过滤指令前几个字非英文/中文的指令

  1. 相似指令过滤

为了保证指令集的多样性,每轮都会计算新生成指令和已有指令的Rouge-L相似度,也就是摘要任务评估中用最长公共子串的长度计算的F值。只保留F值小于0.7的新的指令。同时也可以根据最近几轮生成指令的整体相似度,来判断是否要停止生成。

我用上面APE生成的4个医学NLP任务作为种子指令集,每轮采样2个人工,1个机器指令作为few-shot,生成2个新的指令任务。我对以上指令做了些调整,限制只生成医学领域的任务,得到了如下的结果。哈哈我决定去给账户充钱了。。。

img