2023年09月13日

什么情况用Bert模型,什么情况用LLaMAChatGLM类大模型,咋选?

答:Bert 的模型由多层双向的Transformer编码器组成,由12层组成,768隐藏单元,12head,总参数量110M,约1.15亿参数量。NLU(自然语言理解)任务效果很好,单卡GPU可以部署,速度快,V100GPU1秒能处理2千条以上。

ChatGLM-6B, LLaMA-7B模型分别是60亿参数量和70亿参数量的大模型,基本可以处理所有NLP任务,效果好,但大模型部署成本高,需要大显存的GPU,并且预测速度慢,V100都需要1秒一条。

所以建议:

1NLU相关的任务,用BERT模型能处理的很好,如实体识别、信息抽取、文本分类,没必要上大模型;

2NLG任务,纯中文任务,用ChatGLM-6B,需要处理中英文任务,用chinese-alpaca-plus-7b-hf

微调方法是啥?如何微调?

答:当前主流微调方法分为:Fine-tuneprompt-tune

fine-tune,也叫全参微调,bert微调模型一直用的这种方法,全部参数权重参与更新以适配领域数据,效果好。

prompt-tune, 包括p-tuningloraprompt-tuningadaLoRAdelta tuning方法,部分模型参数参与微调,训练快,显存占用少,效果可能跟FTfine-tune)比会稍有效果损失,但一般效果能打平。

链家在BELLE的技术报告《A Comparative Study between Full-Parameter and LoRA-based Fine-Tuning on Chinese Instruction Data for Instruction Following Large Language Model》中实验显示:FT效果稍好于LoRA

peft的论文《ADAPTIVE BUDGET ALLOCATION FOR PARAMETER- EFFICIENT FINE-TUNING》显示的结果:AdaLoRA效果稍好于FT

关于lora微调多补充几点:

基础模型的选择对基于LoRA微调的有效性有显著影响。

训练集越多效果越好

LoRA微调的方法在模型参数越大时体现的优势越明显

此结论参考技术报告《A Comparative Study between Full-Parameter and LoRA-based Fine-Tuning on Chinese Instruction Data for Instruction Following Large Language Model》。

LoRA微调方法为啥能加速训练?

答:有如下几个原因:

只更新了部分参数:比如LoRA原论文就选择只更新Self Attention的参数,实际使用时我们还可以选择只更新部分层的参数;

减少了通信时间:由于更新的参数量变少了,所以(尤其是多卡训练时)要传输的数据量也变少了,从而减少了传输时间;

采用了各种低精度加速技术,如FP16FP8或者INT8量化等。

这三部分原因确实能加快训练速度,然而它们并不是LoRA所独有的,事实上几乎都有参数高效方法都具有这些特点。LoRA的优点是它的低秩分解很直观,在不少场景下跟全量微调的效果一致,以及在预测阶段不增加推理成本。

如何训练自己的大模型?

答:如果我现在做一个sota的中文GPT大模型,会分2步走:1. 基于中文文本数据在LLaMA-65B上二次预训练; 2. CoTinstruction数据, FT + LoRA SFT

提炼下方法,一般分为两个阶段训练:

第一阶段:扩充领域词表,比如金融领域词表,在海量领域文档数据上二次预训练LLaMA模型;

第二阶段:构造指令微调数据集,在第一阶段的预训练模型基础上做指令精调。还可以把指令微调数据集拼起来成文档格式放第一阶段里面增量预训练,让模型先理解下游任务信息。

当然,有低成本方案,因为我们有LoRA利器,第一阶段和第二阶段都可以用LoRA训练,如果不用LoRA,就全参微调,大概7B模型需要8A100,用了LoRA后,只需要单卡3090就可以了。

第一阶段数据格式:

第二阶段的数据样例:

给一个法律模型训练的参考示例:https://github.com/pengxiao-song/LaWGPT

训练中文大模型有啥经验?

答:链家技术报告《Towards Better Instruction Following Language Models for Chinese: Investigating the Impact of Training Data and Evaluation》中,介绍了开源模型的训练和评估方法:

还对比了各因素的消融实验:

消融实验结论:

扩充中文词表后,可以增量模型对中文的理解能力,效果更好

数据质量越高越好,而且数据集质量提升可以改善模型效果

数据语言分布,加了中文的效果比不加的好

数据规模越大且质量越高,效果越好,大量高质量的微调数据集对模型效果提升最明显。解释下:数据量在训练数据量方面,数据量的增加已被证明可以显著提高性能。值得注意的是,如此巨大的改进可能部分来自belle-3.5和我们的评估数据之间的相似分布。评估数据的类别、主题和复杂性将对评估结果产生很大影响

扩充词表后的LLaMA-7B-EXT的评估表现达到了0.762/0.824=92%的水平

他们的技术报告证明中文大模型的训练是可行的,虽然与ChatGPT还有差距。这里需要指出后续RLHF也很重要,我罗列在这里,抛砖引玉。

微调需要多少条数据?

答:取决于预训练数据和微调任务的数据分布是否一致,分布一致,100条就够,分布差异大就需要多些数据,千条或者万条以上为佳。

自己的任务复杂或者下游任务行业比较冷门,如药品名称识别任务,则需要较多监督数据。还有微调大模型时,一遍是记不住的。100条的微调数据,epochs=20才能稳定拟合任务要求。

指令微调的好处?

答:有以下好处:

对齐人类意图,能够理解自然语言对话(更有人情味)

经过微调(fine-tuned),定制版的GPT-3在不同应用中的提升非常明显。OpenAI表示,它可以让不同应用的准确度能直接从83%提升到95%、错误率可降低50%。解小学数学题目的正确率也能提高2-4倍。(更准)

踩在巨人的肩膀上、直接在1750亿参数的大模型上微调,不少研发人员都可以不用再重头训练自己的AI模型了。(更高效)

涌现能力是啥原因?

答:根据前人分析和论文总结,大致是2个猜想:

任务的评价指标不够平滑;

复杂任务 vs 子任务,这个其实好理解,比如我们假设某个任务 T 5 个子任务 Sub-T 构成,每个 sub-T 随着模型增长,指标从 40% 提升到 60%,但是最终任务的指标只从 1.1% 提升到了 7%,也就是说宏观上看到了涌现现象,但是子任务效果其实是平滑增长的。

如何在已有LoRA模型上继续训练?

答:我理解此问题的情形是:已有的lora模型只训练了一部分数据,要训练另一部分数据的话,是在这个lora上继续训练呢,还是跟base 模型合并后再套一层lora,或者从头开始训练一个lora

我认为把之前的LoRAbase model 合并后,继续训练就可以,为了保留之前的知识和能力,训练新的LoRA时,加入一些之前的训练数据是需要的。另外,每次都重头来成本高。

大模型怎么评测?

答:当前superGLUE, GLUE, 包括中文的CLUE benchmark都在不太合适评估大模型。可能评估推理能力、多轮对话能力是核心。

大模型的honest原则是如何实现的?模型如何判断回答的知识是训练过的已知的知识,怎么训练这种能力?

答:大模型需要遵循的helpfulhonest harmless的原则。

可以有意构造如下的训练样本,以提升模型准守honest原则,可以算trick了:

微调时构造知识问答类训练集,给出不知道的不回答,加强honest原则;

阅读理解题,读过的要回答,没读过的不回答,不要胡说八道。

各个专业领域是否需要各自的大模型来服务?

答:是,各行各业的大模型是趋势。

大模型有推理能力吗?

答:大模型有推理能力。有下面2个方面的体现:

ChatGPT拥有in-context correction的能力,即如果说错了,给出矫正,ChatGPT能“听懂”错在哪儿了,并向正确的方向修正。in-context correction要比in-context learning难了太多,描述越详细清楚,ChatGPT回答得越好。要知道,越详细的描述,在预训练的文本里越难匹配到的。

在询问ChatGPT互联网上并不存在内容的时候,能给出较好答案(如用ChatGPT学建模);ChatGPT能通过信息猜你心中的想法;你可以制定一个全新的游戏规则让ChatGPT和你玩,ChatGPT可以理解。

预训练和微调哪个阶段注入知识的?

答:预训练阶段注入知识的,微调是在特定任务训练,以使预训练模型的通用知识跟特定任务的要求结合,使模型在特定任务上表现更好。

我想让模型学习某个领域或行业的知识,是应该预训练还是应该微调?

答:可以使用预训练和微调相结合的方式,先用篇章数据进行预训练以获取广泛的知识,再用问答对数据进行微调,使模型更好的学习到特定领域的知识。

当然,GPT大模型的预训练和微调,从实现方式来讲是没有什么差别的,都是decoder only的语言模型训练并更新参数,如果样本集小,没有大量的篇章文档数据,我认为只进行微调也能注入知识的,不必太纠结预训练。而且特定领域跟预训练模型的分布差别不大,也不用二次预训练。

多轮对话任务如何微调模型?

答:跟正常的指令微调方法一样,只是组织数据的时候把历史聊天记录拼接起来,作为上下文信息喂给模型。

{"prompt": "长城h3风扇不转。继电器好的。保险丝好的传感器新的风扇也新的这是为什么。就是继电器缺一个信号线", 
"response": "用电脑能读数据流吗?水温多少", "history": []}
{"prompt": "95", "response": "上下水管温差怎么样啊?空气是不是都排干净了呢?", 
"history": [["长城h3风扇不转。继电器好的。保险丝好的传感器新的风扇也新的这是为什么。就是继电器缺一个信号线", 
"用电脑能读数据流吗?水温多少"]]}
{"prompt": "是的。上下水管都好的", "response": "那就要检查线路了,一般风扇继电器是由电脑控制吸合的,如果电路存在断路,
或者电脑坏了的话会出现继电器不吸合的情况!", "history": [["长城h3风扇不转。继电器好的。保险丝好的传感器新的风扇也新的这是为什么。
就是继电器缺一个信号线", "用电脑能读数据流吗?水温多少"], ["95", "上下水管温差怎么样啊?空气是不是都排干净了呢?"]]}

微调后的模型出现能力劣化,灾难性遗忘是怎么回事?

答:所谓的灾难性遗忘:即学习了新的知识之后,几乎彻底遗忘掉之前习得的内容。这在微调ChatGLM-6B模型时,有同学提出来的问题,表现为原始ChatGLM-6B模型在知识问答如“失眠怎么办”的回答上是正确的,但引入特定任务(如拼写纠错CSC)数据集微调后,再让模型预测“失眠怎么办”的结果就答非所问了。

我理解ChatGLM-6B模型是走完 “预训练-SFT-RLHF” 过程训练后的模型,其SFT阶段已经有上千指令微调任务训练过,现在我们只是新增了一类指令数据,相对大模型而已,微调数据量少和微调任务类型单一,不会对其原有的能力造成大的影响,所以我认为是不会导致灾难性遗忘问题,我自己微调模型也没出现此问题。

应该是微调训练参数调整导致的,微调初始学习率不要设置太高,lr=2e-5或者更小,可以避免此问题,不要大于预训练时的学习率。

微调模型需要多大显存?

答:

有哪些大模型的训练集?

答:预训练数据集togethercomputer/RedPajama-Data-1T「红睡衣」开源计划总共包括三部分:

高质量、大规模、高覆盖度的预训练数据集;

在预训练数据集上训练出的基础模型;

指令调优数据集和模型,比基本模型更安全、可靠。

预训练数据集RedPajama-Data-1T已开源,包括七个子集,经过预处理后得到的token数量大致可以匹配Meta在原始LLaMA论文中报告的数量,并且数据预处理相关脚本也已开源。

完整的RedPajama-Data-1T数据集需要的存储容量为压缩后3TB,解压后5TB

CoT微调数据集:Alpaca-CoT 里面包括常用的alpacaCoT等数据集,有中文的。

模型生成时的参数怎么设置?

答:生成模型预测调参建议:

建议去调整下 top_p, num_beams, repetition_renalty, temperature, do_sample=True;

数据生成有重复,调高repetition_renalty

生成任务表达单一的,样本也不多的,可适当调低 temperature,生成的样子跟训练集的比较像;如果要复现训练集的效果,temperature=0.01即可。

以上是经验参数,具体调参根据任务而定,不是固定的。

参数解释:

top_p=0.9,
#Moderately increase the probability threshold of nucleus sampling to increase the quantity of candidate tokens 
and increase generation diversity.
temperature=1.0,
#The previous low temperature parameter could lead to a severe polarization in the probability distribution 
of generated words, which degenerates the generation strategy into greedy decoding.
do_sample=True,
#do_sample parameter is set to False by default. After setting to True, the generation methods turn into 
beam-search multinomial sampling decoding strategy.
no_repeat_ngram_size=6,
#Configure the probability of the next repeating n-gram to 0, to ensure that there are no n-grams appearing twice. 
This setting is an empirical preliminary exploration.
repetition_penalty=1.8,
#For words that have appeared before, in the subsequent prediction process, we reduce the