乐趣区

关于人工智能:深入探索智能未来文本生成与问答模型的创新融合

深刻摸索智能将来:文本生成与问答模型的翻新交融

1.Filling Model with T5

1.1 背景介绍

该我的项目用于将句子中 [MASK] 地位通过生成模型还原,以实现 UIE 信息抽取中 Mask Then Filling 数据加强策略。

Mask Then Fill 是一种基于生成模型的信息抽取数据加强策略。对于一段文本,咱们其分为「要害信息段」和「非关键信息段」,蕴含关键词片段称为「要害信息段」。上面例子中标粗的为 要害信息片段 ,其余的为 非关键片段

大年三十 我从 北京 的大兴机场 飞回 成都

咱们随机 [MASK] 住一部分「非关键片段」,使其变为:

大年三十 我从 北京 [MASK] 飞回 成都

随后,将改句子喂给 filling 模型(T5-Fine Tuned)还原句子,失去新生成的句子:

大年三十 我从 北京 首都机场作为终点, 飞回 成都

  • 环境装置

本我的项目基于 pytorch + transformers 实现,运行前请装置相干依赖包:

pip install -r ../requirements.txt
  • 数据集筹备

我的项目中提供了一部分示例数据,数据来自 DuIE 数据集中的文本数据,数据在 data/

若想应用 自定义数据 训练,只须要仿照示例数据构建带 [MASK] 的文本即可,你也能够应用 parse_data.py 疾速生成基于 词粒度 的训练数据:

"Bortolaso Guillaume, 法国籍 [MASK]" 中[MASK] 地位的文本是:运动员
"歌曲 [MASK] 是由歌手海生演唱的一首歌曲" 中 [MASK] 地位的文本是:《情一动心就痛》...

每一行用 \t 分隔符离开,第一局部局部为 带 [MASK] 的文本 ,后一部分为 [MASK] 地位的原始文本(label)

1.2. 模型训练

批改训练脚本 train.sh 里的对应参数, 开启模型训练:

python train.py \
    --pretrained_model "uer/t5-base-chinese-cluecorpussmall" \
    --save_dir "checkpoints/t5" \
    --train_path "data/train.tsv" \
    --dev_path "data/dev.tsv" \
    --img_log_dir "logs" \
    --img_log_name "T5-Base-Chinese" \
    --batch_size 128 \
    --max_source_seq_len 128 \
    --max_target_seq_len 32 \
    --learning_rate 1e-4 \
    --num_train_epochs 20 \
    --logging_steps 50 \
    --valid_steps 500 \
    --device cuda:0

正确开启训练后,终端会打印以下信息:

...
 0%|          | 0/2 [00:00<?, ?it/s]
100%|██████████| 2/2 [00:00<00:00, 21.28it/s]
DatasetDict({
    train: Dataset({features: ['text'],
        num_rows: 350134
    })
    dev: Dataset({features: ['text'],
        num_rows: 38904
    })
})
...
global step 2400, epoch: 1, loss: 7.44746, speed: 0.82 step/s
global step 2450, epoch: 1, loss: 7.42028, speed: 0.82 step/s
global step 2500, epoch: 1, loss: 7.39333, speed: 0.82 step/s
Evaluation bleu4: 0.00578
best BLEU-4 performence has been updated: 0.00026 --> 0.00578
global step 2550, epoch: 1, loss: 7.36620, speed: 0.81 step/s
...

logs/T5-Base-Chinese.png 文件中将会保留训练曲线图:

1.3 模型预测

实现模型训练后,运行 inference.py 以加载训练好的模型并利用:

 if __name__ == "__main__":
    masked_texts = ['"《μVision2 单片机利用程序开发指南》是 2005 年 2 月 [MASK] 图书,作者是李宇" 中 [MASK] 地位的文本是:'
    ]
    inference(masked_texts)
python inference.py

失去以下推理后果:

maksed text: 
['"《μVision2 单片机利用程序开发指南》是 2005 年 2 月 [MASK] 图书,作者是李宇" 中 [MASK] 地位的文本是:'
]
output: 
[',中国工业出版社出版的']

2. 问答模型(Text-Generation, T5 Based)

2.1 背景介绍

问答模型是指通过输出一个「问题」和一段「文章」,输入「问题的答案」。

问答模型分为「抽取式」和「生成式」,抽取式问答能够应用 [UIE] 训练,这个试验中咱们将应用「生成式」模型来训练一个问答模型。

咱们选用「T5」作为 backbone,应用百度开源的「QA 数据集」来训练失去一个生成式的问答模型。

  • 环境装置

本我的项目基于 pytorch + transformers 实现,运行前请装置相干依赖包:

pip install -r ../requirements.txt

2.2 数据集筹备

我的项目中提供了一部分示例数据,数据是百度开源的问答数据集,数据在 data/DuReaderQG

若想应用 自定义数据 训练,只须要仿照示例数据构建数据集即可:

{"context": "违规分为: 个别违规扣分、重大违规扣分、发售混充商品违规扣分, 淘宝网每年 12 月 31 日 24:00 点会对符合条件的扣分做清零解决, 详情如下:| 舒适揭示: 因为发售混充商品 24≤N<48 分, 当年的 24 分不清零, 所以会存在第一年和第二年的不同计分状况。", "answer": "12 月 31 日 24:00", "question": "淘宝扣分什么时候清零", "id": 203}
{"context": "成长速度 头发是毛发中成长最快的毛发,个别每天长 0.27—0.4mm,每月均匀成长约 1.0cm,一年大略长 10—14cm。然而,头发不可能无限度的成长,个别状况下,头发长至 50—60cm,就会脱落再生新发。", "answer": "0.27—0.4mm", "question": "头发一天能长多少", "id": 328}
...

每一行为一个数据样本,json 格局。

其中,"context" 代表参考文章,question 代表问题,"answer" 代表问题答案。

2.3 模型训练

批改训练脚本 train.sh 里的对应参数, 开启模型训练:

python train.py \
    --pretrained_model "uer/t5-base-chinese-cluecorpussmall" \
    --save_dir "checkpoints/DuReaderQG" \
    --train_path "data/DuReaderQG/train.json" \
    --dev_path "data/DuReaderQG/dev.json" \
    --img_log_dir "logs/DuReaderQG" \
    --img_log_name "T5-Base-Chinese" \
    --batch_size 32 \
    --learning_rate 1e-4 \
    --max_source_seq_len 256 \
    --max_target_seq_len 32 \
    --learning_rate 5e-5 \
    --num_train_epochs 50 \
    --logging_steps 10 \
    --valid_steps 500 \
    --device "cuda:0"

正确开启训练后,终端会打印以下信息:

...
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:00<00:00, 650.73it/s]
DatasetDict({
    train: Dataset({features: ['text'],
        num_rows: 14520
    })
    dev: Dataset({features: ['text'],
        num_rows: 984
    })

global step 10, epoch: 1, loss: 9.39613, speed: 1.60 step/s
global step 20, epoch: 1, loss: 9.39434, speed: 1.71 step/s
global step 30, epoch: 1, loss: 9.39222, speed: 1.72 step/s
global step 40, epoch: 1, loss: 9.38739, speed: 1.63 step/s
global step 50, epoch: 1, loss: 9.38296, speed: 1.63 step/s
global step 60, epoch: 1, loss: 9.37982, speed: 1.71 step/s
global step 70, epoch: 1, loss: 9.37385, speed: 1.71 step/s
global step 80, epoch: 1, loss: 9.36876, speed: 1.69 step/s
global step 90, epoch: 1, loss: 9.36209, speed: 1.72 step/s
global step 100, epoch: 1, loss: 9.35349, speed: 1.70 step/s
...

logs/DuReaderQG 文件下将会保留训练曲线图:

2.4 模型推理

实现模型训练后,运行 inference.py 以加载训练好的模型并利用:

...

if __name__ == '__main__':
    question = '医治宫颈腐败的最佳工夫'
    context = '专家指出,宫颈腐败医治工夫应选在月经洁净后 3 - 7 日,因为医治之后宫颈有肯定的创面,如赶上月经期易产生感化。因而患者应在月经洁净后 3 天尽快来医院医治。同时应该留神,术前 3 天禁同房,有生殖道急性炎症者应治好后才可进行。'
    inference(qustion=question, context=context)

运行推理程序:

python inference.py

失去以下推理后果:

Q: "医治宫颈腐败的最佳工夫"
C: "专家指出,宫颈腐败医治工夫应选在月经洁净后 3 - 7 日,因为医治之后宫颈有肯定的创面,如赶上月经期易产生感化。因而患者应在月经洁净后 3 天尽快来医院医治。同时应该留神,术前 3 天禁同房,有生殖道急性炎症者应治好后才可进行。"
A: "答案:月经洁净后 3 - 7 日"

我的项目链接:https://github.com/HarderThenHarder/transformers_tasks/blob/main/answer_generation/readme.md

更多优质内容请关注公号:汀丶人工智能;会提供一些相干的资源和优质文章,收费获取浏览。

退出移动版