AiWin2022训练一多任务保险业务大语言模型

摘要:

合集:AI案例-NLP-泛金融
赛题:AiWin2022中文保险小样本多任务竞赛
主页:http://www.aiwin.org.cn/competitions/68
AI问题:文本分类、识别文本中的实体、构建问答系统、文本相似度识别
数据集:多任务小样本保险文本数据集。
数据集发布方:中国太平洋保险公司
数据集价值:支持包括文本分类、文本相似度、自然语言推断、命名实体识别和机器阅读理解等五大基础自然语言理解任务,具体为18个保险业务场景中的常见任务。
解决方案:基于`pytorch/transformers,以中文T5(mT5)为基础模型实现多种自然语言处理任务。

一、赛题

问题描述

受益于大规模训练数据集,目前预训练语言模型在很多开源自然语言理解榜单上取得了接近甚至超过人类水平的性能。然而在真实保险业务场景中难以积累大规模高质量标注数据,一些在开源数据集上表现优秀的方案无法体现其先进性,且真实业务任务之间的差异性难以保证模型的迁移复用能力。针对上述问题,统一范式的多任务小样本学习方案作为一种贴合真实业务场景的技术亟待进一步研究。

赛题任务

本次比赛以多任务小样本为题目,以保险、金融、医疗领域为背景,探索如何以统一模型的方式在数据资源受限的场景下提升模型的泛化迁移能力。比赛要求最终模型为可以实现完整测试的单独模型。本次赛题将提供多任务小样本学习自然语言理解数据集,数据集从真实业务场景及网络获取,其中业务数据经脱敏得到。

多任务: 赛题覆盖了保险真实业务场景中常见的保险领域、医疗领域和金融领域,包括文本分类、文本相似度、自然语言推断、命名实体识别和机器阅读理解等五大基础自然语言理解任务,具体为18个保险业务场景中的常见任务。

小样本: 为了还原真实业务场景中大规模高质量标注数据积累困难的情况,训练集从18个任务中选取了14个作为训练集任务,每个任务提供20条标注样本,共计280条标注样本。测试集从18个任务中选取了14个作为测试集任务,每个任务提供400条测试样本,分A/B榜测试。

二、数据集内容

数据集文件:

.
└── data
  ├── opensource_sample_500.json
  ├── opensource_train.json
  ├── opensource_dev.json
  ├── test_data_A.json
  └── train_data.json

遵循小样本学习的任务特点,本次比赛数据分为训练集和测试集两部分(train_data.json/test_data_A.json),共计18个任务,其中训练集覆盖14个任务,测试集覆盖14个任务,存在10个交叉任务。

数据规模和内容覆盖

数据分为单文本分类、文本对分类、命名实体识别、事件抽取和机器阅读理解五大类: img img img

数据内容示例

数据分为单文本分类、文本对关系分类、命名实体识别、事件抽取和机器阅读理解(构建问答系统)五大类,各自的数据内容格式分别示意如下:

1、单文本分类

输入为单独的一句话”text_a”,输出为相应的分类标签”label”。

{
"ID": "MedicalClassification_TRAIN_1",
"text_a": "成人呼吸窘迫综合征简称ARDS,是一种继发的,以急性呼吸窘迫和低氧血症为特征的综合征。又称休克肺、创伤肺等。为成人急性呼吸衰竭的一种类型。",
"label": "疾病定义"
},

2、文本对关系

文本对关系是一种自然语言处理(NLP)任务,旨在对两个给定的文本之间的关系或类别进行判断。其核心是通过模型分析两个文本之间的语义、逻辑或结构关联,输出预定义的分类标签。分类标签如“相关/不相关”“相似/不相似”“蕴含/矛盾”等。例如:输入为两句话”text_a”和”text_b”,输出为两句话之间的标签”label”

{
"ID": "MedicalSimilarity_TRAIN_8",
"text_a": "儿童耳鸣应当如何治效果好。",
"text_b": "儿童中耳炎耳朵疼痛怎样诊治。",
"label": 0
},

3、识别文本中的实体

输入为一段文本”context”和目标抽取的实体类型”entity_type”,输出为对应类型的实体列表”entities”。

{
  "ID": "MedicalNER TRAIN 4",
  "context":"不论是关节本身病变,还是关节周围结构(关节周围)的病变,如肌腱和滑囊,患者都可能主诉为“关节”痛,在这两种情况下,单关节及关节周疼痛均被称为单关节痛。",
  "entity_type":"部位”,
  entities":[
      "关节”,
      "肌腱”,
      "滑囊”,
      "单关节”,
      "关节周”
  ]
}

4、阅读理解构建问答系统

输入为一段话”context”和相应的问句”question”,输出为对应问题的答案”answer”。

{
"ID":"InsuranceMRC_TRAIN_19”,
"context":"投保年龄:出生满30天至75周岁。投保年龄、交费方式按《xxxx基本保险金额表》操作,表格中无相互数值对应关系的,投保时不可约定。",
question":"最高投保年龄是多少?",
answer":"75周岁
}

结果提交的内容和要求

模型输入测试集后输出的结果文件,文件格式统一为json。json 文件内容规范示例:

{
“MedicalClassification_TRAIN_0”: “疾病定义”,
“MedicalSimilarity_TRAIN_8”: “相似”,
“MedicalNER_TRAIN_4”: [“关节”,“肌腱”,“滑囊”,“单关节”,“关节周”],
“InsuranceMRC_TRAIN_9”: “5年、10年、15年和20年”,

}

其中,键值为每个样本的ID字段,value值为对应任务的预测结果,注意:

  1. 请根据label_mappings映射到对应标签;
  2. 机器阅读理解任务如果预测为不可答的请映射为空字符串””。

三、解决方案基线

以下为竞赛解决方案基线版。

mT5预训练模型

解决方案基线基于`pytorch/transformers,以中文T5(mT5-Multilingual T5)为基础模型实现。mT5是Google推出的多语言文本到文本(Text-to-Text)预训练模型,支持包括中文在内的101种语言。其核心思想是将所有NLP任务(如分类、翻译)统一为“输入文本→输出文本”的生成式框架,通过相同的模型结构处理分类、翻译、摘要等任务,例如输入”分类: 文本”,输出”类别”。最初,T5模型主要是英文的,但随着多语言版本T5(mT5)的发布,中文也被纳入支持范围。然而,为了更好地适应中文处理的特点,追一科技等机构开发了专门针对中文的T5模型,如T5 PEGASUS。中文T5模型的出现和发展,不仅推动了中文自然语言处理技术的进步,也为开发者提供了强大的工具,以应对各种复杂的中文处理任务。

常见任务与输入输出示例:

任务类型输入示例输出示例
文本分类"分类: 这部电影很棒""正面"
翻译"翻译中文到英文: 你好""Hello"
摘要"摘要: 文章内容...""概括后的摘要"
问答"问题: 谁写了红楼梦? 上下文: ...""曹雪芹"

代码结构

代码结构如下:

.
├── baseline
│   ├── analysis
│   │   └── analysis_data.py  # 简单分析各任务所含数据
│   ├── instructions
│   │   ├──instruction_model.py  # 加载instruction-tuning model,如T5
│   │   ├──instruction_prompts.py  # 将各任务形式化为instruction的方式
│   │   ├──instruction_templates.py  # 各任务采用的instruction模板
│   │   └──instruction_utils.py
│   ├── metrics
│   │   └── metrics.py  # 各任务的评估指标
│   ├── utils
│   │   ├── tuning_argparse.py  # 训练参数
│   │   └── utils.py
│   ├── run.sh
│   ├── train_fsl.py  # 基于赛题数据训练模型
│   └── train_opensource.py  # 基于开源数据训练模型
├── data
│   ├── opensource_sample_500.json
│   ├── test_data_A.json
│   └── train_data.json
├── ptlm
│   └── t5
└── results

安装要求

datasets==1.12.1
huggingface-hub==0.1.2
torch==1.8.1
transformers==4.9.0

下载模型

源码:download-t5.py

from transformers import T5ForConditionalGeneration, T5Tokenizer

# 下载并保存模型和分词器
model = T5ForConditionalGeneration.from_pretrained('t5-small')
tokenizer = T5Tokenizer.from_pretrained('t5-small')
model.save_pretrained('../ptlm/t5/')
tokenizer.save_pretrained('../ptlm/t5/')

在baseline目录下,执行:python download-t5.py。下载T5模型到../ptlm/t5/目录下。

训练模型

这个函数主要用于根据给定的模型名称(在这里是 “T5″)加载预训练模型及其分词器,并进行一些配置和调整。函数首先检查是否是 T5 模型,如果是,则从指定路径或名称加载模型及其相关的配置、分词器,并进行必要的设置(如调整最大目标长度、修改嵌入层等)。最后返回初始化的分词器和模型。如果模型名称不是 T5,则提示用户实现其他模型的初始化。

def init_baseline_model(model_args, model_name, data_args, special_tokens=[]):
  print("init {} model from {}...".format(model_name, model_args.model_name_or_path))
  if model_name == "T5":
      tokenizer = T5Tokenizer.from_pretrained(
          model_args.model_name_or_path,
          do_lower_case=True,
          max_length=1024,
          truncation=True,
          additional_special_tokens=special_tokens,
      )
      config = T5Config.from_pretrained(model_args.model_name_or_path)
      model = T5ForConditionalGeneration.from_pretrained(model_args.model_name_or_path, config=config)
      model.config.max_length = data_args.val_max_target_length
      model.resize_token_embeddings(len(tokenizer))
  else:
      raise NotImplementedError("You can implement {} by yourself".format(model_name.upper()))

  return tokenizer, model

这段代码是在使用 Seq2SeqTrainer 进行 T5 模型的训练与评估。Seq2SeqTrainer 是 Hugging Face transformers 库中为序列到序列(Seq2Seq)任务(如机器翻译、文本生成等)提供的一个训练类。

trainer = Seq2SeqTrainer( 
  model=model,
  args=training_args,
  train_dataset=train_dataset if training_args.do_train else None,
  eval_dataset=eval_dataset if training_args.do_eval else None,
  tokenizer=tokenizer,
  data_collator=data_collator,
  compute_metrics=get_metrics_results if training_args.predict_with_generate else None,
  callbacks=[TestCallback],
)

训练结果展示

基于开源数据,Linux环境下通过运行run.sh进行模型训练并得到评价指标,或在baseline目录下,Windows环境下执行train_opensource.py:

python train_opensource.py --model_path="../ptlm/t5/" --model_name="t5"    --dataset="opensource" --lr=2e-5 --batch_size=12 --max_source_length=512 --max_target_length=200 --epoch=20 --data_dir="../data/" --split_dataset
***** Running training *****
Num examples = 33,362
Num Epochs = 20
Instantaneous batch size per device = 12
Total train batch size (w. parallel, distributed & accumulation) = 12
Gradient Accumulation steps = 1
Total optimization steps = 55,620
Number of trainable parameters = 60,492,288
0%|                                                                                                     | 0/55620 [00:00<?, ?it/s]Passing a tuple of `past_key_values` is deprecated and will be removed in Transformers v4.48.0. You should pass an instance of `EncoderDecoderCache` instead, e.g. `past_key_values=EncoderDecoderCache.from_legacy_cache(past_key_values)`.
{'loss': 0.7568, 'grad_norm': 3.7456130981445312, 'learning_rate': 1.9820208558072637e-05, 'epoch': 0.18}
{'loss': 0.5345, 'grad_norm': 4.592286586761475, 'learning_rate': 1.9640417116145275e-05, 'epoch': 0.36}
{'loss': 0.4815, 'grad_norm': 2.873720169067383, 'learning_rate': 1.9460625674217907e-05, 'epoch': 0.54}
{'loss': 0.4995, 'grad_norm': 3.5921950340270996, 'learning_rate': 1.9280834232290546e-05, 'epoch': 0.72}
4%|███                                                                                 | 2016/55620 [2:45:02<37:16:36, 2.50s/it]
...

四、获取案例套装

需要登录后才允许下载文件包。登录

发表评论