Project Icon

HugNLP

基于Hugging Face的全面NLP开发应用框架

HugNLP是基于Hugging Face的NLP开发应用库,为研究人员提供便利高效的开发环境。它集成了丰富的模型、处理器和应用模块,支持知识增强预训练、提示微调、指令调优等技术。该框架还包含参数高效学习、不确定性估计等工具,可用于构建多种NLP应用。HugNLP获得CIKM 2023最佳演示论文奖。



欢迎使用HugNLP。🤗 拥抱自然语言处理!

关于HugNLP

HugNLP是一个基于Hugging Face的新型开发和应用库,旨在提高NLP研究人员的便利性和有效性。

**新闻与亮点

架构

框架概览如下所示:



模型

在HugNLP中,我们提供了一些流行的基于transformer的模型作为骨干网络,如BERT、RoBERTa、GPT-2等。我们还发布了我们预构建的KP-PLM,这是一种新颖的知识增强预训练范式,可以注入事实知识,并且可以轻松用于任意PLM。

除了基本的PLM,我们还实现了一些特定任务的模型,涉及序列分类、匹配、标注、跨度提取、多项选择和文本生成。

值得注意的是,我们开发了基于CLS Head的标准微调和基于提示的微调模型,使PLM能够在分类任务上进行调优。

对于少样本学习设置,HugNLP在少样本文本分类和命名实体识别(NER)中提供了原型网络。

此外,我们还在HugNLP中加入了一些即插即用的工具。

  1. 参数冻结。如果我们想进行参数高效学习,即冻结PLM中的一些参数以提高训练效率,我们可以设置配置use_freezing并冻结骨干网络。使用示例在代码中展示。
  2. 不确定性估计旨在计算半监督学习中的模型确定性。
  3. 我们还设计了预测校准,可以通过校准分布和缓解语义偏差问题来进一步提高准确性。

处理器

处理器旨在加载数据集并在包含句子分词、采样和张量生成的流程中处理任务示例。 具体而言,用户可以通过load_dataset直接获取数据,它可以直接从互联网下载或从本地磁盘加载。 对于不同的任务,用户应定义特定任务的数据整理器,其目的是将原始示例转换为模型输入的张量特征。

应用

它为用户提供了丰富的模块,通过从模型和处理器中选择一系列设置来构建现实世界的应用和产品。

核心能力

我们提供一些核心能力来支持NLP下游应用。

知识增强预训练语言模型

传统的预训练方法缺乏事实知识。 为了解决这个问题,我们提出了KP-PLM,采用新颖的知识提示范式进行知识增强预训练。

具体来说,我们通过识别实体并与知识库对齐为每个输入文本构建一个知识子图,并将这个子图分解成多个关系路径,这些路径可以直接转换为语言提示。

基于提示的微调

基于提示的微调旨在重用预训练目标(如遮蔽语言建模、因果语言建模),并利用精心设计的模板和词汇器进行预测,在低资源环境下取得了巨大成功。

我们将一些新颖的方法整合到HugNLP中,如PET、P-tuning等。

指令调优与上下文学习

指令调优和上下文学习无需参数更新即可实现少样本/零样本学习,其目标是将任务相关指令或基于示例的演示连接起来,以提示GPT风格的PLM生成可靠的响应。 因此,所有NLP任务可以统一为相同的格式,并能显著提高模型的泛化能力。

受此启发,我们将其扩展为其他两种范式:

  1. 抽取式范式:我们将各种NLP任务统一为跨度抽取,这与抽取式问答相同。
  2. 推理式范式:所有任务都可以视为自然语言推理,以匹配输入和输出之间的关系。
  3. 生成式范式:我们将所有任务统一为生成格式,并基于指令调优、上下文学习或思维链训练因果模型。

基于不确定性估计的自训练

自训练可以通过利用大规模未标注数据和标注数据来解决标注数据稀缺的问题,这是半监督学习中成熟的范式之一。 然而,标准的自训练可能产生太多噪声,不可避免地会由于确认偏差而降低模型性能。

因此,我们提出了基于不确定性的自训练。具体来说,我们在少量标注数据上训练教师模型,然后使用贝叶斯神经网络(BNN)中的蒙特卡洛(MC)丢弃技术来近似模型确定性,并谨慎选择教师模型确定性较高的样本。

参数高效学习

为了提高HugNLP的训练效率,我们还实现了参数高效学习,旨在冻结主干网络中的部分参数,使我们在模型训练过程中只调整少量参数。 我们开发了一些新颖的参数高效学习方法,如前缀调优、适配器调优、BitFit和LoRA等。

安装

$ git clone https://github.com/HugAILab/HugNLP.git
$ cd HugNLP
$ python3 setup.py install

目前,该项目仍在开发和完善中,使用时可能存在一些bug,请谅解。我们也期待您能提出问题或提交一些有价值的拉取请求。

预构建应用概览

我们展示了HugNLP中的所有预构建应用。您可以选择一个应用来使用HugNLP。您也可以点击链接查看详细文档。

应用运行任务任务说明PLM模型文档
默认应用run_seq_cls.sh目标:在用户自定义数据集上进行序列分类的标准微调提示调优<br> 路径:applications/default_applicationsBERT、RoBERTa、DeBERTa[点击](https://github.com/HugAILab/HugNLP/blob/main/./documents/default_tasks/default_sequence_classification.md
run_seq_labeling.sh目标:在用户自定义数据集上进行序列标注的标准微调<br> 路径:applications/default_applicationsBERT、RoBERTa、ALBERT
预训练run_pretrain_mlm.sh目标:通过掩码语言建模(MLM)进行预训练。<br> 路径:applications/pretraining/BERT、RoBERTa[点击](https://github.com/HugAILab/HugNLP/blob/main/./documents/pretraining/Masked%20LM%20for%20Continual%20Pre-training.md
run_pretrain_casual_lm.sh目标:通过因果语言建模(CLM)进行预训练。<br> 路径:applications/pretrainingBERT、RoBERTa[点击](https://github.com/HugAILab/HugNLP/blob/main/./documents/pretraining/Causal%20LM%20for%20Continual%20Pre-training.md
GLUE基准测试run_glue.sh目标:对GLUE分类任务进行标准微调提示调优<br> 路径:applications/benchmark/glueBERT、RoBERTa、DeBERTa
run_causal_incontext_glue.sh目标:对GLUE分类任务进行上下文学习<br> 路径:applications/benchmark/glueGPT-2
CLUE基准测试clue_finetune_dev.sh目标:对CLUE分类任务进行标准微调提示调优<br> 路径:applications/benchmark/clueBERT、RoBERTa、DeBERTa
run_clue_cmrc.sh目标:对CLUE CMRC2018任务进行标准微调<br> 路径:applications/benchmark/cluemrcBERT、RoBERTa、DeBERTa
run_clue_c3.sh目标:对CLUE C3任务进行标准微调<br> 路径:applications/benchmark/cluemrcBERT、RoBERTa、DeBERTa
run_clue_chid.sh目标:对CLUE CHID任务进行标准微调<br> 路径:applications/benchmark/cluemrcBERT、RoBERTa、DeBERTa
指令提示run_causal_instruction.sh目标:基于因果PLM通过生成式指令调优进行跨任务训练<font color='red'>你可以用它来训练一个小型ChatGPT</font><br> 路径:applications/instruction_prompting/instruction_tuningGPT2[点击](https://github.com/HugAILab/HugNLP/blob/main/./documents/instruction_prompting/generative_instruction_tuning.md
run_zh_extract_instruction.sh目标:基于全局指针模型通过抽取式指令调优进行跨任务训练<br> 路径:applications/instruction_prompting/chinese_instructionBERT、RoBERTa、DeBERTa[点击](https://github.com/HugAILab/HugNLP/blob/main/./documents/instruction_prompting/extractive_instruction_tuning.md
run_causal_incontext_cls.sh目标:对用户自定义分类任务进行上下文学习<br> 路径:applications/instruction_prompting/incontext_learningGPT-2[点击](https://github.com/HugAILab/HugNLP/blob/main/./documents/instruction_prompting/incontext_learning_for_cls.md
信息抽取run_extractive_unified_ie.sh目标HugIE:通过抽取式指令调优训练统一的中文信息抽取模型。<br> 路径:applications/information_extraction/HugIEBERT、RoBERTa、DeBERTa[点击](https://github.com/HugAILab/HugNLP/blob/main/./documents/information_extraction/HugIE.md
api_test.py目标:HugIE:API测试。<br> 路径:applications/information_extraction/HugIE-[点击](https://github.com/HugAILab/HugNLP/blob/main/./documents/information_extraction/HugIE.md
run_fewnerd.sh目标:命名实体识别的原型学习,包括SpanProto、TokenProto <br> 路径:applications/information_extraction/fewshot_nerBERT
代码自然语言理解run_clone_cls.sh目标:代码克隆分类任务的标准微调<br> 路径:applications/code/code_cloneCodeBERT、CodeT5、GraphCodeBERT、PLBART[点击](https://github.com/HugAILab/HugNLP/blob/main/./documents/code/code_classification.md
run_defect_cls.sh目标:代码缺陷分类任务的标准微调<br> 路径:applications/code/code_defectCodeBERT、CodeT5、GraphCodeBERT、PLBART[点击](https://github.com/HugAILab/HugNLP/blob/main/./documents/code/code_classification.md
有关预构建应用程序和设置以及设计的模型和处理器的更多详细信息,可以在HugNLP文档中找到。

快速使用

这里我们提供了一个示例,向您展示如何快速使用HugNLP。 如果您想在用户自定义数据集上执行分类任务,可以在一个目录中准备三个json文件(train.jsondev.jsontest.json)。然后您可以运行脚本文件

$ bash ./application/default_applications/run_seq_cls.sh

在实验之前,您必须在脚本文件run_seq_cls.sh中定义以下参数。

  • --model_name_or_path: 预训练模型名称或路径。例如bert-base-uncased
  • --data_path: 数据集的路径(包括train.jsondev.jsontest.json),例如./datasets/data_example/cls/
  • --user_defined: 如果不存在label_names.txt,您必须定义label_names。

如果您想使用基于提示的微调,可以添加以下参数:

  • --use_prompt_for_cls
  • ---task_type: masked_prompt_clsmasked_prompt_prefix_clsmasked_prompt_ptuning_clsmasked_prompt_adapter_cls中的一个。

您还应该添加template.jsonlabel_words_mapping.json

如果您想使用参数高效学习,可以添加以下参数:

  • --use_freezing

run_seq_cls.sh的示例如下:

path=chinese-macbert-base
MODEL_TYPE=bert
data_path=/wjn/frameworks/HugNLP/datasets/data_example/cls
TASK_TYPE=head_cls
len=196
bz=4
epoch=10
eval_step=50
wr_step=10
lr=1e-05

export CUDA_VISIBLE_DEVICES=0,1
python3 -m torch.distributed.launch --nproc_per_node=2 --master_port=6014 hugnlp_runner.py \
--model_name_or_path=$path \
--data_dir=$data_path \
--output_dir=./outputs/default/sequence_classification\
--seed=42 \
--exp_name=default-cls \
--max_seq_length=$len \
--max_eval_seq_length=$len \
--do_train \
--do_eval \
--do_predict \
--per_device_train_batch_size=$bz \
--per_device_eval_batch_size=4 \
--gradient_accumulation_steps=1 \
--evaluation_strategy=steps \
--learning_rate=$lr \
--num_train_epochs=$epoch \
--logging_steps=100000000 \
--eval_steps=$eval_step \
--save_steps=$eval_step \
--save_total_limit=1 \
--warmup_steps=$wr_step \
--load_best_model_at_end \
--report_to=none \
--task_name=default_cls \
--task_type=$TASK_TYPE \
--model_type=$MODEL_TYPE \
--metric_for_best_model=acc \
--pad_to_max_length=True \
--remove_unused_columns=False \
--overwrite_output_dir \
--fp16 \
--label_names=labels \
--keep_predict_labels \
--user_defined="label_names=entailment,neutral,contradiction"

快速开发

本节面向开发者。 HugNLP易于使用和开发。我们在下图中绘制了一个工作流程,展示如何开发一个新的运行任务。



它包括五个主要步骤:库安装、数据准备、处理器选择或设计、模型选择或设计以及应用设计。 这说明HugNLP可以简化复杂NLP模型和任务的实现。

预构建产品

这里,我们展示两个预构建API应用的示例。

HugChat: 面向ChatGPT类PLMs的生成式指令调优

HugChat是一个小型ChatGPT类模型,基于生成式指令调优,旨在将所有NLP任务统一为生成式格式,以训练因果语言模型(如GPT2、BART)。 您可以直接使用HugNLP进行指令调优,并在用户定义的特定任务语料上持续训练小型ChatGPT风格模型。

您可以通过运行以下命令与HugChat聊天:

$ python3 applications/instruction_prompting/HugChat/hugchat.py

图片

1. 写一个故事

图片

2. 写一封信

图片

3. 计算

图片

4. 自然语言理解(情感分析、阅读理解、知识库问答)

图片

5. 搜索 ![image](https://yellow-cdn.veclightyear.com/0a4dffa0/2a5cc0dd-9423-4cf8-9410-efbbc77be023.jpg)
6. 代码编程

image

请尽情享受,更多详情可以在这里找到。

HugIE: 面向中文统一信息抽取的抽取式阅读理解和指令调优方法

信息抽取(IE)旨在从非结构化文本中提取结构化知识。结构化知识以"(头实体,关系,尾实体)"三元组的形式呈现。IE主要包括两个任务:

  • 命名实体识别(NER)旨在提取某一类型的所有实体提及。
  • 关系抽取(RE)。它有两种目标,第一种是对两个实体之间的关系进行分类,第二种是在给定头实体和相应关系的情况下预测尾实体。
  • 我们将NER和RE任务统一到抽取式问答(即机器阅读理解)的范式中。
  • 我们为NER和RE设计了特定任务的指令和语言提示。

对于NER任务:

  • 指令:"找到文章中所有【{entity_type}】类型的实体?文章:【{passage_text}】"

对于RE任务:

  • 指令:"找到文章中【{head_entity}】的【{relation}】?文章:【{passage_text}】"
  • 在训练过程中,我们使用以Chinese-Macbert为基础的全局指针作为基本模型。

我们的模型保存在Hugging Face: https://huggingface.co/wjn1996/wjn1996-hugnlp-hugie-large-zh

快速使用HugIE进行中文信息抽取:

from applications.information_extraction.HugIE.api_test import HugIEAPI
model_type = "bert"
hugie_model_name_or_path = "wjn1996/wjn1996-hugnlp-hugie-large-zh"
hugie = HugIEAPI("bert", hugie_model_name_or_path)
text = "央广网北京2月23日消息 据中国地震台网正式测定,2月23日8时37分在塔吉克斯坦发生7.2级地震,震源深度10公里,震中位于北纬37.98度,东经73.29度,距我国边境线最近约82公里,地震造成新疆喀什等地震感强烈。"

entity = "塔吉克斯坦地震"
relation = "震源位置"
predictions, topk_predictions = hugie.request(text, entity, relation=relation)
print("entity:{}, relation:{}".format(entity, relation))
print("predictions:\n{}".format(predictions))
print("topk_predictions:\n{}".format(predictions))
print("\n\n")

"""
# 事件信息输出结果:
entity:塔吉克斯坦地震, relation:震源位置
predictions:
{0: ["10公里", "距我国边境线最近约82公里", "北纬37.98度,东经73.29度", "北纬37.98度,东经73.29度,距我国边境线最近约82公里"]}
topk_predictions:
{0: [{"answer": "10公里", "prob": 0.9895901083946228, "pos": [(80, 84)]}, {"answer": "距我国边境线最近约82公里", "prob": 0.8584909439086914, "pos": [(107, 120)]}, {"answer": "北纬37.98度,东经73.29度", "prob": 0.7202121615409851, "pos": [(89, 106)]}, {"answer": "北纬37.98度,东经73.29度,距我国边境线最近约82公里", "prob": 0.11628123372793198, "pos": [(89, 120)]}]}
"""

entity = "塔吉克斯坦地震"
relation = "时间"
predictions, topk_predictions = hugie.request(text, entity, relation=relation)
print("entity:{}, relation:{}".format(entity, relation))
print("predictions:\n{}".format(predictions))
print("topk_predictions:\n{}".format(predictions))
print("\n\n")

"""
# 事件信息输出结果:
entity:塔吉克斯坦地震, relation:时间
predictions:
{0: ["2月23日8时37分"]}
topk_predictions:
{0: [{"answer": "2月23日8时37分", "prob": 0.9999995231628418, "pos": [(49, 59)]}]}
"""

贡献者

联系我们

如果您有任何问题或建议,可以加入钉钉互动群:



或者您可以联系作者王嘉宁

引用

如果您觉得这个仓库有帮助,欢迎引用我们的论文:

@misc{wang2023hugnlp,
  doi       = {10.48550/ARXIV.2302.14286},
  url       = {https://arxiv.org/abs/2302.14286},
  author    = {王嘉宁, 陈诺, 孙秋实, 黄文康, 王成玉, 高明},
  title     = {HugNLP: 一个统一和全面的自然语言处理库},
  year      = {2023}
}

参考文献

  1. 王嘉宁, 陈诺, 孙秋实, 黄文康, 王成玉, 高明: HugNLP: 一个统一和全面的自然语言处理库。CoRR abs/2302.14286 (2023)
  2. 王嘉宁, 黄文康, 邱明辉, 石秋辉, 王洪斌, 李翔, 高明: 在预训练语言模型中使用知识提示进行自然语言理解。EMNLP 2022: 3164-3177
  3. 王成玉, 王嘉宁, 邱明辉, 黄俊, 高明: TransPrompt: 面向少样本文本分类的自动可转移提示框架。EMNLP 2021: 2792-2802
  4. 王嘉宁, 王成玉, 黄俊, 高明, 周傲英: 基于不确定性感知的自训练方法用于低资源神经序列标注。AAAI 2023.
  5. 陈诺, 孙秋实, 朱仁宇, 李翔, 陆雪松, 高明: CAT-probing: 一种基于度量的方法来解释预训练编程语言模型如何关注代码结构。EMNLP 2022 Findings: 4000--4008

致谢

我们感谢阿里巴巴集团和蚂蚁集团的人工智能平台(PAI)对我们工作的支持。友好的框架是EasyNLP。我们还要感谢所有为我们的工作做出贡献的开发者!

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号