****训练医疗大模型,实现包括二次预训练、有监督微调、奖励建模、强化学习训练。
版本迭代
V1:发布中文医疗LoRA模型,基于Ziya-LLaMA-13B-v1模型,SFT微调了一版医疗模型,医疗问答效果有提升,发布微调后的LoRA权重,
V0:以医疗为例,训练领域大模型,实现了四阶段训练:包括二次预训练、有监督微调、奖励建模、强化学习训练。
基于ChatGPTTrainingPipeline,本项目实现了领域模型--医疗模型的四阶段训练:
trainingargs:
evaluateloss:
本项目开源在githubrepo:
Installpackage:
First,youpassyourinputthroughthetransformermodel,thenyougetthegeneratedsentence.
姜子牙通用大模型V1是基于LLaMa的130亿参数的大规模预训练模型,具备翻译,编程,文本分类,信息抽取,摘要,文案生成,常识问答和数学计算等能力。目前姜子牙通用大模型已完成大规模预训练、多任务有监督微调和人类反馈学习三阶段的训练过程。
TheZiya-LLaMA-13B-v1isalarge-scalepre-trainedmodelbasedonLLaMAwith13billionparameters.Ithastheabilitytoperformtaskssuchastranslation,programming,textclassification,informationextraction,summarization,copywriting,commonsenseQ&A,andmathematicalcalculation.TheZiya-LLaMA-13B-v1hasundergonethreestagesoftraining:large-scalecontinualpre-training(PT),multi-tasksupervisedfine-tuning(SFT),andhumanfeedbacklearning(RM,PPO).
为了解决LLaMA原生分词对中文编解码效率低下的问题,我们在LLaMA词表的基础上增加了7k+个常见中文字,通过和LLaMA原生的词表去重,最终得到一个39410大小的词表,并通过复用Transformers里LlamaTokenizer来实现了这一效果。
训练期间,虽然遇到了机器宕机、底层框架bug、lossspike等各种问题,但我们通过快速调整,保证了增量训练的稳定性。我们也放出训练过程的loss曲线,让大家了解可能出现的问题。
在多任务有监督微调阶段,采用了课程学习(curiculumlearning)和增量训练(continuallearning)的策略,用大模型辅助划分已有的数据难度,然后通过“EasyToHard”的方式,分多个阶段进行SFT训练。
SFT训练数据包含多个高质量的数据集,均经过人工筛选和校验:
在多任务学习的监督微调(SFT)阶段,我们使用了课程学习和增量训练策略。我们利用大模型辅助对现有数据进行难度划分,然后采用“由易到难”的方法分阶段进行SFT训练。
为了进一步提升模型的综合表现,使其能够充分理解人类意图、减少“幻觉”和不安全的输出,基于指令微调后的模型,进行了人类反馈训练(Human-FeedbackTraining,HFT)。在训练中,我们采用了以人类反馈强化学习(RM、PPO)为主,结合多种其他手段联合训练的方法,手段包括人类反馈微调(Human-FeedbackFine-tuning,HFFT)、后见链微调(Chain-of-HindsightFine-tuning,COHFT)、AI反馈(AIFeedback)和基于规则的奖励系统(Rule-basedRewardSystem,RBRS)等,用来弥补PPO方法的短板,加速训练。
我们在内部自研的框架上实现了HFT的训练流程,该框架可以利用最少8张40G的A100显卡完成Ziya-LLaMA-13B-v1的全参数训练。在PPO训练中,我们没有限制生成样本的长度,以确保长文本任务的奖励准确性。每次训练的总经验池尺寸超过100k样本,确保了训练的充分性。
我们提供了一个简洁的基于gradio的交互式web界面,启动服务后,可通过浏览器访问,输入问题,模型会返回答案。
启动服务,命令如下:
pythongradio_demo.py--model_typebase_model_type--base_modelpath_to_llama_hf_dir--lora_modelpath_to_lora_dir参数说明:
Thefollowingmodelsaretested:
bloom:
llama:
chatglm:
baichuan:
第一阶段:PT(ContinuePreTraining)增量预训练
使用百科类文档类数据集,用来在领域数据集上增量预训练或二次预训练,期望能把领域知识注入给模型,以医疗领域为例,希望增量预训练,能让模型理解感冒的症状、病因、治疗药品、治疗方法、药品疗效等知识,便于后续的SFT监督微调能激活这些内在知识。
这里说明一点,像GPT3、LLaMA这样的大模型理论上是可以从增量预训练中获益,但增量预训练需要满足两个要求:1)高质量的预训练样本;2)较大的计算资源,显存要求高,即使是用LoRA技术,也要满足block_size=1024或2048长度的文本加载到显存中。
其次,如果你的项目用到的数据是模型预训练中已经使用了的,如维基百科、ArXiv等LLaMA模型预训练用了的,则这些数据是没有必要再喂给LLaMA增量预训练,而且预训练样本的质量如果不够高,也可能会损害原模型的生成能力。
tips:PT阶段是可选项,请慎重处理。
基于llama-7b模型,使用医疗百科类数据继续预训练,期望注入医疗知识到预训练模型,得到llama-7b-pt模型
Continuepretrainingofthebasellama-7bmodeltocreatellama-7b-pt:
第二阶段:SFT(SupervisedFine-tuning)有监督微调
基于llama-7b-pt模型,使用医疗问答类数据进行有监督微调,得到llama-7b-sft模型
Supervisedfine-tuningofthebasellama-7b-ptmodeltocreatellama-7b-sft
第三阶段:RM(RewardModel)奖励模型建模
RM(RewardModel)奖励模型,原则上,我们可以直接用人类标注来对模型做RLHF微调。
然而,这将需要我们给人类发送一些样本,在每轮优化后计分。这是贵且慢的,因为收敛需要的训练样本量大,而人类阅读和标注的速度有限。一个比直接反馈更好的策略是,在进入RL循环之前用人类标注集来训练一个奖励模型RM。奖励模型的目的是模拟人类对文本的打分。
构建奖励模型的最佳实践是预测结果的排序,即对每个prompt(输入文本)对应的两个结果(yk,yj),模型预测人类标注的比分哪个更高。RM模型是通过人工标注SFT模型的打分结果来训练的,目的是取代人工打分,本质是个回归模型,用来对齐人类偏好,主要是"HHH"原则,具体是"helpful,honest,harmless"。
基于llama-7b-sft模型,使用医疗问答偏好数据训练奖励偏好模型,训练得到llama-7b-reward模型
Rewardmodelingusingdialogpairsfromtherewarddatasetusingthellama-7b-sfttocreatellama-7b-reward:
第四阶段:RL(ReinforcementLearning)基于人类反馈的强化学习(RLHF)
RL(ReinforcementLearning)模型的目的是最大化奖励模型的输出,基于上面步骤,我们有了微调的语言模型(llama-7b-sft)和奖励模型(llama-7b-reward),可以开始执行RL循环了。
这个过程大致分为三步:
基于llama-7b-reward模型RL微调训练llama-7b-sft模型,得到llama-7b-rl模型
ReinforcementLearningfine-tuningofllama-7b-sftwiththellama-7b-rewardrewardmodeltocreatellama-7b-rl
pythoninference.py\--model_typebase_model_type\--base_modelpath_to_llama_hf_dir\--lora_modelpath_to_lora\--with_prompt\--interactive