chatGPT模型参数 可直训ChatGPT类模型!华师大、NUS开源HugNLP框架:一键刷榜
【新智元导读】一站式NLP工具箱,你想要的全都有!
近日,华师大团队研发了框架,这是一个面向研究者和开发者的全面统一的NLP训练框架,可支持包括文本分类、文本匹配、问答、信息抽取、文本生成、小样本学习等多种NLP任务模型搭建和训练。
开源地址:
论文:
值得注意的是,还集成了大量最新的技术,例如-、In- 、-,未来还将引入-of-
团队还研发了一系列的应用,例如CLUE&GLUE刷榜工具,可支持类模型训练和部署产品,以及统一信息抽取产品等。
是一个分层式框架,遵循“高内聚低耦合”的开发模式,其核心包括模型层()、处理器层()、评估器层()和应用层()四部分。
框架图如下所示:
完全基于开发,具有易扩展、易部署能力,同时集成了训练追踪器,方便使用者及时追踪实验进度,并进行实验分析。
框架之所以称为全面,是因为其集成了大量的NLP任务模型,目前已经实现的包括:
快速部署框架,只需要执行代码三行命令即可:
git clone https://github.com/HugAILab/HugNLP.git
cd HugNLP
python3 setup.py install
下面介绍的几个核心能力:
一、一键刷榜
最先开发了面向一些常用榜单的刷榜工具,例如GLUE、CLUE等。用户只需要配置相应的数据集名称,即可实现一键刷榜。
为了验证框架的有效性,在22年9月提交了CLUE榜单的刷榜结果,选择一系列中文小模型(、、P-BERT等)并结合了集成方法,至今依然维持在第15名位置,曾一度超越了部分企业。
例如如果训练CLUE榜单的数据集,可编辑文件
applications/benchmark/clue/clue_finetune_dev.sh
修改参数:
--user_defined="data_name=afqmc"
执行下列命令即可:
bash applications/benchmark/clue/clue_finetune_dev.sh
同样的方法还可以训练一些常用的NLP任务,例如阅读理解、实体识别、以及GLUE英文数据集等。
还集成了一系列模型用于刷榜,例如BERT、、、、等。
二、预训练与知识注入
传统的一些预训练模型(例如BERT、GPT2等)是在通用语料上训练的,而对领域事实知识可能不敏感,因此需要显式的在预训练阶段注入事实知识。
在中,主要实现了几个知识增强预训练,包括和KP-PLM。是一种可分解的知识注入方法;KP-PLM则是将结构化知识转化为自然语言描述的形式进行注入。这些知识注入的方法是可插拔式的,因此无需修改模型结构,很容易用于下游任务的微调。
执行下面命令即可进行 和 的预训练:
bash applications/pretraining/run_pretrain_mlm.sh
bash applications/pretraining/run_pretrain_casual_lm.sh
三、 Fine- & -
基于预训练语言模型的NLPchatGPT模型参数,通常遵循Pre-和Fine-范式。也包含Fine-技术。
3.1 参数有效性学习
集成了包括-、、、LoRA等参数有效性训练方法,可以加速模型的训练,降低显存占用量。
在训练脚本中,只需要添加一行参数,即可开启参数有效性训练:
--use_freezing
对于参数有效性方法,实现了若干类别的分类模型,如下所示:
CLASSIFICATION_MODEL_CLASSES = {
"head_prefix_cls": {
"bert": BertPrefixForSequenceClassification,
"roberta": RobertaPrefixForSequenceClassification,
},
"head_ptuning_cls": {
"bert": BertPtuningForSequenceClassification,
"roberta": RobertaPtuningForSequenceClassification,
},
"head_adapter_cls": {
"bert": BertAdapterForSequenceClassification,
"roberta": RobertaAdapterForSequenceClassification,
},
"masked_prompt_cls": {
"bert": PromptBertForSequenceClassification,
"roberta": PromptRobertaForSequenceClassification,
},
"masked_prompt_prefix_cls": {
"bert": PromptBertPrefixForSequenceClassification,
"roberta": PromptRobertaPrefixForSequenceClassification,
},
"masked_prompt_ptuning_cls": {
"bert": PromptBertPtuningForSequenceClassification,
"roberta": PromptRobertaPtuningForSequenceClassification,
},
"masked_prompt_adapter_cls": {
"bert": PromptBertAdapterForSequenceClassification,
"roberta": PromptRobertaAdapterForSequenceClassification,
},
}
只需要指定下面参数即可,例如选择进行分类:
--task_type=head_adapter_cls
3.2 对抗训练:引入对的扰动,提高模型的鲁棒性
框架集成了若干种对抗训练的方法,其中最简单的对抗方法为FGM算法:
在训练时,只需要添加一行参数,即可默认调用FGM算法:
--do_adv
3.3 -:通过模板来复用预训练目标
传统的Fine-在低资源场景下容易出现过拟合问题,因此复用预训练的目标可以拉近Pre-和Fine-之间的语义差异。
集成了PET、P-、-等-算法,并无缝嵌入在NLP分类任务的模型里。
在训练时,只需要指定下面两个参数,即可以开启-模式,例如选择p-算法:
--task_type=masked_prompt_ptuning_cls
--use_prompt_for_cls
四、-
在大模型时代,如何将不同类型的NLP任务进行范式统一,是构造通用人工智能的核心要素。为此定义了三种统一范式的思想:
基于三种不同的范式统一,推出两个核心产品,分别是:
4.1 :基于 的生成式对话模型
最近火爆全球,为了让研究者可以训练自己的,框架集成了基于生成式的训练产品——,其支持各种类型的单向生成式模型的训练,例如GPT-2、GPT-Neo、OPT、GLM、等。
在8张V100 32G的条件下chatGPT模型参数,可训练OPT-13B大模型。团队开源了约200万条英文、300万条中文对话数据,用于训练模型。例如训练GPT-2(XL),可直接执行脚本:
bash ./application/instruction_prompting/HugChat/supervised_finetuning/run_causal_instruction_gpt2_xl.sh
基于,训练的GPT-2(1.3B)模型,即可实现很简单的对话任务。只需要执行如下命令即可玩转:
python3 applications/instruction_prompting/HugChat/hugchat.py
例如可以写套磁信邮件:
再例如搜索谷歌地球的相关信息:
也可以实现编写简单的代码(1.3B的模型具备此能力已经很惊叹了!):
目前正在开发其他类型的-only大模型,相关信息和开源内容如下表所示:
后期将推出垂直领域的大模型解决方案,同时将与 API进行融合,推出大模型服务框架。
4.2 :基于 的统一信息抽取框架
信息抽取( )旨在从非结构化的文本中抽取出结构化信息,是构建知识库的重要步骤之一。通常信息抽取包括两个核心步骤,分别是命名实体识别( )和关系抽取( )。
我们基于研发一款产品,旨在实现统一信息处理。其主要核心包括如下几个部分:
目前已经开源了模型: 可以基于框架使用抽取模型,如下图所示:
五、In-
In- (ICL)首次由GPT-3提出,其旨在挑选少量的标注样本作为提示(),从而在形式上促使大模型生成目标答案。ICL的优势在于无需对参数进行更新,即可实现惊艳的效果。
框架集成了ICL,主要涉及到样本的挑选和预测结果的校准两个部分:
目前ICL已经集成在里,只需要指定下面参数即可:
--user_defined="data_name=xxx num_incontext_example=4 l=1 use_calibrate=True"
--use_prompt_for_cls
六、半监督Self-
半监督旨在同时结合标注数据和无标签数据来训练NLP任务。Self-是一种简单但有效的迭代式训练方法,其通过模型先获取伪标签,对伪标签进行去噪后,再训练模型。传统的Self-会引入大量噪声,从而降低训练的效果。
为了提高性能,引入成熟的- Self-技术。框架图如下所示:
其采用了来自贝叶斯推断中的MC 技术,即对模型执行次推理chatGPT模型参数,每次推理开启开关,从而得到若干与模型满足独立同分布的模型预测。
基于这些预测结果,可以通过信息熵的变化量得到模型对无标签数据的不确定性量化指标(即BALD算法),核心公式如下:
进行多次DC 的代码实现如下(详见.py):
y_T = list()
for i in tqdm(range(T)):
y_pred = []
for step, inputs in enumerate(unlabeled_dataloader):
logits, __ = self.prediction_step(model, inputs, prediction_loss_only, ignore_keys=ignore_keys)
y_pred.extend(logits.detach().cpu().numpy().tolist())
predict_proba = torch.softmax(torch.Tensor(y_pred).to(logits.device), -1)
y_T.append(predict_proba.detach().cpu().numpy().tolist())
y_T = np.array(y_T)
#compute mean
y_mean = np.mean(y_T, axis=0)
BALD算法实现如下:
def get_BALD_acquisition(y_T):
expected_entropy = - np.mean(np.sum(y_T * np.log(y_T + 1e-10), axis=-1), axis=0)
expected_p = np.mean(y_T, axis=0)
entropy_expected_p = - np.sum(expected_p * np.log(expected_p + 1e-10), axis=-1)
return (entropy_expected_p - expected_entropy)
使用半监督模式,只需要做两件事:
(1)执行脚本时添加参数:
--use_semi
(2)在指定的数据集目录下,存放 data文件。
七、其他更丰富的应用
目前还开发了很多应用如下所示:还有更多丰富的应用正在开发中。也欢迎有志之士加入参与开源开发工作。
团队介绍
参考资料:
免责声明:本文系转载,版权归原作者所有;旨在传递信息,不代表本站的观点和立场和对其真实性负责。如需转载,请联系原作者。如果来源标注有误或侵犯了您的合法权益或者其他问题不想在本站发布,来信即删。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。