ymcui/Chinese-BERT-wwm

我想问下全词mask的一个小细节

fudanchenjiahao opened this issue · 9 comments

在你们的工作中,比如mask词的时候,一个词为哈利波特,那么在你们的方法中,是不是只要这个词被mask,那一定是[mask][mask][mask][mask]的形式,还是偶尔会出现[mask]利[mask][mask]的形式,不知道你们是如何设置的(不考虑那个mask80%10%10%的那个随机概率),如果是前者,那么这种完全避免局部共现的设置会不会对结果有影响。

ymcui commented

可以参考谷歌BERT官方的create_pretraining_data.py
https://github.com/google-research/bert/blob/master/create_pretraining_data.py#L359
与之前不同的地方是原来的index取代为index_set,index_set中的每个元素是一个列表,该列表装入了当前词的所有WordPiece碎片。

下面可以举个例子,
假设原句为:there is an apple tree nearby.
假设切词后的list为
tok_list = ["there", "is", "an", "ap", "##p", "##le", "tr", "##ee", "nearby", "."]

运行十次无wwm的结果(单词后的感叹号表明“保留原词”的情况,[RANDOM]为“随机替换”的情况):

there [MASK] an ap [MASK] ##le tr [RANDOM] nearby .
[MASK] [MASK] an ap ##p [MASK] tr ##ee nearby .
there is [MASK] ap ##p ##le [MASK] ##ee [MASK] .
there is [MASK] ap [MASK] ##le tr ##ee nearby [MASK] .
there is an! ap ##p ##le tr [MASK] nearby [MASK] .
there is an [MASK] ##p [MASK] tr ##ee nearby [MASK] .
there [MASK] [MASK] ap ##p ##le tr ##ee nearby [MASK] .
there is an ap ##p ##le [RANDOM] [MASK] [MASK] .
there is an [MASK] ##p ##le tr ##ee [MASK] [MASK] .
there [MASK] an ap ##p ##le tr [MASK] nearby [MASK] .

运行十次有wwm的结果:

there is an [MASK] [MASK] [RANDOM] tr ##ee nearby .
there is! [MASK] ap ##p ##le tr ##ee nearby [MASK] .
there is [MASK] ap ##p ##le [MASK] [MASK] nearby .
there [MASK] [MASK] ap ##p ##le tr ##ee [RANDOM] .
there is an ap ##p ##le [MASK] [MASK] nearby [MASK] .
[MASK] is an ap ##p ##le [MASK] [MASK] nearby .
there is an ap ##p ##le [MASK] [MASK] nearby [MASK] .
[MASK] is an ap ##p ##le [MASK] ##ee! nearby .
there is an ap! [MASK] [MASK] tr ##ee nearby .
there is [MASK] ap ##p ##le [RANDOM] [MASK] nearby .

可见全词mask指的是同属一个词的所有子词均会被处理(mask,保留,替换),是广义的mask,而并非只局限于替换成[mask]标签的情况。

谷歌BERT官方并未对此进行详细描述,需要看代码才能知道。
我们会把上述内容更新至README,感谢!

ymcui commented

如有问题,欢迎随时re-open

有个疑问请教下,
image
在运行10次有 WWM的示例中, there is an [MASK] [MASK] [RANDOM] tr ##ee nearby . 中的 "ap", "##p", "##le" 这3个token作为一个完整word,不是要被mask掉吗?为何还有一个 [RANDOM], 直观理解应该是there is an [MASK] [MASK] [MASK] tr ##ee nearby .。 RANDOM操作的单位不是整词,而是 token ? 同理,保留操作的单位也是token,不是整词? 另外,为啥会出现there is an ap ##p ##le [MASK] [MASK] nearby [MASK] .,即在 nearby后面的[MASK]是表示原始句子的句号被遮掉?因为直观上看,在这里的[MASK]之后还有一个句号

@MrRace @ymcui 同问…和说明对不上…

@MrRace 请问你搞明白了没?可否指点一下?

个人理解:如果一个整词被选中,则这个整词的所有字词(token)都有可能被mask、替换、保留。不过这三总操作也是有概率发生的,导致有的会被保留。

@ailinbest 那跟原来的本质区别是?

@liebkne @MrRace 我的理解
无wwm:从一个句子所有字组成的集合中,按【字】的粒度随机选部分作为子集,在子集中对每个字进行“mask/保留/替换”操作(这里“保留”也视为一种操作,只不过恰好和不操作等效),其余字无操作。
有wwm:从一个句子所有字组成的集合中,按【词】的粒度随机选部分作为子集,选的时候按词选,到子集中之后还是以字为单位,再对子集中的每个字进行【独立的】“mask/保留/替换”操作。非子集中的字无操作。
两种方式的本质区别在于有wwm后,同一个词中的字,要么进入子集被操作,要么不进入子集,不操作。

@sandove 你说的我都同意,除了只后一句。我觉得这不是本质区别,只是操作方式上的区别。本质区别应该是这样的操作为什么会有好处,产生的数据分布会有什么特别之处之类…