ymcui/Chinese-BERT-wwm

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

Finley1991 opened this issue · 14 comments

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

ymcui commented
  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 commented

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

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

ymcui commented

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

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

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

ymcui commented

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

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

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

ymcui commented

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

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

请问使用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)报错是什么原因导致的呢

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

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