衡量分类器效果的一些指标 (4) – Dual Encoder 中的 Precision 和 Recall

Dual Encoder 是一个非常常用的网络模型。它用于将两个不同领域的数据比如query 和 document, 或者 Image 和 entity 映射到同一个 embedding 空间。这样训练出来的模型既可以用来做两个领域数据之间的相互查询,也可以用来对一对来自两个领域的数据进行打分。

通常在训练Dual Encoder模型的时候,我们使用一种叫做batch softmax的办法。假定我们的训练数据是 Image-Entity Pair,而且全部是正例,我们从训练数据文件中读取一批(假定100个)这样的训练数据,然后把它们排成一个矩阵,每个Image一行,每个Entity一列,这样我们一共形成一个100行100列的矩阵,其中第一个 Image-Entity pair的 Image 放在第一行,entity放在第一列,而第二个 Image-Entity pair的 Image 放在第二行,entity放在第二列,以此类推。在这样的矩阵中,我们一共有100*100 = 10000 个 Image-Entity Pairs,其中对角线上的那些 Pair是正例,而我们将所有不在对角线上的 Pairs就直接当做反例来训练。

衡量 Dual Encoder模型也可以使用precsion和recall这两个指标。其中 Precison一般使用 Precision@1,它的意思是说在使用模型对一个矩阵中的10000 Image-Entity Pairs 打分以后,从每一行中挑出得分最高的那个entity,这样每行一个,我们就一共收集100个entity。这些entity中处于对角线上的元素(也就是训练数据中的正例)的个数除以收集的entity总数(100),就是模型的 Precision@1。 我们也可以定义Precision@k (k大于1),也就是每行收集k个元素,然后还是用收集的元素中的对角线元素的个数除以收集的总数(100*k)。但是因为Dual Encoder 模型中假定一个 Image 只有一个 Entity 是正确的,因此 这个时候的 Precision@k 数字会比 Precision@1小很多,而且其实际意义也不明确。

相应的,Recall一般使用 Recall@k (k大于1),它的意思是说在使用模型对一个矩阵中的10000 Image-Entity Pairs 打分以后,从每一行中挑出k个得分最高的entity,我们就一共收集100*k个entity。这些entity中处于对角线上的元素(也就是训练数据中的正例)的个数除以总共对角线的entity个数(总是100),就是模型的 Recall@k。 这里我们注意到 Recall@1 和 Precision@1 的结果将会是完全一致的。