学习排序 Learning to Rank:从pointwise和pairwise到listwise,经典模型与优缺点

       Ranking是信息检索领域的基本问题,也是搜索引擎背后的重要组成模块。本文将对结合机器学习的ranking技术——learning2rank——做个系统整理,包括pointwise、pairwise、listwise三大类型,它们的经典模型,解决了什么问题,仍存在什么缺陷。关于一些扩展话题和具体应用,可能会在下一篇文章介绍,包括在QA领域的实践情况。

      本文主要参考刘铁岩老师的<Learning to Rank for Information Retrieval>和李航老师的<Learning to rank for information retrieval and natural language processiing>

1、概述

1.1 Ranking

Ranking模型可以粗略分为基于相关度和基于重要性进行排序的两大类。

早期基于相关度的模型,通常利用query和doc之间的词共现特性(如布尔模型)、VSM(如TFIDF、LSI等)、概率排序思想(BM25、LMIR)等方式

基于重要性的模型,利用的是doc本身的重要性,如PageRank、TrustRank等

相关度的标注

   1.最流行也相对好实现的一样方式时,人工标注MOS,即相关度等级。

   2.其次是,人工标注pairwise preference, 即一个doc是否相对另一个doc与该query更相关

   3.最costly的方式是,人工标注docs与query的整体相关度排序。

  评估指标

即评估query与docs之间的真实排序与预测排序的差异。

大部分评估指标都是针对每组query-docs进行定义,然后再在所有组上进行平均。常用的基于度量的ranking错误率如下

  .MAP

  首先,suppose we have binary judgment for the documents, i.e., the label is one for relevant documents and zero for irrelevant documents,定义docs 排序列表 π 中位置 k 的 precision 为

     

 其次,令m为该query对应的docs数量,m_1为该query对应的标签为1的docs数量,则有average precision(AP)为

         

最后,对所有 query 求得 AP 进行平均,即得到 MAP。 

.NDCG

首先,Discounted cumulative gain (DCG)考量了relevance judgment in terms of multiple ordered categories,以及对位置信息进行了折扣考量。定义docs排序列表π中位置k的DCG为

               

其中,函数G是对应doc的rating值,通常采用指数函数,如G(x)=2^x-1,函数η即位置折扣因子,通常采用η(j)=1/log(j+1)。

其次,对DCG@k 进行归一化,规整到0-1,Z_k表示DCG@k的可能最大值,从而有NDCG

 

可以发现,这些评估指标具备两大特性:

1.基于query,即不管一个query对应的docs排序有多糟糕,也不会严重影响整体的评价过程,因为每组query-docs对平均指标都是相同的贡献。

2.基于position,即显示的利用了排序列表中的位置信息,这个特性的副作用就是上述指标是离散不可微的。

一方面,这些指标离散不可微,从而没法应用到某些学习算法模型上;另一方面,这些评估指标较为权威,通常用来评估基于各类方式训练出来的ranking模型。因此,即使某些模型提出新颖的损失函数构造方式,也要受这些指标启发,符合上述两个特性才可以。这些细节在后面会慢慢体会到。

1.2 Learning to Rank

Learning2Rank即将ML技术应用到ranking问题,训练ranking模型。通常这里应用的是判别式监督ML算法。经典L2R框架如下

 

. 特征向量x反映的是某query及其对应的某doc之间的相关性,通常前面提到的传统ranking相关度模型都可以用来作为一个维度使用。

.L2R中使用的监督机器学习方法主要是判别式类

根据上图的基本元素(输入空间、假设空间、输出空间、损失函数)方面的差异,L2R可以分为三大类,pointwise类,pairwise类,listwise类。总结如下,后面章节将进行详细说明。

2、Pointwise Approach

2.1特点

Pointwise类方法,其L2R框架具有以下特征:

  •  输入空间中样本是单个doc(和对应query)构成的特征向量
  •  输出空间中样本是单个doc(和对应query)的相关度;
  •  假设空间中样本是打分函数;
  •  损失函数评估单个doc的预测得分和真实得分之间的差异。

这里讨论下,关于人工标注标签怎么转换到pointwise类方法的输出空间:

   1.如果标注直接是相关度s_j,则doc x_j的真实标签定义为y_j=s_j

   2.如果标注是pairwise preference s_{u,v},则doc x_j的真实标签可以利用该doc击败了其他docs的频次

   3.如果标注是整体排序 π,则doc x_j的真实标签可以利用映射函数,如将doc的排序位置序号当作真实标签

根据使用的ML方法不同,pointwisek类可以进一步分为三类:基于回归的算法、基于分类的算法、基于有序回归的算法。下面详细介绍。

2.2 基于回归的算法。

此时,输出空间包含的是实值相关度得分。

采用ML中传统的回归方法即可

2.3 基于分类的算法

此时,输出空间包含的是无序类别。

对于二分类,SVM 、LR等均可;对于多分类,提升树等均可。

2.4 基于有序回归的算法。

此时,输出空间包含的是有序类别。

通常是找一个打分函数,然后用一系列閥值对得分进行分割,得到有序类别。采用PRanking、基于margin的方法都可以。

2.5 缺陷

回顾概述中提到的评估指标应该基于query和position,

  1. ranking追求的是排序结果,并不要求精准打分,只要有相对打分即可。
  2. pointwise类方法并没有考虑同一个query对应的docs间的内部依赖性,一方面,导致输入空间内的样本不是ID的,违反了ML的基本假设,另一方面,没有充分利用这种样本间的结构性。其次,当不同query对应不同数量的docs时,整体loss将会对对应docs数量大的query组所支配,前面说过应该每组query都是等价的。
  3. 损失函数也没有model到预测排序中的位置信息。因此,损失函数可能无意的过多强调那些不重要的docs,即那些排序在后面对用户体验影响小的doc.

2.6 改进

Pointwise类算法也可以再改进,比如在loss中引入基于query的正则化因子的RankCosine方法。

3.、Pairwise Approach

3.1 特点

  1. Pairwise类方法,其L2R框架具有以下特征。
  2. 输入空间中样本是(同一query对应的)两个doc(和对应query)构成的两个特征向量。
  3. 输出空间中样本是pairwise preference
  4. 假设空间中样本是二变量函数
  5. 损失函数评估doc pair的预测preference和真实preference之间差异。

这里讨论下,关于人工标注标签怎么转换到pairwise和真实preference之间差异。

2.6 改进

Pointwise类算法也可以再改进,比如在loss中引入基于query的正则化因子的RankCosine方法。

3、Pairwise Approach

3.1 特点

Pairwise类方法,其L2R框架具有以下特征。

输入空间中样本是(同一query对应的)两个doc(和对应query)构成的两个特征向量

输出空间中样本是pairwise preference

假设空间中样本是二变量函数

损失函数评估doc pair的预测preference和真实preference之间差异

这里讨论下,关于人工标注标签怎么转换到pairwise类方法的输出空间:

  1.如果标注直接是相关度s_j,则doc pair(x_u,x_v)的真实标签定义为 y_{u,v}=2*I_{s_u>s_v}-1

  2.如果标注是pairwise preference s_{u,v},则doc pair(x_u,x_v) 的真实标签定义为y_{u,v}=s_{u,v}

  3.如果标注是整体排序π,则doc pair(x_u,x_v)的真实标签定义为y_{u,v}=2*I_{π_u,π_v}-1

3.2 基于二分类的算法

pairwise类方法基本就是使用二分类算法即可

经典的算法有基于NN的sortNet,基于NN的RankNet,基于fidelity loss的FRank,基于adaBoost的RabkBoost,基于SVM的RankingSVM,基于提升树的GBRank.

3.3缺陷

虽然pairwise类相较pointwise类model到一些doc pair间的相对顺序信息,但还是存在不少问题,回顾概述中提到的评估指标应该基于query和position

  1. 如果人工标注给定的是第一种和第三种,即已包含多有序类别,那么转换为pairwise preference时必定会损失一些更细粒度的相关度标注信息。
  2. doc pair的数量将是doc数量的二次,从而pointwise类方法就存在的query间doc数量的不平衡性将在pairwise类方法中进一步放大。
  3. pairwise类方法相对pointwise类方法对噪声标注更敏感,即一个错误标注会引起多个doc pair标注错误。
  4. pairwise类方法仅考虑了doc pair的相对位置,损失函数还是没有model到预测排序中的位置信息。
  5. pairwise类方法也没有考虑同一个query对应的doc pair间的内部依赖性,即输入空间内的样本并不是ID的,违反了ML的基本假设,并且也没有充分利用这种样本间的结构性。

3.4 改进

pairwise类方法也有一些尝试,去一定程度解决上述缺点,比如:

Multiple hyperplane ranker,主要针对前述第一个缺陷

magnitude-preserving ranking,主要针对前述第一个缺陷

IRSVM,主要针对前述第二个缺陷

采用 Sigmoid 进行改进的 pairwise 方法,主要针对前述第三个缺陷

P-norm push,主要针对前述第四个缺陷

Ordered weighted average ranking,主要针对前述第四个缺陷

LambdaRank,主要针对前述第四个缺陷

Sparse ranker,主要针对前述第四个缺陷

4、Listwise Approach

4.1特点

Listwise类方法,其L2R框架具有以下特征:

输入空间中样本是(同一query对应的)所有doc(与对应的query)构成的多个特征向量(列表)

输出空间中样本是这些doc(和对应query)的相关度排序列表或者排列

假设空间中样本是多变量函数,对于docs得到其排列,实践中,通常是一个打分函数,根据打分函数对所有docs的打分进行排序得到docs相关度的排列。

损失函数分成两类,一类是直接和评价指标相关的,还有一类不是直接相关的,具体后面介绍。

这里讨论下,关于人工标注标签怎么转换到listwise类方法的输出空间:

1、如果标注直接是相关度s_j,则doc set的真实标签可以利用相关度s_j进行比较构造出排列

2.如果标注是pairwise preference s_{u,v},则doc set的真实标签也可以利用所有s_{u,v}进行比较构造出排列

3.如果标注是整体排序π,则doc set则可以直接得到真实标签

根据损失函数构造方式的不同,listwise类可以分成两类直接基于评价指标的算法,间接基于评价指标的算法。下面详细介绍。

4.2 直接基于评论指标的算法。

直接取优化ranking的评价指标,也算是listwise中哦最直观的方法。但这并不简单,因为前面说过评价指标都是离散不可微的,具体处理方式有这么几种:

  1. 优化基于评价指标的ranking error的连续可微的近似,这种方法就可以直接应用已有的优化方法,如SoftRank,ApproximateRank,SmoothRank
  2. 优化基于评价指标的ranking error的连续可微的上界,如SVM-MAP,SVM-NDCG,PermulRank,
  3. 使用可以优化非平滑目标函数的优化技术,如AdaRank,RankGP

上述方法的优化目标都是直接和ranking的评价指标有关。现在来考虑一个概念,informativeness.通常认为一个更有信息量的指标,可以产生更有效的排序模型。而多层评价指标(NDCG)相较二元评价(AP)指标通常更富信息量。因此,有时虽然使用信息量更少的指标来评估模型,但仍然可以使用更富信息量的指标来作为loss进行模型训练。

4.3 非直接基于评价指标的算法。

这里,不再使用和评价指标相关的loss来优化模型,而是设计能衡量模型输出与真实排序之间差异的loss,如此获得的模型在评价指标上也能获得不错的性能。

经典的如,ListNet,ListMLE,StructRank,BoltzRank.

4.4 缺陷

listwise类相较pointwise、pairwise对ranking的model更自然,解决了ranking应该基于query和position问题。

listwise类存在的主要缺陷是:一些ranking算法需要基于排序来计算loss,从而使得训练复杂度较高,如ListNet和BoltzRank.此外,位置信息并没有在loss中得到充分利用,可以考虑在ListNet和ListMLE的loss中引入位置折扣因子。

5、总结

实际上,前面介绍完,可以看出来,这三大类方法主要区别在于损失函数。不同的损失函数知音了不同的模型学习过程和输入输出空间。

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是利用LDA主题模型、Word2Vec词向量模型与TextRank相融合的关键词抽取算法的Python代码: ```python import jieba import gensim from gensim.models import Word2Vec from gensim import corpora, models import numpy as np from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity # 加载停用词表 stopwords = [line.strip() for line in open('stopwords.txt', encoding='UTF-8').readlines()] # 加载语料库 corpus = [] with open('data.txt', 'r', encoding='UTF-8') as f: for line in f.readlines(): corpus.append(line.strip()) # 分词 texts = [[word for word in jieba.cut(text) if word not in stopwords] for text in corpus] # 训练Word2Vec模型 model = Word2Vec(texts, size=100, window=5, min_count=1, workers=4) # 训练LDA主题模型 dictionary = corpora.Dictionary(texts) corpus_bow = [dictionary.doc2bow(text) for text in texts] lda_model = models.ldamodel.LdaModel(corpus_bow, num_topics=10, id2word=dictionary) # 获取关键词列表 keywords_list = [] for i in range(len(texts)): text = texts[i] bow = dictionary.doc2bow(text) # 获取LDA主题分布 lda_dist = lda_model[bow] lda_dist = sorted(lda_dist, key=lambda x: x[1], reverse=True) # 获取Word2Vec词向量 word_vectors = [] for word in text: try: word_vectors.append(model[word]) except: pass word_vectors = np.array(word_vectors) word_vectors_mean = np.mean(word_vectors, axis=0) # 获取TextRank分数 vectorizer = TfidfVectorizer() tfidf = vectorizer.fit_transform(text) sim_matrix = cosine_similarity(tfidf) scores = np.sum(sim_matrix, axis=1) scores = scores / np.sum(scores) # 综合三种方法获取关键词 keywords = [] for j in range(10): topic = lda_dist[j][0] word_dist = lda_model.show_topic(topic, topn=20) for word, dist in word_dist: if word in text: score = dist * 0.5 + model.similarity(word, '主题') * 0.3 + scores[text.index(word)] * 0.2 keywords.append((word, score)) keywords = sorted(keywords, key=lambda x: x[1], reverse=True)[:5] # 将关键词加入列表 keywords_list.append([keyword[0] for keyword in keywords]) # 输出关键词列表 print(keywords_list) ``` 在上面的代码中,我们首先加载了停用词表和语料库。然后对每一篇文本进行分词,并使用Word2Vec模型和LDA主题模型训练。接着,我们使用LDA主题模型获取主题分布,使用Word2Vec模型获取词向量,使用TextRank算法获取每个词的权重得分。最后,我们将三种方法得出的关键词综合起来,得到每篇文本的关键词列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值