苏剑林(Jianlin Su)
苏剑林(Jianlin Su)
> 您的wwm确实可以用自己的语料预训练,而且是词级的,很不错。才想着看看bert4keras是否也支持。 wwm没有硬性规定是word-based还是char-based,不管是word还是char都可以加wwm。
> 373行 https://github.com/bojone/bert4keras/blob/master/pretraining/data_utils.py#373 如果你执意不去理解整个代码、不去理解wwm的具体含义,非要停留在自己对wwm的幻想中,那么我认为我们没有必要讨论下去了。
> 懂的都懂。。。也是醉了。 至少从目前看来你肯定是不懂wwm的
因为没根据自己的语料格式写正确的generator
用tf 1.x + keras试试
> token_ids, segment_ids = tokenizer.encode(d['text'], maxlen=maxlen) 这句代码中返回值中的segment_ids,我分析了一下源码,大概是这个意思,句子A和句子B分隔符,句子A对应的全为0,句子B对应的全为1。但是不知道有什么用,可能我问的问题比较肤浅(´・_・`),之前用huggingface里面的bert,返回值貌似是没有这项的。 bert的返回值是没有的,bert的输入值有啊,这就是bert自带的设计,初衷是想要区分两个拼接的句子。
attention_mask、Input-Segment和Input-Token改名,可以通过继承Transformer类/BERT类等来实现。 另外,bert4keras只负责构建bert(transformer),其余大部分需求是个人通过学习keras后实现的。
1、为什么要加? 2、+1只是编程技巧,后面会重新减去1 3、为什么Input-Token是token_ids?token_ids是原始没有被[mask]过的序列,你输入token_ids,想预测什么? 请融会贯通上下文来理解,不要只看局部。
1、你的意思是同时保留“的”和“##的”,然后下游任务也保留词信息?那不是依赖分词工具了?没什么意思吧? 2、技巧是对于编程者来说的,既然你认识不到这个技巧,你可以不接受这个写法,而自行构思符合自己认知的写法。(这不是抬杠,这是事实,因为对于每个人来说“显然成立”的东西都不一样。) ==== 简单来说,这个技巧就是我先加1,然后就可以用0作为padding,而不是跟词表有冲突(词表也有id为0的token),后面我识别出哪些为padding后,再减去1即可。
我也不熟悉这一块。但看这个错误信息,似乎跟GlobalPointer没关系?