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

Chinese-BERT-wwm对于Masked LM 任务(完形填空,ERNIE中提到的那种),表现怎么样?有测试过么? #13

Closed
Finley1991 opened this issue Jun 27, 2019 · 14 comments

Comments

@Finley1991
Copy link

Chinese-BERT-wwm对于Masked LM 任务(完形填空,ERNIE中提到的那种),表现怎么样?有测试过么?
另外WWM采取了新的Mask策略,如果我想在此基础上增加一些专业领域词汇做pre-training,该怎么做?BERT原声模型中有相应的代码,但是因为两个模型mask策略不同,应该不能直接用原生BERT模型,能不能开源一下修改后的模型呢?

@ymcui
Copy link
Owner

ymcui commented Jun 27, 2019

  1. 没测过
  2. 暂时无法提供代码。如果要继续pre-training,可以参考谷歌官方的wwm处理部分(https://github.com/google-research/bert/blob/master/create_pretraining_data.py),只需要改动很少的代码。

基本顺序:

  1. 对原始的句子进行中文切词(我们使用的是LTP,你也可以用别的做),得到seq_cws
  2. 对原始句子进行WordPiece切词(BERT默认),得到seq_wp
  3. 对seq_cws和seq_wp分析,得到字(wp)到词(cws)对应关系,即哪些连续的wordpiece属于一个中文词,这里中英文处理对应关系:
  • 英文的一个词对应中文的一个词
  • 英文的一个WordPiece对应中文的一个字

比如,单词中华人民共和国,切词后的结果是中华 人民 共和国,为了适配谷歌原版的wwm,你可以将其改为中华 ##人民 ##共和国,这样就能用谷歌原版的wwm处理了,当然这个只是为了识别字与词的从属关系,最终训练时需要把中文子词的 ##前缀去掉(英文请保留,因为wordpiece处理过的英文是有可能包含##的)。

@ymcui
Copy link
Owner

ymcui commented Jun 27, 2019

另外,可能存在小比例seq_cws和seq_wp对不上的情况。
对于这种样本,可以直接退化成非wwm处理。

@brightmart
Copy link

"最终训练时需要把中文子词的 ##前缀去掉",指的是什么?

@ymcui
Copy link
Owner

ymcui commented Jul 24, 2019

@brightmart ##是WordPiece特有的词缀符号。在中文分词中加入##是为了识别同属同一个词的各个子词,实际训练的时候要把##符号删掉。

@Gaozhen0816
Copy link

@brightmart ##是WordPiece特有的词缀符号。在中文分词中加入##是为了识别同属同一个词的各个子词,实际训练的时候要把##符号删掉。

为什么中文要在训练时删掉,英文不能删掉?

@ymcui
Copy link
Owner

ymcui commented Aug 20, 2019

@Gaozhen0816 因为词表里的中文没有##,前面也说了##是我们后加的符号,仅为了便于识别分词中的子词。

@guanyuhang8866
Copy link

@Gaozhen0816 因为词表里的中文没有##,前面也说了##是我们后加的符号,仅为了便于识别分词中的子词。

我看到此表里面中文也有##,而且我debug测试 self.wordpiece_tokenizer.tokenize("哈尔滨") 得到的结果是['哈', '##尔', '##滨'],这是不是说我只用加入分词,影响原有的对中文的字符分词方式,就可以做到wwm,后面去掉##只是为了把“尔”和“##尔”的特征集中到一起。以便后期调用模型是统一指定“尔”的token_id?

@guanyuhang8866
Copy link

@ymcui

@ymcui
Copy link
Owner

ymcui commented Nov 1, 2019

@guanyuhang8866 正常调用bert的tokenizer对中文切分是只会按字进行切分的,不会出现‘##’标识。
image

@guanyuhang8866
Copy link

guanyuhang8866 commented Nov 4, 2019 via email

@helloworld729
Copy link

请问作者在上面的回复中为什么说词表中的汉字是没有加##的?因为我发现确实是加了的,另外请问为什么同一个汉字要用这两种处理方式呢?谢谢回复。

@lzl19971215
Copy link

请问使用TFBertMode.from_pretrained()l加载时出现 NotImplementedError: Weights may only be loaded based on topology into Models when loading TensorFlow-formatted weights (got by_name=True to load_weights)报错是什么原因导致的呢

@Dan-hbd
Copy link

Dan-hbd commented May 15, 2021

想请教一下为什么中文的预训练模型vocab中没有中文双引号,单引号等标点符号

@shibing624
Copy link

缺失了中文引号,还没有“琊”字

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

9 participants