文心使用FAQ
常见问题Top
Q:是否可以离线使用文心NLP开发套件,可以使用什么机器配置?
A:可以,BML Codelab是专门针对离线开发环境的产品,并提供了文心的NLP开发套件在离线环境下使用。如果您想基于ERNIE模型进行训练,建议使用GPU机器,否则将会存在非常大的训练耗时。如果您使用文心训练一个网络简单的非ERNIE的模型,可以在普通机型即可完成训练,例如i3处理器,1G以上空闲内存。
Q:我使用本地机器训练ERNIE模型,如何保证训练顺利进行?
A:ERNIE的配置文件里将hidden_layer设置为1;
Q:我的机器没有GPU,是否可以训练成功?
A: 可以,需要在输入的json文件中设置PADDLE_USE_GPU=0,即不使用GPU
Q:评估集设置大小问题
A:用户跑pre-train任务时,评估集设置太大,会导致评估阶段过长,建议缩小评估集数量。
Q:基于域的数据处理过程中,如何选择不同的域,是否需要提前分词,如何上传自己的词典?
A:同一个样本中,多个相互独立的特征与标签都可以是单独的域,每个域有单独的数据类型(如文本、数值、整型、浮点型等)和单独的数据预处理过程(如tokenizer、词表等)。文心对域的处理详情及如何选择不同的域请参考Data模块使用说明-FieldReader部分的文档。在这里我们以文本分类任务为例,给出的示例数据如下所示。该样本可以分为两个域进行处理,分别是文本域(对应文本域读取器CustomTextFieldReader)和标签域(对应整型数据域读取器ScalarFieldReader),具体可以通过json来配置,配置方式详情请见开发指南中的NLP任务详细说明文档。
房间 太 小 。 其他 的 都 一般 。 。 。 。 。 。 。 。 。 0
LED屏 就是 爽 , 基本 硬件 配置 都 很 均衡 , 镜面 考 漆 不错 , 小黑 , 我喜欢 。 1
差 得 要命 , 很大 股霉味 , 勉强 住 了 一晚 , 第二天 大早 赶紧 溜。 0是否需要提前分词的依据为是否使用了ernie预训练模型:当使用带有ernie的模型时,不需要提前对数据作分词处理;使用非ernie模型时,需要提前对数据作分词处理。
在上传您自己的词典之前,需按照各任务的词典要求来进行预处理,之后可以通过json文件的方式对词典路径进行配置,各任务词典格式和词典路径配置方式详情请见开发指南中的NLP任务详细说明。值得注意的是,各个域所需的词典需要单独进行配置。
Q:如何识别脏数据(基本上是训练日志都输出loss了后几步出现问题了)
A:当出现读取部分数据后报错的情况时,可以怀疑训练数据中有脏数据,即数据不符合正确格式,包括缺少域、数据编码错误(需为utf-8)等,文心各任务所需的数据格式请参考开发指南中NLP任务详细说明中各任务页面内关于数据部分的解释。以分类任务为例,数据的原格式为【文本 \t 标签】,如果训练数据中部分数据缺少标签,则会在训练过程中报以下的错误。此时需要仔细检查训练数据,剔除或修改缺乏标签的脏数据。
Q:数据读取太慢怎么改进? A:数据是一个一个文件读取的,如果只有一个文件就会太大。当数据文件非常大的时候,直接读取会非常慢,甚至还会出现内存不够用的情况,这时候我们可以将大文件拆分成小文件,分批次(分块)读取,而不是一次性读取。
Q:如何在inference过程中输出自己想要的任意输出? 只需要将所需要输出的参数加入前向网络forward的target_predict_list = []的列表中放入您想要的任何Tensor即可,以分类任务的bow_classification预置模型为例,其target_predict_list如下所示:
if phase == InstanceName.SAVE_INFERENCE:
"""保存模型时需要的入参:表示模型预测时需要输入的变量名称和顺序"""
target_feed_name_list = [text_a.name, text_a_lens.name]
"""保存模型时需要的入参:表示预测时最终输出的结果"""
target_predict_list = [predictions]
forward_return_dict = {
InstanceName.TARGET_FEED_NAMES: target_feed_name_list,
InstanceName.TARGET_PREDICTS: target_predict_list
}
return forward_return_dict表明该预置网络在inference过程中的输出为predictions。
Q:如何通过修改json配置对应的网络来实现自定义网络?
A: json中的model部分关联了model中的预置网络。
以文本分类预制json配置文件为例,其中type的值对应的类名为“CnnClassification”,它就是预制网络的类名,该网络可在网络../../wenxin/models/文件夹中找到,其小写下划线写法(cnn_classification.py)为其对应的文件名,打开该文件可以修改其中网络结构。
{
...
"model": {
"type": "CnnClassification", ## wenxin采用模型(models)的方式定义神经网络的基本操作,本例采用预置的模型CnnClassification实现文本分类,具体网络可参考models目录。
"optimization": { ## 预置模型的优化器所需的参数配置,如学习率等。
"learning_rate": 2e-05
}
},
...
}Q:不同ernie模型推荐的batch size是多少?
A:使用ernie模型时会消耗大量资源,因此我们建议使用ernie模型训练时,大部分情况下batch_size不要超过8,更多详情请参考开发智能中预训练模型介绍的ERNIE推荐batch_size大小的部分文档。
Q:如何提升训练迭代速度
A:训练迭代速度与数据规模有关。在训练大规模数据时,可以调整如下参数来提升训练速度。
- batch_size(一次训练所选取的样本数):该参数越大,训练速度越快。但是该参数受内存大小限制,与单个数据样本的长度和Embedding的维度相关,较长的数据样本或使用较大维度的Embedding时,大batch_size容易导致超内存的情况出现。使用ERNIE预训练模型时,推荐batch_size不超过8。
- epoch(将所有训练样本训练一次的过程):当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一次epoch。epoch越大,整体的训练速度越慢,当然模型的效果可能会因为epoch的增加而提高(也存在因为epoch过多导致模型过拟合的情况)。
- is_eval_test和is_eval_dev(是否使用测试集和验证集来评估模型):训练过程中进行模型评估时,测试集和验证集的大小会极大的影响模型训练的整体速度,建议训练集、测试集和验证集的比例为6:2:2。在数据集较大时,应适当缩减测试集和验证集。
- eval_step(模型评估的间隔步数):数据量较大时,应将模型评估的相隔步数放大,否则会影响训练速度。
- save_model_step(保存模型的间隔步数):此参数仅对模型进行保存的设置,对训练速度影响不大。
Q:常见参数设置(batch size,epoch,lr)
A:batch_size:指的是一次训练所选取的样本数,该参数受内存大小限制,与单个数据样本的长度和Embedding的维度相关,较长的数据样本或使用较大维度的Embedding时,大batch_size容易导致超内存的情况出现。使用ERNIE预训练模型时,推荐batch_size不超过8。
- epoch:当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一次epoch。epoch越大,整体的训练速度越慢,当然模型的效果可能会因为epoch的增加而提高(也存在因为epoch过多导致模型过拟合的情况)。
- lr(learning_rate 学习率):该参数决定着目标函数能否收敛到局部最小值以及何时收敛到最小值。合适的学习率能够使目标函数在合适的时间内收敛到局部最小值。
Q:如何调参
A:通过观察在训练过程中的监测指标如损失loss和准确率来判断当前模型处于什么样的训练状态,及时调整超参数以更科学地训练模型能够提高资源利用率。调参的整体思路为等比缩放,具体可以参考进阶使用中优化模型的一般思路。
Q:在平台上由于数据读取失败,导致的训练失败,该如何定位问题?
A:首先查看一下数据是否是以“\t”分隔,并且数据是以utf-8的编码保存。
其次,可先确认一下代码的forward部分,是否点击自动生成代码。如果没什么更改的话不需要点,如果点了自动生成代码,则forward函数中注释的部分需要自己做处理。
Q:模型热启动训练过程中,出现问题不成功?
A:热启动时,因为读取并训练了一些数据后再挂的,所以模型对于部分数据是可行的。这种情况大概率是脏数据问题。
数据处理相关问题
Q:我发现训练数据、测试数据和验证数据三者格式相同,他们的区别是什么?
A:文心大部分任务的训练集、测试集和验证集三者格式一致。 主要的不同是数据读取路径不同, 训练与评估的范式不一样时
Q:序列标注任务的label_map如何配置?
A:文心套件采用域的概念来处理标签,序列标注任务的标签配置label_map改为词表的形式,以IOB方式标注为例,其label_map.txt词表文件如下所示,更多详情请参考开发指南中序列标注-标签词表部分
B-PER 0
I-PER 1
B-ORG 2
I-ORG 3
B-LOC 4
I-LOC 5
O 6Q:不基于域的数据处理怎么实现?
A:在复杂任务中(如阅读理解任务,可参考../../wenxin/data/data_set_reader/basic_dataset_reader_without_fields.py),分域的方式很可能无法满足数据读取的需求,我们提供了在文心套件范围内的自定义方式,具体实现方式请参考文档核心接口-完全自定义数据集读取器部分。
Q:如何自定义reader?
A:构造自定义数据集读取器时,可以根据需要采用使用预置的field_reader和完全自定义两种方式实现,更多具体详情请参考文档核心接口-完全自定义数据集读取器部分。
Q:reader读取的数据中存在null字节,该怎么办?
A:建议清除数据集中的脏数据,可以使用工具进行排查
Q:如何选用正确的预置field_reader?
A:可参考:Data模块使用说明中【设计思路-预置内容-预置field_reader】的部分
Q:如何增加数值特征、离散非文本特征?
A:数值特征和离散非文本特征的添加方式为在json中对field进行配置,如下所示。
{
"dataset_reader": {
"train_reader": { ## 训练、验证、测试各自基于不同的数据集,数据格式也可能不一样,可以在json中配置不同的reader,此处为训练集的reader。
"name": "train_reader",
"type": "BasicDataSetReader", ## 采用BasicDataSetReader,其封装了常见的读取tsv文件、组batch等操作。
"fields": [ ## 域(field)是文心的高阶封装,对于同一个样本存在不同域的时候,不同域有单独的数据类型(文本、数值、整型、浮点型)、单独的词表(vocabulary)等,可以根据不同域进行语义表示,如文本转id等操作,field_reader是实现这些操作的类。
## 如果每一个样本有多个特征域(文本类型、数值类型均可),可以仿照前面对每个域进行设置,依次增加每个域的配置即可。此时样本的域之间是以\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
}
],
……
}若需要添加明文id,则需要用CustomTextFieldReader,datatype保持string,并将need_convert参数(表示是不是需要进行词表转id)设置为False。
Q:序列标注报错:Emission和Input的Dimension不一致
A:序列标注中如果配置的FullTokenizer,会对英文做subword操作的,导致labels的shape跟原始文本的shape对不上。
模型组网相关问题
Q:我应该在哪里查看paddle的一些op及其说明?
A:paddlepaddle的相关api说明请参考API Reference。
Q:文心各任务预置网络有哪些?
A:文心各任务预置网络及其使用方式的详细说明详见:NLP任务详细说明。
Q:如何实现一个新的网络?
A:我们提供了建模核心接口类:model(./textone/models/model.py),您可以通过继承该基类来实现接口对齐,具体实现方式请参考核心接口-建模核心接口。
Q:json中新加field后,组网forward提示找不到对应filed
A:dev_reader的配置和test_reader的配置需保持一致,wenxin的controler中,test和dev的网络公用同一个,仅reader不一样,所以当两个reader配置不一样时会报错。
训练预测配置相关问题
Q:如何进行技术选型?
A:常见的NLP任务包括信息抽取、文本生成、问答系统和舆情分析等,具体该如何针对业务问题进行技术选型,请参考文档如何进行技术选型。
Q:如何通过热启动进行多阶段训练
A:在训练模型时难免会出现中断的情况,我们自然希望能够将训练得到的参数通过保存检查点(checkpoint)的方式保存下来,免得在中断之后重新训练。模型的热启动指的是通过加载检查点来恢复模型的训练,此时还可以修改网络的参数,比如学习率等来达到多阶段训练的目的。如何在文心中通过热启动来进行多阶段训练的详细说明请参考进阶使用文档中的通过热启动进行多阶段训练。
Q:如何修改优化器
A:文心模型优化器(optimizer)模块可以通过在所使用模型(models)的 optimizer() 方法里自定义的方式实现,更多详情请参考模型优化器(optimizer)说明。
评估指标部分
Q:为什么文心的PN指标的上限会是128.0这个值而不是正无穷?
A:pn的计算是right_cnt / wrong_cnt, 如果除数为0 的时候,结果应该是inf(正无穷), 但是由于inf无法像一般的float值那样可以可视化展示出来,所以默认就用128.0这个固定值来表示这个情况, 128.0这个值可以按自己的需要修改。
Q:如何修改改评估函数
A:文心模型评估模块支持多种方式的自定义实现,具体实现方法请参考文档模型指标评估说明。
Q:热启动和finetune的概念有什么不同? A:二者关系几乎一样,在具体的语境中,finetune可能更强调基于ERNIE等通用预训练模型进行热启动,并根据实际的训练情况进行调参。
Q:训练效果过低,应该首先检查什么? 答:建议优先检测一下编码问题,看是否utf8。
Q:克隆任务后,再次执行报错,是什么问题? 答:可以查验一下是否存在鉴权失败的问题
