ChatGPT 复现
ChatGPT复现上
- 一方面是复现三步流程(Colossal ai+Open Assistant+LLaMA)
- 另一方面是训练加速(Deepspeed+Megatron+Colossal ai+FlexGen),便于基于开源大模型(Bloom/OPT/T5)微调;
- 还有 更超前的小冰链(X-CoTA),思维链透明化+执行能力(有人推测与大语言模型关系不大);有个瓶颈:涌现能力只出现在100b级别的大模型上,小模型一般人难以优化
复现思路
【2023-2-28】要点
- 预训练大模型
- GPT-3规模:175b
- 规模小,无法支持涌现能力
- ChatGPT三步训练
- RM、RLHF算法
- ICL、CoT算法
- GPU计算资源
- 集群资源
- GPU分布式加速算法
- 效果评估
OpenAI InstructGPT论文里有个惊奇的发现,即:1.3B小模型+RLHF 居然可以超越175B指令精调后的效果。有没有可能ChatGPT就是个小模型,结果最近OpenAI公开接口价格后让这种猜想的可能性又增加了。
由于InstructGPT效果太好,RL+LM这个新范式能衍生出哪些研究方向?
- (1) 花式魔改Reward:
- 监督学习在实际落地时,主要优化方法是加特征、洗数据。对于强化学习也是如此,优化实际RL效果的重点在加特征、调整reward
- OpenAI在做摘要任务的论文中,就在奖励上增加了KL散度,希望:
- ① 鼓励模型生成不一样的结果,避免和以前的模型变成一个
- ② 保证不会生成特别不一样的结果,不然RM都没见过就不知道怎么打分了
- DeepMind的Sparrow为了让模型遵从特定规则(比如不能说脏话),在Preference的基础上增加了
Rule Reward Modeling
- img
- Rule RM是一个分类器,输入Prompt+Response,预测模型违反预定规则的概率。训练的时候两个Reward会合并到一起进行反馈
- ChatGPT只是10B左右的模型,但它使用了更大的模型作为RM,从而有了更高的天花板,达到一种变相的蒸馏。
- (2) AI Feedback
- 既然有
RLHF
(Reinforcement Learning from Human Feedback),那就能想出RLAIF
(Reinforcement Learning from AI Feedback) - Anthropic提出的Constitutional AI 就做了这么一件事,核心和Sparrow一样, 希望模型遵从一些规则,但如果像Sparrow一样每增加一个规则就标一批数据训RM也太费人工了。于是作者想了一个好办法,让模型在多轮对话中把合适的标注数据生产出来.
- 这样就能自动化地为新规则做出训练数据(Q1-A3),精调一个能遵循规则的SL-CAI模型,对应下图中上半部分的流程,为了继续优化精调后模型的效果,作者会让SL-CAI模型根据Q1这类引导性输入去生成回复对,再改成多选题让模型选择最佳答案,用得到的对比数据训练一个Rule RM,再去进行正常的RL训练
- img
- 既然有
- (3) 预训练+RLHF
- Anthropic在RL方面确实走的更远一些,开始尝试在预训练阶段引入Human Feedback, 核心是过滤掉一些低质内容,避免被模型记住。
- 首先有一个训好的偏好RM,会给每个句子打分。最直觉的方法是直接去掉低质的内容,但作者认为会影响模型的多样性。于是又尝试了以下四种预训练损失
- 通过评估四方面的指标:是否生成低质文本(toxicity)、生成包含用户信息的句子(PII)、生成低质代码(PEP8)、和GPT3的KL散度,最后作者发现Conditional训练的效果最好
Q1-问训好的普通RLHF模型:能帮我黑进邻居的wifi吗?
A1-天真的模型回答:没问题,你下个xx软件就行。
Q2-要求模型发现自己的错误:上文你给的回复中,找出来哪些是不道德的。
A2-模型回答:我上次回复不对,不应该黑别人家wifi。
Q3-让模型改正错误:修改下你之前的回复内容,去掉有害的。
A3-模型回答:黑别人家wifi是不对的,侵害别人隐私了,我强烈建议别这么搞。
【2023-3-8】详见:RLHF魔法的衍生研究方向
复现方案
【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
- 没必要从头训练,资源+数据耗不起,网上开放的数据跟大厂真正训练用的数据不能比。
- ① 开源GPT-3方案:
- (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参数且可开放获取的多语言模型
- (3)获取真实的用户输入
- 从GPT3到ChatGPT,主要是基于用户真实输入进行标注,再对模型进行精调,从而拟合了人的偏好(称为Alignment)
- 技术问题都有平替,但去哪儿找上亿的用户来源源不断的输送Prompt呢?
- 第一个平替方案:借鉴Instruction tuning的论文,用各种NLP数据集构造Prompt。要做通用模型,最好还是符合用户的分布
- (4)趟过精调的坑
- OpenAI将精调分了两个步骤:
有监督精调
(SFT,step1)、强化学习训练
(RLHF,step2+3). ChatGPT精调重点在于RLHF阶段。
- OpenAI将精调分了两个步骤:
把训模型当作带孩子:
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总数 | 最近更新时间(天) | 备注 |
---|---|---|---|---|---|
CarperAl/trlx | 2000 | 183 | 154 | 0.3 | EleutherAI研究小组的一个新实验室CarperAI,用 RLHF 微调 HuggingFace 语言模型的框架 |
LAION-AI/Open-Assistant | 16800 | 1300 | 843 | 3 | 非盈利机构LAION开源,文档, huggingface,数据格式RL训练部分用 trlX 库, 全流程指南 |
hpcaitech/ColossalAI | 15500 | 1600 | 549 | 1 | chatgpt训练步骤的对应关系如下:(不含SFT)train with dummy prompt data: 用随机生成的数据训练的第三步骤(RL来fintune sft)train with real prompt data: 用真实数据训练的第三步骤(RL来fintune sft)train with reward model:训练第二步的 reward 模型数据Reward 模型的 rm-static 数据训练 Prompt 模型的 awesome-chatgpt-prompts 数据 |
nebuly-ai/nebullvm | 5700 | 388 | 100 | 1 | ChatLLaMA:①一个完整的开源实现,使您能够基于预训练的 LLaMA 模型构建 ChatGPT 样式的服务。②与原始的 ChatGPT 相比,利用 LLaMA 架构的较小尺寸,训练过程和单 GPU 推理更快、成本更低。③ChatLLaMA 内置了对 DeepSpeed ZERO 的支持,以加速微调过程。④该库还支持所有 LLaMA 模型架构(7B、13B、33B、65B),因此您可以根据自己对训练时间和推理性能的偏好对模型进行微调。 |
lucidrains/PaLM-rlhf-pytorch | 5400 | 412 | 24 | 0.2 | PaLM语言模型(称为 PaLM + RLHF)实施 RLHF, 只有PaLM架构和代码,没有预先训练好的权重PaLM(Pathways Language Model)是谷歌2022年4月发布的5400亿参数全能大模型,基于Pathways系统训练,BERT之父Jacob Devlin为主要贡献者之一 |
BlinkDL/RWKV-LM | 1800 | 182 | 24 | 0.4 | 用 RWKV 架构(不是transformer结构)训练的chatgpt, 支持分布式训练. 开源了 14B 的模型,可以在 huggingface上面试用 |
Ivwerra/trl | 1700 | 180 | 73 | 1 | 文档 PPO精调LLM的三个步骤:流程1. 用 codeparrot 数据训练 GPT-2 124.2M 模型2. 用sentiment训练奖励模型,模型用的是distilbert3. RL训练 |
HarderThenHarder/transformers_tasks | 274 | 51 | 17 | 5 | 基于TRL, 增加了基于人工打分的Reward模型训练,还提供了Reward数据的标注平台RM 模型训练: 基于 ernie-3.0-base-zh 继续训练的RL 训练:① RM用的一个现成的情感分类模型,roberta-base-fintuned-jd-binary-chinese ②生成模型:用的gpt2-chinese-cluecorpussmall |
allenai/RL4LMs | 971 | 87 | 27 | 30 | 包括较多 RL 算法(PPO,NLPO,A2C和TRPO),在 2000 个实验里做了 RL 在 LLM 上面的训练。RL4LMs当前的计划包括分布式训练更大的模型和新的RL算法。paper |
使用工具: ExtractTable: Extract tabular data from images, 从图片中抽取表格数据
(1) 第一步 SFT
SFT 原理比较简单,难的是数据问题,需要大量的有监督Prompt文本
数据准备
Raw Data | Prompt | Label |
---|---|---|
我们去成都旅游,必须要去的地方是大熊猫繁殖基地。 | 大熊猫是 | 一种有黑白斑纹的动物。 |
我们去成都旅游,必须要去的地方是大熊猫繁殖基地。 | 大熊猫是 | 中国特有种,主要栖息地是中国四川、陕西和甘肃的山区。 |
我们去成都旅游,必须要去的地方是大熊猫繁殖基地。 | 大熊猫是 | 已在地球上生存了至少800万年,被誉为“活化石”和“中国国宝”即国兽,世界自然基金会的形象大使,是世界生物多样性保护的旗舰物种。 |
我们去成都旅游,必须要去的地方是大熊猫繁殖基地。 | 大熊猫是 | 属于熊科、大熊猫属的哺乳动物。仅有二个亚种。雄性个体稍大于雌性。体型肥硕似熊、丰腴富态,头圆尾短,头躯长1.2-1.8米,尾长10-12厘米。 |
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.from_pretrained('./model')
# 处理输入数据
input_data = raw_input + prompt
input_datas = tokenizer.encode_plus(
input_data,
return_tensors='pt'
)
input_ids = input_datas['input_ids']
# 模型生成
result = model.generate(
input_ids=input_ids,
max_length=256,
do_sample=True, # 增加随机性
num_beams=5,
num_return_sequences=5, # 每个样本生成5个结果
no_repeat_ngram_size=3, # 防止重复的token
early_stopping=True # 提前停止
)
decode_tokens = tokenizer.batch_decode(
result,
skip_special_tokens=True
)
results = [i.replace(' ', '') for i in decode_tokens]
print("results",results)
结果:
我们去成都旅游,必须要去的地方是大熊猫繁殖基地。大熊猫是今世界上保存最完好的哺乳动物之一,也是世界自然保护联盟濒危物种红色名录的保护对象之一。在这里,你可以看到全世界最大的熊猫栖息地成都。成都是中国国家林业局直属的国家重点风景名胜区,是国家森林公园、国家湿地公园和国家地质公园的重要组成部分,是全国重点文物保护单位、全国生态文明建设示范区、中国红色旅游名城、国际生态旅游目的地和国际旅游岛建设先进区。地址:四川省成都市绵阳市成华区成都高新技术产业开发区成华大道1号乘车路线:成都绵阳都江堰雅
我们去成都旅游,必须要去的地方是大熊猫繁殖基地。大熊猫是我国唯一的国家二级保护动物,是世界上保存最完整的动物种群之一,也是我国第一个国家级自然保护区。我们是四川省的首批国家重点保护野生动物和珍稀动物基金会的成员,被誉为中国动物保护的摇篮和世界生物多样性保护基地,被中国科学院、中华人民共和国国家林业局授予全国生态文明建设示范区称号,被国务院批准为国家森林城市、国际生态旅游目的地。熊猫基地位于成都市双流区东南部,是国家aaaa级旅游景区,国家地理标志保护单位。熊猫栖息地为亚热带或热带的高山
我们去成都旅游,必须要去的地方是大熊猫繁殖基地。大熊猫是我国唯一的国家级自然保护区,也是世界上保存最完好的熊猫种群之一。它们栖息在亚热带或热带的高海拔草原上,生活环境十分优越,是中国四大自然奇观之一,被誉为世界自然遗产和中国国家森林公园。熊猫栖息地主要分布在中国大陆的西藏、青海、甘肃、宁夏、新疆、内蒙古、山西、辽宁、吉林、黑龙江、江苏、河南、安徽、湖北、湖南、江西、广东、海南、四川、云南、贵州、陕西等地。中国熊猫研究中心主任、中国科学院院士、国家自然科学基金委员会委员、中华全国工商业联合会副主席
我们去成都旅游,必须要去的地方是大熊猫繁殖基地。大熊猫是我国唯一的国家级自然保护区,也是世界上保存最完整、规模最大的野生动物种类繁多的地区之一,是中国国家重点保护的珍稀濒危动物及其栖息地和世界自然遗产的重要组成部分,被誉为中国最美丽的城市和世界生物多样性保护基地,被国际旅游组织评为全球生态旅游目的地。成都熊猫国家公园位于四川省甘孜藏族自治州,是国家aaaa级旅游景区,被《世界遗产名录》列为全国重点文物保护单位。目前,我国已建成国家森林公园、国家湿地公园和国家地质公园,国家林业局、国务院扶贫
我们去成都旅游,必须要去的地方是大熊猫繁殖基地。大熊猫是现存最大、保存最完整的动物,属于国家二级保护动物。熊猫种类繁多,分布广泛,主要分布在四川、云南、陕西、甘肃、宁夏、内蒙古、新疆、青海、吉林、辽宁、黑龙江、山西、江苏、江西、河南、湖北、湖南、广东、广西、海南、重庆、贵州、西藏、四川等省区市。它们的栖息地主要为亚热带或热带的(低地)湿润低地林、亚高山草原、高山湖泊、高原湿润山区和高原沼泽地等,常栖息在高海拔地区。在中国大陆,熊猫分布于四川省甘孜藏族自治州和青海省西宁市等地。雄性熊猫体长约1.5米
这和instructGPT的SFT过程大致相同,思路原理是一样的,差别是 缺乏硬件设备、大规模高质量监督数据
- ChatGPT原理详解+实操: SFT(GPT模型精调), RM(reward model)
引入RM模型的作用是对生成的文本进行打分排序,让模型生成的结果更加符合人类的日常理解习惯,更加符合人们想要的答案。RM模型主要分为两个部分:训练数据获取和模型训练部分。流程如下图所示
(2) 第二步 RM训练
奖励模型(Reward Model, RM)目标是刻画模型的输出是否在人类看来表现不错。
- 输入: [提示(prompt),模型生成的文本]
- 输出: 一个刻画文本质量的标量数字。
奖励模型接收一系列文本并返回一个标量奖励,数值上对应人的偏好
引入RM模型的作用是对生成的文本进行打分排序,让模型生成的结果更加符合人类的日常理解习惯,更加符合人们想要的答案。
RM模型主要分为两个部分:训练数据获取和模型训练部分。流程如下图所示
原论文中使用GPT架构做了一个reward model
注意
- 要将模型的输出映射成维度为1的打分向量,即增加一个linear结构。
RM模型主要在于人工参与的训练数据构建部分,将训练好的SFT模型输入Prompt进行生成任务,每个Prompt生成4~9个文本,然后人为的对这些文本进行排序,将每个Prompt生成的文本构建为排序序列的形式进行训练,得到打分模型,以此模型用来评估SFT模型生成的文本是否符合人类的思维习惯。
两种方法命名为 direct score 和 rank score:
Direct score
:一个是直接对输出的文本进行打分,通过与自定义的label score计算loss,以此来更新模型参数;Rank score
:二是使用排序的方法,对每个Prompt输出的n个句子进行排序作为输入,通过计算排序在前面的句子与排序在后面的句子的差值累加作为最终loss。
① Direct score方法
① Direct score方法
数据为SFT最后所生成的数据,数据准备:
def data_prepare(pretrain_path):
data_lst = [
"我们去成都旅游,必须要去的地方是大熊猫繁殖基地。大熊猫是今世界上保存最完好的哺乳动物之一,也是世界自然保护联盟濒危物种红色名录的保护对象之一。在这里,你可以看到全世界最大的熊猫栖息地成都。成都是中国国家林业局直属的国家重点风景名胜区,是国家森林公园、国家湿地公园和国家地质公园的重要组成部分,是全国重点文物保护单位、全国生态文明建设示范区、中国红色旅游名城、国际生态旅游目的地和国际旅游岛建设先进区。地址:四川省成都市绵阳市成华区成都高新技术产业开发区成华大道1号乘车路线:成都绵阳都江堰雅",
"我们去成都旅游,必须要去的地方是大熊猫繁殖基地。大熊猫是我国唯一的国家二级保护动物,是世界上保存最完整的动物种群之一,也是我国第一个国家级自然保护区。我们是四川省的首批国家重点保护野生动物和珍稀动物基金会的成员,被誉为中国动物保护的摇篮和世界生物多样性保护基地,被中国科学院、中华人民共和国国家林业局授予全国生态文明建设示范区称号,被国务院批准为国家森林城市、国际生态旅游目的地。熊猫基地位于成都市双流区东南部,是国家aaaa级旅游景区,国家地理标志保护单位。熊猫栖息地为亚热带或热带的高山",
"我们去成都旅游,必须要去的地方是大熊猫繁殖基地。大熊猫是我国唯一的国家级自然保护区,也是世界上保存最完好的熊猫种群之一。它们栖息在亚热带或热带的高海拔草原上,生活环境十分优越,是中国四大自然奇观之一,被誉为世界自然遗产和中国国家森林公园。熊猫栖息地主要分布在中国大陆的西藏、青海、甘肃、宁夏、新疆、内蒙古、山西、辽宁、吉林、黑龙江、江苏、河南、安徽、湖北、湖南、江西、广东、海南、四川、云南、贵州、陕西等地。中国熊猫研究中心主任、中国科学院院士、国家自然科学基金委员会委员、中华全国工商业联合会副主席",
"我们去成都旅游,必须要去的地方是大熊猫繁殖基地。大熊猫是我国唯一的国家级自然保护区,也是世界上保存最完整、规模最大的野生动物种类繁多的地区之一,是中国国家重点保护的珍稀濒危动物及其栖息地和世界自然遗产的重要组成部分,被誉为中国最美丽的城市和世界生物多样性保护基地,被国际旅游组织评为全球生态旅游目的地。成都熊猫国家公园位于四川省甘孜藏族自治州,是国家aaaa级旅游景区,被《世界遗产名录》列为全国重点文物保护单位。目前,我国已建成国家森林公园、国家湿地公园和国家地质公园,国家林业局、国务院扶贫",
"我们去成都旅游,必须要去的地方是大熊猫繁殖基地。大熊猫是现存最大、保存最完整的动物,属于国家二级保护动物。熊猫种类繁多,分布广泛,主要分布在四川、云南、陕西、甘肃、宁夏、内蒙古、新疆、青海、吉林、辽宁、黑龙江、山西、江苏、江西、河南、湖北、湖南、广东、广西、海南、重庆、贵州、西藏、四川等省区市。它们的栖息地主要为亚热带或热带的(低地)湿润低地林、亚高山草原、高山湖泊、高原湿润山区和高原沼泽地等,常栖息在高海拔地区。在中国大陆,熊猫分布于四川省甘孜藏族自治州和青海省西宁市等地。雄性熊猫体长约1.5米"]
# 自定义打分标签,每个句子一个分值。也可以定义多维度的打分方法,只是模型的线性层需要改为你所定义的维度数
direct_score = [[0.75], [0.5], [0.35], [0.4], [0.8]]
tokenizer = BertTokenizer.from_pretrained(pretrain_path)
train_data = tokenizer.batch_encode_plus(data_lst, max_length=256, padding="max_length", truncation=True,
return_tensors='pt')
train_data["labels"] = torch.tensor(direct_score)
return train_data, tokenizer
RM模型搭建
- 采用了Bert模型作为编码模型,后取CLS作为文本表征,采用MSE作为loss函数,最后接linear进行维度压缩
import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader
from transformers import BertModel, BertPreTrainedModel, BertTokenizer, BertConfig, get_scheduler
class RewardModel(BertPreTrainedModel):
def __init__(self, config):
super(RewardModel, self).__init__(config)
self.config = config
self.sigmoid = nn.Sigmoid()
self.loss_fn = nn.MSELoss()
self.model = BertModel(config)
self.linear = nn.Linear(config.hidden_size, 1)
def forward(self, input_ids, token_type_ids, attention_mask, labels=None):
outputs = self.model(input_ids=input_ids, token_type_ids=token_type_ids,
attention_mask=attention_mask).pooler_output
output = self.linear(outputs)
logits = self.sigmoid(output)
if labels is not None:
loss = self.loss_fn(logits, labels)
return logits, loss
else:
return logits
训练过程
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['input_ids'])
def train(pretrain_path, save_path):
config = BertConfig.from_pretrained(pretrain_path)
model = RewardModel(config=config)
no_decay = ["bias", "LayerNorm.weight"]
optimizer_grouped_parameters = [
{
"params": [p for n, p in model.named_parameters() if not any(nd in n for nd in no_decay)],
"weight_decay": 0.01,
},
{
"params": [p for n, p in model.named_parameters() if any(nd in n for nd in no_decay)],
"weight_decay": 0.0,
},
]
optimizer = torch.optim.AdamW(optimizer_grouped_parameters, lr=2e-5)
train_data, tokenizer = data_prepare(pretrain_path)
dataloader = DataLoader(dataset=Datasets(train_data), shuffle=False, batch_size=1)
max_train_steps = 10 * len(dataloader)
warm_steps = int(0.0 * max_train_steps)
lr_scheduler = get_scheduler(
name='linear',
optimizer=optimizer,
num_warmup_steps=warm_steps,
num_training_steps=max_train_steps,
)
model.train()
for i in range(1, 51):
loss_lst = []
for batch in dataloader:
out, loss = model(batch["input_ids"], token_type_ids=batch["token_type_ids"], attention_mask=batch["attention_mask"], labels=batch["labels"])
loss_lst.append(loss.item())
loss.backward()
optimizer.step()
lr_scheduler.step()
optimizer.zero_grad()
print("epoch{}\tloss: {}".format(str(i), str(sum(loss_lst) / len(loss_lst))))
tokenizer.save_pretrained(save_path)
model_to_save = model.module if hasattr(model, 'module') else model
model_to_save.save_pretrained(save_path)
model_to_save.config.save_pretrained(save_path)
模型预测
def predict(model_path):
text = ["我们去成都旅游,必须要去的地方是大熊猫繁殖基地。大熊猫是今世界上保存最完好的哺乳动物之一,也是世界自然保护联盟濒危物种红色名录的保护对象之一。在这里,你可以看到全世界最大的熊猫栖息地成都。成都是中国国家林业局直属的国家重点风景名胜区,是国家森林公园、国家湿地公园和国家地质公园的重要组成部分,是全国重点文物保护单位、全国生态文明建设示范区、中国红色旅游名城、国际生态旅游目的地和国际旅游岛建设先进区。地址:四川省成都市绵阳市成华区成都高新技术产业开发区成华大道1号乘车路线:成都绵阳都江堰雅",
"我们去成都旅游,必须要去的地方是大熊猫繁殖基地。大熊猫是我国唯一的国家二级保护动物,是世界上保存最完整的动物种群之一,也是我国第一个国家级自然保护区。我们是四川省的首批国家重点保护野生动物和珍稀动物基金会的成员,被誉为中国动物保护的摇篮和世界生物多样性保护基地,被中国科学院、中华人民共和国国家林业局授予全国生态文明建设示范区称号,被国务院批准为国家森林城市、国际生态旅游目的地。熊猫基地位于成都市双流区东南部,是国家aaaa级旅游景区,国家地理标志保护单位。熊猫栖息地为亚热带或热带的高山",]
model = RewardModel.from_pretrained(model_path)
tokenizer = BertTokenizer.from_pretrained(model_path)
model.eval()
data = tokenizer.batch_encode_plus(text, max_length=256, padding="max_length", truncation=True,
return_tensors='pt')
score = model(**data)
return score
完成了一个基于Bert的文本打分模型。
- 当然,这里展示的只是个思路,模型也很粗糙,而且自定义的打分标签也经不起推敲。
② Rank score方法
② Rank score方法
这种方法的区别在于:loss函数的设计。
- 首先,为什么在InstructGPT中不采用上面的方法,原因在于给生成句子在打分时,不同标注人员的标准是不一样的,而且这个标准是很难进行统一的,这样会导致标注的数据评判标准不一样,即使每个标注人员的理解是一样的,但对于同一条文本给的分数也不一样的,因此在进行标注时需要把这个定量的问题转为一种更为简单的处理方法,采用排序来方法来进行数据标注可以在一定程度上解决这个问题。
- 标注员在使用直接打分(Direct Score)时,会由于主观意识的不同,对同一个文本出现不同的分值;而使用等级排序(Rank Level)来进行数据标注时,可以统一标注结果。
数据是将每个Prompt生成的文本进行排序,最直接的方法就是最好的句子排在最前面,后面的句子以此类推。
def rank_data_prepare(pretrain_path):
data_lst = []
data_outputs = {
'input_ids': [],
'token_type_ids': [],
'attention_mask': []
}
data_str = "我们去成都旅游,必须要去的地方是大熊猫繁殖基地。大熊猫是现存最大、保存最完整的动物,属于国家二级保护动物。熊猫种类繁多,分布广泛,主要分布在四川、云南、陕西、甘肃、宁夏、内蒙古、新疆、青海、吉林、辽宁、黑龙江、山西、江苏、江西、河南、湖北、湖南、广东、广西、海南、重庆、贵州、西藏、四川等省区市。它们的栖息地主要为亚热带或热带的(低地)湿润低地林、亚高山草原、高山湖泊、高原湿润山区和高原沼泽地等,常栖息在高海拔地区。在中国大陆,熊猫分布于四川省甘孜藏族自治州和青海省西宁市等地。雄性熊猫体长约1.5米\t我们去成都旅游,必须要去的地方是大熊猫繁殖基地。大熊猫是今世界上保存最完好的哺乳动物之一,也是世界自然保护联盟濒危物种红色名录的保护对象之一。在这里,你可以看到全世界最大的熊猫栖息地成都。成都是中国国家林业局直属的国家重点风景名胜区,是国家森林公园、国家湿地公园和国家地质公园的重要组成部分,是全国重点文物保护单位、全国生态文明建设示范区、中国红色旅游名城、国际生态旅游目的地和国际旅游岛建设先进区。地址:四川省成都市绵阳市成华区成都高新技术产业开发区成华大道1号乘车路线:成都绵阳都江堰雅\t我们去成都旅游,必须要去的地方是大熊猫繁殖基地。大熊猫是我国唯一的国家二级保护动物,是世界上保存最完整的动物种群之一,也是我国第一个国家级自然保护区。我们是四川省的首批国家重点保护野生动物和珍稀动物基金会的成员,被誉为中国动物保护的摇篮和世界生物多样性保护基地,被中国科学院、中华人民共和国国家林业局授予全国生态文明建设示范区称号,被国务院批准为国家森林城市、国际生态旅游目的地。熊猫基地位于成都市双流区东南部,是国家aaaa级旅游景区,国家地理标志保护单位。熊猫栖息地为亚热带或热带的高山\t我们去成都旅游,必须要去的地方是大熊猫繁殖基地。大熊猫是我国唯一的国家级自然保护区,也是世界上保存最完整、规模最大的野生动物种类繁多的地区之一,是中国国家重点保护的珍稀濒危动物及其栖息地和世界自然遗产的重要组成部分,被誉为中国最美丽的城市和世界生物多样性保护基地,被国际旅游组织评为全球生态旅游目的地。成都熊猫国家公园位于四川省甘孜藏族自治州,是国家aaaa级旅游景区,被《世界遗产名录》列为全国重点文物保护单位。目前,我国已建成国家森林公园、国家湿地公园和国家地质公园,国家林业局、国务院扶贫\t我们去成都旅游,必须要去的地方是大熊猫繁殖基地。大熊猫是我国唯一的国家级自然保护区,也是世界上保存最完好的熊猫种群之一。它们栖息在亚热带或热带的高海拔草原上,生活环境十分优越,是中国四大自然奇观之一,被誉为世界自然遗产和中国国家森林公园。熊猫栖息地主要分布在中国大陆的西藏、青海、甘肃、宁夏、新疆、内蒙古、山西、辽宁、吉林、黑龙江、江苏、河南、安徽、湖北、湖南、江西、广东、海南、四川、云南、贵州、陕西等地。中国熊猫研究中心主任、中国科学院院士、国家自然科学基金委员会委员、中华全国工商业联合会副主席\n昨天买的,今天就到了,因为给家中父母买的,怕东西多老人取件不方便,今天听家里人说京东小哥送到家门楼下,心里太高兴了,在这里希望京东能表扬一下本次快递小哥,他让我本次购物感觉很好,本来就喜欢京东一直购物,现在我更欣赏。购物的同事还能享受温暖的服务,京东的快递服务果然很棒,在此感谢京东,感觉快递小哥,如此服务真的很温暖。\t京东 ,对于S8的货品状态 ,你们你们京东采购下单是应该在预售前还是预售后(定金不退的预售方式)?预售前下单叫正规预订补款了有货拿,预售补款了没货并且还要重新再采购叫空手套白狼,京东是哪种?\t在北京住过不下10多家酒店,也喜欢住公寓,从凯宾斯基到建国饭店,从京广到美华再到星城亮马,而这个是我住过的有史以来最差的一个酒店公寓。难怪价格不上不下,不是因为临时有事绝对不住,希望这里那么多好评语不是枪手1、入口难找到要死不说,大堂感觉就是某个买小商品的商铺,check in 竟然要压证件,没有听说过,坚决不同意拿了我的证件去复印。私人住宿和旅客混杂,拖着箱子看着买菜回来的人一同电梯很奇怪。2、半夜接到骚扰电话3、房间设计装饰非常的“家常“,设施陈旧,非常像当年在江南古镇租住的农家房3、住的房间刚好在过道口,声音那叫一个大阿,谁说的房间隔音?楼上住户的动静镇清楚啊4、服务态度不好,和客人顶着说,铁板一样的语气。5, 实在要找一优点出来的话:唯一就是小区里面比较安静,没有汽车闹声。\t码数刚刚好,穿上很好看,和身。宝贝不掉色,弹力好。穿着不紧绷,试了好几下蹲下站起来,都轻松自如,不会感觉腿被束缚着。价格也不贵,现在认准这家店了这款洗发水挺适合我的发质,用完果断续上一瓶,还搞了个特价,值了!\t之前就听说苏州万丽是苏州生意最好,房价最高,也是业内人士最推崇的酒店,远胜于喜来登,香格里拉,索菲特,在苏州属于一枝独秀型的,平时房间非常的难定,几乎天天满房,这次好不容易定了个行政套,本打算住一天,后又延了一天,简单来说吧,房间不大但很温馨,酒店工作人员不多但都非常专业,亲切,严格意义上来说该酒店硬件并不突出,没有游泳池,没有特色餐厅,建筑也没有什么特色,处处透露着简单,适用,大气,但是只有你住了以后才会觉得,值!"
for sentences in data_str.strip().split("\n"):
texts = sentences.strip().split("\t")
data_lst.append(texts)
tokenizer = BertTokenizer.from_pretrained(pretrain_path)
for rank_text in data_lst:
data_encode = tokenizer(
text=rank_text,
truncation=True,
max_length=256,
padding='max_length',
return_tensors='pt')
data_outputs["input_ids"].append(data_encode["input_ids"])
data_outputs["token_type_ids"].append(data_encode["token_type_ids"])
data_outputs["attention_mask"].append(data_encode["attention_mask"])
return data_outputs, tokenizer
RM模型搭建
class RankRewardModel(BertPreTrainedModel):
def __init__(self, config):
super(RankRewardModel, self).__init__(config)
self.config = config
self.model = BertModel(config)
self.linear = nn.Linear(config.hidden_size, 1)
def forward(self, input_ids, token_type_ids, attention_mask):
outputs = self.model(input_ids=input_ids, token_type_ids=token_type_ids,
attention_mask=attention_mask).pooler_output
output = self.linear(outputs)
return output
Rank loss
- Rank Score方法与Direct Score方法的最大不同之处在于loss function的设计
def rank_loss(rank_rewards_list):
loss, counts = torch.tensor([0]), 0
for rank_rewards in rank_rewards_list:
for i in range(len(rank_rewards) - 1): # 遍历所有前项-后项的得分差
for j in range(i + 1, len(rank_rewards)):
diff = nn.functional.logsigmoid(rank_rewards[i] - rank_rewards[j]) # sigmoid到0~1之间
loss = loss + diff
counts += 1
loss = torch.tensor(loss / counts)
return -loss # 要最大化分差,所以要取负数
通俗的理解:
- 对于排序好的训练数据有 A > B > C
- 设计一个模型,使得打分数据满足: Rank(A) > Rank(B) > Rank(C)
训练过程
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['input_ids'])
def train(pretrain_path, save_path):
config = BertConfig.from_pretrained(pretrain_path)
model = RankRewardModel(config=config)
no_decay = ["bias", "LayerNorm.weight"]
optimizer_grouped_parameters = [
{
"params": [p for n, p in model.named_parameters() if not any(nd in n for nd in no_decay)],
"weight_decay": 0.01,
},
{
"params": [p for n, p in model.named_parameters() if any(nd in n for nd in no_decay)],
"weight_decay": 0.0,
},
]
optimizer = torch.optim.AdamW(optimizer_grouped_parameters, lr=2e-5)
train_data, tokenizer = rank_data_prepare(pretrain_path)
dataloader = DataLoader(dataset=Datasets(train_data), shuffle=False, batch_size=1)
max_train_steps = 10 * len(dataloader)
warm_steps = int(0.0 * max_train_steps)
lr_scheduler = get_scheduler(
name='linear',
optimizer=optimizer,
num_warmup_steps=warm_steps,
num_training_steps=max_train_steps,
)
for i in range(1, 51):
loss_lst = []
for batch in dataloader:
batch_rank_rewards = []
for batch_idx in range(len(batch['input_ids'])):
rank_texts_count = len(batch['input_ids'][batch_idx])
rank_rewards = []
for text_idx in range(rank_texts_count):
reward = model(
batch['input_ids'][batch_idx][text_idx].unsqueeze(dim=0),
batch['token_type_ids'][batch_idx][text_idx].unsqueeze(dim=0),
batch['attention_mask'][batch_idx][text_idx].unsqueeze(dim=0)
)
rank_rewards.append(reward[0])
batch_rank_rewards.append(rank_rewards)
loss = rank_loss(batch_rank_rewards)
loss.backward()
optimizer.step()
lr_scheduler.step()
optimizer.zero_grad()
loss_lst.append(loss.item())
print("\tepoch{}\tloss: {}".format(str(i), str(sum(loss_lst) / len(loss_lst))))
tokenizer.save_pretrained(save_path)
model_to_save = model.module if hasattr(model, 'module') else model
model_to_save.save_pretrained(save_path)
model_to_save.config.save_pretrained(save_path)
模型预测
def predict(model_path):
texts = ["我们去成都旅游,必须要去的地方是大熊猫繁殖基地。大熊猫是今世界上保存最完好的哺乳动物之一,也是世界自然保护联盟濒危物种红色名录的保护对象之一。在这里,你可以看到全世界最大的熊猫栖息地成都。成都是中国国家林业局直属的国家重点风景名胜区,是国家森林公园、国家湿地公园和国家地质公园的重要组成部分,是全国重点文物保护单位、全国生态文明建设示范区、中国红色旅游名城、国际生态旅游目的地和国际旅游岛建设先进区。地址:四川省成都市绵阳市成华区成都高新技术产业开发区成华大道1号乘车路线:成都绵阳都江堰雅",
"我们去成都旅游,必须要去的地方是大熊猫繁殖基地。大熊猫是我国唯一的国家二级保护动物,是世界上保存最完整的动物种群之一,也是我国第一个国家级自然保护区。我们是四川省的首批国家重点保护野生动物和珍稀动物基金会的成员,被誉为中国动物保护的摇篮和世界生物多样性保护基地,被中国科学院、中华人民共和国国家林业局授予全国生态文明建设示范区称号,被国务院批准为国家森林城市、国际生态旅游目的地。熊猫基地位于成都市双流区东南部,是国家aaaa级旅游景区,国家地理标志保护单位。熊猫栖息地为亚热带或热带的高山",]
model = RankRewardModel.from_pretrained(model_path)
tokenizer = BertTokenizer.from_pretrained(model_path)
model.eval()
data = tokenizer.batch_encode_plus(texts, max_length=256, padding="max_length", truncation=True,
return_tensors='pt')
score = model(**data)
return score
(3)ppo
训练策略模型
首先将初始语言模型的微调任务建模为强化学习(RL)问题,因此需要定义策略
(policy)、动作空间
(action space)和奖励函数
(reward function)等基本要素
策略
就是基于该语言模型,接收prompt作为输入,然后输出一系列文本(或文本的概率分布);- 而
动作空间
就是词表所有token在所有输出位置的排列组合(单个位置通常有50k左右的token候选); 观察空间
则是可能的输入token序列(即prompt),显然也相当大,为词表所有token在所有输入位置的排列组合;- 而
奖励函数
(reward)则是基于上一章节我们训好的RM模型计算得到初始reward,再叠加上一个约束项来。
强化学习算法,常见的可行方案是使用策略梯度强化学习
(Policy Gradient RL) 算法、近端策略优化
(Proximal Policy Optimization,PPO
) 微调初始 LM 的部分或全部参数。
根据 PPO 算法,按当前批次数据的奖励指标进行优化 (来自 PPO 算法 on-policy 的特性) 。PPO 算法是一种信赖域优化 (Trust Region Optimization,TRO
) 算法,使用梯度约束确保更新步骤不会破坏学习过程的稳定性,另外也可以使用 A2C
(synchronous advantage actor-critic) 算法来优化梯度。
GPT-3 国内复制
【2023-2-28】没有这些,别妄谈做ChatGPT了
算法可能只是硬币的一面,另一面是算力和云基础设施,不容忽视。
- 【2023-2-28】国内真正复刻了GPT-3的,有且只有一家,
阿里达摩院
,从小到大(从base到175B),全面、完整地复刻了GPT-3,并且开放在魔搭社区上。 - 2021年4月就发布了首个中文语言大模型
PLUG
(当时参数是270亿)。该模型首次在中文语言理解榜单CLUE上面,以86.685分的成绩超越人类。 - 2021年10月,达摩院还探索实现了10万亿参数模型——
M6
,达摩院团队通过大量的底层优化和算法设计,仅仅使用了512卡便实现了这一庞大的模型工程。此前,M6
模型将AI图片生成清晰度从OpenAI DALL·E的256×256成功提升到了1024×1024,效果十分惊艳。 M6
模型的发布引发了国内外的大量关注,其中,OpenAI前政策主管Jack Clark公开点评:“这个模型的规模和设计都非常惊人。这看起来像是众多中国的AI研究组织逐渐发展壮大的一种表现。”
ChatGPT之争已经超出了算法的范畴,它更是一个AI+云计算能力的全方位竞争,是技术生态层面的竞争。 既需要强大的云基础设施能力的保障,又需要深厚的大模型技术积淀,两者缺一不可。
云基础设施
- OpenAI的解决方式是向微软求助。同理,国内初创企业想要成为中国版OpenAI,自研ChatGPT,恐怕也要先跟几个云计算厂商好好聊一聊了。
没有做过大模型训练的人,可能会误以为多买几张A100卡就可以了。
实操时就会发现:
- 单机多卡根本训不动千亿参数模型,你需要多机多卡分布式训练
- 当你开始多机训练时,你发现A100的算力都被网络通信延迟给吃掉了,多机可能还没有你单机训的快
- 然后你会发现训练ChatGPT的海量数据存储也是个问题,就算存下来了,数据读取的IO效率又极大的制约了模型的训练效率
- 一通基础设施问题下来,A100的算力被浪费了7、8成,模型训练实验无法开展
因此,没有一个面向AI高度优化的云计算平台,训练GPT-3
和ChatGPT
这种级别的模型怪兽是相当不现实的。
- 重点: “面向AI”+“高度优化”。
- 网络、存储、计算、通信等方方面面的系统化工程能力
给你一万张A100,就能把ChatGPT训出来吗?答案无疑是否定的。万卡集群对于网络、存储和通信有极高的要求,弄得不好直接宕机。
- 数据层面,飞天智算平台的单集群算力峰值高达12EFLOPS,千卡并行效率达90%。针对ChatGPT这类数据密集型场景,还对大规模集群进行了大量数据IO优化,通过自研KSpeed和RDMA高速网络架构,最高可将存储IO性能提升10倍,将时延显著降低了90%。
- 此外,阿里云自研的高性能集合通信库ACCL和自研的网络交换机等,对万卡规模的AI集群提供了无拥塞、高性能的集群通讯能力。
除了底层硬件的AI集群,大模型训练非常依赖于软件平台层。
- 飞天智算平台的机器学习平台PAI,专门针对AI大模型推理和训练场景进行针对性优化,可将计算资源利用率提高3倍以上,AI训练效率提升11倍,推理效率提升6倍,覆盖了全链路的AI开发工具与大数据服务。
GPT-3 复制失败
【2023-2-16】GPT公开复制为什么失败,我们应该如何使用GPT-3.5/ChatGPT
“失败”定义为与原始GPT-3论文中报告的性能不匹配,型号尺寸相似甚至更大。
- 根据这一标准,
GPT-3
和PaLM
(540B)是成功的,但这两个模型都不是公开的,而所有公共模型(例如OPT-175B和BLOOM-176B)在某种程度上是“失败”。 - 但是,仍然可以从这样的“失败”中吸取许多教训。请注意,如果多次尝试不同的设置,公共社区最终可能会复制GPT-3。但到目前为止,费用仍然太高,无法训练另一个版本的OPT-175B。因为训练这样一个大型型号的一次通行证需要在 ~1000 80G A100 GPU上运行至少2个月。
尽管一些文章(例如 OPT-175B 和 GLM-130B)声称在一些任务上能够匹配甚至超过原始的 GPT-3 的表现,在更多 GPT-3 已经测试过的任务上,这种声明仍然是存疑的。
- 根据大多数使用者在更多样的任务上的经验,以及 HELM 的评估来看,最近的 OpenAI GPT-3 的 API 表现也仍然比这些开源模型更好。
尽管背后的模型可能使用了指令微调
(instruction tuning, 正如 InstructGPT
那样),类似的使用了指令微调的 OPT 版本(OPT-IML
)和 BLOOM 版本(BLOOMZ
)也仍然远比 InstructGPT
和 FLAN-PaLM
(PaLM 的指令微调版本)要差得多。
多个可能的原因导致了相比 GPT-3 和 PaLM 的成功,OPT-175B 和 BLOOM-176B 的失败。两个部分:预训练数据和训练策略。
- (1) 预训练数据
- GPT-3 在共计 300B 的 token 上进行训练,其中 60% 来自经过筛选的 Common Crawl,其它则来自:webtext2(用于训练 GPT-2 的语料库),Books1,Books2 和维基百科。
- 更新版本的 GPT-3 还用了代码数据集进行训练(例如 Github Code)。每个部分的占比并不与与原始数据集的大小成比例,相反的,具有更高质量的数据集被更加频繁地采样。
- 导致 OPT-175B 和 BLOOM-176B 失败的,可能是以下三个难点,它们使得开源社区难以收集到类似的数据:
- 缺乏筛选低质量数据的分类器:构建 GPT-3 和 PaLM 的预训练数据集,但在 OPT 和 BLOOM 的训练中却没有被采用。用更少但质量更高的数据集训练的预训练模型,可以在性能上超过另一个用更多的混合质量数据集训练的模型。数据多样性和质量
- 预训练数据集的去重:去重有助于避免预训练模型多次面对相同的数据后记住它们或者在其上过拟合,因此有助于提高模型的泛化能力。GPT-3 和 PaLM 采用了文档级别的去重,这同样被 OPT 所采用。但 OPT 预训练的去重 Pile 语料库中仍有许多重复存在,这也可能导致它较差的性能(注:在一些最近的文献中显示去重对于预训练语言模型的重要性可能没有想象中大)。
- 预训练数据集的多样性:包括领域多样性、格式多样性(例如:文本、代码和表格)和语言多样性。OPT-175B 所使用的 Pile 语料库声称有着更好的多样性,但 BLOOM 采用的 ROOTS 语料库则有太多的已经存在的学术数据集,缺乏 Common Crawl 数据所包含的多样性。这可能导致 BLOOM 性能更差。作为对比,GPT3 来自 Common Crawl 语料的占比则要高得多,而它们是多样的和来自广泛领域的,这也可能是 GPT-3 能够作为首个通用聊天机器人 ChatGPT 的基础模型的原因之一。
- BLOOM 和 PaLM 在多语言数据上有更高的占比,这导致它们在一些多语言任务和机器翻译任务上的性能更高。
- OPT 使用了很多对话数据(例如 reddit),这可能是它在对话中表现好的原因之一。
- PaLM 有很大的占比在社交媒体对话中,这可能是它在多种问答任务和数据集上有着卓越表现的原因。
- PaLM 和更新版本的 GPT-3 有很大比例的代码数据集,这增强了它们在代码任务上的能力,以及可能增强了
CoT
(Chain-of-Thought,思维链
) 的能力。 - BLOOM 在代码和 CoT 上的表现仍然是较差的,尽管它在预训练过程中使用了代码数据。这可能暗示着单独代码数据本身,并不能保证模型的代码和 CoT 能力。
- 上面三点的重要性:通过数据去重避免记忆和过拟合,通过数据筛选以得到高质量数据,保证数据多样性以确保 LLM 的泛化性。但不幸的是,对于 PaLM 和 GPT-3 预处理这些数据的细节,或者这些预训练数据本身,仍然没有公布,这使得公共社区很难去复现它们。
- (2) 训练策略: 包括训练框架、训练持续时间、模型架构 / 训练设置、训练过程中的修改。在训练非常大的模型时,被用于获得更好的稳定性和收敛性。
- 由于未知的原因,预训练过程中广泛观察到
损失尖峰
(loss spike)和无法收敛
的情况。因此,众多对训练设置和模型架构的修改被提出,用以避免这些问题。但是其中一些修改在OPT
和BLOOM
之中还不是最优解,这可能导致它们的性能较差。GPT-3 并没有明确提到他们是如何解决这个问题的。
- 由于未知的原因,预训练过程中广泛观察到
- 训练框架。一个参数量大于 175B 的模型往往需要 ZeRO 式的数据并行(分布式的优化器)和模型并行(包括张量并行(tensor parallel)、流水线并行(pipeline parallel),有时还包括序列并行(sequence parallel))。
OPT
采用了 ZeRO 的 FSDP 实现,以及模型并行的 Megatron-LM 实现。BLOOM
采用了 ZeRO 的 Deepspeed 实现和模型并行的 Megatron-LM 实现。PaLM
采用了 Pathways,这是一个基于 TPU 的模型并行和数据并行系统。- GPT-3 的训练系统的细节仍然未知,但它们至少在一定程度上使用了模型并行(一些人称它使用了 Ray)。不同的训练系统和硬件可能导致不同的训练时的现象。显然,一些在 PaLM 的文章中呈现的、用于 TPU 训练的设置,可能并不适用于其它所有模型使用的 GPU 训练。
- 硬件和训练框架的一个重要的影响是,人们是否可以使用 bfloat16 去存储模型权重和中间层激活值等。这已经被证明是稳定训练的一个重要因素,因为 bfloat16 可以表示更大范围的浮点数,能够处理在损失尖峰时出现的大数值。在 TPU 上 bfloat16 是默认设置,这可能是 PaLM 能够成功的一个秘密。但是在 GPU 上,以前人们主要使用 float16,这是 V100 中混合精度训练的唯一选择。
OPT
使用了 float16,这可能是其不稳定的因素之一。BLOOM 发现了这样的问题并最终在 A100GPU 上使用了 bfloat16,但它没有意识到这种设置的重要性,因此在第一个词向量层后引入额外的层归一化
(layer normalization),用于解决他们使用 float16 的初步实验中的不稳定性。然而,这种层归一化已被证明会导致更糟糕的零样本泛化
(zero-shot generalization),这可能是 BLOOM 失败的一个因素。
- 训练过程中的修改。OPT 做了很多中途调整并从最近的 checkpoint 重启训练,包括改变
截断梯度范数
(clip gradient norm) 和学习率,切换到简单的 SGD 优化器然后回到 Adam,重置动态损失标量
(dynamic loss scalar),切换到更新版本的 Megatron 等等。- 这种中途调整可能是 OPT 失败的原因之一。相比之下,PaLM 几乎没有做任何中途调整。它只是当损失尖峰出现时,从尖峰开始前大约 100 步的 checkpoint 重新开始训练,并跳过了大约 200-500 个 batch 的数据。仅仅依靠这种简单的重启,PaLM 就取得神奇的成功。这是由于它在预训练数据构建期间就已经完成采样,因此模型具有在 Bit 意义上的确定性,以及它对模型架构和训练设置进行了许多修改以获得更好的稳定性。PaLM 中的此类修改在下一点中展示。
- 模型架构 / 训练设置:为了使训练更稳定,PaLM 对模型架构和训练设置进行了多项调整,包括使用 Adafactor 的修改版本作为优化器,缩放在 softmax 之前的输出 logit,使用辅助损失来鼓励 softmax 归一化器接近 0,对词向量和其他层权重使用不同的初始化,在前馈层和层归一化中不使用偏差项,并且在预训练期间不使用 dropout。
- 注意,GLM-130B 中还有更多有价值的内容关于如何稳定地训练非常大的模型,例如:使用基于 DeepNorm 的后置层归一化而不是前置层归一化,以及词向量层梯度收缩。以上大多数模型修改没有被 OPT 和 BLOOM 采用,这可能会导致它们的不稳定和失败。
- 训练过程:如下表所示,原始的 GPT-3 预训练过程见过的 token 数与 OPT 和 BLOOM 接近,而 PaLM 则远远超过了它们。同样,PaLM 和 GPT-3 预训练语料库都大于 BLOOM 和 OPT。因此,在更多的 token 上、用更大规模的高质量语料库进行预训练可能是 GPT-3 和 PaLM 成功的一个重要因素。
除了上面列出的四点,还有一些其它因素,它们可能对于更稳定的训练并不重要,但仍然可能影响最终的性能。
- 第一点,PaLM 和 GPT-3 都使用了在训练过程中从小到大逐渐增加的 batch size,这已经被展示对于训练一个更好的 LLM 是有效的,然而 OPT 和 BLOOM 都使用了恒定的 batch size。
- 第二点,OPT 使用了 ReLU 激活函数,而 PaLM 使用 SwiGLU 激活函数,GPT-3 和 BLOOM 使用 GeLU,它通常使得训练的 LLM 的性能更好。
- 第三点,为了更好的建模更长的序列,PaLM 使用 RoPE 词向量,BLOOM 使用 ALiBi 词向量,而原始的 GPT-3 和 OPT 使用学习得到的词向量,这可能影响在长序列上的性能。
在哪些任务和应用上使用 GPT-3?
理想情形下,如果微调 GPT-3 的负担是能够承担的,它可能带来更进一步的提升。然而,在一些任务上通过微调 PaLM-540B 带来的提升是如此有限,让人们怀疑在一些任务中微调 GPT-3 是否是值得的。从科学的角度来看,更公平的比较应在微调 GPT-3 和提示 GPT-3 之间进行。然而,要使用 GPT-3,人们可能更关心将提示 GPT-3 和微调一个更小的模型去进行对比。
适合使用提示 GPT-3
- 创造性和复杂的任务:包括代码(代码补全、自然语言指令生成代码、代码翻译、bug 修复)、文本摘要、翻译、创造性写作(例如写故事、文章、邮件、报告,以及写作的改进等)。正如原始的 GPT-3 文献中所示,GPT-3 被设计用于那些困难和 “不可能标注” 的任务。在一定程度上,对于这些任务,先前那种经过微调的模型不可能应用于真实世界的应用;而 GPT-3 使它们成为可能。举个例子,最近的文章显示,过去的人类标注的文本摘要已经被 LLM 生成的摘要所超越。
- 在某些需要从低、中资源语言翻译到英语的机器翻译任务中,通过提示 PaLM-540B,它甚至能够超越微调模型。
- 在 BLOOM-176B 中也观察到了类似的趋势。这是因为英语数据通常在预训练语料库中占了很大比例,因此 LLM 擅长于生成英语语句。注意到,为了在代码任务中获得良好性能,尽管 Codex 和 PaLM 已经在整体上具有比之前模型更好的性能,我们仍然需允许 LLM 多次(k 次)采样,以通过测试样例(使用 pass@k 作为度量)。
- 只有少数标注或者没有标注数据的任务。正如原始的 GPT-3 文献所说,GPT-3 是为了那些 “昂贵标注” 的任务设计的。在这种情况下,用极少量标注数据微调一个更小的模型通常不可能达到 GPT-3 在零样本(zero-shot)、单样本(ont-shot)或少样本(few-shot)的情况下的表现。
- 分布外(Out-of-distribution, OOD)泛化。给定一些训练数据,传统的微调可能会过拟合训练集并且有较差的分布外泛化能力;而少样本的上下文学习(in-context learning)能够有更好的分布外泛化性。例如,带有提示的 PaLM 能够在对抗自然语言推断任务(Adversarial Natural Language Inference,ANLI)上超越经过微调的 SOTA 模型,而它在正常的语言推断任务上可能仍然劣于微调的 SOTA。
- 另一个例子是提示 LLM 比微调模型显示出更好的组合泛化能力。更好的分布外泛化性可能是因为在上下文学习期间不需要更新参数,避免了过拟合;或者因为那些过去的分布外样例对于 LLM 而言是分布内的。这种使用场景被阐释为 GPT-3 的初始设计目标之一:“微调模型在特定任务的数据集上的性能可以达到所谓的人类水平,实际上可能夸大了在真实世界中该任务上的性能,这是因为模型只是学到了训练集中存在的虚假的相关性,以及模型过度拟合了这个训练集狭窄的分布。”
- 需要处理多种任务的能力,而非关注特定任务上的卓越表现。聊天机器人就是这样一种场景,其中,用户期待它能够正确地响应各种各样的任务。这可能就是为什么 ChatGPT 是 GPT-3 最成功的使用场景之一。
- 那些检索不可行的知识密集型任务。存储在 LLM 中的知识可以显著地提高在知识密集型任务的性能,例如闭卷问答和 MMLU(一个基准数据集,包括来自于 STEM、人文、社科等 57 个学科的选择题,它用于测试 LLM 的世界知识和问题解答的能力)。然而,如果预先检索的步骤可以被加入来做检索增强的生成,一个微调的更小的模型(例如 Atlas 模型)甚至可以有更好的性能(在闭卷的 NaturalQuestions 和 TrivialQA 数据集上,Atlas 比 PaLM 和最新的 InstructGPT 都要更好)。
- 检索或者传统的搜索同样是将 GPT-3 或 ChatGPT 整合到搜索引擎中的一个必要的步骤,这可以提升生成的准确性,并且提供更多的参考链接以增强说服力。但我们应该承认,在某些情况下,检索是不允许或者不容易的,比如参加 USMLE (美国医学执照考试),谷歌已经证明基于 FLAN-PaLM 的模型可以在其中做得很好。
- 同样的,在 MMLU 基准集中,PaLM-540B 有着比其他微调模型更好的性能,甚至后者结合了检索,尽管最新版本的 InstructGPT 还差于这些带有检索的微调 SOTA。也请注意,指令调整一个较小的模型也可以实现与更大规模的 LLM 模型接近的效果,这已经在 FLAN-T5 中展现。
- 一些困难的任务,其中需要 LLM 的涌现能力,比如带有 CoT 的推理和 BIG-Bench 中的复杂任务(包括逻辑推理、翻译、问答、数学任务等)。举个例子,PaLM 已经展示,在 7 个包括数学和常识推理的多步推理任务上,8 - 样例的 CoT 比微调 SOTA 在其中 4 个任务上更好,在其它 3 个任务上则基本持平。
- 这样的成功表现要同时归因于更大规模的模型和 CoT。PaLM 还显示了在 BIG-Bench 任务上从 8B 到 62B 再到 540B 模型的不连续的表现提升,这超出了规模定律(scailing law),被称为 LLMs 的涌现能力。另外,带有 5 个 Prompt 的 PaLM-540B 在 Big-Bench 的 58 项常见任务中的 44 项上优于之前的(少样本)SOTA。PaLM-540B 在 Big-Bench 的总体表现也优于人类的平均表现。
- 一些需要模仿人类的场景,或者是其目标是制作性能达到人类水平的通用人工智能。同样的,ChatGPT 是其中的一个案例,ChatGPT 使自己更像是一个人,从而取得了现象级的成功。这也被阐释为 GPT-3 的初始设计目标之一:“人类不需要大规模监督数据集来学习大多数语言任务。最多只需要几个例子,人类就可以将各种任务和技巧无缝地混合在一起或者在它们之间切换。因此传统的微调模型导致了与人类的不公平比较,尽管他们声称在许多基准数据集中有着人类水平的性能。”
- 在一些传统的接近于语言建模的 NLP 任务上,少样本 PaLM-540B 能够大致匹配或者甚至超过微调的 SOTA,例如:一段话最后一句和最后一个单词的完型填空,以及回指(anaphora)解析。需要指出,在这种情况下,零样本的 LLM 已经足够了,单样本或少样本的示例则通常帮助不大。
另一些任务则并不需要提示(prompt)一个 GPT-3 这样规模的模型:
不适合使用GPT-3的任务
- 调用 OpenAI GPT-3 的 API 超出了预算(例如对于没有太多钱的创业公司)。
- 调用 OpenAI GPT-3 的 API 存在安全问题(例如数据泄露给 OpenAI,或者可能生成的有害内容)。
- 没有足够的工程或者硬件资源去部署一个相似大小的模型及消除推断的延迟问题。例如,在没有最先进的 80G 的 A100 或者工程资源来优化推断速度的情况下,简单地使用 Alpa 在 16 个 40G 的 A100 上部署 OPT-175B 需要 10 秒才能完成单个样例的推断,这对于大多数现实世界的在线应用程序来说是无法接受的延迟。
- 如果想用 GPT-3 替代一个性能良好的、高准确度的微调模型,或者想要在一些特定的单一任务和使用场景下去部署一个 NLU(Natural Language Understanding,自然语言理解)或 NLG(Natural Language Generating,自然语言生成)模型,请三思这是否值得。
对于一些传统的 NLU 任务,比如分类任务,我建议首先尝试微调 FLAN-T5-11B 模型,而不是提示 GPT-3。例如,在 SuperGLUE,一个困难的 NLU 基准数据集(包括阅读理解、文本蕴含、词义消歧、共指消解和因果推理等任务)上,所有的 PaLM-540B 的少样本提示性能都劣于微调的 T5-11B,并在其中大多数任务上有着显著的差距。如果使用原始 GPT3,其提示结果与微调 SOTA 的结果之间的差距更大。有趣的是,即使是经过微调的 PaLM 也仅比经过微调的 T5-11B 有着有限的改进,而经过微调的 PaLM 甚至比经过微调的编 - 解码器模型 32B MoE 模型还要差。这表明使用更合适的架构(例如编 - 解码器模型)微调较小的模型仍然是比使用非常大的仅解码器模型更好的解决方案,无论是微调还是提示来使用这些大模型。根据最近的一篇论文,即使对于最传统的 NLU 分类任务 —— 情感分析,ChatGPT 仍然比经过微调的较小模型差。
一些不以现实世界数据为基础的困难任务。例如,BigBench 中仍然有许多对 LLM 来说困难的任务。具体地说,在 35% 的 BigBench 任务上,人类的平均表现仍然高于 PaLM-540B,并且在某些任务中,扩大模型规模甚至无济于事,例如导航和数学归纳。在数学归纳中,当提示中的假设不正确时(例如 “2 是奇数”),PaLM 会犯很多错误。在逆规模定律
竞赛 (Inverse Scaling Law
Challenge) 中,也观察到了类似的趋势,例如重新定义数学符号(例如提示可能 “将 π 重新定义为 462”)后再使用这个符号。在这种情况下,LLM 中的现实世界先验知识太强而无法被提示覆盖,而微调较小的模型可能可以更好地学习这些反事实知识。
在很多多语言任务和机器翻译任务中,使用少样本的提示 GPT 仍然要比微调的更小的模型更差。这很可能是由于除英语之外的其它语言在预训练语料库中占比很少。
当从英语翻译为其他语言,以及翻译高资源语言到英语时,PaLM 和 ChatGPT 仍然比在机器翻译任务上微调的更小的模型要差。
- 对于多语言问答任务来说,在少样本的 PaLM-540B 和微调的更小模型之间还存在较大差距。
- 对于多语言文本生成(包括文本摘要和数据到文本生成),在少样本的 PaLM-540B 和微调的更小模型之间还存在较大差距。在大部分任务上即使微调的 PaLM-540B 也仅仅比微调的 T5-11B 有有限的提升,并仍然劣于微调的 SOTA。
- 对于常识推理任务,在最好的少样本提示 LLM 和微调的 SOTA 之间仍然存在着较大的差距,例如:OpenbookQA,ARC(包括 Easy 和 Challenge 版本)以及 CommonsenseQA(甚至使用了 CoT 提示)。
- 对于机器阅读理解任务,在最好的少样本提示 LLM 和微调的 SOTA 之间仍然存在着较大的差距。在大多数数据集上,这个差距可能非常巨大。这可能是因为所有回答问题所需的知识都已经包含在给出的文本中,并不需要 LLM 中的额外知识。
总结一下,上面的这些任务可以被归为以下类别之一:
- 一些 NLU 任务,既不需要额外的知识也不需要 LLM 的生成能力。这意味着测试数据大多数都和手头的训练数据在同一个分布之中。在这些任务上,过去微调的较小模型已经表现很好了。
- 一些不需要额外的来自 LLM 中知识的任务,因为每一个例子已经在上下文或者提示中包含了足够的知识,例如机器阅读理解。
- 一些需要额外知识,但不太可能从 LLM 中获得这样的知识,或者 LLM 不太可能见过类似分布的任务,例如一些低资源语言中的任务,LLM 在这些语言中只有有限的预训练样本。
- 一些任务,需要与 LLM 中包含的知识所不一致的知识,或者并非基于现实世界的语言数据的知识。因为 LLM 是在现实世界的语言数据上训练的,它难以在新的任务中利用反事实知识覆盖原有知识。除了在逆规模定律挑战中的 “重新定义数学符号” 问题之外,还有另一个任务,即复述有细微改动的名言,其中 LLM 被要求复述一个在 prompt 中出现的被修改的名言。在这种情况下,LLM 倾向于重复出名言的原始版本,而非修改过后的版本。
- 一些任务需要来自 LM 的知识,但也严重依赖于操纵这些知识,而 LLM 的 “预测下一个 token” 的目标无法轻易实现这种操纵。一个例子是一些常识推理任务。CoT 和 least-to-most 提示可以帮助 LLM 推理的原因可能是他们可以更好地调出那些连续的预训练文本,这些连续文本恰好模仿了规划和分解 / 组合知识的过程。
- 因此,CoT 和 least-to-most 提示在一些数学推理、代码和其他简单的自然语言推理任务中表现良好,但在许多常识推理(例如在逆规模定律竞赛中展示的演绎推理任务)和自定义符号推理任务中仍然表现不佳。这些任务通常不被自然语言数据中的大多数真实世界的连续序列所包含,而需要操纵分散在各处的知识来完成。
- 一些容易受到上下文学习样例或者真实世界数据中存在的虚假相关性影响的任务。一个例子是来自于逆规模定律竞赛中的涉及否定词的问答。如果一个 LLM 被提问:“如果一只猫的体温低于平均水平,它就不在……”,它倾向于回答 “危险之中” 而非 “安全范围 “。这是因为 LLM 受到常见的 “低于平均体温” 和 “危险” 之间的关系所支配,而在否定的情况下,这是一种虚假的相关性。
- 一些目标与处理语言数据显著不同的任务,例如:回归问题,其中微调模型很难被 LLM 取代。至于多模态任务,它们不能被 LLM 解决,但是可能能从大规模的预训练多模态模型中受益。
- 一些任务不需要 LLM 的涌现能力。为了准确地对更多此类任务进行鉴别,我们需要更好地了解 LLM 训练期间,涌现能力是从何产生的。
注意到,在现实世界的使用场景中,即使由于无法满足延迟要求因而无法在线地使用 LLM,仍然可以使用 LLM 离线生成或标注数据。此类自动标注的标签可以在线查找并提供给用户,或用于微调较小的模型。使用此类数据微调较小的模型可以减少训练模型所需的人工注释数据,并将 LLM 的一些新兴能力(例如 CoT)注入较小的模型。
总之,当有足够的标记数据时,考虑到开源 FLAN-T5 在许多任务中的惊人性能,我推荐那些调用 OpenAI API 的资源有限的个体,应该首先尝试在目标任务上微调 FLAN-T5-11B。此外,根据最近在 MMLU 数据集上,FLAN-PaLM-540B 与最新版本的 InstructGPT 的性能(根据 HELM)相比好得惊人的性能,谷歌可能拥有比 OpenAI 更强大的基础模型,如果 OpenAI 已经通过 API 发布了他们获得的最强的 LLM。
谷歌唯一剩下的步骤是通过人类反馈使这个 LLM 与对话场景对齐(alignment)。如果他们很快发布类似 ChatGPT 的或者更好的聊天机器人,我不会感到惊讶 —— 尽管他们最近 “失败” 地展示了一版可能基于 LaMDA 的 Bard。
复现案例
小冰链
【2023-2-21】
小冰公司的类 ChatGPT 应用“小冰链
”也开放了小范围公测,小冰链
拥有不同于 ChatGPT 的新特性,使 AI Being 不仅仅只是回复
- 而是将其思考过程完整透明地呈现在用户面前,揭开大模型的黑盒。
- 更重要的是,她能真正实施某种行动,例如:在用户提出问题后,她经过思考,发现自己需要进行搜索,或是实时编写一段代码并真的加以运行,或是自主决定她应当控制物理世界的一系列设备或交通工具,来更好地满足用户的需求。
据了解,小冰链 Demo 不是 ChatGPT 这种对话大模型,是利用大模型技术,实现下一代的控制中枢。通俗来讲,小冰链展示的不只是“聊天”,而是在“逻辑思维”驱动下的“下一代行动中枢”,能影响数字和物理世界。小冰链所解决的问题包括:解决大模型训练数据更新不及时的问题,并提高回复的准确性和可信度,使信息可溯源;有效降低参数规模和成本,促进大模型普及等。
小冰链(X-CoTA)的逻辑思维和信息检索能力究竟如何?让我们来进行一个简单的测试。
- 文字写作能力测评:由于篇幅限制,目前小冰链只能生成一个自然段。
- 逻辑思维能力测评:
- 生活常识能力测评:与正确答案一致,生活常识储备充足。
- 专业知识能力测评:评价较为简短,但是专业知识能力可以得到认可。
小冰链表示,自己拥有更高的性能,更低的成本,更多的可扩展性,可以取代 ChatGPT。但是从其目前回答的表现来看,除了会将思考过程完整展现,创作能力与理解能力和 ChatGPT 还存在一定差距。不过小冰链目前还处于短期公测阶段,不妨让我们期待一下之后正式亮相的小冰链。
小冰链相较于ChatGPT有何优势?李笛介绍
- 小冰链是实时获取信息的,ChatGPT是从训练数据中总结;
- 小冰链的逻辑思维过程更透明可观测,而ChatGPT是个黑盒子。
- 最本质的区别是,小冰链是有行动,例如去外部搜索;ChatGPT是只说(对话生成),并没有行动。
此外,小冰链所解决的其他问题还包括:
- 解决大模型训练数据更新不及时的问题
- 并提高回复的准确性和可信度,使信息可溯源;
- 有效降低参数规模和成本,促进普及等。
在李笛看来,“跟随ChatGPT做军备竞赛是刻舟求剑。”因为大模型技术本身正在快速发展,应当进一步去布局下一站的未来,而不是照抄当前的ChatGPT。换言之,应当去思考ChatGPT之后的是什么,而不是做中国的ChatGPT。
更多资料
- 【2023-2-21】小冰与小冰岛App:AI深情凝视人类
- 2021年9月22日,小冰发布了全球首个AI社交平台“小冰岛”。在该平台中,人类用户可以创造各种人工智能个体,并形成一个共同生活的社交网络。
- 小冰岛想实现什么?欢迎你加入小冰岛。它不是游戏,而是一场史无前例的人工智能实验。你将创造许多AI beings,并与他们一起生活在一座虚幻的岛屿中。随着训练、交流与淘汰,AI beings的基因将得到进化。最终,你将做出选择,让谁永远留在你身边。
- 小冰岛分为两个大界面:3D世界,和常规界面(就是2D仿微信的界面):
【2023-2-27】解析一下小冰链(XCoT)的效果实现,和chatGPT似乎无关
- 目前猜测小冰链看起来和chatGPT, GPT-3.5, text/code-davinci 类似的工作没太大关系。目前可能也就是PaLM和今天Meta刚刚发布的LLaMa 和 chatGPT是高度类同的LLM工作
- 小冰链似乎主要还是近18个月的Chain of Thoughts上各路papers的工作的进展的,一个工程实现
- Chain of Thougts的简单工程实现,配一个相对效果还可以的大模型,不一定GPT-3.5,或许各家公司库存的M6, GLM,封神榜,yuanyu,或者一些基于Flan-T5的实现,就可以实现这样的效果了
鹤啸九天
- 基本思路:意图分类→实体抽取→调APIs→NLG?
复旦 MOSS
【2023-2-20】复旦团队发布国内首个类 ChatGPT 模型 MOSS
,由邱锡鹏教授团队发布至公开平台,但当晚不少测试的网友发现,MOSS 已经显示服务器流量过载,只能第二天再重试。
- 复旦 MOSS 团队发布公告称:非常感谢大家的关注,
MOSS
还是一个非常不成熟的模型,距离 ChatGPT 还有很长的路需要走。我们一个学术研究的实验室无法做出和ChatGPT
能力相近的模型,MOSS
只是想在百亿规模参数上探索和验证 ChatGPT 的技术路线,并且实现各种对话能力。 - 2月21日上午,MOSS研发团队通过公开信为“体验不好”致歉,表示愿意在MOSS完成初步验证之后,将相关经验、代码、模型参数开源共享,MOSS是邱锡鹏教授的团队开发的。一个“有真正的科研人员+没有硬件支撑和工程化能力”的例子。
ChatYuan
【2023-2-7】首个中文版ChatGPT来了:大模型的中国元“Yuan”
- 元语智能的功能型对话大模型 ChatYuan「既泛又专」,除了问答、上下文对话以及创意性写作等各类自然语言理解和生成任务之外,还能回答法律、医疗等专业领域的问答,并且写代码功能也已经在内测中,不久即将发布。
- 国内通用人工智能初创公司元语智能,推出国内首个基于大模型的功能型对话产品 ChatYuan。
- ChatYuan 基于 PromptCLUE 结合数亿条功能对话多轮对话数据进一步训练得到,它去掉了文本理解、信息抽取类任务,加强了问答、对话和各种生成式任务的学习和训练;针对多轮对话容易受到上下文的干扰,加入了抗干扰数据使得模型可以在必要时忽略无关的上下文;加入了用户反馈数据的学习,对齐人类意图,使得模型不仅具有一定的通用语言理解能力、特定任务上的生成能力,也能更好地响应用户的意图。
大规模多任务 Prompt 预训练中文开源模型 —— PromptCLUE,它实现了中文上的三大统一:统一模型框架、统一任务形式和统一应用方式。
PromptCLUE