资讯 文档
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术

使用ERNIE预训练模型

数据准备

在使用Ernie预训练模型前需要准备相关任务的数据;这里以文本分类任务为例。数据集不需要分词且无需准备词表,其格式与非ERNIE的数据集相同,如下所示:

选择珠江花园的原因就是方便,有电动扶梯直接到达海边,周围餐馆、食廊、商场、超市、摊位一应俱全。酒店装修一般,但还算整洁。 1 15.4寸笔记本的键盘确实爽,基本跟台式机差不多了,蛮喜欢数字小键盘,输数字特方便,样子也很美观,做工也相当不错 1 房间太小。其他的都一般。。。。。。。。。 0

JSON配置

这里以基于Ernie-base-1.0预训练模型,下游网络使用CNN进行文本分类的任务为例。首先进入tasks/text_classification/examples目录下,打开cls_ernie_1.0_base_cnn_ch.json

{
  "dataset_reader": {                                  
    "train_reader": {                                   ## 训练、验证、测试各自基于不同的数据集,数据格式也可能不一样,可以在json中配置不同的reader,此处为训练集的reader。
      "name": "train_reader",
      "type": "BasicDataSetReader",                     ## 采用BasicDataSetReader,其封装了常见的读取tsv文件、组batch等操作。
      "fields": [                                       ## 域(field)是TextOne的高阶封装,对于同一个样本存在不同域的时候,不同域有单独的数据类型(文本、数值、整型、浮点型)、单独的词表(vocabulary)等,可以根据不同域进行语义表示,如文本转id等操作,field_reader是实现这些操作的类。
        {
          "name": "text_a",                             ## 文本分类只有一个文本特征域,命名为"text_a"。
          "data_type": "string",                        ## data_type定义域的数据类型,文本域的类型为string,整型数值为int,浮点型数值为float。
          "reader": {"type":"ErnieTextFieldReader"},   ## 采用针对Ernie文本域的通用reader "ErnieTextFieldReader"。数值数组类型域为"ScalarArrayFieldReader",数值标量类型域为"ScalarFieldReader"。
          "tokenizer":{
              "type":"FullTokenizer",                 ## FullTokenizer。
              "split_char":" ",                         ## 通过空格区分不同的token。
              "unk_token":"[UNK]",                      ## unk标记为"[UNK]"。
              "params":null
            },
          "need_convert": true,                         ## "need_convert"为true说明数据格式是明文字符串,需要通过词表转换为id。
          "vocab_path": "./dict/vocab.txt",             ## 指定该文本域的词表。
          "max_seq_len": 512,                           ## 设定每个域的最大长度。
          "truncation_type": 0,                         ## 选择截断策略,0为从头开始到最大长度截断,1为从头开始到max_len-1的位置截断,末尾补上最后一个id(词或字),2为保留头和尾两个位置,然后按从头开始到最大长度方式截断。
          "padding_id": 0                               ## 设定padding时对应的id值。
        },                                              ## 如果每一个样本有多个特征域(文本类型、数值类型均可),可以仿照前面对每个域进行设置,依次增加每个域的配置即可。此时样本的域之间是以\t分隔的。
        {
          "name": "label",                              ## 标签也是一个单独的域,命名为"label"。如果多个不同任务体系的标签存在于多个域中,则可实现最基本的多任务学习。
          "data_type": "int",                           ## 标签是整型数值。
          "reader":{
            "type":"ScalarFieldReader"                  ## 整型数值域的reader为"ScalarFieldReader"。
          },
          "tokenizer":null,
          "need_convert": false,
          "vocab_path": "",
          "max_seq_len": 1,
          "truncation_type": 0,
          "padding_id": 0,
          "embedding": null
        }
      ],
      "config": {
        "data_path": "./data/train_data/",              ## 训练数据train_reader的数据路径,写到文件夹目录。
        "shuffle": false,
        "batch_size": 8,
        "epoch": 10,
        "sampling_rate": 1.0
      }
    },
    "test_reader": {                                    ## 若要评估测试集,需配置test_reader,其配置方式与train_reader类似。
    ……
    },
    "dev_reader": {                                     ## 若要评估验证集,需配置dev_reader,其配置方式与test_reader类似。
    ……
    }
  },
  ……
}

(1) 数据路径配置

在['dataset_reader']下的各个reader中['config']中配置相关数据的路径;以下为./examples/cls_ernie_1.0_base_cnn_ch.json中抽取出来的train_reader的部分配置,并通过注释说明。

    "train_reader": {
      "name": "train_reader",
      "type": "BasicDataSetReader",
      ......
      "config": {
        "data_path": "./data/train_data",
        "shuffle": false,
        "batch_size": 8,
        "epoch": 5,
        "sampling_rate": 1.0
      }

(2) 模型选择 model用于配置模型训练时的预置网络,包括预置网络的类别及其优化器的参数等。 以下为./examples/cls_ernie_1.0_base_cnn_ch.json中抽取出来的model部分配置,并通过注释说明。

  "model": {
    "type": "ErnieCnnClassification",
    "optimization": {
      "learning_rate": 5e-05,
      "lr_scheduler": "linear_warmup_decay",
      "warmup_steps": 0,
      "warmup_proportion": 0.1,
      "weight_decay": 0.01,
      "use_dynamic_loss_scaling": false,
      "init_loss_scaling": 128,
      "incr_every_n_steps": 100,
      "decr_every_n_nan_or_inf": 2,
      "incr_ratio": 2.0,
      "decr_ratio": 0.8
    },
    "embedding": {
      "type": "ErnieTokenEmbedding",
      "emb_dim": 768,
      "use_fp16": false,
      "config_path": "../model_files/config/ernie_1.0_base_ch_config.json",
      "other": ""
    },
    "num_labels": 2
  },

(3) trainer部分 trainer用于配置模型训练的启动器,包括保存模型时的间隔步数、进行测试集或验证集评估的间隔步数等。 以下为./examples/cls_ernie_1.0_base_cnn_ch.json中抽取出来的trainer部分配置,并通过注释说明。

  "trainer": {
    "PADDLE_USE_GPU": 1,
    "PADDLE_IS_LOCAL": 1,
    "train_log_step": 10,
    "is_eval_dev": 0,
    "is_eval_test": 1,
    "eval_step": 100,
    "save_model_step": 10000,
    "load_parameters": 0,
    "load_checkpoint": 0,
    "use_fp16": 0,
    "pre_train_model": [
      {
        "name": "ernie_1.0_base_ch",
        "params_path": "../model_files/ernie_1.0_base_ch_dir/params"
      }
    ],
    "output_path": "./output/cls_ernie_1.0_base_cnn_ch",
    "extra_param": {
      "meta":{
        "job_type": "text_classification"
      }

    }
  }

(4) 预训练模型配置注意事项 其中json中的配置需要注意以下几点:

  • 文本域的选择(reader的type值):由于Ernie模型需要文本域的输入包含token_id、position_id、sentence_id、sequence_len、task_id等信息,因此只能选择ErnieTextFieldReader
  • 分词组件的选择:Ernie预训练模型在做文本分类或者文本匹配等任务时,可以选择FullTokenizerFullTokenizer会对输入的文本中的中文进行切字,非中文的文本做subword,即更细粒度的切词;如果做序列标注相关任务时,由于输入的文本域和标签域一般是序列对应的,因此无需进行分词,这时应该选择CustomTokenizer;而在使用Ernie Tiny预训练模型时,由于Ernie Tiny是基于词的,因此需要对输入的文本进行分词,此时应该选择WSSPTokenizer分词组件;
  • 词表的选择(vocab_path):使用Ernie预训练模型进行下游任务的Finetuning或者持续Posttrain时,必须使用该预训练模型对应的词表,否则会导致词向量矩阵shape以及token的embedding对不上,影响最终的模型效果;
  • 配置文件选择:由于不同版本的Ernie预训练模型在模型结构、大小等方便存在差异,必须使用该预训练对应的config文件,并在json内配置到['model']['embedding']['config_path']内;比如这里是:../model_files/config/ernie_1.0_base_ch_config.json;
  • 预训练模型路径配置:需要把预训练模型params文件夹所在的路径配置到['trainer']['pre_train_model']中;

训练模型

与非ERNIE的训练方式相同,使用预置网络进行训练的方式为使用./run_with_json.py入口脚本,通过--param_path参数来传入./examples/目录下ernie相关的json配置文件。

以预置基于ernie_1.0_base的CNN文本分类模型为例,训练分为以下几个步骤:

  1. 请使用以下命令在../model_files/中通过对应脚本下载ernie_1.0_base模型参数文件,其对应配置文件ernie_1.0_base_ch_config.json和词表vocab_ernie_1.0_base_ch.txt分别位于../model_files/目录下的config/dict/文件夹,用户无需更改;
# ernie_1.0_base 模型下载
# 进入model_files目录
cd ../model_files/
# 运行下载脚本
sh download_ernie_1.0_base_ch.sh
  1. 请准备数据集并放入对应目录中,ERNIE训练所需数据集不需要分词且无需准备词表,其格式与非ERNIE的数据集相同;
  "inference": {
    "output_path": "./output/predict_result.txt",
    "inference_model_path": "./output/cls_ernie_1.0_base_cnn_ch/save_inference_model/inference_step_10",
    "PADDLE_USE_GPU": 1,
    "PADDLE_IS_LOCAL": 1,
    "num_labels": 2,
    "extra_param": {
      "meta":{
        "job_type": "text_classification"
      }

    }
  }
  1. 运行以下命令在训练集(train.txt)上进行模型训练,并在测试集(test.txt)上进行验证;
python run_with_json.py --param_path ./examples/cls_ernie_1.0_base_cnn_ch.json
  1. 训练运行的日志会自动保存在./log/test.log文件中;

模型预测

使用预置网络进行预测的方式为使用./run_infer.py入口脚本,通过--param_path参数来传入./examples/目录下的json配置文件。 以基于预置CNN网络所训练出的模型为例,其预测分为以下几个步骤:

  1. 基于./examples/cls_ernie_1.0_base_cnn_ch_infer.json训练出的模型默认储存在./output/cls_ernie_1.0_base_cnn_ch/save_inference_model/inference_step_10_enc中,在该目录下找到被保存的inference_model文件夹,例如inference_step_10_enc/;
  2. ./examples/cls_ernie_1.0_base_cnn_ch_infer.json中修改"inference_model_path"参数,填入上述模型保存路径,如下所示:
  3. 基于示例的数据集,可以运行以下命令在预测集(infer.txt)上进行预测: python run_infer.py --param_path ./examples/cls_ernie_1.0_base_cnn_ch_infer.json
  4. 预测运行的日志会自动保存在./output/predict_result.txt文件中。

切换Ernie预训练模型

如果想使用其他版本的Ernie预训练模型进行CNN任务的文本分类,只需要修改json配置即可,需要重点关注【JSON配置】小结中的【(4) 预训练模型配置注意事项】,针对词典、文本域、tokenizer、config配置、预训练路径等进行相应修改即可,模型训练和预测的方式与上文描述的一致。