百度艾尼预训练语言模型,最近新打破了很大一批中文、英文算法数据的新SOTA,那么我们今天就主要看一下如何利用ERNIE模型去支撑文本分类,文本命名实体识别,文本阅读理解(MRC)任务!
因为艾尼公开了源代码并且,在文本分类,命名实体识别(NER),阅读理解任务上都开放了代码。所以这就可以很快的将任务迁移到生产中。
首先我们从ERNIE的官网中把代码clone下来,因为整体框架是使用paddle框架实现的所以我们可以利用AI STUDIO提供的算力平台运行项目
本文的运行环境就是这个AI STUDIO 如果没有算力的同学可以私聊我,我送算力。
!git clone https://github.com/PaddlePaddle/ERNIE.git
这个唯一的不好的地方就是这个数据集,我是真的没办法,只能从这个README里面下好了,然后再修改这个sh文件,在sh文件中加入两行代码。就是这个数据集的地址以及这个预训练模型的地址。还可以设置多卡,但是毕竟免费的GPU环境中只有单卡。
我们可以从代码中看到,公开的几个任务的基线代码,基本上都是围绕着文本分类,文本序列标注,阅读理解进行的任务,实际ERNIE的长处也是围绕着这三个最常见的方向进行的。
配置文件中,公开了ERNIE的中英文的特征字表,虽然训练过程中是基于词进行的<MASK>,但是注意了,一个词有几个字符就会替换成几个<MASK>。
针对 ERNIE 2.0 模型,百度的工程师们构建了多个预训练任务,试图从 3 个层面去更好的理解训练语料中蕴含的信息:
- Word-aware Tasks: 词汇 (lexical) 级别信息的学习
- Structure-aware Tasks: 语法 (syntactic) 级别信息的学习
- Semantic-aware Tasks: 语义 (semantic) 级别信息的学习
这个部分还有一个核心问题,就是在ERNIE1的时候预训练序列的长度为128,所以在一定的意义上来说,ERNIE早期对长文本任务的表现并不是非常理想。
这也就是上文中我们所提到的三个层面的预训练分别采取的策略,ERNIE2.0中文版本包括知识<MASK>策略,句子重新排序,句子距离、话语的关系、搜索引擎关联。五大优化策略。
ERNIE开源代码的任务包括:自然语言推断任务 XNLI;阅读理解任务 DRCD、DuReader、CMRC2018;命名实体识别任务 MSRA-NER (SIGHAN2006);情感分析任务 ChnSentiCorp;语义相似度任务 BQ Corpus、LCQMC;问答任务 NLPCC2016-DBQA 。
先围绕阅读理解任务来搞吧,毕竟这个也是我最近呕心沥血的在进攻的方向。同时期待某一个有识之士能写一个paddle版本的radam出来。
首先我们需要将数据读取出来(百度独有的reader策略可以读的更快速)
reader = task_reader.MRCReader(
# 词表位置
vocab_path=args.vocab_path,
label_map_config=args.label_map_config,
# 最大序列长度
max_seq_len=args.max_seq_len,
# 是否转换成小写
do_lower_case=args.do_lower_case,
in_tokens=args.in_tokens,
# 设置随机种子
random_seed=args.random_seed,
tokenizer=args.tokenizer,
#分类
is_classify=args.is_classify,
#回归
is_regression=args.is_regression,
for_cn=args.for_cn,
task_id=args.task_id,
doc_stride=args.doc_stride,
# 最大查询长度
max_query_length=args.max_query_length)
我们现已这个drcd举例,如何跑起来drcd
我们可以先进行一次小数据集下的pretrain,这比较简单,本身项目里面就有这个数据集。
#!/usr/bin/env bash
set -eux
export FLAGS_eager_delete_tensor_gb=0
export FLAGS_sync_nccl_allreduce=1
export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
python -u ./train.py --use_cuda True
--is_distributed False
--use_fast_executor True
--weight_sharing True
--in_tokens true
--batch_size 8192
--vocab_path ./config/vocab.txt
--train_filelist ./data/train_filelist
--valid_filelist ./data/valid_filelist
--validation_steps 100
--num_train_steps 1000000
--checkpoints ./checkpoints
--save_steps 10000
--ernie_config_path ./config/ernie_config.json
--learning_rate 1e-4
--weight_decay 0.01
--max_seq_len 512
--skip_steps 10
这里我们可以看到百度这个雄厚的实力,连pretrain的代码中都显示着我用了八块显卡,每一轮我们训练这8千多的数据,但是AI STUDIO中有且只有着 一块显卡,于是老铁们,我们可以针对这段代码进行一下小改造。
set -eux
export FLAGS_eager_delete_tensor_gb=0
export FLAGS_sync_nccl_allreduce=1
export CUDA_VISIBLE_DEVICES=0
python -u ./train.py --use_cuda True
--is_distributed False
--use_fast_executor True
--weight_sharing True
--in_tokens true
--batch_size 1024
--vocab_path ./config/vocab.txt
--train_filelist ./data/train_filelist
--valid_filelist ./data/valid_filelist
--validation_steps 100
--num_train_steps 1000000
--checkpoints ./checkpoints
--save_steps 10000
--ernie_config_path ./config/ernie_config.json
--learning_rate 1e-4
--weight_decay 0.01
--max_seq_len 512
--skip_steps 10
主要的改动就是换成一块显卡,并且我们每一轮只训练1024条数据。这样带来的结果就是可能我们不会取得SOTA的效果,但是小机灵鬼们,我们这里只是预演示一下。可以通过一下的链接下载ERNIE的公开语言预训练模型。英文的ERNIE2已经开源,中文的ERNIE还会远吗?
今天就到这里,我们下期接着聊