fastnlp / fastNLP

fastNLP: A Modularized and Extensible NLP Framework. Currently still in incubation.
https://gitee.com/fastnlp/fastNLP
Apache License 2.0
3.05k stars 451 forks source link

_BertWordModel疑问 #359

Open mx8435 opened 3 years ago

mx8435 commented 3 years ago

hi,请问_BertWordModel这个类为什么需要利用训练、测试数据的vocab,来重写调整BERT模型的embedding?这种相对于直接用原始的bert有什么优势吗?我发现只是训练字表减小了,这会有什么收益吗?

xuyige commented 3 years ago

_BertWordModel是一个内部调用的类,一般情况下不对外暴露 另外这是为了维护一个从训练测试数据的vocab到bert自身vocab的一个映射,vocab减小只是其中一个收益,另外的优点是这样在调用的时候可以更方便地预处理。如果只是单纯用原生的BertModel的话跟transformers并没有什么区别

mx8435 commented 3 years ago

vocab减小只是其中一个收益,另外的优点是这样在调用的时候可以更方便地预处理。如果只是单纯用原生的BertModel的话跟transformers并没有什么区别

vocab减小对训练效果应该没有加成吧。 我看了下代码,这个类优势是可以对训练数据中的unk字符进行训练。

yhcc commented 3 years ago

嗯,对结果一般没啥影响。最早做词表缩减是由于当时觉得BERT模型太大了,如果能把词表缩减一下可能会训练稍微快一点(虽然后来实际看下来也没有太大的增益),现在的fastNLP(github上的代码)已经不再删掉词表了,一方面是后来发现对计算效率基本没有影响,另外一方面是这样也可以将训练之后的BERTEmbedding中的BERT权重transfer到其它场景(如果是词表被truncate掉的话,在新的domain或者dataset会出现太多的unk了)。

mx8435 commented 3 years ago

我对比过_BertWordModel和原始bert,发现效果会更好(f1 +0.3%)。看了下代码,主要是因为有对不在bert词表中但在训练数据vocab中的token进行训练,这类词如中文引号。不知道这个是不是_BertWordModel的优势? @yhcc @xuyige

yhcc commented 3 years ago

这种性能的提升可能会和数据集有比较大的关系,如果数据集中包含比较多的BERT unk词汇,那么把新的词汇加入到词表可能会有性能上的提升(并且还需要训练数据比较充足)。另外GPT和RoBERTa中通过使用byte-level的tokenization来避免了一切unk词汇。