ymcui / Chinese-BERT-wwm

Pre-Training with Whole Word Masking for Chinese BERT(中文BERT-wwm系列模型)
https://ieeexplore.ieee.org/document/9599397
Apache License 2.0
9.56k stars 1.38k forks source link

预训练分词是会用到中文vocab后面带“##”的token吗?如果是,整词掩码预训练出来的语言模型,用在下游任务中,下游任务可以不分词吗? #224

Closed dr-GitHub-account closed 1 year ago

dr-GitHub-account commented 1 year ago

在FAQhttps://github.com/ymcui/Chinese-BERT-wwm#faq中,有一组问答内容为:

Q: 这个模型怎么用? A: 谷歌发布的中文BERT怎么用,这个就怎么用。 文本不需要经过分词,wwm只影响预训练过程,不影响下游任务的输入。

关于分词这部分我有两个问题希望请教一下:

  1. 预训练过程中的分词,我理解的是会改变一个词非词首字对应的id,比如一句话里出现“今天”两个字,不做分词时,取的是vocab中“今”和“天”对应的id,即[791, 1921];做分词时,取的是vocab中“今”和“##天”对应的id,即[791, 14978]。 当然,这里主要关注的问题是分词对应id的改变,没考虑mask的情况,如果mask了,那id就变为mask后相应token的id。请问上述关于分词和id的理解是否正确?

  2. 如果问题1中我的理解正确,根据上述FAQ中所说,“文本不需要经过分词”,我的理解是下游任务的tokenizer不需要考虑带“##”的token,输入序列对应的id不会出现带“##”的token那种很大的值(比如问题1例子中“##天”对应的14978)。请问这样会不会不能发挥wwm预训练模型的优势?毕竟预训练过程的输入考虑了带“##”的token,编码器应该会学习到更多有关分词的信息。如果下游任务不分词,不考虑带“##”的token,是不是就不能很好地利用预训练模型(embed、encoder)有关分词的信息了?

希望请教一下上述两个问题,谢谢!

ymcui commented 1 year ago

和带不带##没有关系,wordpiece分词器加载vocab.txt之后分出来什么样就是什么样,和原始bert的用法一样,不需要什么额外的操作。

dr-GitHub-account commented 1 year ago

感谢解答!!!

确实不是问题的关键。

问题1里面我比较好奇的是,分词后“今天“被分为一个词,”天“是非词首的字,在vocab.txt中应该对应后面14979行那一个”##天“(##表示非词首的字),而不是前面1922行那一个”天“。那tokenize后,input id是不是会出现像14978这么大的id,而不是分词前的1921?之前看过一个中文MLM的项目源码,看了一下里面做完分词后的input id,非词首字确实对应大id。

如果问题1的的理解无误,那么就有了问题2,关心的问题是如果预训练阶段的模型学习过输入14978这么大的id,而下游任务不做额外的操作,”今天“还是对应[791, 1921],那是不是预训练好的bert.embed存放的大id(如14978)到向量的映射并没有被用上?如果是这样,那下游任务做一下分词,把bert.embed存放的大id到向量的映射用上的话,会不会能更好地利用这个预训练模型?当然,这只是一个猜想,下游任务分词能不能有提升,还需要实验验证。我会尝试一下。

stale[bot] commented 1 year ago

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

stale[bot] commented 1 year ago

Closing the issue, since no updates observed. Feel free to re-open if you need any further assistance.