这是参加睿聚杯NER比赛的项目,主要是copy的百度提供的baseline,然后整理一下文档,方便和同学学习和交流。
训练:
bash run.sh
将训练模型转换为推理模型:
python save_model.py --init_checkpoint ./checkpoints/sequecneLabelingWithPremise/step_xxxx
压缩的时候不要压缩预训练模型和checkpoints(有500MB的提交限制),使用下面的命令操作:
zip -r predictor.zip ./ -rx=ERNIE_stable-1.0.1/params/* -rx=checkpoints/* -rx=__pycache__/* -rx=.git/*
比赛需要提交预测代码,测试环境和这个项目环境相同,需要提供推理模型来供调用。比赛测试平台是CPU平台,而且评估结果会受到提交人数 的影响,我第一次提交差不多花了5个小时才返回结果,群里有的老哥7-8个小时才返回结果。
baseline提供的算法模型比较简单。
- 模型将“要素原始值”+“句子”作为输入,然后按照序列标注常用的方法来组织输入:词嵌入+位置嵌入+句子类型(这个没看懂有什么用)
- 采用transformer作为backbone,将transformer-encoder的输出经过一层fc+softmax即得到最终的预测结果。
- 训练loss使用的交叉熵loss。
实际的数据需要处理一下,比如给的是txt格式的文档,但是baseline的代码都是读取的tsv格式的文档,包括一些数据清洗的工作,主要通过 这部分代码实现。
运行:
cd predictor
python data_utils/file_check.py
python data_utils/gen_train_test.py
从baseline中拷贝的,用来滤除缺失信息的样本。得到有问题的error_docs.json
和没问题的good_docs.json
。
看群里讨论说的,实际上比较重要训练数据有要素原始值,句子,然后就是NER的标签了,baseline提供了一个例子,我放在data_utils/ner_train_example.txt
里面。所以gen_train_test.py
主要完成从提供的json格式数据中拆分得到ner_train.tsv
和ner_test.tsv
两个文件。
这个文件夹包含了ERNIE预训练模型,在训练的时候加载可以缩短训练时间,提高训练效果(有点像Bert)。
然后还有一些配置文件,主要定义了transformer-encoder模型的一些参数。
存放训练集和验证集的位置。
这个文件夹下用到的只有sequence_label.py
。 sequence_label.py
主要实现了transformer-encoder下游的序列预测任务,以及提供了create_model
接口生成的。训练结束后,可以通过下面的指令生成预测模型文件:
需要关注两个文件:
- transformer_encoder.py 这是模型的核心代码,主要实现了transformer module,以及残差连接、dropout、layer normalization;
- ernie.py 将transformer_encoder.py的一些方法封装起来;
主要关注一下:
- args.py 提供了命令行参数实现;
- init.py 提供了模型初始化代码;
- fp16.py 代码里也用到了,但是比较底层我没看;
主要关注一下:
- task_reader.py 提供了数据读取的代码;
包含了测试结果文件test_result.x.yyyy
和保存的模型(应该是包含了定期保存的模型,以及验证集上效果最好的模型);
将数据封装成 batch 格式,和task_reader.py
一起使用;
提供了一些单词级的操作;
提供了命令行参数实现;
save_model.py 会用到;
模拟最终评估平台的执行,可以用来测试predictor.py
执行的正确性和效果;
最终评估平台主要是调用predictor.py
来完成代码效果的评估;
封装了学习率和loss优化的定义,主要在模型训练的时候用到;
具体的注解可以看train.py的注释。
包含了predictor.py所需的预测模型文件:
__model__
weights
这两个文件是通过paddle的save_inference_model
接口生成的。训练结束后,可以通过下面的指令生成预测模型文件:
python save_model.py --init_checkpoint ./checkpoints/sequecneLabelingWithPremise/step_xxxx