Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

怎么预测被masked的词语? #135

Closed
AnShengqiang opened this issue May 15, 2019 · 6 comments

Comments

@AnShengqiang
Copy link

commented May 15, 2019

您好,请问如何使用模型预测被mask的词语呢?
我想要将一个句子的某个词语mask遮住,然后使用模型去预测这个词语,得到候选词和词语的概率,请问是否有相关的接口?🙏

@daizh

This comment has been minimized.

Copy link

commented May 15, 2019

train.py的代码里面有预测的功能(还需要自己写输出输出的代码):

if __name__ == '__main__':
    print_arguments(args)
    if args.do_test:
        test(args)  # 这个就能预测被mask的词语
    else:
        train(args)
@AnShengqiang

This comment has been minimized.

Copy link
Author

commented May 16, 2019

train.py的代码里面有预测的功能(还需要自己写输出输出的代码):

if __name__ == '__main__':
    print_arguments(args)
    if args.do_test:
        test(args)  # 这个就能预测被mask的词语
    else:
        train(args)

谢谢,我去试试

@yayaQAQ

This comment has been minimized.

Copy link

commented May 16, 2019

我在ernie.py的get_pretraining_output函数里面把fc_out给return出来了,获取到了这样的fc_out:

fc_out_length 7 18000
fc_out [[-20.912693   -20.789785   -16.56036    ... -11.120465   -10.414379
   -0.65011084]
 [-20.651134   -20.796679   -16.562912   ... -11.260432   -11.158343
   -0.9792771 ]
 [-20.432528   -19.941925   -16.704948   ... -10.626869   -10.6901865
   -1.2585614 ]
 ...
 [-20.584467   -20.022121   -16.618914   ... -10.590451   -10.576581
   -0.98374534]
 [-20.744473   -20.511662   -15.699083   ... -10.782928   -10.980191
   -1.4552495 ]
 [-20.370861   -20.098415   -16.473722   ... -11.076783   -11.256245
   -1.6230285 ]]
next_sent_fc_out  [[-0.3227772 -0.3300144]]
output_id [ 1564 12875 15203  3654 17990 12528   737]

然后将fc_out 经过softmax,然后取其中概率最大的位置,也就是上面的output_id,也就是vocab的位置,转换之后是 ‘捷 ##障 ##亢 徘 (17990) ##案 店’ 其中(17990)因为超过vocab所拥有的id,所以用17990代替了。
而输入的句子是 '[CLS]晚上做还来得及吗[SEP]我现在做到一半了不用到傍晚啦如果你要做的话[SEP]'
mask的位置是:[[ 1] [ 2] [15] [16] [20] [26] [27]].
这个输出和预期的结果相差甚远,甚至可以说是没有一点效果。
我想这就是预测maks流程了,但是没有效果,一点都没有。
当然有可能是我弄错了导致的,有错误希望可以指出来,感谢。

@yayaQAQ

This comment has been minimized.

Copy link

commented May 16, 2019

对了,使用的模型是官方提供的原本的模型,没有去fine-tuning,也使用pretrain了10000步之后的模型进行过预测,效果同上。

@daizh

This comment has been minimized.

Copy link

commented May 16, 2019

我在ernie.py的get_pretraining_output函数里面把fc_out给return出来了,获取到了这样的fc_out:

fc_out_length 7 18000
fc_out [[-20.912693   -20.789785   -16.56036    ... -11.120465   -10.414379
   -0.65011084]
 [-20.651134   -20.796679   -16.562912   ... -11.260432   -11.158343
   -0.9792771 ]
 [-20.432528   -19.941925   -16.704948   ... -10.626869   -10.6901865
   -1.2585614 ]
 ...
 [-20.584467   -20.022121   -16.618914   ... -10.590451   -10.576581
   -0.98374534]
 [-20.744473   -20.511662   -15.699083   ... -10.782928   -10.980191
   -1.4552495 ]
 [-20.370861   -20.098415   -16.473722   ... -11.076783   -11.256245
   -1.6230285 ]]
next_sent_fc_out  [[-0.3227772 -0.3300144]]
output_id [ 1564 12875 15203  3654 17990 12528   737]

然后将fc_out 经过softmax,然后取其中概率最大的位置,也就是上面的output_id,也就是vocab的位置,转换之后是 ‘捷 ##障 ##亢 徘 (17990) ##案 店’ 其中(17990)因为超过vocab所拥有的id,所以用17990代替了。
而输入的句子是 '[CLS]晚上做还来得及吗[SEP]我现在做到一半了不用到傍晚啦如果你要做的话[SEP]'
mask的位置是:[[ 1] [ 2] [15] [16] [20] [26] [27]].
这个输出和预期的结果相差甚远,甚至可以说是没有一点效果。
我想这就是预测maks流程了,但是没有效果,一点都没有。
当然有可能是我弄错了导致的,有错误希望可以指出来,感谢。

我是直接取mask位置softmax, 然后去argmax找到概率最大的, 预测结果还不错. (和你用fc_out取最大分数是等价的)

 def get_pretraining_output(self, mask_label, mask_pos, labels):
        ....省略.....
        mask_lm_loss, mask_softmax = fluid.layers.softmax_with_cross_entropy(
            logits=fc_out, label=mask_label, return_softmax=True)
        pred = fluid.layers.argmax(x=mask_softmax, axis=1)
        fluid.layers.Print(pred, message="pred")
        fluid.layers.Print(mask_label, message="mask_label")

你只mask一个字能预测对吗? 是不是官方预训练的ckpt没有载入?

@yayaQAQ

This comment has been minimized.

Copy link

commented May 16, 2019

我在ernie.py的get_pretraining_output函数里面把fc_out给return出来了,获取到了这样的fc_out:

fc_out_length 7 18000
fc_out [[-20.912693   -20.789785   -16.56036    ... -11.120465   -10.414379
   -0.65011084]
 [-20.651134   -20.796679   -16.562912   ... -11.260432   -11.158343
   -0.9792771 ]
 [-20.432528   -19.941925   -16.704948   ... -10.626869   -10.6901865
   -1.2585614 ]
 ...
 [-20.584467   -20.022121   -16.618914   ... -10.590451   -10.576581
   -0.98374534]
 [-20.744473   -20.511662   -15.699083   ... -10.782928   -10.980191
   -1.4552495 ]
 [-20.370861   -20.098415   -16.473722   ... -11.076783   -11.256245
   -1.6230285 ]]
next_sent_fc_out  [[-0.3227772 -0.3300144]]
output_id [ 1564 12875 15203  3654 17990 12528   737]

然后将fc_out 经过softmax,然后取其中概率最大的位置,也就是上面的output_id,也就是vocab的位置,转换之后是 ‘捷 ##障 ##亢 徘 (17990) ##案 店’ 其中(17990)因为超过vocab所拥有的id,所以用17990代替了。
而输入的句子是 '[CLS]晚上做还来得及吗[SEP]我现在做到一半了不用到傍晚啦如果你要做的话[SEP]'
mask的位置是:[[ 1] [ 2] [15] [16] [20] [26] [27]].
这个输出和预期的结果相差甚远,甚至可以说是没有一点效果。
我想这就是预测maks流程了,但是没有效果,一点都没有。
当然有可能是我弄错了导致的,有错误希望可以指出来,感谢。

我是直接取mask位置softmax, 然后去argmax找到概率最大的, 预测结果还不错. (和你用fc_out取最大分数是等价的)

 def get_pretraining_output(self, mask_label, mask_pos, labels):
        ....省略.....
        mask_lm_loss, mask_softmax = fluid.layers.softmax_with_cross_entropy(
            logits=fc_out, label=mask_label, return_softmax=True)
        pred = fluid.layers.argmax(x=mask_softmax, axis=1)
        fluid.layers.Print(pred, message="pred")
        fluid.layers.Print(mask_label, message="mask_label")

你只mask一个字能预测对吗? 是不是官方预训练的ckpt没有载入?

是的,效果不错,基本上能够和原来的一样。
我在改代码的时候把weight_sharing给设置为False了,我对这个参数理解有错误。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
3 participants
You can’t perform that action at this time.