ShannonAI / mrc-for-flat-nested-ner

Code for ACL 2020 paper `A Unified MRC Framework for Named Entity Recognition`

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

关于模型中BERT的input和output问题

JaeZheng opened this issue · comments

您好,关于模型中对于BERT的input和output的处理,有两个问题想请教:
(1) 关于output部分,在/model/bert_mrc.py中,在https://github.com/ShannonAI/mrc-for-flat-nested-ner/blob/master/model/bert_mrc.py#L50这一行代码中,sequence_output即BERT编码层的完整序列输出,即包括了query部分的token,后续的计算中似乎也没有舍弃掉query部分的token,这与您在论文中表述“we simply drop the query representations”似乎有所不符,请问可以解释一下吗?
(2) 关于input部分,在/data_loader/mrc_utils.py中,在https://github.com/ShannonAI/mrc-for-flat-nested-ner/blob/master/data_loader/mrc_utils.py#L200这一行代码中,input_mask = [1] * len(input_tokens),即对整个完整序列的mask都置为1,也就是包括query、context和分隔符,这里全部都是没有mask掉的,可以这样理解吗?那这样处理对于BERT在这个任务上的表现会有影响吗?

期待您的回复!

关于您的第二个问题:

  • 我们的模型参考了 BERT模型用来做问答任务的代码 (https://github.com/google-research/bert/blob/eedf5716ce1268e56f0a50264a88cafad334ac61/run_squad.py#L395)。
  • input_mask和input_tokens (input_tokens = [cls]+ <query_tokens> +[sep]+ <context_tokens> + [sep]) 是长度相等,并且一一对应的。非[PAD] token对应的input_mask应该是1,[PAD]对应的input_mask应该为0。
    input_mask输入到BERT模型中对应的变量是attention_mask,attention_mask 为1代表了self-attention希望看到的位置。
  • 对MRC这个任务,query和context之间也是存在attention的,因此query tokens和context tokens对应的input_mask都是1。
    query和context的区分通过BERT模型中的token_type_ids来实现:token_type_ids==0,说明当前位置的token 是query的一部分;token_type_ids==1,说明当前位置的token是context的一部分。

感谢!

关于您的第一个问题:

  • 因为每一个数据样本的query、context都不相同,为了方便在GPU上进行计算,我们在train/evaluate阶段都是将数据打包成mini-batch送入模型中的。因此通过 截断原始输入 和 补充占位token([PAD])的方式,将数据的input_sequence打包成定长。
  • 在进入到BERT模型里面,query和context都参与了attention的计算。实验代码只计算context部分的loss 用来训练模型。