HugNLP发布,集成多种NLP任务,可训ChatGPT类模型

news2025/1/17 15:58:46

HugNLP发布,集成多种NLP任务,可训ChatGPT类模型

作者:王嘉宁

HugNLP——全面统一的NLP框架开源了!

近日,华师大HugAILab团队研发了HugNLP框架,这是一个面向研究者和开发者的全面统一的NLP训练框架,可支持包括文本分类、文本匹配、问答、信息抽取、文本生成、小样本学习等多种NLP任务模型搭建和训练。

开源地址:https://github.com/HugAILab/HugNLP

论文:https://arxiv.org/abs/2302.14286

值得注意的是,HugNLP还集成了大量最新的Prompt技术,例如Prompt-Tuning、In-Context Learning、Instruction-tuning,未来还将引入Chain-of-thought。

HugAILab团队还研发了一系列的应用,例如CLUE&GLUE刷榜工具,可支持ChatGPT类模型训练和部署产品HugChat,以及统一信息抽取产品HugIE等。

HugNLP是一个分层式框架,遵循“高内聚低耦合”的开发模式,其核心包括模型层(Models)、处理器层(Processors)、评估器层(Evaluators)和应用层(Applications)四部分。框架图如下所示:

  • 模型层:包含模型部分,主要按照任务类型进行划分;
  • 处理器层:对数据进行加载、缓存、分词等处理,并转换为模型输入的Tensor;
  • 评估器层:根据不同类型的任务(分类或生成),指定不同的评估流程和评价指标;
  • 应用层:对应的应用执行脚本。理论上来说,选定一个模型、一个数据处理器以及一个评估器,即可对应一个应用。

HugNLP完全基于HuggingFace开发,具有易扩展易部署能力,同时集成了MLFlow训练追踪器,方便使用者及时追踪实验进度,并进行实验分析。

HugNLP框架之所以称为全面,是因为其集成了大量的NLP任务模型,目前已经实现的包括:

  • 预训练:Masked LM、Causal LM、知识增强预训练;
  • Instruction-Tuning:支持自回归生成式、区间抽取式、NLI等统一范式训练;
  • 文本分类/匹配:传统Fine-tuning、Prompt-tuning、In-Context Learning;
  • 序列标注: 支持NER等序列标注任务;
  • 元学习: 基于序列的元学习(SentenceProto)、基于区间的元学习(SpanProto)、基于token的元学习(TokenProto,NNShot);
  • 问答:支持抽取式问答、多项选择式问答、开放生成式问答;
  • 文本生成:支持文本摘要、机器翻译(正在开发中);
  • 代码智能:目前集成了代码克隆检测(Clone)、代码缺陷检测(Defact)等Code任务;

快速部署HugNLP框架,只需要执行代码三行命令即可:

git clone https://github.com/HugAILab/HugNLP.git

cd HugNLP

python3 setup.py install

下面介绍HugNLP的几个核心能力:

  • Benchmark一键刷榜;
  • 预训练和知识注入;
  • Fine-tuning & Prompt-tuning;
  • Instruction-tuning;
  • In-Context Learning;
  • 半监督Self-training;
  • Code代码智能;

一、Benchmark一键刷榜

HugNLP最先开发了面向一些常用榜单的刷榜工具,例如GLUE、CLUE等。用户只需要配置相应的数据集名称,即可实现一键刷榜。为了验证框架的有效性,在22年9月提交了CLUE榜单的刷榜结果,选择一系列中文小模型(RoBERTa、MacBERT、P-BERT等)并结合了logits集成方法,至今依然维持在第15名位置,曾一度超越了部分企业。

例如如果训练CLUE榜单的AFQMC数据集,可编辑文件

applications/benchmark/clue/clue_finetune_dev.sh

修改参数:

–user_defined=“data_name=afqmc”

执行下列命令即可:

bash applications/benchmark/clue/clue_finetune_dev.sh

同样的方法还可以训练一些常用的NLP任务,例如阅读理解、实体识别、以及GLUE英文数据集等。

HugNLP还集成了一系列模型用于刷榜,例如BERT、RoBERTa、DeBERTa、MacBERT、Erlangshen等。

二、预训练与知识注入

传统的一些预训练模型(例如BERT、GPT2等)是在通用语料上训练的,而对领域事实知识可能不敏感,因此需要显式的在预训练阶段注入事实知识。

在HugNLP中,主要实现了几个知识增强预训练,包括DKPLM和KP-PLM。DKPLM是一种可分解的知识注入方法;KP-PLM则是将结构化知识转化为自然语言描述的形式进行注入。这些知识注入的方法是可插拔式的,因此无需修改模型结构,很容易用于下游任务的微调。

执行下面命令即可进行Masked Language Modeling和Causal Language Modeling的预训练:

bash applications/pretraining/run_pretrain_mlm.sh

bash applications/pretraining/run_pretrain_casual_lm.sh

三、 Fine-tuning & Prompt-Tuning

基于预训练语言模型的NLP,通常遵循Pre-training和Fine-tuning范式。HugNLP也包含Fine-tuning技术。

3.1 参数有效性学习:

HugNLP集成了包括Prefix-tuning、Adapter、BitFit、LoRA等参数有效性训练方法,可以加速模型的训练,降低显存占用量。

在训练脚本中,只需要添加一行参数,即可开启参数有效性训练:

–use_freezing

对于参数有效性方法,HugNLP实现了若干类别的分类模型,如下所示:

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,
    },
}

只需要指定下面参数即可,例如选择adapter进行分类:

–task_type=head_adapter_cls

3.2 对抗训练:引入对Embedding的扰动,提高模型的鲁棒性。

HugNLP框架集成了若干种对抗训练的方法,其中最简单的对抗方法为FGM算法:

  • 首先计算输入样本 x x x(通常为word embedding)的损失函数以及在 x x x处的梯度: g = ▽ x L ( θ , x , y ) g=\triangledown_xL(\theta, x, y) g=xL(θ,x,y)
  • 计算在输入样本的扰动量: r a d v = ϵ ⋅ g / ∣ ∣ g ∣ ∣ 2 r_{adv} = \epsilon\cdot g/||g||_2 radv=ϵg/∣∣g2,其中 ϵ \epsilon ϵ为超参数,默认取1.0;
  • 得到对抗样本: x a d v = x + r a d v x_{adv} = x + r_{adv} xadv=x+radv
  • 根据得到的对抗样本,再次喂入模型中,计算损失,并累积梯度;
  • 恢复原始的word embedding,接着下一个batch。

在训练时,只需要添加一行参数,即可默认调用FGM算法:

–do_adv

3.3 Prompt-tuning:通过模板来复用预训练目标

传统的Fine-tuning在低资源场景下容易出现过拟合问题,因此复用预训练的目标可以拉近Pre-training和Fine-tuning之间的语义差异。

HugNLP集成了PET、P-tuning、Prefix-tuning等Prompt-Tuning算法,并无缝嵌入在NLP分类任务的模型里。

在训练时,只需要指定下面两个参数,即可以开启Prompt-tuning模式,例如选择p-tuning算法:

–task_type=masked_prompt_ptuning_cls

–use_prompt_for_cls

四、Instruction-tuning

在大模型时代,如何将不同类型的NLP任务进行范式统一,是构造通用人工智能的核心要素。HugNLP为此定义了三种统一范式的思想:

  • 万物皆可生成:将所有NLP任务建模为单向自回归生成,例如GPT-3、ChatGPT等;
  • 万物皆可抽取:将所有NLP任务建模为抽取式机器阅读理解;
  • 万物皆可推断:将所有NLP任务建模为自然语言推断;

基于三种不同的范式统一,HugNLP推出两个核心产品,分别是:

  • HugChat:基于生成式Instruction的中小型ChatGPT类模型;
  • HugIE:基于抽取式Instruction的统一信息抽取框架;

4.1 HugChat:基于Causal Language Modeling的生成式对话模型

最近ChatGPT火爆全球,为了让研究者可以训练自己的ChatGPT,HugNLP框架集成了基于生成式Instruction的训练产品——HugChat,其支持各种类型的单向生成式模型的训练,例如GPT-2、GPT-Neo、OPT、GLM、LLaMA等。
在8张V100 32G的条件下,可训练OPT-13B大模型。
HugAILab团队开源了约200万条英文、300万条中文对话数据,用于训练模型。
例如训练GPT-2(XL),可直接执行脚本:

bash ./application/instruction_prompting/HugChat/supervised_finetuning/run_causal_instruction_gpt2_xl.sh

基于HugNLP,训练的GPT-2(1.3B)模型,即可实现很简单的对话任务。只需要执行如下命令即可玩转HugChat:

python3 applications/instruction_prompting/HugChat/hugchat.py

例如可以写套磁信邮件:

再例如搜索谷歌地球的相关信息:

也可以实现编写简单的代码(1.3B的模型具备此能力已经很惊叹了!):

HugNLP目前正在开发其他类型的Decoder-only大模型,相关信息和开源内容如下表所示:

HugChat后期将推出垂直领域的大模型解决方案,同时将与OpenAI API进行融合,推出大模型服务框架。

4.2 HugIE:基于Global Pointer的统一信息抽取框架

信息抽取(Information Extraction)旨在从非结构化的文本中抽取出结构化信息,是构建知识库的重要步骤之一。通常信息抽取包括两个核心步骤,分别是命名实体识别(Named Entity Recognition)关系抽取(Relation Extraction)

我们基于HugNLP研发一款HugIE产品,旨在实现统一信息处理。其主要核心包括如下几个部分:

  • 将实体识别和关系抽取,统一为新的范式——基于抽取式阅读理解的方法。HugIE采用Global Pointer模型实现信息抽取;
  • 定义Instruction Prompt,指导模型生成需要抽取的内容;
  • 采用多任务训练的方法训练;

HugIE目前已经开源了模型:https://huggingface.co/wjn1996/wjn1996-hugnlp-hugie-large-zh
可以基于HugNLP框架使用HugIE抽取模型,如下图所示:

五、In-Context Learning

In-Context Learning(ICL) 首次由GPT-3提出,其旨在挑选少量的标注样本作为提示(Prompt),从而在形式上促使大模型生成目标答案。ICL的优势在于无需对参数进行更新,即可实现惊艳的效果。

HugNLP框架集成了ICL,主要涉及到样本的挑选预测结果的校准两个部分:

  • 样本挑选:默认为从训练集中随机挑选样本,后期将会开发一系列样本挑选的算法,例如聚类、K近邻、余弦相似度等;
  • 预测校准:由于所挑选标注样本与待预测样本存在分布差异,需要对预测的概率分布进行校准,这里采用Calibrate Before Use方法,如下图,可以对预测分布进行校准,提高预测效果。

目前ICL已经集成在HugNLP里,只需要指定下面参数即可:

–user_defined=“data_name=xxx num_incontext_example=4 l=1 use_calibrate=True”

–use_prompt_for_cls

六、半监督Self-training

半监督旨在同时结合标注数据和无标签数据来训练NLP任务。Self-training是一种简单但有效的迭代式训练方法,其通过Teacher模型先获取伪标签,对伪标签进行去噪后,再训练Student模型。传统的Self-training会引入大量噪声,从而降低训练的效果。为了提高性能,HugNLP引入成熟的Uncertainty-aware Self-training技术。框架图如下所示:

其采用了来自贝叶斯推断中的MC Dropout技术,即对Teacher模型执行 T T T次推理,每次推理开启Dropout开关,从而得到若干与Teacher模型满足独立同分布的模型预测。基于这些预测结果,可以通过信息熵的变化量得到Teacher模型对无标签数据的不确定性量化指标(即BALD算法),核心公式如下:
image.png
进行多次DC Dropout的代码实现如下(详见hugnlp_trainer.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)

HugNLP使用半监督模式,只需要做两件事:

(1)执行脚本时添加参数:

–use_semi

(2)在指定的数据集目录下,存放unlabeled data文件。

七、其他更丰富的应用

目前HugNLP还开发了很多应用如下所示:
image.png
image.png
image.png
image.png
还有更多丰富的应用正在开发中。HugNLP也欢迎有志之士加入HugAILab参与开源开发工作🤗

HugNLP开源地址:https://github.com/HugAILab/HugNLP

论文:https://arxiv.org/abs/2302.14286


获取更多咨询,可加入钉钉用户群:


团队介绍


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/501000.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java版企业电子招投标采购系统源代码之系统的首页设计

​​ 功能模块: 待办消息,招标公告,中标公告,信息发布 描述: 全过程数字化采购管理,打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力,为…

来来来,一起了解下MTK(联发科)

​ https://www.mediatek.com/ ​ 进入MTK官网,可以看到其产品分为七大方向:智能手机、笔记本电脑与平板电脑、家庭娱乐、车用市场、连接与网络技术、定制芯片服务、物联网。这里主要介绍智能手机、连接与网络技术、物联网三大版块。 一、智能手机 智…

使用护眼灯台灯哪个牌子好用来保护眼睛?真正做到护眼台灯品牌

现在的家长很多人觉得家里已经有灯光了,没必要在买台灯。但事实上台灯有很多优点,尤其对于小孩子来说:1.提供更好的光线:台灯能够提供更加明亮的光线,有助于保护眼睛健康。2.提高工作效率:台灯光线舒适可提高工作效率或学习效率。…

STM32G0开发板下载代码问题

任务: 通过CueMX生成代码,然后烧写到STM32G0开发板上。 遇到的问题: 1. CubeMX生成的代码能用Keil编译,但是下载不到flash中 2. CubeMX再次生成代码后,SWD无法识别芯片。 逐个击破: 1. CubeMX生成的代码…

Axure教程:动态分组柱状图(中继器)

本文将教大家如何用AXURE中的中继器做组分组柱状图。 如图: 预览地址:https://vvpq8c.axshare.com 原型下载地址:https://download.csdn.net/download/weixin_43516258/87761575?spm1001.2014.3001.5503 一、功能介绍 1、在中继器或表格中填…

php导出excel多个sheet

我引用的拓展是: "phpoffice/phpspreadsheet": "^1.4", 我的$accept数据是这样的 "data": { "examStu": [ { "ctime": "2023-04-27 16:28:16", "className": "大猛1", "n…

JavaScript—数据类型转换

目录 1、起 源 理 念 2、特 点 框 架 书 写 位 置 注 释 浏览器调试js代码 3、变量 ① 全局变量 ② 局部变量 ③ 常量 4、数据类型 严格检查数据类型-use strict ① 数 组 ② 字符串 6、类型转换 ① 字符串转数字 ② 字符串转bool值 ③ 能力判断 7、编码方…

自动控制原理笔记-频率响应法-稳定裕度

目录 一、增益裕度h(幅值裕度, gain margin) 二、相角裕度g (phase margin) 三、根据Bode图确定稳定裕度 相角裕度 一、增益裕度h(幅值裕度, gain margin) 开环幅相特性曲线(奈氏曲线)G(jw)与负实轴…

教你一招在VMware的NAT模式下,两台电脑如何互相访问对方的虚拟机

目录 一. 准备工作二. 开始2.1 设置NAT模式2.2 进行NAT模式设置2.3 XShell访问对方虚拟机 一. 准备工作 需要两台电脑(我准备了两台win10) VMware虚拟机:【官网下载】两台win10电脑上都安装好centos 7系统(我这里是centos 7版本…

3.Java线程

Java线程 3.1 创建和运行线程 方法一,直接使用Thread import lombok.extern.slf4j.Slf4j;/*** 使用匿名内部类创建线程* author xc* date 2023/4/30 16:19*/ Slf4j public class Test1 {public static void main(String[] args) {Thread thread new Thread(){Ov…

OpenCV-Python图像几何变换

概念:几何变换是指将一幅图像映射到另外一幅图像内的操作。OpenCV提供了多个与映射有关的函数,这些函数使用起来方便灵活,能够高效地完成图像的映射。 缩放 cv2.resize()函数用于缩放图像 det cv2.resize(src, dsize[,dst[,fx[,fy[,interp…

入门级BP神经网络实现回归预测的原理与python代码

文章目录 一、BP神经网络是什么?二、BP神经网络的原理?三、BP神经网络预测过程如下1.初始化参数:2.前向传播:3.反向传播:4.更新参数:5.重复上述过程,直到满足收敛条件或达到最大迭代轮次。 四、…

【Liunx】进程地址空间

文章目录 📖 前言1. 环境变量收尾1.1 认识bash进程:1.2 环境变量具有全局属性:1.3 内建命令: 2. 进程地址空间2.1 Liunx — 地址空间验证:2.2 感知地址空间的存在:2.3 认识地址空间:2.3 - 1&…

C++右值引用(左值表达式、右值表达式)(移动语义、完美转发(右值引用+std::forward))(有问题悬而未决)

文章目录 什么是右值?是什么是右值引用?什么是移动语义?什么是完美转发?(右值引用std::forward) 什么是右值? 在 C 中,表达式可以分为左值表达式和右值表达式。左值表达式指的是可以…

《常规脉搏传输时间作为人体血压变化标志》阅读笔记

目录 一、论文摘要 二、论文十问 Q1: 论文试图解决什么问题? Q2: 这是否是一个新的问题? Q3: 这篇文章要验证一个什么科学假设? Q4: 有哪些相关研究?如何归类?谁是这一课题在领域内值得关注的研究员? …

OpenCV教程——加载、修改、保存图像

1.颜色空间 颜色空间:也称彩色模型(又称彩色空间或彩色系统)。本质上,彩色模型是坐标系统和子空间的阐述。位于系统的每种颜色都有单个点表示。RGB(红绿蓝)是依据人眼识别的颜色定义出的空间,可…

「二线豪华」或成历史,理想反超沃尔沃再树「里程碑」

今年的上海车展,除了占据C位的新能源汽车,还有传统车企。 上海车展开幕前,沃尔沃汽车大中华区销售公司总裁钦培吉在新车发布会上直言:“新势力会的,我们三年就学会了;我们会的,新势力十年都学不…

SQL事务与存储引擎

索引回顾: 索引是一个排序的列表,包含字段的值和值所在行数据的物理地址 事务是一个机制,一个操作序列(一组操作命令),事务会把所有命令当做一个整体向系统提交或撤销操作,要么都执行&#xf…

MySQL中的Join 的算法(NLJ、BNL、BKA)

本文已收录至Github,推荐阅读 👉 Java随想录 文章目录 摘要什么是JoinIndex Nested-Loop JoinBlock Nested-Loop JoinMRR & BKA总结 摘要 Join是MySQL中最常见的查询操作之一,用于从多个表中获取数据并将它们组合在一起。Join算法通常使…

【概念大全(关系,码,选择,投影,连接,运算)】第二章 关系数据库

第二章 关系数据库 1. 关系的基本概念1. 什么是域2. 笛卡尔积3. 笛卡尔积中 有意义的子集 就是关系4. 候选码 (是唯一标识符 并不是用 只有一个进行判断)5. 全码(一行中都不重复)6. 主码(候选码选一个就是主码&#xf…