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

关于工程效率的疑问

ZhengZixiang opened this issue · comments

和序列标注做法一次送入句子出结果相比,MRC的方式需要对每一类实体都做一遍句子+某类实体问句的轮询,尽管MRC的方式能够带来在指标上的显著提升,但是这样一类一类的轮询效率上感觉就比较差。落地工程的话,不知道你们是否有这样的应用场景,验证过MRC这样轮询对响应性能这些指标的影响?

感谢提问。 好问题。
其实我们在工程里面 不需要一个一个问的,有简化的办法。

文章里面的模型是
[cls]q1[seq] text
[cls]q2[seq] text
[cls]q3[seq] text
三个类别的话就需要问三遍。很麻烦

工程上我们做如下简化, 所有问题一起问
[cls1]q1[cls2]q2[cls3]q3[seq] text
然后最后一层,
用 cls1 与每个token 做运算,作为q1 的span
用 cls2 与每个token 做运算,作为q2 的span
用 cls3 与每个token 做运算,作为q3 的span

这样其实问一遍就可以了

请问您有用[cls1]q1[cls2]q2[cls3]q3[seq] text这样的方式来做吗,效果和一个一个提问相比怎么样呢

这样貌似就等于不用输入query了?
输入所有query不是等于不用输入query了?

@littlesulley 多谢多谢多谢

[cls1][cls2][cls3][sep]text

感谢提问。 好问题。
其实我们在工程里面 不需要一个一个问的,有简化的办法。

文章里面的模型是
[cls]q1[seq] text
[cls]q2[seq] text
[cls]q3[seq] text
三个类别的话就需要问三遍。很麻烦

工程上我们做如下简化, 所有问题一起问
[cls1]q1[cls2]q2[cls3]q3[seq] text
然后最后一层,
用 cls1 与每个token 做运算,作为q1 的span
用 cls2 与每个token 做运算,作为q2 的span
用 cls3 与每个token 做运算,作为q3 的span

这样其实问一遍就可以了

您好,这里能具体讲一下吗,有几个问题

  1. [cls1]、[cls2]和[cls3]是使用不同的token吗
  2. 3个query合在一起输入时需要得到三组不同的token表示,这里能具体说下吗
  3. 这种模式对于指标有损吗
  4. 这种模式下模型训练也要同时适配吧

@littlesulley , 您好,能帮忙回答 @currylym 的问题吗,这些应该是大家比较关心的问题,谢谢

算了,没人回答,我自己已经实验了,并行mrc没问题

算了,没人回答,我自己已经实验了,并行mrc没问题

@realize-qzq 老哥,实验结果怎么样

感谢提问。 好问题。
其实我们在工程里面 不需要一个一个问的,有简化的办法。

文章里面的模型是
[cls]q1[seq] text
[cls]q2[seq] text
[cls]q3[seq] text
三个类别的话就需要问三遍。很麻烦

工程上我们做如下简化, 所有问题一起问
[cls1]q1[cls2]q2[cls3]q3[seq] text
然后最后一层,
用 cls1 与每个token 做运算,作为q1 的span
用 cls2 与每个token 做运算,作为q2 的span
用 cls3 与每个token 做运算,作为q3 的span

这样其实问一遍就可以了

老哥这个计算复杂度还是挺高的呀,拼接所有query,max_seq_len也要增加;此时显存占用增加,batch_size也不能取的太大,实际用起来有提速吗?

感谢提问。 好问题。
其实我们在工程里面 不需要一个一个问的,有简化的办法。
文章里面的模型是
[cls]q1[seq] text
[cls]q2[seq] text
[cls]q3[seq] text
三个类别的话就需要问三遍。很麻烦
工程上我们做如下简化, 所有问题一起问
[cls1]q1[cls2]q2[cls3]q3[seq] text
然后最后一层,
用 cls1 与每个token 做运算,作为q1 的span
用 cls2 与每个token 做运算,作为q2 的span
用 cls3 与每个token 做运算,作为q3 的span
这样其实问一遍就可以了

老哥这个计算复杂度还是挺高的呀,拼接所有query,max_seq_len也要增加;此时显存占用增加,batch_size也不能取的太大,实际用起来有提速吗?

@realize-qzq ,老哥实验起来怎么样,速度有提升吗?

感谢提问。 好问题。
其实我们在工程里面 不需要一个一个问的,有简化的办法。
文章里面的模型是
[cls]q1[seq] text
[cls]q2[seq] text
[cls]q3[seq] text
三个类别的话就需要问三遍。很麻烦
工程上我们做如下简化, 所有问题一起问
[cls1]q1[cls2]q2[cls3]q3[seq] text
然后最后一层,
用 cls1 与每个token 做运算,作为q1 的span
用 cls2 与每个token 做运算,作为q2 的span
用 cls3 与每个token 做运算,作为q3 的span
这样其实问一遍就可以了

老哥这个计算复杂度还是挺高的呀,拼接所有query,max_seq_len也要增加;此时显存占用增加,batch_size也不能取的太大,实际用起来有提速吗?

@realize-qzq ,老哥实验起来怎么样,速度有提升吗?

对我的场景,速度还是有不错提升的

感谢提问。 好问题。
其实我们在工程里面 不需要一个一个问的,有简化的办法。
文章里面的模型是
[cls]q1[seq] text
[cls]q2[seq] text
[cls]q3[seq] text
三个类别的话就需要问三遍。很麻烦
工程上我们做如下简化, 所有问题一起问
[cls1]q1[cls2]q2[cls3]q3[seq] text
然后最后一层,
用 cls1 与每个token 做运算,作为q1 的span
用 cls2 与每个token 做运算,作为q2 的span
用 cls3 与每个token 做运算,作为q3 的span
这样其实问一遍就可以了

老哥这个计算复杂度还是挺高的呀,拼接所有query,max_seq_len也要增加;此时显存占用增加,batch_size也不能取的太大,实际用起来有提速吗?

@realize-qzq ,老哥实验起来怎么样,速度有提升吗?

对我的场景,速度还是有不错提升的

老哥,话说指标能打平么,我实验起来指标一直差了大概0.5pp