基线理解_中文自然语言处理新基线-百度艾尼(ERNIE)

百度艾尼预训练语言模型,最近新打破了很大一批中文、英文算法数据的新SOTA,那么我们今天就主要看一下如何利用ERNIE模型去支撑文本分类,文本命名实体识别,文本阅读理解(MRC)任务!

因为艾尼公开了源代码并且,在文本分类,命名实体识别(NER),阅读理解任务上都开放了代码。所以这就可以很快的将任务迁移到生产中。

首先我们从ERNIE的官网中把代码clone下来,因为整体框架是使用paddle框架实现的所以我们可以利用AI STUDIO提供的算力平台运行项目

本文的运行环境就是这个AI STUDIO 如果没有算力的同学可以私聊我,我送算力。

!git clone https://github.com/PaddlePaddle/ERNIE.git

这个唯一的不好的地方就是这个数据集,我是真的没办法,只能从这个README里面下好了,然后再修改这个sh文件,在sh文件中加入两行代码。就是这个数据集的地址以及这个预训练模型的地址。还可以设置多卡,但是毕竟免费的GPU环境中只有单卡。

ab060adbcb714d4f4b016cd0e8ffd202.png
ERNIE主要实现的中文数据集任务

我们可以从代码中看到,公开的几个任务的基线代码,基本上都是围绕着文本分类,文本序列标注,阅读理解进行的任务,实际ERNIE的长处也是围绕着这三个最常见的方向进行的。

配置文件中,公开了ERNIE的中英文的特征字表,虽然训练过程中是基于词进行的<MASK>,但是注意了,一个词有几个字符就会替换成几个<MASK>。

针对 ERNIE 2.0 模型,百度的工程师们构建了多个预训练任务,试图从 3 个层面去更好的理解训练语料中蕴含的信息:

  • Word-aware Tasks: 词汇 (lexical) 级别信息的学习
  • Structure-aware Tasks: 语法 (syntactic) 级别信息的学习
  • Semantic-aware Tasks: 语义 (semantic) 级别信息的学习

这个部分还有一个核心问题,就是在ERNIE1的时候预训练序列的长度为128,所以在一定的意义上来说,ERNIE早期对长文本任务的表现并不是非常理想。

645982e0f2174d523efa693eee31305c.png
可以看出来ERNIE是基于大量非结构化文本和已知三元组数据进行的训练而且加入了多任务预训练部分,从而可以在很多的任务上有比较好的表现

07720850963b4450934a4c5d18ad9f1d.png
这张图里面详细介绍了ERNIE采用的四种emdedding策略基于词、句子、位置、任务四个策略的encoder之后,输入到我们nlp中最常见的Transformer Encoder中

fba2ef5ebd201afcc65f167f092250fe.png
这是ERNIE2的论文,论文很简短但是却是比较实用的论文

8925646966c65e9660f976715d714a0d.png

这也就是上文中我们所提到的三个层面的预训练分别采取的策略,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还会远吗?

今天就到这里,我们下期接着聊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值