luhua-rain / MRC_Competition_Dureader

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

答案抽取部分代码逻辑请教 #5

Closed mazicwong closed 5 years ago

mazicwong commented 5 years ago

您好, 在这个目录下 Dureader-Bert/Dureader/predict/predicting.py, 有一段代码没看懂 在find_best_answer_for_passage函数中, while True跑三个循环这里是为什么这么定义的, 每次预测出的start跟end位置相反就全部置为0重来, 似乎讲不通.. 感觉跟其他模型中用动态规划的思路求最大score的区间方式不太一样.

附上代码:

def find_best_answer_for_passage(start_probs, end_probs, passage_len, question):
        best_start, best_end, max_prob = -1, -1, 0

        start_probs, end_probs  = start_probs.unsqueeze(0), end_probs.unsqueeze(0)
        prob_start, best_start = torch.max(start_probs, 1)
        prob_end, best_end = torch.max(end_probs, 1)
        num = 0
        while True:
            if num > 3:
                break
            if best_end >= best_start:
                break
            else:
                start_probs[0][best_start], end_probs[0][best_end] = 0.0, 0.0
                prob_start, best_start = torch.max(start_probs, 1)
                prob_end, best_end = torch.max(end_probs, 1)
            num += 1
        max_prob = prob_start * prob_end

        if best_start <= best_end:
            return (best_start, best_end), max_prob
        else:
            return (best_end, best_start), max_prob
luhua-rain commented 5 years ago

嗯,一般来说若start>end,则可以表示无答案,但Dureader是不存在无答案的情况。

mazicwong commented 5 years ago

感谢您的回答, 我对最后这个抽取方法进行测试后, 发现了一个有趣的结论, 对于您代码里的方法, 可以得到的BLEU值约为45%, 如果直接用DP得到全局最优, 并且不限定答案长度的情况下, BLEU值会变成非常小, 约5%, 我检查了具体的原因, 发现改用DP后, 整体上得到的答案都非常短, 想请教下这个问题是否还有其他比较可行的算法?

举个BLEU值降低的例子:

luhua-rain commented 5 years ago

答案抽取的我试过相加、相乘的,其它没怎么试;对于这来个说,相加要好些

mazicwong commented 5 years ago

懂了, 感谢回答, 我尝试了几种方法后都没有github这个方法好