luhua-rain / MRC_Competition_Dureader

机器阅读理解 冠军/亚军代码及中文预训练MRC模型
732 stars 150 forks source link

分词问题 #7

Open lldhliu opened 5 years ago

lldhliu commented 5 years ago

你好,分词部分为什么没有使用例如: text = '你好,明天' token = ['你', '#好', ',', '明', '#天'] 这种格式去转换成 input_ids 进行训练呢?

luhua-rain commented 5 years ago

’#好‘ 在词表中是不存在的,‘##好’ 存在 。分词主要看个人吧,'##好' 与 ‘好’ 没啥区别,前者没有试过,你可以试试,然后分享一下

lldhliu commented 5 years ago

我试了下, 结果下降很多!不如您使用的直接按字切开的效果好,这是什么原因呢?

luhua-rain commented 5 years ago

‘##好’ 你是如何得到的?可以试着将input_ids再转为字符,看看在转化过程中是否发生错误

lldhliu commented 5 years ago

把DuReader分词好的文档列表里的每个词用WordpieceTokenizer.tokenize切分就能得到了,只要转换成 '##好' 对应的 id, 再把 id 转换到 token 得到 ’##好‘ ,拼接输出时去除 ’##'

lldhliu commented 5 years ago

断点测试时,input_ids,start_position,end_position,都是准确的,再转为字符也是正确的

luhua-rain commented 5 years ago

‘好’ 与 ‘##好‘ 是不一样的。就相当于 ’##ac‘ 与 ’ac‘ 是不一样的。wordpiece是英文的一种减少词表大小的方法,而中文分字的话就2万左右,比较少,不需要wordpiece。我认为最主要的原因是:’好‘ 与 ’##好‘是不一样的,’好‘是一个字,’##好‘是一个词

lldhliu commented 5 years ago

我以为加上 ’##‘,在 mask 时候 ’你‘ 和 ’##好‘ 会被一起 mask 呢?下游任务训练的时候没有随机 mask 了吗?我有点糊涂。。。

luhua-rain commented 5 years ago

你说的mask是什么意思

lldhliu commented 5 years ago

就是bert里面讲的,在生成训练样本时,这些被分开的词缀会随机被mask

luhua-rain commented 5 years ago

是的,但是这是对英文的,所以我重写了数据处理。不需要mask,一个字对应一个id

lldhliu commented 5 years ago

是不是下游任务训练时都不需要mask呢?mask 是谷歌在训练 bert 模型时候使用的方法吧?

luhua-rain commented 5 years ago

不需要。你说的这个mask是bert的预训练任务之一:masked language model(MLM)。下游任务mask干嘛,除非你想微调语言模型。

lldhliu commented 5 years ago

好的, 明白了,谢谢您!可以加您微信吗?或者其他联系方式,方便向您请教?我的邮箱 ldh1151375085@163.com,方便的话您可以邮件告诉我下