mirror of
https://github.com/cheetahlou/CategoryResourceRepost.git
synced 2025-10-20 17:03:47 +08:00
mod
This commit is contained in:
71
极客时间专栏/AI技术内参/搜索核心技术/031 | 经典搜索核心算法:TF-IDF及其变种.md
Normal file
71
极客时间专栏/AI技术内参/搜索核心技术/031 | 经典搜索核心算法:TF-IDF及其变种.md
Normal file
@@ -0,0 +1,71 @@
|
||||
<audio id="audio" title="031 | 经典搜索核心算法:TF-IDF及其变种" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/dc/91/dca1392c98d2b44ddab8a205ef11ff91.mp3"></audio>
|
||||
|
||||
从本周开始我们进入人工智能核心技术模块,本周我会集中讲解经典的搜索核心算法,今天先来介绍TF-IDF算法。
|
||||
|
||||
在信息检索(Information Retrieval)、文本挖掘(Text Mining)以及自然语言处理(Natural Language Processing)领域,TF-IDF算法都可以说是鼎鼎有名。虽然在这些领域中,目前也出现了不少以深度学习为基础的新的文本表达和算分(Weighting)方法,但是TF-IDF作为一个最基础的方法,依然在很多应用中发挥着不可替代的作用。
|
||||
|
||||
了解和掌握TF-IDF算法对初学者大有裨益,能够帮助初学者更快地理解其它更加深入、复杂的文本挖掘算法和模型。今天我就来谈谈TF-IDF的历史、算法本身的细节以及基于TF-IDF的几个变种算法。
|
||||
|
||||
## TF-IDF的历史
|
||||
|
||||
把查询关键字(Query)和文档(Document)都转换成“向量”,并且尝试用线性代数等数学工具来解决信息检索问题,这样的努力至少可以追溯到20世纪70年代。
|
||||
|
||||
1971年,美国康奈尔大学教授杰拉德·索尔顿(Gerard Salton)发表了《SMART检索系统:自动文档处理实验》(The SMART Retrieval System—Experiments in Automatic Document Processing)一文,文中首次提到了把查询关键字和文档都转换成“向量”,并且给这些向量中的元素赋予不同的值。这篇论文中描述的SMART检索系统,特别是其中对TF-IDF及其变种的描述成了后续很多工业级系统的重要参考。
|
||||
|
||||
1972年,英国的计算机科学家卡伦·琼斯(Karen Spärck Jones)在《从统计的观点看词的特殊性及其在文档检索中的应用》(A Statistical Interpretation of Term Specificity and Its Application in Retrieval) 一文中第一次详细地阐述了IDF的应用。其后卡伦又在《检索目录中的词赋值权重》(Index Term Weighting)一文中对TF和IDF的结合进行了论述。可以说,卡伦是第一位从理论上对TF-IDF进行完整论证的计算机科学家,因此后世也有很多人把TF-IDF的发明归结于卡伦。
|
||||
|
||||
杰拉德本人被认为是“信息检索之父”。他1927年出生于德国的纽伦堡,并与1950年和1952年先后从纽约的布鲁克林学院获得数学学士和硕士学位,1958年从哈佛大学获得应用数学博士学位,之后来到康奈尔大学参与组建计算机系。为了致敬杰拉德本人对现代信息检索技术的卓越贡献,现在,美国计算机协会ACM(Association of Computing Machinery)每三年颁发一次“杰拉德·索尔顿奖”(Gerard Salton Award),用于表彰对信息检索技术有突出贡献的研究人员。卡伦·琼斯在1988年获得了第二届“杰拉德·索尔顿奖”的殊荣。
|
||||
|
||||
## TF-IDF算法详解
|
||||
|
||||
要理解TF-IDF算法,第一个步骤是理解TF-IDF的应用背景。TF-IDF来源于一个最经典、也是最古老的信息检索模型,即“**向量空间模型**”(Vector Space Model)。
|
||||
|
||||
简单来说,**向量空间模型就是希望把查询关键字和文档都表达成向量,然后利用向量之间的运算来进一步表达向量间的关系**。比如,一个比较常用的运算就是计算查询关键字所对应的向量和文档所对应的向量之间的“**相关度**”。
|
||||
|
||||
因为有了向量的表达,相关度往往可以用向量在某种意义上的“**相似度**”来进行近似,比如**余弦相似性**(Cosine Similarity)或者是**点积**(Dot Product)。这样,相关度就可以用一个值来进行表达。不管是余弦相似度还是点积都能够从线性代数或者几何的角度来解释计算的合理性。
|
||||
|
||||
在最基本的向量空间模型的表达中,查询关键字或是文档的向量都有V维度。这里的V是整个词汇表(Vocabulary)的总长度。比如,我们如果有1万个常用的英文单词,那么这个V的取值就是1万,而查询关键字和每个文档的向量都是一个1万维的向量。 对于这个向量中的每一个维度,都表示英文中的一个单词,没有重复。
|
||||
|
||||
你可以看到,在这样的情况下,如果当前的词出现在这个向量所对应的文档或者关键字里,就用1来表达;如果这个词没出现,就用0来表达。这就是给每个维度赋值(Weighting)的最简单的方法。
|
||||
|
||||
**TF-IDF就是在向量空间模型的假设下的一种更加复杂的赋值方式。TF-IDF最基础的模式,顾名思义,就是TF和IDF的乘积**。
|
||||
|
||||
TF其实是“**单词频率**”(Term Frequency)的简称。意思就是说,我们计算一个查询关键字中某一个单词在目标文档中出现的次数。举例说来,如果我们要查询“Car Insurance”,那么对于每一个文档,我们都计算“Car”这个单词在其中出现了多少次,“Insurance”这个单词在其中出现了多少次。这个就是TF的计算方法。
|
||||
|
||||
TF背后的隐含的假设是,查询关键字中的单词应该相对于其他单词更加重要,而文档的重要程度,也就是相关度,与单词在文档中出现的次数成正比。比如,“Car”这个单词在文档A里出现了5次,而在文档B里出现了20次,那么TF计算就认为文档B可能更相关。
|
||||
|
||||
然而,信息检索工作者很快就发现,仅有TF不能比较完整地描述文档的相关度。因为语言的因素,有一些单词可能会比较自然地在很多文档中反复出现,比如英语中的“The”、“An”、“But”等等。这些词大多起到了链接语句的作用,是保持语言连贯不可或缺的部分。然而,如果我们要搜索“How to Build A Car”这个关键词,其中的“How”、“To”以及“A”都极可能在绝大多数的文档中出现,这个时候TF就无法帮助我们区分文档的相关度了。
|
||||
|
||||
IDF,也就是“**逆文档频率**”(Inverse Document Frequency),就在这样的情况下应运而生。这里面的思路其实很简单,那就是我们需要去“惩罚”(Penalize)那些出现在太多文档中的单词。
|
||||
|
||||
也就是说,真正携带“相关”信息的单词仅仅出现在相对比较少,有时候可能是极少数的文档里。这个信息,很容易用“文档频率”来计算,也就是,有多少文档涵盖了这个单词。很明显,如果有太多文档都涵盖了某个单词,这个单词也就越不重要,或者说是这个单词就越没有信息量。因此,我们需要对TF的值进行修正,而IDF的想法是用DF的倒数来进行修正。倒数的应用正好表达了这样的思想,DF值越大越不重要。
|
||||
|
||||
在了解了TF和IDF的基本计算方法后,我们就可以用这两个概念的乘积来表达某个查询单词在一个目标文档中的重要性了。值得一提的是,虽然我们在介绍TF-IDF这个概念的时候,并没有提及怎么把查询关键字和文档分别表达成向量,其实TF-IDF算法隐含了这个步骤。
|
||||
|
||||
具体来说,对于查询关键字,向量的长度是V,也就是我们刚才说过的词汇表的大小。然后其中关键字的单词出现过的维度是1,其他维度是0。对于目标文档而言,关键词出现过的维度是TF-IDF的数值,而其他维度是0。在这样的表达下,如果我们对两个文档进行“点积”操作,则得到的相关度打分(Scoring)就是TF-IDF作为相关度的打分结果。
|
||||
|
||||
## TF-IDF算法变种
|
||||
|
||||
很明显,经典的TF-IDF算法有很多因素没有考虑。在过去的很长一段时间里,研究人员和工程师开发出了很多种TF-IDF的变种。这里我介绍几个经典的变种。
|
||||
|
||||
首先,很多人注意到TF的值在原始的定义中没有任何上限。虽然我们一般认为一个文档包含查询关键词多次相对来说表达了某种相关度,但这样的关系很难说是线性的。拿我们刚才举过的关于“Car Insurance”的例子来说,文档A可能包含“Car”这个词100次,而文档B可能包含200次,是不是说文档B的相关度就是文档A的2倍呢?其实,很多人意识到,超过了某个阈值之后,这个TF也就没那么有区分度了。
|
||||
|
||||
**用Log,也就是对数函数,对TF进行变换,就是一个不让TF线性增长的技巧**。具体来说,人们常常用1+Log(TF)这个值来代替原来的TF取值。在这样新的计算下,假设“Car”出现一次,新的值是1,出现100次,新的值是5.6,而出现200次,新的值是6.3。很明显,这样的计算保持了一个平衡,既有区分度,但也不至于完全线性增长。
|
||||
|
||||
另外一个关于TF的观察则是,经典的计算并没有考虑“长文档”和“短文档”的区别。一个文档A有3,000个单词,一个文档B有250个单词,很明显,即便“Car”在这两个文档中都同样出现过20次,也不能说这两个文档都同等相关。**对TF进行“标准化”(Normalization),特别是根据文档的最大TF值进行的标准化,成了另外一个比较常用的技巧**。
|
||||
|
||||
**第三个常用的技巧,也是利用了对数函数进行变换的,是对IDF进行处理**。相对于直接使用IDF来作为“惩罚因素”,我们可以使用N+1然后除以DF作为一个新的DF的倒数,并且再在这个基础上通过一个对数变化。这里的N是所有文档的总数。这样做的好处就是,第一,使用了文档总数来做标准化,很类似上面提到的标准化的思路;第二,利用对数来达到非线性增长的目的。
|
||||
|
||||
还有一个重要的TF-IDF变种,则是对查询关键字向量,以及文档向量进行标准化,使得这些向量能够不受向量里有效元素多少的影响,也就是不同的文档可能有不同的长度。在线性代数里,可以把向量都标准化为一个单位向量的长度。这个时候再进行点积运算,就相当于在原来的向量上进行余弦相似度的运算。所以,另外一个角度利用这个规则就是直接在多数时候进行余弦相似度运算,以代替点积运算。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了文档检索领域或者搜索领域里最基本的一个技术:TF-IDF。我们可以看到,TF-IDF由两个核心概念组成,分别是词在文档中的频率和文档频率。TF-IDF背后隐含的是基于向量空间模型的假设。
|
||||
|
||||
一起来回顾下要点:第一,简要介绍了TF-IDF的历史。第二,详细介绍了TF-IDF算法的主要组成部分。第三,简要介绍了TF-IDF的一些变种 。
|
||||
|
||||
最后,给你留一个思考题,如果要把TF-IDF应用到中文环境中,是否需要一些预处理的步骤?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
79
极客时间专栏/AI技术内参/搜索核心技术/032 | 经典搜索核心算法:BM25及其变种(内附全年目录).md
Normal file
79
极客时间专栏/AI技术内参/搜索核心技术/032 | 经典搜索核心算法:BM25及其变种(内附全年目录).md
Normal file
@@ -0,0 +1,79 @@
|
||||
<audio id="audio" title="032 | 经典搜索核心算法:BM25及其变种(内附全年目录)" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/f0/e0/f01afedc23b53f01cf4538a317fcebe0.mp3"></audio>
|
||||
|
||||
周一我们讲了TF-IDF算法和它的四个变种,相对于TF-IDF而言,在信息检索和文本挖掘领域,BM25算法则更具理论基础,而且是工程实践中当仁不让的重要基线(Baseline)算法 。BM25在20世纪70年代到80年代被提出,到目前为止已经过去二三十年了,但是这个算法依然在很多信息检索的任务中表现优异,是很多工程师首选的算法之一。
|
||||
|
||||
今天我就来谈谈BM25算法的历史、算法本身的核心概念以及BM25的一些重要变种,帮助你快速掌握这个信息检索和文本挖掘的利器。
|
||||
|
||||
## BM25的历史
|
||||
|
||||
BM25,有时候全称是Okapi BM25,是由英国一批信息检索领域的计算机科学家开发的排序算法。这里的“BM”是“最佳匹配”(Best Match)的简称。
|
||||
|
||||
BM25背后有两位著名的英国计算机科学家。第一位叫斯蒂芬·罗伯逊(Stephen Robertson)。斯蒂芬最早从剑桥大学数学系本科毕业,然后从城市大学(City University)获得硕士学位,之后从伦敦大学学院(University College London)获得博士学位。斯蒂芬从1978年到1998年之间在城市大学任教。1998年到2013年间在微软研究院剑桥实验室工作。我们之前提到过,美国计算机协会ACM现在每三年颁发一次“杰拉德·索尔顿奖”,用于表彰对信息检索技术有突出贡献的研究人员。2000年这个奖项颁给斯蒂芬,奖励他在理论方面对信息检索的贡献。BM25可谓斯蒂芬一生中最重要的成果。
|
||||
|
||||
另外一位重要的计算机科学家就是英国的卡伦·琼斯(Karen Spärck Jones)。周一我们在TF-IDF的文章中讲过。卡伦也是剑桥大学博士毕业,并且毕生致力于信息检索技术的研究。卡伦的最大贡献是发现IDF以及对TF-IDF的总结。卡伦在1988年获得了第二届“杰拉德·索尔顿奖”。
|
||||
|
||||
## BM25算法详解
|
||||
|
||||
现代BM25算法是用来计算某一个目标文档(Document)相对于一个查询关键字(Query)的“相关性”(Relevance)的流程。通常情况下,BM25是“非监督学习”排序算法中的一个典型代表。
|
||||
|
||||
顾名思义,这里的“非监督”是指所有的文档相对于某一个查询关键字是否相关,这个信息是算法不知道的。也就是说,算法本身无法简单地从数据中学习到相关性,而是根据某种经验法则来“猜测”相关的文档都有什么特质。
|
||||
|
||||
那么BM25是怎么定义的呢?我们先来看传统的BM25的定义。一般来说,**经典的BM25分为三个部分**:
|
||||
|
||||
<li>
|
||||
单词和目标文档的相关性
|
||||
</li>
|
||||
<li>
|
||||
单词和查询关键词的相关性
|
||||
</li>
|
||||
<li>
|
||||
单词的权重部分
|
||||
</li>
|
||||
|
||||
这三个部分的乘积组成某一个单词的分数。然后,整个文档相对于某个查询关键字的分数,就是所有查询关键字里所有单词分数的总和。
|
||||
|
||||
我们先从第一部分说起,即单词和目标文档的相关性。这里相关性的基本思想依然是“词频”,也就是TF-IDF里面TF的部分。词频就是单词在目标文档中出现的次数。如果出现的次数比较多,一般就认为更相关。和TF-IDF不同,BM25最大的贡献之一就是挖掘出了词频和相关性之间的关系是非线性的,这是一个初看有违常理但细想又很有道理的洞察。
|
||||
|
||||
具体来说,每一个词对于文档相关性的分数不会超过一个特定的阈值。这个阈值当然是动态的,根据文档本身会有调整。这个特征就把BM25里的词频计算和一般的TF区分开了。也就是说,词频本身需要“标准化”(Normalization),要达到的效果是,某一个单词对最后分数的贡献不会随着词频的增加而无限增加。
|
||||
|
||||
那BM25里词频的标准化是怎么做的呢?就是某一个词的词频,除以这个词的词频加上一个权重。这个权重包含两个超参数(Hyper-parameter),这些超参数后期是可以根据情况手动调整的。这个做法在非监督的排序算法中很普遍。同时,这个权重还包括两个重要信息:第一,当前文档的长度;第二,整个数据集所有文档的平均长度。
|
||||
|
||||
这几个因素混合在一起,我们就得到了一个新的词频公式,既保证单词相对于文档的相关度和这个单词的词频呈现某种正向关系,又根据文档的相对长度,也就是原始长度和所有文档长度的一个比值关系,外加一些超参数,对词频进行了限制。
|
||||
|
||||
有了单词相对于文档的相关度计算公式作为基础,单词相对于查询关键字的相关度可以说是异曲同工。首先,我们需要计算单词在查询关键字中的词频。然后,对这个词频进行类似的标准化过程。
|
||||
|
||||
和文档的标准化过程唯一的区别,这里没有采用文档的长度。当然,对于查询关键字来说,如果需要使用长度,也应该是使用查询关键字的长度和平均长度。但是,根据BM25经典公式来说,这一部分并没有使用长度信息进行重新标准化。
|
||||
|
||||
接着我来谈谈最后一个部分,单词权重的细节,通常有两种选择。
|
||||
|
||||
**第一种选择就是直接采用某种变形的IDF来对单词加权**。一般来说,IDF就是利用对数函数(Log函数)对“文档频率”,也就是有多少文档包含某个单词信息进行变换。这里回顾一下周一讲的内容,IDF是“文档频率”的倒数,并且通过对数函数进行转换。如果在这里使用IDF的话,那么整个BM25就可以看作是一个某种意义下的TF-IDF,只不过TF的部分是一个复杂的基于文档和查询关键字、有两个部分的词频函数。
|
||||
|
||||
**第二种单词的权重选择叫作“罗伯逊-斯巴克-琼斯”权重(Robertson-Spärck-Jones),简称RSJ值**,是由计算机科学家斯蒂芬·罗伯逊和卡伦·琼斯合作发现。我们刚才讲过,这两位都是重要的信息检索学术权威。这个权重其实就是一个更加复杂版本的IDF。一个关键的区别是RSJ值需要一个监督信息,就是要看文档对于某个查询关键字是否相关,而IDF并不需要。
|
||||
|
||||
对比以上两种思路,在很多情况下,利用IDF来直接进行单词权重的版本更加普遍。如果在有监督信息的情况下,RSJ值也不失为一个很好的选择。
|
||||
|
||||
通过这里简单的介绍,我们可以很容易地发现,**BM25其实是一个经验公式**。这里面的每一个成分都是经过很多研究者的迭代而逐步发现的。很多研究在理论上对BM25进行了建模,从“概率相关模型”(Probabilistic Relevance Model)入手,推导出**BM25其实是对某一类概率相关模型的逼近**。对这一部分我在这里就不展开论述了。需要你记住的是,BM25虽然是经验公式,但是在实际使用中经常表现出惊人的好效果。因此,很有必要对这一类文档检索算法有所了解。
|
||||
|
||||
## BM25算法变种
|
||||
|
||||
由于BM25的情况,一方面是经验公式,另一方面是某种理论模型的逼近,这样就出现了各式各样的BM25变种。这里我仅仅介绍一些有代表性的扩展。
|
||||
|
||||
一个重要的扩展是**BM25F**,也就是在BM25的基础上再多个“域”(Field)文档上的计算。这里“域”的概念可以理解成一个文档的多个方面。比如,对于很多文档来说,文档包括标题、摘要和正文。这些组成部分都可以认为是不同的“域”。那么,如何结合不同的“域”,让文档的相关性能够统一到一个分数上就是BM25F的核心内容。
|
||||
|
||||
具体来说,BM25F对于BM25的扩展很直观。那就是每一个单词对于文档的相关性是把各个域当做一个“小文档”的加权平均。也就是说,我们先把每个域当做单独的文档,计算词频,进行标准化。然后集合每个域的值,进行加权平均,再乘以词的权重(我们上面提到了,用IDF或者是RSJ值)。
|
||||
|
||||
另外一个重要的扩展就是**把BM25和其他文档信息(非文字)结合起来**。这个想法是在“学习排序”(Learning To Rank)这一思路出现以前的一种普遍的做法,往往就是用线性加权的形式直接把各种信息相结合。例如,在21世纪初期比较流行的做法是用BM25和PageRank的线性结合来确定网页的相关度。这里面,BM25是和某个查询关键字有联系的信息,而PageRank则是一个网页的总体权重。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了文档检索领域或者说搜索领域里最基本的一个技术:BM25。我们可以看到,BM25由三个核心的概念组成,包括词在文档中相关度、词在查询关键字中的相关度以及词的权重。BM25是一个长期积累的经验公式,也有很深的理论支持,是一个强有力的非监督学习方法的文本排序算法。
|
||||
|
||||
一起来回顾下要点:第一,简要介绍了BM25的历史。第二,详细介绍了BM25算法的三个主要组成部分。第三,简要地介绍了BM25的一些变种 。
|
||||
|
||||
最后,给你留一个思考题,虽然BM25是非监督的排序方法,并且我们提到其中有一些超参数,那么是否可以通过机器学习的手段来学习到这些超参数的最佳取值呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/5c/08/5c89fe07fe0e5a5f1e4f8491ac592408.jpg" alt="" />
|
||||
|
||||
|
83
极客时间专栏/AI技术内参/搜索核心技术/033 | 经典搜索核心算法:语言模型及其变种.md
Normal file
83
极客时间专栏/AI技术内参/搜索核心技术/033 | 经典搜索核心算法:语言模型及其变种.md
Normal file
@@ -0,0 +1,83 @@
|
||||
<audio id="audio" title="033 | 经典搜索核心算法:语言模型及其变种" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/cc/01/ccaa8cbf0778dc5cbe96d2cc51b8bd01.mp3"></audio>
|
||||
|
||||
在信息检索和文本挖掘领域,我们之前已经讲过了TF-IDF算法和BM25算法。TF-IDF因其简单和实用常常成为很多信息检索任务的第一选择,BM25则以其坚实的经验公式成了很多工业界实际系统的重要基石。
|
||||
|
||||
然而,在信息检索研究者的心里,一直都在寻找一种既容易解释,又能自由扩展,并且在实际使用中效果显著的检索模型。这种情况一直到20世纪90年代末、21世纪初才得到了突破,一种叫“语言模型”(Language Model)的新模型得到发展。其后10多年的时间里,以语言模型为基础的各类变种可谓层出不穷,成了信息检索和搜索领域的重要研究方向。
|
||||
|
||||
今天我就来谈谈语言模型的历史,算法细节和语言模型的重要变种,帮助初学者快速掌握这一模型。
|
||||
|
||||
## 语言模型的历史
|
||||
|
||||
语言模型在信息检索中的应用开始于1998年的SIGIR大会(International ACM SIGIR Conference on Research and Development in Information Retrieval,国际信息检索大会)。来自马萨诸塞州大学阿姆赫斯特分校(UMass Amherst)的信息检索学者杰·庞特(Jay M. Ponte)和布鲁斯·夸夫特(W. Bruce Croft)发表了第一篇应用语言模型的论文,从此开启了一个新的时代。
|
||||
|
||||
布鲁斯是信息检索的学术权威。早年他在英国的剑桥大学获得博士学位,之后一直在马萨诸塞州大学阿姆赫斯特分校任教。他于2003年获得美国计算机协会ACM颁发的“杰拉德·索尔顿奖”,表彰他在信息检索领域所作出的突出贡献。另外,布鲁斯也是ACM院士。
|
||||
|
||||
从那篇论文发表之后,华人学者翟成祥对于语言模型的贡献也是当仁不让。他的博士论文就是系统性论述语言模型的平滑技术以及各类语言模型的深刻理论内涵。
|
||||
|
||||
翟成祥来自中国的南京大学计算机系,并于1984年、1987年和1990年分别获得南京大学的学士、硕士和博士学位,2002年他从美国卡内基梅隆大学计算机系的语言与信息技术研究所获得另外一个博士学位。
|
||||
|
||||
翟成祥曾经获得过2004年的美国国家科学基金会职业生涯奖(NSF CAREER Award)和2004年ACM SIGIR最佳论文奖。另外,2004年翟成祥还获得了著名的美国总统奖(PECASE,Presidential Early Career Award for Scientists and Engineers)。
|
||||
|
||||
## 语言模型详解
|
||||
|
||||
**语言模型的核心思想是希望用概率模型(Probabilistic Model)来描述查询关键字和目标文档之间的关系**。语言模型有很多的类型,最简单的、也是最基础的叫做“**查询关键字似然检索模型**”(Query Likelihood Retrieval Model)。下面我就来聊一聊这个模型的一些细节。
|
||||
|
||||
首先,我来描述什么是语言模型。简单来说,**一个语言模型就是一个针对词汇表的概率分布**。比如,词汇表总共有一万个英语单词,那么一个语言模型就是定义在这一万个单词上的离散概率分布。拿骰子来做类比,这里的骰子就有一万种可能性。
|
||||
|
||||
一旦语言模型的概念形成。“查询关键字似然检索模型”的下一步,就是认为查询关键字是从一个语言模型中“抽样”(Sample)得到的一个样本。什么意思呢? 就是说,和我们通常情况下从一个概率分布中抽样相同,“查询关键字似然检索模型”认为查询关键字是从这个语言模型的概率分布中进行采样,从而产生的一个随机过程。这一观点不仅是这个简单语言模型的假设,也是很多语言模型的核心假设。
|
||||
|
||||
我们假设这个语言模型,也就是这个概率分布的参数已知,那么,如何来对一个查询关键字打分(Scoring)就变成了计算在这个概率分布的情况下,一组事件,也就是这组词出现的**联合概率**。现实中,因为联合概率可能会很小,因此很多时候都通过一个**对数变换**来把概率的乘积变成概率对数的加和。
|
||||
|
||||
然而,现实情况是,我们事先并不知道这个语言模型的参数,这个信息一般来说是未知的。
|
||||
|
||||
要想确定这个语言模型的参数,我们**首先要确定语言模型的形态**。我刚才说过,语言模型本质上就是定义在词汇表上的离散概率分布。那么,这里就有几种经典的选择。首先,**我们可以选择“类别分布”(Categorical Distribution)函数**,也就是多项分布(Multinomial Distribution)去除排列组合信息。这也是最常见的语言模型的实现形式。
|
||||
|
||||
在类别分布的假设下,我们认为每一个单词都是从类别分布中采样得到的结果,而单词之间互相独立。那么,定义在一万个单词上的类别分布就有一万个参数。每个参数代表所对应的单词出现的概率,或者说可能性。当然,这个参数是未知的。
|
||||
|
||||
除了利用类别分布或者多项分布来对语言模型建模以外,其他的离散概率分布也都曾被提出来用作语言模型。比如,伯努利分布(Bernoulli Distribution)或者泊松分布(Poisson Distribution)。这些不同的假设我今天就不展开讲了。但是在实际应用中,其他概率分布假设的语言模型基本上都还属于纯研究状态。
|
||||
|
||||
还是回到刚才说的基于类别分布的语言模型。由于参数是未知的,那么问题的核心就变成了**如何估计这样的参数**,这里就回归到基本的统计参数估计的范畴。
|
||||
|
||||
因为类别分布是概率分布,在有观测数据的情况下(这个的观测数据就是现实中的文档和查询关键字),最直接的参数估计算法叫“**最大似然估计**”(Maximum Likelihood Estimation)。在这里我不展开这个算法的细节。
|
||||
|
||||
**最大似然估计的核心思路就是把参数估计问题变换成一个最大化的优化问题,从而通过求解这个优化问题来达到参数估计的目的**。在类别分布的假设下,最大似然估计的最优参数解,恰好有解析形式。
|
||||
|
||||
也就是说,在有数据的情况下,我们能够得到一个唯一的最优的参数估计。而且这个解非常直观,也就是每个单词出现的可能性,正好等于这个单词在目标文档中出现的次数,除以所有单词在目标文档中出现的次数。换句话说,每个单词的参数正好等于单词出现的频率。
|
||||
|
||||
这样的话,每个文档都对应一个类别分布。有多少个文档就有多少个类别分布,而且每个类别分布都可以从自己这个文档中求得所有的参数。
|
||||
|
||||
最大似然估计有一个很大的问题,那就是如果某一个单词没有在训练数据中出现过,那么这个单词的参数,根据上面的最优解,就是零。
|
||||
|
||||
什么意思呢?也就是说,在最大似然估计的情况下,没有出现过的单词的参数是零,然后模型认为这个词出现的可能性、或者概率就是零。这显然是一个非常悲观的估计。因为你可以认为,不管在任何情况下,就算一个单词没有出现过,但是出现的概率也不应该绝对是零。
|
||||
|
||||
那么,如何针对这些为“零”的概率估计,就成了语言模型研究和实践中的一个重要问题。一个通常的技术叫“**平滑**”(Smoothing)。这个技术的基本思想就是,给这些因为最大似然估计所产生的零值一些非零的估计值。**最简单的一个做法,其实也是很有效的一个做法,就是通过整个数据集的频率来做平滑**。
|
||||
|
||||
具体来说,就是对于每一个词,我们计算一个目标文档的频率,同时也计算一个全数据集的平率。然后这个单词的最终估计值,是这两个频率的一个加权平均。这个权重就成了另外一组超参数,可以动态调整。
|
||||
|
||||
**另外一个常见的平滑策略是借助贝叶斯统计推断(Bayesian Inference)的方法**。也就是说,为类别概率分布加上一个先验分布,通常是狄利克雷分布(Dirichlet Distribution),并且计算出某个单词在先验分布和数据都存在情况下的后验概率,我这里就不展开这个思路了。
|
||||
|
||||
在这里需要注意的是,经过研究人员发现,语言模型的平滑其实是不可或缺的。一方面是为了解决我们刚才提到的零概率估计问题;另一方面,经过一个代数变形,语言模型的平滑其实可以写成一个类似TF-IDF的形式。
|
||||
|
||||
于是,研究人员指出,这个平滑其实削减了过分流行词汇的概率,使最后的估计值并不完全只是由单词的多少而决定。我在之前介绍TF-IDF算法和BM25算法的时候,都分别提到了这个观点,那就是单词出现的多少和相关性的关系问题。从经验上看,这个关系一定是有一个阈值的。
|
||||
|
||||
## 语言模型变种
|
||||
|
||||
语言模型有很多类型的变种,我这里简单地提两个比较有代表的方向。
|
||||
|
||||
**一个方向就是我刚才说的不同类型的平滑策略**,比如,结合全数据集平滑和狄利克雷平滑。或者是先把文档分成一些聚类或者不同的类别(例如不同的话题),然后根据不同的类别或者话题进行平滑等等。
|
||||
|
||||
**另外一个方向其实就是在语言模型本身的的定义上做文章**。比如,在查询关键字似然检索模型里,我们假定有一个语言模型,查询关键字是这个模型的一个抽样。乍一看这很有道理,但是仔细一想,这个模型并没有明说目标文档和查询关键字之间的关系。目标文档进入视野完全是为了估计这个语言模型的参数,“相关性”这个概念并没有明确定义。
|
||||
|
||||
那么,另外一个主流的语言模型,就是认为有两个模型(分布)。查询关键字从一个分布中产生,目标文档从另外一个分布中产生,而这两个分布的距离,成为了相关性的定义。在这样的结构下,文档和查询关键字形成了一种对称的局面,而相关性也根据距离直接得到定义。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了文档检索领域或者说搜索技术里一个很有理论深度的技术:语言模型。我们可以看到,语言模型相对于TF-IDF以及BM25而言,其实更加直观,更好理解。语言模型也是一个强有力的非监督学习方法的文本排序算法。
|
||||
|
||||
一起来回顾下要点:第一,简要介绍了语言模型的历史。第二,详细介绍了简单语言模型,即“查询关键字似然检索模型”的主要组成部分。第三,简要地介绍了语言模型的两个变种方向。
|
||||
|
||||
最后,给你留一个思考题,如果根据语言模型,也就是概率分布函数的估计,无法得到我们之前提到的最优解析解的话,我们应该怎么求解语言模型的参数呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
67
极客时间专栏/AI技术内参/搜索核心技术/034 | 机器学习排序算法:单点法排序学习.md
Normal file
67
极客时间专栏/AI技术内参/搜索核心技术/034 | 机器学习排序算法:单点法排序学习.md
Normal file
@@ -0,0 +1,67 @@
|
||||
<audio id="audio" title="034 | 机器学习排序算法:单点法排序学习" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/45/12/4504a5a0383841059979fa999d4d3d12.mp3"></audio>
|
||||
|
||||
在专栏里我们已经讲解过最经典的信息检索技术。这些技术为2000年之前的搜索引擎提供了基本的算法支持。不管是TF-IDF、BM25还是语言模型(Language Model),这些方法和它们的各类变种在很多领域(不限文本)都还继续发挥着作用。
|
||||
|
||||
然而,自从机器学习的思想逐渐渗透到信息检索等领域之后,一个最直观的想法就是如何用机器学习来提升信息检索的性能水平。这个思想引领了2000年到2010年这个领域的研究,产生了各类基于机器学习的排序算法,也带来了搜索引擎技术的成熟和发展。
|
||||
|
||||
我今天就从最简单也是最实用的一类机器学习排序算法讲起,那就是单点法排序学习(Pointwise Learning to Rank)。这类方法在工业界非常实用,得到广泛应用,在实际效果中也表现得很强健(Robust)。同时,理解这类模型可以为后面学习复杂的排序算法打下基础。
|
||||
|
||||
## 单点法排序学习的历史
|
||||
|
||||
早在1992年,德国学者诺伯特·福尔(Norbert Fuhr)就在一篇论文中最早尝试了用机器学习来做搜索系统参数估计的方法。三年之前,他还发表过一篇利用“多项式回归”(Polynomial Regression)来做类似方法的论文。诺伯特因其在信息检索领域的长期贡献,于2012年获得美国计算机协会ACM颁发的“杰拉德·索尔顿奖”。
|
||||
|
||||
1992年,加州大学伯克利分校的一批学者在SIGIR上发表了一篇论文,文中使用了“对数几率”(Logistic Regression)分类器来对排序算法进行学习。可以说这篇论文是最早利用机器学习思维来解决排序算法学习的尝试。然而,由于机器学习和信息检索研究在当时都处于起步阶段,这些早期结果并不理想。
|
||||
|
||||
2000年之后支持向量机在工业界和学术界逐渐火热,随之,利用机器学习进行排序算法训练重新进入人们的视野。搜索引擎成了第一次互联网泡沫的重要阵地,各类搜索引擎公司都开始投入使用机器学习来提升搜索结果的精度。这股思潮开启了整整十年火热的机器学习排序算法的研究和开发。
|
||||
|
||||
## 单点法排序学习详解
|
||||
|
||||
要想理解单点法排序学习,首先要理解一些基本概念。这些基本概念可以帮助我们把一个排序问题转换成一个机器学习的问题设置,特别是监督学习的设置。
|
||||
|
||||
我之前介绍的传统搜索排序算法比如TF-IDF、BM25以及语言模型,都是无监督学习排序算法的典范,也就是算法本身事先并不知道哪些文档对于哪些关键字是“相关”的。这些算法其实就是“猜测”相关性的一个过程。因此,传统信息检索发展出一系列理论来知道算法对每一个“关键字和文档对”(Query-Document Pair)进行打分,寄希望这样的分数是反映相关性的。
|
||||
|
||||
然而,从现代机器学习的角度看,毫无疑问,这样的排序算法不是最优的,特别是当相关信息存在的时候,是可以直接用这些相关信息来帮助算法提升排序精度的。
|
||||
|
||||
**要想让训练排序算法成为监督学习,首先来看需要什么样的数据集**。我们要建模的对象是针对每一个查询关键字,对所有文档的一个配对。也就是说,每一个训练样本至少都要包含查询关键字和某个文档的信息。这样,针对这个训练样本,就可以利用相关度来定义样本的标签。
|
||||
|
||||
在极度简化的情况下,如果标签定义为,某个文档针对某个关键字是否相关,也就是二分标签,训练排序算法的问题就转换成了二分分类(Binary Classification)的问题。这样,任何现成的二分分类器,几乎都可以在不加更改的情况下直接用于训练排序算法。比如经典的“对数几率”分类器或者支持向量机都是很好的选择。
|
||||
|
||||
我们说这样的方法是“单点法排序学习”(Pointwise Learning to Rank)是因为每一个训练样本都仅仅是某一个查询关键字和某一个文档的配对。它们之间是否相关,完全不取决于其他任何文档,也不取决于其他关键字。也就是说,我们的学习算法是孤立地看待某个文档对于某个关键字是否相关,而不是关联地看待问题。显然,单点法排序学习是对现实的一个极大简化,但是对于训练排序算法来说是一个不错的起点。
|
||||
|
||||
**知道了如何构建一个训练集以后,我们来看一看测试集,重点来看如何评估排序算法的好坏**。测试集里的数据其实和训练集非常类似,也是“查询关键字和文档对”作为一个样本。标签也是这个“配对”的相关度信息。前面说了,如果这是一个二分的相关信息,那么评估排序算法其实也就变成了如何评估二分分类问题。
|
||||
|
||||
**对二分分类问题来说,有两个主要的评价指标:第一,精度(Precision)**,也就是说,在所有分类器已经判断是相关的文档中,究竟有多少是真正相关的;**第二,召回(Recall)**,即所有真正相关的文档究竟有多少被提取了出来。
|
||||
|
||||
因为是排序问题,和普通二分分类问题不太一样的是,这里就有一个**Top-K问题**。什么意思呢?就是说,针对某一个查询关键字,我们不是对所有的文档进行评估,而只针对排序之后的最顶部的K个文档进行评估。
|
||||
|
||||
在这样的语境下,精度和召回都是定义在这个K的基础上的。要是没有这个K的限制,在全部数据情况下,精度和召回都退回到了“准确度”,这个最基本的分类问题的评估测量情形。
|
||||
|
||||
在实际的应用中,K的取值往往是很小的,比如3、5、10或者25,而可能被评分的文档的数量是巨大的,理论上来说,任何一个文档对于任何一个查询关键字来说都有可能是潜在相关对象。所以,在评价排序算法的时候,这个K是至关重要的简化问题的方法。
|
||||
|
||||
**除了精度和召回以外,信息检索界还习惯用F1值对排序算法进行评估**。简单来说,F1值就是精度和召回“和谐平均”(Harmonic Mean)的取值。也就是说,F1结合了精度和召回,并且给出了一个唯一的数值来平衡这两个指标。需要指出的是,在很多实际情况中,精度和召回是类似于“鱼与熊掌不可兼得”的一组指标。所以,F1值的出现让平衡这两个有可能产生冲突的指标变得更加方便。
|
||||
|
||||
刚才我说的评估主要是基于二分的相关信息来说的。而相关的标签信息其实可以定义为更加丰富的多元相关信息。比如,针对某一个查询关键字,我们不再只关心某个文档是否相关,而是给出一个相关程度的打分,从“最相关”、“相关”、“不能确定”到“不相关”、“最不相关”,一共五级定义。在这种定义下,至少衍生出了另外两个评价排序算法的方法。
|
||||
|
||||
**我们可以使用多类分类(Multi-Class Classification)的评价方法,也就是把五级相关度当做五种不同的标签,来看分类器的分类准确度**。当然,这样的评价方式对于排序来说是有问题的。因为,对于一个实际的数据集来说,五种相关类型所对应的数据量是不同的。
|
||||
|
||||
一般来说,“最相关”和“相关”的文档数量,不管是针对某个查询关键字还是从总体上来看,都是比较少的,而“不相关”和“最不相关”的文档是大量的。因此,单单看分类准确度,很可能会得出不恰当的结果。
|
||||
|
||||
比如说,某个排序算法能够通过分类的手段把大量的“最不相关”和“不相关”的文档分类正确,而可能错失了所有的“最相关”文档。即便从总的分类准确度来说,这样的算法可能还“看得过去”,但实际上这样的算法并没有任何价值。所以,从多类分类的角度来评价排序算法是不完整的。
|
||||
|
||||
针对这样的情况,研究者们设计出了**基于五级定义的排序评价方法:NDCG(Normalized Discounted Cumulative Gain)**。在这里针对NDCG我就不展开讨论了,你只需要知道NDCG不是一个分类的准确度评价指标,而是一个排序的精度指标。
|
||||
|
||||
NDCG这个指标的假设是,在一个排序结果里,相关信息要比不相关信息排得更高,而最相关信息需要排在最上面,最不相关信息排在最下面。任何排序结果一旦偏离了这样的假设,就会受到“扣分”或者说是“惩罚”。
|
||||
|
||||
需要特别指出的是,我们这里讨论的NDCG仅仅是针对测试集的一个排序评价指标。我们的排序算法依然可以在训练集上从五级相关度上训练多类分类器。仅仅是在测试集上,采用了不同的方法来评价我们的多类分类器结果,而不是采用传统的分类准确度。从某种意义上来说,这里的NDCG其实就起到了“**模型选择**”(Model Selection)的作用。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了单点法排序学习。可以看到,整个问题的设置已经与传统的文字搜索技术有了本质的区别 。
|
||||
|
||||
一起来回顾下要点:第一,单点法排序学习起步于20世纪90年代,直到2000年后才出现了更多有显著效果的研究。第二,详细介绍了单点法排序学习的问题设置,包括训练集、测试集以及测试环境。
|
||||
|
||||
最后,给你留一个思考题,有没有什么方法可以把我们之前讨论的TF-IDF、BM25和语言模型,这些传统的排序算法和单点法排序学习结合起来?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
66
极客时间专栏/AI技术内参/搜索核心技术/035 | 机器学习排序算法:配对法排序学习.md
Normal file
66
极客时间专栏/AI技术内参/搜索核心技术/035 | 机器学习排序算法:配对法排序学习.md
Normal file
@@ -0,0 +1,66 @@
|
||||
<audio id="audio" title="035 | 机器学习排序算法:配对法排序学习" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/49/07/4992c44bb60f82007b29cf5f0ac15a07.mp3"></audio>
|
||||
|
||||
周一的文章里我分享了最基本的单点法排序学习(Pointwise Learning to Rank)。这个思路简单实用,是把经典的信息检索问题转化为机器学习问题的第一个关键步骤。简单回顾一下,我们介绍了在测试集里使用NDCG(Normalized Discounted Cumulative Gain),在某个K的位置评价“精度”(Precision)和“召回”(Recall),以这些形式来评估排序算法。
|
||||
|
||||
你可以看到,单点法排序学习算法的模式和我们最终需要的结果中间还存在明显差距。这个差距并不是算法好坏能够决定的,而是算法所要优化的目标,也就是单个数据点是否相关,和我们的最终目的,一组结果的NDCG排序最优之间的结构化区别。这个结构化区别激发研究者们不断思考,是不是有其他的方法来优化排序算法。
|
||||
|
||||
今天我就来讲从单点法引申出来的“配对法”排序学习(Pairwise Learning to Rank) 。相对于尝试学习每一个样本是否相关,配对法的基本思路是对样本进行两两比较,从比较中学习排序,离真正目标又近了一步。
|
||||
|
||||
## 配对法排序学习的历史
|
||||
|
||||
当人们意识到用机器学习来对排序进行学习,从文档与文档之间的相对关系入手,也就是配对法,就成了一个非常火热的研究方向。机器学习排序这个领域持续活跃了10多年,在此期间很多配对法排序算法被提出,下面我就说几个非常热门的算法。
|
||||
|
||||
2000年左右,研究人员开始利用支持向量机(SVM)来训练排序算法,来自康奈尔的索斯藤·乔基姆斯(Thorsten Joachims)就构建了基于特征差值的**RankSVM**,一度成为配对法排序学习的经典算法。索斯藤我们前面讲过,他获得了今年的KDD时间检验奖。
|
||||
|
||||
2005年,当时在雅虎任职的研究人员郑朝晖等人,开始尝试用**GBDT**(Gradient Boosting Decision Tree,梯度提升决策树)这样的树模型来对文档之间的两两关系进行建模。郑朝晖后来成为一点资讯的联合创始人。
|
||||
|
||||
2005年,微软的学者克里斯·博格斯(Chris Burges)等人,开始使用神经网络训练**RankNet**文档之间两两关系的排序模型。这是最早使用深度学习模型进行工业级应用的尝试。这篇论文在2015年获得了ICML 2015(International Conference on Machine Learning,国际机器学习大会)的10年“经典论文奖”。
|
||||
|
||||
## 配对法排序学习详解
|
||||
|
||||
在介绍配对法排序学习的中心思路之前,我们先来重温一下测试集的测试原理。总体来说,测试的原理和单点法一样,都是要考察测试集上,对于某一个查询关键字来说,某一组文档所组成的排序是否是最优的。
|
||||
|
||||
比如,对于某一个查询关键字,我们针对排序产生的“顶部的K”个文档进行评估,首先查看精度(Precision),即在所有算法已经判断是相关的文档中,究竟有多少是真正相关的;其次看召回(Recall),即所有真正相关的文档究竟有多少被提取了出来。当然,还有F1值,也就是精度和召回“和谐平均”(Harmonic Mean)的取值,一个平衡精度和召回的重要指标。需要再次说明的是, 精度、召回以及F1值都是在二元相关信息的标签基础上定义的。
|
||||
|
||||
如果需要利用五级相关信息定义,也就是通常所说的“最相关”、“相关”、“不能确定”到“不相关”、“最不相关”,那么就需要用类似于NDCG这样的评价指标。NDCG的假设是,在一个排序结果里,相关信息要比不相关信息排得更高,最相关信息需要排在最上面,最不相关信息需要排在最下面。任何排序结果一旦偏离了这样的假设,就会受到“扣分”或者“惩罚”。
|
||||
|
||||
在清楚了测试集的情况后,再回过头来看一看训练集的设置问题。在今天文章一开篇的时候,我就提到了单点法对于排序学习的“目标不明确”的问题。其实从NDCG的角度来看也好,基于顶部K的精度或者召回的角度来看也好,都可以看出,**对于一个查询关键字来说,最重要的其实不是针对某一个文档的相关性是否估计得准确,而是要能够正确估计一组文档之间的“相对关系”**。只要相对关系估计正确了,那么从排序这个角度来说,最后的结果也就准确了。理解这一个观点,对于深入理解排序和普通的分类之间的区别至关重要。
|
||||
|
||||
那么,如何从单点建模再进一步呢?
|
||||
|
||||
很显然,在排序关系中,一个关键关系就是每两个文档之间的比较,也就是我们通常所说的两两关系。试想一下,如果针对某一个查询关键字而言,有一个完美的排序关系,然后通过这个完美的排序关系,可以推导出文档之间的两两相对关系,再从这些相对关系中进行学习,从而可以进一步对其他查询关键字进行排序。
|
||||
|
||||
注意,**在这样的架构下,训练集的样本从每一个“关键字文档对”变成了“关键字文档文档配对”**。也就是说,每一个数据样本其实是一个比较关系。试想,有三个文档:A、B和C。完美的排序是“B>C>A”。我们希望通过学习两两关系“B>C”、“B>A”和“C>A”来重构“B>C>A”。
|
||||
|
||||
这里面有几个非常关键的假设。
|
||||
|
||||
**第一,我们可以针对某一个关键字得到一个完美的排序关系**。在实际操作中,这个关系可以通过五级相关标签来获得,也可以通过其他信息获得,比如点击率等信息。然而,这个完美的排序关系并不是永远都存在的。试想在电子商务网站中,对于查询关键字“哈利波特”,有的用户希望购买书籍,有的用户则希望购买含有哈利波特图案的T恤,显然,这里面就不存在一个完美排序。
|
||||
|
||||
**第二,我们寄希望能够学习文档之间的两两配对关系从而“重构”这个完美排序**。然而,这也不是一个有“保证”的思路。用刚才的例子,希望学习两两关系“B>C”、“B>A”和“C>A”来重构完美排序“B>C>A”。然而,实际中,这三个两两关系之间是独立的。特别是在预测的时候,即使模型能够正确判断“B>C”和“C>A”,也不代表模型就一定能得到“B>A”。注意,这里的关键是“一定”,也就是模型有可能得到也有可能得不到。两两配对关系不能“一定”得到完美排序,这个结论其实就揭示了这种方法的不一致性。也就是说,我们并不能真正保证可以得到最优的排序。
|
||||
|
||||
**第三,我们能够构建样本来描述这样的两两相对的比较关系**。一个相对比较简单的情况,认为文档之间的两两关系来自于文档特征(Feature)之间的差异。也就是说,可以利用样本之间特征的差值当做新的特征,从而学习到差值到相关性差异这样的一组对应关系。
|
||||
|
||||
我前面提到的RankSVM就是这样的思路。RankSVM从本质上来说其实还是SVM,也就是支持向量机,只不过建模的对象从单一文档变成了文档的配对。更加复杂的模型,比如GBRank,就是通过树的聚合模型GBDT来对文档之间的关系直接建模,希望通过函数值的差值来表达文档的相关性差异。
|
||||
|
||||
需要注意的是,**配对法排序学习特别是在测试集预测的时候,可能会有计算复杂度的问题**。因为原则上,必须要对所有的两两关系都进行预测。现实中,如果是基于线性特征的差值来进行样本构造的话,那么测试还可以回归到线性复杂度的情况。而用其他方法,就没那么幸运了。有很多计算提速或者是逼近算法为两两比较排序在实际应用中提供了可能性。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了文档检索领域基于机器学习的配对法排序学习。你可以看到,和单点法一样,整个问题的设置和传统的文字搜索技术有本质的区别,但在对文档之间关系的建模上,又比单点法前进了一大步 。
|
||||
|
||||
一起来回顾下要点:第一,在火热的机器学习排序研究中,提出了很多配对法排序算法,比如RankSVM、GBDT和RankNet。第二,配对法排序学习测试集的测试原理和单点法一致,我们可以查看精度、召回和F1值,或者利用五级相关信息。第三,针对单点法对于排序学习的“目标不明确”问题,配对法排序学习有不一样的训练集设置,在这个基础上,我介绍了三个关键假设。
|
||||
|
||||
最后,给你留一个思考题,有没有什么办法可以把单点法和配对法结合起来呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
**参考文献**
|
||||
|
||||
<li>
|
||||
Zhaohui Zheng, Keke Chen, Gordon Sun, and Hongyuan Zha. A regression framework for learning ranking functions using relative relevance judgments. **Proceedings of the 30th annual international ACM SIGIR conference on research and development in information retrieval**, 287-294,2007.
|
||||
</li>
|
||||
<li>
|
||||
Thorsten Joachims. Optimizing search engines using clickthrough data. **Proceedings of the eighth ACM SIGKDD international conference on knowledge discovery and data mining**,133-142,2002.
|
||||
</li>
|
||||
|
||||
|
97
极客时间专栏/AI技术内参/搜索核心技术/036 | 机器学习排序算法:列表法排序学习.md
Normal file
97
极客时间专栏/AI技术内参/搜索核心技术/036 | 机器学习排序算法:列表法排序学习.md
Normal file
@@ -0,0 +1,97 @@
|
||||
<audio id="audio" title="036 | 机器学习排序算法:列表法排序学习" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/c7/49/c774d699d7d43f2a03832b07f4f6e249.mp3"></audio>
|
||||
|
||||
本周我们已经分别讨论了最基本的单点法排序学习(Pointwise Learning to Rank)和配对法排序学习(Pairwise Learning to Rank)两种思路。单点法排序学习思路简单实用,目的就是把经典的信息检索问题转化成机器学习问题。配对法排序学习则是把排序的问题转化成针对某个查询关键字每两个文档之间的相对相关性的建模问题。不过,这两种思路也都有很明显的问题,需要进一步对算法进行优化,以实现我们需要的最终目标。
|
||||
|
||||
今天我就来讲直接优化排序问题的“终极方法”:列表法排序学习(Listwise Learning to Rank) 。相对于尝试学习每一个样本是否相关或者两个文档的相对比较关系,列表法排序学习的基本思路是尝试直接优化像NDCG(Normalized Discounted Cumulative Gain)这样的指标,从而能够学习到最佳排序结果。
|
||||
|
||||
## 列表法排序学习的历史
|
||||
|
||||
2000年后,学术界和工业界都开始研究如何用机器学习来解决最优排序问题,五六年之后,研究者们才开始尝试直接优化整个排序列表。
|
||||
|
||||
这方面的研究工作很多都来自微软研究院。比如2007年左右的AdaRank,就来自微软亚洲研究院的徐君和李航。这篇论文算是较早提出列表法排序观点的研究工作。同一年在国际机器学习大会ICML 2007(International Conference on Machine Learning)上发表的ListNet算是从理论上开启了列表法的大门。这篇论文也来自微软亚洲研究院,是刘铁岩等人的重要工作。类似的研究工作在这一年里如雨后春笋般涌现。
|
||||
|
||||
另外一个方向,接下来我会提到,LambdaRank出现稍早,而LambdaMART则稍微晚一点。这方面的工作是在微软西雅图的研究院开发的。主导人是克里斯托弗·博格斯(Christopher J.C. Burges)。博格斯2016年退休,在微软工作了16年,可以说,他领导的团队发明了微软的搜索引擎Bing的算法。
|
||||
|
||||
## 列表法排序学习详解
|
||||
|
||||
列表法排序学习有两种基本思路。**第一种,就是直接针对NDCG这样的指标进行优化**。目的简单明了,用什么做衡量标准,就优化什么目标。**第二种,则是根据一个已经知道的最优排序,尝试重建这个顺序,然后来衡量这中间的差异**。
|
||||
|
||||
我先来说一下第一大思路,直接针对NDCG这样的指标进行优化。
|
||||
|
||||
首先,重温一下排序测试集的测试原理。总体来说,所有的基于排序的指标都要考察测试集上,对于某一个查询关键字来说,某一组文档所组成的排序是否是最优的。有两种比较通用的做法。第一个方法主要适用于二分的相关信息,对于某一个查询关键字,针对排序产生的“顶部的K”个文档进行评估,查看精度(Precision)、召回(Recall)等。第二种方法,利用五级相关信息定义,在这样的情况下,就可以利用类似于NDCG这样的评价指标。具体解读你可以回到本周前面两期我们讲解过的内容进行复习。
|
||||
|
||||
那么,**直接优化排序指标的难点和核心在什么地方呢?**
|
||||
|
||||
难点在于,希望能够优化NDCG指标这样的“理想”很美好,但是现实却很残酷。NDCG以及我之前说过的基于“顶部的K”的精度,都是在数学的形式上的“非连续”(Non-Continuous )和“非可微分”(Non-Differentiable)。而绝大多数的优化算法都是基于“连续”(Continuous )和“可微分” (Differentiable)函数的。因此,直接优化难度比较大。
|
||||
|
||||
针对这种情况,主要有这么几种方法。
|
||||
|
||||
**第一种方法是,既然直接优化有难度,那就找一个近似NDCG的另外一种指标**。而这种替代的指标是“连续”和“可微分”的 。只要我们建立这个替代指标和NDCG之间的近似关系,那么就能够通过优化这个替代指标达到逼近优化NDCG的目的。这类的代表性算法的有SoftRank和AppRank。
|
||||
|
||||
**第二种方法是,尝试从数学的形式上写出一个NDCG等指标的“边界”**(Bound),然后优化这个边界。比如,如果推导出一个上界,那就可以通过最小化这个上界来优化NDCG。这类的代表性算法有SVM-MAP和SVM-NDCG。
|
||||
|
||||
**第三种方法则是,希望从优化算法上下手,看是否能够设计出复杂的优化算法来达到优化NDCG等指标的目的**。对于这类算法来说,算法要求的目标函数可以是“非连续”和“非可微分”的。这类的代表性算法有AdaRank和RankGP。
|
||||
|
||||
说完了第一大思路后,我们再来看看第二大思路。这种思路的主要假设是,已经知道了针对某个搜索关键字的完美排序,那么怎么通过学习算法来逼近这个完美排序。**我们希望缩小预测排序和完美排序之间的差距**。值得注意的是,在这种思路的讨论中,优化NDCG等排序的指标并不是主要目的。这里面的代表有ListNet 和ListMLE。
|
||||
|
||||
讲了这两大思路以后,最后我再来提一下第三类思路。**这类思路的特点是在纯列表法和配对法之间寻求一种中间解法**。具体来说,这类思路的核心思想,是从NDCG等指标中受到启发,设计出一种替代的目标函数。这一步还和我刚才介绍的第一大思路中的第一个方向有异曲同工之妙,都是希望能够找到替代品。
|
||||
|
||||
这第三类思路更进一步的则是**找到替代品以后,把直接优化列表的想法退化成优化某种配对**。这第二步就更进一步简化了问题。这个方向的代表方法就是微软发明的LambdaRank以及后来的LambdaMART。微软发明的这个系列算法成了微软的搜索引擎Bing的核心算法之一。
|
||||
|
||||
我这里简单提一下LambdaRank这个系列模型的基本思想。
|
||||
|
||||
首先,微软的学者们注意到,一个排序算法是否达到最优的情况,简单来看,就是查看当前的排序中,相比于最优的情况,有哪些两两文档的关系搞错了。**学习最优排序的问题就被转化成了减小这些两两排错的关系**。更进一步,在设计这个优化过程中,我们其实并不需要知道真正的目标函数的形式,而仅仅需要某种形式的梯度(Gradient)。
|
||||
|
||||
这里有这样一个洞察,对于绝大多数的优化过程来说,目标函数很多时候仅仅是为了推导梯度而存在的。而如果我们直接就得到了梯度,那自然就不需要目标函数了。最后,通过实验,微软的学者们把这个NDCG通过梯度变化的差值再乘以这个梯度,这样就达到了增强效果的目的。
|
||||
|
||||
早期的LambdaRank,特别是RankNet是采用了神经网络来进行模型训练,而LambdaMART则采用了“集成决策树”的思想,更换到了基于决策树的方法。**后来实践证明,基于决策树的方法对于排序问题非常有效果,也就成了很多类似方法的标准配置**。
|
||||
|
||||
最后,有一点需要你注意,我们讨论了不同的列表法思路,列表法从理论上和研究情况来看,都是比较理想的排序学习方法。因为列表法尝试统一排序学习的测试指标和学习目标。尽管在学术研究中,纯列表法表现优异,但是**在实际中,类似于LambdaRank这类思路,也就是基于配对法和列表法之间的混合方法更受欢迎**。因为从总体上看,列表法的运算复杂度都比较高,而在工业级的实际应用中,真正的优势并不是特别大,因此列表法的主要贡献目前还多是学术价值。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了列表法排序学习。你可以看到,列表法排序有很多种思路,在2000年到2010年之间是一个非常活跃的研究领域,积累了大量的成果。
|
||||
|
||||
一起来回顾下要点:第一,简要介绍了列表法排序学习的历史。第二,详细介绍了列表法排序学习的三大思路以及每个思路里的主要细节和方法。
|
||||
|
||||
最后,给你留一个思考题,列表法是不是就完全解决了排序算法的问题呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
**参考文献**
|
||||
|
||||
<li>
|
||||
Jun Xu and Hang Li. AdaRank: a boosting algorithm for information retrieval. **Proceedings of the 30th annual international ACM SIGIR conference on research and development in information retrieval**, 391-398,2007.
|
||||
</li>
|
||||
<li>
|
||||
Zhe Cao, Tao Qin, Tie-Yan Liu, Ming-Feng Tsai, Hang Li. Learning to rank: from pairwise approach to listwise approach. **ICML**, 129-136, 2017.
|
||||
</li>
|
||||
<li>
|
||||
Q. Wu, C.J.C. Burges, K. Svore and J. Gao. Adapting boosting for information retrieval measures. **Journal of Information Retrieval**, 2007.
|
||||
</li>
|
||||
<li>
|
||||
C.J.C. Burges, R. Ragno and Q.V. Le. Learning to rank with non-smooth cost functions. **Advances in Neural Information Processing Systems**, 2006.
|
||||
</li>
|
||||
<li>
|
||||
C.J.C. Burges, T. Shaked, E. Renshaw, A. Lazier, M. Deeds, N. Hamilton and G. Hullender. Learning to rank using gradient descent. **Proceedings of the twenty second international conference on machine learning**, 2005.
|
||||
</li>
|
||||
<li>
|
||||
F. Xia, T.-Y. Liu, J. Wang, W. Zhang, and H. Li. Listwise approach to learning to rank — Theorem and algorithm. **ICML**, 1192–1199, 2008.
|
||||
</li>
|
||||
<li>
|
||||
S. Chakrabarti, R. Khanna, U. Sawant, and C. Bhattacharyya. Structured learning for non-smooth ranking losses. **SIGKDD**, 88–96, 2008.
|
||||
</li>
|
||||
<li>
|
||||
T. Qin, T.-Y. Liu, and H. Li. A general approximation framework for direct optimization of information retrieval measures.**Technical Report, Microsoft Research**, MSR-TR-2008-164, 2008.
|
||||
</li>
|
||||
<li>
|
||||
M. Taylor, J. Guiver, S. Robertson, and T. Minka. SoftRank: Optimising non-smooth rank metrics. **WSDM**, 77–86, 2008.
|
||||
</li>
|
||||
<li>
|
||||
J.-Y. Yeh and J.-Y. Lin, and etc. Learning to rank for information retrieval using genetic programming. **SIGIR 2007 Workshop in Learning to Rank for Information Retrieval**, 2007.
|
||||
</li>
|
||||
<li>
|
||||
Y. Yue, T. Finley, F. Radlinski, and T. Joachims. A support vector method for optimizing average precision. **SIGIR**, 271–278, 2007.
|
||||
</li>
|
||||
|
||||
|
83
极客时间专栏/AI技术内参/搜索核心技术/037 | “查询关键字理解”三部曲之分类.md
Normal file
83
极客时间专栏/AI技术内参/搜索核心技术/037 | “查询关键字理解”三部曲之分类.md
Normal file
@@ -0,0 +1,83 @@
|
||||
<audio id="audio" title="037 | “查询关键字理解”三部曲之分类" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/5f/61/5fce7a1bccc23027c9b48bb951583161.mp3"></audio>
|
||||
|
||||
我们在前两周的专栏里主要讲解了最经典的信息检索(Information Retrieval)技术和基于机器学习的排序算法(Learning to Rank)。
|
||||
|
||||
经典的信息检索技术为2000年之前的搜索引擎提供了基本的算法支持。从中衍生出的TF-IDF、BM25还有语言模型(Language Model)以及这些方法的各类变种都还在很多领域(不限文本)里继续发挥着作用。
|
||||
|
||||
另一方面,排序学习算法引领了2000年到2010年各类基于机器学习的搜索算法的产生和发展,也带来了搜索引擎技术的进一步成熟。
|
||||
|
||||
这周我们从排序算法转移到排序问题中一个非常重要的部分:查询关键字理解(Query Understanding)。也就是说,我们希望通过查询关键字来了解用户种种行为背后的目的。查询关键字产生的特征(Feature)往往是很强的指导因素,也是个性化搜索结果非常重要的源泉。因此,深入了解并掌握查询关键字理解方面的技术就变得很有必要。
|
||||
|
||||
**查询关键字理解最基本的一个步骤就是给查询关键字分类(Classification),看这些查询关键字有什么用户意图(Intent)**。今天我就来聊一聊查询关键字分类的一些基本概念和技术,让你对这方面的开发和研究有一个基本认识。
|
||||
|
||||
## 查询关键字分类的历史
|
||||
|
||||
从商业搜索引擎开始面世的第一天起,人们就发现,可以从查询关键字中得到很多用户的信息,特别是理解用户的意图。早在1997年,商业搜索引擎Excite就开始了百万级别查询关键字的研究工作。然而,真正对查询关键字分类进行系统阐述的是安德烈·布罗德(Andrei Broder)的论文《网页搜索分类》(A Taxonomy of Web Search)。
|
||||
|
||||
安德烈很有名头,在斯坦福大学攻读博士期间师从图灵奖得主高德纳(Donald Knuth),然后在曾经名噪一时的第一代搜索引擎公司AltaVista(后被雅虎收购)担任首席科学家,之后加入位于纽约的IBM研究院组建企业级搜索平台,2012年后加入Google,担任杰出科学家(Distinguished Scientist)。他还是ACM(Association of Computing Machinery,计算机协会)和IEEE(Institute of Electrical and Electronics Engineers,电气电子工程师学会)的双料院士。
|
||||
|
||||
安德烈的这篇论文可以说是奠定了查询关键字分类的坚实基础。这之后研究人员的很多工作都是围绕着如何自动化分类、如何定义更加精细的用户意图来展开的。
|
||||
|
||||
## 查询关键字分类详解
|
||||
|
||||
我就从安德烈这篇非常有名的文章说起。在网络搜索(Web Search)成为比较主流的咨询查询手段之前,传统的信息检索认为,查询的主要目的是完成一个抽象的“信息需求”(Information Needs)。在传统信息检索的世界里,最主要的应用应该是图书馆检索或者政府学校等企事业单位的检索。因此,在这样的场景下,假定每一个查询主要是满足某个“信息需求”就显得很有道理了。
|
||||
|
||||
然而,早在2002年,安德烈就认为这样的传统假定已经不适合网络时代了。他开始把查询关键字所代表的目的划分为三个大类:
|
||||
|
||||
<li>
|
||||
导航目的(Navigational);
|
||||
</li>
|
||||
<li>
|
||||
信息目的(Informational);
|
||||
</li>
|
||||
<li>
|
||||
交易目的(Transactional)。
|
||||
</li>
|
||||
|
||||
此后十多年里,查询关键字的这三大分类都是这个方向研究和实践的基石。我们先来看这个分类的内涵。
|
||||
|
||||
**第一类,以导航为意图的查询关键字,这类查询关键字的目标是达到某个网站**。这有可能是用户以前访问过这个网站,或者是用户假设有这么一个关于所提交查询关键字的网站。这一类查询关键字包括公司的名字(如“微软”)、人的名字(如“奥巴马”)或者某个服务的名字(如“联邦快递”)等。
|
||||
|
||||
此类查询关键字的一个重要特点就是,在大多数情况下,这些查询关键字都对应唯一的或者很少的“标准答案”网站。比如,搜索“微软公司”,希望能够找到的就是微软公司的官方网站。另一方面是说,某些“信息集成”网站也是可以接受的“答案”。比如,查询“奥巴马”,搜索返回的结果是一个列举了所有美国总统的网站。
|
||||
|
||||
**第二类,以信息为意图的查询关键字,这类查询关键字的目标是搜集信息**。这一类的查询和传统的信息检索非常接近。值得提及的是,从后面的研究结论来看,这一类查询关键字所包含的目标不仅仅是寻找到某类权威性质(Authority)的网页,还包括列举权威信息的俗称“结点”(Hub)的网站。
|
||||
|
||||
**第三类,以交易为意图的查询关键字,这类查询关键字的目标是到达一个中间站点从而进一步完成“交易”(Transaction)**。这一类查询关键字的主要对象就是“购物”。现在我们对“电子商务”的态度可以说是非常自然了,但是十多年前,在传统信息检索界统治的搜索研究领域,提出“交易”类型的查询关键字可以说是很有新意的。
|
||||
|
||||
当然,这样的分类如果仅仅是概念上的区分那就没有太大的意义。安德烈利用搜索引擎AltaVista进行了一次调查研究,这次调查有大约3千多的用户反馈。想到这是在2001年的调查,可以说已经是大规模的研究了。
|
||||
|
||||
这次调研的结果是这样的:在用户提交的信息中,导航类型的查询关键字占26%,交易类型的查询关键字占到了24%,而剩下的将近50%是信息类型的查询关键字,用户的日志(Log)分析进一步证实了这一数据。
|
||||
|
||||
你可以看到,**这种把查询关键字进行分类的研究是对用户行为进行建模的必要步骤**。于是,很快就有不少研究人员嗅到了查询关键字分类的价值。然而,完全依靠用户直接反馈来获取这类信息则变得越发困难。
|
||||
|
||||
这里主要有三个原因。第一,不可能寄希望于用户汇报自己所有关键字的意图;第二,面对亿万用户输入的查询关键字,手工标注也是不可能的;最后,安德烈的三类分类还是太粗犷了,在实际应用中希望得到更加细颗粒度的用户意图。
|
||||
|
||||
把查询关键字分类问题转换成为标准的机器学习任务其实很直观。确切地说,这里需要做的是**把查询关键字分类转换成为监督学习任务**。这里,每一个查询关键字,就是一个数据样本,而响应变量,则是对应的类别。具体情况取决于我们的任务是仅仅把查询关键字分为几个类别,并且认为这些类别之间是互相独立的,还是认为这些类别是可以同时存在的。
|
||||
|
||||
在最简单的假设下,查询关键字分类就是一个普通的**多类分类问题**,可以使用普适的多类分类器,比如支持向量机(SVM)、随机森林(Random Forest)以及神经网络(Neural Networks)等来解决这类问题。
|
||||
|
||||
**对于绝大多数监督学习任务而言,最重要的一个组成部分就是选取特征**。随后很多年的研究开发工作中,有一部分就集中在尝试使用不同的特征,然后来看对提高分类的精度是否有效果。
|
||||
|
||||
过去的研究反复证明,以下几类特征非常有效。
|
||||
|
||||
**第一类特征就是查询关键字本身的信息**。比如,查询关键字中已经包括了已知的人名或者公司名,这种时候,分类结果就不太可能是交易意图的类别。也就是说,查询关键字,特别是某些词或者词组和类别有某种关联信息,而这种关联很大程度上能被直接反映出来。
|
||||
|
||||
**第二类特征是搜索引擎返回的查询关键字相关的页面本身的信息**。你可以想象一下,假如搜索“奥巴马”这个关键字,返回的页面都是维基百科的页面以及奥巴马基金会的页面,那么这些页面上面的内容可能很难包含任何商业的购买信息。而对于“佳能相机”这个查询关键字而言,返回的页面很可能都是电子商务网站的商品信息,从而能够更加准确地判断“佳能相机”的分类。
|
||||
|
||||
**第三类特征则是用户的行为信息,那就是用户在输入查询关键字以后会点击什么网站,会在哪些网站停留**。一般来说,哪些网站点击率高、停留时间长,就表明这些网站在返回结果中可能更相关。于是,采用这些网站来作为查询关键字所代表的内容,就可能更加靠谱。
|
||||
|
||||
在实际的应用中,查询关键字的分类往往还是有很大难度的。因为在普通的现代搜索引擎上,每天可能有三分之一、甚至更多的关键字是之前没有出现过的。因此,如何处理从来没有出现过的关键字、如何处理长尾中的低频关键字,就成了让搜索结果的精度再上一个台阶的重要因素。我今天就不展开相应的话题了,如果你有兴趣,可以查看相关论文。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了现代搜索技术中一个非常基础但是也在实际应用中至关重要的环节,那就是查询关键字理解中的用户意图分类问题。你可以看到**查询关键字从大类上分为信息意图、交易意图以及导航意图三类**。
|
||||
|
||||
一起来回顾下要点:第一,简要介绍了查询关键字分类提出的历史背景,安德烈·布罗德的论文奠定了查询关键字分类的坚实基础。第二,详细介绍了主要的分类以及如何通过多类分类器的构建来达到自动化的目的。
|
||||
|
||||
最后,给你留一个思考题,在机器学习排序算法中,我们应该如何使用查询关键字分类的结果呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
**拓展阅读**:[A taxonomy of web search](https://www.cis.upenn.edu/~nenkova/Courses/cis430/p3-broder.pdf)
|
||||
|
||||
|
70
极客时间专栏/AI技术内参/搜索核心技术/038 | “查询关键字理解”三部曲之解析.md
Normal file
70
极客时间专栏/AI技术内参/搜索核心技术/038 | “查询关键字理解”三部曲之解析.md
Normal file
@@ -0,0 +1,70 @@
|
||||
<audio id="audio" title="038 | “查询关键字理解”三部曲之解析" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/00/d2/0030f9ac0f80171093b8b6e72ea209d2.mp3"></audio>
|
||||
|
||||
这周我分享的核心内容是查询关键字理解(Query Understanding)。周一介绍了查询关键字分类(Query Classification)的基本概念和思想。今天,我来讲一个更加精细的查询关键字理解模块:**查询关键字解析**(Parsing)。
|
||||
|
||||
如果说查询关键字分类是对查询关键字的宏观把握,那么,对查询关键字的解析就是微观分析。其实,查询关键字解析是一类技术的统称,我今天就来聊几个比较热的话题。
|
||||
|
||||
## 查询关键字分割
|
||||
|
||||
首先,让我们设想这么一个场景,在英文的搜索引擎中,如果一个用户输入的是“White House Opening”这个查询关键字,这个用户的意图(Intent)是什么呢?要想理解用户的意图,我们就得知道用户输入的单词的涵义。
|
||||
|
||||
那么,在上面这个查询关键字里,我们到底是分别理解每一个单词“White”、“House”和“Opening”呢,还是“White House”和“Opening”呢,还是有可能“White House Opening”是一个整体呢?这里说的其实就是“**查询关键字分割**”(Query Segmentation)这个概念。
|
||||
|
||||
在刚才的例子中,如何把“White House Opening”进行分割直接关系到搜索结果的质量。试想在一个比较标准的现代搜索引擎里,一般来说,都会有一个模块根据查询关键字来提取“**倒排索引**”(Inverted Index)中的文档。这个阶段的提取数目一般是几百到几千,这个过程常常被称为“**检索流程**”(Retrieval Phase)。
|
||||
|
||||
当有了这些文档以后,现代搜索引擎会利用比较复杂的排序算法,通常就是我们之前提到过的基于机器学习的排序学习模型,来对文档进行重新排序(Re-Rank)。
|
||||
|
||||
你可以看到,在这样两个阶段的流程里,如果好的文档没有在第一个阶段被提取出来,不管第二个阶段的功能有多强大,搜索的整体结果都不可能有多好。而对于“检索流程”而言,在“倒排索引”中进行查询的关键就是使用什么“单词”或者“词组”进行查找。
|
||||
|
||||
用刚才的例子来说,就是看文档究竟是符合“White House”,还是“White或House”,还是“White House Opening”。很明显,这三种情况得到的文档集合是不尽相同的。如果用户的真实意图是搜索美国总统府白宫的开放时间,那么把这个搜索关键字给分割成“White或House”,很明显就会影响提取的文档集合。
|
||||
|
||||
那究竟该怎样做查询关键字分割呢?
|
||||
|
||||
这里我介绍一篇论文《重新审视查询关键字分割》(Query Segmentation Revisited )。在这篇论文里,作者们集中介绍了一些主流的“查询关键字分割”技术,文章非常值得精读。下面我为你归纳一下要点。
|
||||
|
||||
**第一种技术就是尝试从查询关键字里面产生“N元语法”(N-Grams)**。所谓N元语法其实就是从一组词语中产生连续的子词语。比如刚才的“White House Opening”的例子,我们就可以从这个词组里面产生“White House”和“House Opening”两个二元语法。
|
||||
|
||||
而第一种基于N元语法的方法,就是通过这些N元语法在一个大语料中出现的词频来判断这个“分割”是否有意义。当然,直接采用词频可能会比较偏好短的单词,所以在论文中,作者们分别介绍了两种矫正词频的方法。
|
||||
|
||||
一种是基于词频本身的矫正,一种是基于维基百科,作为一个外部资源的矫正方式。两种方法的目的都是为了让长短语的打分(Scoring)有机会高于短的单词。文章中所需要的词频采用了谷歌2005年发布的“N元语法”语料,也就是说,所有单词出现的频率都是直接在这个语料中获得的。
|
||||
|
||||
**第二种技术是基于短语“互信息”(Mutual Information)的方法**。“互信息”计算了两个随机事件的相关程度。在这里,就是计算查询关键字中每两个相邻短语的“互信息”。当这个“互信息”的取值大于某一个预设阈值的时候,我们就认为相邻的两个单词组成了短语。“互信息”的计算需要知道某个单词出现的概率,这些概率是从微软发布的一个“N元语法”语料获得的。
|
||||
|
||||
**第三种技术则是基于“条件随机场”(Conditional Random Field)**。“条件随机场”是机器学习著名学者乔治·拉菲迪(John D. Lafferty)、安德鲁·麦卡伦(Andrew McCallum)和费尔南多·佩雷拉(Fernando Pereira)在2001年发表的“序列学习”模型(Sequence Model)中提出的。条件随机场的基本思想是对输出的复杂标签进行建模,尝试从特征空间建立到复杂标签的一个对应关系。
|
||||
|
||||
在“查询关键字分割”的场景下,我们其实可以把复杂标签看作是从一个查询关键字到多个短语的多个二元决策问题。这里的二元决策是指某一个备选短语是否可以作为分割的短语。条件随机场可以比较直观地对这类问题进行建模,而传统的二分分类器则很难对序列信息进行建模。我在这里就不详细展开条件随机场的介绍了,有兴趣的话可以翻看相关的论文。
|
||||
|
||||
## 查询关键字标注
|
||||
|
||||
刚才我聊了查询关键字理解最基本的“分割“问题。可以说,“分割问题”是查询关键字理解的第一步。那么,下一步则是更细致地分析查询关键字。
|
||||
|
||||
回到刚才的例子“White House Opening”,我们其实不仅是想知道这个查询关键字可以分割为“White House”和“Opening”,而且希望知道“White House”是一个建筑物的名字或者一个地理位置的名字,而“Opening”则可能是一个名词,暗指“开门时间”。也就是说,我们希望为查询关键字中的词组进行“标注”(Annotation),来获取其“属性”(Attribute)信息。希望为查询关键字中分割出来的词组进行标注的组件就叫做“**查询关键字标注**”。
|
||||
|
||||
那么,标注信息又是怎样帮助搜索结果的呢?试想一下“苹果价格”这个查询关键字。这取决于用户搜索的场景,如果“苹果”代表“水果”这个属性,那么这个查询的结果是希望找到水果的价格,可能还需要搜索引擎返回附近超市的一些信息。但如果“苹果”其实代表的是“手机”,那这个查询的结果也许最好是返回苹果公司的官方销售网站。你看,“苹果”所代表的属性不同,最优的返回结果可能会有非常大的差别。
|
||||
|
||||
对查询关键字进行标注的方法也有很多。我这里再推荐一篇经典的论文《使用伪相关反馈针对搜索查询关键字进行结构化标注》(Structural annotation of search queries using pseudo-relevance feedback),这篇论文**利用一个叫做PRF(Pseudo-Relevance Feedback)的方法来进行标注**。这里面的一个技术难点是,查询关键字的信息实在是太少,需要利用大量的辅助信息来进行标注,因此PRF作为一个技术在这里得到了应用。
|
||||
|
||||
另外一个主流的查询关键字标注的方法,依然是利用条件随机场。我前面讲了,条件随机场是很好的序列建模工具。那么,在这里,以“苹果价格”为例,条件随机场是需要预测标签是否是“手机名词”还是“水果名词”这样的组合输出结果。而传统的二分或者多类分类器很难捕捉到这里的序列信息,条件随机场就是解决这方面的利器。
|
||||
|
||||
于是,我们需要做的就是为查询关键字构建特征(Feature),然后直接放入条件随机场中。有一点需要注意,条件随机场的应用成功与否与数据的多少有很大关系。因此,**构建一个有标注信息的数据集就变成了查询关键字标注的一个核心挑战**。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了现代搜索技术中的一个重要环节,那就是查询关键字理解中的查询关键字解析问题。你可以看到查询关键字解析从大类上分为查询关键字分割和查询关键字标注两个比较重要的模块。
|
||||
|
||||
一起来回顾下要点:第一,简要介绍了查询关键字分割的场景和三种主要技术,分别是“N元语法”、“互信息”和“条件随机场”。第二,详细介绍了查询关键字标注的场景和主要技术,包括利用PRF和利用条件随机场两种主流的标注方法。
|
||||
|
||||
最后,给你留一个思考题,我举了英语的查询关键字的解析问题,那么对于中文而言,又有哪些特殊的挑战呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
**参考文献**
|
||||
|
||||
<li>
|
||||
Matthias Hagen, Martin Potthast, Benno Stein, and Christof Bräutigam. Query segmentation revisited. **Proceedings of the 20th international conference on World wide web (WWW '11)**. ACM, New York, NY, USA, 97-106. 2011.
|
||||
</li>
|
||||
<li>
|
||||
Michael Bendersky, W. Bruce Croft, and David A. Smith. Structural annotation of search queries using pseudo-relevance feedback. **Proceedings of the 19th ACM international conference on Information and knowledge management (CIKM '10)**. ACM, New York, NY, USA, 1537-1540. 2010.
|
||||
</li>
|
||||
|
||||
|
72
极客时间专栏/AI技术内参/搜索核心技术/039 | “查询关键字理解”三部曲之扩展.md
Normal file
72
极客时间专栏/AI技术内参/搜索核心技术/039 | “查询关键字理解”三部曲之扩展.md
Normal file
@@ -0,0 +1,72 @@
|
||||
<audio id="audio" title="039 | “查询关键字理解”三部曲之扩展" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/12/e0/122fdeb4afdbf0b0bf9522cf52fec2e0.mp3"></audio>
|
||||
|
||||
我们在本周的前两篇文章中分别介绍了查询关键字分类(Query Classification)和查询关键字解析(Query Parsing)的基本概念和思想。今天,我来讲一个稍微有一些不同的查询关键字理解模块:**查询关键字扩展**(Query Expansion)。
|
||||
|
||||
查询关键字扩展想要解决的问题和分类以及解析略微不同。其主要目的不仅仅是希望能够对用户输入的关键字进行理解,还希望能够补充用户输入的信息,从而达到丰富查询结果的效果。
|
||||
|
||||
## 查询关键字扩展的概念
|
||||
|
||||
为什么要提供查询关键字扩展?主要原因还是用户输入的查询关键字信息不足。还记得我们上次提到的“苹果价格”这个例子吗?在这个例子中,用户到底是希望查询“苹果”作为一种水果的价格,还是“苹果”作为手机的价格,其实无法真正从这个查询关键字中得出。因此,作为搜索引擎,如果为用户提供一些“扩展选项”,也就是一个被改写(Reformulated)过的查询关键字,会提供更加好的用户体验和更加精准的搜索结果。
|
||||
|
||||
**查询关键字扩展除了显示出来能够让用户有更好的体验以外,还有一个作用是增加文档的“召回”(Recall),从而为提高搜索结果奠定基础**。设想这样一个例子,用户搜索“iphone 6 backup”,希望了解如何备份iPhone 6的信息。因为苹果手机的绝大多数机型的备份流程都大同小异,因此,如果把“iphone 6”给扩展到“iphone”其他机型,然后看是否有比较好的介绍备份的网页可以显示。
|
||||
|
||||
值得注意的是,在扩展的过程中也有可能失去“精度”(Precision)。比如假设苹果对iPhone 7的备份流程做了很大的改进,那么其他机型的流程也许就不适用了,所以当用户搜索“iphone 7 backup”的时候,如果我们扩展到了其他机型,那让用户看到的很可能就是不那么相关的信息了。因此,**对“精度”和“召回”的平衡,成了查询关键字扩展的一个重要的权衡点**。
|
||||
|
||||
**查询关键字扩展的另外一个重要应用就是对同义词和缩写的处理**。比如,唐纳德·特朗普(Donald Trump)是美国现任总统。那么,如果用户在搜索“Donald Trump”、“Trump”、“US President”、“POTUS”(这是“President Of The United States”的简称)等类似词汇的时候,搜索引擎应该提供相似的结果。而从词汇的直接联系上,这些词汇在表面形式上可能有很大的差异(比如“Trump”和“POTUS”),因此需要其他手段学习到这些词语内涵的同义。
|
||||
|
||||
## 查询关键字扩展的技术
|
||||
|
||||
知道了查询关键字扩展的含义以后,我们就来看看有哪些技术可以为查询关键字扩展提供支持。
|
||||
|
||||
根据上面提供的一些例子,你可以看到,这里的**核心就是找到搜索结果意义上的“同义词”**。那么,在搜索中,如何挖掘“同义词”呢?
|
||||
|
||||
今天我在这里分享两种思路。
|
||||
|
||||
**第一种思路,是根据查询关键字和查询结果之间的自然结合产生的同义效果**。这需要对用户的搜索行为数据进行大规模挖掘。这里的基本假设是这样的,假设我们有两个搜索关键字,A和B。从A的搜索结果中,用户可能点击了一些网页,从B的结果中,用户可能点击了另外的一些网页。如果这些被点击的网页恰好非常类似,那么,我们就可以认为A和B其实是同义的查询关键字。
|
||||
|
||||
更加完整的做法是把查询关键字和网页分别表示成“图”(Graph)中的两类节点(Node)。每个关键字节点和多个网页节点建立联系(Edge)或者边(Link),象征这些网页对应这个关键字的相关页面。而从每个网页的角度上看,多个关键字节点又和同一个网页节点相连,表示这些关键字都有可能和某个网页相关。
|
||||
|
||||
拿上面提到的特朗普的例子来说,美国白宫的首页作为一个节点的话,就有可能会和“Trump”、“US President”以及“POTUS”这几个查询关键字相关。因此你可以看到,寻找同义词的工作就变成了如何在这个图上进行相似节点,特别是相似关键字节点的挖掘工作。
|
||||
|
||||
如果把查询关键字的节点放在一边,把网页节点放在一边,我们就看到了典型的“**二分图**”(Bipartite Graph)。二分图的特点是同边的节点之间没有连接(比如关键字和关键字之间没有连接),而所有的连接都发生在不同边的节点之间(关键字和网页之间)。
|
||||
|
||||
二分图的聚类问题(Clustering)是机器学习界的经典的问题。而利用二分图的聚类问题来做查询关键字的同义词挖掘也是很多研究人员尝试的方向。文末我列了几个参考文献,比如参考文献[2]就是利用二分图上的“随机游走”(Random Walk)以及随机游走所产生的“到达时间”(Hitting Time)来挖掘出类似的关键字。如果你有兴趣,可以查看这篇经典论文。
|
||||
|
||||
说了基于用户行为信息和关键字挖掘的思路以后,我们再来看看第二种思路。
|
||||
|
||||
**第二种思路的核心是从海量的文本信息中分析出词语之间的相关度**。这里面需要注意的是,这些词语的相关度有可能是语言本身带来的。比如,单词“Male”和“Man”。也可能是语境带来的,比如谈论手机的网页中对于“iPhone 6”和“iPhone 7”的谈论。
|
||||
|
||||
总之,这一个思路的想法就是如何为每一个词组都建一个“表达”(Representation),从而通过这个表达找到同义词。近年来流行的一个做法是为单词找到数值表达,也就是通常所说的“嵌入”(Embedding)。如果两个词在“嵌入空间”(Embedding Space),通常是“欧式空间”中距离相近,那么我们就可以认为这两个词是同义词。
|
||||
|
||||
如何为词组产生“嵌入”向量呢?这里面也有很多做法。比较通用的有算法Word2Vec(参考文献[3]),目标是通过一个文档的每一句话中某一个词周围的词来预测这个词出现的概率。可以设想一下,在苹果手机的很多帮助文档或者帮助站点中,描述如何帮助iPhone 6或者iPhone 7来做数据备份的字句都是相似的,甚至,可能唯一的区别就是描述机型的名字。
|
||||
|
||||
因此在这样的情况下,通过文字周围的“上下文信息”(Contextual)来对单词本身的“嵌入向量”进行学习可以有效地学习到单词的语义。而通过语义,我们就能够找到其他的同义词。当然,要想真正应用到查询关键字扩展中,可能还需要有其他的调试,比如文末我列的参考文献[4],就是其中的一种。如果你感兴趣,建议去精读。
|
||||
|
||||
最后我需要说明的是,第一种思路需要已经有不少的用户交互数据,而第二种思路可以通过其他的语料(比如维基百科)加以学习,并不需要用户数据。这也是另一个值得参考的信息点。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了查询关键字理解中的查询关键字扩展问题。你可以看到,查询关键字扩展从技术上的两种流派,一个是通过用户的交互数据来产生一个图,并且利用图挖掘技术来得到查询关键字之间的关系;另外一个就是通过产生词汇的嵌入向量从而得到同义词。
|
||||
|
||||
一起来回顾下要点:第一,简要介绍了查询关键字扩展的内涵。由于用户输入的查询关键字信息不足,通过查询关键字扩展可以提供更好的用户体验和更加精准的搜索结果。第二,详细介绍了查询关键字扩展的两个主要技术。
|
||||
|
||||
最后,给你留一个思考题,如何来测试查询关键字扩展的优劣呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
**参考文献**
|
||||
|
||||
<li>
|
||||
Claudio Carpineto and Giovanni Romano. A Survey of Automatic Query Expansion in Information Retrieval. **ACM Computing Surveys**. 44, 1, Article 1 (January 2012), 50 pages.2012.
|
||||
</li>
|
||||
<li>
|
||||
Qiaozhu Mei, Dengyong Zhou, and Kenneth Church. Query suggestion using hitting time. **Proceedings of the 17th ACM conference on Information and knowledge management (CIKM '08)**. ACM, New York, NY, USA, 469-478. 2008.
|
||||
</li>
|
||||
<li>
|
||||
Mikolov, Tomas, Kai Chen, Greg Corrado, and Jeffrey Dean. Efficient estimation of word representations in vector space. arXiv preprint arXiv:1301.3781 (2013).
|
||||
</li>
|
||||
<li>
|
||||
Diaz, Fernando, Bhaskar Mitra, and Nick Craswell. Query expansion with locally-trained word embeddings. arXiv preprint arXiv:1605.07891 (2016).
|
||||
</li>
|
||||
|
||||
|
77
极客时间专栏/AI技术内参/搜索核心技术/040 | 搜索系统评测,有哪些基础指标?.md
Normal file
77
极客时间专栏/AI技术内参/搜索核心技术/040 | 搜索系统评测,有哪些基础指标?.md
Normal file
@@ -0,0 +1,77 @@
|
||||
<audio id="audio" title="040 | 搜索系统评测,有哪些基础指标?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/b2/1c/b288db97ed5yy6295da8849912c8501c.mp3"></audio>
|
||||
|
||||
我在之前几周的专栏文章里主要讲解了最经典的信息检索(Information Retrieval)技术和基于机器学习的排序学习算法(Learning to Rank),以及如何对查询关键字(Query)进行理解,包括查询关键字分类、查询关键字解析以及查询关键字扩展。这些经典的技术是2000年后开始流行的各类搜索引擎的核心技术。
|
||||
|
||||
在进一步介绍更多的搜索引擎技术前,我觉得有必要专门抽出一周时间,来好好地看一下搜索系统的评测(Evaluation)以及我们经常使用的各类指标(Metric)。俗话说得好,“如果你不能衡量它,你就不能改进它”(If You Can't Measure It, You Can't Improve It)。意思其实就是说,对待一个系统,如果我们无法去衡量这个系统的好坏,没有相应的评测指标,那就很难真正地去琢磨怎么改进这些指标,从而达到提升系统的目的。
|
||||
|
||||
虽然我们这里是在搜索系统这个重要场景中讨论评测和指标,但实际上我们这周要讨论的很多细节都可以应用到很多类似的场景。比如,我们后面要讨论的推荐系统、广告系统等,在这些场景中几乎就可以无缝地使用这周要讲的很多内容。
|
||||
|
||||
## 线下评测
|
||||
|
||||
假设你今天开发了一个新软件,比如说是一个最新的手机软件,你怎么知道你的用户是不是喜欢你的软件呢?你怎么知道你的用户是不是愿意为你的软件掏钱呢?
|
||||
|
||||
**评测的核心其实就是了解用户的喜好**。最直接的方法,当然是直接询问用户来获得反馈。例如你可以对每一个下载了你手机软件的用户强行进行问卷调查,询问他们对待新软件的态度。
|
||||
|
||||
然而,我们很快就会发现这样的方法是行不通的。姑且不说用户是否会因为这样强行的方式产生反感,我们是不是能通过这些调查问卷获得用户的真实反馈,这本身就是一个问题。这里面涉及到调查问卷设计的科学性问题。
|
||||
|
||||
即便这些调查问卷都能完整准确地反映出用户对手机软件的看法,真正实施起来也会面临种种困难。如果这款手机软件的用户数量有百万甚至千万,那我们就要进行如此大规模的问卷调查,还要处理调查后的数据,显然这样做的工作量非常大。而这些调查问卷是没法反复使用的,因为下一个版本的软件更新后,用户的态度就会发生改变,这样的方式就没法系统地来帮助软件迭代。
|
||||
|
||||
那么如何才能形成一组数据来帮助系统反复迭代,并且还能够减少人工成本,这就成了一个核心问题。
|
||||
|
||||
在信息检索系统开发的早年,研究人员和工程师们就意识到了这个核心问题的重要性。英国人赛利尔·克莱温顿(Cyril Cleverdon)可以算是最早开发线下测试集的计算机科学家。
|
||||
|
||||
赛利尔生于1914年,在英国的布里斯托(Bristol)图书馆工作了很长时间。从1950年开始,赛利尔就致力于开发信息检索系统,以提高图书馆查询的效率。1953年他尝试建立了一个小型的测试数据集,用于检测图书管理员查找文档的快慢。这个工作最早发表于1955年的一篇论文(参考文献[1])。
|
||||
|
||||
这之后,英美的一些早期信息检索系统的研发都开始顺应这个思路,那就是为了比较多个系统,首先构造一个线下的测试数据集,然后利用这个测试集对现有的系统反复进行改进和提升。如果你想对早期测试集的构造以及信息有所了解,建议阅读文末的参考文献[2]。
|
||||
|
||||
那么,当时构造的这些测试数据集有些什么特点呢?
|
||||
|
||||
**这些测试数据集都会包含一个查询关键字集合**。这个集合包含几十到几百不等的查询关键字。一方面,这些关键字的选取大多来自于经验。另一方面,从赛利尔就开始认识到,需要保证有一些信息一定能够通过这些关键字来找到。其实,这里就是在测试我们后面要讲的“召回”。
|
||||
|
||||
在有了这些查询关键字以后,**这些测试数据集往往有几百到几千不等的文档**。这些文档中的某一部分,研究人员在构造数据集的时候就知道了会包含所对应查询关键字需要的信息,也就是我们后面要说的相关文档。
|
||||
|
||||
你可以看到,几十到几百的查询关键字以及几千个文档,很明显不能代表所有可能使用系统的用户的行为。你甚至可以说,这都无法代表绝大多数用户的行为。然而,这种测试集的好处是,查询关键字和文档本身是和要测试的系统无关的。也就是说,今天我们要测试系统A,还是明天要测试系统B,都可以反复利用同样一组测试数据集。这样做的好处相比于我们之前提到的问卷调查是显而易见的。
|
||||
|
||||
另外,我需要强调的是,“用户”这个概念在测试数据集中被“抽象”出去了。当我们在讨论文档相对于某个查询关键字的相关度时,我们假定这种相关度是恒定的,是对于所有用户都适用的。因此,究竟是哪位用户在使用这个系统并不重要。只要研发的系统能够在这些“标准化”的查询关键字和文档的集合表现优异,我们就相信这个系统能够满足所有用户的需要。
|
||||
|
||||
因为测试数据集并不是用户与产品交互产生的真实回馈结果,所以我们往往又把测试数据集叫作“线下评测数据”。
|
||||
|
||||
## 基于二元相关度的评测指标
|
||||
|
||||
从线下收集评测数据以后,我们最容易做到的就是利用“二元相关度”所定义的一系列评测指标来衡量手中系统的好坏。
|
||||
|
||||
什么叫“二元相关度”呢?简单来说,就是指**针对某一个查询关键字而言,整个测试集里的每一个文档都有一个要么“相关”要么“不相关”的标签**。在这样的情况下,不存在百分比的相关度。而每个文档针对不同的关键字,有不同的相关信息。
|
||||
|
||||
假定某个系统针对某个关键字,从测试数据集中提取一定量的文档而不是返回所有文档,我们就可以根据这个提取的文档子集来定义一系列的指标。
|
||||
|
||||
有两个定义在“二元相关度”上的指标就成了很多其他重要指标的基石。一个叫**“精度**”(Precision),也就是说,在提取了的文档中,究竟有多少是相关的。另一个叫“**召回**”(Recall),也就是说, 在所有相关的文档中,有多少是提取出来了的。
|
||||
|
||||
“精度”和“召回”的相同点在于,分子都是“即被提取出来了又相关的文档数目”。这两个指标所不同的则是他们的分母。“精度”的分母是所有提取了的文档数目,而“召回”的分母则是所有相关的文档数目。如果我们返回所有的文档,“召回”是1,“精度”则是相关文档在全集中的比例。因此,我们注意到,这两个指标其实都假定,提取的文档数目相比于全集而言是相对比较小的子集。
|
||||
|
||||
很快,大家从实践中就体会到,“精度”和“召回”就像是“鱼与熊掌不可兼得”。一个系统很难做到“精度”和“召回”都能够达到很高的数值。也就是说,我们往往需要在这两个指标之间做一些平衡。于是,研究人员开始寻找用一个数字来表达“精度”和“召回”的“平均水平”。来自英国的学者范·李杰斯博格(C. J. van Rijsbergen)最早在论文中采用了 “**调和平均数**” (Harmonic Mean)来计算 “精度”和“召回”的平均(参考文献 [3])。这个方法被后人称为“**F值**” ,并且一直沿用至今。
|
||||
|
||||
这里对“精度”和“召回”还需要注意一点,因为这两个指标都是基于“二元相关度”的。因此,这两个指标都不是“排序指标”(Ranking Metrics)。换句话说,这两个指标其实并不能真正评价排序系统。
|
||||
|
||||
比如,我们针对某个关键字提取10个文档,如果有3个相关文档被取出来,不管是“精度”还是“召回”都无法分辨这三个文档在最后序列中的位置,是头三位,还是后面的三位?很遗憾,“精度”和“召回”都无法解决这个问题。“二元相关度”的这个问题也就指引研究人员去开发真正能对排序进行评估的指标。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了搜索系统的评测和常用指标。这是现代搜索技术中一个非常重要的一个环节,那就是如何评价我们构建的系统。我们详细讲解了线下测试的由来以及这样的测试相比于调查问卷的优势。
|
||||
|
||||
一起来回顾下要点:第一,简要介绍了可重复使用的线下测试集的历史,以及这样的测试集都有什么特点与局限。第二,详细介绍了两个非常流行和重要的基于“二元相关度”的评测指标,那就是“精度”和“召回”。
|
||||
|
||||
最后,给你留一个思考题,我们讲了排序的好坏不能简单地从“精度”和“召回”的数值看出,那能不能动一些手脚呢?如果我们就依赖“二元相关度”,有没有什么方法来看“排序”的好坏呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
**参考文献**
|
||||
|
||||
<li>
|
||||
R.G. THORNE, B.Sc., A.F.R.Ae.S. The Efficiency Of Subject Catalogues and The Cost of Information Searches. **Journal of Documentation**, Vol. 11 Issue: 3, pp.130-148, 1995.
|
||||
</li>
|
||||
<li>
|
||||
K. SPARCK JONES, C.J. VAN RIJSBERGEN. Information Retrieval Test Collections. **Journal of Documentation**, Vol. 32 Issue: 1, pp.59-75, 1976.
|
||||
</li>
|
||||
<li>
|
||||
C.J. VAN RIJSBERGEN. Foundation of Evaluation. **Journal of Documentation**, Vol. 30 Issue: 4, pp.365-373, 1974.
|
||||
</li>
|
78
极客时间专栏/AI技术内参/搜索核心技术/041 | 搜索系统评测,有哪些高级指标?.md
Normal file
78
极客时间专栏/AI技术内参/搜索核心技术/041 | 搜索系统评测,有哪些高级指标?.md
Normal file
@@ -0,0 +1,78 @@
|
||||
<audio id="audio" title="041 | 搜索系统评测,有哪些高级指标?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/3d/c5/3d02161f4ea90f382c95851117e665c5.mp3"></audio>
|
||||
|
||||
周一我们介绍了基于“二元相关”原理的线下评测指标。可以说,从1950年开始,这种方法就主导了文档检索系统的研发工作。然而,“二元相关”原理从根本上不支持排序的评测,这就成了开发更加准确排序算法的一道障碍。于是,研究人员就开发出了基于“多程度相关”原理的评测标准。今天我就重点来介绍一下这方面的内容。
|
||||
|
||||
## 基于多程度相关原理的评测
|
||||
|
||||
从“二元相关”出发,自然就是给相关度更加灵活的定义。在一篇发表于NIPS 2007的文章中(参考文献[1]),雅虎的科学家介绍了雅虎基于五分标准的相关评价体系,从最相关到最不相关。而在同一年的SIGIR上,谷歌的科学家也发表了一篇文章(参考文献[2]),介绍了他们的“多程度”相关打分机制。至此之后,基于“多程度相关”原理的评价标准慢慢被各种搜索系统的研发者们所接受。
|
||||
|
||||
在这样的趋势下,基于“二元相关”的“精度”(Precision)和“召回”(Recall)都变得不适用了。我们需要新的、基于“多程度相关”的评价指标。
|
||||
|
||||
芬兰的科学家在2000年的SIGIR上(参考文献[3])发表了一种计算相关度评测的方法。这种方法被广泛应用到了“多程度相关”的场景中。那么,芬兰科学家发明的方法是怎样的呢?
|
||||
|
||||
这种方法被称作是“**折扣化的累积获得**”(Discounted Cumulative Gain),简称“DCG”。 在介绍DCG之前,我们首先假定,位置1是排位最高的位置,也就是顶端的文档,而位置数随着排位降低而增高,位置10就是第一页最后的文档。
|
||||
|
||||
DCG的思想是这样的。
|
||||
|
||||
**首先,一个排序的整体相关度,是这个排序的各个位置上的相关度的某种加权**。这样用一个数字就描述了整个排序。只要排序的结果不同,这个数字就会有所不同。因此,这就避免了“精度”或“召回”对排序不敏感的问题。
|
||||
|
||||
**其次,每个位置上面的“获得”(Gain)是和这个文档原本定义的相关度相关的,但是,根据不同的位置,要打不同的“折扣”**。位置越低(也就是位置数越大),折扣越大。这就是DCG名字的由来。
|
||||
|
||||
在原始的DCG定义中,“折扣”是文档的相关度除以位置的对数转换。这样,既保证了位置越低(位置数大),折扣越大,还表达了,高位置(位置数小)的差别要大于低位置之间的差别。这是什么意思呢?意思就是,如果某一个文档从位置1挪到了位置2,所受的折扣(或者说是损失)要大于从位置9挪到了位置10。在这样的定义下,DCG鼓励把相关的文档尽可能地排到序列的顶部。
|
||||
|
||||
事实上,假设我们有5个文档,假定他们的相关度分别是1、2、3、4、5,分别代表“最不相关”、“不相关”、“中性”、“相关”和“最相关”。那么,在DCG的定义下,最佳的排序就应该是把这5个文档按照相关度的顺序,也就是5、4、3、2、1来排定。任何其他的顺序因为根据位置所定义的“折扣获得”的缘故,都会取得相对较小的DCG,因此不是最优。DCG比“精度”和“召回”能够更好地表达对排序的评估。
|
||||
|
||||
但直接使用DCG也存在一个问题。如果我们有两个查询关键字,返回的文档数不一样,那么直接比较这两个查询关键字的DCG值是不“公平”的。原因在于DCG的“加和”特性,结果肯定是越加越大,因此不能直接比较两个不同查询关键字的DCG值。
|
||||
|
||||
有没有什么办法呢?把DCG加以“归一化”的指标叫做 **nDCG** (Normalized Discounted Cumulative Gain)。nDCG的思路是下面这样的。
|
||||
|
||||
首先,对某一个查询关键字的排序,根据相关信息,来计算一组“理想排序”所对应的DCG值。理想排序往往就是按照相关信息从大到小排序。然后,再按照当前算法排序所产生的DCG值,除以理想的DCG值,就产生了“归一化”后的DCG,也就是我们所说的nDCG值。简单来说,nDCG就是把DCG相对于理想状态进行归一化。经过nDCG归一化以后,我们就可以比较不同查询关键字之间的数值了。
|
||||
|
||||
这里需要说明的是,我们上面介绍的是DCG的原始定义。后来微软的学者们在2005年左右发明了另外一个变种的DCG,基本原理没有发生变化,只是分子分母有一些代数变形。这个新的版本后来在工业界得到了更加广泛的应用。如果你感兴趣,可以查看文末的参考文献[4]。
|
||||
|
||||
**直到今天,nDCG以及DCG依然是评价排序算法以及各种排序结果的标准指标。**
|
||||
|
||||
## 比较两个不同的排序
|
||||
|
||||
不管是我们之前谈到的“精度”和“召回”,还是今天介绍的nDCG,我们都是使用一个“数”来描述了相对于某个查询关键字,一组结果的好坏。当我们有多个查询关键字的时候,我们该如何比较两个不同排序的结果呢?
|
||||
|
||||
这里面的一个问题是,相对于两个不同的排序A和B来说,可能结果各有千秋,也许对于某一个关键字A比B的表现要好,但是另外一个关键字B就比A的结果更棒。这怎么办呢?
|
||||
|
||||
也许你会想到用平均值来描述A和B的表现。这的确是很好的第一步。于是,我们就计算A和B,两个排序的平均表现。这样对于这两个排序而言,我们就有了两个数值来表达这两个排序的好坏。
|
||||
|
||||
然而,很快我们就会遇到问题。假设A的nDCG平均值是0.781,B的nDCG平均值是0.789,我们可以下结论认为B是比A更好的排序算法吗?
|
||||
|
||||
答案当然是不一定。这种情况,我们就需要依赖统计工具“**假设检验**”来评价两个排序的好坏。
|
||||
|
||||
我这里就不去复习假设检验的细节了,简单说一个经常使用的工具。
|
||||
|
||||
如果我们比较A和B是在同一组查询关键字上的话,那我们常常可以使用“**两个样本的配对T检验**”(Two Sample Paired T-Test)。这里所谓的“配对”是指A和B的结果是可以一一比较的。这里的“T检验”其实就是说借助“T分布”或者我们通常所说的“学生分布”来进行假设检验。如果我们是在不同查询关键字集合中进行比较的话,还有其他的假设检验工具,这里就不展开了。
|
||||
|
||||
值得注意的是,假设检验本身也不是“万灵药”。第一,怎么最有效地在排序结果上进行假设检验还是一个研究话题,包括我们刚说的“两个样本的配对T检验”在内的所有方法都不是“金科玉律”。第二,依靠假设检验得出来的结论,仅仅是统计意义上的“好坏”,和这些系统在用户面前的表现可能依然会有很大差距。因此,**对于假设检验的结果也要带有“批判”的眼光**。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了现代搜索技术中如何评价我们构建的系统,特别是如何评价排序系统。
|
||||
|
||||
一起来回顾下要点:第一,简要讲解了基于“多程度相关”的评价体系,包括其由来和DCG以及nDCG的概念。第二,详细介绍了如何来比较两个排序的好坏。
|
||||
|
||||
最后,给你留一个思考题,如果我们只有“二元”相关信息,能不能用nDCG来评价好坏呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
**参考文献**
|
||||
|
||||
<li>
|
||||
Ben Carterette and Rosie Jones. Evaluating search engines by modeling the relationship between relevance and clicks. **Proceedings of the 20th International Conference on Neural Information Processing Systems (NIPS’07)**, J. C. Platt, D. Koller, Y. Singer, and S. T. Roweis (Eds.). Curran Associates Inc., USA, 217-224,2007.
|
||||
</li>
|
||||
<li>
|
||||
Scott B. Huffman and Michael Hochster. How well does result relevance predict session satisfaction? **Proceedings of the 30th annual international ACM SIGIR conference on Research and development in information retrieval (SIGIR '07)**. ACM, New York, NY, USA, 567-574, 2007.
|
||||
</li>
|
||||
<li>
|
||||
Kalervo Järvelin and Jaana Kekäläinen. IR evaluation methods for retrieving highly relevant documents. **Proceedings of the 23rd annual international ACM SIGIR conference on Research and development in information retrieval (SIGIR '00)**. ACM, New York, NY, USA, 41-48, 2000.
|
||||
</li>
|
||||
<li>
|
||||
Chris Burges, Tal Shaked, Erin Renshaw, Ari Lazier, Matt Deeds, Nicole Hamilton, and Greg Hullender. Learning to rank using gradient descent. **Proceedings of the 22nd international conference on Machine learning (ICML '05)**. ACM, New York, NY, USA, 89-96, 2005.
|
||||
</li>
|
||||
|
||||
|
65
极客时间专栏/AI技术内参/搜索核心技术/042 | 如何评测搜索系统的在线表现?.md
Normal file
65
极客时间专栏/AI技术内参/搜索核心技术/042 | 如何评测搜索系统的在线表现?.md
Normal file
@@ -0,0 +1,65 @@
|
||||
<audio id="audio" title="042 | 如何评测搜索系统的在线表现?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/5b/b5/5b3bcd2272b1d23cd46de0ea03259db5.mp3"></audio>
|
||||
|
||||
我在本周前面的两篇文章中为你讲解了基于“二元相关”和基于“多程度相关”原理的线下评测指标。利用这些指标,研发人员在半个世纪的时间里开发了一代又一代的搜索系统,这些指标和系统也都在不断演化。
|
||||
|
||||
虽然我们这周讲过的这些指标都很有指导意义,但大多数指标被提出来的时候都是基于线下的静态数据集,并不是真正去检测用户和系统的互动(虽然后期也有研发人员直接使用这些评测工具用于在线评测,但在使用上就产生了问题)。那有什么样的方法来评测搜索系统的在线表现呢?
|
||||
|
||||
为了回答这个问题,我们今天就来探讨一下进行在线评测的几个话题。
|
||||
|
||||
## 在线可控实验
|
||||
|
||||
我们先回到整个评测指标的初衷,为什么要进行线下测试呢?
|
||||
|
||||
第一个原因是在信息检索系统(也就是最早的搜索系统)的开发时期,还很难做在线可控实验(Controlled Experiments),研发人员还没有开发出值得依赖的手段来判断用户的行为。因此,在那个年代,比较可靠的方法就是调查问卷和后来开发出来的线下静态评测。可以说,这些手段都是真正了解用户行为的一个“代理”(Proxy)。
|
||||
|
||||
要进行评测,不管是线下还是线上,另外一个原因就是我们需要某种手段来分辨两个系统的好坏,从而能够不断地通过这种手段来改进系统,做到数据驱动。
|
||||
|
||||
那么,能够正确观测两个系统不同的工具,就是“在线可控实验”,有时候又称作“在线实验”,或者也叫作“在线A/B实验”。
|
||||
|
||||
**在线可控实验其实是建立“因果联系”(Causal Relationship)的重要工具,也可以说是唯一完全可靠的工具。这里面的基础是统计的假设检验**。
|
||||
|
||||
具体来说,就是我们针对访问网站或者应用的人群,进行某种划分,一般情况下是平均随机划分,百分之五十的用户进入划定的一个群组,叫作“控制组”(Control Bucket),而另外百分之五十的用户进入另外一个群组,叫作“对照组”(Treatment Bucket)。“控制组”和“对照组”的唯一区别在于所面对的系统。
|
||||
|
||||
假设有一个搜索系统,我们想对其中的某个部分进行改进,那么,我们可以保持住其他的部分,让这个希望得到改进的部分成为唯一的“独立变量”(Independent Variable),也就是在整个实验设置中的变量。这样,我们就希望看到,能否通过在线实验以及假设检验的工具,来认定这个“独立变量”是否会带来系统性能上的提高,亦或是降低。
|
||||
|
||||
这里面还有一个需要提前确定的,那就是需要评测的指标,特别是用户指标,比如网站的点击率、搜索的数量等等。这些指标我们称之为“依赖变量”(Dependent Variable)。说白了,**我们就是希望能够在“独立变量”和“依赖变量”之间通过假设检验建立联系**。
|
||||
|
||||
虽然在概念上很容易理解在线可控实验,但在实际操作中会面临很多挑战。
|
||||
|
||||
虽然在理想状态下,我们可以把用户五五对分,让用户分别进入“控制组”和“对照组”。然而现实中,经过随机算法分流的用户群在这两个群组中很可能并不呈现完全一样的状态。什么意思呢?
|
||||
|
||||
举个例子,比如,在“控制组”中,相比于“对照组”而言,可能存在更多的女性用户;或者是在“对照组”中,可能存在更多来自北京的用户。在这样的情况下,“依赖变量”,比如网站点击率,在“控制组”和“对照组”的差别,就很难完全解释为“独立变量”之间的差别。
|
||||
|
||||
也就是说,如果“控制组”下的点击率比“对照组”高,是因为我们更改了系统的某部分产生了差别呢,还是因为这多出来的女性用户呢,又或者是因为女性用户和系统的某些部分的交互,产生了一定复杂的综合结果导致的呢?这就比较难说清楚了。对于刚才说的有更多来自北京的用户这个例子也是一样的。
|
||||
|
||||
当然,在现实中,如果说我们依然可以比较容易地通过算法来控制一两个额外的变量,使得在“控制组”和“对照组”里面这些变量的分布相当,那么,面对十几种(例如,年龄、性别、地域、收入层级等等)重要变量,要想完全做到两边的分布相当,难度很大。
|
||||
|
||||
即便我们能够做到通过随机算法使得已知变量在两个群组中的分布相当,我们依然不能对当前还未知的变量进行如此操作。因此,**如何处理因人群特性所带来的对结论的影响是现实中在线实验的难点之一**。
|
||||
|
||||
**在线实验的难点之二是,我们有可能很难做到如设想中的那样,让系统的某个部分成为“控制组”和“对照组”中唯一的“独立变量”**,即便是除去了刚才所提到的人群差异。
|
||||
|
||||
在现代网站或者应用中,有很多服务、子系统、页面、模块同时在为整个网站服务。而这些服务、子系统、页面和模块,都有不同的前端系统和后端系统,很可能属于不同的产品和工程团队。每个部分都希望能够做自己的可控实验,希望自己改进的部分是唯一变化的“独立变量”。然而,我们从宏观的角度去看,如果每个部分都在做自己的实验,而我们做实验的基本单元依旧是每个用户的话,那这就很难保证用户之间的可比性。
|
||||
|
||||
举个例子,如果用户U1,进入了首页的“控制组”,然后访问了搜索页面的“对照组”继而离开了网站。而用户U2,直接访问了帮助页面的“对照组”,然后访问了搜索页面的“控制组”。那U1和U2两个用户最终产生的点击率的差别,就很难从他们访问网站页面的过程中得出结论。即便是在有大量数据的情况下,我们也很难真正去平衡用户在所有这些页面的组别之间的关系。
|
||||
|
||||
**实际上,如何能够有效地进行在线实验,包括实验设计、实验评测等,都是非常前沿的研究课题**。每年在KDD、WSDM、ICML等学术会议上都有不少新的研究成果出炉。
|
||||
|
||||
## 利用因果推论对实验结果进行分析
|
||||
|
||||
今天的最后我想提一下因果推论(Causal Inference)。因果推论不是普通的统计教科书内容,也不在一般工程类学生接触到的统计内容之内。然而这个领域在最近几年受到了机器学习界越来越多的关注,因此了解因果推论对于学习机器学习的前沿知识来说很有必要。
|
||||
|
||||
像我们刚才提到的种种实验中产生的用户特征不平均、实验之间可能存在关系等,在这些方面我们都可以利用很多因果推论的工具进行分析。另外,对于工程产品而言,并不是所有的情况都能够通过A/B测试来对一个希望测试的内容、模型或者产品设计在一定时间内找到合理的结果,有很多情况下是不能进行测试的。因此,在不能进行测试的情况下还能通过数据研究得出期望的结果,也就是说,我们能否模拟在线实验,这就是因果推论的核心价值。
|
||||
|
||||
一般而言,在机器学习中需要因果推论的场景也很常见。比如,我们需要用数据来训练新的模型或者算法,这里面的数据采集自目前线上的系统。然而,现在的线上系统是有一定偏差的,那么,这个偏差就会被记录到数据里。在此,因果推论就为机器学习带来了一系列工具,使得在一个有偏差的数据中依然能够无偏差地进行训练以及评测模型和算法。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了在现代搜索技术中,如何利用在线实验,特别是可控实验来评价我们构建的系统。
|
||||
|
||||
一起来回顾下要点:第一,详细介绍了在线实验的一些因素,并分析了在线实验中可能产生的用户不平衡以及实验有相互作用的问题。第二,简短地提及了现在利用因果推论来进行在线实验数据分析以及“偏差”调整的一个思路。
|
||||
|
||||
最后,给你留一个思考题,如何建立在线实验评测结果和线下指标比如nDCG之间的关系呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
81
极客时间专栏/AI技术内参/搜索核心技术/043 | 文档理解第一步:文档分类.md
Normal file
81
极客时间专栏/AI技术内参/搜索核心技术/043 | 文档理解第一步:文档分类.md
Normal file
@@ -0,0 +1,81 @@
|
||||
<audio id="audio" title="043 | 文档理解第一步:文档分类" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/45/9a/45460358b990563220f2fca63abcf89a.mp3"></audio>
|
||||
|
||||
我们在前几周的专栏里讲解了最经典的信息检索(Information Retrieval)技术以及基于机器学习的排序学习算法(Learning to Rank),并且花了一定的时间分享了查询关键字理解(Query Understanding)这一关键搜索组件的核心技术要点。上周,我们还详细讨论了如何从线上和线下两个层面来评价一个搜索系统。
|
||||
|
||||
这周我们的分享将转移到搜索的另外一个重要部件:**文档理解**(Document Understanding)。也就是从文档中抽取各种特性,来帮助检索算法找到更加相关的文档。
|
||||
|
||||
文档理解最基本的一个步骤就是给**文档分类**(Classification),看这些文档表达什么类别的信息。今天我就来和你聊一聊文档分类的一些基本概念和技术,让你对这方面的开发与研究有一个基本认识。
|
||||
|
||||
## 文档分类的类型
|
||||
|
||||
如果我们把文档分类看做一个监督学习任务的话,那么在各式应用中就经常使用以下几种类型的文档分类。
|
||||
|
||||
第一个类别就是**二元分类**,或者称为二分文档分类,目的就是把文档分成两种不同的类别。比如,把文档分成“商业类”或者“非商业类”。
|
||||
|
||||
第二个类别自然就是**多类分类**,也就是判断文档是否属于好几种不同类别中的某一个。比如,把文档划归为“艺术”、“商业”、“计算机”或者“运动”类别中的某一类。
|
||||
|
||||
当然,在多类分类的下面,我们还可以分三个小类别。
|
||||
|
||||
第一个小类别,是“**多类-单标签-硬分类**”(Multiclass,Single-Label,Hard Classification)。什么意思呢?就是说每一个文档只能在多类分类问题中被赋予唯一的标签,并且所有互相的类别是不兼容的。
|
||||
|
||||
第二个小类别,就是“**多类-多标签-硬分类**”(Multiclass,Multilabel,Hard Classification),也就是说每一个文档可以被认为属于多个类别,然而每个这样的分类都是唯一确定的。
|
||||
|
||||
最后一个小类别则是“**多类-软分类**”(Multiclass,Soft Classification),也就是认定每个文档以概率的形态属于多个类别。
|
||||
|
||||
在这个分类基础上,还有一种分类的方法,那就是可以把所有的类别看做一个平面的结构(Flat)或者是有组织结构的。通常情况下,如果把文档分类到一个层次组织(Hierarchical Structure)里就叫“**层次分类**”(Hierarchical Classification)。在这样的情况下,一个文档同时属于这个层次结构上从根节点到叶子节点的所有类别。一般来说,上层节点相对于下层节点更加抽象。
|
||||
|
||||
## 文档分类经典特性
|
||||
|
||||
了解了文档分类的基本类型之后,我们接着来讨论文档分类所用到的经典特性。
|
||||
|
||||
**我们最先会想到的当然是使用文档上原本的文字信息**。最直接的文字特性可能就是每个英文单词,或者中文的词语。这种完全把文字顺序打乱的方式叫作“**词袋模型**”(Bag-of-words Model)。
|
||||
|
||||
从很多实践者的报告来看,“词袋模型”虽然不考虑文字的顺序,但是在实际使用中,依然不失为一种非常有效的特性表达方式。同时,在“词袋模型”中,每个词的权重其实可以用我们之前介绍过的TF-IDF或是语言模型(Language Model)对单词进行加权。关于TF-IDF以及语言模型,建议你回到我们前面讲过的内容去复习一下。
|
||||
|
||||
除了“词袋模型”以外,还有一些不同的尝试,是希望能够保留部分或者全部的词序。
|
||||
|
||||
比如,我们曾经讲过的“**N元语法**”(N-gram)对文字的表达方法,就是一种非常有效的保留部分词序的方法。不过,N元语法最大的问题就是极大地增大了特性空间,同时,每一个N元组被观测到的次数明显减少,这也就带来了数据的稀少(Sparsity)问题。
|
||||
|
||||
除了N元语法以外,近年来随着深度学习的推广,比较新的思路是用“**递归神经网络**”(RNN)来对序列,在这里也就是词句进行建模。有不少研究表明这样的效果要明显好于“词袋模型”。
|
||||
|
||||
**除了文档上的原始文字以外,文档上的排版格式其实也是很重要的**。有些字段有很明显的特征,比如一个文档的标题显然占据了举足轻重的地位。有一些文档有“章节”、“段落”等结构,其中这些小标题对文章的主要内容有很大的指导意义。于是,对文章的不同“字段”(有时候也叫做“域”)进行建模,对文档分类的效果可能会有比较大的影响。
|
||||
|
||||
另外,针对某些特殊文档,仅仅考虑文字的基本信息可能是不够的。例如,现代网页的原始HTML表达和最终在浏览器中呈现出来的效果很可能会有较大区别。因此,针对网页,我们可能还需要采用浏览器中最终呈现出来的视觉效果来提取特性。
|
||||
|
||||
对于孤立的文档来说,单个文档的信息可能是比较有限的。但是在互联网上,很多文档都不是孤立存在的。就拿普通网页来说,互联网的一个特点就是很多网页都通过各种链接连到一起。这些和当前网页相连的其他页面很可能就会为当前页面提供一些额外信息。
|
||||
|
||||
在所有这些周围的页面中,有一类页面值得在这里提一下。那就是这些页面上会有链接指向当前我们需要分类的目标网页。这些链接往往有文字描述来叙述目标网页的一些特质,甚至有一些周围的文字描述也是有意义的。
|
||||
|
||||
比如,当前网页是微软公司的首页,上面也许因为有各种精美的图片而缺乏文字描述,而周围的页面上很可能就有“微软公司官方网站”等链接指向微软公司的首页。这样,我们就通过这些链接文字得出了“微软公司”的信息,然后如果我们又知道微软公司是软件公司,那么就比较容易对这个页面进行分类了。
|
||||
|
||||
**根据这个思路,我们就可以尝试去使用周围文档中更多的信息**。不过,值得指出的是,周围文档信息所带的“噪声”也是比较多的。已经有各类研究尝试去理解周围文档中更多有价值的信息,这里就不赘述了。
|
||||
|
||||
## 文档分类相关算法
|
||||
|
||||
根据我们刚刚讲过的不同文档的分类类型,就可以直接借用已知的、熟悉的监督学习各种算法和模型。
|
||||
|
||||
假如是简单的二分文档分类问题,那“对数几率回归”(Logistic Regression)、“支持向量机”(SVM)、“朴素的贝叶斯分类器”(Naïve Bayes Classifier)就都能够胜任工作。而针对多类分类问题,也是标准的监督学习设置,刚才说到的这几类算法和模型在一定的改动下也能够做到。
|
||||
|
||||
近些年,深度学习席卷很多领域。在文档分类领域,各类深度学习模型也都展示出了一定的优势。
|
||||
|
||||
需要注意的是,并不是所有的分类算法都“天生”(Natively)支持“概率的输出结果”。也就是说,如果我们需要对“多类-软分类”文档问题进行建模,那就会有一些问题。比如支持向量机就是这么一种情况。在默认的状态下,支持向量机并不输出每一个数据样例属于每一个类别的概率。
|
||||
|
||||
因此,这里就需要用到一些技巧。在实际应用中,我们经常采用的是一种叫“**普拉特调整**”(Platt Scaling)的办法。简单来说,其实就是把支持向量机的输出结果再当做新的特性,学习一个对数几率回归。
|
||||
|
||||
除了我们刚刚讲的利用基本的监督学习手段进行文档分类以外,另外一种方法就是我们前面说的利用周围有关系的文档,也就是所谓的“**关系学习**”(Relational Learning)。关系学习是说,希望利用文档与文档之间的关系来提高文档的分类效果。这一方面的很多方法都会利用这样的思想:**相似的页面很有可能是相同的类别**。
|
||||
|
||||
如果是在“层次分类”的情况下,相似的页面就很有可能在层次结构上距离比较近。这里,“相似”有可能被定义成文字信息相似,也有可能是在文档与文档之间所组成的“图”(Graph)上位置类似。
|
||||
|
||||
比如,某一个公司的很多子页面,虽然上面的文字本身有差异,但因为都是这个公司的页面,从大的文档页面网络上看,他们都代表这个公司的信息,因此在进行文档分类的时候,也很有可能会把他们放到一起。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了现代搜索技术中又一个至关重要的环节,那就是文档理解中的文档分类问题。你可以看到文档分类所要了解的信息还是比较多的。
|
||||
|
||||
一起来回顾下要点:第一,简要介绍了文档分类的主要类型,包括二元分类、多类分类以及层次分类。第二,详细介绍了文档分类所可能用到的种种特性,比如文档上原本的文字信息、文档的排版格式以及周围有关系的文档。第三,介绍了如何利用监督学习以及其他的算法工具来完成文档分类的任务。
|
||||
|
||||
最后,给你留一个思考题,如果一个文档中既有图片也有文字,那我们该如何组织这些特性,然后放到我们的分类器中去学习呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
65
极客时间专栏/AI技术内参/搜索核心技术/044 | 文档理解的关键步骤:文档聚类.md
Normal file
65
极客时间专栏/AI技术内参/搜索核心技术/044 | 文档理解的关键步骤:文档聚类.md
Normal file
@@ -0,0 +1,65 @@
|
||||
<audio id="audio" title="044 | 文档理解的关键步骤:文档聚类" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/c9/fc/c9ef8f90e7ca25af49d0687d3075b2fc.mp3"></audio>
|
||||
|
||||
周一我们分享了文档理解最基本的一个步骤,那就是给文档分类(Classification),主要是看不同文档表达什么类别的信息。今天我就来聊一聊文档理解的另外一个重要组件:**文档聚类**(Document Clustering)。
|
||||
|
||||
## 文档聚类的类型
|
||||
|
||||
和了解文档分类的思路相似,我们先来看看文档聚类的分类。一般来说,可以把文档聚类看作非监督学习的典型代表。
|
||||
|
||||
先说一种直观的分类方法。如果把文档分为“互不相关”的几个聚类,那就叫作“**扁平聚类**”(Flat Clustering);如果这些聚类相互之间有一定的结构关系,那就叫作“**层次聚类**”(Hierarchical Clustering)。
|
||||
|
||||
“扁平聚类”中的“互不相关”是说文档所划分进去的聚类之间本身没有重合。而“层次聚类”的特点是,希望在聚类之间找到关系,从而把这些文档组织到一个有层次的结构中。在这种层级结构里,根节点所代表的内容往往比较抽象,而叶节点所表达的内容则比较具体。
|
||||
|
||||
值得注意的是,不管是“扁平聚类”还是“层次聚类”,相较于文档分类来说,这里最大的不同就是这些聚类以及它们之间的关系都不是事先定义好的,或者说研发人员事先并不知道这些聚类的存在。从这个角度来看,聚类的确是比分类要困难的任务,难在如何衡量聚类的好坏。
|
||||
|
||||
除了“扁平聚类”和“层次聚类”这种区分以外,聚类方法中还有一个类似的区分,那就是“**硬聚类**”(Hard Assignment)和“**软聚类**”(Soft Assignment)的区别。
|
||||
|
||||
顾名思义,“硬聚类”是说对于每一个文档,不管是“扁平聚类”还是“层次聚类”,都确定性地分配到一个或者一组聚类中。而“软聚类”则往往学习到文档分配到聚类的一个分布,也就是说所有的分配都是以某种概率存在的。
|
||||
|
||||
## 文档聚类的应用
|
||||
|
||||
在搜索系统为背景的场景中,我们为什么要强调文档聚类?
|
||||
|
||||
**首先,文档聚类可以帮助文档提取和排序**。很多文档能够聚合到一个类别肯定是因为文档在某种情况下“相似”。相似的文档很可能都满足用户的某种“信息需求”(Information Needs)。实际上,在类似“语言模型”(Language Model)或者其他概率模型的场景中,对文档相关度的预测经常需要从相似文档群体中寻找额外信息。
|
||||
|
||||
举个例子,在“语言模型”中,我们需要估计文档相对于查询关键字的相关度。单独的某一个文档,数据信息可能比较匮乏,因此一个常用的策略就是从整个数据集中补充信息。如果我们已经有了文档的聚类,那自然就可以从这些聚类中补充,而不需要数据全集。
|
||||
|
||||
**其次,文档聚类能够帮助整理搜索结果**。在最普通的搜索结果上,如果只是完全“平铺”所有的结果,用户很可能对成百上千的结果“不得要领”。因此,在这些结果上体现某种结构就成为了很多搜索引擎提升用户体验的一种方法。
|
||||
|
||||
当然,这里可以用我们之前提到的“文档分类”的方法,把返回的结果按照类别组织。这样,哪一个类别有什么结果就清清楚楚。在这里,文档聚类相比于文档分类的优势是,聚类更能反应文档之间更本质的联系,而不是类似于分类这样“先入为主”地对文档的关系有一个定义。
|
||||
|
||||
文档聚类不仅仅是搜索结果的展示利器,**很多时候,文档聚类还可以帮助研究人员来浏览一个文档集合,而不需要太多的先期假设**。在有“层次聚类”的帮助下,研发人员可以很容易地根据层次之间的关系来对一个文档集合进行分析。利用文档聚类来浏览文档集合常常是发现问题,并且进行下一步工作的有效步骤。
|
||||
|
||||
## 文档聚类的基本模型
|
||||
|
||||
最基础的文档“扁平聚类”方法当属“K均值算法”(K-Means)。
|
||||
|
||||
**首先,一个最基本的步骤就是要把文档表示成“特性向量”**(Feature Vector)。具体的做法可以采用我们周一讲过的几个方式,比如最基本的“词袋模型”(Bag Of Word),这是一种把文字顺序完全打乱的方式。在“词袋模型”中,每个词的权重可以用我们之前介绍过的TF-IDF或是语言模型对单词进行加权。当然,还有“N元语法”(N-gram)和“递归神经网络”(RNN)两种思路,这一部分可以回到我们周一的内容再复习一下。
|
||||
|
||||
**把文档表达成为“特征向量”之后,就可以开始聚类了**。“K均值算法”的基本思路是这样的。给定一个数据样本集,K均值算法尝试把所有的样本划分为K个聚类。每个聚类都是互斥的,也就是说样本都被有且唯一地分配到这些聚类中。K均值算法在优化一个目标函数,那就是每个样本到目标聚类中心的平均平方误差最小。
|
||||
|
||||
这里,目标聚类中心是指当前这个样本被分配到的聚类;而聚类中心则是所有被分配到这个聚类的样本的均值。很明显,根据不同的样本被分配到不同的聚类,聚类中心也会随之发生变化。通俗地说,K均值算法的目标函数要达到的目的是,让聚类内部的样本紧紧围绕在聚类的均值向量周围。整个目标函数的值越小,聚类内样本之间的相似度就越高。
|
||||
|
||||
和我们熟悉的线性回归模型(Linear Regression)以及对数几率回归(Logistic Regression)一样,目标函数本身仅仅描述了当最终的聚类分配最佳时的一种情况,并没有描述如何能够得到最佳聚类分配的情况。实际上,对于K均值算法而言,直接最小化这个目标函数并不容易,一般来说,找到它的最优解是一个NP难的问题。
|
||||
|
||||
不过幸运的是,**贪心算法一般能够找到不错的近似解**。下面我就介绍一个通过迭代优化来近似求解目标函数的算法。
|
||||
|
||||
**首先,我们对均值向量进行初始化**。比较简单的初始化方法就是直接随机地选择某几个点来当做聚类均值。**然后,我们依次对每一个样本点进行聚类划分**。每个数据点被分配到距离某一个均值向量最近的那个聚类里。当我们进行了所有的分配之后再对均值向量更新。这就完成了一次迭代,整个算法需要进行多次迭代更新。**若迭代更新后聚类结果保持不变,就将当前聚类划分结果返回**。
|
||||
|
||||
## 文档聚类的难点
|
||||
|
||||
在今天分享的最后,我想来谈一谈文档聚类的一些难点。
|
||||
|
||||
**首先,怎样衡量聚类的质量好坏,也就是如何评价聚类算法以及比较不同的算法,一直都是聚类模型,甚至说是无监督机器学习算法的共同问题**。有一些评价手段基于定义聚类内部数据的相似度,并且认为聚类内部数据应该比聚类之间的数据更加相似。然而,这样的定义并不能真正反映聚类的质量。
|
||||
|
||||
**其次,在聚类算法中,往往有一个参数非常难以决定,那就是聚类的个数**。对于一个决定的数据集来说,我们不可能事先知道这个参数。当聚类的个数过少的时候,我们可能无法对数据集进行比较完备的K均值算法描述。而聚类的个数过多的时候,可能数据又被切割成过多的碎片。因此,要确定这个参数就成了聚类算法研究的一个核心难点。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了文档理解中的文档聚类问题。一起来回顾下要点:第一,简要介绍了文档聚类的类型。第二,详细介绍了文档聚类的应用场景。第三,讲解来一个基本的文档聚类K均值算法。第四,简要提及了文档聚类的一些难点。
|
||||
|
||||
最后,给你留一个思考题,当得到文档聚类的结果以后,能否把这些结果用在其他任务中呢?如果可以,如何利用?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
73
极客时间专栏/AI技术内参/搜索核心技术/045 | 文档理解的重要特例:多模文档建模.md
Normal file
73
极客时间专栏/AI技术内参/搜索核心技术/045 | 文档理解的重要特例:多模文档建模.md
Normal file
@@ -0,0 +1,73 @@
|
||||
<audio id="audio" title="045 | 文档理解的重要特例:多模文档建模" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/c0/d8/c010e95edb8731e4cbee59030c446dd8.mp3"></audio>
|
||||
|
||||
本周我们重点分享搜索系统中的一个重要部件,那就是文档理解。周一我们首先分享了文档理解最基本的一个步骤,那就是给文档分类,主要是看不同文档表达什么类别的信息。然后,周三我们聊了聊另外一个重要的文档理解组件,也就是文档聚类的一些基本的概念和技术。今天我就来和你分享一个文档理解的重要特例:**多模文档建模**(Multimodal Modeling)。
|
||||
|
||||
## 多模数据
|
||||
|
||||
我们首先来了解一下,到底什么是多模数据。
|
||||
|
||||
**多模数据,其实就是说数据有多种模式(Modal)的表达途径。而这些多种不同的模式都共同参与描述同一个数据点的不同方面**。
|
||||
|
||||
比如,有一张照片反映的是美国总统特朗普在华盛顿白宫的致辞。那么照片本身是对这个场景的一个描述,这是一个模式。然后,和照片相应的文字描述,说明这是特朗普在白宫的致辞,又是另外一个模式。这两个模式是相辅相成的,都是对这个场景的描述。很明显,针对这样多种数据模式的建模是多媒体时代、社交媒体时代非常重要的课题。
|
||||
|
||||
在文档领域,非常普遍的情况是文字和图片混搭。一般来说,新闻网站一般都有大量的图文信息。而有一些特殊场景,文字和图片则出现很不对称的混合情况。比如,一些社交媒体(例如Instagram、Pinterest甚至Twitter)上很多短文档都仅仅包含图片或者图片和很少的文字。在这些情况中,文字和图片就成了非常重要的互相补充的信息源。
|
||||
|
||||
另外,在电子商务网站中,商品的图片正在成为越来越重要的信息途径。用户经常依靠图片来判断是否要购买某个商品。在电子商务网站上已经很难看到只有文字描述的商品信息了。因此,对于文档的搜索来说,对图文信息的理解是一个核心的技术问题。
|
||||
|
||||
那么,多模数据的建模难点是什么呢?
|
||||
|
||||
不同模式的数据其实是有不同的特征,如何能够有效利用各自的特性来最优地反映到某一个任务中(比如分类或者聚类等),是多模数据建模的难点。
|
||||
|
||||
## 多模数据建模基础
|
||||
|
||||
那么,如何对多种模式的数据进行建模呢?
|
||||
|
||||
**多模数据建模的核心思路就是数据表征**(Representation)。我们需要思考的是如何学习到文字的表征,以及图片的表征。然后,又如何把文字和图片的表征能够联系到一起。
|
||||
|
||||
**一个最直接的思路,应该是文字采用我们熟悉的各种文字特性,然后利用图片相关的特性提取技术来对图片进行表征**。得到文字和图片各自的表征之后,直接把两个不同的特征向量(Feature Vector)连接到一起,就得到了一个“**联合表征**”(Joint Representation)。
|
||||
|
||||
比如,假设我们学习到了一个1000维度的文字特征向量,然后一个500维的图片特征向量,那么,联合特征向量就是1500维度。
|
||||
|
||||
一个相对比较现代的思路是利用两个不同的神经网络分别代表文字和图片。神经网络学习到“**隐含单元**”(Hidden Unit)来表达图片信息以及文字信息之后,我们再把这些“隐含单元”联结起来,组成整个文档的“**联合隐含单元**”。
|
||||
|
||||
另外一个思路,那就是并不把多种模式的数据表征合并,而是保持它们的独立。在文字图片这个例子中,那就是保持文字和图片各自的表征或者特征向量,然后通过某种关系来维持这两种表征之间的联系。
|
||||
|
||||
有一种假设就是,虽然各种数据模式的表象是不一样的,例如图片和文字的最终呈现不一样,但是内在都是这个核心内容的某种表述。因此,这些数据模式的内在表达很可能是相近的。
|
||||
|
||||
这个假设套用到这里,那就是我们假设文字和图片的各自的表征相近,而这个“相近”是依靠某种相似函数来描述,比如这里就经常使用“**余弦相似函数**”(Cosine Similarity)。
|
||||
|
||||
**有了上述两种思路之后,一种混合的思路就很自然地出现了**。混合思路的基本想法是这样的。数据不同的模式肯定是某种内在表征的不同呈现,因此,需要一个统一的内在表征。但是,只采用一种表征来表达不同的数据源,又明显是不够灵活的。所以,在这种混合的思路里,我们依然需要两种不同的特征来表达文字和图片。
|
||||
|
||||
具体来说,混合思路是这样的。首先,我们从文字和图片的原始数据中学习到一个统一的联合表征。然后,我们认为文字和图片各自的表征都是从这个联合表征“发展”或者是“产生”的。很明显,在这样的架构中,我们必须要同时学习联合表征以及两个模式的、产生于联合表征的、单独的各自表征。
|
||||
|
||||
值得注意的是,不管是从原始数据到联合表征,还是从联合表征到各自表征,这些步骤都可以是简单的模型,不过通常是多层的神经网络模型。
|
||||
|
||||
值得一提的是,在需要多种不同的表征,不管是联合表征还是各自表征的情况中,文字和图片的原始输入甚至是最开始的表征,不一定非要“端到端”(End-to-End)地从目前的数据中学习到。实际上,利用提前从其他数据集中训练好的文字嵌入向量表达来作为文字的输入,是一个非常流行也是非常高效的做法。
|
||||
|
||||
有了数据表征之后,很自然地就是利用这些学习到的表征来进行下一步的任务。我们这里就拿文档分类为例。有了联合表征之后,下一步就是利用这个新的表征当做整个文档的特征,学习分类器来进行分类任务。而对于独立的数据表征来说,通常的方法是针对各自表征分别学习一个分类器。这样,我们就有了两个独立的分类器,一个用于文字信息,一个用于图片信息。
|
||||
|
||||
有了这两个分类器之后,我们再学习第三个分类器,根据前面两个分类器的分类结果,也就是说这个时候分类结果已经成为了新的特征,来进行第三个分类器的分类。很明显,这个过程需要训练多个不同的分类器,为整个流程增加了不少复杂度。
|
||||
|
||||
## 其他多模数据建模应用
|
||||
|
||||
除了我刚才所说的表征的学习以及如何构建分类器以外,多模数据还有一些其他的富有挑战性的任务。
|
||||
|
||||
**在有文字和图片的情况下,我们经常还需要在这两种模式之间进行转换,或者叫做“翻译”**。比如,在已知图片的情况下,如何能够产生一段准确的文字来描述这个图片;或者是在已经有文字的情况下,如何找到甚至产生一张准确的图片。当然,这样的“翻译”并不仅仅局限于文字图片之间,在其他的数据模式中,例如文字和语音之间、语音和图像之间等等,也是普遍存在的。
|
||||
|
||||
在这种“翻译”的基础上,更进一步的则是把文字和图片等信息“对接”(Align)起来。比如,针对一组图片,我们能够根据图片的变化产生图片的描述信息。
|
||||
|
||||
还有一种应用叫做“**可视化问答**”(Visual Question & Answering),是指利用图片和文字一起回答问题。很显然,要想能够回答好问题,我们需要同时对图片和文字信息进行建模。
|
||||
|
||||
不管是“翻译”还是“可视化问答”这些任务,都是近些年来大量利用深度学习所带来的**序列模型**(Sequential Modeling),特别是类似于RNN或者LSTM等模型的领域。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了文档理解中的多模数据建模问题。你可以看到这是一个非常火热的领域,如何理解多媒体数据是现代数据处理的一个重要问题 。
|
||||
|
||||
一起来回顾下要点:第一,简要介绍了什么是多模数据。第二,详细介绍了多模数据建模的一些基本思路,包括如何获取文档的表征、什么是联合表征和什么是独立表征。然后,我们还讲了如何构建不同的分类器。第三,简要地提及了其他的多模数据建模任务以及这些任务所依靠的基本的深度学习趋势。
|
||||
|
||||
最后,给你留一个思考题,多模建模带来了丰富的特性,由这些丰富特性所训练的分类器,就一定能比单一数据源所训练得到的分类器表现得更好吗?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
71
极客时间专栏/AI技术内参/搜索核心技术/046 | 大型搜索框架宏观视角:发展、特点及趋势.md
Normal file
71
极客时间专栏/AI技术内参/搜索核心技术/046 | 大型搜索框架宏观视角:发展、特点及趋势.md
Normal file
@@ -0,0 +1,71 @@
|
||||
<audio id="audio" title="046 | 大型搜索框架宏观视角:发展、特点及趋势" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/4c/78/4cd7599ba17468a8a508c81de7061278.mp3"></audio>
|
||||
|
||||
我们在前几周的专栏里讲解了一系列最经典的信息检索(Information Retrieval)技术以及基于机器学习的排序学习算法(Learning to Rank)。然后我们花了一定的时间讨论了两个关键搜索组件的核心技术要点,包括查询关键字理解(Query Understanding)和文档理解(Document Understanding)。除此之外,我们还详细讨论了如何从线上和线下两个层面来评价一个搜索系统。相信你已经对搜索系统的各个基本组成部分有了一个比较基础的把握。
|
||||
|
||||
那么,今天我们就第一次从整体上来看看大型搜索系统框架的演变和历史发展,给你一个宏观的认识。相信有了之前的基础知识铺垫,我们今天的分享会让你感觉到水到渠成。
|
||||
|
||||
## 基于文本匹配的信息检索系统
|
||||
|
||||
我们在介绍TF-IDF和BM25这些经典信息检索系统的时候,其实就已经介绍了不少基于文本匹配的基本的信息检索系统的核心概念。
|
||||
|
||||
实际上,**从20世纪50年代有信息检索系统开始一直到2000年前后,这种纯粹基于文本匹配的搜索系统一直都是主流搜索系统的基础所在**。甚至当前的很多开源搜索框架也都是基于这种最基本的信息检索系统的。
|
||||
|
||||
总结一下,这种信息检索系统有这么几个特点。
|
||||
|
||||
**首先,文本匹配系统的基础是一个倒排索引**(Inverted Index)。索引中的“字段”是某一个查询关键字。而每个字段所对应的则是包含这个查询关键字的文档列表。这个文档列表大多按照某种重要的顺序排列。
|
||||
|
||||
比如,某个文档整体和查询关键字的相关度大,那么就会排列到这个列表的前面。当然,也并不一定所有包含这个查询关键字的文档都会包含到这个列表中。另外,之所以叫做“索引”,也是因为这个列表中并不实际存储整个文档,往往只是存储文档的编号。
|
||||
|
||||
从这个基本的索引结构其实衍生出了很多值得研究而且在实际应用中也很有必要考虑的问题。
|
||||
|
||||
比如如何进一步优化构建这个索引。特别是当列表中的文档数目过多的时候,或者当查询关键字也很多的时候,采用某种编码的模式来压缩索引就变得很关键。
|
||||
|
||||
同时,索引过大也会带来很多性能上的问题。比如,当索引过大的时候,某一部分索引或者很大部分就无法存放在内存中,这个时候,整个搜索系统的性能就受到了很大的威胁。因为在对查询关键字进行处理的时候,就需要反复在内存和硬盘上切换内容。因此,对于索引进行创新,使得索引能够在内存中使用并且快速查询是一个非常重要的课题。
|
||||
|
||||
**文本匹配系统的另外一个特点就是对传统的检索方法,例如TF-IDF或BM25以及它们变种的依赖**。这些方法在查询关键字和索引之间架起一座桥梁,使得搜索引擎能够针对每一个查询关键字文档对赋予一个数值。然后我们可以利用这个数值进行排序。
|
||||
|
||||
然而,这些方法本质上的最大问题就是,他们都不是基于机器学习的方法。也就是说,这些方法本身都是基于一些研究人员的假设和经验,往往无法针对现有的数据进行适应。也正是因为如此,这种方法的研发工作往往让人感到缺乏理论基础。
|
||||
|
||||
**最后,传统的文本匹配系统还存在一个问题,那就是很难比较自然地处理多模数据**。也就是我们之前说过的,如果数据中有文字、图像、图(Graph)信息等综合数据信息,文本匹配的方法在这方面并没有提供什么理论指导。
|
||||
|
||||
**那么,文本匹配系统有哪些优势呢?**其实,即便是在今天,**文本匹配系统的最大劣势也是其最大优势:不依靠机器学习**。也就是说,如果你要构建一个新的搜索系统或者是某个App中有搜索功能,最开始的版本最容易依靠文本匹配系统,因为这时候并不需要依靠任何数据,并且文本匹配系统不需要太多调优就能上线。但是,文本匹配系统的这一优势今天往往被很多人忽视。
|
||||
|
||||
## 基于机器学习的信息检索系统
|
||||
|
||||
**从2000年开始,基于机器学习的信息检索系统思潮逐渐变成了构建搜索系统的主流**。在这种框架下的信息检索系统主要有以下这些特点。
|
||||
|
||||
**第一,基于机器学习的系统开始有了一整套的理论支持**。比如我们之前讲过的单点法(Pointwise)排序、配对法(Pairwise)排序和列表法(Listwise)排序等方法,都明确地使用通用的机器学习语言来描述搜索问题。
|
||||
|
||||
**什么叫做通用的机器学习语言?**那就是,有一个明确的目标函数,有明确特性(Feature),有明确的算法来求解在这些框架下的机器学习问题。同时,机器学习的一系列基本的方法论,比如训练数据、测试数据、评测方法等等都可以应用到信息检索的场景中来。这对于搜索系统的性能以及整体搜索系统的研发都有了非常重要的指导意义。
|
||||
|
||||
同时,这也开启了一个非常便利的提高搜索系统效果的大门。那就是任何机器学习领域内部的发展,很多都可以被借鉴到搜索系统中。比如,最近几年深度学习的大力发展,就可以在已经铺就的基于机器学习的搜索系统框架下很容易地进行尝试。
|
||||
|
||||
**第二,基于机器学习的搜索系统能够很容易地利用多模数据**。对于机器学习而言,多模数据,或者说是多种类型的数据的融合,可以很自然地通过特性以及不同类型的特性来表达。因此,对于多模数据,机器学习有天然的优势。**通过学习这些特性之间的联系从而预测相关度,是机器学习的强项**。
|
||||
|
||||
因此,理解搜索系统各个部分的数据并把这些信息用在排序算法中,这样的方式就如雨后春笋般大量地出现了。比如,我们之前提到过的查询关键字理解中的查询关键字分类和查询关键字解析,以及文档理解中的文档分类所产生的特性,很难想象这些内容在传统的文本匹配系统中得以应用。但在基于机器学习的搜索系统中,这些信息则往往成为提高相关度建模的重要工具。
|
||||
|
||||
同时,我们也在之前的分享中介绍了,针对多模数据,机器学习中专门有相关的研究,思考如何把不同类型的数据能够更好地融合在一起来建模。这类研究在传统的文本匹配搜索系统中根本不存在。
|
||||
|
||||
**基于机器学习的搜索系统也不是完美无瑕**。实际上,如果没有各种保证,机器学习并不一定能在实际中获得满意的效果,因为基于机器学习的搜索系统对整个系统而言有了较高的要求。
|
||||
|
||||
机器学习往往需要大量的数据,而在一个现实的软件产品中,如何能够构建可靠并且干净的数据就是一个不简单的任务。如果没有可靠的数据,对于一般的机器学习算法而言,就是“垃圾进入,垃圾出来”,实际效果往往比不使用机器学习还要糟糕。
|
||||
|
||||
同时,机器学习系统可能会有特性异常、模型异常、数据异常等等其他软件系统所不具备的各种问题。如果在生产系统中对这些情况没有一个估计和处理,机器学习搜索系统往往也会不尽人意。
|
||||
|
||||
## 更加智能的搜索系统
|
||||
|
||||
很明显,搜索系统不会仅仅停留在应用普通的机器学习算法。近几年,搜索系统的发展有两个方面。
|
||||
|
||||
**一方面,当然就是依靠深度学习发展的春风,不少学者和研究人员都在思考,如何能够利用深度学习技术让搜索系统更上一层楼**。在这方面的研发中,不仅仅是针对普通的深度学习算法,而是看如何应用深度学习所特有的一些模式,比如**深度强化学习**等方式来重新思考搜索问题。
|
||||
|
||||
**另一方面,就是从用户的角度来说,研究更加有意义的评测方式**。也就是说,如何能够真正抓住用户对这个系统的偏好,并且能够进一步地去优化这个系统的性能。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了现代搜索技术框架的发展,并简单提及了搜索系统目前发展的趋势 。 一起来回顾下要点:第一,我们讲了基于文本匹配的经典搜索系统的特点;第二,我们讲了基于机器学习的搜索系统的特点。
|
||||
|
||||
最后,给你留一个思考题,在机器学习和深度学习的思潮中,传统搜索系统的核心,也就是我们说过的索引,能否依靠机器学习来生成呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
87
极客时间专栏/AI技术内参/搜索核心技术/047 | 多轮打分系统概述.md
Normal file
87
极客时间专栏/AI技术内参/搜索核心技术/047 | 多轮打分系统概述.md
Normal file
@@ -0,0 +1,87 @@
|
||||
<audio id="audio" title="047 | 多轮打分系统概述" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/31/51/31b386f071a2fe17707fbe4199955951.mp3"></audio>
|
||||
|
||||
周一我为你介绍了搜索系统的一个宏观分类,包括传统的文本匹配信息检索系统和机器学习信息检索系统。这个分类可以让你非常清晰地了解信息搜索系统的历史进程,并对这两种搜索系统的特点有所了解。
|
||||
|
||||
今天我们就来剖析搜索系统的另一个框架体系:**多轮打分(Scoring)系统**。
|
||||
|
||||
## 多轮打分系统综述
|
||||
|
||||
什么是多轮打分系统?为什么搜索系统需要多轮打分?
|
||||
|
||||
我们拿上次介绍的机器学习搜索系统为例。从整体来说,机器学习搜索系统的目的是利用机器学习模型来预测文档和搜索关键字之间的相关性。那么,在理想状态下,针对每一个查询关键字,我们需要对数据集中的每一个文档进行打分。
|
||||
|
||||
如果是一个类似互联网搜索引擎的应用场景,那么理论上,每一个查询关键字都需要对几亿甚至十几亿的网页进行打分。显然,仅仅从这个数量级上来说,这样做都是不现实的。
|
||||
|
||||
从另一个方面来讲,目前比较通用的机器学习模型,特别是在排序问题上有强劲表现的树模型(Tree Model),比如GBDT(Gradient Boosted Decision Trees)或者神经网络,都有较高的计算时间复杂度。要想在实时响应的反应时间内(例如几百毫秒内)对相对比较多(我们这里说的是几千甚至上万)的文档进行打分是很困难的,我们刚才提到的整个数据集中是有几亿甚至十几亿的文档,那就更加困难了。
|
||||
|
||||
于是在这样的情况下,我们就需要有这么一种机制:对于每个查询关键字而言,能够先有一个方法在整个数据集上快速评价出几百到几千不等(视具体应用)的文档,然后在这个几百到几千不等的集合上运用复杂的模型进行计算并且排序。 **这种需要对文档进行两轮打分的流程叫做“两轮打分框架”**(见参考文献[3])。
|
||||
|
||||
**第一轮打分又常常被称作“顶部K”(Top-K)提取**。你可以看到,在这样的机制下,相对比较简单的模型和方法可以用于第一轮打分,因为这一轮是有可能在全部的数据集上进行操作的。这一轮也是被优化得最彻底的一轮,毕竟需要在海量的数据集中快速找到几百或者几千个合适文档。
|
||||
|
||||
**然后在第二轮,当文档的数目已经降到了几千甚至几百的时候,我们就可以使用比较复杂的模型了**。这其实也是整个多轮打分的一个目的,那就是可以在一个比较适量的数据集上应用复杂模型。
|
||||
|
||||
实际上我们不仅可以对文档进行两轮打分,甚至可以扩展到多轮打分,比如雅虎搜索引擎的“三轮打分机制”(见参考文献[1])。第三轮根据第二轮打分所产生的文档“上下文特征“(Contextual Feature),从而可以进一步精准地提高搜索结果的质量。类似的思想也可以借鉴参考文献[2]。
|
||||
|
||||
一般来说,**多轮打分系统有两个明显的特点**。一个特点是每一轮都比上一轮使用的文档数目要少。也就是说,多轮打分的目的是每经过一轮都筛选出更少的文档。另外一个特点是每一轮使用的特性数目都比上一轮更加复杂,模型也更加复杂。
|
||||
|
||||
## 第一轮“顶部K提取”
|
||||
|
||||
我刚才说了一下多轮打分系统的机理。现在我们来看一看第一轮打分,也就是俗称的“顶部K提取”都有什么技术特点。
|
||||
|
||||
**“顶部K提取”的一个核心问题就是,如何快速地从非常巨大的数据集中返回有价值的几百到几千的文档**。这就需要对获取文档的数据结构以及使用的模型有一定的要求。
|
||||
|
||||
首先,“**倒排索引**”(Inverted Index)是一个非常重要的机制。是否能够建立有效的索引是第一轮打分能否达到目的的关键。
|
||||
|
||||
传统的倒排索引已经可以在很大程度上有效地“削减”没必要的文档。我再简要地讲解一下这个基本的数据结构,我们一起来复习一下倒排索引的内容。索引中的“字段”是某一个查询关键字,而每个字段所对应的则是包含这个查询关键字的文档列表。
|
||||
|
||||
这个文档列表大多按照某种重要的顺序排列。比如,某个文档整体和查询关键字的相关度大,那么就会排列到这个列表的前面。当然,也并不是所有包含这个查询关键字的文档一定都会包含到这个列表中。另外,之所以叫做“索引”,也是因为这个列表中并不实际存储整个文档,而往往是只存储文档的编号。
|
||||
|
||||
除了最基本的通过索引来提取文档以外,我们还可以通过一些简单的模型来提取文档,比如**线性模型**。一个经典的方法叫做“**WAND操作符**”(WAND Operator,参见参考资料[4])。
|
||||
|
||||
当然,严格来讲,WAND操作符并不是把一个通用的、普遍的线性模型应用到文档索引上,而是说,如果我们能够把模型给简化为只有正系数的线性模型,那么,整个模型其实可以看做是两个向量的点积,而WAND则是对点积在索引上的一种优化。
|
||||
|
||||
当然,研发人员不仅想把线性模型直接使用到倒排索引上。实际上,这么多年来也有不少的尝试,希望能够把树模型直接应用到倒排搜索上。但是,因为我们之前提到的性能因素,通常情况下树模型都没法直接应用(这里提供一个参考文档[5]供你阅读)。应该说,树模型的优化还处在一个研究的阶段。
|
||||
|
||||
## 第二轮或以后轮数的重排
|
||||
|
||||
当我们结束了第一轮之后,就来到了第二个阶段,也是经常所说的**“重排”(Re-rank)阶段**。在这个阶段,文档已经从索引中到达了内存。一般来说,在比较普通的架构下,所有的几百到几千不等的文档在这个时候已经整合到了某一台机器的内存中。
|
||||
|
||||
我们在思考第一轮和第二轮的时候,需要先理解这两轮的一个重要区别,才能知道什么样的模型能够比较好地应用在这两个不同的场景中。
|
||||
|
||||
首先,第一轮必须能够应用在搜索倒排索引上。现代的索引模式,往往是部署在很多的节点(机器)上的。也就是说,每一个节点都拥有一部分,但不是完整的文档集合。这也就导致了我们之前介绍过的单点法(Pointwise)、配对法(Pairwise)和列表法(Listwise)这些机器学习方法很难在索引的这个级别直接使用,因为每一个节点为了计算效率问题,只能访问到一部分的文档并且进行打分。
|
||||
|
||||
因此,**两轮的最大区别就是,第一轮一般都是针对单一文档的打分,而只有第二轮才能利用上配对法或者列表法针对文档打分**。我们之前曾经提过,配对法或者列表法都比单点法的效果要好,因此如何平衡这两者在两轮中的表现差异就变得越来越重要了。
|
||||
|
||||
这里我简单提一下第二轮之后的其他轮数。当我们应用了第二轮之后,其实基本上就已经产生了最后的结果集合。为什么还需要其他轮数呢?
|
||||
|
||||
**我们可能还需要其他轮数至少有两个原因**。
|
||||
|
||||
第一,很多搜索系统中,相关排序只是搜索系统的一个方面。搜索系统还可能引入“多元化”或者其他的“商业规则”。这些规则或者进一步的重新排序很难完整地在前面的轮数中进行。
|
||||
|
||||
第二,当最后文档集合生成之后,有证据表明(参考文献[1]),我们还可以生成一些更加精细的特性来进一步提高排序的精度。因此,多轮打分是值得探索的。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了现代搜索技术中一个很重要的思路,多轮打分系统 。 一起来回顾下要点:第一,我们讲了为什么需要多轮打分,多轮打分的核心思路是什么。第二,我们分别讲了第一轮和第二轮以及后面轮数的一些特点。
|
||||
|
||||
最后,给你留一个思考题,在多轮打分系统的情况下,如何评测第一轮模型的好坏呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
**参考文献**
|
||||
|
||||
<li>
|
||||
Dawei Yin, Yuening Hu, Jiliang Tang, Tim Daly, Mianwei Zhou, Hua Ouyang, Jianhui Chen, Changsung Kang, Hongbo Deng, Chikashi Nobata, Jean-Marc Langlois, and Yi Chang. Ranking Relevance in Yahoo Search. **Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (KDD '16)**. ACM, New York, NY, USA, 323-332, 2016.
|
||||
</li>
|
||||
<li>
|
||||
Ruey-Cheng Chen, Luke Gallagher, Roi Blanco, and J. Shane Culpepper. Efficient Cost-Aware Cascade Ranking in Multi-Stage Retrieval. **Proceedings of the 40th International ACM SIGIR Conference on Research and Development in Information Retrieval (SIGIR '17)**. ACM, New York, NY, USA, 445-454, 2017.
|
||||
</li>
|
||||
<li>
|
||||
Van Dang, Michael Bendersky, and W. Bruce Croft. Two-Stage learning to rank for information retrieval. **Proceedings of the 35th European conference on Advances in Information Retrieval (ECIR’13)**, Pavel Serdyukov, Pavel Braslavski, Sergei O. Kuznetsov, Jaap Kamps, and Stefan Rüger (Eds.). Springer-Verlag, Berlin, Heidelberg, 423-434, 2013.
|
||||
</li>
|
||||
<li>
|
||||
Andrei Z. Broder, David Carmel, Michael Herscovici, Aya Soffer, and Jason Zien. Efficient query evaluation using a two-level retrieval process. **Proceedings of the twelfth international conference on Information and knowledge management (CIKM '03)**. ACM, New York, NY, USA, 426-434, 2003.
|
||||
</li>
|
||||
<li>
|
||||
N. Asadi, J. Lin and A. P. de Vries. Runtime Optimizations for Tree-Based Machine Learning Models. **In IEEE Transactions on Knowledge and Data Engineering**, vol. 26, no. 9, 2281-2292, 2014.
|
||||
</li>
|
63
极客时间专栏/AI技术内参/搜索核心技术/048 | 搜索索引及其相关技术概述.md
Normal file
63
极客时间专栏/AI技术内参/搜索核心技术/048 | 搜索索引及其相关技术概述.md
Normal file
@@ -0,0 +1,63 @@
|
||||
<audio id="audio" title="048 | 搜索索引及其相关技术概述" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/1d/a0/1d5d4710a05f45e7700eff5b2d0047a0.mp3"></audio>
|
||||
|
||||
本周我们分享的主题是从宏观上来剖析现代搜索架构。周一我介绍了搜索系统的一个大的分类,一类是从20世纪50年代开始研发并使用的传统文本匹配信息检索系统,一类是从2000年开始发展并逐渐成熟的机器学习信息检索系统。周三我们剖析了搜索系统的另一个框架体系,多轮打分系统,阐述了为什么需要多轮打分,以及每一轮打分又有什么特性。
|
||||
|
||||
今天,我们来看一个在本周已经反复涉及到的话题:**倒排索引**(Inverted Index)。一起来聊聊它的核心技术。值得注意的是,关于索引的很多话题其实都会牵涉到搜索中的“查询关键字处理”(Query Processing),我们今天的分享就主要来谈谈索引及相关技术在“查询关键字处理”这个场景下的应用。
|
||||
|
||||
## 经典的索引结构
|
||||
|
||||
**经典的索引结构由“字段”(Field)和对应的列表组成**。一般来说,“字段”就是某一个查询关键字。在英文里,这就是一个单独的单词;在中文里,这也许就是一个词或者短语。每个字段所对应的列表就是包含这个查询关键字的文档列表。
|
||||
|
||||
**有两点值得注意**。
|
||||
|
||||
第一,在文档列表里的文档,大多按照某种重要的顺序排列,这方便我们首先提取重要性高的文档。比如,某个文档整体和查询关键字的相关度大,那么就会排列到这个列表的前面。
|
||||
|
||||
第二,对于每个字段,也就是查询关键字而言,所有包含这个查询关键字的文档并不一定都会包含到这个列表中,这个列表可以是一个节选。
|
||||
|
||||
另外,我们前面已经讲过了,之所以叫做“索引”,也是因为这个列表中并不实际存储整个文档,往往是只存储文档的编号。
|
||||
|
||||
如果用户输入的查询关键字包含多个词组,根据这个最基础的结构,我们可以很容易地获取包含所有关键字的文档集合。这个操作仅仅相当于在多个列表中做“**归并排序**”(Merge Sort)。
|
||||
|
||||
除了在索引中仅仅保存最基本的文档标号信息以外,另外一些文档的基础信息也可以一并存放在索引中。比如,**经常存放的信息还有文档包含某个查询关键字的次数**。保存次数信息本质上是在保存“词频”(Term Frequency)这个文档特性。
|
||||
|
||||
我们前面分享经典的信息检索模型的时候,介绍过很多模型,例如TF-IDF、BM25或者语言模型,都对词频的计算有很强的依赖。**在索引中存放词频信息有助于近似计算这些基础的检索模型**。
|
||||
|
||||
**另外一个经常存放的信息就是查询关键字在文档中出现的位置**(Position)。位置信息对于有多个查询关键字的时候尤为重要。比如,我们要搜索的词组是“五道口电影院”。在这样的情况下,我们非常希望“五道口”在某个文档中出现的位置和“电影院”在文档中出现的位置相邻。这样,我们可以确认这个文档的确是关于“五道口电影院”的,而不是恰好含有“五道口”和“电影院”这两个词。
|
||||
|
||||
**同时,位置信息还可以帮助搜索引擎生成搜索结果界面上的“结果摘要”信息**。我们经常看到搜索结果页面上有几句话的摘要信息,这个信息就需要查询关键字的位置来生成。
|
||||
|
||||
## 索引技术
|
||||
|
||||
除了最基础的索引技术以外,研发人员开发了多种技术让索引更加高效。
|
||||
|
||||
**第一个技术当然就是希望对索引进行压缩**。索引信息很快就会随着可能的关键字数目的膨胀而扩展。索引中每一个关键字所对应的文档列表也会越来越庞大。因此,能否快速处理索引信息并为后续的计算节约时间就变得非常关键。本周三我们分享了多轮打分系统。多轮打分系统的的一个重要思想就是整个流程必须在几百毫秒的响应时间内完成。因此,每一个步骤,包括从索引中提取“顶部K个文档”的过程都需要很快捷。
|
||||
|
||||
压缩技术博大精深,我们在今天的分享中就不展开讨论这部分的内容了。在这里,我们只需要从高维度上把握这个问题的一个基本思路。索引的一个基本信息就是相对于某个查询关键字的文档列表。而存储在文档列表里的并不是文档本身的数据,而是文档的某种信息,比如文档本身的编号。而编号就是数字,文档列表最终就是一个数字序列。压缩技术中有很多算法就是对一个数字序列进行压缩。
|
||||
|
||||
那么,到底怎样才能起到压缩的作用呢?我们这里举一个例子。比方说,有一种压缩算法是基于一种叫“**差值编码**”(Delta Encoding)的技术。简单来说,就是不直接记录文档编号本身,而是按照文档编号的顺序,记录文档编号之间的差值。
|
||||
|
||||
对于某些非常频繁的查询关键字而言,这些词汇有可能会出现在非常多、甚至是绝大多数的文档中。而采用这种“差值编码”来对文档列表进行重新编排,我们就可以用一组很小的数(这些数表达两个相邻文档编号的差值)来代表文档列表。当然,这种方法对于文档很少的查询关键字效果肯定不明显。同时,这种技术也要求文档列表不按照相关度排序,而要按照文档的编号排序。
|
||||
|
||||
**在索引的发展过程中也开发出了一些很细小的技术,比如“略过”**(Skipping)。简单来说,这个技术就是,当我们有多个查询关键字的时候,而且这些关键字之间的频率有非常大的差距,我们可以略过一些文档。
|
||||
|
||||
例如在“北京,地铁出行”这个组合中,“北京”有可能在整个数据集中出现的频率是“地铁出行”的几倍甚至十几倍、上百倍,因此我们其实并不需要搜索所有包含“北京”的文档,因为最终需要的仅仅是同时包含两个关键字的这样一个交集。因此,在处理“北京”的文档序列的时候,我们可以“略过”K个文档,然后看有没有到达下一个包含“地铁出行”的文档。这里的K当然是一个参数,需要尝试。有了这样的思路,处理多个查询关键字时就可以很显著地提升效果。
|
||||
|
||||
## 查询关键字处理
|
||||
|
||||
最后我们来谈一谈查询关键字处理。说得通俗易懂一点,就是如何从索引中提取出相关的文档并计算分数。这里有两种基本思路。
|
||||
|
||||
**第一种思路叫作“文档优先”(Document-at-a-Time)计算策略**。简单来说,就是我们首先从索引中找到所有查询关键字所对应的文档集合。比如我们处理“北京,地铁出行”这一查询关键字组合,我们先取出所有包含这些关键字的文档;然后保持一个“优先队列”(Priority Queue)来保存分数最高的K个文档;再针对取出来的文档分别计算分数,这里的分数有可能就是词频的某种简化检索模型;计算完分数之后,我们把分数压入优先队列中。
|
||||
|
||||
**第二种思路和“文档优先”思路相对应,叫作“词优先”(Term-at-a-Time)计算策略**。在这种思路下,我们对所有查询关键字词组中的每一个字一一进行处理。请注意,这里的第一个步骤其实是一样的,我们依然要先取出所有的文档集合。但是这一步之后,我们先处理包含“北京”的文档,得到所有文档分数的一个部分值,然后再处理“地铁出行”,在刚才计算的部分值上进行更新,取得最后的分数。
|
||||
|
||||
在实际应用中,这两种策略是更加复杂的优化查询关键字处理的基础,在这两种思路的基础上演化出了很多高级算法,不仅能快速地处理文字特性,还包括我们讲过的类似WAND操作符这样能够模拟线性模型的算法。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了现代搜索技术的一个核心组成部分,那就是倒排索引系统。 一起来回顾下要点:第一,我们讲了索引系统的基本组成和原理。第二,我们讲了索引相关技术的一个概况,重点介绍了压缩以及“略过”的含义。第三,简要讲解了查询关键字处理的两种最基础的策略。
|
||||
|
||||
最后,给你留一个思考题,如果我们既有图像信息又有文字信息,那该如何构建我们的索引呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
79
极客时间专栏/AI技术内参/搜索核心技术/049 | PageRank算法的核心思想是什么?.md
Normal file
79
极客时间专栏/AI技术内参/搜索核心技术/049 | PageRank算法的核心思想是什么?.md
Normal file
@@ -0,0 +1,79 @@
|
||||
<audio id="audio" title="049 | PageRank算法的核心思想是什么?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/ee/5f/ee0cc874ea06ac9153cb90a8f3befe5f.mp3"></audio>
|
||||
|
||||
上周我们介绍了信息搜索系统的历史进程,剖析了搜索系统的多轮打分系统,还深入探讨了倒排索引,聊了聊它的核心技术。
|
||||
|
||||
这周我要和你分享的是在互联网搜索引擎兴起之后的一个研发需要,那就是如何理解网页和网页之间的关系,特别是怎么从这些关系中提取网页中除文字以外的其他特性。这部分的一些核心算法曾是提高搜索引擎质量的重要推进力量。另外,我们这周要分享的算法也适用于其他能够把信息用结点与结点关系来表达的信息网络。
|
||||
|
||||
今天,我们先看一看用图来表达网页与网页之间的关系,并且计算网页重要性的经典算法:**PageRank**。
|
||||
|
||||
## PageRank的简要历史
|
||||
|
||||
时至今日,谢尔盖·布林(Sergey Brin)和拉里·佩奇(Larry Page)作为Google这一雄厚科技帝国的创始人,已经耳熟能详。但在1995年,他们两人还都是在斯坦福大学计算机系苦读的博士生。那个年代,互联网方兴未艾。雅虎作为信息时代的第一代巨人诞生了,布林和佩奇都希望能够创立属于自己的搜索引擎。1998年夏天,两个人都暂时离开斯坦福大学的博士生项目,转而全职投入到Google的研发工作中。他们把整个项目的一个总结发表在了1998年的万维网国际会议上( WWW7,the seventh international conference on World Wide Web)(见参考文献[1])。**这是PageRank算法的第一次完整表述**。
|
||||
|
||||
PageRank一经提出就在学术界引起了很大反响,各类变形以及对PageRank的各种解释和分析层出不穷。在这之后很长的一段时间里,PageRank几乎成了网页链接分析的代名词。给你推荐一篇参考文献[2],作为进一步深入了解的阅读资料。
|
||||
|
||||
## PageRank的基本原理
|
||||
|
||||
我在这里先介绍一下PageRank的最基本形式,这也是布林和佩奇最早发表PageRank时的思路。
|
||||
|
||||
首先,我们来看一下每一个网页的周边结构。**每一个网页都有一个“输出链接”(Outlink)的集合**。这里,输出链接指的是从当前网页出发所指向的其他页面。比如,从页面A有一个链接到页面B。那么B就是A的输出链接。根据这个定义,可以同样定义“**输入链接**”(Inlink),指的就是指向当前页面的其他页面。比如,页面C指向页面A,那么C就是A的输入链接。
|
||||
|
||||
有了输入链接和输出链接的概念后,下面我们来定义一个页面的PageRank。我们假定每一个页面都有一个值,叫作PageRank,来衡量这个页面的重要程度。这个值是这么定义的,**当前页面I的PageRank值,是I的所有输入链接PageRank值的加权和**。
|
||||
|
||||
那么,权重是多少呢?对于I的某一个输入链接J,假设其有N个输出链接,那么这个权重就是N分之一。也就是说,J把自己的PageRank的N分之一分给I。从这个意义上来看,I的PageRank,就是其所有输入链接把他们自身的PageRank按照他们各自输出链接的比例分配给I。谁的输出链接多,谁分配的就少一些;反之,谁的输出链接少,谁分配的就多一些。这是一个非常形象直观的定义。
|
||||
|
||||
然而,有了这个定义还是远远不够的,因为在这个定义下,页面I和页面J,以及其他任何页面的PageRank值是事先不知道的。也就是等式两边都有未知数,这看上去是个无解的问题。
|
||||
|
||||
布林和佩奇在他们的论文中采用了一种迭代算法。**这个算法很直观,那就是既然不知道这些PageRank的值,那我们就给他们一组初始值,这个初始值可以是这样的情形,所有页面有相同的PageRank值**。然后,根据我们上面所说的这个定义,更新所有页面的PageRank值。就这么一遍一遍地更新下去,直到所有页面的PageRank不再发生很大变化,或者说最后收敛到一个固定值为止。他们在文章中展示了实际计算的情况,往往是在比较少的迭代次数后,PageRank值就能够收敛。
|
||||
|
||||
以上就是整个PageRank算法的基本思想和一种迭代算法。
|
||||
|
||||
## PageRank算法的改进
|
||||
|
||||
完全按照我们上面介绍的这个最原始的PageRank算法,布林和佩奇很快就遇到了麻烦。
|
||||
|
||||
**第一个麻烦就是有一些页面并没有输出链接,比如某些PDF文件,或者一些图片文件**。由于没有输出链接,这些页面只能聚集从上游输入链接散发过来的PageRank值,而不能把自己的PageRank值分发出去。这样的结果就是,这些页面成为一些“悬空”(Dangling)结点。**悬空结点存在的最大问题就是会使得PageRank的计算变得不收敛**。这些结点成了PageRank值的“黑洞”,导致悬空结点的PageRank值越来越大,直至“吸干”其他所有输入链接的值。
|
||||
|
||||
要解决这个问题,就要为悬空结点“引流”,能够把这些点的值分发出去、引出去。**谢尔盖和拉里找到的一个方法是,对于每一个悬空结点,都认为这个结点能够随机到达整个网络上的其他任意一个结点**。也就相当于人工地从这个结点连接到所有页面的一个结点,让当前悬空结点的PageRank能够“均匀”地分散出去到其他所有的结点,这就解决了悬空结点的问题。
|
||||
|
||||
然而原始的PageRank还存在其他问题。要想保证PageRank的收敛性,并且能够收敛到唯一解,我们还需要第二个改进。**第二个改进就是,即便一个页面有自然的输出链接,我们也需要一个机制,能够从这个页面跳转到其他任何一个页面**。这也就是模拟假设一个用户已经浏览到了某个页面,一方面用户可以顺着这个页面提供的输出链接继续浏览下去,另一方面,这个用户可以随机跳转到其他任何一个页面。
|
||||
|
||||
有了这个机制以后,对于所有的结点来说,PageRank的分配也就自然地产生了变化。在之前的定义中,每个页面仅仅把自己的PageRank值输送给自己原生的所有输出链接中。而现在,这是一部分的“分享”,另外一部分还包括把自己的PageRank值分享到所有的页面。当然,后者的总量应该比前者要少。于是,**这里可以引入一个参数,来控制有多大的比例我们是顺着输出链接走,而多大的比例跳转其他页面**。通常情况下,这个参数的取值范围大约是60%~85%。
|
||||
|
||||
有了这两个改进之后,整个网络上的每个页面实际上已经可以到达其他任何页面。也就是说,**整个页面网络成了一个完全联通的图,PageRank算法就有了唯一的收敛的解**。
|
||||
|
||||
## PageRank分析
|
||||
|
||||
PageRank被提出后不久,就有学者开始针对PageRank模型和算法的性质进行分析。大家很快发现,还有一些其他的方法可以对PageRank进行解释。
|
||||
|
||||
**第一种比较流行的,也是更加正规的解释PageRank的方法,是把我们刚才说的这个分配等式写成矩阵的形式**。那么,整个算法就变成了一个标准的求解一个随机矩阵的“左特征向量”的过程。这个随机矩阵就是我们刚才讲的经过了两次修改后的跳转规律的矩阵形式。而刚才所说的迭代方法正好就是求解特征向量的“**乘幂法**”(Power Method)。在一定条件下的随机矩阵,经过乘幂法就一定能够得到一个唯一解。
|
||||
|
||||
**另外一种解释,是把刚才我们说的这个矩阵形式进行一次代数变形,也就是把等式两边的各项都移动到等式的一边,而另一边自然就是0**。那么,整个式子就变了一个“线性系统”的求解过程。也就是说从代数的角度来解释整个PageRank的求解过程。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了现代搜索技术中的一个重要分支,链接分析中最重要的算法PageRank的核心思想 。 一起来回顾下要点:第一,我们讲了PageRank的一些简明历史和算法最原始的定义和思路 。第二,我们讲了PageRank的两种改进。第三,我们简要地介绍了针对PageRank的两种解释方法。
|
||||
|
||||
最后,给你留一个思考题,除了乘幂法,你觉得还有什么方法可以用来求解PageRank值?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
**参考文献**
|
||||
|
||||
<li>
|
||||
Sergey Brin and Lawrence Page. The anatomy of a large-scale hypertextual Web search engine. **Proceedings of the seventh international conference on World Wide Web 7 (WWW7)**, Philip H. Enslow, Jr. and Allen Ellis (Eds.). Elsevier Science Publishers B. V., Amsterdam, The Netherlands, The Netherlands, 107-117, 1998.
|
||||
</li>
|
||||
<li>
|
||||
Langville, Amy N.; Meyer, Carl D. Deeper Inside PageRank. **Internet Math**. no. 3, 335-380, 2003.
|
||||
</li>
|
||||
|
||||
**论文链接**
|
||||
|
||||
<li>
|
||||
[The anatomy of a large-scale hypertextual Web search engine](http://infolab.stanford.edu/~backrub/google.html)
|
||||
</li>
|
||||
<li>
|
||||
[Deeper Inside PageRank](http://meyer.math.ncsu.edu/Meyer/PS_Files/DeeperInsidePR.pdf)
|
||||
</li>
|
||||
|
||||
|
67
极客时间专栏/AI技术内参/搜索核心技术/050 | 经典图算法之HITS.md
Normal file
67
极客时间专栏/AI技术内参/搜索核心技术/050 | 经典图算法之HITS.md
Normal file
@@ -0,0 +1,67 @@
|
||||
<audio id="audio" title="050 | 经典图算法之HITS" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/9a/5f/9aec39f1d0d0af55702431cf4f41aa5f.mp3"></audio>
|
||||
|
||||
这周我们分享的内容是如何理解网页和网页之间的关系。周一我们介绍了用图(Graph)来表达网页与网页之间的关系并计算网页的重要性,就是经典算法PageRank。今天我来介绍一下PageRank的姊妹算法:**HITS算法**。
|
||||
|
||||
## HITS的简要历史
|
||||
|
||||
HITS是Hypertext-Induced Topic Search算法的简称。这个算法是由康奈尔大学计算机科学教授乔·克莱恩堡(Jon Kleinberg)于1998年发明的,正好和我们周一讲的布林和佩奇发表PageRank算法是同一年。
|
||||
|
||||
这里有必要简单介绍一下乔这个人。乔于1971年出生在马萨诸塞州波士顿。1993年他毕业于康奈尔大学获得计算机科学学士学位,并于1996年从麻省理工大学获得计算机博士学位。1998的时候,乔正在位于美国西海岸硅谷地区的IBM阿尔玛登(Almaden)研究院做博士后研究。HITS的工作最早发表于1998年在旧金山举办的第九届ACM-SIAM离散算法年会上(详细论述可参阅参考文献)。
|
||||
|
||||
乔目前是美国国家工程院(National Academy of Engineering)和美国自然与人文科学院(American Academy of Arts and Sciences)院士。顺便提一下,乔的弟弟罗伯特·克莱恩堡也在康奈尔大学计算机系任教职。
|
||||
|
||||
## HITS的基本原理
|
||||
|
||||
在介绍HITS算法的基本原理之前,我们首先来复习一下网页的网络结构。每一个网页都有一个“输出链接”(Outlink)的集合。输出链接指的是从当前网页出发所指向的其他页面,比如从页面A有一个链接到页面B,那么B就是A的输出链接。根据这个定义,我们来看“输入链接”(Inlink),指的就是指向当前页面的其他页面,比如页面C指向页面A,那么C就是A的输入链接。
|
||||
|
||||
要理解HITS算法,我们还需要引入一组概念:**“权威”(Authority)结点**和**“枢纽”(Hub)结点**。这两类结点到底是什么意思呢?
|
||||
|
||||
HITS给出了一种“循环”的定义:**好的“权威”结点是很多“枢纽”结点的输出链接,好的“枢纽”结点则指向很多好的“权威”结点**。这种循环定义我们在PageRank的定义中已经见识过了。
|
||||
|
||||
很明显,要用数学的方法来表述权威结点和枢纽结点之间的关系就必须要为每一个页面准备两个值。因为从直觉上来说,不可能有一个页面完全是权威,也不可能有一个页面完全是枢纽。绝大多数页面都在这两种角色中转换,或者说同时扮演这两类角色。
|
||||
|
||||
数学上,对于每一个页面I,**我们用X来表达这个页面的“权威值”,用Y来表达这个页面的“枢纽值”**。那么,一个最直观的定义,对于I的权威值X来说,它是所有I页面的输入链接的枢纽值的总和。同理,I的枢纽值是所有I页面输出链接的权威值的总和。这就是HITS算法的原始定义。
|
||||
|
||||
我们可以看到,如果I页面的输入链接的枢纽值大,说明I页面经常被一些好的“枢纽”结点链接到,那么I自身的权威性自然也就增加了。反之,如果I能够经常指向好的“权威”结点,那I自身的“枢纽”性质也就显得重要了。
|
||||
|
||||
当然,和PageRank值一样,X和Y在HITS算法里也都是事先不可知的。因此,**HITS算法的重点就是要求解X和Y**。如果把所有页面的X和Y都表达成向量的形式,那么HITS算法可以写成X是矩阵L的转置和Y的乘积,而Y是矩阵L和X的乘积,这里的矩阵L就是一个邻接矩阵,每一行列表达某两个页面是否相连。进行一下代数变形,我们就可以得到X其实是一个矩阵A乘以X,这里的A是L的转置乘以L。Y其实是一个矩阵B乘以Y,这里的B是L乘以L的转置。
|
||||
|
||||
于是,惊人的一点出现了,那就是HITS算法其实是需要求解矩阵A或者矩阵B的主特征向量,也就是特征值最大所对应的特征向量,用于求解X或者Y。这一点和PageRank用矩阵表达的形式不谋而和。也就是说,尽管PageRank和HITS在思路和概念上完全不同,并且在最初的定义式上南辕北辙,但是经过一番变形之后,我们能够把两者都划归为**某种形式的矩阵求解特征向量的问题**。
|
||||
|
||||
实际上,**把图表达为矩阵,并且通过特征向量对图的一些特性进行分析是图算法中的一个重要分支**(当然,我们这里说的主要是最大的值对应的特征向量,还有其他的特征向量也有含义)。既然我们已经知道了需要计算最大的特征向量,那么之前计算PageRank所使用的“乘幂法”(Power Method)在这里也是可以使用的,我们在这里就不展开了。
|
||||
|
||||
如何把HITS算法用于搜索中呢?最开始提出HITS的时候是这么使用的。
|
||||
|
||||
**首先,我们根据某个查询关键字构建一个“相邻图”**(Neighborhood Graph)。这个图包括所有和这个查询关键字相关的页面。这里,我们可以简化为所有包含查询关键字的页面。这一步在现代搜索引擎中通过“倒排索引”(Inverted Index)就可以很容易地得到。
|
||||
|
||||
**有了这个相邻图以后,我们根据这个图建立邻接矩阵,然后就可以通过邻接矩阵计算这些结点的权威值和枢纽值**。当计算出这两组值之后,我们就可以根据这两组值给用户展现两种网页排序的结果,分别是根据不同的假设。
|
||||
|
||||
值得注意的是,PageRank是“查询关键字无关”(Query-Independent)的算法,也就是说每个页面的PageRank值并不随着查询关键字的不同而产生不同。而HITS算法是“查询关键字相关”(Query-Dependent)的算法。从这一点来说,HITS就和PageRank有本质的不同。
|
||||
|
||||
## HITS算法的一些特点
|
||||
|
||||
HITS算法依靠这种迭代的方法来计算权威值和枢纽值,你一定很好奇,这样的计算究竟收敛吗?是不是也需要像PageRank一样来进行特别的处理呢?
|
||||
|
||||
**答案是HITS一定是收敛的**。这点比原始的PageRank情况要好。然而,HITS在原始的情况下,不一定收敛到唯一一组权威值和枢纽值,也就是说,解是不唯一的。因此,我们其实需要对HITS进行一部分类似于PageRank的处理,那就是让HITS的邻接矩阵里面所有的结点都能够达到其他任何结点,只是以比较小的概率。经过这样修改,HITS就能够收敛到唯一的权威值和枢纽值了。
|
||||
|
||||
**HITS算法的好处是为用户提供了一种全新的视角,对于同一个查询关键字,HITS提供的权威排序和枢纽排序能够帮助用户理解自己的需求**。
|
||||
|
||||
当然,**HITS的弱点也来自于这个依赖于查询关键字的问题**。如果把所有的计算都留在用户输入查询关键字以后,并且需要在响应时间内计算出所有的权威值和枢纽值然后进行排序,这里面的计算量是很大的。所以,后来有研究者开始使用全局的网页图,提前来计算所有页面的权威值和枢纽值,然而这样做就失去了对某一个关键字的相关信息。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了HITS算法的核心思想 。 一起来回顾下要点:第一,我们讲了HITS的一些简明历史。第二,我们讲了HITS最原始的定义和算法,并且联系PageRank,讲了两者的异同之处。第三,我们分析了HITS的一些特点。
|
||||
|
||||
最后,给你留一个思考题,有没有办法把权威值和枢纽值所对应的两个排序合并成为一个排序呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
**参考文献**
|
||||
|
||||
1. Jon M. Kleinberg. **Authoritative sources in a hyperlinked environment**. J. ACM 46, 5 (September 1999), 604-632,1999.
|
||||
|
||||
**论文链接**
|
||||
|
||||
- [Authoritative sources in a hyperlinked environment](http://www.woodmann.com/searchlores/library/authoratitativesources.pdf)
|
||||
|
||||
|
55
极客时间专栏/AI技术内参/搜索核心技术/051 | 社区检测算法之“模块最大化 ”.md
Normal file
55
极客时间专栏/AI技术内参/搜索核心技术/051 | 社区检测算法之“模块最大化 ”.md
Normal file
@@ -0,0 +1,55 @@
|
||||
<audio id="audio" title="051 | 社区检测算法之“模块最大化 ”" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/17/a3/177cf689c0b00f8ce67cc46427b3aea3.mp3"></audio>
|
||||
|
||||
一起来回顾下本周的内容。周一我们介绍了用图(Graph)来表达网页与网页之间的关系并计算网页的重要性,就是经典的PageRank算法。周三我们介绍了PageRank的一个姊妹算法,HITS算法,并且分析了这两种算法的内在联系,这两类算法都希望给网页赋予一个权重来表达网页的重要性。
|
||||
|
||||
今天,我们来看一类完全不一样的网页分析工具,那就是希望把网页所代表的图分割成小块的图,或者叫图聚类,每个小聚类代表一个“社区”。这类分析有时候被称作图上面的“**社区检测**”(Community Detection),意思就是从一个图上挖掘出潜在的社区结构。
|
||||
|
||||
## 社区检测的简要历史
|
||||
|
||||
提到社区检测就不得不提到这么一位学者,他与我们今天要介绍的算法有非常紧密的联系,而且他的研究在2000年~2010年间成了社区检测研究的标杆,影响了后续的大量研究工作。这位学者就是密歇根大学(University of Michigan)的物理学教授马克·纽曼(Mark Newman)。
|
||||
|
||||
1991年,纽曼从牛津大学获得理论物理博士学位。在接下来的10年里,他在康奈尔大学和圣塔菲学院(Santa Fe Institute)分别担任博士后研究员和研究教授。2002年,纽曼来到密歇根大学物理系担任教授,并且一直在这里进行网络科学(Network Science)的基础研究。
|
||||
|
||||
2006年,纽曼在《物理评论》杂志上发表了一个叫“**模块最大化**”(Modularity Maximization)的社区检测算法。从某种程度上来说,这个算法很快就成了社区检测的标准算法,吸引了研究领域的广泛关注,激发了大量的针对这个算法的分析和研究。对这个算法的最原始论述,请参阅参考文献[1]和[2]。
|
||||
|
||||
今天我们就来讲一讲这个“模块最大化”算法的基本原理。
|
||||
|
||||
## 模块最大化的基本原理
|
||||
|
||||
在我们讲解模块最大化算法之前,我们先来看一看“社区”的含义。在图分析以及网络科学中,**“社区”定义为一组结点,它们互相之间的联系比它们跟社区之外结点的联系要更加紧密**。你可以注意到,在这个定义中,什么叫紧密,怎么来衡量“更紧密”这个关系都是没有说明的,这就为各类社区检测算法或模型带来了很大的发挥空间。
|
||||
|
||||
社区检测(有时候也说社区发掘)算法的核心就是要**根据给定的一组结点和它们之间的关系,在无监督的情况找到这些社区,并分配哪些结点属于哪个社区**。
|
||||
|
||||
我们先来谈一谈**“模块最大化”的一个整体思路**。这里,我们讨论一种简化的情况,那就是如何把一个网络分割成两个社区。首先,算法按照某种随机的初始化条件,把网络分成两个社区。然后,算法逐一检查每一个结点,看如果把这个点划归到另外一个社区的话,会不会增加“模块化”这个目标函数。最终,算法决定改变那些能够最大化模块化目标的结点的社区赋值。然后整个算法不断重复这个过程,直到社区的赋值不再发生变化。
|
||||
|
||||
现在我们来讨论一下模块化这个目标函数。根据上面提到的社区含义,我们希望社区里结点之间的联系紧密。**在模块化目标函数里,就表达为两个结点的连接数目减去这两个结点之间的“期望连接数”**。模块化最大化说的就是,对于同一个社区中的所有结点,我们希望这个差值的和最大化。什么意思呢?就是说,如果我们把两个结点放到一个社区中,那它们的连接数(其实就是1或者0)要足够大于它们之间的连接数的期望值,这就解决了我们刚才所说的如何来衡量“更加紧密”的难题。
|
||||
|
||||
那么,怎么来定义两个结点之间的“期望连接数”呢?最初纽曼在介绍模块最大化的时候,他给出了这么一个计算方法。那就是,用两个结点各自的总连接数相乘,除以整个网络的总连接数的2倍。直观上说,这是在衡量这两个结点之间出现任何连接的可能性。
|
||||
|
||||
那么,整个模块最大化的目标函数就是,针对现在网络中的所有结点,根据它们是否在同一个社区,我们计算他们两两之间的模块化数值,也就是它们之间的连接减去“期望连接数”,最后对所有的两两配对进行加和。我们希望这个目标函数最大化,这个目标函数中的未知数,就是社区的分配,也就是哪个结点属于哪个社区。一旦社区的分配已知,整个模块最大化这个目标函数的数值就可以很容易地计算出来。
|
||||
|
||||
那么如何得到这些社区的分配呢?和我们之前介绍的PageRank以及HITS的思路类似,纽曼使用了矩阵的表达方法对整个模块最大化进行了一个重构,经过一系列代数变形之后[1],纽曼得到了一个新的目标函数,那就是一个向量s的转置,乘以一个矩阵B,然后再乘以向量s,最后除以4倍的网络连接总数。这里,向量s代表了一个结点是否属于两个社区中的一个,矩阵B中的每一个元素表示了横纵坐标所代表的两个结点的模块化值。问题就是求解s的值。请注意,s中的值是离散的,要么是正1(代表属于两个社区中的一个)要么是负1(代表属于两个社区中的另一个)。很明显,这是一个困难的离散优化问题。
|
||||
|
||||
**纽曼对这个复杂的离散优化问题进行了近似处理的方法**。具体来说,那就是允许s的值不仅仅是正负1而是实数,这样就大大简化了优化问题的难度。在设置好最优化这个新的目标函数之后,经过代数变形,我们得到了一个惊人的结论,那就是最优情况下的s,实际就是矩阵B最大的特征值所对应的特征向量。这又和PageRank以及HITS有着极其相似的最优结构。在找最大特征向量的过程中找到s以后,我们就根据s里元素的正负号,正的属于一个社区,负的属于另外一个社区,来对整个网络中的结点进行划分。
|
||||
|
||||
当然,我们这里讲的仅仅是把整个网络进行二分的情况。在实际应用中,我们往往需要把整个网络划分成多个社区。纽曼在论文中[1]也讲解了**如何把二分法推广到多个社区的情景**。具体来说,就是先把一个网络分成两份,然后再不断地二分下去。不过,每次进行二分的时候,我们都需要检查是否对模块化目标函数起了正向的帮助,而不只是机械地进行二分。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了社区检测中一个有代表性的算法:模块最大化 。 一起来回顾下要点:第一,我们讲了什么是社区检测以及社区检测的一些简明历史。第二,我们讲了模块最大化的的基本思想,比如模块最大化是如何定义的,又是如何把一个困难的离散优化问题转换成类似HITS和PageRank的寻找最大特征向量的问题 。
|
||||
|
||||
最后,给你留一个思考题,如何把网页的社区信息利用到学习网页的相关度里面去呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
**参考文献**
|
||||
|
||||
1. M. E. J. Newman. **Modularity and community structure in networks**. Proc. Natl. Acad. Sci. USA 103, 8577–8582 , 2006.
|
||||
1. M. E. J. Newman. **Finding community structure in networks using the eigenvectors of matrices**. Phys. Rev. E 74, 036104 , 2006.
|
||||
|
||||
**论文链接**
|
||||
|
||||
1. [Modularity and community structure in networks](http://www.pnas.org/content/103/23/8577.full.pdf)
|
||||
1. [Finding community structure in networks using the eigenvectors of matrices](https://arxiv.org/pdf/physics/0605087.pdf)
|
||||
|
||||
|
84
极客时间专栏/AI技术内参/搜索核心技术/052 | 机器学习排序算法经典模型:RankSVM.md
Normal file
84
极客时间专栏/AI技术内参/搜索核心技术/052 | 机器学习排序算法经典模型:RankSVM.md
Normal file
@@ -0,0 +1,84 @@
|
||||
<audio id="audio" title="052 | 机器学习排序算法经典模型:RankSVM" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/5c/30/5c4826b79b929ff585c73a5db7dfbf30.mp3"></audio>
|
||||
|
||||
到目前为止,我们在专栏里已经讨论了关于搜索引擎方方面面的很多话题,包括经典的信息检索技术、查询关键字理解、文档理解以及现代搜索引擎的架构等等 。同时,我们也从机器学习角度出发对搜索引擎的最核心部分,也就是排序算法进行了最基本的分享,囊括了单点法排序学习(Pointwise Learning to Rank)、配对法排序学习(Pairwise Learning to Rank)以及列表法排序学习(Listwise Learning to Rank),相信你应该对这类算法的大概内容有所掌握。
|
||||
|
||||
那么,这周我们就来看看机器学习排序算法中几个经典的模型,希望能够通过这几个经典的算法为你深入学习和研究排序算法指明方向。
|
||||
|
||||
今天,我就来分享配对法排序中最有价值一个算法,**排序支持向量机**(RankSVM)。这个算法的核心思想是**应用支持向量机到序列数据中,试图对数据间的顺序直接进行建模**。
|
||||
|
||||
## 排序支持向量机的历史
|
||||
|
||||
20世纪90年代中后期,受统计学习理论(Statistical Learning Theory )思想和风险最小化框架(Risk Minimization Framework)趋于成熟的影响,支持向量机逐渐成为当时机器学习界的主流模型。一时间,各个应用领域的学者和工程师都在思考如何把支持向量机利用到自己的问题领域上,从而获得更好的效果。
|
||||
|
||||
拉夫⋅赫博里奇(Ralf Herbrich)发表于1999年[1]和2000年[2]的论文中讨论了如何把支持向量机和有序回归(Ordinal Regression)结合起来。赫博里奇当时在柏林科技大学(Technical University of Berlin)攻读博士学位。2000年到2011年,他在微软研究院和Bing任职,从事机器学习,特别是贝叶斯方法(Bayesian method)的研究。2011年到2012年,他在Facebook短暂任职后,于2012年加入了亚马逊负责机器学习的研发工作,并且担任在柏林的研发中心主管经理(Managing Director)。尽管赫博里奇很早提出了把有序回归和支持向量机结合的思路,但是当时的论文并没有真正地把这个新模型用于大规模搜索系统的验证。
|
||||
|
||||
更加完整地对排序支持向量机在搜索中的应用进行论述来自于康奈尔大学教授索斯腾⋅乔基姆斯(Thorsten Joachims)以及他和合作者们发表的一系列论文(见参考文献[3]、[4]、[5]和[6])。索斯滕我们前面介绍过,他是机器学习界享有盛誉的学者,是ACM和AAAI的双料院士;他所有论文的引用数超过4万次;他获得过一系列奖项,包括我们前面讲的2017年ACM KDD的时间检验奖等等。
|
||||
|
||||
## 排序支持向量机模型
|
||||
|
||||
在说明排序支持向量机之前,我们先来简要地回顾一下支持向量机的基本思想。
|
||||
|
||||
在二分分类问题中(Binary Classification),线性支持向量机的核心思想是找到一个“超平面”(Hyperplane)把正例和负例完美分割开。在诸多可能的超平面中,支持向量机尝试找到距离两部分数据点边界距离最远的那一个。这也就是为什么有时候支持向量机又被称作是**“边界最大化”(Large Margin)分类器**。
|
||||
|
||||
如果问题并不是线性可分的情况,支持向量机还可以借助“**核技巧**”(Kernel Trick)来把输入特性通过非线性变换转化到一个线性可分的情况。关于支持向量机的具体内容你可以参考各类机器学习教科书的论述。
|
||||
|
||||
**要把支持向量机运用到排序场景下,必须改变一下原来的问题设置**。我们假设每个数据点由特性X和标签Y组成。这里的X代表当前文档的信息、文档与查询关键字的相关度、查询关键字的信息等方方面面关于文档以及查询关键字的属性。Y是一个代表相关度的整数,通常情况下大于1。
|
||||
|
||||
那么,在这样的设置下,我们针对不同的X,需要学习到一个模型能够准确地预测出Y的顺序。意思是说,如果有两个数据点$X_1$和$X_2$,他们对应的$Y_1$是3,$Y_2$是5。因为$Y_2$大于$Y_1$(在这里,“大于”表明一个顺序),因此,一个合理的排序模型需要把$X_1$通过某种转换,使得到的结果小于同样的转换作用于$X_2$上。这里的转换,就是排序支持向量机需要学习到的模型。
|
||||
|
||||
具体说来,在线性假设下,排序支持向量机就是要学习到一组线性系数W,使得在上面这个例子中,$X_2$点积W之后的结果要大于$X_1$点积W的结果。当然,对于整个数据集而言,我们不仅仅需要对$X_1$和$X_2$这两个数据点进行合理预测,还需要对所有的点,以及他们之间所有的顺序关系进行建模。也就是说,模型的参数W需要使得数据集上所有数据点的顺序关系的预测都准确。
|
||||
|
||||
很明显,上述模型是非常严格的。而实际中,很可能并不存在这样的W可以完全使得所有的X都满足这样的条件。这也就是我们之前说的线性不可分在排序中的情况。那么,更加现实的一个定义是,**在允许有一定误差的情况下,如何使得W可以准确预测所有数据之间的顺序关系,并且W所确定的超平面到达两边数据的边界最大化**,这就是线性排序向量机的定义。
|
||||
|
||||
实际上,在线性分类器的情境下,线性排序向量机是针对数据配对(Pair)的差值进行建模的。回到刚才我们所说的例子,线性排序向量机是把$X_2$减去$X_1$的差值当做新的特性向量,然后学习W。也就是说,原理上说,整个支持向量机的所有理论和方法都可以不加改变地应用到这个新的特征向量空间中。当然,这个情况仅仅针对线性分类器。
|
||||
|
||||
**因为是针对两个数据点之间的关系进行建模,排序支持向量机也就成为配对法排序学习的一个经典模型**。
|
||||
|
||||
## 排序支持向量机的难点
|
||||
|
||||
我们刚刚提到的排序支持向量机的定义方法虽然很直观,但是有一个非常大的问题,那就是**复杂度是N的平方级,这里的N是数据点的数目**。原因是我们需要对数据点与点之间的所有配对进行建模。 当我们要对上万,甚至上百万的文档建模的时候,直接利用排序支持向量机的定义来求解模型参数显然是不可行的。
|
||||
|
||||
于是,针对排序支持向量机的研究和应用就集中在了**如何能够降低计算复杂度**这一难点上,使得算法可以在大规模数据上得以使用。
|
||||
|
||||
比较实用的算法是索斯腾在2006年发表的论文[6]中提出的,这篇论文就是我们前面讲的2017年KDD时间检验奖,建议你回去复习一下。这里,我再简要地梳理一下要点。
|
||||
|
||||
这个算法的核心是重新思考了对排序支持向量机整个问题的设置,把解决结构化向量机(Structural SVM)的一种算法,CP算法(Cutting-Plane),使用到了排序支持向量机上。简单来说,这个算法就是保持一个工作集合(Working Set)来存放当前循环时依然被违反的约束条件(Constraints),然后在下一轮中集中优化这部分工作集合的约束条件。整个流程开始于一个空的工作集合,每一轮优化的是一个基于当前工作集合的支持向量机子问题。算法直到所有约束条件的误差小于一个全局的参数误差为止。
|
||||
|
||||
索斯腾在文章中详细证明了该算法的有效性和时间复杂度。相同的方法也使得排序支持向量机的算法能够转换成为更加计算有效的优化过程,在线性计算复杂度的情况下完成。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了利用机器学习技术来学习排序算法的一个基础的算法,排序支持向量机的基本原理。作为配对法排序学习的一个经典算法,排序支持向量机有着广泛的应用 。 一起来回顾下要点:第一,我们简要介绍了排序支持向量机提出的历史背景。第二,我们详细介绍了排序支持向量机的问题设置。第三,我们简要提及了排序支持向量机的难点和一个实用的算法。
|
||||
|
||||
最后,给你留一个思考题,排序支持向量机是否给了你一些启发,让你可以把更加简单的对数几率分类器(Logistic Regression)应用到排序问题上呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
**参考文献**
|
||||
|
||||
1. Herbrich, R.; Graepel, T. & Obermayer, K. Support vector learning for ordinal regression. **The Ninth International Conference on Artificial Neural Networks** (ICANN 99), 1, 97-102 vol.1, 1999.
|
||||
1. Herbrich, R.; Graepel, T. & Obermayer, K. Smola; Bartlett; Schoelkopf & Schuurmans (Eds.). Large margin rank boundaries for ordinal regression. **Advances in Large Margin Classifiers**, MIT Press, Cambridge, MA, 2000.
|
||||
1. Tsochantaridis, I.; Hofmann, T.; Joachims, T. & Altun, Y. Support Vector Machine Learning for Interdependent and Structured Output Spaces. **Proceedings of the Twenty-first International Conference on Machine Learning**, ACM, 2004.
|
||||
1. Joachims, T. A Support Vector Method for Multivariate Performance Measures. **Proceedings of the 22Nd International Conference on Machine Learning**, ACM, 377-384, 2005.
|
||||
1. Tsochantaridis, I.; Joachims, T.; Hofmann, T. & Altun, Y. Large Margin Methods for Structured and Interdependent Output Variables. **The Journal of Machine Learning Research**, 6, 1453-1484, 2005.
|
||||
1. Joachims, T. Training Linear SVMs in Linear Time. **Proceedings of the 12th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining**, ACM, 217-226, 2006.
|
||||
|
||||
**论文链接**
|
||||
|
||||
<li>
|
||||
[Support vector learning for ordinal regression](hhttp://www.herbrich.me/papers/icann99_ordinal.pdf)
|
||||
</li>
|
||||
<li>
|
||||
[Support Vector Machine Learning for Interdependent and Structured Output Spaces](http://www.machinelearning.org/proceedings/icml2004/papers/76.pdf)
|
||||
</li>
|
||||
<li>
|
||||
[A Support Vector Method for Multivariate Performance Measures](https://www.cs.cornell.edu/people/tj/publications/joachims_05a.pdf)
|
||||
</li>
|
||||
<li>
|
||||
[Large Margin Methods for Structured and Interdependent Output Variables](http://www.jmlr.org/papers/volume6/tsochantaridis05a/tsochantaridis05a.pdf)
|
||||
</li>
|
||||
<li>
|
||||
[Training Linear SVMs in Linear Time](https://www.cs.cornell.edu/people/tj/publications/joachims_06a.pdf)
|
||||
</li>
|
||||
|
||||
|
81
极客时间专栏/AI技术内参/搜索核心技术/053 | 机器学习排序算法经典模型:GBDT.md
Normal file
81
极客时间专栏/AI技术内参/搜索核心技术/053 | 机器学习排序算法经典模型:GBDT.md
Normal file
@@ -0,0 +1,81 @@
|
||||
<audio id="audio" title="053 | 机器学习排序算法经典模型:GBDT" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/ce/11/cefbc6de59f9f1a176d4f78562eb2411.mp3"></audio>
|
||||
|
||||
这周我们讨论机器学习排序算法中几个经典的模型,周一分享了配对法排序中的一个经典算法,即排序支持向量机(RankSVM),这个算法的核心思想是把支持向量机应用到有序数据中,试图对数据间的顺序进行直接建模。
|
||||
|
||||
今天,我们来聊一聊利用机器学习进行排序的一个重要算法:**“梯度增强决策树”(Gradient Boosted Decision Tree)**。长期以来,包括雅虎在内的很多商业搜索引擎都利用这种算法作为排序算法。
|
||||
|
||||
## 梯度增强决策树的历史
|
||||
|
||||
梯度回归决策树的思想来源于两个地方。首先是“**增强算法**”(Boosting),一种试图用弱学习器提升为强学习器的算法。这种算法中比较成熟的、有代表性的算法是由罗伯特⋅施派尔(Robert Schapire)和约阿夫⋅福伦德(Yoav Freund)所提出的**AdaBoost算法**[1]。因为这个算法两人于2003年获得理论计算机界的重要奖项“哥德尔奖”(Gödel Prize)。罗伯特之前在普林斯顿大学任计算机系教授,目前在微软研究院的纽约实验室工作。约阿夫一直在加州大学圣地亚哥分校任计算机系教授。
|
||||
|
||||
增强算法的工作机制都比较类似,那就是先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器。如此重复进行,直到基学习器数目达到事先制定的值,最终将所有的基学习器进行加权结合。如果你对“偏差-方差分解”(Bias-Variance Decomposition)有耳闻的话,那么,Boosting主要关注降低偏差。**在实际效果中,增强算法往往能基于泛化性能相当弱的学习器构建出很强的集成结果**。
|
||||
|
||||
AdaBoost提出后不久,机器学习学者和统计学家杰罗姆⋅弗赖德曼(Jerome H. Friedman)等人发表了一篇论文[2],**从“统计视角”解释AdaBoost实质上是基于加性模型(Additive Model)以类似牛顿迭代法来优化指数损失函数(Loss Function)**。于是受此启发,杰米姆提出了“**梯度增强**”(Gradient Boosting)的想法。这也就是梯度回归决策树思想来源的第二个地方,也是直接根源。如果你希望对“梯度增强”有进一步的了解,可以见参考文献[3]。
|
||||
|
||||
最早把“梯度增强”的想法应用到搜索中,是雅虎研究院的学者于2007年左右提出的[4]&[5]。之后,Facebook把梯度增强决策树应用于新闻推荐中[6]。
|
||||
|
||||
## 梯度增强的思想核心
|
||||
|
||||
我们刚才简单讲了增强算法的思路,那么要想理解梯度增强决策树,就必须理解梯度增强的想法。
|
||||
|
||||
**梯度增强首先还是增强算法的一个扩展,也是希望能用一系列的弱学习器来达到一个强学习器的效果,从而逼近目标变量的值,也就是我们常说的标签值**。而根据加性模型的假设,这种逼近效果是这些弱学习器的一个加权平均。也就是说,最终的预测效果,是所有单个弱学习器的一个平均效果,只不过这个平均不是简单的平均,而是一个加权的效果。
|
||||
|
||||
那么如何来构造这些弱学习器和加权平均的权重呢?
|
||||
|
||||
**梯度增强采用了一个统计学或者说是优化理论的视角,使得构造这些部分变得更加直观**。
|
||||
|
||||
梯度增强的作者们意识到,如果使用“梯度下降”(Gradient Descent)来优化一个目标函数,最后的预测式可以写成一个加和的形式。也就是,每一轮梯度的值和一个叫“学习速率”(Learning Rate)的参数共同叠加起来形成了最后的预测结果。这个观察非常重要,如果把这个观察和我们的目标,也就是构造弱学习器的加权平均联系起来看,我们就会发现,**其实每个梯度的值就可以认为是一个弱学习器,而学习速率就可以看作是某种意义上的权重**。
|
||||
|
||||
有了这个思路,梯度增强的算法就很容易构造了。
|
||||
|
||||
**首先,这是一个迭代算法**。每一轮迭代,我们把当前所有学习器的加权平均结果当作这一轮的函数值,然后求得针对某一个损失函数对于当前所有学习器的参数的一个梯度。**然后,我们利用某一个弱学习器算法,可以是线性回归模型(Linear Regression)、对数几率模型(Logistic Regression)等来拟合这个梯度**。**最后,我们利用“线查找”(Line Search)的方式找到权重**。说得更直白一些,那就是我们尝试利用一些简单的模型来拟合不同迭代轮数的梯度。
|
||||
|
||||
梯度增强的一个特点就是梯度下降本身带来的,那就是每一轮迭代一定是去拟合比上一轮小的一个梯度,函数对目标的整体拟合也是越来越好的。这其实也就是增强算法和梯度下降的一个完美结合。
|
||||
|
||||
## 梯度增强决策树以及在搜索的应用
|
||||
|
||||
理解了梯度增强,那么梯度增强决策树也就容易理解了。简单来说,**梯度增强决策树就是利用决策树,这种最基本的学习器来当作弱学习器,去拟合梯度增强过程中的梯度**。然后融合到整个梯度增强的过程中,最终,梯度增强决策树其实就是每一轮迭代都拟合一个新的决策树用来表达当前的梯度,然后跟前面已经有的决策树进行叠加。在整个过程中,决策树的形状,比如有多少层、总共有多少节点等,都是可以调整的或者学习的**超参数**。而总共有多少棵决策树,也就是有多少轮迭代是重要的**调节参数**,也是防止整个学习过程过拟合的重要手段。
|
||||
|
||||
参考文献[5]和[6],就是雅虎的科学家第一次把刚才提到的这个思路用于搜索问题中,训练排序算法。在应用的时候,有一些细节的调整,比如**损失函数的设定**。这里,作者们采用了配对法排序学习方法,那就是不直接去拟合相关度,而是拟合两个不同文档相关度的差值。具体来说,就是针对某一个查询关键字,我们利用算法来最小化对文档相关度差值的预测,也就是说我们不希望把相关度高的文档放到相关度低的后面。
|
||||
|
||||
在这些论文中,还有后续的很多研究中,利用梯度增强决策树算法进行排序训练得到的效果比当时的其他算法都有大幅度的提升。因此,这也就慢慢地奠定了**梯度增强决策树作为一种普适的机器学习排序算法**的地位。值得说明的是,梯度增强决策树的成功,一部分来自于增强算法,另一部分来自于把很多决策树堆积起来的想法。这两个思路都是在机器学习中被反复验证、行之有效的“模式”。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了梯度增强决策树算法的基本原理,这是一个利用机器学习技术来学习排序的基础算法。作为配对法排序学习的一个经典算法,梯度增强决策树算法有着广泛的应用 。 一起来回顾下要点:第一,我们简要介绍了梯度增强决策树提出的历史。第二,我们详细介绍了增强算法的核心以及梯度增强的思路。第三,我们简要介绍了梯度增强决策树的核心以及如何利用这个算法来训练排序问题。
|
||||
|
||||
最后,给你留一个思考题,梯度增强的思路能和神经网络模型结合吗?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
**参考文献**
|
||||
|
||||
1. Yoav Freund and Robert E Schapire. A Decision-Theoretic Generalization of On-Line Learning and an Application to Boosting. J. Comput. Syst. Sci. 55, 1 (August 1997), 119-139, 1997.
|
||||
1. Friedman, Jerome; Hastie, Trevor; Tibshirani, Robert. Additive logistic regression: a statistical view of boosting (With discussion and a rejoinder by the authors). Ann. Statist. 28 (2000), no. 2, 337–407, 2000.
|
||||
1. Friedman, Jerome H. Greedy function approximation: a gradient boosting machine. Annals of Statistics (2001): 1189–1232, 2001.
|
||||
1. Zhaohui Zheng, Hongyuan Zha, Tong Zhang, Olivier Chapelle, Keke Chen, and Gordon Sun. A general boosting method and its application to learning ranking functions for web search. Proceedings of the 20th International Conference on Neural Information Processing Systems (NIPS’07), J. C. Platt, D. Koller, Y. Singer, and S. T. Roweis (Eds.). Curran Associates Inc., USA, 1697-1704, 2007.
|
||||
1. Zhaohui Zheng, Keke Chen, Gordon Sun, and Hongyuan Zha. A regression framework for learning ranking functions using relative relevance judgments. Proceedings of the 30th annual international ACM SIGIR conference on Research and development in information retrieval (SIGIR '07). ACM, New York, NY, USA, 287-294, 2007.
|
||||
1. Xinran He, Junfeng Pan, Ou Jin, Tianbing Xu, Bo Liu, Tao Xu, Yanxin Shi, Antoine Atallah, Ralf Herbrich, Stuart Bowers, and Joaquin Quiñonero Candela. Practical Lessons from Predicting Clicks on Ads at Facebook. Proceedings of the Eighth International Workshop on Data Mining for Online Advertising (ADKDD’14). ACM, New York, NY, USA, , Article 5 , 9 pages, 2014.
|
||||
|
||||
**论文链接**
|
||||
|
||||
<li>
|
||||
[A Decision-Theoretic Generalization of On-Line Learning and an Application to Boosting](http://www.face-rec.org/algorithms/Boosting-Ensemble/decision-theoretic_generalization.pdf)
|
||||
</li>
|
||||
<li>
|
||||
[Additive logistic regression: a statistical view of boosting](https://web.stanford.edu/~hastie/Papers/AdditiveLogisticRegression/alr.pdf)
|
||||
</li>
|
||||
<li>
|
||||
[Greedy function approximation: a gradient boosting machine](https://statweb.stanford.edu/~jhf/ftp/trebst.pdf)
|
||||
</li>
|
||||
<li>
|
||||
[A general boosting method and its application to learning ranking functions for web search](https://corescholar.libraries.wright.edu/cgi/viewcontent.cgi?referer=https://www.google.com.hk/&httpsredir=1&article=1314&context=knoesis)
|
||||
</li>
|
||||
<li>
|
||||
[A regression framework for learning ranking functions using relative relevance judgments](https://www.cc.gatech.edu/~zha/papers/fp086-zheng.pdf)
|
||||
</li>
|
||||
<li>
|
||||
[Practical Lessons from Predicting Clicks on Ads at Facebook](http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=A54CCA7D4A8F05B6636C9D64316BCF96?doi=10.1.1.718.9050&rep=rep1&type=pdf)
|
||||
</li>
|
||||
|
||||
|
87
极客时间专栏/AI技术内参/搜索核心技术/054 | 机器学习排序算法经典模型:LambdaMART.md
Normal file
87
极客时间专栏/AI技术内参/搜索核心技术/054 | 机器学习排序算法经典模型:LambdaMART.md
Normal file
@@ -0,0 +1,87 @@
|
||||
<audio id="audio" title="054 | 机器学习排序算法经典模型:LambdaMART" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/09/fb/09d67f5e67432af98fef09fb717958fb.mp3"></audio>
|
||||
|
||||
在这周的时间里,我们讨论机器学习排序算法中几个经典的模型。周一我们分享了排序支持向量机(RankSVM),这个算法的好处是模型是线性的,容易理解。周三我们聊了梯度增强决策树(Gradient Boosted Decision Tree),长期以来,这种算法被用在很多商业搜索引擎当中来作为排序算法。
|
||||
|
||||
今天,我们来分享这一部分的最后一个经典模型:**LambdaMART**。这是微软在Bing中使用了较长时间的模型,也在机器学习排序这个领域享有盛誉。
|
||||
|
||||
## LambdaMART的历史
|
||||
|
||||
LambdaMART的提出可以说是一个“三步曲”。
|
||||
|
||||
这里有一个核心人物,叫克里斯多夫⋅博格斯(Christopher J.C. Burges)。博格斯早年从牛津大学物理学毕业之后,又于布兰戴斯大学(Brandeis University)获得物理学博士学位,他曾在麻省理工大学做过短暂的博士后研究,之后来到贝尔实验室,一待14年。2000年,他来到微软研究院,并一直在微软研究院从事机器学习和人工智能的研究工作,直到2016年退休。可以说,是博格斯领导的团队发明了微软搜索引擎Bing的算法。
|
||||
|
||||
**LambdaMART的第一步来自于一个叫RankNet的思想**[1]。这个模型发表于ICML 2005,并且在10年之后获得ICML的时间检验奖。这也算是在深度学习火热之前,利用神经网络进行大规模商业应用的经典案例。
|
||||
|
||||
RankNet之后,博格斯的团队很快意识到了RankNet并不能直接优化搜索的评价指标。因此他们根据一个惊人的发现,**提出了LambdaRank这一重要方法**[2]。LambdaRank的进步在于算法开始和搜索的评价指标,也就是NDCG挂钩,也就能够大幅度提高算法的精度。
|
||||
|
||||
LambdaRank之后,博格斯的团队也认识到了当时从雅虎开始流行的使用“梯度增强”(Gradient Boosting),特别是“梯度增强决策树”(GBDT)的思路来进行排序算法的训练,于是他们就把LambdaRank和GBDT的思想结合起来,**开发出了更加具有模型表现力的LambdaMART**[3]。LambdaMART在之后的雅虎排序学习比赛中获得了最佳成绩。
|
||||
|
||||
## RankNet的思想核心
|
||||
|
||||
要理解LambdaMART,我们首先要从RankNet说起。其实,有了排序支持向量机RankSVM的理论基础,要理解RankNet就非常容易。RankNet是一个和排序支持向量机非常类似的配对法排序模型。也就是说,RankNet尝试正确学习每组两两文档的顺序。那么,怎么来定义这个所谓的两两文档的顺序呢?
|
||||
|
||||
其实,我们需要做的就是**定义一个损失函数(Loss Function)来描述如何引导模型学习正确的两两关系**。我们可以假设能够有文档两两关系的标签,也就是某一个文档比另外一个文档更加相关的信息。这个信息可以是二元的,比如+1代表更加相关,-1代表更加不相关,注意这里的“更加”表达了次序关系。
|
||||
|
||||
那么,在理想状态下,不管我们使用什么模型,都希望模型的输出和这个标签信息是匹配的,也就是说模型对于更加相关的文档应该输出更加高的预测值,反之亦然。很自然,**我们能够使用一个二元分类器的办法来处理这样的关系**。RankNet在这里使用了“对数几率损失函数”(Logistic Loss),其实就是希望能够利用“对数几率回归”(Logistic Regression)这一思想来处理这个二元关系。唯一的区别是,这里的正例是两个文档的相对关系。
|
||||
|
||||
有了损失函数之后,我们使用什么模型来最小化这个损失函数呢?在RankNet中,作者们使用了神经网络模型,这也就是Net部分的由来。那么,整个模型在这里就变得异常清晰,那就是**使用神经网络模型来对文档与文档之间的相对相关度进行建模,而损失函数选用了“对数几率损失函数”**。
|
||||
|
||||
## LambdaRank和LambdaMART
|
||||
|
||||
尽管RankNet取得了一些成功,但是,文档的两两相对关系并不和搜索评价指标直接相关。我们之前讲过,搜索评价指标,例如NDCG或者MAP等,都是直接建立在对于某一个查询关键字的相关文档的整个序列上,或者至少是序列的头部(Top-K)的整个关系上的。因此,RankNet并不能保证在NDCG这些指标上能够达到很好的效果,因为毕竟没有直接或者间接优化这样的指标。
|
||||
|
||||
要想认识这一点其实很容易,比如你可以设想对于某一个查询关键字,有10个文档,其中有两个相关的文档,一个相关度是5,另外一个相关度是3。那么,很明显,在一个理想的排序下,这两个文档应该排在所有10个文档的头部。
|
||||
|
||||
现在我们假定相关度5的排在第4的位置,而相关度3的排在第7的位置。RankNet会更愿意去调整相关度3的,并且试图把其从第7往前挪,因为这样就可以把其他不相关的挤下去,然而更优化的办法应该是尝试先把相关度5的往更前面排。也就是说,从NDCG的角度来说,相关度高的文档没有排在前面受到的损失要大于相关度比较低的文档排在了下面。
|
||||
|
||||
NDCG和其他一系列搜索评价指标都是更加注重头部的相关度。关于这一点,RankNet以及我们之前介绍的GBDT或者排序支持向量机都忽视了。
|
||||
|
||||
既然我们找到了问题,那么如何进行补救呢?
|
||||
|
||||
之前说到博格斯的团队有一个惊人的发现,其实就在这里。他们发现,RankNet的优化过程中使用到的梯度下降(Gradient Descent)算法需要求解损失函数针对模型的参数的梯度,可以写成**两个部分**的乘积。在这里,模型的参数其实就是神经网络中的各类系数。第一部分,是损失函数针对模型的输出值的,第二部分是模型输出值针对模型的参数的。第二个部分跟具体的模型有关系,但是第一个部分没有。第一个部分跟怎么来定一个损失函数有关系。
|
||||
|
||||
在原始的RankNet定义中,这当然就是“对数几率函数”定义下的损失函数的梯度。这个数值就是提醒RankNet还需要针对这个损失做多少修正。其实,这个损失梯度不一定非得对应一个损失函数。这是博格斯的团队的一个重大发现,只要这个损失的梯度能够表示指引函数的方向就行了。
|
||||
|
||||
那既然是这样,能不能让这个损失的梯度和NDCG扯上边呢?答案是可以的。也就是说,我们只要定义两个文档之间的差距是这两个文档互换之后NDCG的变化量,同时这个变化量等于之前所说的损失的梯度,那么我们**就可以指导RankNet去优化NDCG**。在这里,博格斯和其他作者把这个损失的梯度定义为Lambda,因为整个过程是在优化一个排序,所以新的方法叫作LambdaRank。
|
||||
|
||||
有了LambdaRank之后,LambdaMART就变得水到渠成。Lambda是被定义为两个文档NDCG的变化量(在实际运作中,是用这个变化量乘以之前的对数几率所带来的梯度)。那么,只要这个Lambda可以计算,模型就可以嫁接别的算法。于是,博格斯的团队使用了在当时比神经网络更加流行的“梯度增强决策树”(GBDT)来作为学习器。不过,梯度增强决策树在计算的时候需要计算一个梯度,在这里就被直接接入Lambda的概念,使得GBDT并不是直接优化二分分类问题,而是一个改装了的二分分类问题,也就是在优化的时候优先考虑能够进一步改进NDCG的方向。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了LambdaMART算法的基本原理。作为配对法和列表排序学习的一个混合经典算法,LambdaMART在实际运用中有着强劲的表现 。 一起来回顾下要点:第一,我们简要介绍了LambdaMART提出的历史。第二,我们详细介绍了LambdaMART的核心思路。
|
||||
|
||||
最后,给你留一个思考题,采用Lambda这样更改优化过程中的梯度计算,虽然很形象,但是有没有什么坏处?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
**参考文献**
|
||||
|
||||
<li>
|
||||
Burges, C.; Shaked, T.; Renshaw, E.; Lazier, A.; Deeds, M.; Hamilton, N. & Hullender, G. Learning to Rank Using Gradient Descent. **Proceedings of the 22nd International Conference on Machine Learning**, ACM, 89-96, 2005.
|
||||
</li>
|
||||
<li>
|
||||
Burges, C. J.; Ragno, R. & Le, Q. V. Schölkopf, B.; Platt, J. C. & Hoffman, T. (Eds.). Learning to Rank with Nonsmooth Cost Functions. **Advances in Neural Information Processing Systems 19**, MIT Press, 193-200, 2007.
|
||||
</li>
|
||||
<li>
|
||||
Wu, Q.; Burges, C. J.; Svore, K. M. & Gao, J. Adapting Boosting for Information Retrieval Measures. **Information Retrieval**, Kluwer Academic Publishers, 13, 254-270, 2010.
|
||||
</li>
|
||||
<li>
|
||||
Chapelle, O. & Chang, Y.Chapelle, O.; Chang, Y. & Liu, T.-Y. (Eds.). Yahoo! Learning to Rank Challenge Overview. **Proceedings of the Learning to Rank Challenge**, PMLR, 14, 1-24, 2011.
|
||||
</li>
|
||||
|
||||
**论文链接**
|
||||
|
||||
<li>
|
||||
[Learning to Rank Using Gradient Descent](https://icml.cc/2015/wp-content/uploads/2015/06/icml_ranking.pdf)
|
||||
</li>
|
||||
<li>
|
||||
[Learning to Rank with Nonsmooth Cost Functions](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.62.1530&rep=rep1&type=pdf)
|
||||
</li>
|
||||
<li>
|
||||
[Adapting Boosting for Information Retrieval Measures](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.157.5117&rep=rep1&type=pdf)
|
||||
</li>
|
||||
<li>
|
||||
[Yahoo! Learning to Rank Challenge Overview](http://proceedings.mlr.press/v14/chapelle11a/chapelle11a.pdf)
|
||||
</li>
|
||||
|
||||
|
63
极客时间专栏/AI技术内参/搜索核心技术/055 | 基于深度学习的搜索算法:深度结构化语义模型.md
Normal file
63
极客时间专栏/AI技术内参/搜索核心技术/055 | 基于深度学习的搜索算法:深度结构化语义模型.md
Normal file
@@ -0,0 +1,63 @@
|
||||
<audio id="audio" title="055 | 基于深度学习的搜索算法:深度结构化语义模型" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/71/8e/712b33bbf005e9e7b2b73e569fe9e18e.mp3"></audio>
|
||||
|
||||
近两个月,我们集中系统地分享了搜索核心技术模块。做一个简单的内容梳理,我们讲解了搜索引擎方方面面的话题,从经典的信息检索技术、查询关键字理解、文档理解到现代搜索引擎的架构和索引的核心技术;还从机器学习角度出发分享了搜索引擎的最核心部分,也就是排序算法,深入排序算法的细节讲解了排序支持向量机(RankSVM)、梯度增强决策树(GBDT)以及经典模型LambdaMART。至此,整个人工智能领域关于搜索的经典话题也就告一段落了。
|
||||
|
||||
那么,这个星期,我们来看一些关于搜索算法的前沿思考。火热的深度学习不仅对图像、视频和音频这些领域产生了巨大的冲击,也对自然语言处理、甚至搜索领域有不小的影响。**深度学习带给传统的模型和算法以新的建模能力和新的视角,为以前所不能完成的应用打下了基础**。
|
||||
|
||||
今天,我们来看一篇较早利用深度学习技术来进行搜索建模的论文:《使用点击数据学习深度结构化的网络搜索语义模型》(Learning deep structured semantic models for web search using clickthrough data)。这篇论文阐述了一个**深度结构化语义模型**,发表在第22届世界信息和知识管理大会CIKM 2013上。
|
||||
|
||||
## 论文背景介绍
|
||||
|
||||
发表于2013年的这篇论文应该算是比较早的直接使用深度学习中经验的论文。其主要目的是探索一些经典的深度学习方法能否在搜索的应用中得到合适的效果。
|
||||
|
||||
下面我们来了解一下这篇论文的作者群信息。
|
||||
|
||||
第一作者黄博森(Po-Sen Huang)是一名来自台湾的学者。在发表论文的时候,他在伊利诺伊大学香槟分校攻读电子工程和计算机博士学位,师从马克·约翰森(Mark Hasegawa-Johnson)。论文是黄博森在微软实习时的工作总结。2015年黄博森博士毕业,然后于2016年加入了微软研究院。到目前为止,他发表了30多篇人工智能相关的论文,论文引用次数已经超过1千多次。
|
||||
|
||||
其他作者均来自当时在微软研究院工作的学者。其中不乏著名学者,比如何晓冬(Xiaodong He)、邓力(Li Deng)、亚历克斯·阿西罗(Alex Acero)和拉里·赫克(Larry Heck)等。下面聊聊比较少被提及的阿西罗和赫克。阿西罗曾长期在微软研究院担任语音相关研究组的经理职位,2013年之后,他到苹果公司担任Siri的资深总监。赫克曾经在雅虎担任搜索和广告业务副总裁,然后到微软研究院担任语音组的首席科学家。文章发表之后,赫克到了谷歌,在一个人工智能组担任总监,并于最近加入三星北美研究院担任资深副总裁。这些学者主要是为这个工作提供支持和指导工作。
|
||||
|
||||
这篇论文自2013年发表后已经有超过390多次的引用,是深度学习在搜索领域应用中被引用次数最多的论文之一。
|
||||
|
||||
## 深度结构化语义模型详解
|
||||
|
||||
下面详细讲讲这篇论文的核心思想。要想理解这篇论文提出的思路,我们首先要简单回顾一下经典的搜索模型构建。
|
||||
|
||||
在经典的搜索模型里,不管是TF-IDF、BM25、语言模型,还是基于机器学习的排序算法模型,整体来说,一个共通的想法就是争取用某种表示(Representation)来表达查询关键字,然后用相同的、或者类似的表示来表达文档,再通过某种程度的匹配函数来计算查询关键字表示和文档表示之间的距离,然后进行排序。
|
||||
|
||||
那么,从深度学习的角度来说,要想针对这个传统的模式进行革新,当然就可以从最主要的三个方面入手:**查询关键字的表达、文档的表达和匹配函数**。
|
||||
|
||||
这篇文章也正是沿着这个思路,提出了深度结构化语义模型。
|
||||
|
||||
首先,深度结构化语义模型对查询关键字和文档进行了相似的处理。具体来说,就是先把查询关键字或者文档转换为**词向量**(Term Vector),这个词向量可以是最简单的“**词袋**”的表达方式,这也就是最基本的模型的输入。从词向量出发,模型首先学习一个“**词哈希**”(Word Hashing),也就是把0或1的稀疏词向量转换成为一个稠密(Dense)的向量表达。这一步是**把深度学习方法应用在自然语言处理中所通用的办法,目的就是把稀疏的输入转换为稠密的输入,降低输入的数据维度**。
|
||||
|
||||
当查询关键字和文档都转换成稠密数组以后,深度结构化语义模型利用了深度学习中的重要经验,那就是通过“**非线性转换**”(Non-Linear Projection)来获取数据深层次的语义信息,而不仅仅只是传统方法中字面上的匹配。这里,查询关键字和文档都使用了简单的“**前馈神经网络**”(Feedforward Neural Network)的方法,对输入向量进行了多层的非线性转换。非线性转换本身通过“**双曲正切函数**”(tanh函数)实现,这应该算是最传统的深度学习模型的实现方法了。
|
||||
|
||||
经过多层转换之后,查询关键字和文档都变成了新的某种表达之后,如何来计算两者间的距离(或者远近)呢?这篇文章采用了非常直接的形式,那就是利用“**余弦函数**”(Cosine)来作为距离函数,描述两个向量之间的距离。在传统信息检索的语境中,也经常用余弦函数来计算向量的距离,所以在这里应该说并没有太多创新的地方。
|
||||
|
||||
总体来说,**深度学习在这里的主要应用,就是成为查询关键字和文档的表达的提取器**。和传统方法中人工提取各种类型的文字特性相比,在深度结构化语义模型中,基于前馈神经网络的特征提取器自动提取了文字的深层语义信息。
|
||||
|
||||
提出了模型之后,我们来看这个模型是如何被训练出来的。作者们首先利用了用户的点击信息,也就是针对某一个查询关键字,有哪些文档被点击过,作为**正例数据**,其他文档作为**负例数据**,然后把整个建模问题看作一个**多类分类问题**。这样就可以利用标签信息对整个模型进行学习了。
|
||||
|
||||
整体来说,这个深度学习模型是可以利用“端到端”(End-to-End)的方式进行训练的,并且采用了随机梯度下降(SGD)这样的优化算法,这里就不复述了。
|
||||
|
||||
## 深度结构化语义模型的实验效果
|
||||
|
||||
因为深度结构化语义模型仅仅使用了查询关键字和文档之间的文字信息,因此提出的模型就无法和完整的、利用很多特性的机器学习排序算法进行比较,只能和文字型的排序算法例如TF-IDF、BM25和语言模型进行比较,这也是文章并没有采用一些更为通用的数据集的原因。最终文章在数据集上采用了Bing的搜索数据,有1万6千多的查询关键字以及每个查询关键字所对应的15个文档,每个文档又有4级相关标签,这样可以用来计算诸如NDCG这样的指标。
|
||||
|
||||
在这篇文章里,作者们比较了一系列的方法,比如TF-IDF、BM25,以及一些传统的降维方法如LSA和PLSA。简单来说,深度结构化语义模型在最后的比较中取得了不错的结果,NDCG在第10位的表现是接近0.5。不过,TF-IDF的表现也有0.46,而传统的PLSA和LSA也有0.45左右的表现。所以,可以说深度结构化语义模型的效果虽然很明显但并不是特别惊人。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了深度结构化语义模型的一些基本原理,这是利用深度学习技术对搜索算法进行改进的一个经典尝试。我们在上面的实验结果总结中已经说到,虽然文章仅仅谈到了文本信息的匹配,并没有作为完整的排序算法进行比较,但是也揭开了用深度模型来表征查询关键字和文档的研发序幕 。
|
||||
|
||||
一起来回顾下要点:第一,我们简要介绍了提出深度结构化语义模型的历史。第二,我们详细介绍了深度结构化语义模型的核心思路以及实验结果。
|
||||
|
||||
给你留一个思考题,除了文章中提到的余弦函数可以作为一个距离函数,还有没有其他的函数选择来表达两个向量之间的距离?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
最后,预告一个小活动,本周六(1月13日)晚8:30我会在极客时间做一场直播,欢迎你参加。主题是“人工智能20问”,如果你有想交流的问题,欢迎给我留言,我们周六直播见!
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/03/a4/036075efeb9f168a768b32cd178ce9a4.jpg" alt="" />
|
||||
|
||||
|
61
极客时间专栏/AI技术内参/搜索核心技术/056 | 基于深度学习的搜索算法:卷积结构下的隐含语义模型.md
Normal file
61
极客时间专栏/AI技术内参/搜索核心技术/056 | 基于深度学习的搜索算法:卷积结构下的隐含语义模型.md
Normal file
@@ -0,0 +1,61 @@
|
||||
<audio id="audio" title="056 | 基于深度学习的搜索算法:卷积结构下的隐含语义模型" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/fb/71/fb0b9da046291a8207a37279cc63bb71.mp3"></audio>
|
||||
|
||||
这个星期,也是我们整个搜索领域分享的最后一周内容,来看一些搜索算法的前沿思考,特别是深度学习对搜索领域的影响。周一我们分享了一篇较早利用深度学习技术来进行搜索建模的论文,论文提出如何使用前馈神经网络来对查询关键字和文档进行信息提取,从而能够学习更有意义的语义信息。
|
||||
|
||||
今天我们来看一篇文章《信息检索中结合卷积池化结构的隐含语义模型》([A Latent Semantic Model with Convolutional-Pooling Structure for Information Retrieval](http://www.iro.umontreal.ca/~lisa/pointeurs/ir0895-he-2.pdf)),可以说这是我们周一分享论文的一个后续工作。这篇论文发表在第23届世界信息和知识管理大会CIKM 2014上。
|
||||
|
||||
## 论文背景介绍
|
||||
|
||||
这篇论文的主要目的是探讨深度学习中的卷积神经网络能否应用在搜索中,并取得较好的效果。
|
||||
|
||||
下面我们先来了解一下这篇论文作者群的信息。
|
||||
|
||||
第一作者Yelong Shen是微软研究院的一名资深研究员。
|
||||
|
||||
第二作者是何晓冬(Xiaodong He)是微软研究院深度学习组的主任研究员兼经理,发表过一百多篇学术论文,在人工智能领域,特别是近年来在深度学习领域有很突出的贡献。
|
||||
|
||||
第三作者高剑峰(Jianfeng Gao)是一名长期在微软研究院工作的研究员和经理。
|
||||
|
||||
第四作者邓力(Li Deng)是微软研究院的人工智能学者,曾担任微软的首席人工智能科学家并且领导深度学习中心。2017年5月,邓力离开微软加入Citadel,美国著名的金融机构,担任首席人工智能官的职位。
|
||||
|
||||
最后一位作者格雷古瓦·梅尼尔(Grégoire Mesnil)是来自蒙特利尔大学的一名博士学生。
|
||||
|
||||
这篇论文自2014年发表后已被引用180多次,是探讨深度学习在搜索领域中应用的主要论文之一。
|
||||
|
||||
## 卷积结构下的隐含语义模型详解
|
||||
|
||||
我们周一介绍的深度结构化语义模型,其主要思想是希望能够利用前馈神经网络来对查询关键字和文档进行信息提取。这个模型有一个很明显的问题,那就是在第一步对查询关键字或文档进行特征提取时所形成的词向量(Term Vector)是忽略了文字原本的顺序信息的,也就是依然是一个“词袋模型”(Bag of Words)假设,这显然是丢失了很多信息的。
|
||||
|
||||
当然,我们今天要分享的卷积结构下的隐含语义模型,也并不是第一个想要解决这个问题的模型。在经典的信息检索领域的研究中,已经有不少这方面的尝试了。那么对于深度学习来说,又有什么优势呢?
|
||||
|
||||
近些年来深度学习模型兴起的一个重要动力就是在图像、音频、视频领域的技术突破。而这些突破离不开一个重要的基础模型,**卷积神经网络**的成熟。这个模型对有空间位置结构性的数据,比如图像中每一个像素,有较强的建模能力,成为了探索结构信息建模的一个利器。那么,能不能把在这些领域中已经成熟的经验借鉴到搜索领域呢?
|
||||
|
||||
如果把文本的词与词,句子与句子之间的关系看作是一种空间位置关系的话,那么从假设上来看,就很符合卷积神经网络模型的基本设置。接下来,我们就来看看这个模型具体是怎么应用到搜索中的。
|
||||
|
||||
首先,模型对查询关键字或者文档的文字进行“**移动窗口**”式(Sliding Window)的扫描。这第一步就和之前的深度结构化语义模型有了本质区别。然后,模型进一步把“移动窗口”下的词转换成为**字母级别的表征向量**(Representation Vector)。这个步骤之后,模型采用了**卷积层**来提取空间位置的特征,也是把数据的维度大幅度降低。卷积层之后就是基本的“**池化层**”(Pooling Layer),这里的模型采用了**最大池化**(Max Pooling),也就是从多个卷积层的结果中,每一个层对应元素中的最大元素。在池化层之后,就是进行一个全部展开的语义层。
|
||||
|
||||
更加直白地说,**整个模型就是希望先从原始的文字信息中,利用保留顺序的一个移动窗口提取最基本的特征;然后利用卷积神经网络的标配,卷积层加池化层,来提取空间位置信息;最后利用一个全部的展开层来学习下一步的系数**。卷积层主要抓住的是单词这个级别的特征;而池化层则是希望抓住句子这个层面的语义信息;最后利用句子这个层面的语义信息形成整个文字的内在语义表达。
|
||||
|
||||
这个模型是如何被训练出来的呢?事实上,可以说整个模型的训练过程和我们周一分享的深度结构化语义模型的训练过程一模一样。首先,同样是利用用户的点击信息,也就是针对某一个查询关键字,有哪些文档被点击过,作为正例数据,其他文档作为负例数据;然后把整个建模问题看做是一个多类分类问题;这样就可以利用标签信息对整个模型进行学习。
|
||||
|
||||
## 隐含语义模型的实验效果
|
||||
|
||||
和深度结构化语义模型一样,隐含语义模型也仅仅使用了查询关键字和文档之间的文字信息,所以也只能和文字型的排序算法进行比较。最终文章在数据集上采用了Bing的搜索数据,有1万2千多的查询关键字以及每个查询关键字所对应的74个文档,每个文档又有4级的相关标签,用来计算NDCG这样的指标。数据虽然和之前一篇不完全一样,但是在数量级上是差不多的。
|
||||
|
||||
在这篇文章里,作者们也比较了一系列的方法,比如TF-IDF、BM25,以及传统的PLSA和LDA。简单来说,隐含语义模型在最后的比较中取得了不错的结果,NDCG在第10位的表现是接近0.45,而之前提出的深度结构化语义模型达到了差不多0.44。虽然利用卷积的效果要好一些,但是差距并不大。在这个数据集上,传统方法要差很多,比如BM25的表现仅有0.38左右,而传统的PLSA和LDA也只有0.40左右的表现。应该说在这篇文章中展示出来的效果还是有比较大的差距的。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你讲了卷积结构下的隐含语义模型的一些基本原理,这个模型是利用深度学习技术对搜索算法进行改进的另一个很有价值的尝试,揭开了用深度学习模型,特别是用在图像处理中非常成功的卷积神经网络技术来表征查询关键字和文档会达到的效果。
|
||||
|
||||
一起来回顾下要点:第一,我们简要介绍了隐含语义模型提出的历史。第二,我们详细介绍了隐含语义模型的核心思路以及实验结果。
|
||||
|
||||
给你留一个思考题,为什么顺序信息并没有像我们想象中的那样,给文档搜索提升带来很大的效果呢?有没有什么解释?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
最后,预告一个小活动,本周六(1月13日)晚8:30我会在极客时间做一场直播,欢迎你参加。主题是“人工智能20问”,如果你有想交流的问题,欢迎给我留言,我们周六直播见!
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/03/a4/036075efeb9f168a768b32cd178ce9a4.jpg" alt="" />
|
||||
|
||||
|
63
极客时间专栏/AI技术内参/搜索核心技术/057 | 基于深度学习的搜索算法:局部和分布表征下的搜索模型.md
Normal file
63
极客时间专栏/AI技术内参/搜索核心技术/057 | 基于深度学习的搜索算法:局部和分布表征下的搜索模型.md
Normal file
@@ -0,0 +1,63 @@
|
||||
<audio id="audio" title="057 | 基于深度学习的搜索算法:局部和分布表征下的搜索模型" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/be/05/be7fcd68063a96bcce0094b38ca84c05.mp3"></audio>
|
||||
|
||||
周一我们分享了一篇较早利用深度学习技术来进行搜索建模的论文,利用前馈神经网络来对查询关键字和文档进行信息提取,从而学习到更有意义的语义信息。周三我们分享了另外一篇论文,可以说是周一分享文章的一个后续工作,探讨了如何利用卷积神经网络来对搜索表征进行进一步提升。这两篇论文呈现了一个统一的套路,那就是尝试把深度学习的一些经验直接应用到传统的搜索建模上。这些尝试,也都取得了一些初步成绩。
|
||||
|
||||
今天我们来聊一篇2017年刚刚发表的论文《网页搜索中利用文本的局部和分布表征学习匹配》(Learning to Match Using Local and Distributed Representations of Text for Web Search),这是近期将深度学习模型应用在搜索领域的一个创新。这篇论文发表在世界万维网大会WWW 2017上。
|
||||
|
||||
## 论文背景介绍
|
||||
|
||||
下面我们来了解一下这篇论文的作者群信息。
|
||||
|
||||
第一作者巴斯卡⋅米特拉(Bhaskar Mitra)是微软研究院在剑桥实验室的一名研究员。他已经发表了多篇利用深度学习技术解决搜索问题的论文。目前,米特拉在伦敦大学学院攻读博士学位。
|
||||
|
||||
第二作者是费尔南多⋅迪亚兹(Fernando Diaz)在文章发表的时候是微软研究院的一名研究员,目前则在Spotify工作。迪亚兹长期从事搜索以及信息检索的工作,发表多篇论文,文章总引用数超过三千次。加入微软之前,他曾经在雅虎研究院从事过研究工作。
|
||||
|
||||
文章的第三作者尼克⋅克拉维尔(Nick Craswell)在微软研究院工作,目前是主任级研发经理,长期从事搜索和信息检索的研究,发表多篇论文,文章总引用数达8千多次。
|
||||
|
||||
## 局部和分布表征下的搜索模型详解
|
||||
|
||||
我们详细讲讲这篇论文的核心思想。要想理解这篇论文提出的思路,我们首先要简单回顾一下这周讲的前两篇文章内容。
|
||||
|
||||
本周第一篇介绍的深度结构化语义模型主要是希望利用前馈神经网络来对查询关键字和文档进行信息提取。第二篇文章尝试用卷积神经网络来提取查询关键字和文档的信息。
|
||||
|
||||
不论是前馈网络,还是卷积网络, 这些尝试都是想从文本中提取高层次的语义信息。那么今天这篇文章说得是,并不是所有的相关信息都是高层次的语义信息。这是什么意思呢?
|
||||
|
||||
作者们提出了这样一个观点,那就是在搜索的时候,一个非常关键的需求就是被搜索到的文档应该包含查询关键字;或者反过来说,拥有查询关键字的文档有很大可能是相关的。也就是说,**如果一个模型不能去进行绝对的关键字匹配,那很有可能就无法真正抓住所有的相关信息**。
|
||||
|
||||
另一方面,相关信息的提取也需要高层次的语义,比如同义词,或者同一个主题。设想我们需要查找汽车相关的信息,而一个最新品牌的汽车页面也许并不直接包含“汽车”关键字,但很明显是一个相关的页面。因此,**利用同义词或者整个主题的相关性,通常可以提高搜索效果,特别是“召回”(Recall)的效果**。
|
||||
|
||||
那么,很显然,一个好的搜索模型应该兼顾这两个方面,也就是说**既能够做到关键字的直接匹配,也能做到在高层次的语义上进行模糊匹配**。
|
||||
|
||||
之前讲到的比如利用前馈网络或者卷积网络主要是针对后者,也就是模糊匹配,文章中提到叫做“分布表征”的匹配。那么,这篇文章的新意就是提出一种捕捉直接匹配的方式,文章叫做“**局部表征**”,并且和模糊匹配的分布表征结合在一起,形成一个统一的模型,从而提高搜索的效果。
|
||||
|
||||
具体来说,文章提出的模型是这样的。首先,从整体的网络框架来说,整个网络分成两个部分:一部分来学习查询关键字和文档的局部表征,也就是完全匹配;另一部分来学习查询关键字和文档的分布表征,也就是模糊匹配。最后,两个部分分别学习出一个向量,然后两个向量加和就形成了最后的表征。
|
||||
|
||||
完全匹配的局部表征技巧来自于数据的输入。和之前介绍的模型不同,因为我们需要学习查询关键字和文档之间的匹配信息,因此,网络的输入信息就不单单是查询关键字和文档本身,而是两者的一个“**点积**”(Dot-Product),也就是说,网络的输入信息就是两者是否有匹配。把这个信息作为输入向量之后,这篇文章采用了我们分享过的卷积神经网络的结构,来进一步提取点积过后的输入向量。
|
||||
|
||||
在模糊匹配的分布表征部分,整体的框架和上次分享的模型很类似,也就是对查询关键字和文档分别进行建模,分别利用卷积神经网络提取高层次的语义信息。然后在高层次的语义信息上再进行查询关键字和文档表征的乘积(这里是矩阵相对应元素相乘)。最后,在经过基层的隐含转换(其实就是前馈网络),形成分布表征的最后唯一结果。
|
||||
|
||||
**从整个模型来看,局部表征和分布表征的主要区别在于如何处理查询关键字和文档的匹配信息**。如果是在原始数据上直接匹配,然后学习匹配后的高层语义,这就是局部表征。如果是先学习高层语义然后再匹配,这就是分布表征。
|
||||
|
||||
整个模型利用相关标签,进行的是监督学习流程,并且采用了SGD来优化。
|
||||
|
||||
## 局部和分布表征的搜索模型实验效果
|
||||
|
||||
这篇论文提出的模型还是仅仅使用了查询关键字和文档之间的文字信息,因此和上两篇分享一样,提出的模型就只能和文字型的排序算法例如TF-IDF、BM25和语言模型进行比较。文章在数据集上采用了Bing的搜索数据,有19万多的查询关键字,总共有将近百万的文档数。这比之前两个分享里的数据都要大。不过遗憾的是,这三篇文章都是不同的数据集 。每个文档又有4级的相关标签,可以用来计算诸如NDCG这样的指标。
|
||||
|
||||
在这篇文章里,作者们比较了一系列的方法,比如TF-IDF、BM25,以及一些传统的降维方法比如LSA,然后还比较了之前两个分享中提到的模型。简单来说,本文模型在最后的比较中取得了非常不错的成绩,NDCG在第10位的表现接近0.53,而之前提出的一系列深度搜索模型,包括我们分享的两个模型达到了差不多0.45~0.48左右。看来,既需要完全匹配还需要模糊匹配的确能够带来性能上的提升。在这个数据集上,传统方法其实也不差,比如BM25的表现有0.45左右,而传统的LSA也有0.44左右的表现。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你分享了搜索专题的最后一篇内容,那就是利用深度学习技术对搜索算法进行改进的又一个尝试:一个结合了学习完全匹配的局部表征和模糊匹配的分布表征的统一的搜索模型。
|
||||
|
||||
一起来回顾下要点:第一,我们简要介绍了局部和分布表征搜索模型提出的历史。第二,我们详细介绍了局部和分布表征搜索模型的核心思路以及实验结果。
|
||||
|
||||
给你留一个思考题,我们这周分享了三个经典的深度学习和搜索相结合的尝试,你觉得目前深度学习在搜索领域取得的成果,有让你感到特别惊讶的结果吗?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
最后,预告一个小活动,明晚(1月13日)8:30我会在极客时间做一场直播,欢迎你参加。主题是“人工智能20问”,如果你有想交流的问题,欢迎给我留言,我们周六直播见!
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/03/a4/036075efeb9f168a768b32cd178ce9a4.jpg" alt="" />
|
||||
|
||||
|
94
极客时间专栏/AI技术内参/搜索核心技术/复盘 1 | 搜索核心技术模块.md
Normal file
94
极客时间专栏/AI技术内参/搜索核心技术/复盘 1 | 搜索核心技术模块.md
Normal file
@@ -0,0 +1,94 @@
|
||||
|
||||
到目前为止,我们讲完了人工智能核心技术的第一个模块——**搜索**。我们从搜索的核心算法入手,进而讨论了搜索的两个关键组件,分别是查询关键字理解和文档理解,并落实到对搜索系统的评价,然后从宏观视角介绍了搜索框架的历史和发展,最后又从深度学习技术在搜索领域的应用角度,对分享做了一个延伸。
|
||||
|
||||
整个模块共27期,9大主题,希望通过这些内容,能让你对搜索技术有一个系统的认识和理解,为自己进一步学习和提升打下基础。今天我们就来对这一模块的内容做一个复盘。
|
||||
|
||||
提示:点击知识卡跳转到你最想看的那篇文章,温故而知新。如不能正常跳转,请先将App更新到最新版本。
|
||||
|
||||
## 1.现代搜索架构剖析
|
||||
|
||||
从20世纪50年代有信息检索系统开始,搜索系统大致经历了三个发展阶段。从最开始的“基于文本匹配的信息检索系统”到“基于机器学习的信息检索系统”,再到近几年受深度学习影响的“更加智能的搜索系统”。
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/7b/07/7b421403d2398604e4115bee4df25707.png" alt="" />](https://time.geekbang.org/column/article/1702)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/45/0d/458e60fc7255a359bc31a73a0f70b30d.png" alt="" />](https://time.geekbang.org/column/article/1762)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/db/a4/dbc32bbdc558aac10c40144f318a9ba4.png" alt="" />](https://time.geekbang.org/column/article/1821)
|
||||
|
||||
## 2.经典搜索核心算法
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/f4/5e/f489afcf01a5ffb8aeb801899436325e.png" alt="" />](https://time.geekbang.org/column/article/822)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/01/98/01a7ce8bc679bc75e414b3a5c8e04698.png" alt="" />](https://time.geekbang.org/column/article/828)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/21/b6/218e2118d860c7b342076e5fda049cb6.png" alt="" />](https://time.geekbang.org/column/article/830)
|
||||
|
||||
## 3.基于机器学习的排序算法
|
||||
|
||||
问题设置:把一个排序问题转换成一个机器学习的问题设置,特别是监督学习的设置。
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/e4/b9/e48e5413055da8fd441d7781ff9801b9.png" alt="" />](https://time.geekbang.org/column/article/949)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/fe/74/fe1844e1de5f9f34af2e4a842ac3aa74.png" alt="" />](https://time.geekbang.org/column/article/950)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/9b/00/9b087c4f672314639e1bcd572f8c4000.png" alt="" />](https://time.geekbang.org/column/article/952)
|
||||
|
||||
## 4.基于机器学习的高级排序算法
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/70/91/70d53c45a87711e1b1b441bec1753591.png" alt="" />](https://time.geekbang.org/column/article/2026)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/0c/32/0cfd58acbe692fc437f6ce3a35092e32.png" alt="" />](https://time.geekbang.org/column/article/2052)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/51/6b/517840c53b3d0e7cd2abc487da578d6b.png" alt="" />](https://time.geekbang.org/column/article/2099)
|
||||
|
||||
## 5.查询关键字理解
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/fb/43/fb7cbfccb622be4515e7450b182a3443.png" alt="" />](https://time.geekbang.org/column/article/1077)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/5c/03/5c14df7301b5e41186ec4a469b670c03.png" alt="" />](https://time.geekbang.org/column/article/1079)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/1a/10/1a6766670e0a62feb367f285afaebc10.png" alt="" />](https://time.geekbang.org/column/article/1081)
|
||||
|
||||
## 6.文档理解
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/0a/44/0a290fe14835b5873e9c96f97c4bd944.png" alt="" />](https://time.geekbang.org/column/article/1448)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/e6/52/e6cee91bb08cd53231417fb31ab2a252.png" alt="" />](https://time.geekbang.org/column/article/1449)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/bc/0f/bc47227d10463309cf61c49d1bf9e20f.png" alt="" />](https://time.geekbang.org/column/article/1450)
|
||||
|
||||
## 7.经典图算法
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/b8/0e/b82b17813fabd3f5f4122cd28f90fc0e.png" alt="" />](https://time.geekbang.org/column/article/1883)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/3c/75/3c7b084e04691a127d3ccbb6e44d3a75.png" alt="" />](https://time.geekbang.org/column/article/1938)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/37/63/37c944d1604e9fc3403af4d6b1e1da63.png" alt="" />](https://time.geekbang.org/column/article/1940)
|
||||
|
||||
## 8.基于深度学习的搜索算法
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/7b/79/7bf8ff71d180de4f595492d4814f1b79.png" alt="" />](https://time.geekbang.org/column/article/2297)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/ff/0a/ff66c775018198c8dbf53522b2cfd00a.png" alt="" />](https://time.geekbang.org/column/article/2298)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/51/e7/51e5337043a69b3cdfe3a19eba2466e7.png" alt="" />](https://time.geekbang.org/column/article/2332)
|
||||
|
||||
## 9.搜索系统的评价
|
||||
|
||||
If You Can’t Measure It, You Can’t Improve It.
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/3f/d3/3f60f5a72923c2ac414952330be920d3.png" alt="" />](https://time.geekbang.org/column/article/1296)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/5a/54/5a3beafeeaae0b85ab37188763349e54.png" alt="" />](https://time.geekbang.org/column/article/1299)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/82/3a/827f32f8bfed0874f9cb12775e6c193a.png" alt="" />](https://time.geekbang.org/column/article/1300)
|
||||
|
||||
## 积跬步以至千里
|
||||
|
||||
最后,**恭喜你在这个模块中已经阅读了70047字,听了220分钟的音频,这是一个不小的成就**。在人工智能领域的千里之行,我们已经迈出了扎实的第一步。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/fe/d1/fef59e0cf354d51287e3b3d5d360c0d1.png" alt="" />
|
||||
|
||||
感谢你在专栏里的每一个留言,给了我很多思考和启发。期待能够听到你更多的声音,我们一起交流讨论。
|
||||
|
||||
|
Reference in New Issue
Block a user