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

进阶任务:文本语义向量化

简介

文本语义向量化是指输入一串文本,经过模型计算输出一个能表示文本语义的向量。文心目前提供了两种方式来获取文本语义向量:一种是通过对文心内置的基于ERNIE-Sim模型进行预测来获取语义向量;另一种方式是使用自己的数据对ERNIE-Sim预训练模型进行fine tune,得到一个可以用来获取语义项目的模型。

环境安装

环境安装

目录结构

文本语义向量化的任务位于/wenxin/tasks/text_embedding

├── download_ernie_sim_1.0_6L_768_emb.sh     ## 预置的可直接进行预测部署的ERNIE-Sim模型的下载脚本                                                                      
├── run_with_json.py                         ## 依靠json配置文件进行模型训练的入口脚本 	
├── run_infer.py                             ## 依靠json配置文件进行模型预测的入口脚本 
├── inference_server.py                      ## 对模型进行预测部署的入口脚本 
├── examples                                           ## 各典型网络的json配置文件 
│   ├── emb_ernie_sim_1.0_6L768_ch_infer.json          ## 对预置的ERNIE-Sim模型进行预测的配置文件
│   ├── mtch_ernie_sim_1.0_pairwise_simnet_ch.json  ## 使用pairwise结构对ERNIE-Sim进行fine tune训练的配置文件
│   ├── mtch_ernie_sim_1.0_pairwise_simnet_ch_infer.json  ## 对fine tune之后的ERNIE-Sim模型进行预测的配置文件
├── data    					## 示例数据文件夹,包括各任务所需训练集、测试集、验证集和预测集 
		├── train_data_pairwise
    	│   └── train.txt 
		├── test_data 
		│   └── test.txt 
		├── dev_data 
		│   └── dev.txt 
		├── infer_data 
    		└── infer.txt   

开始使用

使用预置的ERNIE-Sim模型进行预测来获取语义向量

准备工作

  • 下载预置的ERNIE-Sim模型,下载成功之后会在当前目录下看到一个名为ernie_sim_1.0_6L_768emb的目录。

    sh download_ernie_sim_1.0_6L_768_emb.sh
  • 准备需要预测的样本数据,样例数据见./data/infer_data/infer.txt,其格式如下:

    重大科技任务选择国外
    星际大陆矿难
    mac上终端操作技巧
    国家宝藏竹林七贤背景音乐
  • 配置参数文件./examples/emb_ernie_sim_1.0_6L768_ch_infer.json,其中用户可自定义的参数为data_path,batch-size,output_path,PADDLE_USE_GPU,其余参数不需要修改。

    {
      "dataset_reader": {
        "predict_reader": {
          "name": "predict_reader",
          "type": "BasicDataSetReader",
          "fields": [
            {
              "name": "text_a",
              "data_type": "string",
              "reader": {
                "type": "ErnieTextFieldReader"
              },
              "tokenizer": {
                "type": "FullTokenizer",
                "split_char": " ",
                "unk_token": "[UNK]"
              },
              "need_convert": true,
              "vocab_path": "./ernie_sim_1.0_6L_768emb/vocab/ernie_base.txt",
              "max_seq_len": 512,
              "truncation_type": 0,
              "padding_id": 0,
              "embedding": null
            }
          ],
          "config": {
            "data_path": "./data/infer_data",  ## 用户填写自己的数据集路径即可
            "shuffle": false,
            "batch_size": 8,    ## 用户视自己物理机的硬件显存或内存大小可以进行调整
            "epoch": 1,
            "sampling_rate": 1.0
          }
        }
      },
      "inference": {
        "output_path": "./ernie_sim_1.0_6L_768emb/predict_result.txt",   ## 预测结果存放的路径,用户可以自定义
        "inference_model_path": "./ernie_sim_1.0_6L_768emb/inference_model",   ## 在上一步下载的文心预置的ERNIE-Sim预测模型路径
        "PADDLE_USE_GPU": 1,   ## 是否使用GPU进行训练,1为使用GPU。
        "PADDLE_IS_LOCAL": 1,
        "emb_dim": 768,
        "extra_param": {
          "meta":{
            "job_type": "text_embedding"
          }
        }
      }
    }

开始使用

python run_infer.py --param_path=./examples/emb_ernie_sim_1.0_6L768_ch_infer.json

微调ERNIE-Sim获取预测模型

准备工作

  • 下载ERNIE-Sim预训练模型

    # 在wenxin/tasks/model_files/目录下下载管理ERNIE-Sim预训练模型,下载成功会看到名为ernie_sim_1.0_ch_dir的目录,里面存放了ERNIE-Sim预训练模型对应的参数文件。
    # 进入到 model_files目录
    cd  wenxin/tasks/model_files/
    # 执行下载脚本
    sh download_ernie_sim_1.0_ch.sh
  • 准备数据:文心使用Pairwise网络结构对ERNIE-Sim进行fine tune

    • 训练数据:Pairwise训练集样例如下所示,数据分为三列,列与列之间用\t分割,以query和文章标题匹配任务为例,第一列为query,第二列为正例标题pos_titile,第三列为负例标题neg_title。由于使用ERNIE系列模型进行fine tune,所以不需要用户自己切词和提供词表文件。样例数据见./data/train_data_pairwise

      喜欢打篮球的男生喜欢什么样的女生	爱打篮球的男生喜欢什么样的女生	这边的状态显示是等待确认的
      我手机丢了,我想换个手机	我想买个新手机,求推荐	求一本小说是和攻撕逼的
      大家觉得她好看吗	大家觉得跑男好看吗?	四川商务职业学院好不好呀
      求秋色之空漫画全集	求秋色之空全集漫画	杂志社摄影照片投稿
    • 测试集(评估集)数据:测试集/验证集样例如下所示,数据分为三列,列与列之间用\t进行分隔,前两列为文本,最后一列为标签,样例数据见./data/test_data/,其格式如下:

      违章建筑如何投诉	如何投诉违章建筑	1
      关于美国监狱的电影	电影美国监狱	1
      特种作业操作证	《特种作业操作证》	1
      机箱风扇怎么拆	主机箱风扇怎么装	0
    • 预测集数据:数据为一列文本,样例数据见./data/infer_data/infer.txt,其格式如下:

      重大科技任务选择国外
      星际大陆矿难
      mac上终端操作技巧
      国家宝藏竹林七贤背景音乐

开始使用

  • 训练

    • 配置参数文件:demo配置文件为./examples/mtch_ernie_sim_1.0_pairwise_simnet_ch.json,用户需要自己配置的参数为:trainer_reader、test_reader、dev_reader这三个reader对应的数据集路径、batch-size、trainer_reader的epoch;trainer中的PADDLE_USE_GPU、PADDLE_IS_LOCAL、output_path、几个step设置等,如下图中的json注释所示:

      {
        "dataset_reader": {
          "train_reader": {
            "name": "train_reader",
            "type": "BasicDataSetReader",
            "fields": [
              {
                "name": "text_a",
                "data_type": "string",
                "reader": {
                  "type": "ErnieTextFieldReader"
                },
                "tokenizer": {
                  "type": "FullTokenizer",
                  "split_char": " ",
                  "unk_token": "[UNK]",
                  "params": null
                },
                "need_convert": true,
                "vocab_path": "../model_files/dict/vocab_ernie_sim_1.0_ch.txt",
                "max_seq_len": 512,
                "truncation_type": 0,
                "padding_id": 0,
                "embedding": null
              },
              {
                "name": "text_b",
                "data_type": "string",
                "reader": {
                  "type": "ErnieTextFieldReader"
                },
                "tokenizer": {
                  "type": "FullTokenizer",
                  "split_char": " ",
                  "unk_token": "[UNK]",
                  "params": null
                },
                "need_convert": true,
                "vocab_path": "../model_files/dict/vocab_ernie_sim_1.0_ch.txt",
                "max_seq_len": 512,
                "truncation_type": 0,
                "padding_id": 0,
                "embedding": null
              },
              {
                "name": "text_c",
                "data_type": "string",
                "reader": {
                  "type": "ErnieTextFieldReader"
                },
                "tokenizer": {
                  "type": "FullTokenizer",
                  "split_char": " ",
                  "unk_token": "[UNK]",
                  "params": null
                },
                "need_convert": true,
                "vocab_path": "../model_files/dict/vocab_ernie_sim_1.0_ch.txt",
                "max_seq_len": 512,
                "truncation_type": 0,
                "padding_id": 0,
                "embedding": null
              }
            ],
            "config": {
              "data_path": "./data/train_data_pairwise",   ## 填写自己的数据集路径即可
              "shuffle": false,    ## 训练过程中如果需要打乱数据顺序,请设置为true
              "batch_size": 8,     ## 可以根据自己的硬件显存或者内存大小进行调整
              "epoch": 5,          ## 根据需要自己调整
              "sampling_rate": 1.0
            }
          },
          "test_reader": {
            "name": "test_reader",
            "type": "BasicDataSetReader",
            "fields": [
              {
                "name": "text_a",
                "data_type": "string",
                "reader": {
                  "type": "ErnieTextFieldReader"
                },
                "tokenizer": {
                  "type": "FullTokenizer",
                  "split_char": " ",
                  "unk_token": "[UNK]",
                  "params": null
                },
                "need_convert": true,
                "vocab_path": "../model_files/dict/vocab_ernie_sim_1.0_ch.txt",
                "max_seq_len": 512,
                "truncation_type": 0,
                "padding_id": 0,
                "embedding": null
              },
              {
                "name": "text_b",
                "data_type": "string",
                "reader": {
                  "type": "ErnieTextFieldReader"
                },
                "tokenizer": {
                  "type": "FullTokenizer",
                  "split_char": " ",
                  "unk_token": "[UNK]",
                  "params": null
                },
                "need_convert": true,
                "vocab_path": "../model_files/dict/vocab_ernie_sim_1.0_ch.txt",
                "max_seq_len": 512,
                "truncation_type": 0,
                "padding_id": 0,
                "embedding": null
              },
              {
                "name": "label",
                "data_type": "int",
                "reader": {
                  "type": "ScalarFieldReader"
                },
                "tokenizer": null,
                "need_convert": false,
                "vocab_path": "",
                "max_seq_len": 1,
                "truncation_type": 0,
                "padding_id": 0,
                "embedding": null
              }
            ],
            "config": {
              "data_path": "./data/test_data",   ## 填写自己的测试集路径即可
              "shuffle": false,   
              "batch_size": 8,                  ## 可以根据自己的硬件显存或者内存大小进行调整
              "epoch": 1,
              "sampling_rate": 1.0
            }
          },
          "dev_reader": {
            "name": "dev_reader",
            "type": "BasicDataSetReader",
            "fields": [
              {
                "name": "text_a",
                "data_type": "string",
                "reader": {
                  "type": "ErnieTextFieldReader"
                },
                "tokenizer": {
                  "type": "FullTokenizer",
                  "split_char": " ",
                  "unk_token": "[UNK]",
                  "params": null
                },
                "need_convert": true,
                "vocab_path": "../model_files/dict/vocab_ernie_sim_1.0_ch.txt",
                "max_seq_len": 512,
                "truncation_type": 0,
                "padding_id": 0,
                "embedding": null
              },
              {
                "name": "text_b",
                "data_type": "string",
                "reader": {
                  "type": "ErnieTextFieldReader"
                },
                "tokenizer": {
                  "type": "FullTokenizer",
                  "split_char": " ",
                  "unk_token": "[UNK]",
                  "params": null
                },
                "need_convert": true,
                "vocab_path": "../model_files/dict/vocab_ernie_sim_1.0_ch.txt",
                "max_seq_len": 512,
                "truncation_type": 0,
                "padding_id": 0,
                "embedding": null
              },
              {
                "name": "label",
                "data_type": "int",
                "reader": {
                  "type": "ScalarFieldReader"
                },
                "tokenizer": null,
                "need_convert": false,
                "vocab_path": "",
                "max_seq_len": 1,
                "truncation_type": 0,
                "padding_id": 0,
                "embedding": null
              }
            ],
            "config": {
              "data_path": "./data/dev_data",   ## 填写自己的验证集路径即可
              "shuffle": false,
              "batch_size": 8,                  ## 可以根据自己的硬件显存或者内存大小进行调整
              "epoch": 1,
              "sampling_rate": 1.0
            }
          }
        },
        "model": {
          "type": "ErnieMatchingSiamesePairwiseForEmbedding", 
          "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_sim_1.0_ch_config.json",
            "other": ""
          }
        },
        "trainer": {
          "PADDLE_USE_GPU": 1,    ## 是否使用GPU,1表示使用GPU
          "PADDLE_IS_LOCAL": 1,   ## 是否进行单机训练,1表示单机训练,0表示分布式训练
          "train_log_step": 10,   ## 训练时打印训练日志的间隔步数。
          "is_eval_dev": 0,       ## 是否在训练的时候评估验证集,1为需评估,此时必须配置dev_reader。
          "is_eval_test": 1,      ## 是否在训练的时候评估测试集,1为需评估,此时必须配置test_reader。
          "eval_step": 100,       ## 进行测试集或验证集评估的间隔步数。
          "save_model_step": 500,   ## 保存模型时的间隔步数,建议设置为eval_step的整数倍。
          "load_parameters": "",  ## 加载已训练好的模型的op参数值,不会加载训练步数、学习率等训练参数,可用于加载预训练模型。如需使用填写具体文件夹路径即可。
          "load_checkpoint": "",  ## 加载已训练好的模型的所有参数,包括学习率等,可用于热启动。如需使用填写具体文件夹路径即可。
          "use_fp16": 0,
          "pre_train_model": [
            {
              "name": "ernie_sim_1.0_ch",   ## ernie-sim预训练模型加载时使用的名称,不要修改
              "params_path": "../model_files/ernie_sim_1.0_ch_dir/params"  ## ernie-sim预训练模型的参数目录
            }
          ],
          "output_path": "./output/mtch_ernie_sim_1.0_pairwise_simnet_ch", ## 保存模型的输出路径,若为空则默认。为"./output"
          "extra_param": {
            "meta":{
              "job_type": "text_matching"
            }
          }
        }
      }
    • 执行训练脚本

      如您使用镜像开发套件,您可直接进入下一步骤。如您将文心开发套件与本地已有的开发环境相结合,您需要在./env.sh中配置对应的环境变量,并执行source env.sh ,如需了解更多详情,请参考环境配置

      python run_with_json.py --param_path=./examples/mtch_ernie_sim_1.0_pairwise_simnet_ch.json

      训练运行的日志会自动保存在./log/test.log文件中;

      训练中以及结束后产生的模型文件会默认保存在./output/目录下,其中save_inference_model/文件夹会保存用于预测的模型文件,save_checkpoint/文件夹会保存用于热启动的模型文件。

  • 预测

    • 配置参数文件:demo配置文件为./examples/mtch_ernie_sim_1.0_pairwise_simnet_ch_infer.json,用户需要自己配置的参数为:predict_reader对应的数据集路径、batch-size;inference中的PADDLE_USE_GPU、output_path、inference_model_path,如下图中的json注释所示:

      {
        "dataset_reader": {
          "predict_reader": {
            "name": "predict_reader",
            "type": "BasicDataSetReader",
            "fields": [
              {
                "name": "text_a",
                "data_type": "string",
                "reader": {
                  "type": "ErnieTextFieldReader"
                },
                "tokenizer": {
                  "type": "FullTokenizer",
                  "split_char": " ",
                  "unk_token": "[UNK]",
                  "params": null
                },
                "need_convert": true,
                "vocab_path": "../model_files/dict/vocab_ernie_sim_1.0_ch.txt",
                "max_seq_len": 512,
                "truncation_type": 0,
                "padding_id": 0,
                "embedding": {
                  "type": "ErnieTokenEmbedding",
                  "use_reader_emb": false,
                  "emb_dim": 768,
                  "config_path": "../model_files/config/ernie_sim_1.0_ch_config.json"
                }
              }
            ],
            "config": {
              "data_path": "./data/infer_data",  ## 填写你自己的预测数据集路径即可
              "shuffle": false,
              "batch_size": 8,   ## 可以根据自己的硬件显存或者内存大小进行调整
              "epoch": 1,
              "sampling_rate": 1.0
            }
          }
        },
        "inference": {
          "output_path": "./output/predict_result.txt",  ## 预测结果存放路径
          "PADDLE_USE_GPU": 1,  ## 是否使用GPU,1表示使用GPU
          "PADDLE_IS_LOCAL": 1, ## 不要修改,目前文心不支持多机预测
          "emb_dim": 768,       ## 不要修改,这里的维度对应的是ERNIE-Sim的语义向量的维度
          "inference_model_path": "./output/mtch_ernie_sim_1.0_pairwise_simnet_ch/save_inference_model/inference_step_10",   ## 待预测的模型路径。
          "extra_param": {
            "meta":{
              "job_type": "text_matching"
            }
          }
        }
      }
    • 执行预测脚本

      如您使用镜像开发套件,您可直接进入下一步骤。如您将文心开发套件与本地已有的开发环境相结合,您需要在./env.sh中配置对应的环境变量,并执行source env.sh ,如需了解更多详情,请参考环境配置

      python run_infer.py --param_path=./examples/mtch_ernie_sim_1.0_pairwise_simnet_ch_infer.json

      预测运行的日志会自动保存在./output/predict_result.txt文件中。

      预测结果如下所示,第一列是输入的明文文本,第二列为768维的语义向量:

      重大科技任务选择国外	[0.19419774413108826, -0.11720949411392212, -0.46770986914634705, 0.4072752594947815, 0.4012185037136078..... -0.3230787515640259]
  • 预测部署

    • 模型部署server脚本是inference_server.py,配置文件为examplse目录下的以_infer为后缀的json配置文件,这里emb_ernie_sim_1.0_6L768_ch_infer.json 和mtch_ernie_sim_1.0_pairwise_simnet_ch_infer.json都可以用来进行模型部署的配置。具体配置项与前文介绍的一致,不再赘述。
    • 启动模型部署服务,HttpServer基于bottle + gevent框架搭建:

      # 服务启动前,先设置鉴权服务的地址,下面的your_auth_server_address需要设置成真实鉴权服务器的IP地址
      export AIPE_SECURITY_SERVER_HOST=your_auth_server_address
      # 这里port参数指定服务监听端口,这里即启动了以8801为端口的server服务
      # param_path参数指定配置文件路径
      python inference_server.py --port 8801 --param_path ./examples/emb_ernie_sim_1.0_6L768_ch_infer.json
    • client端发送请求:

      # 这里的ip使用上面启动模型部署服务对应机器的ip地址,port使用启动模型部署服务设置的端口,例如上面采用的是8801
        curl -d '{"text": [["重大科技任务选择国外"], ["国家宝藏竹林七贤背景音乐"]]}' 'http://ip:port/wenxin/inference'
上一篇
开始训练与预测
下一篇
序列标注任务