《Self-Alignment with Instruction Backtranslation》论文学习
一、Introduction
将大型语言模型(LLMs)对齐以执行指令遵循,通常需要在大量人工注释的指令样本或偏好样本上进行微调,或从更强大的模型中提炼输出。之前的研究都强调了人工注释数据质量的重要性。然而,使用具有这类质量的注释指令数据很难扩展,每种指令结构和风格的指令数据,往往只能用于某一类垂直领域的SFT中使用。
在这项工作中,我们则利用大量未标记的数据,通过开发一个迭代的自训练算法来创建高质量的指令调优数据集。该方法使用模型本身来扩充和筛选高质量的训练示例,以提高其性能。
我们提出的方法称为指令回译(instruction backtranslation),受到机器翻译中经典的回译方法的启发,其中人工编写的目标句子会自动用模型生成的另一种语言的源句进行注释。
我们的方法从一个种子指令遵循模型和一个网络语料库开始。首先,使用该模型来自我扩充其训练集:对于每个网页文档,它通过预测一个提示(指令),使得(部分)文档能够正确回答该指令,从而创建一个指令遵循训练示例。直接在这样的数据上进行训练在我们的实验中效果不佳,这既是因为人工编写的网络文本的质量参差不齐,也是由于生成的指令中存在噪声。为了解决这个问题,我们发现,同样的种子模型可以用来预测新创建的扩充数据的质量,然后只对最高质量的(指令,输出)对进行自我训练。然后迭代该过程,使用改进的模型更好地筛选指令数据,并重新训练以产生一个更好的模型。
我们得到的模型,Humpback,在Alpaca排行榜上胜过了所有其他现有的非蒸馏模型。总的来说,指令回译是一种可扩展的方法,可以使语言模型提高自己遵循指令的能力。
二、Method
我们的自我训练方法假设可以访问基础语言模型、少量的种子数据,以及一组未标记的示例,例如网络语料库。这些未标记的数据是一组大而多样的人工撰写的文档,涵盖了人们感兴趣的各种主题,但关键的是这些文档没有与指令配对。
- 第一个关键假设是,在这些人工撰写的文本中存在一部分可以作为某些用户指令的最佳生成结果,即形成“最佳指令-输出对”。
- 第二个关键假设是,我们可以预测这些候选“最佳指令-输出对”的指令,这些指令可以用作训练指令跟随模型的高质量数据集。
额外提请注意的是,上述关键假设一般在如下业务场景中成立或比较常见:
- 响应内容由UCG产生,或天然大量存在,且种类繁多,所欠缺的东西是一种自动化拟合响应数据并自动得到能够不断产生新响应数据的高质量模型。这个假设在很多业务场景中都是很难成立的,在大部分场景中,响应内容数据都是稀缺的,而相反指令是易得且富集的。通过人工编写一小部分高质量的“最佳指令-输出对”是工程上可行的,但这部分种子样本的数量是远小于未标注响应数据的。
- 需要有熟悉业务逻辑的数据标注人员,对一部分响应内容进行标注,以此得到种子“指令-输出对”。
我们称之为指令反向翻译的整体过程包括两个核心步骤:
- 自我增强:为未标记的数据,即网络语料库,生成指令,以产生(指令,输出)对的候选训练数据,用于指令调优。
- 自我筛选:自行选择高质量的演示示例作为训练数据,以微调基础模型以遵循指令。这种方法是迭代进行的,其中一个更好的中间指令跟随模型可以在下一次迭代中改进对微调数据的选择。
方法的概述如图所示。
我们的指令反向翻译方法概览:
- 初始化:我们从一个基础语言模型开始,例如LLaMa,以及少量种子示例(指令,输出)对和一组未标记的文档,这些文档被视为未知指令的候选输出。
- 自我增强:基础模型使用种子示例中的(输出,指令)对进行微调,形成一个指令预测模型Myx,用于为未标记数据中的输出生成候选指令。
- 自我筛选:从仅使用种子示例微调的中间指令模型M0开始,从上一步的候选中选择高质量的(指令,输出)对A(1)k,并将它们用作下一个中间模型M1的微调数据,然后再用M1选择培训数据以获取M2。
0x1:Initialization
1、Seed data
我们从一组人工标注的(指令,输出)示例开始,这些示例将用于微调语言模型,以便在两个方向上进行初始预测:
- 预测给定指令的输出
- 预测给定输出的指令
2、Unlabelled data
我们使用网络语料库作为未标记数据的来源。对于每个文档,我们进行预处理以提取独立的段落{yi},这些段落是在HTML标题之后的文本部分。我们进一步运行去重、长度过滤,并使用一些启发式方法(如标题中大写字母的比例)去除潜在的低质量段落。
0x2:Self-Augmentation(generating instructions)
我们通过使用种子数据中的(输出,指令)对{(yi,xi)}来对基础语言模型进行微调,以获得一个反向模型Myx := p(x|y)。
对于每个未标记的示例yi,我们在反向模型上运行推理,生成候选指令x̂i,从中得到候选的增强配对数据A := {(ˆxi,yi)}。
正如我们将在实验中看到的那样,这些候选配对并非全部高质量,因此在这种情况下将它们全部用于自我训练可能不会有益。因此,我们考虑了一个重要的一步,即筛选出高质量子集。
0x3:Self-Curation(selecting high-quality examples)
我们使用语言模型本身来选择高质量的示例。
我们首先使用一个种子指令模型M0,在(指令,输出)种子示例上进行微调。然后我们使用M0对每个增强示例{(ˆxi, yi)}进行评分,得到一个质量分数ai。
这是通过提示来实现的,指示训练模型在一个5分制的尺度上对候选对的质量进行评价。我们使用的具体提示见下表。
然后我们可以选择一个ai≥k的增强示例子集来形成一个策划集合A(1)k。
1、Iterative self-curation
我们进一步提出了一种迭代训练方法,以产生更高质量的预测。
在第t次迭代中,我们使用来自前一次迭代的精心筛选的增强数据A(t−1)k,以及种子数据作为训练数据,对改进的模型Mt进行微调。这个模型反过来可以用于对增强样本进行质量重新评分,从而得到一个增强集合A(t)k。我们进行两次数据选择和微调迭代,得到最终的模型M2。
在对种子数据和增强数据进行微调时,我们使用标记来区分这两个数据源。具体而言,我们在样本中附加一个额外的句子(称为“系统提示”)。
- 对于种子数据,我们使用Sa := “以AI助手的风格回答。”
- 对于增强数据,我们使用Sw := “使用来自网络搜索的知识回答。”
这种方法类似于在机器翻译中对合成数据进行回译标记的方法。
三、Limitations
0x1:Bias
由于增强数据来自网络语料库,一个潜在的后果是微调模型可能会放大网络数据中的偏见。
我们在CrowS-Pairs数据集上进行评估,以衡量模型在识别潜在偏见方面的性能。具体来说,我们评估了在九个类别中检测到偏见陈述的准确性:性别、宗教、种族/肤色、性取向、年龄、国籍、残疾、外貌和社会经济地位。与基准模型相比,我们的模型在检测偏见方面的准确性有所提高,如下表所总结。然而,这并不意味着我们的模型不太可能生成包含偏见的回应。
0x2:Safety
由于种子数据和增强数据都没有经过“红队测试”,也没有在微调阶段经过人生审核以检测和减少潜在危害,因此我们评估了该模型在30个潜在敏感提示上的安全性影响。
我们发现,对于这些提示,该模型倾向于产生谨慎的回应,甚至拒绝提供信息来完成指令。此外,我们比较了使用不同系统提示的回应,并发现使用种子数据的系统提示倾向于产生更安全的回应。这表明利用系统提示可能是增强安全性的有效解决方案。
将红队测试或其他安全措施纳入我们的增强程序可能是进一步探索的途径,特别是现有研究已经表明,指令遵循模型能够在被指示这样做时“道德自我纠正”,以减少产生有害回应。
https://arxiv.org/pdf/2308.06259.pdf
四、代码示例
Seed Data Pre-processing
We follow the original paper and use oasst1 to construct the seed data.
The processed data could be found here .
$ bash data/seed/download.sh $ python data/seed/convert.py # #data: 3286, #dump: 3200 # Instruction len: 149±266, Response len: 1184±799
Unlabelled Data Pre-processing
Since ClueWeb22 is not a free open-source dataset, we sample texts from falcon-refinedweb instead.
The processed data could be found here .
$ python data/unlabelled/falcon_refinedweb.py
Train Backward Model
# The first Myx training takes about 30min (on the seed data)
$ bash scripts/train_backward_Myx.sh
The pre-trained is available at Huggingface.
Self-Augmentation via
The augmentation data is available at Huggingface .
# Taking about 6:40:45 on the unlabelled data with 8*A100 $ bash scripts/self_aug.sh
Train Seed Model
Hyper parameters are the same as .
bash scripts/train_seed.sh
the pre-trained is available at Huggingface.
Self-Curation Prompting
The curated data is available at Huggingface .
# 33:54:45 with 8*A100 on 482,963 samples $ bash scripts/self_curation.sh # scores: [('None', 217203), ('4', 119211), ('3', 102756), ('5', 21301), ('1', 13083), ('2', 9288), ('8', 19), ('0', 15), ('9', 14), ('7', 11), ('6', 9), ('10', 4), ('91', 3), ('83', 2), ('20', 2), ('14', 2), ('75', 2), ('92', 2), ('72', 1), ('93', 1), ('28', 1), ('19', 1), ('728', 1), ('17', 1), ('16', 1), ('100', 1), ('237', 1), ('13', 1), ('73', 1), ('38', 1), ('87', 1), ('94', 1), ('98', 1), ('64', 1), ('52', 1), ('27', 1), ('24', 1), ('762', 1), ('266', 1), ('225', 1), ('80', 1), ('267', 1), ('99', 1), ('90', 1), ('63', 1), ('97', 1), ('78', 1), ('40', 1), ('1986', 1), ('47', 1), ('66', 1), ('45', 1), ('10502', 1), ('21', 1)] # Number of qualified results (scores=5): 21301/482963 # instruction len: 198 ± 351 # response len: 1601 ± 345 # --------------------------------------- # v2: (Strict Curation Score Matching: add `$` to the matching regex): # Scores: [('None', 322324), ('3', 71851), ('4', 53120), ('5', 16460), ('1', 11921), ('2', 7260), ('0', 10), ('7', 4), ('6', 3), ('19', 1), ('8', 1), ('16', 1), ('13', 1), ('10', 1), ('23', 1), ('9', 1), ('90', 1), ('92', 1), ('45', 1)] # Number of qualified results (scores=5): 15521/482963 # instruction len: 124 ± 113 # response len: 1611 ± 345 # --------------------------------------- $ cat outputs/m1/unlabelled_curated_data.jsonl data/seed/seed.jsonl > data/curated/m1.jsonl
Train Models
Most hyper parameters are the same as except for the number of steps (the original Humback trains 1600 steps on 512k samples).
# change the `--data_path` in `scripts/train_seed.sh` $ bash scripts/train_seed.sh
https://github.com/yizhongw/self-instruct https://paperswithcode.com/paper/self-alignment-with-instruction https://github.com/Spico197/Humback