Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BERT、ERNIE、TextCNN做文本分类任务性能对比 #222

Closed
Biaocsu opened this issue Jul 24, 2019 · 17 comments
Closed

BERT、ERNIE、TextCNN做文本分类任务性能对比 #222

Biaocsu opened this issue Jul 24, 2019 · 17 comments
Labels
wontfix This will not be worked on

Comments

@Biaocsu
Copy link

Biaocsu commented Jul 24, 2019

以下模型的推理速度、内存占用等均在‘CPU’上考察
【TextCNN、pytorch_bert、tensorflow_bert、ERNIE文本分类任务性能对比】
【以下性能考察结果均经过多次测试】

推理时的数据最长文本有75万中文字符,利用100个文本进行测试。
从内存占用及推理速度指标来看,四种算法中,TextCNN均是最优的。
由于bert及ERNIE并未经过多次fine-tune就已经达到较好泛化效果,因此可以认为其泛化能力会相对textcnn更好些。
pytorch_bert、tensorflow_bert、ERNIE三者相比较,在内存占用方面相差不是很大;但ERNIE在推理速度方面稍差(这个蛮重要),不过ERNIE版本更新很快、另可直接联系其工作团队解答疑问
长文本预测时,尝试了将文本截断(例如:文本长度100000, 则分n=100000//510次)预测,因为长文本前510长度有可能没有重要信息。(例如:【‘娱乐’, ‘赌博’】二分类,截断n次,只要有一次预测为‘赌博’那文本就是赌博类别)

【TextCNN】
推理时模型占用内存大约:546M(稳定)
推理时预测一个文件(完整长文本)平均所需时间:0.095s
多次训练,保存泛化效果最好模型,其在测试集上准确率:95.312%

【Pytorch_bert】
推理时模型占用内存:942M(峰值)
推理时预测一个文本(前128+后382字符)平均所需时间:1.149S
推理时预测一个文本(前510 * 1长度+尾部数据;相当于预测截断成n个510文本)平均所需时间:2.658s
推理时预测一个文本(前510 * 2长度+尾部数据)平均所需时间:3.529s
推理时预测一个文本(前510 * 5长度+尾部数据)平均所需时间:5.233s
推理时预测一个文本(完整长文本)平均所需时间:38.77s
fine-tune模型,其在测试集上准确率:98.82%

【tensorflow_bert】
推理时模型占用内存:988M(峰值)
推理时预测一个文本(前128+后382字符)平均所需时间:1.332S
推理时预测一个文本(前510 * 1长度+尾部数据)平均所需时间:1.485s
推理时预测一个文本(前510 * 2长度+尾部数据)平均所需时间:3.570s
推理时预测一个文本(前510 * 5长度+尾部数据)平均所需时间:7.033s
推理时预测一个文本(完整长文本)平均所需时间:56.18s
fine-tune模型(调节的参数与pytorch_bert一致),其在测试集上准确率:98.90%

【ERNIE】
推理时模型占用内存:1072M(峰值)
推理时预测一个文本(前128+后382字符)平均所需时间:2.227s
推理时预测一个文本(前510 * 1长度+尾部数据)平均所需时间:3.934s
推理时预测一个文本(前510 * 2长度+尾部数据)平均所需时间:6.001s
推理时预测一个文本(前510 * 5长度+尾部数据)平均所需时间:9.835s
推理时预测一个文本(完整长文本)平均所需时间:
fine-tune模型,其在测试集上准确率:98.74%

@jackyrpi2016
Copy link

你好,请问这个对比实验用的是公开数据集么?分类任务是做的二分类还是多分类任务呢?之前看一些文章说bert之类的transformer模型的input限制在512个字符,所以说这个512最大的结论是不正确的是么?

@Biaocsu
Copy link
Author

Biaocsu commented Jul 24, 2019

@jackyrpi2016 测试用的数据就是自己随便找的数据啊,只是想看下性能。最大长度是512哈,可能*漏掉了。我是将长文本截断分批进行预测的。做的二分类哈

@tianxin1860
Copy link
Collaborator

以下模型的推理速度、内存占用等均在‘CPU’上考察
【TextCNN、pytorch_bert、tensorflow_bert、ERNIE文本分类任务性能对比】
【以下性能考察结果均经过多次测试】

推理时的数据最长文本有75万中文字符,利用100个文本进行测试。
从内存占用及推理速度指标来看,四种算法中,TextCNN均是最优的。
由于bert及ERNIE并未经过多次fine-tune就已经达到较好泛化效果,因此可以认为其泛化能力会相对textcnn更好些。
pytorch_bert、tensorflow_bert、ERNIE三者相比较,在内存占用方面相差不是很大;但ERNIE在推理速度方面稍差(这个蛮重要),不过ERNIE版本更新很快、另可直接联系其工作团队解答疑问
长文本预测时,尝试了将文本截断(例如:文本长度100000, 则分n=100000//510次)预测,因为长文本前510长度有可能没有重要信息。(例如:【‘娱乐’, ‘赌博’】二分类,截断n次,只要有一次预测为‘赌博’那文本就是赌博类别)

【TextCNN】
推理时模型占用内存大约:546M(稳定)
推理时预测一个文件(完整长文本)平均所需时间:0.095s
多次训练,保存泛化效果最好模型,其在测试集上准确率:95.312%

【Pytorch_bert】
推理时模型占用内存:942M(峰值)
推理时预测一个文本(前128+后382字符)平均所需时间:1.149S
推理时预测一个文本(前510 * 1长度+尾部数据;相当于预测截断成n个510文本)平均所需时间:2.658s
推理时预测一个文本(前510 * 2长度+尾部数据)平均所需时间:3.529s
推理时预测一个文本(前510 * 5长度+尾部数据)平均所需时间:5.233s
推理时预测一个文本(完整长文本)平均所需时间:38.77s
fine-tune模型,其在测试集上准确率:98.82%

【tensorflow_bert】
推理时模型占用内存:988M(峰值)
推理时预测一个文本(前128+后382字符)平均所需时间:1.332S
推理时预测一个文本(前510 * 1长度+尾部数据)平均所需时间:1.485s
推理时预测一个文本(前510 * 2长度+尾部数据)平均所需时间:3.570s
推理时预测一个文本(前510 * 5长度+尾部数据)平均所需时间:7.033s
推理时预测一个文本(完整长文本)平均所需时间:56.18s
fine-tune模型(调节的参数与pytorch_bert一致),其在测试集上准确率:98.90%

【ERNIE】
推理时模型占用内存:1072M(峰值)
推理时预测一个文本(前128+后382字符)平均所需时间:2.227s
推理时预测一个文本(前510 * 1长度+尾部数据)平均所需时间:3.934s
推理时预测一个文本(前510 * 2长度+尾部数据)平均所需时间:6.001s
推理时预测一个文本(前510 * 5长度+尾部数据)平均所需时间:9.835s
推理时预测一个文本(完整长文本)平均所需时间:
fine-tune模型,其在测试集上准确率:98.74%

我们最近会升级一版推理程序,专门针对推理速度做优化,请关注。

@jackyrpi2016
Copy link

@jackyrpi2016 测试用的数据就是自己随便找的数据啊,只是想看下性能。最大长度是512哈,可能*漏掉了。我是将长文本截断分批进行预测的。做的二分类哈

好的,谢谢。话说老哥是校友?中南? 你跑多分类用的是哪个脚本?

@haosiqing
Copy link

你好,我在运行sh script/zh_task/ernie_base/run_ChnSentiCorp.sh时报错TypeError: new() missing 1 required positional argument: 'text_a',
完整报错如下:
Traceback (most recent call last):
File "run_classifier.py", line 403, in
main(args)
File "run_classifier.py", line 87, in main
phase="train")
File "/mnt/hgfs/share/ERNIE-develop/reader/task_reader.py", line 226, in data_generator
examples = self._read_tsv(input_file)
File "/mnt/hgfs/share/ERNIE-develop/reader/task_reader.py", line 268, in _read_tsv
example = Example(*line)
TypeError: new() missing 1 required positional argument: 'text_a'
好几天了也不会改,请问这是什么原因呢?如何得到解决?

@Biaocsu
Copy link
Author

Biaocsu commented Aug 16, 2019

数据格式不对,请参考官方给定样例

@haosiqing
Copy link

不胜感激!使用官方数据报错如下,
Q5 0JG~WKJCHMHO)_~OU61N
2
3
4
是内存不够的问题吗,有什么方法可以运行吗

@haosiqing
Copy link

我把batch_size换成 2可以运行,这样对结果的影响会很大吗

@Biaocsu
Copy link
Author

Biaocsu commented Aug 16, 2019

如果是显存不够,只能将batch_size调小了,但影响应该没有特别大,尽可能调大点吧,不然数据一多就很慢了

@sevenold
Copy link

如果是显存不够,只能将batch_size调小了,但影响应该没有特别大,尽可能调大点吧,不然数据一多就很慢了

如果我的文本长度是5000,训练BERT的时候,需要截断成512去训练吗?(就是5000/512)一条数据,当几条使用,还是直接传给模型,长度指定512.

@Biaocsu
Copy link
Author

Biaocsu commented Oct 31, 2019

@sevenold 训练的时候我觉得还是截断吧,不然数据很多信息丢失,我用文本前面n条512长度数据+文本末尾512长度数据训练,效果要更好些

@jiangix01
Copy link

jiangix01 commented Nov 13, 2019

您好,请问在训练的时候,如果文本长度是5000,那就是n=5000/512,然后每条文本的向量表示是n个bert向量表示加和求平均吗

@Biaocsu
Copy link
Author

Biaocsu commented Nov 13, 2019

@jiangix01 我不是这样弄的哈,我就是将这n个文本(512长度)都拿来训练(一般不会全取,整个文本的前后部分信息更重要),觉得学习到的特征多点。预测(涉黄、正常二分类)的时候也是这样,如果只要其中一条预测为涉黄,那么整个文本就判断为涉黄(整个文本假设10*512长度,我拿前3个512文本和后2个512文本去预测),这样基本不会出现误判

@jiangix01
Copy link

jiangix01 commented Nov 13, 2019

@jiangix01 我不是这样弄的哈,我就是将这n个文本(512长度)都拿来训练(一般不会全取,整个文本的前后部分信息更重要),觉得学习到的特征多点。预测(涉黄、正常二分类)的时候也是这样,如果只要其中一条预测为涉黄,那么整个文本就判断为涉黄(整个文本假设10*512长度,我拿前3个512文本和后2个512文本去预测),这样基本不会出现误判

那在训练的时候,我想知道每条样本的向量是咋得来的?如果是n个文本都拿来训练,并不是每n个文本都会有label吧。还是说,如果一条样本的label是0,那么这样样本的n段文本的label都是0?

举个例子,比如一条样本是下列这样子:
content: 这是长征六号运载火箭首次进行低倾角发射,同时也是长征六号运载火箭的第3次飞行。
label: 正面(就是label=0)

然后,比如截断的长度是10

那么每一段就是['这是长征六号运载火箭', '首次进行低倾角发射,', '同时也是长征六号运载', '火箭的第3次飞行。']
那您在训练的时候,是把上面list中的每一段都当做一个样本,然后标签都是0?

@Biaocsu
Copy link
Author

Biaocsu commented Nov 13, 2019 via email

@stale
Copy link

stale bot commented May 21, 2020

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Feel free to reopen it. Thank you for your contributions.

@stale stale bot added the wontfix This will not be worked on label May 21, 2020
@stale stale bot closed this as completed May 28, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
wontfix This will not be worked on
Projects
None yet
Development

No branches or pull requests

6 participants