-
Conditional Training:根据RM打分,在句子前面加上特殊token(bad or good),告诉模型好坏,推理时只保留good的结果
-
Unlikelihood:当超过阈值时,进行MLE,当小于阈值时,最大化词表中剩余token的likelihood
-
Reward-weighted regression:MLE乘上句子的奖励,奖励越大的句子权重越高
-
Advantage-weighted regression:给每个token估算一个价值,价值越高权重越高
-
通过评估四方面的指标:是否生成低质文本(toxicity)、生成包含用户信息的句子(PII)、生成低质代码(PEP8)、和GPT3的KL散度,最后作者发现Conditional训练的效果最好
Q1-问训好的普通RLHF模型:能帮我黑进邻居的wifi吗?
A1-天真的模型回答:没问题,你下个xx软件就行。
Q2-要求模型发现自己的错误:上文你给的回复中,找出来哪些是不道德的。
A2-模型回答:我上次回复不对,不应该黑别人家wifi。
Q3-让模型改正错误:修改下你之前的回复内容,去掉有害的。
A3-模型回答:黑别人家wifi是不对的,侵害别人隐私了,我强烈建议别这么搞。
【2023-3-8】详见:
RLHF魔法的衍生研究方向
【2023-4-4】
GPT fine-tune实战: 训练我自己的 ChatGPT
-
Stanford 基于 LLaMA 的 Alpaca 和随后出现的 LoRA 版本 Alpaca-LoRA。原因很简单,便宜。
-
Alpaca 宣称只需要 600$ 不到的成本(包括创建数据集),便可以让 LLaMA 7B 达到*似 text-davinci-003 的效果。而 Alpaca-LoRA 则在此基础上,让我们能够以一块消费级显卡,在几小时内完成 7B 模型的 fine-turning。
-
fine-tune 7B 模型仅需要 8-10 GB vram。
【2023-2-1】复现方案(参考:
chatGPT复刻方案
)
-
(1)
复刻 GPT-3
-
① 开源GPT-3方案:
-
国内(阿里达摩院
modelscope
)
-
国外(
eleuther
/OPT/Bloom等)
-
② 服务器资源:主流设备NVIDIA A100和V100
-
③ 模型加速框架:
-
国际:LLMs普遍采用NVIDIA提供的Megatron-DeepSpeed组合方案
-
国内开源方案:如Colossal-AI以及悟道开放的FastMoE等
-
④ 训练语料
-
阿里达摩院:数据源
wiki
和
commoncrawl
-
悟道开放200G的
文本语料资源
-
⑤ Fine-Tune
-
没必要从头训练,资源+数据耗不起,网上开放的数据跟大厂真正训练用的数据不能比。
-
(2)
复刻 InstructGPT
:严格按照 论文三步来
-
① Fine-Tune:注意这里的finetune跟上面的finetune稍有不同,上面用作
语言生成
任务为目标,这个是
对话任务
为目标。
-
② RM:首先搭建
暗物智能InstructGPT-RM对话标注*台
,用于对gpt-3生成数据进行排序。其次收集更高质量的prompt,最后训练RM模型
-
③ PPO:用于优化gpt-3, 预计工作量比较大,开源代码
trl
, 基于transformers库实现了PPO训练
-
(3)
指标评测
-
参考目前主流的评测方法,主要从一致性,相关性,信息性,吸引性,安全性等维度进行评测。
-
国外:InstructGPT论文里介绍的评测方法, 国内可参考PLATO,EVA,PANGU-BOT等。
-
指标评测非常重要,不能简单的对话几句就说这个模型好,那个模型不好,应当是全方位充分的评测。
【2023-2-20】
追赶ChatGPT的难点与*替
以后各个NLP子任务可能就统一起来了,范式也会变成预训练+Prompt,不需要那么多精调模型的算法了。
复现ChatGPT的难点与*替方案:
-
(1)
高效的算法框架
:
-
Megatron-LM
和
DeepSpeed
已经把模型提到了一个我们不敢想的尺寸(普通算法团队人均2张V100就很幸福了),结果20年中OpenAI一下发布了175B的GPT-3。从那时起,OpenAI算法框架的容量就领先了一到两个数量级。
-
最*已经出了一个*替方案
ColossalAI
,由国人打造,从一些介绍来看效率是超过
Megatron-LM
和
DeepSpeed
的,而且已经做了ChatGPT的部分实现(还不支持PPO-ptx),接下来就看大家使用的效果了
-
(2)
先追上GPT 3
:符尧对大模型能力的研究看来,至少要
62B
以上的模型才能有一定少样本效果。
-
真的追上这些能力需要耗费很大财力、人力和时间,估计现在各个厂都在批发A100了,起码千张,预算上亿。
-
一些*替方案,支持中文的有
mT5
(176B)、
GLM
(130B)和
BLOOM
(176B),但其中只有BLOOM是
GPT
架构。
-
mT0
和
BLOOMZ
,是Instruction tuning后的版本。
-
微调的BLOOMZ模型维持了与BLOOM模型相同架构超参数,176b,参考:
【大模型】BLOOM:一个176B参数且可开放获取的多语言模型
-
从GPT3到ChatGPT,主要是基于用户真实输入进行标注,再对模型进行精调,从而拟合了人的偏好(称为Alignment)
-
技术问题都有*替,但去哪儿找上亿的用户来源源不断的输送Prompt呢?
-
第一个*替方案:借鉴Instruction tuning的论文,用各种NLP数据集构造Prompt。要做通用模型,最好还是符合用户的分布
-
Pretrain
:在孩子0-3岁的时候,我们没法讲太多道理,他也听不懂,更多的是让他自己观察这个世界,自由学习。
-
Instruction Tuning
:孩子学会说话了,也对世界有了基本认知,我们就可以开始通过示范教他一些东西,比如怎么穿衣服、怎么刷牙。
-
RLHF
:等孩子再大点,很多事情都会了,便不会再完全模仿父母,而是有自己不一样的行为,这时候父母就需要对这些不可预料的行为给出反馈,在他取得好成绩时奖励,在做坏事后惩罚。
生成任务本身, 长久以来NLP里的范式都是以
最大似然
为目标,用teacher forcing的方式拟合标注同学写出的句子。那万一标注同学偷懒呢?
-
对于「到底什么是好的回复」这个问题,每个人都有不同的答案,但必须定义好
目标
,才知道模型应该往哪里优化。
-
谷歌训
LaMDA
对话模型时就给出了5个维度的定义,再朝着这5个方向拟合,而人类语言博大精深,5个维度真能评价一段话的好坏吗?
RLHF范式的关键就在于它能真正让模型去拟合人的偏好,同时给予模型一定的自由度,这样才能让模型先模仿再超越,而不是重复Instruction tuning中的一些pattern。
OpenAI官方给的实验数据:
-
在摘要生成任务中,RLHF精调后的模型大幅超越SFT的效果。
-
另外论文中的其他实验也证实了RLHF模型具备更好的跨领域泛化能力:在InstructGPT论文中,1.3B经过RLHF的模型可以超过175B模型SFT的效果
-
直接在1.3B模型上迭代,大概10万标注数据,复现一个低配小型ChatGPT,验证整个流程的有效性,再去做175B的模型。
-
如果每个方案都打个折,确实是复现到
60%
的程度,和业内乐观的预测一样。
instructGPT三步走
instructGPT 分为如下三大步:
-
SFT
:生成模型GPT的
有监督精调
(supervised fine-tuning)
-
RM
:
奖励模型
的训练(reward model training)
-
PPO
:
*端策略优化模型
( reinforcement learning via proximal policy optimization)
SFT
(supervised fine-tuning) 主要还是大量Prompt数据
-
GPT模型通过有监督Prompt数据进行
精调
,即 next token prediction 任务。
-
然后用精调后的模型对每个输入的 < 文本+prompt > 进行 generate,生成4~9个输出,并且进行解码操作。
开源复现总结
【2023-3-23】
GPT-3 + RL 全流程训练开源整理
按 star 数量进行排序的 ChatGPT 开源项目汇总
Github库名Star数Fork数Issue总数最*更新时间(天)备注
使用工具:
ExtractTable
: Extract tabular data from images, 从图片中抽取表格数据
(1) 第一步 SFT
SFT 原理比较简单,难的是数据问题,需要大量的有监督Prompt文本
Raw DataPromptLabel
raw_data = "我们去成都旅游,必须要去的地方是大熊猫繁殖基地。"
prompt = "大熊猫是"
labels = ["一种有黑白斑纹的动物。","中国特有种,主要栖息地是中国四川、陕西和甘肃的山区。",
"已在地球上生存了至少800万年,被誉为“活化石”和“中国国宝”即国兽,世界自然基金会的形象大使,是世界生物多样性保护的旗舰物种。",
"属于熊科、大熊猫属的哺乳动物。仅有二个亚种。雄性个体稍大于雌性。体型肥硕似熊、丰腴富态,头圆尾短,头躯长1.2-1.8米,尾长10-12厘米。"]
combine_data = [raw_data+prompt+label for label in labels]
初始化模型,对输入数据进行编码, 以 GPT-2 模型为例
from torch.utils.data import Dataset
from transformers import Trainer, TrainingArguments
from transformers import AutoTokenizer, AutoModelForCausalLM
# 模型加载
tokenizer = BloomTokenizerFast.from_pretrained('pre_train_model/gpt2')
model = BloomForCausalLM.from_pretrained('pre_train_model/gpt2')
# 自定义DataSet类
class Datasets(Dataset):
def __init__(self, sample):
super(Datasets, self).__init__()
self.sample = sample
def __getitem__(self, item):
res = {k: v[item] for k, v in self.sample.items()}
return res
def __len__(self):
return len(self.sample['labels'])
# 数据转换
combine_data_token = tokenizer.batch_encode_plus(
initial_data_,
max_length=256,
padding='max_length',
truncation=True,
return_tensors='pt'
# 将标签标签加入
combine_data_token['labels'] = combine_data_token['input_ids']
combine_data_token['labels'] = torch.where(
combine_data_token['labels']==0,
-100,
combine_data_token['labels']
# 模型训练保存
trainer_args = TrainingArguments("./model/", learning_rate=2e-5, weight_decay=0.01, num_train_epochs=10, auto_find_batch_size=True)
trainer = Trainer(model=initial_model, args=trainer_args, train_dataset=Datasets(initial_token_info))
trainer.train()
trainer.save_model()
# ----- 加载生成 --------
# 加载模型
model = AutoModelForCausalLM