了解如何在 BERT 论文中计算 SQuAD 任务的损失

人工智能 自然语言处理 目标函数 文件 伯特
2021-11-18 12:21:20

BERT 论文中,第 4.2 节介绍了 SQuAD 训练。

根据我的理解,训练了两个额外的参数,它们是两个向量,具有与隐藏大小相同的维度,因此与 BERT 中的上下文嵌入具有相同的维度。它们是 S(开始)和 E(结束)。对于每一个,使用 S 和每个最终的上下文嵌入来获取一个 softmax,以获得正确起始位置的分数。对 E 和正确的结束位置也做了同样的事情。

我开始讲这部分。但是我无法弄清楚标签和最终损失计算是如何进行的,这在本段中有描述

最大得分跨度用作预测。训练目标是正确开始和结束位置的对数似然。

“使用最大评分跨度作为预测”是什么意思?

此外,这如何发挥作用

训练目标是正确开始和结束位置的对数似然

从这个来源:https ://ljvmiranda921.github.io/notebook/2017/08/13/softmax-and-the-negative-log-likelihood/

它说对数似然只适用于正确的类。所以,我们只计算正确位置的 softmax,而不是任何不正确的位置。

如果这个解释是正确的,那么损失将是

Loss = -Log( Softmax(S*T(predictedStart) / Sum(S*Ti) ) -Log( Softmax(E*T(predictedEnd) / Sum(S*Ti) )
1个回答

这些答案是基于我个人从论文官方实现中对 Bert 的理解,希望对您有所帮助:

What do they mean by "maximum scoring span is used as the prediction"?

如您所知,在 SQuAD 中,输入序列分为两部分:问题和文档(如果可能,我们会从中提取答案)。

有时输入长度超过max_seq_length参数,在这种情况下,文档会根据需要被截断为尽可能多的部分,我们最终会为同一个问题/文档提供多个输入。提到该问题在所有结果输入中都被复制(有关详细信息,请参见line_350)。

因此,在这种情况下,为了确定所有生成输入之间的预测跨度,我们使用最大得分, (max_start + max_end) / 2 = ( max(Softmax(S*Ti)) + max(Softmax(E*Ti)) ) / 2与同一问题相关的所有输入。

"The training objective is the loglikelihood of the correct start and end positions"

损失是 start_position 损失start_loss和 end_postition 损失的平均值end_loss每个损失都以相同的方式计算:在将 Softmax 应用于最终输出(即S*TiE*Ti)之后,我们使用真正的开始/结束位置来计算损失(参见下面的代码)。

来自Bert_repo中的 run_squad.py:

 def compute_loss(logits, positions):
        one_hot_positions = tf.one_hot(positions, depth=seq_length, dtype=tf.float32)
        log_probs = tf.nn.log_softmax(logits, axis=-1)
        loss = -tf.reduce_mean(tf.reduce_sum(one_hot_positions * log_probs, axis=-1))
        return loss

 start_positions = features["start_positions"]
 end_positions = features["end_positions"]

 start_loss = compute_loss(start_logits, start_positions)
 end_loss = compute_loss(end_logits, end_positions)

 total_loss = (start_loss + end_loss) / 2.0