使用评估指标(如NDCG)作为损失函数是否可行?

3
我正在研究一个信息检索模型,名为DPR,基本上是一个神经网络(2个BERT),可以对文档进行排名,给定一个查询。目前,该模型以二进制方式训练(文档是否相关),并使用负对数似然(NLL)损失函数。我想改变这种二元行为,创建一个可以处理分级相关性的模型(例如3个等级:相关、有些相关、不相关)。我必须更改损失函数,因为当前情况下,我只能为每个查询分配1个正目标(DPR使用pytorch NLLLoss),这不是我所需要的。

我想知道是否可以使用类似NDCG(归一化折扣累积增益)的评估指标来计算损失。我的意思是,损失函数的整个目的是告诉我们预测的偏差有多大,而NDCG也在做同样的事情。

那么,我可以使用这样的度量替换损失函数吗?在NDCG的情况下,我认为减去结果的1(1-NDCG_score)可能是一个很好的损失函数。这是正确的吗?

最好的问候,Ali。

2个回答

6
是的,这是可能的。您需要采用列表式学习排名方法,而不是更常见的成对损失函数。
在成对损失中,网络会提供示例对(rel,non-rel),而地面实况标签是二进制的(例如,如果一对中的第一个相关,则为1,否则为0)。
然而,在列表式学习中,训练过程中您将提供一个列表而不是一对,地面实况值(仍然是二进制)将指示是否这种排列确实是最优的,例如,可以使nDCG最大化的排列。在列表式方法中,因此将排名目标转换为排列的分类
有关详细信息,请参考本文
显然,该网络不是以特征作为输入,而是采用查询和列表内文档的BERT向量,类似于ColBERT。与ColBERT不同的是,在列表式训练中,您需要从5个文档中提取向量,而不是从2个文档中提取向量(成对训练)。

0
直接使用NDCG(或1-NDCG)作为损失是不可能的,因为NDCG不可微分。这是一个相对常见的问题,除了NDCG之外,还有其他非常有用但不可微分的指标,比如平均精度。优化这些指标的通常方法是稍微改变它们以获得可微分函数(上界、近似)。
就NDCG而言,有两种方法值得考虑:ApproxNDCG(https://link.springer.com/article/10.1007/s10791-009-9124-x)和NeuralNDCG(https://arxiv.org/pdf/2102.07831.pdf)。有不同的实现可供选择,例如PyTorch的https://github.com/allegro/allRank或jax的https://github.com/google/rax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接