37-AI技术内参

开篇词 | 你的360度人工智能信息助理

你好，我是洪亮劼，目前在电子商务网站 Etsy 任数据科学主管，很高兴能和你在这里相识，也很期待在接下来的时间里，通过“AI 技术内参”这个专栏和你共同探讨与人工智能有关的话题。

在未来的一年里，我会为你讲解人工智能的核心基础，介绍顶级学术会议的最新研究成果，为广大工程师和数据科学家的个人成长出谋划策，也期待能为计划成立和管理数据科学家团队的工程管理领导提供一些意见和建议。我希望“AI 技术内参”能够成为你的 360 度人工智能信息助理，帮助你在这个高速发展的领域稳步前行。

那么，我为什么愿意来写这么一个专栏呢？这让我想起了最近发生的一个片段，我在波士顿参加一个有关数据科学的工业界会议，会场上，一位目前在美国一家时装品牌 J.Crew 工作的数据科学家和我聊天，中间问我，如果想在数据科学、人工智能这个领域进阶，需要看什么样的资料、需要怎样才能不断学习和进步。我当时发现，自己很难为这位数据科学家推荐某一本书、某几篇论文、某一个资料，就能够起到这样的作用。

事实上，回想我自己在人工智能这个领域的成长，一个突出的特点就是，需要学习的东西太多、太杂而且很细。

比方说，对于一个人工智能领域的从业人员来说，基础阶段需要系统地学习有关机器学习、概率统计的很多书，还要会使用相关的专业软件以及人工智能框架，然后如果你希望能够在某一个专业领域（比如搜索、推荐、图像技术、语音技术、智能驾驶等）有所发展，还需要阅读这些相关领域的很多技术论文，并且去实践相关的算法模型。

更进一步，要想在技术公司能够真正成长下去，还有很多的工程技巧以及实际经验需要你慢慢习得。这些情况都导致人工智能领域专业人才的培养和成长有很高的门槛。

我自己，以及很多希望能够在这个领域有所发展的朋友，都很急迫地需要有这么一个集中地、有计划地获取信息，获取高质量信息的平台。这让我萌生了自己来写这么一个专栏的想法。

我希望“AI 技术内参”这个专栏能够成为你在人工智能领域成长的灯塔，当你在茫茫的知识海洋里航行时，帮助你快速找到核心的、主干的信息和资源。我希望这个专栏能够成为你在职业发展上的朋友，让你对快速发展的行业不再焦虑，不再担心自己的知识会落伍，不再为如何在日新月异的信息中寻找有价值的学习资料而发愁。

同时，我也希望这个专栏能够为你拓宽视野，让数据科学家、人工智能工程师了解到团队管理者是如何构建一个团队、如何来招聘从业人士的，让数据科学的领导者意识到如何培养数据科学家成长，让你对整个行业的生态系统有一个更加完整的认识。

我为这个专栏精心打磨了三个模块。

第一，我会为你讲解一些经典的人工智能技术。这些技术涵盖搜索、推荐系统、广告系统、图像处理等领域。了解这些经典技术能够让你迅速入门并能为今后的学习打下基础。这部分内容帮助你分析核心的算法模型，并为你进行系统性学习提供纲要和指引。

第二，我会带给你最新的顶级学术会议动态，帮助你了解和掌握这些学术会议最火热和最新的研究成果。每一年和人工智能相关的顶级学术会议有十余个，每个会议都会有上百篇甚至几百篇论文发表。从这些论文和成果中找到有价值的信息，对于初学者，甚至是有一定经验的从业人员来说都是非常困难、也非常耗时的一件事情。那么，在这个专栏里，我会为你精选内容，可以让你不错过任何有价值的最新成果。

第三，我会在这个专栏里为人工智能的从业人员提供指南，帮助数据科学家和工程师提升自我价值，帮助人工智能团队的管理者构建团队，为你在职场发展中的关键步骤出谋划策。

希望我们在今后的一年时间里，通过“AI 技术内参”这个平台，共同学习、共同成长。“AI 技术内参”只是一个起点，希望你能够从这个专栏出发，在人工智能这个领域前行得更好、更高、更远。

018 | 经典搜索核心算法：TF-IDF及其变种

从本周开始我们进入人工智能核心技术模块，本周我会集中讲解经典的搜索核心算法，今天先来介绍 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 应用到中文环境中，是否需要一些预处理的步骤？

欢迎你给我留言，和我一起讨论。

019 | 经典搜索核心算法：BM25及其变种（内附全年目录）

周一我们讲了 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 分为三个部分：

单词和目标文档的相关性

单词和查询关键词的相关性

单词的权重部分

这三个部分的乘积组成某一个单词的分数。然后，整个文档相对于某个查询关键字的分数，就是所有查询关键字里所有单词分数的总和。

我们先从第一部分说起，即单词和目标文档的相关性。这里相关性的基本思想依然是“词频”，也就是 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 是非监督的排序方法，并且我们提到其中有一些超参数，那么是否可以通过机器学习的手段来学习到这些超参数的最佳取值呢？

欢迎你给我留言，和我一起讨论。

020 | 经典搜索核心算法：语言模型及其变种

在信息检索和文本挖掘领域，我们之前已经讲过了 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 而言，其实更加直观，更好理解。语言模型也是一个强有力的非监督学习方法的文本排序算法。

一起来回顾下要点：第一，简要介绍了语言模型的历史。第二，详细介绍了简单语言模型，即“查询关键字似然检索模型”的主要组成部分。第三，简要地介绍了语言模型的两个变种方向。

最后，给你留一个思考题，如果根据语言模型，也就是概率分布函数的估计，无法得到我们之前提到的最优解析解的话，我们应该怎么求解语言模型的参数呢？

欢迎你给我留言，和我一起讨论。

021 | 机器学习排序算法：单点法排序学习

在专栏里我们已经讲解过最经典的信息检索技术。这些技术为 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 和语言模型，这些传统的排序算法和单点法排序学习结合起来？

欢迎你给我留言，和我一起讨论。

022 | 机器学习排序算法：配对法排序学习

周一的文章里我分享了最基本的单点法排序学习（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 值，或者利用五级相关信息。第三，针对单点法对于排序学习的“目标不明确”问题，配对法排序学习有不一样的训练集设置，在这个基础上，我介绍了三个关键假设。

最后，给你留一个思考题，有没有什么办法可以把单点法和配对法结合起来呢？

欢迎你给我留言，和我一起讨论。

参考文献

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.

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.

023 | 机器学习排序算法：列表法排序学习

本周我们已经分别讨论了最基本的单点法排序学习（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 年之间是一个非常活跃的研究领域，积累了大量的成果。

一起来回顾下要点：第一，简要介绍了列表法排序学习的历史。第二，详细介绍了列表法排序学习的三大思路以及每个思路里的主要细节和方法。

最后，给你留一个思考题，列表法是不是就完全解决了排序算法的问题呢？

欢迎你给我留言，和我一起讨论。

参考文献

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.

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.

Q. Wu, C.J.C. Burges, K. Svore and J. Gao. Adapting boosting for information retrieval measures. Journal of Information Retrieval, 2007.

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.

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.

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.

S. Chakrabarti, R. Khanna, U. Sawant, and C. Bhattacharyya. Structured learning for non-smooth ranking losses. SIGKDD, 88–96, 2008.

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.

M. Taylor, J. Guiver, S. Robertson, and T. Minka. SoftRank: Optimising non-smooth rank metrics. WSDM, 77–86, 2008.

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.

Y. Yue, T. Finley, F. Radlinski, and T. Joachims. A support vector method for optimizing average precision. SIGIR, 271–278, 2007.

024 | “查询关键字理解”三部曲之分类

我们在前两周的专栏里主要讲解了最经典的信息检索（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 年，安德烈就认为这样的传统假定已经不适合网络时代了。他开始把查询关键字所代表的目的划分为三个大类：

导航目的（Navigational）；

信息目的（Informational）；

交易目的（Transactional）。

此后十多年里，查询关键字的这三大分类都是这个方向研究和实践的基石。我们先来看这个分类的内涵。

第一类，以导航为意图的查询关键字，这类查询关键字的目标是达到某个网站。这有可能是用户以前访问过这个网站，或者是用户假设有这么一个关于所提交查询关键字的网站。这一类查询关键字包括公司的名字（如“微软”）、人的名字（如“奥巴马”）或者某个服务的名字（如“联邦快递”）等。

此类查询关键字的一个重要特点就是，在大多数情况下，这些查询关键字都对应唯一的或者很少的“标准答案”网站。比如，搜索“微软公司”，希望能够找到的就是微软公司的官方网站。另一方面是说，某些“信息集成”网站也是可以接受的“答案”。比如，查询“奥巴马”，搜索返回的结果是一个列举了所有美国总统的网站。

第二类，以信息为意图的查询关键字，这类查询关键字的目标是搜集信息。这一类的查询和传统的信息检索非常接近。值得提及的是，从后面的研究结论来看，这一类查询关键字所包含的目标不仅仅是寻找到某类权威性质（Authority）的网页，还包括列举权威信息的俗称“结点”（Hub）的网站。

第三类，以交易为意图的查询关键字，这类查询关键字的目标是到达一个中间站点从而进一步完成“交易”（Transaction）。这一类查询关键字的主要对象就是“购物”。现在我们对“电子商务”的态度可以说是非常自然了，但是十多年前，在传统信息检索界统治的搜索研究领域，提出“交易”类型的查询关键字可以说是很有新意的。

当然，这样的分类如果仅仅是概念上的区分那就没有太大的意义。安德烈利用搜索引擎 AltaVista 进行了一次调查研究，这次调查有大约 3 千多的用户反馈。想到这是在 2001 年的调查，可以说已经是大规模的研究了。

这次调研的结果是这样的：在用户提交的信息中，导航类型的查询关键字占 26%，交易类型的查询关键字占到了 24%，而剩下的将近 50% 是信息类型的查询关键字，用户的日志（Log）分析进一步证实了这一数据。

你可以看到，这种把查询关键字进行分类的研究是对用户行为进行建模的必要步骤。于是，很快就有不少研究人员嗅到了查询关键字分类的价值。然而，完全依靠用户直接反馈来获取这类信息则变得越发困难。

这里主要有三个原因。第一，不可能寄希望于用户汇报自己所有关键字的意图；第二，面对亿万用户输入的查询关键字，手工标注也是不可能的；最后，安德烈的三类分类还是太粗犷了，在实际应用中希望得到更加细颗粒度的用户意图。

把查询关键字分类问题转换成为标准的机器学习任务其实很直观。确切地说，这里需要做的是把查询关键字分类转换成为监督学习任务。这里，每一个查询关键字，就是一个数据样本，而响应变量，则是对应的类别。具体情况取决于我们的任务是仅仅把查询关键字分为几个类别，并且认为这些类别之间是互相独立的，还是认为这些类别是可以同时存在的。

在最简单的假设下，查询关键字分类就是一个普通的多类分类问题，可以使用普适的多类分类器，比如支持向量机（SVM）、随机森林（Random Forest）以及神经网络（Neural Networks）等来解决这类问题。

对于绝大多数监督学习任务而言，最重要的一个组成部分就是选取特征。随后很多年的研究开发工作中，有一部分就集中在尝试使用不同的特征，然后来看对提高分类的精度是否有效果。

过去的研究反复证明，以下几类特征非常有效。

第一类特征就是查询关键字本身的信息。比如，查询关键字中已经包括了已知的人名或者公司名，这种时候，分类结果就不太可能是交易意图的类别。也就是说，查询关键字，特别是某些词或者词组和类别有某种关联信息，而这种关联很大程度上能被直接反映出来。

第二类特征是搜索引擎返回的查询关键字相关的页面本身的信息。你可以想象一下，假如搜索“奥巴马”这个关键字，返回的页面都是维基百科的页面以及奥巴马基金会的页面，那么这些页面上面的内容可能很难包含任何商业的购买信息。而对于“佳能相机”这个查询关键字而言，返回的页面很可能都是电子商务网站的商品信息，从而能够更加准确地判断“佳能相机”的分类。

第三类特征则是用户的行为信息，那就是用户在输入查询关键字以后会点击什么网站，会在哪些网站停留。一般来说，哪些网站点击率高、停留时间长，就表明这些网站在返回结果中可能更相关。于是，采用这些网站来作为查询关键字所代表的内容，就可能更加靠谱。

在实际的应用中，查询关键字的分类往往还是有很大难度的。因为在普通的现代搜索引擎上，每天可能有三分之一、甚至更多的关键字是之前没有出现过的。因此，如何处理从来没有出现过的关键字、如何处理长尾中的低频关键字，就成了让搜索结果的精度再上一个台阶的重要因素。我今天就不展开相应的话题了，如果你有兴趣，可以查看相关论文。

小结

今天我为你讲了现代搜索技术中一个非常基础但是也在实际应用中至关重要的环节，那就是查询关键字理解中的用户意图分类问题。你可以看到查询关键字从大类上分为信息意图、交易意图以及导航意图三类。

一起来回顾下要点：第一，简要介绍了查询关键字分类提出的历史背景，安德烈·布罗德的论文奠定了查询关键字分类的坚实基础。第二，详细介绍了主要的分类以及如何通过多类分类器的构建来达到自动化的目的。

最后，给你留一个思考题，在机器学习排序算法中，我们应该如何使用查询关键字分类的结果呢？

欢迎你给我留言，和我一起讨论。

拓展阅读：A taxonomy of web search

025 | “查询关键字理解”三部曲之解析

这周我分享的核心内容是查询关键字理解（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 和利用条件随机场两种主流的标注方法。

最后，给你留一个思考题，我举了英语的查询关键字的解析问题，那么对于中文而言，又有哪些特殊的挑战呢？

欢迎你给我留言，和我一起讨论。

参考文献

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.

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.

026 | “查询关键字理解”三部曲之扩展

我们在本周的前两篇文章中分别介绍了查询关键字分类（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]，就是其中的一种。如果你感兴趣，建议去精读。

最后我需要说明的是，第一种思路需要已经有不少的用户交互数据，而第二种思路可以通过其他的语料（比如维基百科）加以学习，并不需要用户数据。这也是另一个值得参考的信息点。

小结

今天我为你讲了查询关键字理解中的查询关键字扩展问题。你可以看到，查询关键字扩展从技术上的两种流派，一个是通过用户的交互数据来产生一个图，并且利用图挖掘技术来得到查询关键字之间的关系；另外一个就是通过产生词汇的嵌入向量从而得到同义词。

一起来回顾下要点：第一，简要介绍了查询关键字扩展的内涵。由于用户输入的查询关键字信息不足，通过查询关键字扩展可以提供更好的用户体验和更加精准的搜索结果。第二，详细介绍了查询关键字扩展的两个主要技术。

最后，给你留一个思考题，如何来测试查询关键字扩展的优劣呢？

欢迎你给我留言，和我一起讨论。

参考文献

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.

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.

Mikolov, Tomas, Kai Chen, Greg Corrado, and Jeffrey Dean. Efficient estimation of word representations in vector space. arXiv preprint arXiv:1301.3781 (2013).

Diaz, Fernando, Bhaskar Mitra, and Nick Craswell. Query expansion with locally-trained word embeddings. arXiv preprint arXiv:1605.07891 (2016).

027 | 搜索系统评测，有哪些基础指标？

我在之前几周的专栏文章里主要讲解了最经典的信息检索（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 个相关文档被取出来，不管是“精度”还是“召回”都无法分辨这三个文档在最后序列中的位置，是头三位，还是后面的三位？很遗憾，“精度”和“召回”都无法解决这个问题。“二元相关度”的这个问题也就指引研究人员去开发真正能对排序进行评估的指标。

小结

今天我为你讲了现代搜索技术中一个非常重要的一个环节，那就是如何评价我们构建的系统。我们详细讲解了线下测试的由来以及这样的测试相比于调查问卷的优势。

一起来回顾下要点：第一，简要介绍了可重复使用的线下测试集的历史，以及这样的测试集都有什么特点与局限。第二，详细介绍了两个非常流行和重要的基于“二元相关度”的评测指标，那就是“精度”和“召回”。

最后，给你留一个思考题，我们讲了排序的好坏不能简单地从“精度”和“召回”的数值看出，那能不能动一些手脚呢？如果我们就依赖“二元相关度”，有没有什么方法来看“排序”的好坏呢？

欢迎你给我留言，和我一起讨论。

参考文献

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.

K. SPARCK JONES, C.J. VAN RIJSBERGEN. Information Retrieval Test Collections. Journal of Documentation, Vol. 32 Issue: 1, pp.59-75, 1976.

C.J. VAN RIJSBERGEN. Foundation of Evaluation. Journal of Documentation, Vol. 30 Issue: 4, pp.365-373, 1974.

028 | 搜索系统评测，有哪些高级指标？

周一我们介绍了基于“二元相关”原理的线下评测指标。可以说，从 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 来评价好坏呢？

欢迎你给我留言，和我一起讨论。

参考文献

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.

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.

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.

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.

029 | 如何评测搜索系统的在线表现？

我在本周前面的两篇文章中为你讲解了基于“二元相关”和基于“多程度相关”原理的线下评测指标。利用这些指标，研发人员在半个世纪的时间里开发了一代又一代的搜索系统，这些指标和系统也都在不断演化。

虽然我们这周讲过的这些指标都很有指导意义，但大多数指标被提出来的时候都是基于线下的静态数据集，并不是真正去检测用户和系统的互动（虽然后期也有研发人员直接使用这些评测工具用于在线评测，但在使用上就产生了问题）。那有什么样的方法来评测搜索系统的在线表现呢？

为了回答这个问题，我们今天就来探讨一下进行在线评测的几个话题。

在线可控实验

我们先回到整个评测指标的初衷，为什么要进行线下测试呢？

第一个原因是在信息检索系统（也就是最早的搜索系统）的开发时期，还很难做在线可控实验（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 之间的关系呢？

欢迎你给我留言，和我一起讨论。

030 | 文档理解第一步：文档分类

我们在前几周的专栏里讲解了最经典的信息检索（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）上位置类似。

比如，某一个公司的很多子页面，虽然上面的文字本身有差异，但因为都是这个公司的页面，从大的文档页面网络上看，他们都代表这个公司的信息，因此在进行文档分类的时候，也很有可能会把他们放到一起。

小结

今天我为你讲了现代搜索技术中又一个至关重要的环节，那就是文档理解中的文档分类问题。你可以看到文档分类所要了解的信息还是比较多的。

一起来回顾下要点：第一，简要介绍了文档分类的主要类型，包括二元分类、多类分类以及层次分类。第二，详细介绍了文档分类所可能用到的种种特性，比如文档上原本的文字信息、文档的排版格式以及周围有关系的文档。第三，介绍了如何利用监督学习以及其他的算法工具来完成文档分类的任务。

最后，给你留一个思考题，如果一个文档中既有图片也有文字，那我们该如何组织这些特性，然后放到我们的分类器中去学习呢？

欢迎你给我留言，和我一起讨论。

031 | 文档理解的关键步骤：文档聚类

周一我们分享了文档理解最基本的一个步骤，那就是给文档分类（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 均值算法。第四，简要提及了文档聚类的一些难点。

最后，给你留一个思考题，当得到文档聚类的结果以后，能否把这些结果用在其他任务中呢？如果可以，如何利用？

欢迎你给我留言，和我一起讨论。

032 | 文档理解的重要特例：多模文档建模

本周我们重点分享搜索系统中的一个重要部件，那就是文档理解。周一我们首先分享了文档理解最基本的一个步骤，那就是给文档分类，主要是看不同文档表达什么类别的信息。然后，周三我们聊了聊另外一个重要的文档理解组件，也就是文档聚类的一些基本的概念和技术。今天我就来和你分享一个文档理解的重要特例：多模文档建模（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 等模型的领域。

小结

今天我为你讲了文档理解中的多模数据建模问题。你可以看到这是一个非常火热的领域，如何理解多媒体数据是现代数据处理的一个重要问题 。

一起来回顾下要点：第一，简要介绍了什么是多模数据。第二，详细介绍了多模数据建模的一些基本思路，包括如何获取文档的表征、什么是联合表征和什么是独立表征。然后，我们还讲了如何构建不同的分类器。第三，简要地提及了其他的多模数据建模任务以及这些任务所依靠的基本的深度学习趋势。

最后，给你留一个思考题，多模建模带来了丰富的特性，由这些丰富特性所训练的分类器，就一定能比单一数据源所训练得到的分类器表现得更好吗？

欢迎你给我留言，和我一起讨论。

033 | 大型搜索框架宏观视角：发展、特点及趋势

我们在前几周的专栏里讲解了一系列最经典的信息检索（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），有明确的算法来求解在这些框架下的机器学习问题。同时，机器学习的一系列基本的方法论，比如训练数据、测试数据、评测方法等等都可以应用到信息检索的场景中来。这对于搜索系统的性能以及整体搜索系统的研发都有了非常重要的指导意义。

同时，这也开启了一个非常便利的提高搜索系统效果的大门。那就是任何机器学习领域内部的发展，很多都可以被借鉴到搜索系统中。比如，最近几年深度学习的大力发展，就可以在已经铺就的基于机器学习的搜索系统框架下很容易地进行尝试。

第二，基于机器学习的搜索系统能够很容易地利用多模数据。对于机器学习而言，多模数据，或者说是多种类型的数据的融合，可以很自然地通过特性以及不同类型的特性来表达。因此，对于多模数据，机器学习有天然的优势。通过学习这些特性之间的联系从而预测相关度，是机器学习的强项。

因此，理解搜索系统各个部分的数据并把这些信息用在排序算法中，这样的方式就如雨后春笋般大量地出现了。比如，我们之前提到过的查询关键字理解中的查询关键字分类和查询关键字解析，以及文档理解中的文档分类所产生的特性，很难想象这些内容在传统的文本匹配系统中得以应用。但在基于机器学习的搜索系统中，这些信息则往往成为提高相关度建模的重要工具。

同时，我们也在之前的分享中介绍了，针对多模数据，机器学习中专门有相关的研究，思考如何把不同类型的数据能够更好地融合在一起来建模。这类研究在传统的文本匹配搜索系统中根本不存在。

基于机器学习的搜索系统也不是完美无瑕。实际上，如果没有各种保证，机器学习并不一定能在实际中获得满意的效果，因为基于机器学习的搜索系统对整个系统而言有了较高的要求。

机器学习往往需要大量的数据，而在一个现实的软件产品中，如何能够构建可靠并且干净的数据就是一个不简单的任务。如果没有可靠的数据，对于一般的机器学习算法而言，就是“垃圾进入，垃圾出来”，实际效果往往比不使用机器学习还要糟糕。

同时，机器学习系统可能会有特性异常、模型异常、数据异常等等其他软件系统所不具备的各种问题。如果在生产系统中对这些情况没有一个估计和处理，机器学习搜索系统往往也会不尽人意。

更加智能的搜索系统

很明显，搜索系统不会仅仅停留在应用普通的机器学习算法。近几年，搜索系统的发展有两个方面。

一方面，当然就是依靠深度学习发展的春风，不少学者和研究人员都在思考，如何能够利用深度学习技术让搜索系统更上一层楼。在这方面的研发中，不仅仅是针对普通的深度学习算法，而是看如何应用深度学习所特有的一些模式，比如深度强化学习等方式来重新思考搜索问题。

另一方面，就是从用户的角度来说，研究更加有意义的评测方式。也就是说，如何能够真正抓住用户对这个系统的偏好，并且能够进一步地去优化这个系统的性能。

小结

今天我为你讲了现代搜索技术框架的发展，并简单提及了搜索系统目前发展的趋势 。 一起来回顾下要点：第一，我们讲了基于文本匹配的经典搜索系统的特点；第二，我们讲了基于机器学习的搜索系统的特点。

最后，给你留一个思考题，在机器学习和深度学习的思潮中，传统搜索系统的核心，也就是我们说过的索引，能否依靠机器学习来生成呢？

欢迎你给我留言，和我一起讨论。

034 | 多轮打分系统概述

周一我为你介绍了搜索系统的一个宏观分类，包括传统的文本匹配信息检索系统和机器学习信息检索系统。这个分类可以让你非常清晰地了解信息搜索系统的历史进程，并对这两种搜索系统的特点有所了解。

今天我们就来剖析搜索系统的另一个框架体系：多轮打分（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]），我们还可以生成一些更加精细的特性来进一步提高排序的精度。因此，多轮打分是值得探索的。

小结

今天我为你讲了现代搜索技术中一个很重要的思路，多轮打分系统 。 一起来回顾下要点：第一，我们讲了为什么需要多轮打分，多轮打分的核心思路是什么。第二，我们分别讲了第一轮和第二轮以及后面轮数的一些特点。

最后，给你留一个思考题，在多轮打分系统的情况下，如何评测第一轮模型的好坏呢？

欢迎你给我留言，和我一起讨论。

参考文献

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.

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.

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.

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.

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.

035 | 搜索索引及其相关技术概述

本周我们分享的主题是从宏观上来剖析现代搜索架构。周一我介绍了搜索系统的一个大的分类，一类是从 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 操作符这样能够模拟线性模型的算法。

小结

今天我为你讲了现代搜索技术的一个核心组成部分，那就是倒排索引系统。 一起来回顾下要点：第一，我们讲了索引系统的基本组成和原理。第二，我们讲了索引相关技术的一个概况，重点介绍了压缩以及“略过”的含义。第三，简要讲解了查询关键字处理的两种最基础的策略。

最后，给你留一个思考题，如果我们既有图像信息又有文字信息，那该如何构建我们的索引呢？

欢迎你给我留言，和我一起讨论。

036 | PageRank算法的核心思想是什么？

上周我们介绍了信息搜索系统的历史进程，剖析了搜索系统的多轮打分系统，还深入探讨了倒排索引，聊了聊它的核心技术。

这周我要和你分享的是在互联网搜索引擎兴起之后的一个研发需要，那就是如何理解网页和网页之间的关系，特别是怎么从这些关系中提取网页中除文字以外的其他特性。这部分的一些核心算法曾是提高搜索引擎质量的重要推进力量。另外，我们这周要分享的算法也适用于其他能够把信息用结点与结点关系来表达的信息网络。

今天，我们先看一看用图来表达网页与网页之间的关系，并且计算网页重要性的经典算法：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 值？

欢迎你给我留言，和我一起讨论。

参考文献

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.

Langville, Amy N.; Meyer, Carl D. Deeper Inside PageRank. Internet Math. no. 3, 335-380, 2003.

论文链接

The anatomy of a large-scale hypertextual Web search engine

Deeper Inside PageRank

037 | 经典图算法之HITS

这周我们分享的内容是如何理解网页和网页之间的关系。周一我们介绍了用图（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 的一些特点。

最后，给你留一个思考题，有没有办法把权威值和枢纽值所对应的两个排序合并成为一个排序呢？

欢迎你给我留言，和我一起讨论。

参考文献

Jon M. Kleinberg. Authoritative sources in a hyperlinked environment. J. ACM 46, 5 (September 1999), 604-632，1999.

论文链接

Authoritative sources in a hyperlinked environment

038 | 社区检测算法之“模块最大化 ”

一起来回顾下本周的内容。周一我们介绍了用图（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 的寻找最大特征向量的问题 。

最后，给你留一个思考题，如何把网页的社区信息利用到学习网页的相关度里面去呢？

欢迎你给我留言，和我一起讨论。

参考文献

M. E. J. Newman. Modularity and community structure in networks. Proc. Natl. Acad. Sci. USA 103, 8577–8582 , 2006.

M. E. J. Newman. Finding community structure in networks using the eigenvectors of matrices. Phys. Rev. E 74, 036104 , 2006.

论文链接

Modularity and community structure in networks

Finding community structure in networks using the eigenvectors of matrices

039 | 机器学习排序算法经典模型：RankSVM

到目前为止，我们在专栏里已经讨论了关于搜索引擎方方面面的很多话题，包括经典的信息检索技术、查询关键字理解、文档理解以及现代搜索引擎的架构等等 。同时，我们也从机器学习角度出发对搜索引擎的最核心部分，也就是排序算法进行了最基本的分享，囊括了单点法排序学习（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 的顺序。意思是说，如果有两个数据点 X1X1 和 X2X2，他们对应的 Y1Y1 是 3，Y2Y2 是 5。因为 Y2Y2 大于 Y1Y1（在这里，“大于”表明一个顺序），因此，一个合理的排序模型需要把 X1X1 通过某种转换，使得到的结果小于同样的转换作用于 X2X2 上。这里的转换，就是排序支持向量机需要学习到的模型。

具体说来，在线性假设下，排序支持向量机就是要学习到一组线性系数 W，使得在上面这个例子中，X2X2 点积 W 之后的结果要大于 X1X1 点积 W 的结果。当然，对于整个数据集而言，我们不仅仅需要对 X1X1 和 X2X2 这两个数据点进行合理预测，还需要对所有的点，以及他们之间所有的顺序关系进行建模。也就是说，模型的参数 W 需要使得数据集上所有数据点的顺序关系的预测都准确。

很明显，上述模型是非常严格的。而实际中，很可能并不存在这样的 W 可以完全使得所有的 X 都满足这样的条件。这也就是我们之前说的线性不可分在排序中的情况。那么，更加现实的一个定义是，在允许有一定误差的情况下，如何使得 W 可以准确预测所有数据之间的顺序关系，并且 W 所确定的超平面到达两边数据的边界最大化，这就是线性排序向量机的定义。

实际上，在线性分类器的情境下，线性排序向量机是针对数据配对（Pair）的差值进行建模的。回到刚才我们所说的例子，线性排序向量机是把 X2X2 减去 X1X1 的差值当做新的特性向量，然后学习 W。也就是说，原理上说，整个支持向量机的所有理论和方法都可以不加改变地应用到这个新的特征向量空间中。当然，这个情况仅仅针对线性分类器。

因为是针对两个数据点之间的关系进行建模，排序支持向量机也就成为配对法排序学习的一个经典模型。

排序支持向量机的难点

我们刚刚提到的排序支持向量机的定义方法虽然很直观，但是有一个非常大的问题，那就是复杂度是 N 的平方级，这里的 N 是数据点的数目。原因是我们需要对数据点与点之间的所有配对进行建模。 当我们要对上万，甚至上百万的文档建模的时候，直接利用排序支持向量机的定义来求解模型参数显然是不可行的。

于是，针对排序支持向量机的研究和应用就集中在了如何能够降低计算复杂度这一难点上，使得算法可以在大规模数据上得以使用。

比较实用的算法是索斯腾在 2006 年发表的论文 [6] 中提出的，这篇论文就是我们前面讲的 2017 年 KDD 时间检验奖，建议你回去复习一下。这里，我再简要地梳理一下要点。

这个算法的核心是重新思考了对排序支持向量机整个问题的设置，把解决结构化向量机（Structural SVM）的一种算法，CP 算法（Cutting-Plane），使用到了排序支持向量机上。简单来说，这个算法就是保持一个工作集合（Working Set）来存放当前循环时依然被违反的约束条件（Constraints），然后在下一轮中集中优化这部分工作集合的约束条件。整个流程开始于一个空的工作集合，每一轮优化的是一个基于当前工作集合的支持向量机子问题。算法直到所有约束条件的误差小于一个全局的参数误差为止。

索斯腾在文章中详细证明了该算法的有效性和时间复杂度。相同的方法也使得排序支持向量机的算法能够转换成为更加计算有效的优化过程，在线性计算复杂度的情况下完成。

小结

今天我为你讲了利用机器学习技术来学习排序算法的一个基础的算法，排序支持向量机的基本原理。作为配对法排序学习的一个经典算法，排序支持向量机有着广泛的应用 。 一起来回顾下要点：第一，我们简要介绍了排序支持向量机提出的历史背景。第二，我们详细介绍了排序支持向量机的问题设置。第三，我们简要提及了排序支持向量机的难点和一个实用的算法。

最后，给你留一个思考题，排序支持向量机是否给了你一些启发，让你可以把更加简单的对数几率分类器（Logistic Regression）应用到排序问题上呢？

欢迎你给我留言，和我一起讨论。

参考文献

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.

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.

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.

Joachims, T. A Support Vector Method for Multivariate Performance Measures. Proceedings of the 22Nd International Conference on Machine Learning, ACM, 377-384, 2005.

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.

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.

论文链接

Support vector learning for ordinal regression

Support Vector Machine Learning for Interdependent and Structured Output Spaces

A Support Vector Method for Multivariate Performance Measures

Large Margin Methods for Structured and Interdependent Output Variables

Training Linear SVMs in Linear Time

040 | 机器学习排序算法经典模型：GBDT

这周我们讨论机器学习排序算法中几个经典的模型，周一分享了配对法排序中的一个经典算法，即排序支持向量机（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]，就是雅虎的科学家第一次把刚才提到的这个思路用于搜索问题中，训练排序算法。在应用的时候，有一些细节的调整，比如损失函数的设定。这里，作者们采用了配对法排序学习方法，那就是不直接去拟合相关度，而是拟合两个不同文档相关度的差值。具体来说，就是针对某一个查询关键字，我们利用算法来最小化对文档相关度差值的预测，也就是说我们不希望把相关度高的文档放到相关度低的后面。

在这些论文中，还有后续的很多研究中，利用梯度增强决策树算法进行排序训练得到的效果比当时的其他算法都有大幅度的提升。因此，这也就慢慢地奠定了梯度增强决策树作为一种普适的机器学习排序算法的地位。值得说明的是，梯度增强决策树的成功，一部分来自于增强算法，另一部分来自于把很多决策树堆积起来的想法。这两个思路都是在机器学习中被反复验证、行之有效的“模式”。

小结

今天我为你讲了梯度增强决策树算法的基本原理，这是一个利用机器学习技术来学习排序的基础算法。作为配对法排序学习的一个经典算法，梯度增强决策树算法有着广泛的应用 。 一起来回顾下要点：第一，我们简要介绍了梯度增强决策树提出的历史。第二，我们详细介绍了增强算法的核心以及梯度增强的思路。第三，我们简要介绍了梯度增强决策树的核心以及如何利用这个算法来训练排序问题。

最后，给你留一个思考题，梯度增强的思路能和神经网络模型结合吗？

欢迎你给我留言，和我一起讨论。

参考文献

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.

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.

Friedman, Jerome H. Greedy function approximation: a gradient boosting machine. Annals of Statistics (2001): 1189–1232, 2001.

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.

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.

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.

论文链接

A Decision-Theoretic Generalization of On-Line Learning and an Application to Boosting

Additive logistic regression: a statistical view of boosting

Greedy function approximation: a gradient boosting machine

A general boosting method and its application to learning ranking functions for web search

A regression framework for learning ranking functions using relative relevance judgments

Practical Lessons from Predicting Clicks on Ads at Facebook

041 | 机器学习排序算法经典模型：LambdaMART

在这周的时间里，我们讨论机器学习排序算法中几个经典的模型。周一我们分享了排序支持向量机（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 这样更改优化过程中的梯度计算，虽然很形象，但是有没有什么坏处？

欢迎你给我留言，和我一起讨论。

参考文献

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.

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.

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.

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.

论文链接

Learning to Rank Using Gradient Descent

Learning to Rank with Nonsmooth Cost Functions

Adapting Boosting for Information Retrieval Measures

Yahoo! Learning to Rank Challenge Overview

042 | 基于深度学习的搜索算法：深度结构化语义模型

近两个月，我们集中系统地分享了搜索核心技术模块。做一个简单的内容梳理，我们讲解了搜索引擎方方面面的话题，从经典的信息检索技术、查询关键字理解、文档理解到现代搜索引擎的架构和索引的核心技术；还从机器学习角度出发分享了搜索引擎的最核心部分，也就是排序算法，深入排序算法的细节讲解了排序支持向量机（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 问”，如果你有想交流的问题，欢迎给我留言，我们周六直播见！

043 | 基于深度学习的搜索算法：卷积结构下的隐含语义模型

这个星期，也是我们整个搜索领域分享的最后一周内容，来看一些搜索算法的前沿思考，特别是深度学习对搜索领域的影响。周一我们分享了一篇较早利用深度学习技术来进行搜索建模的论文，论文提出如何使用前馈神经网络来对查询关键字和文档进行信息提取，从而能够学习更有意义的语义信息。

今天我们来看一篇文章《信息检索中结合卷积池化结构的隐含语义模型》（A Latent Semantic Model with Convolutional-Pooling Structure for Information Retrieval），可以说这是我们周一分享论文的一个后续工作。这篇论文发表在第 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 问”，如果你有想交流的问题，欢迎给我留言，我们周六直播见！

044 | 基于深度学习的搜索算法：局部和分布表征下的搜索模型

周一我们分享了一篇较早利用深度学习技术来进行搜索建模的论文，利用前馈神经网络来对查询关键字和文档进行信息提取，从而学习到更有意义的语义信息。周三我们分享了另外一篇论文，可以说是周一分享文章的一个后续工作，探讨了如何利用卷积神经网络来对搜索表征进行进一步提升。这两篇论文呈现了一个统一的套路，那就是尝试把深度学习的一些经验直接应用到传统的搜索建模上。这些尝试，也都取得了一些初步成绩。

今天我们来聊一篇 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 问”，如果你有想交流的问题，欢迎给我留言，我们周六直播见！

复盘 1 | 搜索核心技术模块

到目前为止，我们讲完了人工智能核心技术的第一个模块——搜索。我们从搜索的核心算法入手，进而讨论了搜索的两个关键组件，分别是查询关键字理解和文档理解，并落实到对搜索系统的评价，然后从宏观视角介绍了搜索框架的历史和发展，最后又从深度学习技术在搜索领域的应用角度，对分享做了一个延伸。

整个模块共 27 期，9 大主题，希望通过这些内容，能让你对搜索技术有一个系统的认识和理解，为自己进一步学习和提升打下基础。今天我们就来对这一模块的内容做一个复盘。

提示：点击知识卡跳转到你最想看的那篇文章，温故而知新。如不能正常跳转，请先将 App 更新到最新版本。

1. 现代搜索架构剖析

从 20 世纪 50 年代有信息检索系统开始，搜索系统大致经历了三个发展阶段。从最开始的“基于文本匹配的信息检索系统”到“基于机器学习的信息检索系统”，再到近几年受深度学习影响的“更加智能的搜索系统”。

2. 经典搜索核心算法

3. 基于机器学习的排序算法

问题设置：把一个排序问题转换成一个机器学习的问题设置，特别是监督学习的设置。

4. 基于机器学习的高级排序算法

5. 查询关键字理解

6. 文档理解

7. 经典图算法

8. 基于深度学习的搜索算法

9. 搜索系统的评价

If You Can’t Measure It, You Can’t Improve It.

积跬步以至千里

最后，恭喜你在这个模块中已经阅读了70047 字，听了220 分钟的音频，这是一个不小的成就。在人工智能领域的千里之行，我们已经迈出了扎实的第一步。

感谢你在专栏里的每一个留言，给了我很多思考和启发。期待能够听到你更多的声音，我们一起交流讨论。

063 | 简单推荐模型之一：基于流行度的推荐模型

今天，我们正式进入专栏的另一个比较大的模块，那就是推荐系统。之前我们详细且全面地介绍了搜索系统的各个组成部分。在接下来的几周时间里，我们一起来看推荐系统的技术要点又有哪些。

我们还是从简单推荐系统聊起，由易到难，逐步为你讲述一些经典的推荐模型。

推荐系统目前已经深入到了互联网的各类产品中。不管是到电子商务网站购物，还是到新闻阅读网站获取信息，甚至是在出行的时候希望听到不同的音乐，不同种类的推荐系统都在我们的生活中发挥着举足轻重的作用。

那么，搭建一个最简单的推荐系统，应该如何入手呢？今天我们就来聊一个最基本的推荐模型：基于流行度的推荐模型。

最简单的流行度估计

什么是基于流行度（Popularity-based）？通俗地说，就是什么内容吸引用户，就给用户推荐什么内容。

这里面其实有一个隐含的假设，那就是物品本身的质量好坏和流行度有一定的正比关系。什么意思呢？就是说好的东西，关注的人自然就多，自然就会有更多的谈论。当然，这是一个主观的假设，并不是所有质量高的物品都会有很高的流行度。然而，在不需要过多其他信息和假设的情况下，流行度可以算是衡量物品质量好坏的一个最简单的测度。

那么，如果我们能够在每一个时间点上准确地估计到一个物品的流行度，就只需要按照流行度的数值从高到低排序显示所有的物品就可以了。

然而，这里牵涉到一个问题，那就是如何判断一个物品在任何时间点上的流行度呢？有两个重要的因素影响着物品流行度的估计，那就是时间和位置。

我们先来说一下时间因素。很显然，用户访问每一个应用或者服务都有一定的规律，这种规律导致每一个应用的流量规律也不一样。比如，人们可能更倾向于在早上或者傍晚打开新闻网站，看一看一天都发生了什么事情。因此，任何文章投放到这两个时段自然就会有比较高的关注度。这并不代表这些文章就要好于其他的文章，可能仅仅是由于时间的关系。因此，我们在对流行度建模的时候就需要考虑时间的因素。

另外一个重要的因素是位置。这个“位置”并不是真正的地理位置，而是在一个服务或者网站的什么位置显示你的物品。因为用户心理对于不同位置的感受，在很多类型的服务中常常都有隐含的“位置偏差”（Position Bias）。

这些偏差给我们估计某个物品的流行度带来了很大的困难。比如说，在绝大多数的搜索引擎服务中，排名第一的物品所受到的关注度很可能大大高于排名第二和之后的物品。因此，一个物品只要放到第一的位置，关注度自然就会升高。当然，这并不能完全代表这个物品本身的属性。

因此，我们在估计物品的流行度时就需要考虑上面所说的这两个重要因素。

要解决刚才说的两个问题，我们就不能使用绝对数值来对流行度建模。比如我们使用在单位时间内点击的数目，购买的数目，或者点赞的数目，都会受到刚才所说的两种偏差的影响。假设一篇文章在 9 点到 10 点这个时段被点击了 100 次，在 10 点到 11 点这个时段被点击了 50 次，这并不能代表这个文章在 10 点到 11 点这个时段就变得不受欢迎了，很可能是这个时段的总的用户量比较多。

因此，对于流行度的衡量，我们往往使用的是一个“比值”（Ratio），或者是计算某种“可能性”（Probability）。也就是说，我们计算在总的用户数是 N 的情况下，点击了某个文章的人数。这个比值，取决于不同的含义，如果是点击，往往叫作点击率；如果是购买，叫作购买率。为了方便讨论，我们在下面的例子中都使用点击率。

然而，点击率本身虽然解决了一部分时间和位置偏差所带来的影响，但是点击率的估计所需要的数据依然会受到偏差的影响。因此，我们往往希望能够建立无偏差的数据。

关于如何能够无偏差地估计，这是一个研究课题，我们今天不详细展开。不过，有一种比较经济的方法可以收集没有偏差的数据，那就是把服务的流量分成两个部分。

一个部分，利用现在已有的对物品流行度的估计来显示推荐结果。另外一个部分，则随机显示物品。这种方法是一种特殊的EE 算法（Exploitation & Exploration），叫“epsilon 贪心”（epsilon-Greedy）。

我们之后还会聊到这个话题。根据这样的方式搜集的数据可以认为是没有位置偏差的。我们从随机显示物品的这部分流量中去估计流行度，然后在另外一个部分的流量里去显示物品。

如果从数学上对点击率建模，其实可以把一个物品在显示之后是否被点击看成是一个“伯努利随机变量”，于是对点击率的估计，就变成了对一个伯努利分布参数估计的过程。

有一种参数估计的方法叫作“最大似然估计法”（Maximum Likelihood Estimation）。简而言之，就是说，希望找到参数的取值可以最大限度地解释当前的数据。我们利用最大似然法就可以求出在某一段时间内的点击率所代表的伯努利分布的参数估计。这个估计的数值就是某个物品当前的点击总数除以被显示的次数。通俗地讲，如果我们显示某个物品 10 次，被点击了 5 次，那么在最大似然估计的情况下，点击率的估计值就是 0.5。

很显然，这样的估计有一定的局限性。如果我们并没有显示当前的物品，那么，最大似然估计的分母就是 0；如果当前的物品没有被点击过，那么分子就是 0。在这两种情况下，最大似然估计都无法真正体现出物品的流行度。

高级流行度估计

我们从统计学的角度来讲了讲，如何利用最大似然估计法来对一个伯努利分布所代表的点击率的参数进行估计。

这里面的第一个问题就是刚才我们提到的分子或者分母为 0 的情况。显然，这种情况下并不能很好地反应这些物品的真实属性。

一种解决方案是对分子和分母设置“先验信息”。就是说，虽然我们现在没有显示这个物品或者这个物品没有被点击，但是，我们“主观”地认为，比如说在显示 100 次的情况下，会有 60 次的点击。注意，这些显示次数和点击次数都还没有发生。在这样的先验概率的影响下，点击率的估计，或者说得更加精确一些，点击率的后验概率分布的均值，就成为了实际的点击加上先验的点击，除以实际的显示次数加上先验的显示次数。你可以看到，在有先验分布的情况下，这个比值永远不可能为 0。当然，这也就避免了我们之前所说的用最大似然估计所带来的问题。

利用先验信息来“平滑”（Smooth）概率的估计，是贝叶斯统计（Bayesian Statistics）中经常使用的方法。如果用更加精准的数学语言来表述这个过程，我们其实是为这个伯努利分布加上了一个 Beta 分布的先验概率，并且推导出了后验概率也是一个 Beta 分布。这个 Beta 分布参数的均值，就是我们刚才所说的均值。

在实际操作中，并不是所有的分布都能够找到这样方便的先验分布，使得后验概率有一个解析解的形式。我们在这里就不展开讨论了。

另外一个可以扩展的地方就是，到目前为止，我们对于流行度的估计都是针对某一个特定的时段。很明显，每个时段的估计和前面的时间是有一定关联的。这也就提醒我们是不是可以用之前的点击信息，来更加准确地估计现在这个时段的点击率。

答案是可以的。当然，这里会有不同的方法。

一种最简单的方法还是利用我们刚才所说的先验概率的思想。那就是，当前 T 时刻的点击和显示的先验数值是 T-1 时刻的某种变换。什么意思呢？比如早上 9 点到 10 点，某个物品有 40 次点击，100 次显示。那么 10 点到 11 点，我们在还没有显示的情况下，就可以认为这个物品会有 20 次点击，50 次显示。注意，我们把 9 点到 10 点的真实数据乘以 0.5 用于 10 点到 11 点的先验数据，这种做法是一种主观的做法。而且是否乘以 0.5 还是其他数值需要取决于测试。但是这种思想，有时候叫作“时间折扣”（Temporal Discount），是一种非常普遍的时序信息处理的手法。

小结

今天我为你讲了基于流行度的推荐系统的基本原理。一起来回顾下要点：第一，我们简要介绍了为什么需要基于流行度进行推荐；第二，我们详细介绍了如何对流行度进行估计以及从统计角度看其含义；第三，我们简要地提及了一些更加高级的流行度估计的方法。

最后，给你留一个思考题，我们介绍了如何使用先验信息来对参数进行平滑，如何能够更加准确地确定先验概率中的数字呢？具体到我们的例子就是，如何来设置先验的点击和显示次数呢？

欢迎你给我留言，和我一起讨论。

064 | 简单推荐模型之二：基于相似信息的推荐模型

这周我们开始讲推荐系统。周一的文章中，我们聊了一个最基本的推荐模型：基于流行度的推荐模型。这是一种简单且实用的推荐系统搭建方式，那就是需要对每一个物品的流行度进行估计。

今天，我们来看另外一种简单但很有效果的推荐模型：基于相似信息的推荐模型。

什么是相似信息的推荐模型

相似信息的推荐模型又叫“临近”（Neighborhood）模型。顾名思义，就是我们希望利用临近、或者相似的数据点来为用户推荐。

临近模型的内在假设是推荐系统中著名的“协同过滤”（Collaborative Filtering）。什么意思呢？就是说，我们认为，相似的用户可能会有相似的喜好，相似的物品可能会被相似的人所偏好。于是，如果我们能够定义怎么寻找相似的用户或者相似的物品，那么我们就可以利用这些类别的人群或者物品来给用户进行推荐。

例如，对于一个电影推荐的场景来说，有一个用户 A 观看了电影《战狼 2》，我们希望根据这个信息来为用户进行推荐。很显然，如果我们仅仅知道用户 A 观看过《战狼 2》，这个信息是非常有限的。但是，假设有一个用户 B 也观看过《战狼 2》，并且最近还观看过《红海行动》。那么， 我们可以根据 B 的信息来对 A 进行推荐，也就是说，我们认为用户 A 也有可能喜欢《红海行动》。

这里面，我们其实经历了这么两个步骤。

第一，联系用户 A 和用户 B 的是他们都看过《战狼 2》。这就帮助我们定义了 A 和 B 是相似用户。

第二，我们的假定是，相似的用户有相似的观影偏好，于是我们就直接把 B 的另外一个观看过的电影《红海行动》拿来推荐给了 A。

这两个步骤其实就很好地解释了“协同过滤”中“协同”的概念，意思就是相似的用户互相协同，互相过滤信息。

“协同过滤”从统计模型的意义上来讲，其实就是“借用数据”，在数据稀缺的情况下帮助建模。掌握这个思路是非常重要的建模手段。

在用户 A 数据不足的情况下，我们挖掘到可以借鉴用户 B 的数据。因此，我们其实是把用户 A 和用户 B“聚类”到了一起，认为他们代表了一个类型的用户。当我们把对单个用户的建模抽象上升到某一个类型的用户的时候，这就把更多的数据放到了一起。

基于相似用户的协同过滤

刚才我们简单聊了聊什么是基于相似信息的推荐系统。相信到现在，你已经对这个概念有了一个最基本的认识。

那么，如何才能够比较系统地定义这样的流程呢？

首先，问题被抽象为我们需要估计用户 I 针对一个没有“触碰过”（这里指点击、购买、或者评分等行为）的物品 J 的偏好。

第一步，我们需要构建一个用户集合，这个用户集合得满足两个标准：第一，这些用户需要已经触碰过物品 J，这是与用户 I 的一大区别；第二，这些用户在其他的行为方面需要与用户 I 类似。

现在我们假设这个集合已经构造好了。那么，接下来的一个步骤，就是根据这个相似的用户集，我们可以对物品 J 进行一个打分。这个打分的逻辑是这样的。首先，我们已经得到了所有和 I 相似的用户对 J 的打分。那么，一种办法就是，直接用这些打分的平均值来预估 J 的评分。也就是说，如果我们认为这个相似集合都是和用户 I 相似的用户，那么他们对 J 的偏好，我们就认为是 I 的偏好。显然这是一个很粗糙的做法。

我们可以针对这个直接平均的做法进行两个改动。

第一，采用加权平均的做法。也就是说，和用户 I 越相似的用户，我们越倚重这些人对 J 的偏好。

第二，我们也需要对整个评分进行一个修正。虽然这个相似集合的人都对 J 进行过触碰，但是每个人的喜好毕竟还是不一样的。比如有的用户可能习惯性地会对很多物品有很强的偏好。因此，仅仅是借鉴每个人的偏好，而忽略了这些用户的偏差，这显然是不够的。所以，我们需要对这些评分做这样的修正，那就是减去这些相似用户对所有东西的平均打分，也就是说，我们需要把这些用户本人的偏差给去除掉。

综合刚才说的两个因素，可以得到一个更加合适的打分算法，那就是，用户 I 对物品 J 的打分来自两个部分：一部分是 I 的平均打分，另外一部分是 I 对于 J 的一个在平均打分之上的补充打分。这个补充打分来自于刚才我们建立的相似用户集，是这个相似用户集里每个用户对于 J 的补充打分的一个加权平均。权重依赖于这个用户和 I 的相似度。每个用户对于 J 的补充打分是他们对于 J 的直接打分减去他们自己的平均打分。

相似信息的构建

我们刚才讲了一下相似用户协同过滤的一个基本思路。那么，这里面有几个要素需要确定。

第一，我们怎么来定义两个用户是相似的？一种最简单的办法，就是计算两个用户对于他们都偏好物品的“皮尔森相关度”（Pearson Correlation）。这里当然可以换做是其他相关信息的计算。

具体来说，皮尔森相关度是针对每一个“两个用户”都同时偏好过的物品，看他们的偏好是否相似，这里的相似是用乘积的形式出现的。当两个偏好的值都比较大的时候，乘积也就比较大；而只有其中一个比较大的时候，乘积就会比较小。然后，皮尔森相关度对所有的乘积结果进行“加和”并且“归一化”。

第二，当有了用户之间的相关度信息后，我们可以设定一些“阈值”来筛选刚才所说的相关用户集合。对于每个目标用户，我们可以设置最多达到前 K 个相似用户（比如 K 等于 100 或者 200），这也是有效构造相似集合的办法。

最后，我们来谈一下刚才所说的加权平均里面的权重问题。一种权重，就是直接使用两个用户的相似度，也就是我们刚计算的皮尔森相关度。当然，这里有一个问题，如果直接使用，我们可能会过分“相信”有一些相关度高但自身数据也不多的用户。什么意思呢？比如有一个用户 M，可能和目标用户 I 很相似，但是 M 自己可能也就偏好过一两件物品，因此我们可能还需要对相关度进行一个“重新加权”（Re-Weighting）的过程。具体来说，我们可以把皮尔森相关度乘以一个系数，这个系数是根据自身的偏好数量来定的。

基于相似物品的协同过滤

在协同过滤的历史上，人们很快就意识到在进行构建推荐的过程中，用户和物品的“对称性”。什么意思？也就是说，我们刚才对于用户的讨论其实完全可以变换到物品中。

具体说来，那就是我们不去构造和用户 I 相似的用户，而是去构造所有和物品 J 相似的物品。这些相似物品集合必须要满足两点：第一，和 J 相似；第二，已经被用户 I 触碰了。这里的一个基本的假设类似于，虽然我不知道用户 I 对于《红海行动》的偏好，但我可以去看一看用户过去看的电影里有哪些和《红海行动》是类似的，我们就可以从那些类似的电影中进行加权平均，取得对《红海行动》的预测。

小结

今天，我为你讲了推荐系统的另外一个基本的形式：基于相似度的协同过滤推荐系统。

一起来回顾下要点：第一，我们简要介绍了整个基于相似度协同过滤的内涵以及我们这么做的基本假设；第二，我们详细介绍了如何构造一个基于用户相似度的协同过滤系统；第三，我们简要地提及了如何构造物品相似的协同过滤系统。

最后，给你留一个思考题，协同过滤的一个致命问题是什么？

欢迎你给我留言，和我一起讨论。

065 | 简单推荐模型之三：基于内容信息的推荐模型

周一的文章中，我们聊了一个最基本的基于流行度的推荐模型。周三我们讨论了基于相似信息的推荐模型。基于相似信息的推荐模型，其核心就是协同过滤的思想，希望能够通过相似的用户或者相似的物品来对当前的场景进行推荐。

然而，不管是基于流行度的推荐，还是协同过滤，这些方法都有一些根本的问题。比如，对于基于流行度预测的推荐来说，推荐结果不是个性化的。因为流行度预测是一种全局的预测，每个人得到的推荐结果是一样的。而协同过滤的问题是强烈依赖相似用户以及相似物品的定义，而且对于新用户或者新物品来说有数据稀缺的问题。因此，在实际应用中，往往不能在整个系统中单独使用协同过滤。

今天，我们来分享一个更加普遍的方法，那就是基于内容信息的推荐系统。这种系统在实践中往往更能适应各种不同的推荐场景。

什么是基于内容信息的推荐系统

所谓基于内容信息的推荐系统，其实就是用特征（Feature）来表示用户、物品以及用户和物品的交互，从而能够把推荐问题转换成为监督学习任务。

把推荐系统完全定义为监督学习任务，需要有这么几个步骤。

第一，就是我们已经提到的，需要把所有用户、物品的各种信号用特征来表示。这里面往往牵涉非常复杂和繁琐的特征工程，也就是看如何能够把不同的信息通过特征表达出来。

第二，就是每一个监督任务都需要面临的问题，如何构造一个目标函数，来描述当前的场景。可以说，这是最难的一个部分，也是和基于流行度和基于相似度的推荐系统的最大区别。

内容信息的各类特性

那么，对于物品特性来说，有哪些是比较重要的呢？这里我们肯定没法提供一个完备的列表，那我就来谈一些主要的特性，起到一个抛砖引玉的作用。

第一，物品的文本信息。比如商品的名字和描述。这些文字信息可以使用很多文本挖掘（Text Mining）的方式来组成有效的特征。

我们在讲搜索模块的时候，其实就已经提到了一些，比如用 TF-IDF 的方法来形成文本向量。当然，因为文本信息的噪声相对比较大，并且数据维度也比较大（维度等于文本所对应语言的词汇量），很多时候我们都寻求降低这部分数据的维度，降低到一个固定的维度。这种时候，很多所谓“降维”的工具就很有必要了。

传统上，有用“话题模型”（Topic Model）对文本进行降维的。也就是说，我们针对每一个文字描述都可以学习到一个话题的分布，这个分布向量可能是 50 维、100 维等等，但是肯定要比原始的词汇向量要小。

近些年，很多人又开始使用各种“词嵌入向量”（Word Embedding）的方法来为文字信息降维，从而能够使用一个固定的维度来表达文字信息。

第二，物品的类别信息（或者物品的知识信息）。对于新闻文章来说，类别信息是新闻的话题类别，像娱乐新闻、财经新闻或者时政新闻等。而对于商品来说，类别信息是商品的品类，像电器、床上用品或者生活用品等。这些类别信息往往能够非常有效地抓住物品的整体属性。通常情况下，这样的属性比直接使用文字信息更加直接。

如何能够得到这样的类别信息呢？在有些情况下，这些类别信息是在数据输入的时候获取的。比如通过合作渠道取得新闻文章的时候，类别往往是编辑加上去的。再比如，商品的类别很多时候也是卖家在输入商品的时候加上去的。

当然，也有一些情况，这些类别信息并不是直接获得的；或者是在数据中有很多缺失的情况下，就需要利用机器学习的手段，来构造分类器以获取这些类别信息。我们在这里就不展开讨论这些分类器该如何构建了。

最后需要说明的一点是，除了最基本的类别信息，最近一段时间比较火热的研发领域，就是利用知识图谱（Knowledge Graph）来对物品的各种信息进行深入挖掘。很多信息是通过知识图谱推断出来的。

举个例子，某一篇新闻文章是关于美国总统特朗普的，于是这篇文章可能就会自动被打上美国总统、美国政治等其他标签。这种通过一些原始的信息来进一步推断更加丰富的知识信息，也是重要的物品类别特征的处理工作。

最后需要提及的是图像或者其他多媒体的信息。在信息如此丰富的今天，很多物品都有多样的表现形式，比如比较常见的图像、视频等。

那么，如何从这些媒介中提取信息也是非常关键的物品特征工程。和文字信息正好相反，很多多媒体的信息都是稠密（Dense）的向量，因此需要对这些向量进行特殊处理，比如我们首先学习一个分类器，然后再和其他特征的不同分类器组合。

前面我们简单谈了谈物品的特征，下面我们再来看看用户的特征。

对于用户来说，最基础、最首要的肯定是用户的基本特性，包括性别、年龄、地理位置。这三大信息其实可以涵盖用户特性工程中非常大的一块内容。

这里不仅是最基本的这三个特性的值，还有围绕这三个特性发展出来的三大种类的特性。比如，不同性别在文章点击率上的差异，不同年龄层在商品购买上的差异，不同地理位置对不同影视作品的喜好等，这些都是根据这三个特性发展出来的更多的特性。

然后，我们可以为用户进行画像（Profiling）。有显式的用户画像，比如用户自己定义的喜好，或者用户自己认为不愿意看到的物品或者类别。

但是在大多数情况下，用户都不会为我们提供那么精准的回馈信息，甚至完全不会有任何直接的反馈。在这样的情况下，绝大多数的用户画像工作，其实是通过用户的“隐反馈”（Implicit Feedback），来对用户的喜好进行建模。关于如何进行用户画像，我们今天就不在这里展开了。

目标函数

讨论了物品和用户特征的一些基本情况后，我们再来简单聊聊另外一个话题，那就是目标函数。我们前面提到，整个基于内容信息的推荐系统就是把所有的信号都当做特征，然后构建一个监督学习任务。

监督学习的一个关键的就是目标函数。对于一个推荐系统来说，都有什么样的目标函数呢？

和纯粹的基于评分（Rating）的协同过滤推荐系统一样，我们可以设置监督学习的目标函数是拟合评分。当然，已经有很多学者指出评分并不是推荐系统的真正目标。

那么，在实际系统中比较常见的目标函数有点击率和购买率，也有一些相对比较复杂的目标函数，比如预测用户在某一个物品上的停留时长。

对于究竟在哪种场景中使用什么样的目标函数，这依然是当前的一个主要研究方向。

小结

今天我为你讲了基于内容信息的推荐系统。通俗地说，就是如何把推荐系统当做监督学习任务来看待。

一起来回顾下要点：第一，我们简要介绍了整个基于内容推荐的内涵以及我们这么做的基本假设；第二，我们详细介绍了如何构造一个基于内容的推荐系统，特别是如何构造物品和用户的特征；第三，我们简要地介绍了目标函数的重要性。

最后，给你留一个思考题，如何把我们前面介绍的两种推荐系统模式，也就是基于流行度和协同过滤，也融进基于内容的推荐系统中去呢？

欢迎你给我留言，和我一起讨论。

066 | 基于隐变量的模型之一：矩阵分解

上周我们聊了三个简单的推荐模型，分别是基于流行度的推荐模型，基于相似信息的推荐模型和基于内容特征的推荐模型。

这周，我们来看一类非常重要的推荐模型：基于隐变量的推荐模型。这类模型的优势是对用户和物品信息中的隐含结构进行建模，从而能够挖掘更加深层次的用户和物品关系。

什么是隐变量

在解释如何用隐变量来生成推荐结果之前，我们先来说一下什么是隐变量。

隐变量（Latent Variable），顾名思义，就是“隐藏的变量”或者叫“隐藏的参数”，这里主要是指我们假定实际的数据是由一系列的隐含变量产生的。我们通过模型的假设，知道隐变量之间的关系，但暂时并不知道隐变量的取值。因此需要通过“推断”（Inference）过程来确定隐变量的实际取值。当我们知道了这些隐变量的取值之后，就可以根据这些取值来对未来的数据进行预测和分析。

隐变量往往还带有“统计分布”（Distribution）的假设。什么意思呢？就是隐变量之间，或者隐变量和显式变量之间的关系，我们往往认为是由某种分布产生的。

举一个最简单的隐变量模型的例子，那就是“高斯混合模型”（Mixture of Gaussian）。

高斯混合模型假设数据是由多个不同的高斯分布产生的，每一个高斯分布有自己的均值和方差。在最简单的两个高斯的情况下，每一个数据点，都有可能是由这两个高斯分布中的一个产生的，但是，究竟是哪一个我们并不知道。于是，对于每一个数据点，我们就有一个隐含的变量，来表达当前这个数据点究竟来自哪一个高斯分布。

很明显，这个隐含变量的取值事先并不知道。除了这个隐含变量我们不知道以外，两个高斯分布的均值和方法其实也不知道。于是，对于高斯混合模型来说，整个学习的过程就需要估计每个数据点的来源以及多个高斯分布的均值和方差。高斯混合模型，几乎是最简单的隐变量模型，但也给我们了展示了使用隐变量模型对数据建模的灵活性以及训练的复杂性。

矩阵分解作为隐变量模型

了解了隐变量模型的基本的概念以后，我们还是回到推荐的场景。

在推荐系统中，有一种最普遍的数据表达，那就是用户和物品的交互，比如评分、点击等等。这里我们用评分作为一般性的讨论。对于每一个用户，如果我们用一个向量来表达其对所有可能物品的评分，那么把所有用户的向量堆积起来，就可以得到一个矩阵。这个矩阵的每一行代表一个用户，每一列代表一个物品，每一个交叉的元素代表某一个用户对于某一个商品的评分。

那么这个矩阵有什么特点呢？最大的特点就是，这个矩阵的数据其实非常稀少。因为在一个现实的系统中，一个用户不可能对所有的物品都进行评分。实际上，一个用户仅仅对非常少的物品进行过评分，而对绝大多数物品并不会评分，甚至连评分的打算都没有。因此，这个矩阵的绝大多数元素其实是 0。当然，实际上这些元素也不是 0，而是未知，因为用户并不是觉得这些物品的评分是 0，而是压根没有对这些物品进行打分，也就是说评分信息不完备。

对于这样一个矩阵，我们的任务其实就是根据有评分的用户物品交互，对那些还没有评分信息的物品进行预测。如果我们能够“补全”（Complete）整个矩阵里的其他元素，那么就可以根据预测的评分从大到小给用户进行推荐。

怎么来补全这个矩阵的信息呢？

这里，我们假设，矩阵的每一个元素都是经过这样一个过程产生的。

首先，我们假设每一个用户和每一个物品都对应一个隐向量（Latent Factor）。比如，我们用 100 维的向量来表达一个用户，用另外一个 100 维的向量来表达一个物品。如果我们有 1 百万个用户和 1 万个物品，那么我们就需要 1 百万个 100 维的用户向量，和 1 万个 100 维的物品向量。

然后，我们假设矩阵的每一个元素是由所对应的用户和物品的隐向量点积得到的。也就是说，矩阵里的每一个元素，都是一个 100 维的用户向量和一个 100 维的物品向量对应元素相乘相加而得。

在这样的一个假设下，一个原本 1 百万乘以 1 万的矩阵就可以被分解为 1 百万乘以 100 的用户矩阵和 100 乘以 1 万的物品矩阵的乘积。这也就是为什么在这样的模型下，我们会称这个方法为“矩阵分解”（Matrix Factorization）的原因。

在矩阵分解这个假设下，我们可以看到，原本是需要对整个矩阵，也就是 1 百万乘以 1 万个数据进行建模，而现在缩减到了两个小一些的矩阵 1 百万乘以 100 和 100 乘以 1 万。对比来看，之前对于每一个用户，我们需要一万个元素来表达用户对于这一万个物品的评分喜好；现在，对每个用于仅仅需要保存 100 个元素。

只不过，这一百个元素的数值并不代表任何意义。从这个层面上理解矩阵分解，也就能够帮助我们知道，这个方法其实是一种“降维”（Dimension Reduction），也就是把一个比较大的矩阵分解成两个小矩阵来表达。

我们可以看到，矩阵分解的核心其实就是刚才的假设，用隐向量来表达用户和物品，他们的乘积关系就成为了原始的元素。不同的假设可以得到不同的矩阵分解模型。

学习矩阵分解模型

很明显，矩阵分解仅仅告诉了我们这个模型的表达，但并没有告诉我们怎么去获得整个模型的最核心内容，那就是用户矩阵和物品矩阵里每一个元素的数值。也就是我们所说的，用户隐向量和物品隐向量都是事先不知道的。

那有什么办法能够得到这些向量的取值呢？

这里介绍一种常用的方法，就是利用最小二乘法的原理（Least Square）来拟合求解这些隐向量。

前面讲到，矩阵里的每一个元素来自于两个隐向量的点积，我们就可以利用这一点来构造一个目标函数。这个目标函数其实就是说，这两个隐向量的点积一定要与我们观测到的矩阵数值相近。这里的“相近”是用这两个数值的误差，在这里也就是平方差（Square Error）来衡量的。误差越小，说明数据拟合得越好，隐向量也就更能表达用户和物品。

构造好了这个目标函数以后，我们就可以利用优化算法来求解这个目标函数。因为两个未知数点积的原因，这个目标函数没有一个全局的最优解，但是我们可以通过“梯度下降”（Gradient Descent）的方法找到一个不错的局部解（Local Minima）。

小结

今天我为你讲了推荐系统的一个重要分支，隐变量模型。我们讲了其中最重要的一个基本模型，矩阵分解。

一起来回顾下要点：第一，我们简要介绍了隐变量模型的基本原理；第二，我们详细介绍了矩阵分解作为隐变量模型的假设和原理；第三，我们简要地讨论了如何求解矩阵分解里的隐变量。

最后，给你留一个思考题，矩阵分解模型最大的问题是什么？

欢迎你给我留言，和我一起讨论。

067 | 基于隐变量的模型之二：基于回归的矩阵分解

本周我们主要来分享“矩阵分解”的点点滴滴，这是过去 10 年里推荐系统中最流行的一类模型。周一我们讨论了这类方法中最基础的基于隐变量的矩阵分解。这类模型的优势是显式地对用户和物品信息中的隐含结构进行建模，从而能够挖掘更加深层次的用户和物品关系。矩阵分解的流行起源于 10 年前的 Netflix 大赛，当时各类矩阵分解模型都在实际数据中起到了很好的效果。

今天我们要分享的模型，叫作“基于回归的隐变量模型”（Regression-based Latent Factor Model）。这是在基本矩阵分解的基础上衍生出来的一类模型。

基本矩阵分解的问题

我们先来看看基本矩阵分解模型的潜在问题。

首先，我们来回顾一下矩阵分解的基本表达。假设我们在对用户和物品的评分进行建模。对于每一个用户，用一个向量来表达其对于所有可能物品的评分，把所有用户的向量堆积起来，就可以得到一个矩阵。这个矩阵的每一行代表一个用户，每一列代表一个物品，每一个交叉的元素代表某一个用户对于某一个商品的评分。对于每一个用户和物品的隐向量都要少于原有的物品数目，因此，我们也说矩阵分解的模型实现了“降维”（降低建模维度）的目的。

虽然矩阵分解的模型对于挖掘用户和物品的内在联系有比较强的作用，但是这类模型的劣势也十分明显。

第一，矩阵分解的矩阵仅仅是对用户和物品的喜好进行了“编码”（Encode）。我们之前在解释基于内容的推荐系统时说过，对于一个复杂的工业级推荐系统来说，有很多灵感或者直觉，都很难仅仅依赖用户和物品的喜好来捕捉到。有大量的信号，无法很好地被融合到这个矩阵分解的模式里。因此，矩阵分解虽然是不错的“独立”模型（Standalone），但在融合多种不同的推荐元素方面，表现却很一般。

第二，矩阵分解的核心是学习用户的隐向量和物品的隐向量。原则上，这两类隐向量的学习仅能通过训练过程获得。

什么意思呢？就是说，如果在训练集合中有 100 个用户，200 个物品，那么通过训练，我们可以学习到这 100 个用户和 200 个物品对应的隐向量，用于以后的预测或者排序。但我们无法获得新来用户或者新来物品的隐向量了，因为这些用户和物品并不在训练集里。

在推荐系统中，这种情况就叫作不能处理“冷启动”（Cold Start）问题，也就是不能处理“冷”用户和“冷”物品。这个特点是好是坏取决于具体的应用。但是，在有些应用的场景下，这是灾难性的一种特性。比如，新闻网站推荐文章，一般来说新闻文章滚动得都很快，随时随地都可能有新文章涌入，每过几天，整个网站的文章可能都被换掉，在这样的场景下，直接使用矩阵分解就会有问题。

矩阵分解的基本模型存在这两个问题，那有没有什么办法可以扩展矩阵分解的形式，改善在这两种情况下的处理呢？

基于回归的矩阵分解

基于回归的矩阵分解，其核心思路其实非常简单直观。矩阵分解不过是定义了一种从用户隐变量和物品隐变量到可以观测到的评分，这一显变量的产生过程。如果我们掌握了这么一个思路，那么，基于回归的矩阵分解就很容易理解了。

首先，有一组用户特性和物品特性来表述每一个用户和物品。这些特性不是隐变量，是显式表达的特性。用户特性比如用户的年龄、性别、经常出现的地区、已经表达了喜好的类别等；物品特性比如物品的种类、描述等等。这两组显式的特性就是为了解决我们刚才说的第一个问题，矩阵分解无法抓住更多的信号。而在这里，我们明确定义这两组信号，一组来自于用户，一组来自于物品，希望能够通过这些信号抓住更多有价值的信息。

解决了这一步后，现在我们有两个独立的，看上去不相关的部分。一个是基于矩阵分解的部分，这一部分是分解一个已知的评分矩阵，从而学习到用户和物品的隐向量。另外一个部分，就是用户特性和物品特性，暂时还不知道如何与矩阵分解关联上。

基于回归的矩阵分解假定，用户的隐向量，其实是从用户的显式特性变换而来的。同理，物品的隐向量，其实是从物品的显式特性变换而来的。而这两种变换，本质上就是两个回归模型（Regression Model）。就是说，我们建立一个从显式特性到隐向量的回归模型，使得隐向量受到两方面的制约：从评分矩阵的分解得来的信息和从显式特性回归得来的信息。这样，我们就把这两部分信息嫁接到了一起。

把这两部分信息嫁接到一起的好处就是，我们不再怕“冷启动”了。或者说，在有一部分“冷启动”的情况下，这样的模型可以处理得更好。原因就是我们使用了显示特性来回归隐向量。对于新用户和新物品而言，我们虽然没有直接得到他们的隐向量，但是有这些用户或者物品的显式特性，而这些显式特性可以帮助我们估计到新用户和新物品的隐向量，即使我们并没有它们的交互信息。这就是基于回归的矩阵分解的强大之处。

我们还可以从贝叶斯的角度来理解基于回归的矩阵分解。把用户的隐向量和物品的隐向量看作是两个随机变量。我们可以认为这些随机变量加上了先验概率分布。只不过，这个先验概率分布的均值不是我们经常使用的 0，而是一个以回归函数的结果为均值的高斯分布，这个回归函数就是我们由显式特性得到的。本质上，我们认为显示特性的某种变换成为了隐向量的先验信息。

学习基于回归的矩阵分解

基于回归的矩阵分解，其实就相当于我们定义了“层次的贝叶斯模型”（Hierarchical Bayesian Model）。模型的求解就变得更加复杂。

有一种学习这个模型的简单思路。第一，针对已知的用户和物品，先通过简单的矩阵分解学习到用户和物品的隐变量。在这个部分里，用户的显式信息并不参与学习。第二，学习好了这部分变量以后，再来学习从显式信息到隐变量的回归部分。这部分基本上可以当作线性回归。当然，用这种两个阶段的学习流程，并不能保证学习到的参数是最优的，这仅仅是一种简化的学习方法。

如果走比较正统的学习过程，这样的模型需要采用“期望最大化”（Expectation Maximization）的流程。也就是说，我们先用一组随机的参数来决定回归的部分，学习到最佳的隐向量，然后再根据隐向量更新回归部分的参数。因篇幅的原因我们就不展开细节了。不过，即便如此，我们也仅仅能够学习到一个局部解。

小结

今天我为你讲了隐变量模型中基于回归的矩阵分解。

一起来回顾下要点：第一，我们简要介绍了矩阵分解的一些问题；第二，我们详细介绍了基于回归的矩阵分解的基本思路，以及这样的模型如何解决了传统矩阵分解关于“冷启动”的难题；第三，我们简要地讲解了如何求解基于回归的矩阵分解里的参数。

最后，给你留一个思考题，基于回归的矩阵分解的短板是什么？

欢迎你给我留言，和我一起讨论。

068 | 基于隐变量的模型之三：分解机

周三我们分享了“基于回归的隐变量模型”，这是在基本的矩阵分解基础上衍生出来的一类模型。这种模型把显式特性和隐变量结合起来，对解决“冷启动”问题有一定作用。

今天，我们来介绍一种叫作“分解机”（Factorization Machines）的推荐技术。这个模型是从基于回归的隐变量模型中衍生出来的，已成为了主流的推荐模型。

矩阵分解和基于回归的隐变量模型存在哪些问题？

在介绍分解机的基本原理之前，我们先来回顾一下从“矩阵分解”到“基于回归的隐变量模型”的一个发展脉络。

首先，矩阵分解主要解决了两个问题，那就是从一个大矩阵降维到两个小矩阵，并且寄希望这两个小矩阵能够抓住用户和物品的相关度。

然而，单纯的矩阵分解无法融入很多用户和物品的特性，这就引导我们开发出了基于回归的矩阵分解。所谓的回归部分，也就是从显式特性出发，建立从显式特性到隐变量之间关系的流程，从而使我们能够把更多的信号放进模型中。

在一定程度上，基于回归的隐变量模型实现了把显式变量和隐变量结合的目的，但是这类模型的学习过程非常麻烦。实际上，因为这类模型复杂的训练流程，其在实际应用中并不常见。

那么，有没有其他思路来统一显式变量和隐变量的处理方式呢？

分解机的基本原理

分解机 [1] 是学者斯特芬·润顿（Steffen Rendle）在德国康斯坦扎大学任教期间开发出来的推荐模型。斯特芬后来加入谷歌，分解机是他的代表作品。

分解机结合了“基于内容的推荐系统”和“基于回归的隐变量模型”的一些基本思想。

基于内容的推荐系统，其核心就是认为需要预测的变量（这里我们依然讨论评分）是所有显式变量的一个回归结果。分解机直接借鉴了这一点，也就是说，分解机的输入是所有的显式变量。

实际上，分解机在对待显式变量的手法上更进了一步，那就是不仅直接对显式变量进行建模，还对显示变量的两两关系进行建模。当然，在原始的论文中，分解机其实还可以对更加高维的关系进行建模，我们这里局限在两两关系上。

什么意思呢？比如说我们有一个用户特性，是用户的年龄；我们有一个物品特性，是物品的种类。那么，普通的回归模型，就是把用户的年龄和物品的种类直接当作特性输入到模型中。而对于分解机来说，这只是第一步。

第二步，分解机是把这两个特性的数值进行乘积，当作一个新的特性，然后进一步处理这种两两配对的关系。把原始特性进行两两配对是构建模型的一种重要的方法，特别是对于非深度学习模型，需要自己做特征工程的模型。

两两配对的特征有什么好处呢？好处就是可以对两种特性的交互信息进行建模。举个例子，如果我们特别在意某个年龄段的用户在某种商品类别中的评分，那么，把这两个特性相乘，从而抓取到这个交互信息，是一个非常有效的手段。

但是，两两配对存在什么问题吗？一个问题就是特性空间会急速增长。如果我们有一个 100 维的用户特性向量，然后有一个 100 维的物品特性向量，那对于两两配对的特征，就是 100 乘 100 这个数量级的。另一个更严重的问题就是，如果我们的单独特性中，有一些是“类别特性”（Categorical Feature），那么在两两配对之后就会产生大量的 0，从而变成一个巨大的稀疏矩阵。

如何解决这个问题呢？分解机利用了矩阵分解的降维思路。就是说，我们不对一个稀疏矩阵直接建模，而是把这个稀疏矩阵分解之后再进行建模。具体到上面这个例子，就是先假定，所有特性都对应一个隐变量向量，两个显式特性的乘积是两个特性的隐变量的点积。也就是说，我们把两个显式特性的乘积分解为了两个向量的乘积。这样，我们就不需要直接表示原来的稀疏矩阵。

在这样的思路下，分解机成功地把隐变量和显式变量结合到了一起。当我们的显式特性仅仅是用户 ID 和物品 ID 的时候，分解机的表达退回了最原始的矩阵分解。也就是说，矩阵分解其实可以表达成为特性的两两作用矩阵的分解。

在原始的论文中，作者还用分解机模拟了好几种流行的模型，我们这里就不复述了。

虽然也是为了建立从显式特性到隐变量的关系，但是对比基于回归的矩阵分解而言，分解机的训练过程大大简化了。在实际应用中，我们经常使用“随机梯度下降”（SGD, Stochastic Gradient Descent）来对分解机直接进行求解。

在最近几年的 Kaggle 比赛中以及一些工业级的应用中，分解机凭借其简单易用的特点，成为了很多产品的核心算法。

小结

今天我为你讲了隐变量模型中分解机的基本原理。

一起来回顾下要点：第一，我们简要介绍了矩阵分解的一些问题；第二，我们详细介绍了分解机的基本原理；第三，我们简要讲了如何求解分解机。

最后，给你留一个思考题，分解机能够解决“冷启动”的问题吗？

欢迎你给我留言，和我一起讨论。

参考文献

1. Steffen Rendle. Factorization Machines with libFM. ACM Trans. Intell. Syst. Technol. 3, 3, Article 57 (May 2012), 22 pages, 2012.

069 | 高级推荐模型之一：张量分解模型

上周我们分享了推荐系统中矩阵分解的点点滴滴，简单复习一下讨论过的三个模型。

第一，“基于隐变量的矩阵分解”，其优势是显式地对用户和物品信息中的隐含结构进行建模，从而能够挖掘更加深层次的用户和物品关系。

第二，“基于回归的隐变量模型”，这是在基本的矩阵分解基础上衍生出来的一类模型。这种基于回归的矩阵分解模型把显式特性和隐变量结合起来，对解决“冷启动”问题有一定作用。

第三，“分解机”是由基于回归的隐变量模型衍生出来的，并且吸纳了基于信息的推荐系统的一些观点，成为了一种可以融合多种信息的强有力的工具。

这周，我们跟随着这个脚步，进一步来讨论一些比较高级的模型，看这些模型如何抓住更多的用户和物品之间的关系。

今天，我们先来聊一种叫作“张量分解”（Tensor Factorization）的模型。

为什么需要张量分解

在我们探讨张量分解的一些基本思想之前，先来看一看，推荐系统在什么场景下需要张量分解。

我们还是要从矩阵分解说起。矩阵分解的核心思想，是用矩阵这种数据结构来表达用户和物品的相互关系。这里，我们一般谈论的都是一些最简单的关系，例如评分、点击、购买等（本文我们依然只是讨论评分）。在这种二元的模式下，矩阵就是最好的表达用户和物品之间关系的数据结构。

然而，在真实的场景中，用户和物品的关系以及产生这种关系的周围环境是复杂的。一个矩阵并不能完全描述所有的变量。例如，用户对于某个物品的评分是发生在某个地点、某个时间段内的。这种所谓的“上下文关系”（Context）往往会对评分产生很大影响。遗憾的是，一个矩阵无法捕捉这样的上下文关系。

我们之前讨论过的“基于回归的矩阵分解”和“分解机”，本质上都是在某种程度上绕开这个问题。采用的方法就是，依然用矩阵来表达二元关系，但是把其他信息放进隐变量中，或者是采用基于信息的推荐系统的思路来得到相关信息的建模。

除了这种思路，还有没有别的方法，可以把上下文关系融入到对用户和物品的建模中去呢？

这时“张量”就该上场了。

从本质上来说，张量就是矩阵的推广。我们可以这么理解，矩阵是对二维关系建模的一种工具；而张量，就是对 N 维关系的一种建模。在二维关系中，用户和物品的评分是唯一能够被建模的变量；而到了 N 维关系中，理论上，我们可以对任意多种上下文关系进行建模。

比如，我们刚才提到的时间，就可以组成一个三维的张量，分别为用户、物品和时间。然后，在这个三维的张量中，每一个单元代表着某一个用户对于某一个物品在某一个时间段的评分。

基于张量分解的推荐模型

我们已经讲了张量的作用。那么，如何使用张量来进行推荐模型的建模呢？

我们还是用刚才所说的“用户、物品和时间”作为例子。在这个三维的张量里，每一个元素代表的是用户对于物品在某个时间段上的评分。那么，根据矩阵分解的思路，我们怎么来对这个张量进行分解呢？

遗憾的是，张量的分解要比矩阵分解更为复杂。与矩阵分解不同，张量分解至少有两种不同的形式，这两种形式会引导出不同的分解模型和算法。

第一种分解模式叫 CP 分解（CANDECOMP/PARAFAC）。

拿我们刚才所说的三维张量来讲，CP 分解是把一个三维张量分解为三个矩阵。具体来说，比如我们的三维张量是 N 维用户乘以 M 维的物品乘以 R 维的时间段。那么，分解出来的三个矩阵就分别为 N 维乘以 K 维的用户矩阵，M 维乘以 K 维的物品矩阵，以及 R 维乘以 K 维的时间矩阵。这三个矩阵中的每一个向量都代表某一个用户、某一个物品和某一个时间段。K 在这里是一个参数，类似于矩阵分解中的隐变量的维度，我们也就可以把这个 K 理解成为隐变量的维度。

那么在原始的三维张量中，某一个元素就是这三个矩阵的某三个向量对应元素乘积相加的结果。CP 分解的一大好处就是，分解出来的三个矩阵的隐变量维度是一样的，这也就减少了需要调整的参数的个数。

第二种分解模式叫作 HOSVD 分解（High Order Singular Value decomposition）。

这种分解和 CP 分解最大的不同就是分解出来的三个矩阵的维度不再一样。也就是说，在我们之前的例子中，用户矩阵的维度可以是 N 乘以 A，物品矩阵的维度是 M 乘以 B，时间段矩阵的维度是 R 乘以 C。当然，这样就无法还原之前的 N 乘以 M 乘以 R 的三维张量了。

于是在技术上，还需要乘以一个 A 乘以 B 乘以 C 的小张量才能对原始数据进行复原。所以，通俗地讲，HOSVD 分解就是把一个三维的张量，分解成为三个矩阵和一个更小的张量的乘积。

那 HOSVD 相比 CP 分解有什么好处呢？好处自然就是给不同的数据以不同的自由度，因为不再限制用户、物品和时间段都必须有一样的维度。但同时也带来了难点，那就是有了更多的“超参数”需要调整。

值得一提的是，我们仅仅是讲了讲张量分解的一个基本思路。在实际的运作中，还有一个重要的步骤，那就是设计目标函数，或者说是定义损失函数。在一般的分解过程中，我们可以定义“平方差”（Squared Loss），也就是原始数值和预测数值之间的平方差来作为损失函数，当然也可以使用其他的损失函数，这一点和矩阵分解是一样的。

求解张量分解

虽然张量是对矩阵的自然延伸，张量分解是矩阵分解的某种延伸，但是求解张量分解则是一个相对比较难的问题。

一种比较简单的模式依然是使用“随机梯度下降”法（SGD, Stochastic Gradient Descent），也就是把张量的分解问题看作是一个一般的优化问题。关于这种方法的细节我在这里不详细讲解了，感兴趣的话，建议阅读参考文献 [1]，这是一篇很经典的论文，是第一次把张量分解使用在推荐系统中。

另外一种方法，也是在矩阵分解中可以使用的，叫作 ALS（Alternating Least Square）方法。这种方法则是在优化每一轮的时候，按住所有其他的矩阵变量不动，单独优化一个变量。举例来说，如果我们要优化用户矩阵，那么我们就按住物品矩阵和时间段矩阵不动，不去更新里面的参数，而仅仅更新用户矩阵里面的参数。同理，在下一轮的优化中，可以仅仅更新物品矩阵里的参数。这种方法也是行之有效的一种优化方法。

小结

今天我为你讲了推荐系统的一个高级模型：张量分解。张量分解模型主要用来对上下文的信息进行建模。

一起来回顾下要点：第一，我们简要介绍了为什么需要张量分解；第二，我们详细介绍了张量分解的基本原理；第三，我们简要地讨论了如果求解张量分解。

最后，给你留一个思考题，从概念上来看，用张量分解对上下文信息进行建模的最大问题是什么？

欢迎你给我留言，和我一起讨论。

参考文献

1. Alexandros Karatzoglou, Xavier Amatriain, Linas Baltrunas, and Nuria Oliver. Multiverse recommendation: n-dimensional tensor factorization for context-aware collaborative filtering. Proceedings of the fourth ACM conference on Recommender systems (RecSys '10). ACM, New York, NY, USA, 79-86, 2010.

070 | 高级推荐模型之二：协同矩阵分解

周一我们讨论了“张量分解”模型。这种模型的特点是能够把不同的上下文当作新的维度，放进一个张量中进行建模。虽然张量分解是矩阵分解在概念上的一种直觉扩展，但其在现实建模的过程中有很大难度，最大的问题就是张量分解的求解过程相对比较复杂，不同的分解方法又带来不同的建模选择。

今天，我们来看另外一种思路，来解决融合多种渠道信息的问题，这就是协同矩阵分解（Collective Matrix Factorization）。

为什么需要协同矩阵分解

在解释什么是协同矩阵分解之前，我们先来看一看为什么需要这样一种思路。我们还是需要回到矩阵分解本身。

矩阵分解的核心就是通过矩阵，这个二维的数据结构，来对用户和物品的交互信息进行建模。因为其二维的属性，矩阵往往只能对用户的某一种交互信息直接进行建模，这就带来很大的局限性。

在之前的讨论中，我们看到了一系列不同的思路来对这样的基本结构进行扩展。

思路一，就是通过建立显式变量和隐变量之间的回归关系，从而让矩阵分解的核心结构可以获得更多信息的帮助。

思路二，则是采用分解机这样的集大成模型，从而把所有的特性，都融入到一个统一的模型中去。

思路三，就是我们这周已经讲到的，利用张量，把二维的信息扩展到 N 维进行建模。

这些已有的思路都各有利弊，需要针对具体的情况来分析究竟什么样的模型最有效果。

然而在有一些应用中，除了用户和物品这样很明显的二元关系以外，还有其他也很明显的二元关系，如何把这些二元关系有效地组织起来，就变成了一个有挑战的任务。

什么意思呢？比如，我们是一个社交媒体的网站，既有用户对于物品（比如帖子）的交互信息，又有用户之间的互相连接信息（谁与谁是好友等）。那么，如何来显式地表达这两类不同的二元关系呢？

在前面的思路里面可以看到，我们似乎需要选择一个主要的关系来作为这个模型的基础框架，然后把其他的信息作为补充。在这样两类关系中，选择哪一个作为主要关系，哪一个作为补充关系，就显得有一点困难了。

更进一步说，对于用户与用户之间的建模，以及用户与物品之间的建模，我们其实会有不同的模型去构造。例如，用户与物品之间的评分，往往用整数来代表评分的数值，或者是用实数来代表喜好度。而用户与用户之间的友好关系，则往往是 0 或者 1，象征是否有连接。因此，我们可能需要不同的模型对这些不同的数值进行建模。

这也就让研究人员想出了协同矩阵分解的思路。

协同矩阵分解的基本思路

协同矩阵分解的基本思路其实非常直观，那就是有多少种二元关系，就用多少个矩阵分解去建模这些关系。

用我们刚才所说的社交媒体的例子。如果我们有用户与用户的关系，用户与物品的关系，那我们就组织两个矩阵分解，分别来对这两种关系进行建模。最早对这个思想进行得比较完整的表述，我在文末列出了参考文献 [1]。

这里的一个核心就是，如果两个没有关系的矩阵，各自做矩阵分解，那么分解出来的信息，一般来说，是没有任何关联的。

再来看刚才的例子，如果有一个用户与用户的矩阵需要分解，然后有一个用户与物品的矩阵需要分解。那从这两个矩阵分解中，我们分别可以得到至少两组不同的用户隐变量。一组是从用户与用户的关系而来，一组是从用户与物品的关系而来。这两组用户的隐变量是不一样的。同时，因为两个矩阵没有关联，所以无法达到我们希望这两种关系互相影响的效果。

要想在两个矩阵分解之间建立联系，我们必须有其他的假设。这里的其他假设就是，两组不同的用户隐变量其实是一样的。也就是说，我们假设，或者认定，用户隐变量在用户与用户的关系中，以及在用户与物品的关系中，是同一组用户隐变量在起作用。

这样，虽然表面上还是两个矩阵分解，但其实我们限定了其中某一部分参数的取值范围。说得直白一些，我们认定从两个矩阵分解出来的两组来自同一个因素（这里是用户）的隐变量是完全一样的。用更加学术的语言来说，这就是将两组矩阵分别投影到了相同的用户空间和物品空间。

这样做的好处，自然就是对于多种不同的关系来说，我们使用“相同隐变量”这样的假设，可以把这些关系都串联起来，然后减少了总的变量数目，同时也让各种关系互相影响。

那么，这样的假设有没有潜在的问题呢？

一个比较大的潜在问题就是，使用同样的一组隐变量去表达所有的同类关系，这样的假设存在一定的局限性。比如上面的例子，用同样一组用户隐变量去解释用户和用户之间的关系，同时也需要去解释用户和物品之间的关系，能够找到这样一组用户隐变量其实是有一定难度的。

而在实际应用中，不同关系的数据量会有很大的差距。比如，用户和物品关系的数据总量可能要比用户与用户的多。所以，由于用户和物品关系的数据多，两个矩阵分解用的同一组用户隐变量，很可能会更多地解释用户和物品的部分，从而造成了学到的隐变量未必能够真正表达所有的关系。

对于这样的情况，自然已经有一些学者想到了对策，我们今天就不在这里展开了。

最后，需要提一下，在协同矩阵分解的场景中，学习各个隐变量的参数的过程，和一般的单个矩阵分解相比，没有太多本质性的变化。最简单的学习过程，依然是利用随机梯度下降法（SGD, Stochastic Gradient Descent）去学习。只不过，每一个隐变量会存在于多个矩阵分解中，这在更新变量时增加了所需的计算量。

小结

今天我为你讲了推荐系统的另一个高级模型，协同矩阵分解，用来对不同类型的二元信息进行建模。

一起来回顾下要点：第一，我们简要介绍了为什么需要协同矩阵分解；第二，我们详细介绍了协同矩阵分解的原理、潜在问题和解法。

最后，给你留一个思考题，从概念上来看，协同矩阵分解和张量分解之间有怎样的关系？是不是所有的张量分解都可以化为多个协同矩阵分解呢？

欢迎你给我留言，和我一起讨论。

参考文献

1. Ajit P. Singh and Geoffrey J. Gordon. Relational learning via collective matrix factorization. Proceedings of the 14th ACM SIGKDD international conference on Knowledge discovery and data mining (KDD '08). ACM, New York, NY, USA, 650-658, 2008.

071 | 高级推荐模型之三：优化复杂目标函数

周三我们讨论了协同矩阵分解，其主要思想就是解决多个两两关系的矩阵分解，并且希望能够建立隐变量之间的共享。

今天，我们来看一个稍微不一样的话题，那就是如何优化更加复杂的目标函数。

为什么需要复杂的目标函数

在介绍更复杂的目标函数之前，我们首先来回想一下，在之前的分享中，都接触到了哪些目标函数。

对于基于流行度或者相似度的推荐系统来说，其实并没有真正的目标函数的概念。这些推荐模型都是某种直观的“翻译”，这也导致了这些推荐系统很难直接使用在真实的应用中，往往是被当作特性用在其他模型中。

基于信息的推荐系统，本质上就是监督学习在推荐系统中的应用。因为是监督学习，那自然就需要目标函数。这里，经常是对点击率或者购买率进行建模，也就是说，经常使用二分分类的目标函数。

当我们使用矩阵分解的架构来对用户和物品的关系进行建模时，绝大多数情况下我们是在讨论评分。对于评分信息，常用的其实是线性回归（Linear Regression），也有学者使用泊松回归，因为泊松回归对于整数变量的建模要好于线性回归。当然了，矩阵分解也可以扩展到对点击率或者购买率的建模。

当年 Netflix 竞赛之后，Netflix 公司把获奖的矩阵分解拿来进行实现，放入线上系统中，结果发现并没有本质性地提高推荐效果，这其实就和目标函数有关。虽然 Netflix 竞赛造就了矩阵分解等类似模型的流行，但是逐渐地，研究人员和工业界从业人员也意识到，用户对物品的评分，并不是推荐系统需要优化的目标，也就是说目标函数“选错了”。

那么，我们需要什么样的目标函数呢？

高级目标函数

直接对评分进行建模的最大问题，就是这和真实的推荐场景并不相符。不管是电商平台，还是新闻系统，我们并不是只在意用户对于某一些物品的评分。

真实的应用场景往往是这样的，用户打开应用，然后浏览一系列物品，由上往下进行翻阅，然后从中找到喜欢的物品。

这是不是很像我们在讨论搜索的时候，用户对于搜索结果的浏览？回忆一下，在搜索的场景中，我们首先输入关键字，然后搜索算法会返回一系列的结果。大多数情况下，我们会对返回的结果逐一检查。

在推荐场景下，我们虽然没有搜索关键词，但是整个从上往下的场景是类似的。

于是，我们就可以从搜索排序中得到启发，尝试对推荐结果进行排序。换句话说，我们并不在意用户的真实评分，或者我们是否能对用户和物品的喜好度进行完美估计，我们在意的是，能否把用户可能喜欢的物品排到前面去。

把搜索系统中的排序思想利用到推荐系统中，是推荐系统的一个重大进步，这也让推荐系统和真实场景逐渐挂钩。

那么，很直观的，要想更改推荐系统的行为，从评分的预测到排序学习，我们需要更改目标函数。

参考文献 [1] 中提出了一种叫BPR的方法，是把配对法引入到推荐系统中的一个重要工作。我们快速回忆一下已经在搜索系统中介绍过的“配对排序学习”。简单说来，配对法就是希望，对于某一个查询关键词来说，学习到每一对文档之间的关系，然后通过把所有的两两关系都预测正确，从而建立一个完整的排序结果。

很明显，在推荐系统的场景下，没有查询关键词，但是我们依然可以通过构造“会话”（Session）来学习排序。

简单来说，我们针对用户来到应用后产生的会话，对用户交互过的物品进行建模训练。我们期望能把有“正交互信息”的物品排到“负交互信息”的物品之前。

值得注意的是，和搜索不一样，推荐系统往往没有明确的反馈信息。意思就是，在搜索系统中，我们有已知的标签信息，也就是哪一个文档是“相关”的，哪一个是“不相关”的。然而，在推荐系统中我们并没有这样的信息。

因此，所有用户和物品的交互都是“隐回馈”（Implicit Feedback）。我们必须依靠假设来找到相关的物品。在这里，我们假定有正交互信息的物品是比其他物品更加相关。于是，正交互的物品的预测值要高。这里的“正交互”可以是点击、购买或者其他信息。这就是 BPR 的基本思路。

需要强调的一点是，BPR 仅仅是一种思路框架，我们可以应用到矩阵分解中，以及基于信息的推荐系统等不同的模型中。我们可以把矩阵分解中的对于评分的目标函数换成基于 BPR 的目标函数，也就是进行配对法训练，得到的推荐系统能够更好地对物品进行排序。

有了这个思路，我们就可以打开一系列的想法了。比如，我们在前面的搜索模块中讲过，其实还可以直接优化类似 NDCG、MAP 这样的指标。那能不能把这些想法也搬运到推荐系统中去呢？

简单的回答是，能。但是这个流程也不是那么显然易见的，毕竟我们没有直接的标签信息，而且一般来说，这些目标函数本身就已经很难优化了，我们还要嫁接到矩阵分解或者是分解机等模型上，这就会让优化的难度继续攀升。今天我们就不展开讨论这部分内容了。

小结

今天我为你讲了推荐系统的另外一个问题，那就是目标函数。

一起来回顾下要点：第一，我们分析了为什么要关注目标函数，以评分为基础的目标函数的问题；第二，我们详细介绍了 BPR 这种非常经典的配对法的目标函数。

最后，给你留一个思考题，如果我们能够对所有物品的喜好度进行精准预测，是不是就不需要 BPR 了呢？学习排序和对物品喜好度的预测是完全不同的两件事，还是相互之间有联系呢？

欢迎你给我留言，和我一起讨论。

参考文献

1. Steffen Rendle, Christoph Freudenthaler, Zeno Gantner, and Lars Schmidt-Thieme. BPR: Bayesian personalized ranking from implicit feedback. Proceedings of the Twenty-Fifth Conference on Uncertainty in Artificial Intelligence (UAI '09). AUAI Press, Arlington, Virginia, United States, 452-461, 2009.

072 | 推荐的Exploit和Explore算法之一：EE算法综述

上周，我们聊了一些比较高级的模型，包括张量分解和协同矩阵分解，讨论这些模型如何能够抓住更多的用户和物品之间的关系。最后，我们还讨论了如何优化更加复杂的目标函数。

这周，我们来看一个完全不同的话题，那就是 Exploitation（利用）和 Exploration（探索）的策略，俗称“EE 策略”。

一个推荐系统，如果片面优化用户的喜好，很可能导致千篇一律的推荐结果。其实，EE 策略是推荐系统里很有意思，但也非常有争议的一个话题。一方面，大家都明白这类算法的目的，每年有很多相关论文发表。但另一方面，工业界对于部署这类算法非常谨慎，有的产品经理甚至视之为“洪水猛兽”。我们今天就来分析一下导致这个现象的一些因素。

走一步看一步的策略

这里再简单阐述一下什么是 EE。简单来说，就是我们在优化某些目标函数的时候，从一个时间维度来看，当信息不足或者决策不确定性（Uncertainty）很大的时候，我们需要平衡两类决策：

选择现在可能是最佳的方案；

选择现在不确定，但未来可能会有高收益的方案。

在做这两类决策的过程中，我们也逐渐更新对所有决策不确定性的认识。最终，从时间的维度上来看，我们在不确定性的干扰下，依然能够去优化目标函数。

也就是说，EE 可以看作是一个优化过程，需要多次迭代才能找到比较好的方案。

EE 的应用历史

早期把 EE 应用于新闻推荐系统的文章，主要关注在雅虎的今日新闻（Today Module）这一产品上，这也基本上是 EE 最早在互联网应用的尝试，目的是为了优化点击率（CTR）。而更早的一些奠基性的文章，则是在广告的数据集上展示实验结果。

雅虎的今日新闻其实为 EE 提供了一些被很多学者和工业界人士忽视了的条件和成功因素。如果不考虑这些因素，鲁莽地在其他场景中使用这些文献中相似的算法，很可能会产生相当差的效果。那么是哪些因素呢？主要有两点。

相对少量的优质资源。今日新闻每天的内容池（Content Pool）其实并不大。这里面都是网站编辑精选了的大概 100 篇文章。这些文章原本的质量就非常高，无论是这里面的任何一组，用户体验都没有明显变差。内容池每天都人为更换。

非常大的用户量。有亿万级的用户，最终可能是从算法随机产生的文章排序中选择了阅读的文章。因为用户数量巨大，所以算法就相对比较容易收敛（Converge）到稳定的方案，也就是前面讲的，优化 CTR 的状态。

正因为有了以上两个因素，在这个模块上，工程师和科学家们享受了后来学者们所无法想象的“奢侈”，比如运行 Epsilon-Greedy 这种简单粗暴的 EE 算法；甚至是完全随机显示新闻，收集到了大量无偏（Unbiased）的数据，都为很多学术工作奠定了数据基础。时至今日，依然有不少后续学者，在今日新闻随机数据的基础上进行算法改进。

如果没有了这两条因素，最早的解决方案可能都没法在当时的雅虎施行。原因很简单，如果资源良莠不齐，资源数量非常大，那么在仅有的几个展示位置，优质资源显示的可能性在短期内就会比较小（因为系统对于大多数的资源还有很高的不确定性，需要 Explore）。

由于优质资源显示得少了，用户就会明显感受到体验下降，最直接的可能就是倾向于不点击甚至放弃使用产品。用户不和系统交互这样的行为，又进一步减缓了系统学习资源不确定性的速度。这时，也许亿万级用户数都没法满足学习所有资源的用户数量（毕竟所有用户只有一部分会落入 Exploration）。

关于这个解决方案有一个很有意思的点值得一提，在雅虎的研究人员跳槽到了 LinkedIn 以后，LinkedIn 也推了相似的方案。为了模拟雅虎今日新闻的这些条件，就对用户内容流里的数据进行了大规模的过滤。这样就有少数的信息符合高质量的要求，并且能够在用户数允许的情况下探索到合适的解决方案。

EE 的产品部署难点

我们来讲一下 EE 的产品部署难点，这些难点普遍高于具体的 EE 算法选择（比如选某一个 UCB 或者某一个 Thompson Sampling）在产品工程解决方案上的抉择。

为了便于讨论，我们把所有 EE 算法整体叫作“Random”，简称“R 算法”，而把不做 EE 的算法叫作“Deterministic”，简称“D 算法”。这里面的假设是，D 算法比较静态，能够产生高质量、一致性的内容。这里的一致性是指用户在短时间内的体验比较稳定，不会有大幅度的界面和内容变化。相反，整体来说，R 算法的不确定性比较大，用户体验和产生的内容可能会有比较大的波动。

第一个难点是如何上线测试。这看上去不应该是难点，但实际上需要格外小心。传统 EE 文献，只是把问题抽象为每一次访问需要做一个决策的选择。然而，文献却没有说，这些访问是否来自同一个用户。

那么，理论上，EE 应该对所有的访问不加区别，不管其是否来自同一个用户。用我们这篇文章的术语来说，就是所有的流量都做 R 算法。虽然从理论上讲这样没有问题，但实际上，用户体验会有很大的差别。特别是一些推荐网站，用户希望自己前后两次对网站的访问保持一致性。如果不加区分地做 R，对于同一个用户来说，很可能两次看见的内容完全迥异。这对用户熟悉产品界面，寻找喜爱的内容会产生非常大的障碍。

那么，我们对绝大部分用户做 D，对另外一小部分用户做 R，这样会好一些吗？这其实就是“牺牲”少部分用户体验，来换取绝大多数用户体验的一致性。这样实现也是最直观的，因为很多在线系统的 A/B 测试系统是根据用户来进行逻辑分割的。也就是说，某一部分用户会进入一个 Bucket，而另一批用户会进入另外一个 Bucket。按用户来做 D & R 可以很容易和 Bucket System 一致起来，方便部署。当然，这样做也是有潜在风险的。那就是，这部分老做 R 的用户，在当了别人的小白鼠以后，很可能永远放弃使用产品。

另外一个难点就是如何平衡产品。EE 几乎是一定会导致用户对产品的体验下降，至少是在短期内会这样。如何弥补这一点，技术上其实比较困难。比如做过滤是一种思路，那就是只在优质内容里探索。当然，有人会说，这样其实也没有多大的意义。然而，一旦把质量的闸门打开了，那就会对用户体验带来很大的影响。

这也是很多产品经理对于 EE 非常谨慎的原因，能不做就不做。而且，牺牲了用户体验后，EE 所带来的好处其实是很难评测的，这主要是由线上产品的评测机制和评测原理决定的。目前还没有比较统一的解决方案。

如何能够做到“用户友好型”的 EE 呢？这里面可以有两种思路。

思路一，不是所有人群的所有访问都适合做 R。和传统 EE 不同的是，做“反向 EE”。也就是说，我们只针对常用产品的用户做探索，而并不是针对新用户或者是还没有那么熟悉系统的人群。这个思路和 EE 完全相反，但是更加人性化。

思路二，夹带“私货”。也就是更改 EE 的算法，使得高质量的内容和低质量的内容能够相伴产生，并且高质量的内容更有几率排在前面。这样用户体验的损失是可控的。

其实，EE 和产品的结合点应该是工程和研究的重点，但遗憾的是，碍于数据和其他方面的因素，这方面的研究工作几乎没有。

小结

今天我为你讲了推荐系统的一个重要的问题，就是如何持续挖掘用户可能的喜好，也就是做 EE。

一起来回顾下要点：第一，我们讲解了什么是 EE；第二，我们介绍了 EE 的一些简要历史；第三，我们讨论了 EE 的部署难点。

最后，给你留一个思考题，EE 策略是不是一定会导致用户看到多样不同的东西呢？

欢迎你给我留言，和我一起讨论。

073 | 推荐的Exploit和Explore算法之二：UCB算法

这周，我们来讨论 EE 策略，周一介绍了 EE 的综合情况。今天来看一种最基本的思路，叫作 UCB（Upper Confidence Bound）算法。

EG 算法

在介绍 UCB 算法之前，我们先来看一种更加简单的 EE 算法，叫 EG（Epsilon-Greedy）算法。

我们先来回顾一下 EE 的主要目的。EE 的核心思想是说，我们对当前物品的估计往往是有限的、不准确的，需要不断尝试来增强对整个环境的了解，进而能够更加准确地对每个物品进行估计。

可以说，EG 算法是最简单也是最基本的 EE 算法。EG 算法的基本思路是这样的：既然我们当前对所有物品的估计是不完整的，那就可以随机地显示所有物品来获取数据。假设我们现在有一千个物品，我们对每个物品都需要估计一个数值，比如点击率。很显然，这个点击率的估计受以下两个因素的影响：已经显示了什么样的物品和显示的次数。那么，要想进一步提高这个估计值的准确度，EG 算法认为我们必须对所有物品进行“探索”（Explore）。

具体来说，EG 算法的流程是这样的：对于所有的物品，在概率 P 的情况下，按照当前的估计值来显示物品。回到刚才点击率的例子，那就是在概率 P 的情况下，谁的点击率高就显示谁。然后在概率 1-P 的情况下，随机地在所有物品中选择显示对象。如果我们从所有用户的角度来看，也就是说，P% 的用户看到的是根据点击率排序的物品，而 (1-P)% 的用户看到的是随机的物品。

EG 的想法是，虽然在最开始的时候，这种随机性可能会带来用户体验的下降，也就是那 (1-P)% 的用户会持续看到随机的内容，但是在牺牲这部分用户体验的情况下，随着时间的推移，慢慢地从整体上来看，对所有物品的估计会更加准确，P% 的那部分用户的体验会增加。这也就是一种牺牲小部分用户体验来换取大部分用户体验的思路。

UCB 算法的核心思路

我们刚才讲了 EG 算法的基本思路。很显然，EG 有一个很大的问题，那就是有一个固定百分比的用户持续看到的都是随机的内容，这就太过于局限。

那么，我们能不能根据对物品的估计，来动态地调整显示物品的可能性呢？

回到我们刚才说的物品点击率预测的例子。一般来说，我们可以根据每个物品的显示记录来预测点击率。这个数值，其实是一个估计的“均值”。然而，这个估计可能是很不准确的，或者说，估计的置信度不高。

那么，如何来衡量一个物品的置信度呢？在统计中，一个比较好的方法，就是利用“标准差”（Standard Deviation）。从感性上来理解，标准差描述了数据的离散程度，也就是说，标准差其实是量化了数据在均值周围的分布情况。标准差小说明我们对这个数值的估计比较有信心，而标准差大则说明了不确定性大。

有了标准差的思路之后，我们再回到最初的问题，怎样才能动态地调整显示物品的可能性呢？我们沿着这个思路再稍微展开一下。很显然，我们需要考虑物品的当前估计，但同时也需要考虑这个估计的置信度。这个置信度告诉我们是不是需要更多地去“探索”这个物品。那么，很自然地，我们就可以同时用均值和标准差来表达对一个物品的整体估计，然后根据这个估计来排序显示物品。因为标准差已经表达了这种不确定因素，因此，我们的结果里面，不确定性特别大的物品，会被显示到前面来。

具体来说，UCB 采用的数值是均值加上两倍的标准差来作为最终排序的实用数值。当然，不同类型的 UCB 算法在最终的数值上会有所偏差，但是大体思路基本相同。在这样的思路下，每一轮计算，我们都根据当前的数据计算出物品点击率的均值和当前的标准差，然后根据 UCB 的计算，我们再基于物品的数值，也就是刚才提到的均值加上两倍的标准差来排序。

在这样的一个机制下，经过多轮显示，当某个物品的数据越来越多的时候，标准差也会慢慢减小，最终 UCB 的数值会收敛到均值上。因此，这个算法本身其实是同时考虑了物品现在的情况以及在这种情况下的置信度，并且寄希望通过多次迭代来达到减小标准差，提高置信度的目的。

UCB 算法的讨论

UCB 的方法一经提出，因为它的简单，并且有数学基础，马上备受学术界的关注。另外从概念上来说，UCB 的确要比 EG 要好。EG 有一个固定的群体需要忍受“探索”的不确定性结果；而 UCB，这部分“牺牲”消失了。不仅如此，我们之前提到 EG 中有一个概率 P，这个参数在 UCB 中也完全消失了。这个概率 P 是一个需要调整的参数，而且没人知道这个参数该怎么设置才是最优的。而在 UCB 中，每一个物品的“随机度”是不一样的，并没有一个全局的类似 P 这样的参数。

那是不是 UCB 就没有问题了呢？

UCB 的最大问题在于其对物品打分的机制，也就是均值加上两倍的标准差。这个机制听上去很合理，但在实际中，比如一些大型网站，会有上百上千甚至几百万的物品，那么，在没有任何特殊处理的情况下，对绝大多数物品的打分数值是相同的。什么意思？比如，很多物品从来没有被显示过，估计的均值就可能是 0，或者是一个默认的初始值，在这样的情况下，物品的标准差自然也是一样的。那对于所有这些一样的物品，UCB 本身并没有设计任何机制来加以区分。

这其实说明了一个问题，UCB 算法本质上还是“确定性”（Deterministic）算法，也就是说并没有随机性。表面上通过标准差引入的不确定性其实是一种假象，这个算法从根本上还并不能真正做到随机探索。

小结

今天我们继续讨论推荐系统的一个重要问题，EE 策略。我们介绍了一个很重要的算法，UCB 算法。

一起来回顾下要点：第一，我们首先介绍了比 UCB 算法更加简单的 EG 算法；第二，我们介绍了 UCB 的核心思想；第三，我们讨论了 UCB 存在的一些问题。

最后，给你留一个思考题，如果有一大堆物品的 UCB 打分值是一样的，我们该如何解决这个问题呢？

欢迎你给我留言，和我一起讨论。

074 | 推荐的Exploit和Explore算法之三：汤普森采样算法

周三的分享里，我们讨论了一种叫作 UCB（Upper Confidence Bound）的算法。这种算法的核心是使用均值和标准差组成对物品的估计，并且利用这种估计达到 EE 的效果。同时，我们也提到，UCB 的最大问题就是并没有真正达到随机的效果。

今天，我们来看一种不太一样的算法，叫“汤普森采样”（Thompson Sampling）。

为什么需要随机采样？

在讨论汤普森采样之前，我们先来看一看什么是随机采样。随机采样的技术和概率分布密不可分，也和计算机产生随机数有很大的联系。

我们这里主要是关心如何从一个概率分布中产生一个随机变量的样本。因为是随机变量的样本，因此不可能每一次产生的结果都一样。然而，对于大量的样本来说，其均值往往是对概率分布均值的一个比较好的估计。因此，样本其实可以用来刻画一个概率分布。

比如，我们用参数是 0.5 的伯努利分布来表达抛硬币这个事件。那么，从这个伯努利分布中产生的样本，也就是 0 和 1，象征了硬币是正面还是反面这两个事件。很显然，因为是随机样本，所以如果我们的抽样次数足够多，每个事件发生的概率会趋向于 0.5。

然而，有一点需要注意，并不是所有的分布都能够这样容易地抽取样本。实际上，即便是伯努利分布，也是因为有一定的程序，才能够确定从中抽样。而能够抽样的，往往是标准的分布，诸如伯努利分布、高斯分布或者其他简单分布。从抽样的角度来说，对于绝大多数的模型，从中抽取样本都不是一件完全直观自然的事情。

回到我们讨论的场景。在进行 EE 策略中，为什么需要引入随机采样呢？

我们之前介绍过 EG 算法。EG 算法在实施过程中，P% 的人群看到按照点击率排序的物品。这一部分，是没有随机性的。也就是说这些人会“确定性”地看见按照点击率排序的物品，每一次都会看见一模一样的东西。而在 (1-P)% 的人群中，每一次看到的又完全是随机的内容，一点都没有规律。很明显，EG 算法的缺点是，有一部分过于确定，而有一部分过于随机。

再来说一说我们上一次分享的 UCB 算法。这个算法最大的问题在于它是一个“确定”的算法。也就是说，在参数已经确定了的情况下，UCB 展示给用户看的内容也是一样的。

这里面的一个核心问题是，如果展示给用户的内容是一样的，也就是我们说的确定性算法，那么，也就丧失了“探索”（Explore）的机会。试想，一个用户在同一天内访问一个网站多次，看到的结果都是一样的，而用户一定不希望每次访问都看到同样的内容。这对于用户体验来说很不友好。

那怎么才能带来随机性呢？

我们刚才谈了抛硬币的例子，很显然，如果能够通过采样来对物品进行排序或者展示，那就能够解决随机性的问题，也就能够每次都给用户不一样的体验。

汤普森采样基本原理

有了希望通过采样来获得结果这个思路以后，下面的事情就变得慢慢清晰起来。

首先，我们提到了，采样需要对应的概率分布。因此，第一步就是要构建场景的概率分布，来描绘我们的应用。

回到物品点击率的场景下，和抛硬币类似，物品的点击其实可以用伯努利分布来进行建模。这里需要注意的是，我们究竟应该从什么分布中去采样呢？汤普森采样的原理是，从模型的后验分布中去采样。什么意思？这其实是借用了贝叶斯统计的思路，也就是说，我们希望对参数的后验概率分布进行建模。关于贝叶斯统计的思路，这里限于篇幅不做展开。大体上来说，后验概率分布是在已经有了数据的情况下，结合我们的先验概率，对参数的一种估计。

再回到用伯努利分布来对点击进行建模的例子中，如果我们希望得到后验概率分布，需要设置怎样的先验概率分布呢？如果我们希望后验概率分布是一个相对比较简单的分布，那我们可以设置所谓的“共轭先验”（Conjugate Prior）。对于伯努利分布来说，共轭先验就是Beta 分布。在设置了 Beta 分布这个先验之后，我们其实就可以解析得到后验概率的分布，也是一个 Beta 分布，只不过后验概率分布的参数与先验的参数不同。

在构造好后验概率分布之后，我们就可以选择从中进行抽样了。注意，在当前的情况下，已经不是从伯努利分布中抽样，而是从 Beta 分布中抽样了。关于如何从 Beta 分布中抽样，这不在今天讨论的范畴。很多通用的数值计算库，比如 MATLAB、NumPy 等都有这方面的过程可以直接使用。

汤普森采样的流程是这样的，从后验分布中抽取一个参数的样本，然后选取所有物品中参数数值最大的那个，进行展示。

我们来分析一下汤普森采样的整体情况。

每一轮，汤普森采样都有一个参数采样的动作。这个流程决定了汤普森采样本质上是一个随机的流程，不是一个确定的流程。

汤普森是从后验概率分布中进行抽样的。这有什么好处呢？后验概率分布中抽样，当样本数足够大的时候，样本的均值也是趋近于分布的均值的。什么意思？如果某一个物品的点击率高，那么其后验概率的均值也就大，反复从中抽样，平均下来，基本上还是在这个点击率的数值范围周边，不会偏离很远。也就是说，我们从后验概率分布中抽样的结果，当样本比较多的时候，是会尊重点击率的数值大小的。这其实就是 EG 中 P% 的用户，以及 UCB 中为什么要使用均值这些步骤的核心所在。我们并不希望让物品最后显示的结果与真正的估计值偏离太远。

汤普森采样因为使用了贝叶斯统计，我们对参数有先验的设置，因此针对当前点击率估计还不准确甚至还没有数据的物品来说，有天然的优势。

因为是采样，即便是在参数一样的情况下，两个物品的采样数值都有很大可能是不一样的，一举解决了我们之前提到的 UCB 的问题。

小结

今天我为你介绍了一个很重要的算法叫作汤普森采样，可以解决 UCB 的“确定性”问题，真正实现随机的效果。结束了我们今天的分享，EE 这个话题也就告一段落了。

一起来回顾下要点：第一，我们聊了聊为什么需要引入采样的机制；第二，我们介绍了汤普森采样的基本原理。

最后，给你留一个思考题，汤普森采样有没有什么问题，或者说有没有什么劣势呢？

欢迎你给我留言，和我一起讨论。

075 | 推荐系统评测之一：传统线下评测

上周我们讨论了 EE 算法，介绍了 UCB（Upper Confidence Bound）算法和“汤普森采样”（Thompson Sampling）。

这周，我们回归到一个更加传统的话题，那就是如何评测推荐系统。这个话题非常重要，牵涉到如何持续对一个推荐系统进行评价，从而能够提高推荐系统的精度。

今天，我们先来看一看推荐系统的线下评测。

基于评分的线下评测

在过去 10 年里，随着 Netflix 大奖赛的举行，很多研究人员和工程人员往往把推荐系统的模型学习简化为对用户评分的一种估计。同时，在模型上面来说，对用户物品评分矩阵进行分解成为了一种主流的方法。

在这样的场景下，如何对模型进行评测呢？

一种简单且直观的办法，就是衡量评分的准确性，换句话说，也就是看我们预测的评分和真实评分之间有多大的差距。

那么，有哪些方法可以用来衡量两个数值之间的差异呢？

在机器学习中，一个经常使用的测度叫“均方差”（Mean Square Error），或MSE。有时候，我们也会使用它的根号后的结果，叫作“方差”（Rooted Mean Square Error），或RMSE。

MSE 是这么定义的。首先，如果我们知道一个用户 i 和物品 j 的真实评分，假设叫 YijYij ，那么我们的一个估计值是 ZijZij，MSE 计算的就是 YijYij 和 ZijZij 的差值，然后取平方。平方以后的结果肯定是一个正数，也就是说这样做的好处是整个计算不会出现负数，我们的估计值比真实值小了或者大了，MSE 都可以处理。当我们对于每一个用户和物品都计算了这个差值以后，再对所有的差值的平方取一个平均值，就得到了我们所要的 MSE。

从计算上来讲，RMSE 就是在 MSE 的基础上再取一个根号。我们在很多实际应用中，往往使用 RMSE 来汇报模型的评测结果。同时，RMSE 也经常用在大多数的学术论文中，但这个评测有没有什么问题呢？

答案是，RMSE 其实存在很多问题。

首先，我们从刚才描述的计算过程中就可以看到，RMSE 需要取一个平均值。这是对所有用户在所有物品上评分误差的估计的平均。那么，如果一个用户在数据集里面对很多物品进行了评分，这个用户误差的贡献就会在最后的平均值里占很大一部分。也就是说，最后的差值大部分都用于描述这些评分比较多的用户了。

上述情况存在一个弊端，如果我们得到了一个比较好的 RMSE 数值，往往很可能是牺牲了大部分用户的评分结果，而对于少部分的高频用户的评分结果有提高。说得更加直白一些，那就是 RMSE 小的模型，并不代表整个推荐系统的质量得到了提高。这是 RMSE 很容易带来困惑的地方。

RMSE 的另外一个问题就是，这个指标并没有反应真实的应用场景。什么意思呢？真实的应用场景，我们往往是从一大堆物品中，选择出一个物品，然后进行交互。在这样的流程下，物品单独的评分其实并不是最重要的。更进一步说，就算一个推荐系统能够比较准确地预测评分，也不能证明这个推荐系统能够在真实的场景中表现优异。

基于排序的线下评测

当研究人员意识到 RMSE 的问题后，不少人就开始回归到问题的本质，究竟什么样的评测更能反应推荐系统在真实场景中的表现呢？

很多人很自然地就想到了搜索。

我们来回忆一下，搜索的结果是根据某个查询关键字，然后搜索引擎返回一系列文档结果。在这样的场景中，如果我们来和推荐进行对比，就会发现，这里面最大的区别仅仅是有没有一个查询关键词。

所以，我们其实可以把搜索的一些指标“移植”到推荐中来使用。比如，我们在搜索中讲过的基于二元相关度的指标。下面简单回顾一下这个指标。

什么叫“二元相关度”呢？简单说来，就是指针对某一个查询关键字而言，整个测试集里的每一个文档都有一个要么“相关”，要么“不相关”的标签。在这样的情况下，不存在百分比的相关度。而每个文档针对不同的关键字，有不同的相关信息。假定某个系统针对某个关键字，从测试数据集中提取一定量的文档而不是返回所有文档，我们就可以根据这个提取的文档子集来定义一系列的指标。

有两个定义在“二元相关度”上的指标，成为了很多其他重要指标的基石。一个叫“精度”（Precision），也就是说，在提取了的文档中，究竟有多少是相关的。另一个叫“召回”（Recall），也就是说， 在所有相关的文档中，有多少是提取出来了的。

“精度”和“召回”的相同点在于，分子都是“既被提取出来又相关的文档数目”。这两个指标的不同之处则是他们的分母。“精度”的分母是所有提取了的文档数目，而“召回”的分母则是所有相关的文档数目。如果我们返回所有的文档，“精度”和“召回”都将成为 1（也就是说，在这样的情况下是没有意义的）。因此，我们注意到，这两个指标其实都假定，提取的文档数目相比于全集而言是相对比较小的子集。

我们其实就可以利用“精度”和“召回”来评测推荐系统。

然而，这有一个问题，那就是对于搜索而言，相关度大多数时候是通过人工标注的，但这个对于推荐系统来说是不可能的。因为推荐的结果对于每个人来说都是不一样的，所以，没法针对所有人来进行统一的人工标注。

一种折中的办法，就是使用用户的回馈信息。在这里，因为我们需要二元信息，所以可以使用像用户的点击信息或者购买信息来作为二元的相关度。也就是说，如果用户点击了某个物品，那我们就认为是相关的，反之则是不相关。

顺着这个思路下去，其实我们就可以计算类似于NDCG等更加复杂的指标，只不过我们需要自己去定义相关信息。

利用排序的思路来评测推荐系统，已经成为了目前推荐系统线下评测的一个标准指标。

小结

今天我为你讲了如何评测推荐系统的好坏，今天的重点是线下评测的两类指标。

一起来回顾下要点：第一，我们聊了聊非常通用的 RMSE 的评测方法，并且指出这类方法的缺陷；第二，我们介绍了怎么把搜索里的评测方法给移植到推荐中。

最后，给你留一个思考题，基于排序的评测有什么致命的问题吗？

欢迎你给我留言，和我一起讨论。

076 | 推荐系统评测之二：线上评测

周一，我们聊了推荐系统的线下评测。线下评测是任何系统能够不断演化的最直接的要求。在线下的环境中，我们能够开发出系统的种种改进，并且希望能够通过这些线下评测的手段来选择下一个更好的版本。

今天，我们来讨论推荐系统的线上评测。任何系统在开发之后最终都要放到线上拿给用户使用。那么，在线上评测的时候需要注意什么呢？

线上评测的基础

推荐系统线上评测的基础和我们之前讲过的搜索系统有很多类似的地方。

线上评测的核心就是在线可控实验，有时候又称作是在线实验，或者叫作在线 A/B 实验。我们希望能够利用在线实验来对推荐系统的某一个部分进行检验，看是否对用户和系统的交互产生影响。

在线可控实验其实是建立“因果联系”（Causal Relationship）的重要工具，也可以说是唯一完全可靠的工具。这里面的基础是统计的假设检验。

具体来说，就是我们针对访问网站或者应用的人群，进行某种划分，一般情况下是平均随机划分。50% 的用户进入被划定的一个群组，叫作“控制组”（Control Bucket），而另外 50% 的用户进入另一个群组，叫作“对照组”（Treatment Bucket）。“控制组”和“对照组”的唯一区别在于所面对的系统。

假设我们有一个推荐系统，想对其中的某个部分进行改进。那么，可以保持住其他的部分，让这个希望得到改进的部分成为唯一的“独立变量”（Independent Variable），也就是在整个实验设置中的变量。这样，我们就希望通过在线实验以及假设检验的工具，来认定这个“独立变量”是否会带来系统性能上的提高或是降低。

这里面还有一个需要提前确定的，就是需要评测的指标，特别是用户指标，比如网站的点击率、搜索的数量等。这些指标我们称之为“依赖变量”（Dependent Variable）。说白了，我们就是希望能够在“独立变量”和“依赖变量”之间通过假设检验建立联系。今天在这里，我们就不重复假设检验的基础知识了，如果有兴趣深入了解，可以参考任意一本基础的统计教程。

对于在线可控实验，在概念上很容易理解，但在现实操作中有很多挑战。

首先，我们可以想一想，虽然理想状态下，我们可以把用户五五平分，进入“控制组”和“对照组”。然而，现实中，经过随机算法分流的用户群，在这两个群组中很可能并不呈现完全一样的状态。什么意思呢？举个通俗的例子，相比于“对照组”而言，“控制组”中可能存在更多的女性用户；或者是“对照组”中，可能存在更多来自北京的用户。

而在这样的情况下，“依赖变量”，比如网站点击率，在“控制组”和“对照组”的差别，就很难完全解释为“独立变量”之间的差别。也就是说，如果“控制组”下的点击率比“对照组”高，是因为我们更改系统的某部分的差别呢？还是因为这多出来的女性用户呢？还是女性用户和系统某些部分的交互产生一定复杂的综合结果导致的呢？这就比较难说清楚了。

当然，在现实中，如果说我们依然可以比较容易地通过算法来控制一两个额外的变量，使得在“控制组”和“对照组”里面这些变量的分布相当，那么，面对十几种重要变量（例如，年龄、性别、地域、收入层级等），要想完全做到两边的分布相当，难度很大。

另外一个难点是，即便能够做到对已知的变量通过随机算法，使得在两个群组中的分布相当，我们依然不能对当前还未知的变量进行上述操作。因此，现实中因为人群特性所带来的对结论的影响，是在线实验的难点之一。

在线实验的难点之二是，即便刨除刚才所提到的人群的差异以外，我们可能也很难在设想中的某个系统“控制组”和“对照组”中，确定唯一的“独立变量”。

在现代网站或者应用中，有很多服务、子系统、页面、模块在同时为整个网站服务。而这些服务、子系统、页面和模块，还有不同的前端系统和后端系统，很可能属于不同的产品以及工程团队。每个部分都希望能够做自己的可控实验，都希望自己改进的部分是唯一变化的“独立变量”。然而，我们从宏观的角度去看，如果每个部分都在做自己的实验，而我们做实验的基本单元依旧是每个用户的话，那这就很难保证用户之间的可比较性。

举个例子，如果用户 U₁，进入了首页的“控制组”，然后访问了购物篮推荐模块的“对照组”后离开了网站。而用户 U₂，直接访问了帮助页面的“对照组”，然后访问了购物篮推荐模块的“控制组”。那 U₁和 U₂两个用户最终产生的点击率的差别，就很难从他们访问网站页面的过程中得出结论。即便是在有大量数据的情况下，我们也很难真正去平衡用户在所有这些页面组别之间的关系。

实际上，如何能够有效地进行在线实验，包括实验设计、实验的评测等，都是非常前沿的研究课题。

推荐系统线上评测

在上次的分享中，我讲了过去比较流行的推荐系统线下评测的方法，比如利用 MSE 以及在此之上衍生出的 RMSE。然后，我又讲了如何从排序的角度来对一个推荐系统进行衡量。

到线上评测以后，很明显，RMSE 以及排序的一些相关指标，都不能完全反映用户是否对一个推荐系统产生好感。我这里讲几个通用的指标。

第一，用户的驻留或者停留时间（Dwell Time）。这个指标主要是衡量用户在某一个物品上的停留时间。用户总的停留时间往往和用户对网站的黏稠度有很强的关系。总体说来，如果用户会长期反复访问网站，用户在网站平均驻留时间往往是比较多的。

第二，用户在相邻两次访问中的间隔时间，有时叫作“空缺时间”（Absence Time）。这个指标是越短越好。当用户反复访问你的网站，并且空缺时间越来越短，证明用户越来越依赖你网站提供的服务。

停留时间和空缺时间都是很好的推荐系统线上评测的指标。

小结

今天我为你讲了推荐系统评测的线上评测。

一起来回顾下要点：第一，我们聊了聊推荐系统的在线实验；第二，我们介绍了几个推荐系统线上评测的通用指标。

最后，给你留一个思考题，如何知道用户对于推荐的内容已经越来越不满意了呢？

欢迎你给我留言，和我一起讨论。

077 | 推荐系统评测之三：无偏差估计

周三，我讲了推荐系统的线上评测，我们讨论了如何做在线评测，以及推荐系统在线评测可能遇到的一系列问题。

今天，我们来看一个比较高级的话题，那就是如何做到推荐系统的无偏差估计。

推荐系统的偏差性

在理解为什么需要无偏差估计之前，我们先来看一看现在系统为什么会存在偏差性，以及这种偏差性会对推荐系统的学习造成什么样的影响。

先假定我们讨论的是一个新闻推荐系统。为了方便，假设我们的系统中仅有两类文章，体育新闻和财经新闻。我们先来看一个极端情况，假设系统因为种种原因，只给用户推荐体育新闻，会出现什么样的情况呢？

很明显，如果我们只给用户看体育新闻，那么，用户只可能在这些体育新闻里面选择点击，压根不知道财经新闻的存在。因为用户只在体育新闻里面通过点击浏览表达了喜好，任何一个机器学习系统，只能在这些新闻里面学习到用户的喜好。

具体来说，用户已点击的新闻可以认为是正例，没有点击的可以认为是负例。这样可以对用户在体育新闻上面的喜好加以建模。但是很明显，系统在用户对财经新闻喜好的学习上是一筹莫展的，因为我们根本没有任何用户对于财经新闻的回馈数据。

这就是系统的偏差性。在这样的设置下，系统存在的偏差是无法修正的。通俗地讲，我们压根没有给财经新闻任何机会，所以没有数据可以供系统学习。

其实还有更加严重的情况。因为我们当前的系统仅仅学习到了用户对于体育新闻的喜好，然后如果把这个系统部署到生产中，系统又会进一步选择体育新闻给用户看，如此循环下去。这其实就是说，系统的偏差性会随着机器学习系统而反复循环，甚至有逐渐放大的可能性。

当然在现实的应用中，我们不可能有这么极端的情况。但可能面临更加复杂的情况，比如，我们压根不知道系统存在什么样的偏差，或者说，我们该如何面对各种不同的偏差。

在有偏差的系统中，先通过数据学习得到模型，然后再部署到系统中去，这个流程其实严重阻碍了我们对用户真实喜好的检测。因此，这也是线下表现和线上表现不一致的一个原因。长期以来，偏差性都是困扰研究者的一个非常重要的问题。

无偏差估计

当我们知道系统有偏差以后，怎么来解决这个问题呢？

一个很容易想到的策略是，如果我们知道系统的某种偏差，那能不能在后面的评测过程中矫正这种偏差呢？

这就涉及“矫正”的思路。回到我们所说的体育新闻和财经新闻的例子。假设我们的系统在 80% 的情况下会显示体育新闻，20% 的情况下显示财经新闻。那么，当用户面对一篇体育新闻点击浏览，或者面对一篇财经新闻点击浏览，我们的系统该如何应对呢？

在我们已经提到过的传统评测手段中，例如计算 MAP 或者 NDCG 的时候，这两种点击是一样的。或者说，权重是一样的。然而，在这样的情况下，机器学习系统其实还是会更加偏重于学习到用户对于体育新闻的偏好，因为毕竟 80% 的情况下都是体育新闻。相对于财经新闻而言，这种情况就是处于劣势的，可能我们没有给财经新闻足够的机会。

所以，从矫正的角度来说，我们认为如果用户点击浏览了原本出现概率较低的文章，这个时候，我们反要给这类文章更大的权重。什么意思呢？也就是说，我们认为财经新闻出现的概率比较低，如果在这种情况下，用户点击浏览了财经新闻，那应该是真正的偏好。而相同的情况下，因为 80% 的新闻都是体育新闻，因此用户点击了其中的一篇也就不足为奇。

把这种思维放入到一种数学的表达中，也就是，我们希望用户的回馈按照出现的概率进行反比矫正，出现概率越大的物品，正样本权重越小；反之，出现概率越小的物品，正样本权重越大。具体来说，也就是正样本除以出现的概率，然后我们计算平均的加权点击率。这样加权平均后的结果，就是矫正后无偏差的点击率的计算结果。

很明显，无偏差估计是有一定假设的。首先，我们就需要假设收集的数据涵盖了整个数据集。什么意思？就是刚才我们说的极端情况，比如我们只显示体育新闻而压根一点都不显示财经新闻，这种情况是无法进行矫正的，因为在这种情况下，财经新闻的概率是 0。也就是说，无论什么类别的新闻，都需要有非零的概率出现。这是进行无偏差估计的一个基本假设和要求。

遗憾的是，虽然这个要求看似容易，但其实在现实中很难真正做到。

试想一个有百万文章量的新闻网站，要确保所有的新闻都有一定概率显示给用户是有挑战的。在实际的应用中，大量的新闻质量是呈指数下降的。也就是说，虽然有百万甚至更多的文章量，但是很有可能只有几百几千的文章相对比较有质量，而剩下的大量文章是低质量的文章。

然而，我们并不能完全确定哪些是低质量文章。如果我们真的需要做无偏差的估计，就需要针对所有的文章进行显示，也就是说，我们需要冒着给用户显示低质量文章的风险，显然这并不是很好的策略。

在如何收集数据这一方面，无偏差估计其实和我们之前提到过的 EE 策略又结合在了一起。也就是说，如何既能够让我们尽可能地把所有数据都呈现给用户，使得我们可以进行无偏差估计，又能够照顾到用户的体验，这是目前非常热门的研究领域。

小结

今天我为你重点讲了什么是系统的偏差以及如何处理偏差的思路。

一起来回顾下要点：第一，我们聊了聊在线系统的偏差出现的场景以及机器学习为什么会让这样的情况恶化；第二，我介绍了如何进行无偏差估计以及无偏差估计所需的条件。

最后，给你留一个思考题，假如一个系统，你不知道每一种新闻出现的概率，你该如何做无偏差估计呢？

欢迎你给我留言，和我一起讨论。

078 | 现代推荐架构剖析之一：基于线下离线计算的推荐架构

上周，我们讨论了推荐系统的评测，聊了推荐系统的线下评测、线上评测和无偏差估计。至此，我们已经聊了推荐系统的一些基本技术和评测体系，相信你已对推荐系统有了一个基本的认识。

那么，到底该如何搭建一个工业级的推荐系统呢？这周，我们就来谈一谈现代推荐系统的架构体系，帮助你从宏观上对推荐系统的构建有一个更加完整的认识。

今天，我们先来看一看，基于线下离线计算的推荐架构。

推荐架构需要解决的问题

在讨论任何一种架构之前，我们首先来看一下这个架构需要解决什么样的问题。然后在这些问题的指引下，我们就可以来分析不同架构在解决这些问题上的优劣。

那么，对于一个推荐架构来说，我们需要解决什么样的问题呢？

首先，从大的角度来说，一个用户来到我们的网站或者服务，推荐系统最重要的一个任务就是，能够在一两百毫秒内给用户提供当前的推荐结果。也就是说，从用户的角度来看，推荐结果的呈现必须是实时的。这一条就是把工业级应用和学术模型区分开的一个重要指标。

在过去十多年里，学术界的推荐系统，或者是 Kaggle 竞赛的推荐系统，往往是一个使用了很多不同模型的集成模型（Ensemble Model），这种方式虽然在比赛和论文发表中能够取得较高的精度，但是在现实的系统中，如果不加修改直接使用，必然无法在规定的时间内，也就是一两百毫秒内产生所有的推荐结果。同样的，很多非常复杂的深度学习模型，也无法在规定的时间内产生所有的推荐结果。由此可见，很多推荐架构的核心就是在解决这些问题。

其次，推荐系统架构需要对用户和系统的交互结果做出响应。什么意思呢？如果用户看了推荐结果，并且点击了一些推荐结果，或者明确表达了对推荐结果的不喜爱，那么推荐模块需要对这些互动的结果给予回馈。试想，如果一个用户已经明确表示了对某些结果的不喜欢，然后在下一次访问的时候，用户又看到同样的推荐，那一定是一个非常不好的体验。

最后，推荐系统架构需要考虑用户群体的覆盖率的问题。如果一个系统架构只能为部分用户服务，这想必无法真正做到对一个网站或者服务产生影响力。因此，在模型以及其他的技术选择上面，如何能够做到“为更广阔的用户群体服务”，就是一个非常关键的因素。

基于线下离线计算的架构

刚才我们简单讨论了一个现代推荐系统架构需要满足的一些需求。那么，在这些需求的驱动下，一种简单易行的架构就诞生了，那就是“基于线下离线计算的架构”。

什么叫基于线下离线计算的架构呢？

试想一下，我们有一个推荐模块，是在一个网站首页为用户推荐新闻。现在假设，我们有 M 个用户，N 个新闻文章。M 的数量级可能是几千万，N 的数量级可能是几百万。那么，理想状态下，需要用我们的模型，对每一个用户，以及每一个新闻进行打分。具体地，对于某一个用户来说，当这个用户访问网站的那一瞬间，我们需要对几百万的新闻进行打分，并且在一两百毫秒内返回结果，这很有可能是不现实的。

既然我们无法实时对所有的新闻打分，那么，退一步讲，我们能不能事先把这些打分的工作都做了，然后当用户来到网站的时候，我们仅仅是显示结果呢？答案是，可以的，并且这就是线下离线计算的核心思想。

通俗地说，线下离线计算的一个主要想法就是：把计算中复杂的步骤尽量提前做好，然后当用户来到网站需要呈现结果的时候，我们要么已经完成了所有的计算，要么还剩非常少的步骤，可以在很快的时间内，也就是所说的一两百毫秒内完成剩下的计算。

回到我们刚才的新闻推荐的例子。我们可以把针对每一个用户的所有新闻的打分，在线下都提前计算好，然后存放在一个数据库或者数据存储的地方，当用户来到网站的时候，我们只需要展示已经完全计算好的推荐结果。

完全线下离线计算的最大好处就是，当用户来临的时候，基本没有任何的计算成本。系统唯一需要做的就是从一个数据存储的地方直接取得当前的推荐结果。

也就是说，线下离线计算的最大好处，就是解决我们刚才说的在规定的时间内计算出推荐结果的需求。然而，线下离线计算对其他两个需求则无法很好地处理。

第一，因为我们是完全提前计算好了所有的结果，并且存储在数据库中。那么，假设用户和推荐结果进行了交互，希望更新推荐结果，离线计算的模式就无法支持这样的操作，或者是非常困难。

我们可以试想一下，如果一个用户不喜欢某一个新闻推荐结果，那么在当前的框架下，我们应该如何应对呢？首先，我们需要启用线下的计算流程，重新计算这个用户所有的推荐结果，然后把这个推荐结果存储到刚才说的数据库里，这样用户下一次来到网站的时候，就会看到更新的结果了。

因为刚才我们已经假设模型的复杂度导致无法很快地进行运算，因此，这个更新的流程可能会比较耗时。同时，这只是一个用户的情况，如果我们要针对大量用户进行这样的处理，那最省力的就是隔一段时间，比如说几个小时就针对那些和系统有交互的用户重新计算一次结果，然后再把更新的结果存入数据库。很明显，在这几个小时的间隙里，用户看到的依然是旧的推荐结果。

第二，完全提前计算好所有结果的情况下，针对新的用户，新的新闻文章就无法进行推荐了。针对这些新用户和新文章来说，完全离线计算这种架构就有一个致命的缺陷。当然，我们也可以依照刚才的思路，也就是说隔一段时间，比如几个小时，就针对当前所有用户和所有新闻，重新计算结果，然后把结果存放到数据库中，但是很明显，这也会导致在这个间歇期内，我们无法对新用户和新文章进行推荐。

完全离线计算的推荐架构适用于一些简单的场景和一些应用的初期架构。很明显，在复杂的网站需求下，单靠提前把所有结果都计算好是不能满足动态的用户需求的。

然而，理解离线计算的需求对于构建复杂架构很有帮助。我们在设计一个更加复杂的架构时，依然会依靠很多离线计算，用线下时间来换取线上时间。这个思路是现代推荐系统架构中非常重要的一个想法。

小结

今天我为你讲了一种简单的现代推荐系统的构建思路，那就是基于线下离线计算的推荐架构。

一起来回顾下要点：第一，我们聊了聊推荐架构的需求；第二，我们介绍了什么是离线计算架构，以及这种架构的优缺点是什么。

最后，给你留一个思考题，如果我们的用户数量和物品数量实在是太大，线下计算无法满足每天全部更新一次推荐，这种情况下，我们又该怎么办呢？

欢迎你给我留言，和我一起讨论。

079 | 现代推荐架构剖析之二：基于多层搜索架构的推荐系统

周一，我们讨论了基于线下离线计算的推荐架构，这也是最简单的一种推荐架构。我们了解了这种架构的优劣势，以及能够做的一些方案。

今天，我们来看另外一种也很常见的推荐系统架构，那就是基于多层搜索架构的推荐系统。

推荐架构需要解决的问题

周一我们详细讨论了推荐架构需要解决的问题，今天做一个简单的回顾。

推荐系统解决三个需求。

第一，推荐系统架构能够在一两百毫秒内给用户提供当前的推荐结果，即实时呈现推荐结果。

第二，推荐系统架构需要对用户和系统的交互结果做出响应。

第三，推荐系统架构需要考虑用户群体的覆盖率问题。

我们周一次讲到的基于离线计算的推荐架构，可以很好地解决第一个问题。解决思路就是先计算好所有的结果，然后存在某种存储空间里，当用户来到网站的时候，再直接显示事先已经计算好的结果。然而，这样的架构在第二和第三个需求面前，就显得有些捉襟见肘了。

基于多层搜索架构的推荐系统

我们前面在介绍搜索系统的时候，多次提到了多层搜索架构。一起来回顾一下这种架构。

首先，我们有一个索引，能够根据某些特性（比如关键字）来把所有的文档存储到里面，方便随时检索。

第一层或者叫第一轮打分，是发生在索引这个层面，我们通过一些简单的流程或者函数，往往是线性函数或者布尔值函数，来获取最相关的几百最多几千个文档。

紧接着，第二层或者叫第二轮打分，就是一个重排序的过程。这个时候，我们往往只需要针对几百个文档进行打分，所以可以使用相对比较复杂的函数，比如基于决策树的模型或者深度模型，以得到最终的结果。

有些时候，在第二轮打分之后，还有后面的轮数，主要是针对一些不同的商业规则，比如结果的多样性等等。

多层搜索架构可以支持搜索结果，自然地，对第一个需求，也就是在规定的时间内返回结果，有很好的支持。在搜索里面，用户输入查询关键词以后，大多数情况都希望能够快速得到结果。一般来说，我们把在所有文档里查找相关信息分解为两个步骤，先查找一个大概相关的集合，然后再在这个集合里进行重排序。特别是第一个步骤，往往是在索引上并行进行的，因此速度也相对比较快。

那么，多层搜索架构如何来解决第二和第三个需求呢？

我们先来看第二个需求，也就是说如何针对用户的反馈对结果进行更新。所谓进行更新，其实就是说，给用户的推荐结果，需要有一些不一样的地方。但是，如果我们仔细想一下这个需求，就会发现，第二个需求的核心是需要对用户的反馈进行更新，但也不能走向另外一个极端，那就是用户点击或者浏览了一两个物品后，整个推荐结果就全部发生了改变。因此，如果我们在这种需要变化但又不是大变的假设之下，多层搜索架构就能相对容易地解决这个问题。

例如，我们可以根据索引返回用户可能喜欢的一千个物品。假定用户的喜好不会在每一天内发生巨大变化。这个索引本身可以每天更新，但不需要更新得特别频繁。因为用户点击了一些物品，之后需要产生的更新变化，我们可以寄希望在重排序这个环节发生。也就是说，我们在每一天中，从索引中提取出来的内容都可以是一模一样的，但是我们可以根据重排序的部分产生不一样的结果，这样也就满足了用户的需求。

具体来说，在重排序的阶段，有两种方法可以根据用户的反馈进行更新。

一种方法，就是更新重排序阶段的模型。如果重排序阶段是一个决策树模型，那我们就对这个决策树进行重新训练。这里主要取决于重排序阶段是一个什么样的模型。如果这个模型需要所有用户的信息，那重新训练的计算量，无疑是非常大的，而且往往还无法在线完成。在这样的情况下，重新训练可能并不是最优的解决方案。

另外一种方法，就是更新重排序的模型的某些特性。如果重排序模型使用了一些特性，其中包含记录了用户的一些行为。那么，我们其实可以在不更改模型的情况下，通过更新特性的数值来达到更新结果的目的。比如，可能有这么一个特性，记录用户在某个物品上点击了多少次，那么我们单单刷新这个特性的数值就可以了。

对于第三个需求，也就是说如何针对新用户和新物品进行支持。可以说，搜索架构对于新用户是天然支持的。因为索引里面是物品，而并不是特定的用户信息，所以新老用户对于这个以索引为基础的架构来说是一样的。不太相同的自然是新老用户的特性值是不一样的，因此取决于重排序的模型，很有可能是针对老用户有比较强的效果，而针对新用户则可能会有一些捉襟见肘。

相对来说，搜索架构的短板在于对新物品的支持。因为整个索引机制是基于物品的，因此当我们已经建立了一个当前的索引后，新的物品不在索引里面，因而无法在提取阶段被取出来。一个比较直接的方法自然是重新建立索引，然而如果我们有上百万的物品，重建索引并不是一个简单容易的步骤。关于如何支持这样一个功能，我们留到下一次分享中探讨。

小结

今天我为你讲了基于多层搜索架构的推荐系统。

一起来回顾下要点：第一，我们回顾了推荐架构的需求；第二，我们介绍了什么是多层搜索架构，以及这个架构是如何利用到推荐场景的，同时还聊了聊这种架构的优缺点是什么。

最后，给你留一个思考题，我们谈到了用索引来帮助推荐系统的构建，那么在搜索里面索引可以根据关键字来建立，在推荐系统中，我们怎么构建索引呢？

欢迎你给我留言，和我一起讨论。

080 | 现代推荐架构剖析之三：复杂现代推荐架构漫谈

本周我们讨论现代推荐系统的架构体系。周一我们看了最简单的基于线下离线计算的推荐架构，周三我们聊了基于多层搜索架构的推荐系统。

今天，我们来谈一谈如何从这两种架构的思路出发，来满足更加复杂多变的实际情况。

推荐架构需要解决的问题

这周我反复强调推荐系统的几个基本需求点。第一，能够在一两百毫秒内给用户提供当前的推荐结果；第二，需要对用户和系统的交互结果做出响应；第三，需要考虑用户群体的覆盖率问题。

接下来我们就聊一些经常考虑的场景，起到一个抛砖引玉的作用，供你参考。

新用户的问题

如果你要搭建的系统面临的情况是新用户多，比如一个新上线的快速增长的产品，那么我们需要怎么考虑架构呢？

这里面有两个基本思路。第一，我们要更加快速地抓住这些新用户和系统的交互信息，从而更好地为他们推荐信息。第二，在我们还没有足够多的信息的时候，如何为这些用户提供推荐结果。

我们先从第一点说起，如果希望能够更加快速地抓住用户的交互信息，从而很好地为他们推荐内容，有两种做法：要么能够快速更新模型从而更新推荐结果，要么快速更新特性从而更新推荐结果。

如果我们整个产品只有一个全局的排序模型的话，不管是基于线下的静态架构还是基于搜索的架构，基本上都不可能很快地去更新这个全局模型。因此，在这种情况下就需要去思考如何更新特性。

对于搜索的框架，也许我们可以通过更新特性，从而达到在重排序的这个阶段，因特性改变而带来不同的结果。但是对于线下的静态架构，因为所有推荐结果都是事先处理好的，因此改变特性也不能改变结果，除非针对这个用户，对所有的推荐结果重新进行线下计算。这样做是可行的，但是计算成本还是相对比较高。因此，综合来看，如果在新用户比较多的情况下，并且我们还希望抓住用户的交互，静态架构可能就会显得有一些心有余而力不足了。

第二点则是新用户的交互信息一开始会比较少，如何处理冷启动呢？我们前面提到过，其实冷启动可以利用一些用户的其他信息，比如年龄、性别、地理信息来产生推荐结果。我们可以为用户显示当前比较流行的在某个年龄段、某个性别、某个地理区域的信息。

一个简单的思路是，这些年龄、性别、地域的信息，可以每个小时或者每天更新一次，单独存放在一个数据库里。当用户来网站的时候，我们可以尝试从搜索的架构里提取信息，也从这个单独的数据库里提取信息，然后在这个基础上进行全部重新排序。这样我们就能够保证架构的统一性，同时也解决了冷启动的问题。

新物品的问题

和大量新用户问题不同的是，大量新物品的问题则更加棘手一些。

在静态框架下，新物品意味着对于所有的用户，我们之前都没有考虑过这些物品，因此如果不进行特殊处理，我们是绝对没法把这些物品展示给用户看的。

这里有两种思路。一种思路，就是把新物品加入到内容池里，对于所有用户，全部重新生成推荐结果。这当然是最简单的想法，但是很显然，这样做是非常耗时的。另外一种思路，我们把当天产生的新物品单独存储在一个数据库，针对这些物品给出一些预估计的分数。这里当然可以针对物品的特性打分，也可以随机给定一些分数。然后我们在显示推荐的时候，可以混合之前线下已经产生的推荐结果和当天的新物品结果，这样从用户的角度来看，我们是可以对新物品进行推荐的。

在搜索的架构下，也有两个类似的思路。第一，那就是我们对索引进行重索引，但这个过程相对比较耗时。第二，那就是对新物品构建一个临时索引或者数据库，最后的结果是从索引和当天的临时存储中共同获取，然后进行重新排序。

在新物品比较多，并且很快就会过时的情况下，另外一个需要注意的棘手问题就是，推荐的模型一定不能仅仅抓住用户喜爱的某一个物品。比如新闻推荐，用户喜欢某一个新闻，但是这个新闻很快就会过时。这就和商品推荐有很大不同，对于商品来说，用户可以反复购买同一件日用品。

小结

今天我为你讲了利用推荐系统的一个重要问题，就是如何构架一个现代推荐系统。我们聊了两个场景下的一些更加细致的取舍，分别是新用户多的情况和新物品多的情况。

其实，所有的这些思路都不是“死规矩”，但是有一些基本的规则你可以去琢磨。

比如，我们尽可能把复杂的运算放在线下，因为毕竟需要在规定的时间内返回结果。在一切有可能的情况下，尽可能使用搜索引擎来减少需要对大量物品进行打分的步骤。再比如，对于活跃的用户，我们可以使用多层搜索架构；但是对于不活跃用户，我们可以依赖线下，提前产生所有的推荐结果。

一起来回顾下要点：第一，我们再次回顾了推荐架构的需求；第二，我们通过两个场景，新用户多和新物品多，分析了架构里面的一些取舍。

最后，给你留一个思考题，假设我们的推荐系统需要给一个手机客户端的产品进行推荐，有什么和桌面端不一样的，需要在架构上额外注意的地方呢？

欢迎你给我留言，和我一起讨论。

081 | 基于深度学习的推荐模型之一：受限波兹曼机

这几周我们进入专栏里一个比较大的模块，那就是推荐系统。

上周，我们谈了现代推荐系统的架构体系，帮助你在宏观上对推荐系统的构建有一个更加完整的认识。这周，我们主要来看在推荐系统研究领域里一个比较前沿的话题，那就是如何利用深度学习来提升推荐系统的精度。

今天，我们首先来看一篇经典的文章《受限波兹曼机进行协同过滤》（Restricted Boltzmann machines for collaborative filtering）[1]，这篇文章尝试使用受限波兹曼机（Restricted Boltzmann Machines），简称 RBM，来对推荐系统进行建模。这应该是最早把深度学习应用到推荐建模的典范。

受限波兹曼机（RBM）

从严格意义上讲，RBM 自身并不是深度模型，在早期对于 RBM 的使用上，也并没有将其“累加”到很多层从而形成“深度 RBM”（Deep RBM）。但是从建模思路上来说，由一层 RBM 到多层 RBM 的扩展其实是非常直接的，因此了解 RBM 的基本思路，对后面理解推荐系统中如何利用深度学习模型进行建模是很有帮助的。

今天我们要介绍的文章发表于 2007 年的 ICML（International Conference on Machine Learning，国际机器学习大会）上。作者群是鲁斯兰·萨拉胡特蒂诺夫（Ruslan Salakhutdinov）、安德烈·尼哈（ Andriy Mnih）以及杰弗里·辛顿（Geoffrey Hinton）。

辛顿在近日常常被称作深度学习之父。他不仅算是波兹曼机（Boltzmann Machines）的重要发明人和推动者之一，也和其学生一起把 RBM 应用到各类数据上，比如 RBM 在推荐领域的尝试。

2007 年的时候，Netflix 大赛如火如荼，很多学者都希望把各种模型和思路应用到这个比赛中。而在这个大赛中，有三个重要的思想脱颖而出，影响了后来推荐系统的研究发展。这三个思想分别是：

基于矩阵分解的模型；

基于 RBM 的模型；

利用集成学习（Ensemble Learning）把大量不同的模型整合起来。

由此可见，RBM 对于推荐系统的尝试在当时是非常有新意的。

第一作者鲁斯兰当时在多伦多大学攻读计算机博士，跟随辛顿研究深度学习模型。另外一篇他当时做的工作，是把贝叶斯矩阵分解利用到 Netflix 大赛中，和我们今天讨论的这篇论文一起，都是他在博士阶段对于推荐系统这个领域所做的重要贡献。目前鲁斯兰在卡内基梅隆大学任教，并兼任苹果公司的人工智能总监一职。

那什么是 RBM 呢？简单说来，RBM 就是由一层隐单元（Hidden Unit）和一层显单元（Visible Unit）组成的神经网络结构。通常情况下，显单元和隐单元这两层之间是完全连通的。也就是说，对于每一个显单元来说，它都和所有的隐单元联系到一起。

每个隐单元和显单元自身都有一个权重（Weight），并且在每对隐单元和显单元之间的连接上还有一个权重。所有这些权重都是需要通过训练学习的未知参数。举例来说，如果我们有 3 个显单元（用于描述 3 个数据点），5 个隐单元。那么我们就有 3 个权重对应 3 个显单元，有 5 个权重对应 5 个隐单元，然后有 15（3*5）个连接权重，这样算下来一共是 23 个权重。RBM 可以针对高斯信号，也就是实数信息，以及伯努利或者二项分布（Binomial Distribution）信号，也就是离散信息，进行建模。

受限波兹曼机在推荐上的应用

当我们对 RBM 有了一个基本的了解之后，我们来看 RBM 是怎么应用到推荐系统上的。为了讲解方便，我们这里使用 Netflix 的例子，也就是对“用户为电影打分”进行建模。

首先，对于每一个用户，我们使用一个单独的 RBM 来对这个用户进行建模，只不过，每一个 RBM 都有一样的隐单元数量。在建模的时候，每一个 RBM 仅仅对当前这个用户曾经打过分的数据进行建模。也就是说，每一个 RBM 需要建模的数据是不一样的，有的用户对三个电影打过分，有的对十个电影打过分。你可以设想一下，在这样的情况下，整个模型是什么意思。

每个用户有一个独立的 RBM，这个 RBM 负责对这个用户的电影集合进行建模。很显然，这些 RBM 互相没有关联。那怎么把每个用户的 RBM 给联系起来呢？作者们做了这样的假设，也就是每个 RBM 的隐单元是不一样的，这其实可以代表学习到的“用户的偏好”。但是，如果两个用户都对同一个电影打过分，那么，针对这个电影，两个不同的 RBM 会共享一样的权重。这就是联系两个 RBM 的核心思想，也就是说，利用 RBM 对用户电影推荐的核心是“共享相同电影的权重”。

具体说来，每一个显单元都是用户对于某个电影的评价。这里每个显单元都是一个 K 维的数组，其中只有一个元素是 1，其他都是 0。这种二元的数组表达，帮助模型来对“用户对于有 K 种可能的输出”进行建模。隐单元在这篇论文中，也是二元的，只不过，我们事先并不知道隐单元的取值。和刚才介绍的一样，在这样的模型里，需要学习的参数包括显单元的权重、隐单元的权重以及他们之间关系的权重，同一个电影的权重是共享的。

每一个用户都有一个单独的 RBM，并且我们在 RBM 里只对已经评过分的电影进行了建模，因此这个模型并不能直接对未知的电影评分进行预测。需要预测的时候，我们其实是先拿到这个电影的权重，然后看，我们把那个 K 维的评分数组设置成哪种情况的时候，产生的概率是最大的。也就是说，我们尝试把对于未知的电影评分设置成不同情况，取出现可能性最大的那种评分作为预测结果。很明显，这样做的计算效率并不高。文章中也介绍了如何加速，我们这里就不复述了。

RBM 对于推荐系统的建模看上去很简单，但是难点却是如何学习这些未知的权重。总体说来，RBM 无法直接使用类似“最大似然法”或者“递归下降”的方法来对参数进行学习。这其实也是阻碍这类方法广泛使用的一个重要障碍。在最初的论文里，作者们提出了一种 CD（Contrastive Divergence，对比散度）方法，这种方法其实是一种简化的 MCMC（Markov chain Monte Carlo，马尔科夫蒙特卡洛）方法，用于对 RBM 进行采样。CD 方法具体是如何实现的，我们这里就不展开了。

在 Netflix 的数据集上，RBM 展现了惊人的效果，不仅能够很轻松地击败 Netflix 自身的算法基线，还比当时提出的单纯的矩阵分解方法要更加优秀。基于此，后来就有了很多 RBM 的扩展工作。

小结

这周我来为你讲解利用推荐系统的一个重要的问题，就是如何利用深度学习模型来对推荐系统进行建模。今天我们聊了一个最基本的深度学习模型，受限波兹曼机，讨论了如何将其应用在推荐系统中。

一起来回顾下要点：第一，我们介绍了什么是受限波兹曼机；第二，我们讨论了如何把受限波兹曼机应用到推荐场景中。

最后，给你留一个思考题，如果希望在受限波兹曼机里增加其他信息，比如各种用户信息或者电影信息，我们该如何做呢？

欢迎你给我留言，和我一起讨论。

参考文献

1. Ruslan Salakhutdinov, Andriy Mnih, and Geoffrey Hinton. Restricted Boltzmann machines for collaborative filtering. Proceedings of the 24th international conference on Machine learning (ICML '07), Zoubin Ghahramani (Ed.). ACM, New York, NY, USA, 791-798, 2007.

082 | 基于深度学习的推荐模型之二：基于RNN的推荐系统

周一我们看了一篇经典的文章，那就是尝试使用受限波兹曼机（RBM）来对推荐系统建模。这应该是最早把深度学习应用到推荐建模的典范。当然，RBM 虽然算是相对比较早的深度学习模型，但其本质上并没有很多后来提出的深度模型的特质，也没有真正发挥出深度学习模型的特有优势。

今天，我们结合几篇论文来看一类深度学习模型，那就是“递归神经网络”（Recurrent Neural Network），简称 RNN，在推荐系统中的应用。这类模型可以解决传统推荐模型中难以对时序信息进行建模的问题，扩宽了推荐系统的应用边界。

时序信息建模

要想说清楚 RNN 对于推荐系统的贡献，我们首先要来看一看为什么需要对时序信息进行建模。

在我们前面介绍的诸多推荐模型中，不管是矩阵分解，还是简单的基于流行度的推荐模型，或是其他更加复杂的张量分解等模型，其实都没有内置“时间”这个概念。

比方说，我们通过矩阵分解来对用户和物品的评分进行建模。在这个建模的场景里，用户物品评分矩阵是针对所有数据的，不管是用户昨天对某个物品进行评分还是今天，甚至是一年以前，所有数据都是在唯一一个矩阵里面加以表示。这么做的好处是，极大地简化了真实情况，不好的地方则是完全忽略了所有评分在时间上的发展。

其实早在 Netflix 大赛中，一些学者就在 Netflix 公布的数据集上发现，用户对于电影的喜爱程度，或者说评分数值，有非常明显的随时间变化而变化的趋势。文末我列的参考文献 [1]，这篇论文就是充分挖掘了时间信息从而带来了性能上的提升，如果你有兴趣的话，建议读一读这篇文章。

在深度学习模型，特别是 RNN 之前，如果我们希望对时间进行建模，从模型工具的角度上来说，我们都有哪些选择呢？

一种办法是可以尝试使用传统的“时序模型”（Time Series Models）。这一类模型在统计领域已经使用了较长时间，然而最大的问题就是，很多工具很难直接和我们提到的这些推荐模型进行嫁接。另外一个难点是在嫁接之后，模型的训练算法往往会变得异常复杂，这也给模型的普及和使用带来了很多障碍。

另外一种办法，就是尝试在现有的模型里通过特性（Feature）或者其他的方法，来让当前的模型能够对时间信息进行建模。这个思路其实是对矩阵分解进行了修改。这样做的好处就是可以根据自己的需要在某一个模型上进行必要的更改，然而这么做的先天性缺陷就在于提出来的修改往往只能针对某一个模型，而没有办法扩展到其他模型。

第三种做法是可以利用张量分解（Tensor Factorization）。我们直接把时间作为一个新的维度，因此可以对用户在某一个时间段对某个物品的评分进行建模，有一些工作是基于这个假设的。

不过，直接利用张量分解的最大问题是，张量本身并不是时序模型，利用张量对时序信息进行建模仅仅是因为时序信息大多时候可以被表达成为离散的数据，因此张量才在这里有了用武之地。然而，因为张量无法直接对离散时序的两位数据点之间进行约束建模，比如时间点“昨天”和时间点“今天”可能在张量中占据两个不同的数据点，但是张量本身并不能把这两个数据点联系起来。也就是说，张量在“语义”（Semantics）上其实并不支持时序数据。

基于以上这些原因，我们需要有新的工具来对时序信息进行比较直接的建模，同时也能有相对容易的学习算法。

基于 RNN 的推荐模型

RNN 作为深度学习中有力的时序信息建模工具，随着深度学习的火热，被越来越多的学者用来解决我们刚才所说的这些问题。我们一起来看两篇论文，可以说这两篇文章是 RNN 在推荐领域应用的重要参考。

除了从工具的角度来讲为什么需要 RNN 以外，还有一个是从实际的场景出发，也就是在同一个“会话”（Session）中的推荐结果，这是一个比较突出的需要时序信息的场景，且传统的方法无法很好地解决。

在这方面比较早的尝试，来自于在 ICLR2016 上发表的一篇论文《使用递归神经网络的基于会话的推荐》（Session-based recommendations with recurrent neural networks）[2]。这里面的基本思路其实很直观，就是在推荐系统中使用某种 RNN 模型，在这篇论文里使用的是 GRU（Gated Recurrent Unit）。我们在这里不展开 RNN 或者 GRU 的定义细节以及这些模型里面的特征。我们从比较高的维度来讲一讲 RNN 的建模思路。

RNN 的输入是当前的一个物品，然后 RNN 需要输出的是对于下一个物品的预测，同时为了能够对这些在时间序列上的物品进行建模，RNN 内部也要维持一个隐含的状态序列，这个状态序列会随着时间的变化而变化。不同的 RNN 模型在以下内容的实现上有所不同，包括如何实现这个隐含的状态序列，以及如何对从状态序列到输入和输出物品的建模。

总的来说，这篇论文就是直接把目前在自然语言处理中经常使用的 GRU 拿到了推荐领域，并且做了一些微小的修改。从实验结果来看，如果我们对会话进行建模的话，效果要明显好于没有对会话进行建模。

再介绍一个比单对会话进行建模更进一步的工作，是发表于 WSDM2017 上的一篇论文《递归推荐网络》（Recurrent Recommender Networks）[3]。我们前面提到了，矩阵分解的最大问题就是学习到的用户以及物品向量无法囊括时间的信息。在这篇论文里，作者们假定用户的隐向量，物品的隐向量都会随着时间的变化而变化，而在某一个时刻的物品评分仅仅是那一个时刻的用户隐向量和物品隐向量的一个结合。在传统的模型里，要描述这种隐向量随着时间的变化而变化的思路就会充满难度。

在这篇论文里，一个重要的贡献就是使用了一种叫 LSTM（Long Short-Term Memory）的 RNN 模型，来对这些用户的隐变量随着时间的变化而变化进行建模。我们在这里也不展开 LSTM 的基本定义。总体来说，LSTM 也是对某一组输入变量和输出变量在时间上的关系进行建模，同时利用内部隐状态序列来对输入和输出变量进行建模。

小结

今天我们聊了如何利用 RNN 对推荐系统中的时序信息进行建模。

一起来回顾下要点：第一，我们讨论了为什么对时序信息建模是非常必要的；第二，我们结合两篇论文，聊了利用 RNN 对时序信息建模的例子。

最后，给你留一个思考题，除了会话信息或者用户的喜好是比较明显的时序信息以外，推荐系统中还有哪些时序信息的应用呢？

欢迎你给我留言，和我一起讨论。

参考文献

1. Yehuda Koren. Factor in the neighbors: Scalable and accurate collaborative filtering. ACM Trans. Knowl. Discov. Data 4, 1, Article 1 (January 2010), 24 pages, 2010.

2. Bal´azs Hidasi, Alexandros Karatzoglou, Linas Baltrunas, and Domonkos Tikk. Session-based recommendations with recurrent neural networks. International Conference on Learning Representations (2016), 2016.

3. Chao-Yuan Wu, Amr Ahmed, Alex Beutel, Alexander J. Smola, and How Jing. _Recurrent Recommender Networks_. Proceedings of the Tenth ACM International Conference on Web Search and Data Mining (WSDM '17). ACM, New York, NY, USA, 495-503, 2017.

083 | 基于深度学习的推荐模型之三：利用深度学习来扩展推荐系统

这周，我们主要讨论如何利用深度学习来提升推荐系统的精度。我们分别介绍了使用 RBM（Restricted Boltzmann Machines，受限波兹曼机）来对推荐系统建模，和 RNN（Recurrent Neural Network，递归神经网络）在推荐系统中的应用。

今天，我们最后再来看一看，还有哪些深度学习的思潮在影响着推荐系统。这些思想都是一些值得关注和学习的方向，虽然这些方法能否在短时间内成为主流还有待检验。

多层神经网络

深度学习开始从计算机视觉这一人工智能子领域慢慢向其他领域扩展，在这个大背景下，很多学者和实践者总结出了深度学习获得成功的一大法宝，那就是能够从众多的信息中学习到高维度的特性（Feature）。比如，在计算机视觉里，通过多层神经网络建立的深度学习模型往往能够识别出类似“边”、“角”、“形状”等视觉概念。于是，大家就形成了这样一个普遍认识：多层神经网络是一种提取特性的利器。

和很多其他领域的思路一样，在推荐领域的学者也开始尝试利用多层神经网络对用户和物品的信息进行提取。这里面比较经典的思路是：直接利用多层神经网络，来尝试我们之前已经讲过的基于矩阵分解的推荐模型。

在矩阵分解的例子里，我们学习到的是用户的隐变量和物品的隐变量。这两者的点积成为评分的预测结果。在这个模型框架里可以认为，用户的隐变量和物品的隐变量是我们从数据中提取的特性信息。只不过，这种特性的提取是一种线性变换，而深度学习模型寻求的是多层次的非线性变换。

利用多层神经网络提取用户和物品特性的基本思路是这样的。

首先，我们的输入信息是用户的 ID 以及物品的 ID。这里我们可以认为 ID 是高维的离散输入。那么，根据这个输入信息，我们分别对用户和物品构建多层神经网络。这里比较常见的是至少有一层的神经网络，可以把离散的输入转换成为连续的数据层。

通常我们把这一层叫作“嵌入层”（Embedding）。嵌入层的基本思想是希望能够把离散信息转换成为连续信息，并且这些连续信息携带着“语义”（Semantic）上面的相似。什么意思呢？就是说如果两个用户是相似的，或者两个物品是相似的，那么我们就会寄希望于他们的嵌入层在数值上相近，这样嵌入层就能够很好地捕捉到用户和物品的相似度。

当用户和物品两边分别得到了嵌入层以后，输入信息已经完全变成了连续数据信息，通常的做法是把两边的嵌入层拼接在一起（也有把两个嵌入层取加权平均的做法），形成一个大的嵌入层。这个新的拼接层就成为连结了用户信息和物品信息的输入。

然后，接下来要做的，就是对这个新的输入进行多层的神经网络变换，最后输出我们对评分的预测。

总而言之，直接利用多层神经网络对用户和物品的建模可以简单归纳为两步：首先，把离散的 ID 信息转换成为连续的信息，形成嵌入层；然后，利用多层神经网络对嵌入层进行变换，并最后输出预测结果。

虽然利用多层神经网络在推荐系统上可以算是非常直观，然而在实际的效果中，我们其实并没有发现利用多层神经网络比矩阵分解要更好。如何能够更加有效地利用多层神经网络目前还是一个研究方向。

其他深度学习模型

除了直接利用多层神经网络来对推荐系统进行建模以外，最近也有不少把深度学习中其他思潮应用到推荐系统中的尝试。这里我也简单提及一些。

首先，在深度学习领域有一个技术叫作“自动编码器”（Autoencoder）。这个方法的核心思想就是希望能够无监督化地学习到某种信号的编码后的信息，并且编码后的信息能够再次通过解码尽可能地还原最初的信号。如果我们能够找到这样完美的过程，那么，在这个方法的假设里，我们就获取了更有价值的特性信息。

于是，把自动编码器思想应用到推荐系统的尝试，主要就是对用户以及物品进行编码。需要指出的是，我们刚才提到的直接使用多层神经网络的方法，其实也是某种意义上的编码，但我们这里提到的自动编码器的思想，还强调能够从学习到的隐含信息中还原最初的信息，也就是尽可能保持学习到的隐含变量的可还原性。这一点是多层神经网络所不具备的。

另外一个就是 CNN（卷积神经网络）的应用，学者和工程人员希望借助 CNN 来对用户和物品进行建模，从而扩展推荐系统的表现力。目前 CNN 在计算机视觉领域占据着举足轻重的地位，因此，很多人都希望能够直接把 CNN 的成功借鉴到推荐系统中。

和刚才我们介绍的直接使用多层神经网络建模的思路非常类似。一种常见的做法也是直接利用 CNN 来提取用户和物品的信息。通常的做法就是在我们刚才所说的嵌入层之后，不直接使用多层神经网络了，而是使用 CNN 来对嵌入层之后的信息进行变换。这里其实并没有太多创新的地方，基本上就是把视觉里面的模型拿来直接使用。

关于其他深度学习模型我们就说到这里，不做太多的介绍。原因是从总体上来看，深度学习在推荐系统上的应用，还是技术大于实际效果，目前并没有在太多的应用上有真正令人说服的成功案例。大多数情况是技术人员希望尝鲜，然后把一些成功的模型照搬到推荐任务上，虽然效果也不差，但从大的贡献来说，并没有太大的创新。

小结

今天我们继续讨论了如何利用深度学习模型来对推荐系统进行建模，我们聊了如何把深度学习的思路嫁接到推荐系统的开发中来。

一起来回顾下要点：第一，我们聊了一种最简单的应用，就是直接利用多层神经网络来对推荐系统进行扩展；第二，我们聊了一些其他的深度学习的思路，包括自动编码器和 CNN，简单讨论了如何把这些深度学习模型应用到推荐系统中。

最后，给你留一个思考题，深度学习模型在推荐领域应用的最大问题，或者说最大挑战是什么？

欢迎你给我留言，和我一起讨论。

推荐阅读

深度学习 | 空竹里的秘密：自编码器

复盘 2 | 推荐系统核心技术模块

到目前为止，我们讲完了人工智能核心技术的第二个模块——推荐系统。

整个模块共21期，7大主题，希望通过这些内容，能让你对推荐系统核心技术有一个全面系统的认识和理解，为自己进一步学习和提升打下基础。今天我准备了 21 张知识卡，和你一起来对这一模块的内容做一个复盘。

提示：点击知识卡跳转到你最想看的那篇文章，温故而知新。如不能正常跳转，请先将 App 更新到最新版本。

现代推荐架构剖析

推荐架构需要解决的问题：

能够在一两百毫秒内给用户提供当前的推荐结果；

对用户和系统的交互结果做出响应；

考虑用户群体的覆盖率的问题。

简单推荐模型

基于隐变量的模型

我们通过模型的假设，知道隐变量之间的关系，但暂时并不知道隐变量的取值。因此需要通过“推断”过程来确定隐变量的实际取值。当我们知道了这些隐变量的取值之后，就可以根据这些取值来对未来的数据进行预测和分析。

隐变量往往还带有“统计分布”的假设。最简单的隐变量模型是高斯混合模型。

高阶推荐模型

推荐的 Exploit 和 Explore 算法

基于深度学习的推荐模型

推荐系统的评价

积跬步以至千里

最后，恭喜你在这个模块中已经阅读了45397 字，听了138 分钟的音频，获得一张新的通关卡，这是一个不小的成就。在人工智能领域的千里之行，我们又往前迈出了一步。

感谢你在专栏里的每一个留言，给了我很多思考和启发。期待能够听到你更多的声音，我们一起交流讨论。

007 | LDA模型的前世今生

在文本挖掘中，有一项重要的工作就是分析和挖掘出文本中隐含的结构信息，而不依赖任何提前标注的信息。今天我要介绍的是一个叫做LDA（Latent Dirichlet Allocation）的模型，它在过去十年里开启了一个领域叫主题模型。

从 LDA 提出后，不少学者都利用它来分析各式各样的文档数据，从新闻数据到医药文档，从考古文献到政府公文。一段时间内，LDA 成了分析文本信息的标准工具。从最原始的 LDA 发展出来的各类模型变种，则被应用到了多种数据类型上，包括图像、音频、混合信息、推荐系统、文档检索等等，各类主题模型变种层出不穷。下面我来简单剖析一下 LDA 这个模型，聊聊它的模型描述以及训练方法等基础知识。

LDA 的背景介绍

LDA 的论文作者是戴维·布雷（David Blei）、吴恩达和迈克尔·乔丹（Michael Jordan）。这三位都是今天机器学习界炙手可热的人物。论文最早发表在 2002 年的神经信息处理系统大会（Neural Information Processing Systems，简称 NIPS）上，然后长文章（Long Paper）于 2003 年在机器学习顶级期刊《机器学习研究杂志》（Journal of Machine Learning Research）上发表。迄今为止，这篇论文已经有超过 1 万 9 千次的引用数，也成了机器学习史上的重要文献之一。

论文发表的时候，戴维·布雷还在加州大学伯克利分校迈克尔手下攻读博士。吴恩达当时刚刚从迈克尔手下博士毕业来到斯坦福大学任教。戴维 2004 年从伯克利毕业后，先到卡内基梅隆大学跟随统计学权威教授约翰·拉弗蒂（John Lafferty）做了两年的博士后学者，然后又到东部普林斯顿大学任教职，先后担任助理教授和副教授。2014 年转到纽约哥伦比亚大学任统计系和计算机系的正教授。戴维在 2010 年获得斯隆奖（Alfred P. Sloan Fellowship，美国声誉极高的奖励研究人员的奖项，不少诺贝尔奖获得者均在获得诺贝尔奖多年之前获得过此奖），紧接着又在 2011 年获得总统青年科学家和工程师早期成就奖（Presidential Early Career Award for Scientists and Engineers，简称 PECASE）。目前他所有论文的引用数超过了 4 万 9 千次 。

吴恩达在斯坦福晋升到副教授后，2011 年到 2012 年在 Google 工作，开启了谷歌大脑（Google Brain）的项目来训练大规模的深度学习模型，是深度学习的重要人物和推动者之一。2012 年他合作创建了在线学习平台 Coursera，可以说是打开了慕课（Massive Open Online Course，简称 MOOC）运动的大门。之后吴恩达从 2014 年到 2017 年间担任百度首席科学家，并创建和运行了百度在北美的研究机构。目前他所有论文的引用数超过 8 万 3 千次。

文章的第三作者迈克尔·乔丹是机器学习界的泰斗人物。他自 1998 年在加州大学伯克利任教至今，是美国三个科学院院士（American Academy of Arts and Sciences、National Academy of Engineering 以及 National Academy of Sciences），是诸多学术和专业组织的院士（比如 ACM、IEEE、AAAI、SIAM 等）。迈克尔可以说是桃李满天下，而且其徒子徒孙也已经遍布整个机器学习领域，不少都是学术权威。他的所有论文有多达 12 万次以上的引用量。

值得注意的是，对于三位作者来说，LDA 论文都是他们单篇论文引用次数最多的文章。

LDA 模型

要描述 LDA 模型，就要说一下 LDA 模型所属的产生式模型（Generative Model）的背景。产生式模型是相对于判别式模型（Discriminative Model）而说的。这里，我们假设需要建模的数据有特征信息，也就是通常说的 X，以及标签信息，也就是通常所说的 Y。

判别式模型常常直接对 Y 的产生过程（Generative Process) 进行描述，而对特征信息本身不予建模。这使得判别式模型天生就成为构建分类器或者回归分析的有利工具。而产生式模型则要同时对 X 和 Y 建模，这使得产生式模型更适合做无标签的数据分析，比如聚类。当然，因为产生式模型要对比较多的信息进行建模，所以一般认为对于同一个数据而言，产生式模型要比判别式模型更难以学习。

一般来说，产生式模型希望通过一个产生过程来帮助读者理解一个模型。注意，这个产生过程本质是描述一个联合概率分布（Joint Distribution）的分解过程。也就是说，这个过程是一个虚拟过程，真实的数据往往并不是这样产生的。这样的产生过程是模型的一个假设，一种描述。任何一个产生过程都可以在数学上完全等价一个联合概率分布。

LDA 的产生过程描述了文档以及文档中文字的生成过程。在原始的 LDA 论文中，作者们描述了对于每一个文档而言有这么一种生成过程：

首先，从一个全局的泊松（Poisson）参数为β的分布中生成一个文档的长度 N；

从一个全局的狄利克雷（Dirichlet）参数为α的分布中生成一个当前文档的θ；

然后对于当前文档长度 N 的每一个字执行以下两步，一是从以θ为参数的多项（Multinomial）分布中生成一个主题（Topic）的下标（Index）z_n；二是从以φ和 z 共同为参数的多项分布中产生一个字（Word）w_n。

从这个描述我们可以马上得到这些重要的模型信息。第一，我们有一个维度是 K 乘以 V 的主题矩阵（Topic Matrix）。其中每一行都是一个φ，也就是某一个生成字的多项分布。当然，这个主题矩阵我们在事先并不知道，是需要学习得到的。另外，对每一个文档而言，θ是一个长度为 K 的向量，用于描述当前文档在 K 个主题上的分布。产生过程告诉我们，我们对于文档中的每一个字，都先从这个θ向量中产生一个下标，用于告诉我们现在要从主题矩阵中的哪一行去生成当前的字。

这个产生模型是原论文最初提出的，有两点值得注意。

第一，原始论文为了完整性，提出了使用一个泊松分布来描述文档的长度这一变化信息。然而，从模型的参数和隐变量的角度来说，这个假设并不影响整个模型，最终作者在文章中去除了这个信息的讨论。在主题模型的研究中，也较少有文献专注这个信息。

第二，原始论文并没有在主题矩阵上放置全局的狄利克雷分布作为先验概率分布。这一缺失在后续所有的主题模型文献中得到修正。于是今天标准的 LDA 模型有两类狄利克雷的先验信息，一类是文档主题分布的先验，参数是α，一类是主题矩阵的先验，参数是β。

文章作者们把这个模型和当时的一系列其他模型进行了对比。比如说，LDA 并不是所谓的狄利克雷 - 多项（Dirichlet-Multinomial）聚类模型。这里，LDA 对于每个文档的每一个字都有一个主题下标。也就是说，从文档聚类的角度来看，LDA 是没有一个文档统一的聚类标签，而是每个字有一个聚类标签，在这里就是主题。这也是 LDA 是Mixed-Membership 模型的原因——每个字有可能属于不同的类别、每个文档也有可能属于不同的类别。

LDA 很类似在 2000 年初提出的另外一类更简单的主题模型——概率隐形语义索引（Probabilistic Latent Semantic Indexing），简称PLSI。其实从本质上来说，LDA 借用了 PLSI 的基本架构，只不过在每个文档的主题分布向量上放置了狄利克雷的先验概率，以及在主题矩阵上放置了另外一个狄利克雷的先验概率。

尽管看上去这是一个非常小的改动，但是这样做的结果则是 LDA 的参数个数并不随着文档数目的增加而增加。那么，相对于 PLSI 来说，LDA 并不容易对训练数据过度拟合（Overfitting）。

值得注意的，原始文章说过度拟合主要是指，对于 PLSI 而言，文档的主题分布向量是必须需要学习的，而这个向量对于 LDA 是可以被忽略或者说是并不需要保存的中间变量。然而在实际的应用中，我们其实常常也需要这个向量的信息，因此这部分对于过度拟合的讨论在后来的应用中并没有特别体现。

LDA 模型的训练和结果

LDA 虽然从某种意义上来说仅仅是在 PLSI 上增加了先验信息。然而，这一个改动为整个模型的训练学习带来了非常大的挑战。应该说，整个 LDA 的学习直到模型提出后近 10 年，才随着随机变分推理（Stochastic Variational Inference）的提出以及基于别名方法（Alias Method）的抽样算法（Sampling Method）而得以真正的大规模化。一直以来，LDA 的训练学习都是一件很困难的事情。

不像 PLSI 可以依靠最大期望（EM）算法得以比较完美的解决，传统上，LDA 的学习属于贝叶斯推理（Bayesian Inference），而在 2000 年代初期，只有马尔科夫蒙特卡洛（Markov chain Monte Carlo），简称 MCMC，以及迈克尔·乔丹等人推崇的变分推理（Variational Inference），简称 VI，作为工具可以解决。这篇文章因为出自迈克尔的实验室，当仁不让地选择了 VI。比较有意思的是，后续大多数 LDA 相关的论文都选择了 MCMC 为主的吉布斯（Gibbs）采样来作为学习算法。

VI 的完整讲解无法在本文涵盖。从最高的层次上来理解，VI 是选取一整组简单的、可以优化的所谓变分分布（Variational Distribution）来逼近整个模型的后验概率分布。当然，由于这组分布的选取，有可能会为模型带来不小的误差。不过好处则是这样就把贝叶斯推理的问题转化成了优化问题。

从 LDA 的角度来讲，就是要为θ以及 z 选取一组等价的分布，只不过更加简单，更不依赖其他的信息。在 VI 进行更新θ以及 z 的时候，算法可以根据当前的θ以及 z 的最新值，更新α的值（这里的讨论依照原始的 LDA 论文，忽略了β的信息）。整个流程俗称变分最大期望（Variational EM）算法。

文章在 TREC AP 的文档数据中做了实验。首先，作者们使用了一个叫困惑度（Perplexity）的评估值来衡量文档的建模有效程度，这个值越低越好。LDA 在好几个数据集中都明显好于 PLSI 以及其他更加简单的模型。从这篇文章之后，主题模型的发展和对比都离不开困惑度的比较，也算是开启了一个新时代。

然后，作者们展示了利用 LDA 来做文档分类，也就是利用文档主题向量来作为文档的特征，从而放入分类器中加以分类。作者们展示了 LDA 作为文档分类特征的有力证据，在数据比较少的情况下优于文本本身的特征。不过总体说来，在原始的 LDA 论文中，作者们并没有特别多地展现出 LDA 的所有可能性。

小结

今天我为你梳理了 LDA 提出的背景以及这篇论文所引领的整个领域的情况。你需要掌握的核心要点：第一，论文作者们目前的状态；第二，LDA 模型本身和它的一些特点；第三，LDA 的训练流程概况以及在原始文章中的实验结果。

最后，我为你留一个思考题：LDA 的产生过程决定了对于一个文本而言，每个字都可能来自不同的主题，那么如果你希望，对于某一个段落，所有的文字都来自同一个主题，你需要对 LDA 这个模型进行怎么样的修改呢？

欢迎你给我留言，和我一起讨论。

084 | LDA变种模型知多少

我们在之前的分享中曾经介绍过文本挖掘（Text Mining）中的重要工具 LDA（Latent Diriclet Allocation）的基本原理。在文本挖掘中，有一项重要的工作就是分析和挖掘出文本中隐含的结构信息，而不依赖任何提前标注（Labeled）的信息。也就是说，我们希望能够利用文本挖掘技术来对无标签的数据进行挖掘，这是典型的无监督学习。

LDA 就是一个出色的无监督学习的文本挖掘模型。这个模型在过去的十年里开启了主题模型（Topic Model）这个领域。不少学者都利用 LDA 来分析各式各样的文档数据，从新闻数据到医药文档，从考古文献到政府公文。在一段时间内，LDA 成为了分析文本信息的标准工具。而从最原始的 LDA 发展出来的各类模型变种，则被应用到了多种数据类型上，包括图像、音频、混合信息、推荐系统、文档检索等等，可以说各类主题模型变种层出不穷。

今天我们就结合几篇经典论文，来看一看LDA 的各种扩展模型。当然，在介绍今天的内容之前，我们首先来回顾一下 LDA 模型的一些基本信息。

LDA 模型的回顾

LDA 模型是一个典型的产生式模型（Generative Model）。产生式模型的一大特点就是通过一组概率语言，对数据的产生过程进行描述，从而对现实数据建立一个模型。注意，这个产生过程的本质是描述的一个联合概率分布（Joint Distribution）的分解过程。也就是说，这个过程是一个虚拟的过程，真实的数据往往并不是这样产生的。这样的产生过程是模型的一个假设，一种描述。任何一个产生过程都可以在数学上完全等价一个联合概率分布。

LDA 的产生过程描述了文档以及文档中文字的产生过程。在原始的 LDA 论文中，作者们描述了对于每一个文档而言的产生过程。

LDA 模型的前世今生

相比于传统的文本聚类方法，LDA 对于每个文档的每一个字都有一个主题下标，也就是说，LDA 是没有一个文档统一的聚类标签，而是每个字有一个聚类标签，在这里就是主题。

LDA 模型的训练一直是一个难点。传统上，LDA 的学习属于贝叶斯推断（Bayesian Inference），而在 2000 年初期，只有MCMC 算法（Markov chain Monte Carlo，马尔科夫链蒙特卡洛）以及 VI（Variational Inference，变分推断）作为工具可以解决。在最初的 LDA 论文里，作者们采用了 VI；后续大多数 LDA 相关的论文都选择了 MCMC 为主的吉布斯采样（Gibbs Sampling）来作为学习算法。

LDA 的扩展

当 LDA 被提出以后，不少学者看到了这个模型的潜力，于是开始思考怎么把更多的信息融入到 LDA 里面去。通过我们上面的讲解，你可以看到，LDA 只是对文档的文字信息本身进行建模。但是绝大多数的文档数据集还有很多额外的信息，如何利用这些额外信息，就成为了日后对 LDA 扩展的最重要的工作。

第一个很容易想到的需要扩展的信息就是作者信息。特别是 LDA 最早期的应用，对于一般的文档来说，比如科学文档或者新闻文档，都有作者信息。很多时候我们希望借用作者在写文档时的遣词造句风格来分析作者的一些写作信息。那么，如何让 LDA 能够分析作者的信息呢？

这里我们分享一篇论文《用于作者和文档信息的作者主题模型》（The author-topic model for authors and documents）[1]，这是最早利用额外信息到 LDA 模型中的扩展模型。文章提出的模型叫作“作者 LDA”（Author LDA）。这个模型的主要思想是，每篇文档都会有一些作者信息，我们可以把这些作者编码成为一组下标（Index）。对于每一个文档来说，我们首先从这组作者数组中，选出一个当前的作者，然后假定这个作者有一组相对应的主题。这样，文档的主题就不是每个文档随机产生了，而是每个作者有一套主题。这个时候，我们从作者相对应的主题分布中取出当前的主题，然后再到相应的语言模型中，采样到当前的单词。

可以看到，作者 LDA 和普通的 LDA 相比，最大的不同就是主题分布不是每个文档有一个，而是每个作者有一个。这个主题分布决定着当前的单词是从哪一个语言模型中采样的单词。作者 LDA 也采用吉布斯采样的方法学习，并且通过模型的学习之后，能够看得出不同作者对于文档的影响。

从作者 LDA 之后，大家看出了一种扩展 LDA 的思路，那就是依靠额外的信息去影响主题分布，进而影响文档字句的选择。这种扩展的方法叫作“上游扩展法”（Upstream）。什么意思呢？就是说把希望对模型有影响的信息，放到主题分布的上游，去主动影响主题分布的变化。这其实是概率图模型的一种基本的思路，那就是把变量放到这个产生式模型的上游，使得下游的变量受到影响。

那你可能要问，有没有把需要依赖的变量放到下游的情况呢？答案是肯定的。我们再来看一篇论文《同时进行图像分类和注释》（Simultaneous image classification and annotation）[2]，这篇文章就发明了一种方法。具体来说，文章希望利用 LDA 到多模数据领域（Multiple Modal）。也就是数据中可能有文字，也可能有图像，还可能有其他信息。在这样的多模数据的情况下，如何让 LDA 能够对多种不同的数据进行建模呢？

这里面的基本思路就是认为所有的这些数据都是通过主题分布产生的。也就是说，一个数据点，我们一旦知道了这个数据点内涵的主题（比如到底是关于体育的，还是关于金融的），那么我们就可以产生出和这个数据点相关的所有信息，包括文字、图像、影音等。

具体到这篇文章提出的思路，那就是这组数据的图像标签以及图像所属的类别都是主题产生的。我们可以看到，和之前的作者 LDA 的区别，那就是其他信息都是放在主题变量的下游的，希望通过主题变量来施加影响。

这两种模型代表了一系列丰富的关于 LDA 的扩展思路，那就是如何把扩展的变量设置在上游或者是下游，从而能够对主题信息产生影响或者是受到主题信息的影响。

除此以外，LDA 的另外一大扩展就是把文档放到时间的尺度上，希望去分析和了解文档在时间轴上的变化。这就要看经典的论文《动态主题模型》（Dynamic topic models）[3]。这篇论文最后获得了 ICML 2010 年的最佳贡献奖。那么，我们怎么修改 LDA 使其能够理解时间的变化呢？很明显，还是需要从主题分布入手，因为主题分布控制了究竟什么文字会被产生出来。因此，我们可以认为主题分布会随着时间的变化而变化。

在之前的模型中，我们已经介绍了，每个文档的主题分布其实来自一个全局的狄利克雷（Diriclet ）先验分布。那么，我们可以认为不同时间的先验分布是不一样的，而这些先验分布会随着时间变化而变化。怎么能够表达这个思想呢？作者们用到了一个叫“状态空间”（State-Space）的模型。简而言之，状态空间模型就是把不同时间点的狄利克雷分布的参数给串起来，使得这些分布的参数会随着时间的变化而变化。把一堆静态的参数用状态空间模型串接起来，可以说是这篇文章开创的一个新的思维。

总结

今天我为你梳理了 LDA 的扩展模型。LDA 的扩展当然还有很多，我们今天讨论了几个非常经典的扩展思路，分别是基于上游、下游和时间序列的 LDA 扩展模型。

一起来回顾下要点：第一，我们回顾了 LDA 这个模型的核心思想；第二，我们聊了如何把文档的其他信息融入到 LDA 模型中去，以及如何对时间信息进行建模。

最后，给你留一个思考题，如果我们希望利用 LDA 来对“用户对商品的喜好”进行建模，应该怎么对模型进行更改呢？

欢迎你给我留言，和我一起讨论。

参考文献

1. Michal Rosen-Zvi, Thomas Griffiths, Mark Steyvers, and Padhraic Smyth. The author-topic model for authors and documents. Proceedings of the 20th conference on Uncertainty in artificial intelligence (UAI '04). AUAI Press, Arlington, Virginia, United States, 487-494, 2004.

2. C. Wang, D. Blei., and L. Fei-Fei. Simultaneous image classification and annotation. Computer Vision and Pattern Recognition, 2009.

3. D.Blei and J.Lafferty. Dynamic topic models. Proceedings of the 23rd International Conference on Machine Learning, 2006.

085 | 针对大规模数据，如何优化LDA算法？

周一，我们分享了 LDA（Latent Diriclet Allocation）的各种扩展模型，介绍了基于上游的和下游的两种把额外信息融入到 LDA 模型中的方法。同时，我们也讨论了在时间尺度上如何把 LDA 模型扩展到可以“感知”不同的时间段对于模型的影响。以 LDA 为代表的主题模型在过去的十年间发展出了一整套的扩展，为各式各样的应用场景提供了有力的工具。

尽管 LDA 在模型的表达力上给研究者们提供了把各种场景和模型结合的可能性，但是 LDA 的训练过程比较复杂，而且速度也比较慢。因此，如何能够把 LDA 真正应用到工业级的场景中，对于很多人来说，都是一件煞费苦心的事情。今天我们就来聊聊LDA 的算法优化问题。

LDA 模型训练

我们首先来回顾一下 LDA 模型的训练过程，从高维度上为你分析一下为什么这个过程很困难。

LDA 模型中最重要的未知变量就是每个单词对应的主题下标（Index）或者说是主题“赋值”（Assignment）。这个主题下标是从每个文档对应的主题分布中“采样”得来的。每个文档的主题分布本身也是一个未知的多项式分布，用来表达当前这个文档的所属主题，比如有多少百分比属于运动、有多少百分比属于金融等等。这个分布是从一个全局的狄利克雷（Diriclet）分布中产生的。狄利克雷分布在这里起到了超参数的作用，其参数的取值往往也是未知的。但是我们可以根据一些经验值对其进行设置。除了每个文档的主题分布和主题赋值以外，我们还需要对全局的主题语言模型进行估计。这些语言模型直接决定了，各类词语出现的概率是多少。

流行的 LDA 训练方法有两个，一个是基于吉布斯采样（Gibbs Sampling）的随机方法，一个是基于变分推断（Variational Inference）的确定性方法（Deterministic）。这两种方法的初始形态都无法应对大型数据。这里我们来简要介绍一下这两种方法。

吉布斯采样主要是针对主题赋值进行采样，最开始是完全随机的结果，但是慢慢会收敛到参数的后验概率的真值。这里面比较慢的一个原因，是这个收敛过程可能需要几百到几千个不等的迭代。同时，吉布斯采样只能一个文档一个文档进行，所有的数据结构都需要在采样的过程中进行更改。这个过程比较慢的另外一个原因，是吉布斯采样的核心是如何对一个离散分布进行采样。而离散分布采样本身，如果在分布的参数变化的情况下，最好能够达到 O（KlogK），这里 K 是主题的数目。因此，从原理上来说，这也是阻碍吉布斯采样能够扩展到大型数据的一个原因。

变分推断的思路则和吉布斯采样很不一样。它是把对隐含参数的估计问题变成一个确定性的优化问题，这样我们就可以利用种种优化算法来解决贝叶斯推断的问题。不过和吉布斯采样相比，变分推断存在一个问题，因为这种方法并不是解决原来的优化问题，因此新的优化问题可能并不能带来原来问题的解。同时，变分推断也需要一个文档一个文档单独处理，因此推广到大规模数据上有其局限性。

LDA 的大规模优化算法

顺着我们刚才提到的问题，为了把吉布斯采样和变分推断扩大到大规模数据上，学者们有针对性地做了很多探索。我们下面就分别对这两种思路展开简要的介绍。

首先，我们来看吉布斯采样。吉布斯采样慢的一个核心就是我们刚才说的，需要从一个离散分布中采样出一个样本，在我们这个例子中也就是每个单词的主题赋值。那么，有没有什么方法让这个步骤加速呢？答案是，有的。

在 KDD 2009 上发表了一篇论文《应用于流文档集合的主题模型推断的高效方法》（Efficient methods for topic model inference on streaming document collections）[1]，算是在这方面取得突出成绩的一个重要参考文献。这篇论文的主要贡献就是，对原有的采样公式进行了一个比较仔细的分析。

作者们发现，原来的吉布斯采样公式可以被分解为几个部分：和全局的语言模型有关、和文档有关以及和当前需要采样的单词有关。这是一个非常有价值的观察，之后很多加速吉布斯采样的工作基本上都采用了类似的思路，也就是试图把原始的吉布斯采样公式拆分成好几个组成部分，并且每一个部分所代表数据的变化率是不一样的。

以这篇文章提出的方法来说，全局语言模型在每个文档的采样过程中是不变的，于是这部分的计算不需要每个单词都重算。同理，只与文档相关的部分，也可以每个单词的采样过程中，只算一次，而不需要每个主题算一次。在这样一个简化了的流程里，采样速度得到了极大的提升。

在这篇文章之后，通过吉布斯采样这个方法，LDA 的采样速度还是没有得到明确的提升，直到《降低主题模型的采样复杂度》（Reducing the sampling complexity of topic models）[2] 这篇论文的出现。这篇论文获得了 KDD 2014 年的最佳论文奖。文章的思想还是针对吉布斯采样的公式，不过这一次，拆分的方法略不一样。作者们把采样的公式拆分成了与当前文档有关系的一部分，以及和当前文档没关系的全局语言模型的部分。

同时，作者们提出了一个“Alias 方法”（Alias Method），简称A 算法，来加速采样。这个 A 算法其实并不是作者们为了 LDA 发明的，而是一个普遍的可以对离散分布采样的一个算法。A 算法的核心思想是，如果我们要针对一个分布进行反复采样，那么就可以建立一种数据结构，使得这种采样只有在第一遍的时候有一定的计算成本，而后都会以 O(1) 的成本进行采样。这个方法极大地加速了 LDA 通过吉布斯采样的效率。值得一提的是，在这篇论文之后，很多研究者发布了一系列的后续工作。

那么在变分推断的道路上，有没有什么方法能够加速呢？答案依然是肯定的。

这方面的代表作无疑就是论文《LDA 的在线学习》（Online learning for Latent Dirichlet Allocation）[3]。

我们回到变分推断的场景中，把一个贝叶斯推断的问题变成了优化的问题。那么，在优化的场景里，是怎么针对大规模数据的呢？

在优化的场景里，特别是基于梯度（Gradient）的优化方法中，大数据的应用往往需要 SGD（Stochastic Gradient Descent，随机梯度下降）的方法。通俗地讲，就是在计算梯度的时候，我们不需要处理完所有的数据之后才计算一次梯度，而是针对每一个文档，都可以计算一次梯度的估计值。

作者们其实就是把这个思想给搬到了变分推断里。总的来说，新发明出来的变分推断其实就是希望能够推演出一种类似 SGD 的变分方法，这种方法在后来的很多论文中都有所应用。

总结

今天我为你梳理了 LDA 优化算法的相关知识。

一起来回顾下要点：第一，我们聊了聊 LDA 这个模型的优化算法为什么会有难度，特别是针对吉布斯采样和变分推断这两种思路来说难点在哪里；第二，我们分享了当前加速 LDA 算法的两种思路，主要讨论了两种思路的一些核心思想，希望能够起到抛砖引玉的作用。

最后，给你留一个思考题，除了在算法层面希望能够加速 LDA 以外，我们能否利用并行化对 LDA 进行加速呢？

欢迎你给我留言，和我一起讨论。

参考文献

1. Limin Yao, David Mimno, and Andrew McCallum. Efficient methods for topic model inference on streaming document collections. Proceedings of the 15th ACM SIGKDD international conference on Knowledge discovery and data mining (KDD '09). ACM, New York, NY, USA, 937-946, 2009.

2. Aaron Q. Li, Amr Ahmed, Sujith Ravi, and Alexander J. Smola. Reducing the sampling complexity of topic models. Proceedings of the 20th ACM SIGKDD international conference on Knowledge discovery and data mining (KDD '14). ACM, New York, NY, USA, 891-900, 2014.

3. Matthew D. Hoffman, David M. Blei, and Francis Bach. Online learning for Latent Dirichlet Allocation. Proceedings of the 23rd International Conference on Neural Information Processing Systems - Volume 1 (NIPS'10), 2010.

086 | 基础文本分析模型之一：隐语义分析

本周我们分享了文本挖掘中的一个重要工具 LDA（Latent Diriclet Allocation），这是一个出色的无监督学习的文本挖掘模型。

今天，我们沿着文本分析这一方向继续展开。我们首先回到一个最基础的问题，那就是文本分析的基础模型都有哪些，这些最早的模型对后面的发展都有哪些贡献和启发？

带着这些问题，我们一起来看一个叫“隐语义分析”（Latent Semantic Indexing）的技术。

隐语义分析的背景

为什么需要隐语义分析呢？隐语义分析到底发挥了怎样的历史性作用呢？

对于数据挖掘而言，文本数据算是大规模数据中，研究人员最早接触到的一类数据了。长久以来，大家都有一种直观的想法，那就是在这些看似没有头绪的文字中，究竟有没有隐含着某些规律呢？我们到底能不能从文字中提取出一些更加有用的结构性的内容呢？

对于文本分析，有一类是基于“显式”的标签来进行的。也就是说，我们可以把文本分析当作是监督学习的任务来看待。这一类文本分析的一大特点，往往是针对某一种任务建立分类器，然后对不同类别的文本进行鉴别，从而达到更加深入理解文本的目的。比如，我们需要理解不同情感的文字的时候，通常情况下，我们需要有一个数据集，能够告诉我们哪些文档是“正面情绪”的，哪些是“负面情绪”的。

然而，并不是所有的文本分析任务都是建立在有数据标签的基础之上。实际上，对于绝大多数文本数据而言，我们事先是并没有标签信息的。那么，在没有标签信息的场景下，如何对文本提取关键信息就成为了研究人员长期面对的一个关键挑战。

如果我们用今天的眼光来看，隐语义分析的核心其实就是用无监督的方法从文本中提取特性，而这些特性可能会对原文本的深层关系有着更好的解释。

其实，从 20 世纪 80 年代发展出来的隐语义分析，一直到今天利用深度学习技术来对文本的内涵进行分析，其实质都是一样的，都是看如何能够用无监督的方法提取文本特性，一个重要的区别当然是在提取办法的差异上。

隐语义分析

对隐语义分析的一个简单直白的解释就是：利用矩阵分解的概念对“词 - 文档矩阵”（Term-Document Matrix）进行分解。

在前面介绍推荐系统的时候，我们已经看到了矩阵分解可以认为是最直接的一种针对矩阵数据的分析方式。

那么，为什么我们需要对矩阵进行分解呢？

这里面的一个隐含的假设就是，“词 - 文档矩阵”是一个稀疏矩阵。什么意思？意思就是从大规模的文字信息来说，文字服从一个叫“幂定律”（Power Law Distribution）的规律。那就是绝大多数的单词仅出现很少的次数，而少数的单词会出现在很多文档中。我们也可以理解成一种变形的“20/80”原理，也就是 20% 的单词出现在 80% 的文档中。当然，文字的幂定理规则的一个直接结果就是“词 - 文档矩阵”是稀疏矩阵。这个矩阵里面有大量的零，代表很多单词都没有出现在那些文档中。

对一个稀疏矩阵，我们往往假设原有的矩阵并不能真正表示数据内部的信息。也就是说，我们认为可能会有一个结构存在于这个矩阵之中。而这个假设，就是我们经常会在矩阵分解这个语境中提到的“低维假设”（Low-rank Approximation）。你不必去担心这个低维假设的本质意义，我们只需要理解这个低维假设的核心，就是我们可以用比较少的维度来表达原来的这个稀疏的矩阵。

试想我们拥有一个 N 乘 M 的“词 - 文档矩阵”，也就是说我们有 N 个单词，M 个文档。在这个稀疏矩阵的数据中，矩阵分解的基本思想是希望得到一个 N 乘以 K 的单词矩阵，以及一个 K 乘以 M 的文档矩阵。K 是一个事先指定好的参数，这也是矩阵分解的一个核心问题，那就是如何选择这个 K。我们可以看到，这种分解能够还原之前的 N 乘以 M 的“词 - 文档矩阵”。

那么，这两个新的矩阵有什么“含义”呢？人们通过对很多数据的分解以后发现，单词矩阵往往能够把一些在某种语境下的单词给聚拢。比如我们会发现，很多和体育相关的词会聚拢在某个维度下，而很多和金融相关的词会聚拢在另外一个维度下。慢慢地，大家就开始把每一个维度认定为一个“主题”。那么，基于矩阵分解的隐语义分析其实就是最早的主题模型。而文档矩阵则描述了不同文档在我们 K 个主题下的强度。

值得注意的是，我们这里为了介绍隐语义模型的实际意义而隐藏了一些实际的技术细节。从历史上看，比较流行的隐语义模型其实是基于“奇异值分解”（Singular Value Decomposition），也就是我们常常听到的SVD 分解。由于篇幅有限，我们这里就不针对 SVD 分解展开讨论了。即便是 SVD 分解，其核心思想依然是我们刚才讲到的分解出来的主题矩阵。

基于矩阵分解的隐语义模型也有其局限性，最大的一个问题就是分解出来的矩阵本身都是实数，也就是有负数和正数，这也限制了我们真正用这些数来进行一些含义的推断。然而，即便如此，在很长的一段时间里，基于 SVD 的隐语义模型可以说是标准的无监督文本挖掘的核心算法。

总结

今天我为你介绍了基于矩阵分解的隐语义模型的相关知识。

一起来回顾下要点：第一，我们聊了聊为什么需要隐语义模型；第二，我们聊了一下基于矩阵分解的隐语义模型的核心思想及其局限。

最后，给你留一个思考题，如果我们要限制矩阵分解的结果是非负数，我们应该怎么做呢？

欢迎你给我留言，和我一起讨论。

087 | 基础文本分析模型之二：概率隐语义分析

在上一篇的分享里，我们展开了文本分析这个方向，讨论了“隐语义分析”（Latent Semantic Indexing）这个模型。隐语义分析的核心是基于矩阵分解的代数方法。这种方法的好处自然是能够直接利用代数计算方法对文本进行分析，而短板则是无法很好地解释结果。而“解释性”是很多概率模型的一大优势，因此，自然就有很多研究者想到是否能够把概率的语言移植到隐语义分析上。

今天，我们就来分享“概率隐语义分析”（Probabilistic Latent Semantic Indexing）的一些基本内容。概率隐语义分析有时候又被简称为 PLSA（Probability Latent Semantic Analysis）。

隐语义分析核心思想

上周我们介绍过隐语义分析的核心思想，首先来简要回顾一下。

隐语义分析的核心其实就是用无监督的方法从文本中提取特性，而这些特性可能会对原来文本的深层关系有着更好的解释。

简单来说，隐语义分析就是利用了“矩阵分解”的概念，从而对“词 - 文档矩阵”（Term-Document Matrix）进行分解。

概率隐语义分析

既然概率隐语义分析是利用概率的语言，那么我们就来看看概率隐语义分析是如何对文档进行建模的。

首先，PLSA 是对文档和里面单词的联合分布进行建模。这个文档和单词的联合分布其实就是类似隐语义分析中的那个文档和单词的矩阵。只不过，在 PLSA 里，我们不是直接对数据进行建模，而是认为数据是从某个分布中产生的结果。那么，对于这个联合分布该如何建模呢？

一种方法就是对这个联合分布直接进行建模，但是这往往会遇到数据不足的情况，或者无法找到一个合适的已知参数的分布来直接描述我们需要建模的这个联合分布。另外一种经常使用的方法就是简化这个联合分布，从而找到我们可以建模的形式。

那么，如何简化联合分布呢？一种方法就是把一个联合分布进行分解。

一种分解分布的方法就是假定一些隐含的变量，然后数据又是从这些隐含变量中产生而来。在我们现在的情况里，我们从文档和单词的联合分布入手，可以做出这样的假设：这个文档和单词的联合分布是，我们首先从文档出发，产生了当前所需要的主题（比如金融、运动等），然后再从主题出发，产生相应的单词。很明显，这里的主题是我们并不知道的隐含变量，是需要我们从数据中估计出来的。这就是 PLSA 模型的基本假设。

PLSA 还有一个等价的模型描述，也是对文档单词联合分布的另外一种分解，那就是，我们首先假设有一个主题的先验概率，然后根据这个主题的分布，产生了一个文档，同时，也产生了这个文档里面的所有单词。这种假设观点非常类似我们之前在介绍高级的主题模型时谈到的“下游方法”（Down-Stream）。这里，文档变量和单词变量都成为了隐变量，也就是主题变量的下游变量。

通过一定的代数变形，我们可以得到这两种方法其实就是等价的。

如果我们按照第一种分解方法来认识文档单词分布，有一种更加通俗的解释：我们其实是给每一个单词都联系了一个未知的主题变量，这个主题变量是从一个文档级别的主题分布得来的，实际上，这是一个多项分布（Multinomial Distribution）；然后，根据这个主题变量，我们又从相应的一个语言模型中，抽取出了当前的单词，这又是另外的一个多项分布。如果从这个角度来看待这个模型，你会发现，PLSA 其实和 LDA 非常相似。

实际上，从模型的根本特征上来说，PLSA 和 LDA 都是对文档单词分布的一种分解，或者叫作产生解释。只不过，LDA 针对刚才我们所说的两个多项分布，一个是每个文档的主题分布，另外一个是 K 个语言模型，都外加了先验分布，使得整个模型更加符合贝叶斯统计的观点。然而在建模的核心思想上，PLSA 和 LDA 是一样的。

关于如何学习 PLSA 这样的隐变量模型，我将会在后面的分享中和你详细讨论。

总结

今天我为你介绍了基于概率模型的隐语义模型的相关知识。

一起来回顾下要点：第一，我们简要回顾了隐语义模型的重要性；第二，我们讨论了基于概率语言的隐语义模型的核心思想，以及 PLSA 和 LDA 的联系和区别。

最后，给你留一个思考题，PLSA 的建模流程有没有什么局限性？

欢迎你给我留言，和我一起讨论。

088 | 基础文本分析模型之三：EM算法

周一我们分享的模型是“概率隐语义分析”（Probabilistic Latent Semantic Indexing），或者简称为 PLSA，这类模型有效地弥补了隐语义分析的不足，在 LDA 兴起之前，成为了有力的文本分析工具。

不管是 PLSA，还是 LDA，其模型的训练过程都直接或者间接地依赖一个算法，这个算法叫作“期望最大化”（Expectation Maximization），或简称为 EM 算法。实际上，EM 算法是针对隐参数模型（Latent Variable Model）最直接有效的训练方法之一。既然这些模型都需要 EM 算法，我们今天就来谈一谈这个算法的一些核心思想。

EM 和 MLE 的关系

EM 算法深深根植于一种更加传统的统计参数方法：最大似然估计（Maximum Likelihood Estimation），有时候简称为 MLE。绝大多数的机器学习都可以表达成为某种概率模型的 MLE 求解过程。

具体来说，MLE 是这样构造的。首先，我们通过概率模型写出当前数据的“似然表达”。所谓的“似然”表达，其实也就是在当前模型的参数值的情况下，看整个数据出现的可能性有多少。可能性越低，表明参数越无法解释当前的数据。反之，如果可能性非常高，则表明参数可以比较准确地解释当前的数据。因此，MLE 的思想其实就是找到一组参数的取值，使其可以最好地解释现在的数据。

针对某一个模型写出这个 MLE 以后，就是一个具体的式子，然后看我们能否找到这个式子最大值下的参数取值。这个时候，整个问题往往就已经变成了一个优化问题。从优化的角度来说，那就是针对参数求导，然后尝试把整个式子置零，从而求出在这个时候的参数值。

对绝大多数相对比较简单的模型来说，我们都可以根据这个流程求出参数的取值。比如，我们熟悉的利用高斯分布来对数据进行建模，其实就可以通过 MLE 的形式，写出用高斯建模的似然表达式，然后通过求解最优函数解的方式得到最佳的参数表达。而正好，这个最优的参数就是样本的均值和样本的方差。

然而，并不是所有的 MLE 表达都能够得到一个“解析解”（Closed Form Solution），有不少的模型甚至无法优化 MLE 的表达式，那么这个时候，我们就需要一个新的工具来求解 MLE。

EM 算法的提出就是为了简化那些求解相对比较困难模型的 MLE 解。

有一点需要说明的是，EM 算法并不能直接求到 MLE，而只能提供一种近似。多数无法直接求解的 MLE 问题都属于非凸（Non-Convex）问题。因此，EM 能够提供的仅仅是一个局部的最优解，而不是全局的最优解。

EM 算法的核心思想

理解了 EM 和 MLE 的关系后，我们来看一看 EM 的一些核心思想。因为 EM 算法是技术性比较强的算法，我建议你一定要亲自去推演公式，从而能够真正理解算法的精髓。我们在这里主要提供一种大体的思路。

EM 算法的一种解释是这样的。首先，我们可以通过代数变形，为每一个数据点的似然公式找到一个新的概率分布，而这个概率分布是通过一个隐含变量来达到的。很明显，在理论上，我们可以通过把这个隐含变量积分掉来达到恢复原始的 MLE 公式的目的。

然而，这里遇到的一个大的阻碍就是，在 MLE 公式里面，有一个求对数函数（log）在这个积分符号外面。这就导致整个式子无法进行操作。通俗地讲，EM 就是要针对这样的情况，试图把这个在积分符号之外的求对数函数拿到积分符号里面。能够这么做，是因为有一个不等式，叫“杨森不等式”。你不需要去理解杨森不等式的细节，大体上这个不等式是说，函数的期望值要大于或等于先对函数的变量求期望然后再对其作用函数。

于是，在这样的一个不等式的引领下，我们刚才所说的积分，其实就可以被看作是对某一个函数求期望值。而这个函数，恰好就是模型的似然表达。通过杨森不等式，我们可以把对数函数拿到积分符号里面，这样当然就无法保持等号了，也就是说，这一步的操作不是一个等值操作。利用杨森不等式之后的式子其实是原来的式子，也就是含有隐含变量的 MLE 式的一个“下限”（Lower Bound）。

利用杨森不等式，从而写出一个原始的 MLE 的下限，是标准的 EM 算法以及一系列基于变分 EM（Variational EM）算法的核心思想。这么做的目的其实就是把对数函数从积分的外面给拿到里面。

当我们有了这个下限之后，我们就可以套用 MLE 的一切流程了。注意，这时候，我们有两组未知数。一组未知数是我们模型的参数，另外一组未知数就是模型的隐含变量。于是，当得到下限之后，我们就需要对这两组未知数分别求导，并且得到他们的最优表达。

当我们按照当前的模型参数，对模型的隐含变量所对应的概率分布求解后，最优的隐含变量的概率分布就等于隐含变量基于数据的后验概率。什么意思呢？意思就是说，如果我们把隐含变量的取值直接等于其后验概率分布，就得到了当前的最优解。这个步骤常常被叫作“E 步”。

在进行了 E 步之后，我们再按照当前的隐含变量，求解这个时候最佳的模型参数。这常常被认为是“M 步”。一次 E 步，一次 M 步则被认为是 EM 算法的一个迭代轮回。

EM 算法貌似很神秘，但如果我们理解了整个流程的精髓，就可以把这个算法总结为：EM 算法是利用杨森不等式得到 MLE 的一个下限，并且优化求解模型参数和模型的隐含变量的一个过程。

掌握了这个精髓，我们就可以看到，为什么 LDA 和 PLSA 等隐变量模型需要利用 EM 或者类似 EM 的步骤进行求解。第一，这些模型的 MLE 都有一个对数函数在积分符号外面，使得这个过程无法直接求解。第二，这些模型本身就有隐含变量，因此不需要额外制造新的隐含变量。

总结

今天我为你介绍了一个经常用于求解概率图模型的 EM 算法。

一起来回顾下要点：第一，我们回顾了 EM 算法和 MLE 算法的关系；第二，我们讨论了 EM 算法的核心思想。

最后，给你留一个思考题，EM 算法在实际应用中有哪些问题呢？

欢迎你给我留言，和我一起讨论。

089 | 为什么需要Word2Vec算法？

至此，关于文本分析这个方向，我们已经介绍了 LDA（Latent Diriclet Allocation），这是一个出色的无监督学习的文本挖掘模型。还有“隐语义分析”（Latent Semantic Indexing），其核心是基于矩阵分解的代数方法。接着，我们分享了“概率隐语义分析”（Probabilistic Latent Semantic Indexing），这类模型有效地弥补了隐语义分析的不足，成为了在 LDA 兴起之前的有力的文本分析工具。我们还介绍了EM（Expectation Maximization）算法，这是针对隐参数模型最直接有效的训练方法之一。

今天，我们进入文本分析的另外一个环节，介绍一个最近几年兴起的重要文本模型，Word2Vec。可以说，这个模型对文本挖掘、自然语言处理、乃至很多其他领域比如网络结构分析（Network Analysis）等都有很重要的影响。

我们先来看 Word2Vec 的一个最基本的形式。

Word2Vec 背景

了解任何一种模型或者算法都需要了解这种方法背后被提出的动机，这是一种能够拨开繁复的数学公式从而了解模型本质的方法。

那么，Word2Vec 的提出有什么背景呢？我们从两个方面来进行解读。

首先，我们之前在介绍 LDA 和 PLSA 等隐变量模型的时候就提到过，这些模型的一大优势就是在文档信息没有任何监督标签的情况下，能够学习到文档的“隐含特性”。这也是文档领域“表征学习”（Representation Learning）的重要工具。遗憾的是，不管是 LDA 还是 PLSA 其实都是把文档当作“词包”（Bag Of Word），然后从中学习到语言的特征。

这样做当然可以产生不小的效果，不过，从自然语言处理，或者是文档建模的角度来说，人们一直都在探讨，如何能够把单词的顺序利用到学习表征里。什么意思呢？文档中很重要的信息是单词的顺序，某一个特定单词组合代表了一个词组或者是一个句子，然后句子自然也就代表着某种语义。词包的表达方式打破了所有词组顺序以及高维度的语义表达，因此长期以来被认为并不能真正学习到语言的精华。

然而，在主题模型这个大旗帜下，已经有不少学者和研究员试图把词序和语义给加入到模型中，这些尝试都没有得到很好的效果，或者模型过于复杂变得不适用。于是，大家都期待着新的工具能够解决这方面的问题。

另外一个思路也是从词包发展来的。词包本身要求把一个词表达成为一个向量。这个向量里只有一个维度是 1，其他的维度都是 0。因为每个词都表达成为这样离散的向量，因此词与词之间没有任何的重叠。既然两个离散的向量没有重叠，我们自然也就无法从这个离散的词包表达来推断任何词语的高维度语义。这也是为什么大家会利用主题模型从这个离散的词包中抽取主题信息，从而达到理解高维度语义的目的。

既然我们的目的是从离散的词包中获取更加丰富的信息，那有没有另外的方法或者途径能够达到这个目的呢？一种基本的假设是这样的：如果我们能够从离散的向量里面抽取出每个词组的“连续”（Continuous）信息向量，假设两个词有相近的意思，那么这两个词的联系向量势必就会比较相近，这样我们就能够通过词向量（只不过是连续向量），来得到词汇的高级语义信息。这个假设常常被叫作词的“分布假设”（Distributed Assumption）。

了解了以上这两个方面后，我们再来理解 Word2Vec，可能就比较容易明白这个模型究竟想要干什么了。

Word2Vec 模型摘要

首先我们需要说明的是，Word2Vec 是一种语言模型，主要是根据当前的语境，来预测下一个单词出现的概率，也就是和我们之前所说的产生式模型相似，看是否能够从模型中产生单词。这和我们介绍的主题模型是不一样的，在这个模型里，我们并没有假定数据（也就是单词）是从某几个主题中产生的。

Word2Vec 的核心思想是，当前的单词是从周边单词的隐含表达，或者说是词向量中产生的。也就是说，每一个单词都依赖于上下文，而这个单词的产生，并不是直接依赖周围单词的离散表达，而是依赖周边单词的连续表达。这个连续表达自然是事先不知道的，因此这就是 Word2Vec 模型需要学习的未知参数。

在具体的操作上，Word2Vec 有两个不太一样的模型，但是经常被同等程度地使用。我们这里做一个简单的介绍。

第一种模型叫作Skip-Gram，或者简称SG 模型。这种模型的输入是一个词，输出是这个词周围的词。这样做的目的是，看我们能否用当前的词来预测周围的词。要想让这个任务有很好的表现，当前词的表征必须能够抓住某种语义的信息。具体来说，我们就是用当前词的表征向量，和所有其他词的表征向量做点积，然后再重新归一。这个过程就能够保证，当前词的表征向量和周围词的表征向量相似。这样，也就解决了我们之前提到的，如何能够把词序影响到词的表征向量中。

另外一种模型叫作Continuous-Bag-of-Word，有时候简称CBOW 模型。这种模型刚好和 SG 是相反的，也就是输入是一组词汇，而希望能够通过这组词汇得到中间某个词的预测。和我们刚才所说的一样，这个模型也是基于我们并不知道的表征向量来达到模型学习的目的。

不管是 SG 还是 CBOW，本质上，就是希望能够利用文章的上下文信息学习到连续空间的词表达，这是 Word2Vec 所有模型的核心。

SG 和 CBOW 在具体的应用中，常常需要比较复杂的训练算法，我们这里就不展开讨论了。如果你有兴趣可以进一步阅读一些论文。

总结

今天我为你介绍了 Word2Vec 模型的基本含义。

一起来回顾下要点：第一，我们介绍了 Word2Vec 这个模型是怎么被开发出来的，它背后有哪些原理；第二，我们讨论了 SG 和 CBOW 这两种非常典型的 Word2Vec 模型。

最后，给你留一个思考题，和 LDA 相比，Word2Vec 好在哪里，又有什么不足的地方？

欢迎你给我留言，和我一起讨论。

090 | Word2Vec算法有哪些扩展模型？

从上一期的分享开始，我们进入到文本分析的另外一个环节，那就是介绍一个最近几年兴起的重要文本模型，Word2Vec。这个模型对文本挖掘、自然语言处理等很多领域都有重要影响。我们讨论了 Word2Vec 模型的基本假设，主要是如何从离散的词包输入获得连续的词的表达，以及如何能够利用上下文从而学习到词的隐含特性。我们还聊了两个 Word2Vec 模型，SG（SkipGram）模型和 CBOW（Continuous-Bag-of-Word）模型，讨论了它们都有什么特性以及如何实现。

今天，我们就来看一看Word2Vec 的一些扩展模型。

Word2Vec 的扩展思路

在列举几个比较知名的 Word2Vec 扩展模型之前，我们首先来看看这个模型怎么进行扩展。

首先，我们来回忆一下 Word2Vec 的一个基本的性质，那就是这是一个语言模型。而语言模型本身其实是一个离散分布模型。我们一起来想一想，什么是语言模型？语言模型就是针对某一个词库（这里其实就是一个语言的所有单词），然后在某种语境下，产生下一个单词的模型。也就是说，语言模型是一个产生式模型，而且这个产生式模型是产生单词这一离散数据的。

既然是这样，如果我们更改这个词库，变成任何的离散数据，那么，Word2Vec 这个模型依然能够输出在新词库下的离散数据。比如，如果我们把词汇库从英语单词换成物品的下标，那 Word2Vec 就变成了一个对物品的序列进行建模的工具。这其实就是扩展 Word2Vec 的一大思路，那就是如何把 Word2Vec 应用到其他的离散数据上。

扩展 Word2Vec 的第二大思路，则是从 Word2Vec 的另外一个特性入手：上下文的语境信息。我们在之前的介绍中也讲过，这个上下文信息是 Word2Vec 成功的一个关键因素，因为这样就使得我们学习到的词向量能够表达上下文的关联所带来的语义信息。这也是传统的主题模型（Topic Model）例如 LDA 或者 PLSA 所不具备的。那么，我们能不能对这个上下文进行更换，从而使得 Word2Vec 能够产生完全不一样的词向量呢？答案是肯定的，这也是 Word2Vec 扩展的重要思路。

除此以外，还有一个重要的分支，那就是很多研究者都希望往 Word2Vec 里增加更多的信息，比如文档本身的信息，段落的信息以及其他的辅助信息。如何能够让 Word2Vec 对更多信息建模也是一个重要的扩展思路。

Word2Vec 的三个扩展

我们要介绍的第一个扩展是由 Word2Vec 作者本人提出的，就是把学习词向量的工作推广到句子和文章里，在论文《句子和文档的分布表示》（Distributed representations of sentences and documents）[1] 里进行了详细的阐述。这个扩展主要是解决如何能够更加“自然”地学习到比词这个单位更大的单位（比如段落或者文档）的隐含向量。

当 Word2Vec 被发明之后，很多研究者都发现这是一个能够把离散的词表达成连续向量的利器。然而，一个应用场景很快就成为了大家的拦路虎，那就是 Word2Vec 仅仅是在词一级数据上进行建模，却无法直接得到文档一级的隐含信息。

有一种做法是这样的，比如针对一个句子或者一个段落，我们就把这个句子里的词所使用的词向量加权平均，认为这个加权平均过的结果就是段落的向量了。很明显，这是一种非常不精确的处理方法。

那么，这篇文章的核心则是如何能够在模型本身上进行修改，从而可以学习到比词更加高一层级单元的隐含向量。具体的做法，就是修改原始 Word2Vec 的上下文信息。我们回忆一下 SG 模型和 CBOW 模型都有一个关键的信息，那就是利用上下文，也就是一个句子周围的词来预测这个句子或者上下文中间的一个词。这就是 Word2Vec 能够利用上下文信息的原因。那么这里的修改就是让这个上下文始终都有一个特殊的字符，也就是当前段落或者文章的下标，从而这个下标所对应的隐含向量就是我们所要学习到的段落或者文档的向量。在这样的情况下，作者们通过实验发现，学到的段落向量要比单独用加权平均的效果好得多。

我们要看的第二个扩展，来自论文《线：大规模信息网络嵌入》（LINE: Large-scale Information Network Embedding）[2]，就是把 Word2Vec 的思想扩展到了另外一种离散数据图（Graph）的表达上。

刚才我们提到，只要是离散的数据，Word2Vec 都有可能被应用上。那么，图的数据建模的场景是什么呢？我们设想一个社交网络（Social Network）的数据。每一个用户都有可能和其他用户相连，而两两相连的用户所组成的整个网络就是社交网络的庞大的用户信息。很明显，如果我们把用户看作单词，那么整个社交网络就是一个单词和单词的网络。如果我们把两个单词（在这里是用户）之间的连线看成是单词出现在一起的上下文，那么，我们其实就可以利用 Word2Vec 这样的模型对社交网络所表达图进行建模。这就是这篇文章里作者们利用 Word2Vec 对社交网络建模的核心思想。

当然，和在文档中不同，在图里面，上下文这一关系其实是比较难以定义的。因此，很多后续的工作都是关于如何更加有效地定义这一上下文关系。

最后，我们结合论文《用于支持搜索中查询重写的上下文和内容感知嵌入》（Context- and Content-aware Embeddings for Query Rewriting in Sponsored Search）[3] 来看另一个 Word2Vec 的扩展。这个扩展是尝试在查询关键词和用户点击的网页之间建立上下文关系，使得 Word2Vec 模型可以学习到查询关键词以及网页的隐含向量。

这也就是我们提到的，巧妙地搭建上下文关系，使得模型可以学习到离散数据的隐含表达。你可能比较好奇，这里的离散数据是什么呢？这里有两组离散数据：第一组就是每一个查询关键词，这完全可以按照 Word2Vec 原本的定义来走；第二组离散数据，就是每一个网页。注意，这里不是网页的内容，而是某一个网页作为一个下标。那么，从模型的角度上来说，这里我们要做的就是利用查询关键词来预测网页出现的概率。

总结

今天我为你介绍了 Word2Vec 模型扩展的一些基本思路和一些实际的案例。

一起来回顾下要点：第一，我们讨论了 Word2Vec 这个模型需要扩展的思路，比如从离散数据入手或者从上下文入手；第二，我们分享了三个比较经典的 Word2Vec 扩展。

最后，给你留一个思考题，Word2Vec 能否扩展到连续数据中呢？

欢迎你给我留言，和我一起讨论。

参考文献

1. Quoc Le and Tomas Mikolov. Distributed representations of sentences and documents. Proceedings of the 31st International Conference on International Conference on Machine Learning - Volume 32 (ICML'14), Eric P. Xing and Tony Jebara (Eds.), Vol. 32. JMLR.org II-1188-II-1196, 2014.

2. Jian Tang, Meng Qu, Mingzhe Wang, Ming Zhang, Jun Yan, and Qiaozhu Mei. LINE: Large-scale Information Network Embedding. Proceedings of the 24th International Conference on World Wide Web (WWW '15). International World Wide Web Conferences Steering Committee, Republic and Canton of Geneva, Switzerland, 1067-1077, 2015.

3. Mihajlo Grbovic, Nemanja Djuric, Vladan Radosavljevic, Fabrizio Silvestri, and Narayan Bhamidipati. Context- and Content-aware Embeddings for Query Rewriting in Sponsored Search. Proceedings of the 38th International ACM SIGIR Conference on Research and Development in Information Retrieval (SIGIR '15). ACM, New York, NY, USA, 383-392, 2015.

091 | Word2Vec算法有哪些应用？

周一，我们分享了三个比较有代表意义的 Word2Vec 的扩展模型，主要有两种思路，从词的上下文入手重新定义上下文，或者对完全不同的离散数据进行建模。

今天，我们来看一看Word2Vec 在自然语言处理领域的应用。如果我们已经通过 SG 模型、CBOW 模型或者其他的算法获得了词向量，接下来我们可以把这些词向量用于什么样的任务中呢？

Word2Vec 的简单应用

最直接的也是最常见的 Word2Vec 应用就是去计算词与词之间的相似度。当我们的数据还是原始的“词包”（Bag of Word），这时候是没法计算词与词之间的相似度的，因为每个词都被表示为某个元素为 1 其余元素都为 0 的离散向量。按照定义，两个离散向量之间的相似度都是 0。因此，从词包出发，我们无法直接计算词与词之间的相似度，这是从定义上就被限制了的。

Word2Vec 就是为了跨越这个障碍而被发明的，这一点我们在前面就已经提到过了。所以，当我们可以用 Word2Vec 的词向量来表示每一个单词的时候，我们就可以用“余弦相关度”（Cosine Similarity）来对两个词向量进行计算。余弦相关度其实就是计算两个向量的点积，然后再归一化。如果针对已经归一化了的向量，我们就可以直接采用点积来表达两个向量的相关度。不管是余弦相关度还是点积，我们都假设计算结果的值越大，两个词越相关，反之则不相关。

既然我们可以计算两个词的相关度，那么很多依赖相关度的任务就都能够轻松完成。比如，我们希望把词进行聚类，也就是说把相关的词都聚合在一起。通常的聚类算法都可以直接使用，比如我们熟悉的“K 均值”算法。这些算法的核心是计算两个数据点的距离，就可以利用我们刚刚讲的余弦相关度来实现。

我们在谈 Word2Vec 扩展模型的时候，曾经提到了一些扩展模型，可以用于表达比词这个单位更大的文本单元，比如段落和文档向量的获取。其实，当时我们就提到了一种可以得到这些单元向量的简单方法，那就是直接利用 Word2Vec 来进行加权平均。在获得了词向量之后，我们就可以用一个文档里所有词的加权平均，甚至是简单的叠加来达到表达文档的目的。这个时候，我们也就可以利用诸如余弦相关度来计算文档之间的相关度了。

另外一个随着 Word2Vec 的推出而大放异彩的应用则是“词语的类比”。Word2Vec 的原作者们用类比来表达，这种词向量能够完成一些与众不同的任务。词向量本质上就是一个连续空间的向量，因此从数学上来说，这种向量其实可以进行任何“合规”的运算，比如加、减、乘、除。于是，作者们就利用向量的加减关系，来看能否得到有意义的结果，而得到的结果令人吃惊。

比如，如果我们把“国王”（King）这个单词的向量减去“男人”（Man）这个向量然后加上“女人”（Woman）这个向量，得到的结果，竟然和“王后”（Queen）这个向量非常相近。类似的结果还有“法国”（France）减去“巴黎”（Paris）加上“伦敦”（London）等于“英格兰”（England）等。对于传统的方法来说，这样的行为是无法实现的。因此，Word2Vec 的流行也让这种词语的类比工作变得更加普遍起来。

Word2Vec 的其他使用

在自然语言处理中有一系列的任务，之前都是依靠着“词包”这个输入来执行的。当我们有了 Word2Vec 之后，这些任务都可以相对比较容易地用“词向量”来替代。

一类任务就是利用词来进行某种分类任务。比如，我们希望知道某些文档是属于什么类别，或者某些文档是不是有什么感情色彩，也就是通常所说的“基于监督学习的任务”。词向量会成为很多文本监督学习任务的重要特性。在诸多的实验结果中，得到的效果要么好于单独使用词包，要么在和词包一起使用的情况下要好于只使用词包。

在进行监督学习的任务中，词向量的重要性还体现于其对深度学习架构的支持。众所周知，即便是最简单的深度学习架构，比如多层感知器，都需要输入的数据是连续的。如果我们直接面对离散的文本数据，常常需要把这些离散的文本数据学习成为连续的向量，其实就是在学习 Word2Vec。经过了这一层的转换之后，我们往往再利用多层的神经网络结果对这些信号进行处理。

在很多实践中人们发现，与其利用不同的任务来学习相应的词向量，还不如直接拿在别的地方学好的词向量当做输入，省却学习词向量这一个步骤，而结果其实往往会有效果上的提升。这种使用词向量的方法叫作“提前训练”（Pre-trained）的词向量。其实，不仅仅是在简单的多层感知器中，甚至是在 RNN 等更加复杂的深度架构中，也都更加频繁地利用提前训练的词向量。

总结

今天我为你介绍了 Word2Vec 模型在各种实际任务中的应用。

一起来回顾下要点：第一，我们聊了 Word2Vec 这个模型的一些简单应用，比如如何计算词与词之间的相关度，以及如何进行词的类比计算；第二，我们讨论了如何利用词向量进行更加复杂的自然语言任务的处理。

最后，给你留一个思考题，Word2Vec 和主题模型提供的向量，是互补的还是可以相互替换的呢？

欢迎你给我留言，和我一起讨论。

092 | 序列建模的深度学习利器：RNN基础架构

前面我们介绍了一个重要的文本模型，Word2Vec，我们聊了这个模型的基本假设，模型实现，一些重要的扩展，以及其在自然语言处理各个领域的应用。

接下来，我们来讨论更加复杂的基于深度学习的文本分析模型。这些模型的一大特点就是更加丰富地利用了文字的序列信息，从而能够对文本进行大规模建模。

今天，我们首先来看一看，序列建模的深度学习利器 RNN（Recurrent Neural Network，递归神经网络）的基本架构。

文本信息中的序列数据

我们在之前介绍 Word2Vec 的时候，讲了为什么希望能够把上下文信息给融入到模型当中去。一个非常重要的原因，就是在最早的利用“词包”（Bag of Word）的形式下，离散的词向量无法表达更多的语义信息。那么，从文本的角度来讲，很多研究人员都面对的困扰是，如何对有序列信息的文本进行有效的建模？同时，对于广大文本挖掘的科研工作者来说，这也是大家心中一直深信不疑的一个假设，那就是对文字的深层次的理解一定是建立在对序列、对上下文的建模之中。

你可能有一个疑问，文字信息中真的有那么多序列数据吗？

其实，从最简单的语义单元“句子”出发，到“段落”，到“章节”，再到整个“文章”。这些文字的组成部分都依赖于对更小单元的序列组合。例如，句子就是词语的序列，段落就是句子的序列，章节就是段落的序列等等。不仅是“词包假设”无法对这样的序列进行建模，就算是我们之前提到的 Word2Vec 等一系列学习词向量或者段落向量的方法，也仅仅能考虑到一部分的上下文信息。

还有更加复杂的文字序列，比如对话。人与人的对话很明显是有顺序的。两个人之间进行对话，当前所说的字句都是根据对方的回应以及整个对话的上下文所做出的选择。如果要对这样复杂的文字序列进行建模，传统的不考虑序列的模型方法是肯定不能奏效的。

那么，传统的机器学习领域，有没有能够对时序信息建模的工具或者模型呢？

传统机器学习中的序列模型

在传统的机器学习领域当然有不少模型是针对序列进行建模的。最经典的要数“隐马尔科夫模型”（Hidden Markov Model），有时候又简称为 HMM。在比较长的一段时间里，HMM 都是常用的对序列建模的缺省（Default）模型。我们今天的分享不是专门针对 HMM 模型，但是对 HMM 的一个简单介绍，有助于我们理解为什么需要 RNN。

HMM 的一个最基本的假设是：当前的序列数据是根据一些隐含的状态产生的。具体来说，HMM 的架构是这样的。我们认为每个时间点都有一个对应的隐含状态。这个隐含状态只与当前这个时间点之前的时间点所对应的隐含状态有关联。更加简单的假设，也是经常使用的假设，则认为当前时间点的隐含状态，仅仅与之前最直接相邻的一个时间点的隐含状态有关，而和之前所有时间点的隐含状态都没有关系了。这类似于说今天的天气仅仅与昨天有关，和昨天之前的天气状态都没有任何关系，显然这是一个很强的假设。

从时间轴这个角度来说，HMM 是构建了一个隐含状态的一阶马尔科夫链条。这里，“一阶”是指每个状态仅与当前最邻近的状态有关。当我们构建好了隐含状态以后，就可以在这个基础上对数据进行建模了。

HMM 假定，每个时间点的数据都是从这个时间点的隐含状态产生的，而时间点所对应的数据之间并不直接产生关系。也就是说，我们假定产生数据的原因是隐含状态，而隐含状态已经通过一个链条给串联起来了，这样我们就不需要针对数据进行串联了。

HMM 虽然理解起来相对比较直观，但在实际应用中存在不少问题。比如，这个模型的表现力有限。我们刚才说了，一个普通的 HMM 假定了隐含状态的一阶性质，使得我们不能对比较长的序列进行建模，因为模型无法对其中所有的隐含状态的转换进行建模，一阶无法表达这样的关系。当然，HMM 有一阶以上的表达，但这也就带来了 HMM 的一个普遍的问题，就是训练方法比较复杂。对于一个现实问题而言，HMM 的建模会相对比较复杂，从而让训练方法更加繁复。这也就是为什么 HMM 不能适用于大规模问题的一个主要的原因。

RNN 的基本架构

在 HMM 的基础上，我们再来看一下 RNN 的基本思想。

首先，我们需要指出的是，RNN 并不是一个模型的称呼，而是一个框架。具体在这个框架内部，根据不同的需求，我们可以构造出非常不一样的模型。

第二，RNN 的一大优势是它根植于深度学习的大范畴中。RNN 的模型都可以算是特殊的深度学习模型。所以，深度学习模型的很多优化算法或者整体的计算方式也都可以无缝嫁接到 RNN 上。从这一点来看，RNN 比传统的 HMM 就有很大的相对优势。

通常来说，一个 RNN 有一个输入序列 X 和输出序列 Y，这两个序列都随着时间的变化而变化。也就是说，每一个时间点，我们都对应这一个 X 和一个 Y。和 HMM 类似的是，RNN 也假定 X 和 Y 都不独立发生变化，而他们的变化和关系都是通过一组隐含状态来控制的。

具体来说，时间 T 时刻的隐含状态有两个输入，一个输入是时间 T 时刻之前所有的隐含状态，一个输入是当前时刻，也就是时间 T 时刻的输入变量 X。时间 T 时刻的隐含状态根据这两个输入，会产生一个输出，这个输出就是 T 时刻的 Y 值。也就是说，T 时刻的输出是根据之前所有的隐含状态和这个时刻的输入决定的。

在一些简化的情况下，并不是每一个时刻都有输出的信息。比如我们需要对一个句子进行分类，这个时候，一个输出变量只在整个句子结束的时候出现。那么，在这样的情况下，Y 仅仅在最后的一个时刻出现。

这个 RNN 的参数也就是这些隐含状态。从原理上来说，可以根据标准的深度学习框架的流程加以学习。

RNN 的整个框架还可以看作是一个加码解码的过程。从已知的序列到中间隐含状态，这是一个加码的流程，而从隐含状态到最后的输出序列，这是一个解码的过程。具体的 RNN 针对这个加码解码的过程有更加详细的分工，我会在今后的分享中为你慢慢解读。

总结

今天我为你介绍了文本序列建模利器 RNN 的一个概况。

一起来回顾下要点：第一，我们讨论了为什么需要对文本的序列数据进行建模；第二，我们聊了聊传统机器学习模型是如何对序列进行建模的；第三，我们分享了 RNN 的基本的加码解码的框架。

最后，给你留一个思考题，对比 HMM，RNN 的优势有哪些？

欢迎你给我留言，和我一起讨论。

093 | 基于门机制的RNN架构：LSTM与GRU

这周，我们继续来讨论基于深度学习的文本分析模型。这些模型的一大特点就是更加丰富地利用了文字的序列信息，从而能够对文本进行大规模的建模。在上一次的分享里，我们聊了对序列建模的深度学习利器“递归神经网络”，或简称 RNN。我们分析了文本信息中的序列数据，了解了如何对文本信息中最复杂的一部分进行建模，同时还讲了在传统机器学习中非常有代表性的“隐马尔科夫模型”（HMM）的基本原理以及 RNN 和 HMM 的异同。

今天我们进一步展开 RNN 这个基本框架，看一看在当下都有哪些流行的 RNN 模型实现。

简单的 RNN 模型

为了能让你对今天要进一步介绍的 RNN 模型有更加深入的了解，我们先来回顾一下 RNN 的基本框架。

一个 RNN 通常有一个输入序列 X 和一个输出序列 Y，这两个序列都随着时间的变化而变化。也就是说，每一个时间点，我们都对应着一个 X 和一个 Y。RNN 假定 X 和 Y 都不独立发生变化，它们的变化和关系都是通过一组隐含状态来控制的。具体来说，时间 T 时刻的隐含状态有两个输入，一个输入是时间 T 时刻之前的所有隐含状态，一个输入是当前时刻，也就是时间 T 时刻的输入变量 X。时间 T 时刻的隐含状态根据这两个输入，会产生一个输出，这个输出就是 T 时刻的 Y 值。

那么，在这样的一个框架下，一个最简单的 RNN 模型是什么样子的呢？我们需要确定两个元素。第一个元素就是在时刻 T，究竟如何处理过去的隐含状态和现在的输入，从而得到当前时刻的隐含状态，这是一个需要建模的元素。第二，如何从当前的隐含状态到输出变量 Y，这是另外一个需要建模的元素。

最简单的 RNN 模型对这两个建模元素是这样选择的。通常情况下，在时间 T-1 时刻的隐含状态是一个向量，我们假设叫 St-1，那么这个时候，我们有两种选择。

第一种选择是用一个线性模型来表达对当前时刻的隐含状态 St 的建模，也就是把 St-1 和 Xt 当作特性串联起来，然后用一个矩阵 W 当作是线性变换的参数。有时候，我们还会加上一个“偏差项”（Bias Term），比如用 b 来表示。那么在这样的情况下，当前的隐含状态可以认为是“所有过去隐含状态以及输入”的一阶线性变换结果。可以说，这基本上就是最简单直观的建模选择了。

第二种选择是如何从 St 变换成为 Y。这一步可以更加简化，那就是认为 St 直接就是输出的变量 Y。这也就是选择了隐含状态和输出变量的一种一一对应的情况。

在这个最简单的 RNN 模型基础上，我们可以把第一个转换从线性转换变为任何的深度模型的非线性转换，这就构成了更加标准的 RNN 模型。

LSTM 与 GRU 模型

我们刚刚介绍的 RNN 模型看上去简单直观，但在实际应用中，这类模型有一个致命的缺陷，那就是实践者们发现，在现实数据面前根本没法有效地学习这类模型。什么意思呢？

所有的深度学习模型都依赖一个叫作“反向传播”（Back-Propagation）的算法来计算参数的“梯度”，从而用于优化算法。但是，RNN 的基本架构存在一个叫作“梯度爆炸”或者“梯度消失”的问题。对于初学者而言，你不需要去细究这两种梯度异常的细节，只需要知道在传统的 RNN 模型下，这两种梯度异常都会造成优化算法的迭代无法进行，从而导致我们无法学习到模型的参数这一结局。

想要在现实的数据中使用 RNN，我们就必须解决梯度异常这一问题。而在解决梯度异常这个问题的多种途径中，有一类途径现在变得很流行，那就是尝试在框架里设计“门机制”（Gated Mechanism）。

这个门机制的由来主要是着眼于一个问题，那就是在我们刚才介绍的简单的 RNN 模型中，隐含变量从一个时间点到另一个时间点的变化，是“整个向量”变换为另外的“整个向量”。研究人员发现，我们可以限制这个向量的变化，也就是说我们通过某种方法，不是让整个向量进行复制，而是让这个隐含向量的部分单元发生变化。

如果要达到这样的效果，我们就必须设计一种机制，使得这个模型知道当前需要对隐含向量的哪些单元进行复制，哪些单元不进行复制而进行变化。我们可以认为，进行复制的单元是它们被屏蔽了“进行转换”这一操作，也可以认为它们被“门”阻挡了，这就是“门机制”的来源。

从逻辑上思考，如何设计“门机制”从而起到这样的作用呢？一种方式就是为隐含变量引入一个伴随变量G。这个伴随变量拥有和隐含变量一样的单元个数，只不过这个伴随变量的取值范围是 0 或者 1，0 代表不允许通过，1 代表可以通过。这其实就是门机制的一个简单实现。我们只需要利用这个向量和隐含向量相应单元相乘，就能实现控制这些单元的目的。当然，这只是一个逻辑上的门机制，实际的门机制要有更多细节，也更加复杂。

基于门机制的 RNN 架构都有哪些呢？这里介绍两个比较流行的，分别是 LSTM 和 GRU。我们这里不对这些模型展开详细的讨论，而是给你一个直观的介绍，帮助你从宏观上把握这些模型的核心思想。

LSTM的思路是把隐含状态分为两个部分。一部分用来当作“存储单元”（Memory Cells），另外一部分当作“工作单元”（Working Memory）。存储单元用来保留信息，并且用来保留梯度，跨越多个时间点。这个存储单元是被一系列的门控制，这些门，其实是数学函数，用来模拟刚才我们说的门的机制。对于每一步来说，这些门都要决定到底需要多少信息继续保留到下一个时间点。

总体来说，LSTM 模型的细节很多，也很复杂。虽然 LSTM 已经成为了一种典型而且成功的 RNN 模型，但是实践者们还是觉得这个模型可以简化，于是就催生了 GRU 模型。

GRU模型的核心思想其实就是利用两套门机制来决定隐含单元的变化。一个门用于决定哪些单元会从上一个时间点的单元里复制过来，并且形成一个临时的隐含状态，另外一个门则控制这个临时状态和过去状态的融合。GRU 在结构上大大简化了 LSTM 的繁复，在效果上依然能够有不错的表现。

总结

今天我为你介绍了文本序列建模利器 RNN 的几个实例。

一起来回顾下要点：第一，我们复习了 RNN 的基本概念和框架；第二，我们聊了两个带有门机制的经典的 RNN 模型，分别是 LSTM 和 GRU。

最后，给你留一个思考题，RNN 需要门机制，你认为到底是建模的需要，还是需要解决梯度异常的问题从而能够让优化算法工作？

欢迎你给我留言，和我一起讨论。

094 | RNN在自然语言处理中有哪些应用场景？

周一我们进一步展开了 RNN 这个基本框架，讨论了几个流行的 RNN 模型实现，从最简单的 RNN 模型到为什么需要“门机制”，再到流行的 LSTM 和 GRU 框架的核心思想。

今天，我们就来看一看 RNN 究竟在自然语言处理的哪些任务和场景中有所应用。

简单分类场景

我们首先来聊一种简单的分类场景。在这种场景下，RNN 输入一个序列的文字，然后根据所有这些文字，做一个决策，或者叫作输出一个符号。这类应用是文本挖掘和分析中最基本的一个场景。

在绝大多数的“简单分类”任务中，传统的文字表达，例如“词包”（Bag of Word）或者“N 元语法”（Ngram），经常都能有不错的表现。也就是说，在很多这类任务中，文字的顺序其实并不是很重要，或者说词序并没有携带更多的语义信息。

然而，实践者们发现，在一些场景中，如果利用 RNN 来对文字序列进行建模，会获得额外的效果提升。比如有一类任务叫作“句子级别的情感分类”（Sentence-Level Sentiment Classification），这类任务常常出现在分析商品的评论文本（Review）这个场景。这时候，我们需要对每一个句子输出至少两种感情色彩的判断，褒义或者贬义，正面或者负面。比如，我们在分析电影评价的时候，就希望知道用户在某一个句子中是否表达了对电影“喜爱”或者“不喜爱”的情绪。

面对这样句子级别的情感分析，一种比较通行的利用 RNN 建模的方式是：把每一个单词作为一个输入单元，然后把一个句子当作一个序列输入到一个 RNN 中去，RNN 来维持一个隐含的状态。

对于这类应用，不是每一个隐含状态都有一个输出，而是在句子结束的时候，利用最后的隐含状态来产生输出。对于这类任务而言，输出的状态就是一个二元判断，那么我们需要利用最后的隐含状态来实现这个目的。一般来说，在深度模型的架构中，这个步骤是利用最后的隐含状态，然后经过多层感知网络，最后进行一个二元或者多元的分类。这其实是一个标准的分类问题的构建。

在有的应用中，研究者们发现可以利用两个 RNN 建立起来的链条，从而能够更进一步地提升最后的分类效果。在我们刚才描述的建模步骤里，RNN 把一个句子从头到尾按照正常顺序进行了输入并归纳。另外一种建模方式是利用 RNN 去建模句子的逆序，也就是把整个句子倒过来，学习到一个逆序的隐含状态。接下来，我们把顺序的最后隐含状态和逆序的最后隐含状态串联起来，成为最终放入分类器需要学习的特性。这种架构有时候被称作“双向模型”。

当我们从句子这个层级到文档这个层级时，比如希望对文档进行情感分类，仅仅利用我们刚才讲的 RNN 的结构就会显得有点“捉襟见肘”了。一个重要的阻碍就是 RNN 很难针对特别长的序列直接建模。这个时候，就需要我们把整个文档拆分成比较小的单元，然后针对小的单元利用 RNN 进行建模，再把这些小单元的 RNN 结果当作新的输入串联起来。

在实际拆分的时候，我们可以把文章分成一个一个的句子，然后每个句子可以用刚才我们在句子层级的建模方式进行建模；在句子的层级下，还可能再把句子拆分成比如短语这样的单元。这种把一个比较大的文档进行拆分，并且通过 RNN 对不同级别的数据进行建模的形式就叫作“层次式”（Hierarchical）RNN 建模。

特性提取器

在更多的场景中，RNN 其实已经扮演了文本信息特性提取器的角色，特别是在很多监督学习任务中，隐含状态常常被用来当作特性处理。尤其要说明的是，如果你的任务对文字的顺序有一定要求，RNN 往往就能成为这方面任务的利器，我们这里举几个例子。

首先可以想到的一个任务就是，在自然语言处理中很常见的“词类标注”（Part-Of-Speech Tagging），或者简称POS 标注。简单来说，POS 标注就是针对某一个输入句子，把句子里的词性进行分析和标注，让大家知道哪些是动词，哪些是名词，哪些是形容词等等。我们可以很容易地想到，在这样的标注任务中，一个词到底是名词还是动词，在很多的语言场景中，是需要对整个句子的语境进行分析的，也就是说，整个句子的顺序和词序是有意义的。

针对 POS 标注这类任务，一种已经尝试过的架构，就是利用我们刚才介绍过的双向 RNN来对句子进行建模。双向 RNN 的好处是，我们可以构建的隐含信息是包含上下文的，这样就更加有助于我们来分析每个词的词性。

和句子分类的任务类似的是，利用双向 RNN 对句子进行扫描之后，我们依然需要建立分类器，对每一个位置上的词语进行分类。这个时候，依然是同样的思路，我们把当前的隐含状态当作是特性，利用多层感知网络，构建多类分类器，从而对当前位置的词性进行决策。

除了 POS 标注这样的任务以外，针对普通的文档分类，RNN 也有一定的效果。这里我们所说的文档分类，一般是指类似把文档分为“艺术”、“体育”或“时政”等主题类别。人们从实践中发现，在这样的通用文档分类任务中，RNN 和另外一类重要的深度模型，“卷积神经网络”（CNN）结合起来使用效果最好。我们这里不展开对 CNN 的原理进行讲解，只是从大的逻辑上为你讲一下这种分类方法的核心思路。

在计算机视觉中，通常认为 CNN 可以抓住图像的“位置”特征。也就是说，CNN 非常善于挖掘一个二维数据结构中局部的很多变化特征，从而能够有效形成对这些数据点的总结。那么，如果我们把文档的文字排列也看作是某种情况下的一种图案，CNN 就可以发挥其作用来对文字的上下文进行信息提取。然后当 CNN 对文字的局部信息进行提取之后，我们再把这些局部信息当作输入放入 RNN 中，这样就能更好地利用 RNN 去对文章的高维度的特征进行建模。

总结

今天我为你介绍了文本序列建模利器 RNN 的几个应用场景。

一起来回顾下要点：第一，我们讲了用 RNN 对句子层级进行分类任务的处理；第二，我们聊了如何把 RNN 当作普遍使用的特性提取器来进行分类任务的训练，特别是 POS 标签任务。

最后，给你留一个思考题，利用 RNN 提取的信息能否完整捕捉文档里的内容，这一点我们怎么来判断呢？

欢迎你给我留言，和我一起讨论。

095 | 对话系统之经典的对话模型

在文本分析这个重要的环节里，我们已经分享了 Word2Vec 模型，包括模型的基本假设、模型实现以及一些比较有代表意义的扩展模型。我们还讨论了基于深度学习的文本分析模型，特别是对序列建模的深度学习利器 RNN，包括 RNN 的基本框架，流行的 RNN 模型实现，以及 RNN 在自然语言处理中的应用场景。

今天，我们要来看另外一类和文字相关的人工智能系统——对话系统的一些基础知识。

浅析对话系统

对话系统在整个人工智能领域、甚至是计算机科学领域都占据着举足轻重的地位。著名的人工智能测试，“图灵测试”，其实就是建立在某种意义的对话系统上的。在经典的图灵测试场景中，一个最主要的论述就是：看一个人和一个机器进行对话，在和这个机器系统的问答过程中，能否猜出这个系统是一个真人还是一个计算机程序系统。从这一点可以看出，即便是在计算机科学的早期，对话系统或者说是智能的对话能力，就已经成为了计算机科学家衡量智能水平的一个重要标准。

实际上，从上个世纪 50~60 年代开始，研究人员就致力于研发早期的对话系统。即便是在今天看来，在一些简单的应用中，早期的对话系统也表现出了惊人的“智能”。比如，麻省理工大学的约瑟夫·维森鲍姆（Joseph Weizenbaum）教授研发了一款叫“伊丽莎”（Eliza）的早期对话系统。尽管这个对话系统只能对语言进行最肤浅的反馈，但是在“伊丽莎”系统的使用者中，有人真的产生了这个系统有智能的幻觉。这说明对于如何界定“智能”，如何理解对话以及语言能力，这些的确是非常深邃的计算机科学乃至哲学问题。

早期的对话系统多是基于“规则”（Rule）的系统。这些系统的一大特征就是，并不只是真正的去“理解”对话，“理解”文字，而是针对某一种模式，或者说是预定好的模板，对对话进行简单的模仿。不过，如果你认为这样基于规则的系统在今天的对话系统中毫无用武之地的话，那就大错特错了。实际上，通过机器学习的手段辅以规则的方式，这样的系统能够在绝大多数的场景下表现出惊人的水平。很多机器学习背景的工程师在接触对话系统研发的时候，其实往往有轻视规则系统的这种情况。

从基于统计学习的机器学习崛起以后，研发人员就开始希望利用自然语言处理和机器学习的一系列方法，从根本上来改变对话系统的构建方式，其中有一个核心的想法，就是真正理解对话的内容，从而达到真正的智能。在实际的应用中，真正基于机器学习的系统在很长时间里都并不能完全代替基于规则的系统，直到最近几年出现了更加复杂的基于深度学习的模型，我们也会在之后的分享中对这样的系统进行一些介绍。

对话系统的类别

从方法上，对话系统可以大致分为“基于规则的系统”和“基于机器学习的系统”。除此之外，从应用场景上，对话系统也可以分为“基于任务的对话系统”和“非任务的对话系统”。

基于任务的对话系统其实很容易理解，比如我们打电话到航空公司查询订票，打电话到酒店查询订房信息，抑或打电话到餐厅预定晚餐等。这样的对话系统有一大特点，就是我们的对话基本上都有一个明确的目的，或者说我们要完成一个“任务”（Task）。比如对于查询机票而言，通常情况下，我们的任务可以是成功查询到机票信息，或者成功预订了到某个目的地的机票。

对于基于任务的对话系统而言，整个对话的“范畴”是限定好的，很多任务其实都有流程或者叫作“套路”可以参考。因此，从本质上来说，基于任务的对话系统还是相对比较容易的场景。在对话系统发展的历史中，很长时间里，基于规则的系统其实就已经可以对于基于任务的对话系统提供很高质量的服务了。很多用户针对基于规则的系统来应对任务型对话系统，往往会觉得系统缺乏一定的灵活度，但其实已经可以完成任务了。实际上，即便是今天的各类智能对话系统，对于任务型对话系统的支持依然是这些智能系统的核心业务能力。

另外一类对话系统，就是非任务型对话系统，这类系统的一个代表就是“聊天机器人”（Chatbot）。聊天机器人，取决于我们构建这类系统的目的，可以非常接近于任务型的对话系统，也可以是非常难以模仿的，真正具有一定语言理解能力的系统。

典型的聊天机器人，需要对一定的知识库进行建模。比如，当用户问到今天的天气，喜马拉雅山的高度，现在美国的总统是谁等问题，聊天系统要能从某种先前存储的知识库中提取信息。这一部分的功能其实和数据库信息查询很类似。

更加复杂的模式无疑是我们不仅需要对已经有的信息进行直接的查询，还需要进行“推论”（Inference）。这就是“智能”的某种体现，往往是能对现有的数据进行简单推导。比如，如果用户问这样的问题：比纽约现在气温高的美国西海岸城市有哪些？这时，就需要理解比较词“高”的含义，并能够把这个词汇的含义转换成对气温数值的比较。从这些林林总总的情况来看，非任务型的对话系统更加难以建模，对研发者的挑战也更加艰巨。

对话系统的基本架构

尽管不同的对话系统有不同的目的，但是从大的架构上来看，所有的对话系统都有一些基本共同的组件。

首先，一个对话系统需要有一个模块对人的语音进行识别，转换成计算机能理解的信号。这个模块常常叫作“自动语音识别器”（Automatic Speech Recognition），简称ASR。比如，现在很多手机终端、或者是智能家居都有一些简单的对话系统可以根据你的指令来进行回应。

第二，在通过了语音识别之后，就是一个“自然语言理解器”，也简称为 NLU。在这个组件里，我们主要是针对已经文字化了的输入进行理解，比如提取文字中的关键字，对文字中的信息，例如数字、比较词等进行理解。

第三，对话系统往往有一个叫“对话管理器”，简称是 DM 的组件。这个组件的意义是能够管理对话的上下文，从而能够对指代信息，上下文的简称，以及上下文的内容进行跟踪和监测。

第四，在任务型的对话系统中，我们还需要一个叫“任务管理器”，简称是 TM 的模块，用于管理我们需要完成的任务的状态，比如预定的机票信息是否完备，酒店的房间预定是不是已经完成等等。

第五，我们需要从管理器的这些中间状态中产生输出的文本，也简称是NLG。这个部分是需要我们能够产生语言连贯、符合语法的有意义的自然语言。

最后，在一些产品中，我们还需要把自然语言能够用语音的方法回馈给用户，这个组件往往简称为TTS。

总结

今天我为你介绍了对话系统的一些基础的背景信息。

一起来回顾下要点：第一，我们讲了什么是对话系统，对话系统从方法论上来说有什么流派；第二，我们聊了对话系统的分类；第三，我们分析了对话系统的基本架构。

最后，给你留一个思考题，你认为，让对话系统能够真正智能的最大挑战是什么？

欢迎你给我留言，和我一起讨论。

096 | 任务型对话系统有哪些技术要点？

在上一期的分享中，我为你开启了另外一种和文字相关的人工智能系统——对话系统的一些基础知识。我重点和你分享了对话系统的由来，以及对话系统分为“任务型”和“非任务型”两种类型的概况。同时，我们也聊了聊早期的基于规则的对话系统的构建，以及这样的系统对后来各式系统的影响。最后，我为你简单介绍了对话系统的各个基本组件以及这些组件的主要目标。

在今天的分享里，我们就来看一看任务型对话系统的一些技术要点。

任务型对话系统的基本架构

首先，我们来回顾一下任务型对话系统的一些基本架构。尽管不同的对话系统有着不同的目的，但是从大的架构上来看，所有的任务型对话系统都有一些基本共同的组件。

第一个组件是“自动语音识别器”（ASR），这个组件是把人的语音进行识别，转换成为计算机能够理解的信号。

第二个组件是“自然语言理解器”（NLU）。在这个组件里，我们主要是针对已经文字化了的输入进行理解，比如提取文字中的关键字，对文字中的信息进行理解等。

第三个组件是“对话管理器”（DM）。这个组件的意义是能够管理对话的上下文，从而能够对指代信息，上下文的简称，以及上下文的内容进行跟踪和监测。

第四个组件是“任务管理器”（TM），用于管理我们需要完成的任务的状态。

第五个组件是 NLG，既从管理器的这些中间状态中产生输出的文本，也就是自然和连贯的语言。

最后一个组件是 TTS。在一些产品中，我们还需要把自然语言能够用语音的方法回馈给用户。

在我们今天的分享里，因为 ASR 和 TTS 都并不是对话系统的特殊组件，我们就不对这两个部分进行更加深入的探讨了。

任务型对话系统组件详解

我们先来看一下 NLU 这个组件。这个组件的目的是把用户输入的文字信息给转换成为任务型对话系统可以理解的内部的表征（Representation）形式。

我们试想一个餐馆的对话系统，当用户输入了一个句子“看一下北京西单附近今晚 7 点左右的西餐厅”，这个时候，我们都需要了解哪些信息呢？

首先，我们需要知道这个输入的“意图”（Intent）。作为一个餐馆的对话系统来说，我们有可能需要处理好几种不同的意图，比如“订餐”的意图，“查询菜品”的意图等。那么对于我们刚才的这个句子来说，很有可能是一个订餐的意图。也就是说，我们针对一个输入的句子来判断当前的意图，而意图其实就是一个离散的输出结果。这其实就是一个多类的分类问题，或者可以看作是句子的分类问题。

当我们知道了整个句子的意图之后，我们就需要进一步理解这个输入句子的细节。而进一步的理解其实就是希望能够从输入的句子中获得可以“执行”（Execution）的信息。

当我们真实进行餐馆预定的时候，餐馆的名字，预定的时间，用餐人数等信息就显得尤为重要。我们可能需要这样的操作，能够提取出餐馆名字、预定时间、用餐人数等信息，执行餐馆预定的动作，并且能够在餐馆的后台系统中记录下来。于是，我们需要对刚才的语句进行这样的分析。这种分析有时候也被叫作“填空”（Slot Filling）。

“填空”其实也可以看作是一个分类问题。比如，需要知道“北京西单”是一个地点，要把这个地点给识别出来，而且能够知道我们已经填了一个叫“地点”的空。再比如，“今晚 7 点”也需要被识别出来，让我们知道时间的空也被填好了。在这方面有很多方法，有基于传统模型比如“条件随机场”（Conditional Random Field），简称 CRF 的；也有基于“递归神经网络”RNN 的。

经过了 NLU 这个组件之后，我们就来到了对话系统的中枢大脑的位置，就是 DM 这个组件。这个组件重点的是对对话进行跟踪和管理。从整个对话的角度来看，DM 的主要职责就是监控整个对话的状态目前到达了一个什么情况，下一步还需要进行什么样的操作。

还是以刚才我们的输入句子为例，通过 NLU 的分析，我们知道已经有地点和时间两个“空”（Slot）被补齐了，但是很明显有一些最核心的信息依然缺失，比如就餐的人数，订餐人的联系电话等。DM 的一大作用就是对所有的“空”都进行管理，并且决定下面还有哪些“空”需要填写。在传统的系统中，DM 大多是基于规则的，不过在最近的发展中，DM 逐渐变成了基于分类问题的，利用 CRF 或者 RNN 来对 DM 进行建模的也越来越多。

下一个模块就是 TM。这其实是整个任务型对话系统中执行任务的部分。对于一个“订单”意图的餐馆对话系统来说，当必要的“空”都已全部填齐的时候，TM 就会去触发当前需要进行动作，比如真正对数据库进行操作，从而完成订餐的流程。

在很多现在的系统中，DM 和 TM 都是结合在一起进行构建的。在此之上往往有一个叫作“协议学习”（Policy Learning）的步骤。总体来说，协议学习的目的是让对话系统能够更加巧妙和智能地学习到如何补全所有的“空”并且能够完成模块动作。比如，有没有最简化的对话方法能够让用户更加快捷地回答各种信息，这都是协议学习需要考虑的方面。目前来说，在协议学习方面比较热门的方法是利用深度强化学习来对 DM 和 TM 进行统一管理。

最后一个组件叫作 NLG，也就是希望对话系统可以产生自然和连贯的语言。比较传统的方法当然就是利用“填写模板”的形式，事先生成一些语句的半成品。目前比较流行的办法是使用 RNN，特别是 RNN 中的 LSTM 来对 NLG 进行建模。

总结

今天我为你介绍了任务型对话系统的基本技术要点。

一起来回顾下要点：第一，我们复习了任务型对话系统的基本组件；第二，我们进一步聊了这些组件的一些最基础的技术要点和背后的模型思想。

最后，给你留一个思考题，任务型对话系统需要每个组件单独进行学习还是尽可能把所有组件连在一起进行训练？这两种方法的优劣在什么地方呢？

欢迎你给我留言，和我一起讨论。

097 | 聊天机器人有哪些核心技术要点？

对话系统分为“任务型”和“非任务型”两种基本类型。周一的分享里，我们讨论了任务型对话系统的一些技术要点，重点介绍了任务型对话系统的各个组件及其背后的模型支撑。

今天，我们就来看一看非任务型对话系统的主要技术要点。非任务型的对话系统有时候又会被称作是“聊天机器人”。

基于信息检索的对话系统

我们前面讲过，对话系统，特别是非任务型对话系统，也就是聊天机器人，有一个很重要的功能，就是在一个知识库的基础上和用户进行对话。这个知识库可以是海量的已经存在的人机对话，也可以是某种形式的知识信息。

比如，一个关于篮球的聊天机器人，那就需要这个系统能够访问有关篮球球队、运动员、比赛、新闻等有关篮球信息的知识库。同时，在这个对话系统运行了一段时间之后，我们就会慢慢积累很多有关篮球的对话。这些对话就成为了系统针对当前输入进行反应的基础。

针对当前的输入，利用之前已经有过的对话进行回馈，这就是基于信息检索技术的对话系统的核心假设。一种最基本的做法就是，找到和当前输入最相近的已有对话中的某一个语句，然后回复之前已经回复过的内容。

比如，当前的问话是“迈克尔·乔丹在职业生涯中一共得过多少分？”如果在过去的对话中，已经有人问过“迈克尔·乔丹为芝加哥公牛队一共得过多少分？”。那么，我们就可以根据这两句话在词组上的相似性，返回已经回答过的答案来应对当前的输入。

当然，上面这种对话系统可能会显得比较原始。但是，一旦我们把整个问题抽象成广义的搜索问题，其实就可以建立非常复杂的检索系统，来对我们究竟需要回复什么样的内容进行建模。

比如，我们可以把输入当作查询关键词，只不过从性质上来说，当前的输入语句往往要长于传统的查询关键词，但是在技术上依然可以使用各种搜索技术，例如通常的排序学习等方法都适用于这样的场景。

从理论上来讲，基于检索的对话系统有很多先天的问题。比如，从根本上，搜索系统就是一个“无状态”（Stateless）的系统。特别是传统意义上的搜索系统，一般没有办法对上下文进行跟踪，其实从整个流程上讲，这并不是真正意义上的对话，当然也就谈不上是“智能”系统。

基于深度学习的对话系统

那么，如何能够让对话系统真正对状态进行管理，从而能够对上下文的信息进行回馈呢？

最近一段时间以来，基于深度学习的对话系统逐渐成为了对话系统建模的主流，就是因为这些模型都能够比较有效地对状态进行管理。

那么，在这么多的深度对话系统中，首当其冲的一个经典模型就是“序列到序列”（Sequence To Sequence）模型，简称S2S模型。S2S 模型认为，从本质上对话系统是某种程度上的“翻译”问题，也就是说，我们需要把回应输入的句子这个问题看作是把某种语言的语句翻译成目标语言语句的一个过程。S2S 模型也广泛应用在机器翻译的场景中。

具体来说，S2S 把一串输入语句的字符，通过学习转换成为一个中间的状态。这其实就是一个“编码”（Encode）的过程。这个中间状态，可以结合之前字句的中间状态，从而实现对上下文进行跟踪的目的。这个部分，其实就成为很多具体模型各具特色的地方。总的来说，中间状态需要随着对话的演变而产生变化。然后，我们需要一个“解码”（Decode）的过程，把中间的状态转换成为最后输出的字句。

从整个流程上来说，S2S 其实非常像我们已经介绍过的深度序列模型，例如 RNN 和 LSTM。从实现上来说，很多 S2S 模型，其实都是直接利用 RNN 或者 LSTM 而得以实现的。因此，很多深度序列模型的技术都可以直接应用到对话系统中来。

另外，我们可以看到，相比于基于信息检索的系统来说，S2S 模型并没有一个“显式”的搜索过去信息的步骤，因此可以更加灵活地处理语言上的多样性，以及不是完全匹配的问题。因此，从实际的效果中来看，S2S 模型在对话系统中取得了不小的成功。

实际系统的一些问题

在实际的开发中，非任务型对话系统会有一系列的实际问题需要解决。

首先，因为是开放性的对话系统，其实并没有一个标准来衡量这些聊天机器人式的系统的好坏。究竟什么样的系统是一个好的聊天系统，依旧是一个非常具有争议的领域。

其次，人们在实际的应用中发现，基于深度学习的序列模型，虽然常常能够给出比较“人性化”的语句回答，但是很多回答都没有过多的“意义”，更像是已经出现过的语句的“深层次”的“翻译”。因此在最近的一些系统中，人们又开始尝试把信息检索系统和 S2S 模型结合起来使用。

最后，我们需要提出的就是，非任务型对话系统和任务型对话系统有时候常常需要混合使用。比如，在一个订票系统中，可能也需要掺杂一般性的对话。如何能够有效地进行两种系统的混合，肯定又是一种新的挑战。

总结

今天我为你介绍了非任务型对话系统的基本技术要点。

一起来回顾下要点：第一，我们讲了基于信息检索，也就是搜索技术的对话系统；第二，我们聊了聊如何利用 RNN 或者是序列模型对对话系统进行建模。

最后，给你留一个思考题，你觉得在什么样的条件下，非任务型聊天机器人可以展现出真正的“人工智能”呢？

欢迎你给我留言，和我一起讨论。

098 | 什么是文档情感分类？

到目前为止，我们讲完了对话系统的基础知识。一般来说，对话系统分为“任务型”和“非任务型”这两种基本类型。针对任务型对话系统，我们重点介绍了其各个组件的任务，以及这些组件都有哪些模型给予支撑。针对非任务型对话系统，也就是“聊天机器人”，我们主要介绍了如何利用深度学习技术来对一个聊天机器人进行建模，以及非任务型对话系统所面临的挑战都有哪些。

今天，我们转入文本分析的另外一个领域，同时也是在实际系统中经常会使用的一个子领域，那就是文本“情感分析”（Sentiment Analysis）。所谓情感分析，就是指我们要针对一段文本来判断这段文本的文字“色彩”，到底是褒义，还是贬义，到底是抒发了什么情感。

文本情感分析是一个非常实用的工具，比如，我们需要分析用户对于商品的评价带有什么样的情感，从而能够更好地为商品的推荐和搜索结果服务。再比如，通过文本的情感分析，我们可以了解到用户针对某一个时事的观点异同，以及观点分歧在什么地方，从而能够更加清晰地了解新闻的舆情动态。

今天，我们首先从最基础的文档情感分类（Document Sentiment Classification）这个问题说起。

基于监督学习的文档情感分类

文档情感分类属于文本情感分析中最基本的一种任务。这种任务的假设是，一段文本的作者通过这段文本是想对某一个“实体”（Entity）表达一种情绪。这里的实体其实包括很多种类型的对象，比如可能是商品，某个事件，也可能是某个人物。我们这里讨论的文本单元可以是一个文档，也可以是一个句子等其他的文本段落。

值得注意的是，我们在这一类任务中，限制一个文本单元只表达，或者主要表达一种情感。很明显，这种假设是比较局限的。一般来说，在实际的应用中，一个文本单元，特别是比较长的单元例如文章，则往往包含多于一种的情绪。因此，我们可以看到文档情感分类其实是一种简化了的情感分析任务。

同时，一个文本单元还可能对多个“实体”进行情感表达。比如一个用户针对某种款式相机的多个方面进行了评价，那么每一个方面都可以作为一个实体，而这种时候，用户的情感可能就更难仅以一种情感来加以概括了。

在最基本的文档情感分类的情况下，我们往往把这类任务转化成为一种监督学习任务，也就是说，我们希望通过一个有标签的训练集学习到一个分类器（Classifier）或者回归模型（Regression），从而能够在未知的数据上预测用户的情感。

这里往往有两种形式的监督学习任务。一种是把文档分类为几种，最简单的情况下是两种情感。这就是二分或者多类分类问题。另外一种则是认为文档会有一种情感，但是每一种情感之间有好坏的顺序区分，比如，评分“好”，就比“一般”要好，也就是说，这些评分之间有一个次序问题。那么，很多时候，这种问题会被归结为一种“次序回归”（Ordinal Regression）问题。

在明确了我们需要构建什么样的监督学习任务以后，对于这些任务而言，如何选取“特性”（Feature）就是一个很重要的工作了。诚然，对于每一个具体的任务而言，我们往往需要选取不同的特性，但是在过去的很多实践中，经过反复验证，有一些特性可能会有比较好的效果。我在这里做一个简单的总结。

首先，我们曾经多次提到过的“词频”（Term Frequency）以及更加复杂一些的TF-IDF 词权重法都是经常使用的文字特性。在文档情感分类中，这一类特性被认为非常有效。

另外一种使用得比较频繁的特性就是“词类”（Part of Speech）。词类提供了句子中每个词的成分，比如哪些词是动词，哪些词是名词等等。这些词性可以跟某种特定的情感有很密切的联系。

还有一种很直观的特性就是“情感词汇”。比如，我们已经知道了“好”、“不错”等词表达了正向的情感，而“差”、“不好”、“不尽人意”等词表达了负向的情感。我们可以事先收集一个这类情感词汇的集合。这个集合里的词汇可以跟最后文档的情感有很直接的联系。

最后，需要指出的是，如何开发一个合适的特性往往是文档分类的重点工作。

除了特性以外，在文档情感分类这个任务中，传统上经常使用的文字分类器有“朴素贝叶斯”（Naïve Bayes）分类器、“支持向量机”（Support Vector Machines）等。

基于非监督学习的文档情感分类

情感词汇已经为我们对大段文字乃至整个文档的分类有了很强的指导意义，因此，也有一些方法寻求利用非监督学习的方式来对文档进行情感分类。注意，这里所谓的非监督学习，是指我们并不显式地学习一个分类器，也就是说，不存在一个训练数据集，不需要我们提前收集数据的标签。

这一类思想的核心其实就是设计一套“打分机制”（Scoring Heuristics），来对整个文档做一种粗浅的判断。当然，这种打分机制背后都有一种理论来支撑。

比如，有一种打分模式依靠首先识别的“词类”进行分析，特别是大量的相邻的两个词的词性，诸如“特别好”。这里，“特别”是副词，“好”是形容词，然后就可以得出在某些情况下，副词和形容词的这种搭配特别多的时候，并且在正向的情感词比较多的时候，整个文档也许就是比较偏向正向的情感。

我们需要指出的是，这种方法虽然听上去比较“山寨”，但是对于很多产品和项目来说，获取大量高质量的标签信息往往是非常耗时，甚至是不可能的，例如上百万的用户对产品的评价数据。因此，在没有训练数据的情况下，利用某种打分机制，可以通过最简单的一些情感词库开发出文档情感分类的算法，这其实也不失为一种快速迭代的方式。

总结

今天我为你介绍了一类基础的文字情感分析任务——文档情感分类的基本技术要点。

一起来回顾下要点：第一，我们讲了基于监督学习的文档情感分类任务以及这类任务下的重要特性和模型；第二，我们聊了如何在没有大规模训练数据的基础上进行非监督的文档情感分类。

最后，给你留一个思考题，如何把文档情感分类任务扩展到可以针对多种实体多种情感的分析呢？

欢迎你给我留言，和我一起讨论。

099 | 如何来提取情感“实体”和“方面”呢？

从上一篇分享开始，我们转入文本分析的另外一个领域，文本“情感分析”（Sentiment Analysis），也就是指我们要针对一段文本来判断其文字“色彩”。文本情感分析是一个非常实用的工具。我们从最基础的文档情感分类这个问题说起，这个任务是把一个单独的文档给分类为某种情感。在绝大多数情况下，我们可以把这个任务看作监督学习的问题。另外，我们也聊了聊如何通过建立情感词来进行简单的非监督学习的步骤。

今天，我们来看文本情感分析中的另一个关键技术，情感“实体”和“方面”的提取。

“实体”和“方面”的提取

对于文本情感分析而言，“实体”（Entity）和“方面”（Aspect）是两个非常重要的概念。很多情感分析的任务都是围绕着这两个概念而产生的。在谈论如何对这两个概念提取之前，我们先来看看这两个概念的意义。

“实体”其实就是文本中的某一个对象，比如产品的名字、公司的名字、服务的名字、个人、事件名字等。而“方面”则是实体的某种属性和组建。

比如这么一个句子：“我买了一部三星手机，它的通话质量很不错”。在这里，“三星手机”就是一个实体，而“通话质量”则是一个方面。更进一步，“很不错”则是一个情感表达，这里是针对“三星手机”这个实体的“通话质量”这个方面。很明显，如果我们想要精准地对文本的情感进行分析，就一定得能够对实体和方面进行有效提取。

从广义的范围来说，实体和方面的提取都属于“信息提取”（Information Extraction）的工作。这是一个非常大的任务类别，用于从大量的非结构化文本中提取出有价值的信息。实体和方面的提取可以利用一般性的信息提取技术，当然往往也可以利用句子中的一些特殊结构。

常用的提取技术

接下来，我们来聊一聊有哪些最直观最简单的提取技术。

第一种最简单的技术是基于“频率”（Frequency）的提取。在这样的技术中，我们先对文本进行“词类”（Part Of Speech）分析，分析出每个词的词性。然后主要针对句子中的“名词”，计算这些“名词”出现的频率。当这些频率达到某一个阈值的时候，我们就认为这些名词是一个实体或者方面。

这里的假设是，在一个例如产品评论的文本集合中，如果一个名词反复出现在这个集合的很多文档中，那么这个名词很有可能就是一个独立的实体或者方面。为了达到更好的效果，更加复杂的词频技术，例如 TF-IDF 也经常被用在计算名词的频率上，从而提取它们作为实体和方面的候选词。

另一种比较常见的针对情感分析开发的技术，就是利用句子中的一些特殊的结构从而达到信息提取的目的。

比如，回到刚才的那句话：“我买了一部三星手机，它的通话质量很不错”。在这句话中，“很不错”作为一个情感词汇，一定和某一个方面，甚至是某一个实体成对出现的。那么这个成对出现的情况就是我们可以利用的情感句子的有利特征。

比如“很不错”这个词汇，在一个描述产品情感的文档中，这个词汇很少单独出现。这类不管是褒义还是贬义的词汇出现后，在绝大多数情况下，他们都会描述一个对象。而从句法结构上来说，这个对象往往又离这个情感词汇很近，因为这个情感词需要对这个对象进行描述。因此，我们就可以利用这种配对结果，来计算这样的结构是否大量出现。

这种结构其实可以被反复利用。例如在刚才的句子中，“三星手机”这个实体，一定会和很多不同的方面反复同时出现，如“通话质量”、“操作”、“售后服务”等。我们可以利用这两种不同的配对结构，实体和方面之间的，方面和情感词之间的，更好地提取这些词汇。

刚才我们说的不管是基于词频的还是利用配对关系的方法，都可以算是无监督的学习方法。这些方法的本质，其实就是利用某种之前定义好的规则或者是某种洞察来针对文本进行提取。另外一种思维其实就是把信息提取转换成为监督学习任务。

回到例子“我买了一部三星手机，它的通话质量很不错”这句话。这句话的文本作为输入，我们需要的输出是“三星手机—实体”、“通话质量—方面”这样的标签信息。那么，一个基本的想法就是，我们其实可以针对这句话构建一些特征，然后学习出一个分类器，从而可以得到这样的标签。

值得注意的是，这一类的监督学习任务和我们常见的例如分类一个文档是不是垃圾信息不一样，这里我们需要输出多个标签。这种需要输出多个标签的任务，特别是这些标签之间可能还有一定关系的情况，往往被称作是“结构化预测”（Structural Prediction）任务。

在结构化预测这个领域，“条件随机场”（Conditional Random Field），或者简称是CRF的模型，是对这方面任务进行运作的一个经典模型。然而，需要指出的是，把实体和方面提取当作监督任务以后，很明显，我们就需要有一个训练集和标签，这个训练集的匮乏常常成为 CRF 产生理想效果的瓶颈。

总结

今天，我为你介绍了一类基础的文字情感分析任务——情感“实体”和“方面”的提取。

一起来回顾下要点：第一，我们介绍了什么是情感“实体”和“方面”；第二，我们聊了目前在这个方向上比较通行的一些方法，比如基于“频率”的提取，利用句子的一些特殊结构等。

最后，给你留一个思考题，除了我们介绍的这些方法，你还能想到其他方法来提取实体和方面的关键词吗？

欢迎你给我留言，和我一起讨论。

100 | 文本情感分析中如何做意见总结和搜索？

在文本“情感分析”（Sentiment Analysis）这个领域，我们首先介绍了最基础的文档情感分类这个问题。在绝大多数情况下，这是一个监督学习的问题。当然，我们也可以通过建立情感词库来进行简单的非监督学习的步骤。紧接着，我们讨论了文本情感分析中的另一个关键技术，即情感“实体”和“方面”的提取。这个任务可以说是很多情感分析的根基，我们需要从无结构的文本中提取实体和方面等结构信息，便于进一步的分析。我们讲了如何通过词频、挖掘配对信息以及利用监督学习来对实体和方面进行挖掘。

今天，我们来看文本情感分析的另外一个主题——意见总结（Opinion Summarization）和意见搜索（Opinion Search）。

意见总结

为什么“意见总结”这个任务会很重要的呢？

假如你希望在电商网站上购买一款数码相机。这个时候，你可能需要打开好几款相机的页面进行比较。对于相机的硬件指标，能够从这些页面上相对容易地直接得到，除此以外，你可能还比较关心对这些相机的评价。

在这个场景下，“意见总结”的重要性就凸显出来了。因为优秀的相机款式往往有上百甚至上千的用户评价，这些评价包括了用户对产品很多方面的评价，有褒义和贬义的情绪。如果对这些评价逐一进行浏览，很明显是一种非常低效的做法。因此，从购物网站的角度来说，如果能够为用户把这些评论进行总结，从而让用户看到总体的有代表性的评论，无疑能够帮助用户节省不少时间和精力，让用户获得更好的体验。

简单来说，意见总结就是从无结构的文本中提取出来的各种情感信息的综合表达。我们这里聊的意见总结主要是指“基于方面的意见总结”（Aspect-based Opinion Summarization）。也就是说，意见的总结主要是围绕着产品的种种方面来产生的。

概括一下，基于方面的意见总结有两个特点。第一，这样的总结主要是针对物体的实体以及对应的方面来进行的。第二，意见总结需要提供数量化的总结。什么是数量化的总结？就是总结里需要指出，持有某种意见的用户占多少百分比，又有多少百分比的用户有其他意见。很明显，这里还牵涉到如何表达和显示这些意见总结的步骤。

可以说，基于方面的意见总结成为了意见总结的主要任务。另外，基于方面的意见总结还可以与其他文本技术相结合，从而能够延展这个技术的效果。比如，总结语句的生成可以分为“句子选择”和“人工句子生成”这两种方案。

首先来说一下句子选择这个想法。句子选择的思路是，我们希望在最后的意见总结里，能够利用已有的非常有代表性的句子，这样用户看到的最后的总结会显得更加真实。那么这里有两个问题：一个问题是如何对所有的句子进行筛选；第二个问题是如果有重复多余的字句，又如何进行进一步的选择。

通常情况下，我们通过对句子打分来筛选，这个时候，一般需要设计一个打分机制，这个机制往往是看这个句子对某一个实体的方面是否进行了有情感的评价。然后，对所有句子进行聚类，这样所有评价类似的句子就可以被聚集到一起，从而能够过滤掉重复多余的字句。

那么，人工句子生成又是怎么运作的呢？首先，我们必须知道这个物品的哪些方面得到了用户的评价，而且都是什么样的评价，比如是正面评价还是负面评价。然后，把这些信息和一个语言模型，也就是语句生成器相连接，从而能够“生成”最后的总结语句。值得注意的是，这样生成的总结语句并不会出现在所有用户的原始评价中，因此也可能会对用户的最终体验有一定的影响。

除了基于方面的意见总结以外，还有一些类似的但是并不完全一样的总结方案。比如，有一种总结方案叫“针对性观点总结”（Contrastive View Summarization）。这个任务更加突出针对同一个主题的两种截然相反的观点。这种意见总结不仅可以针对商品，也针对新闻事件，比如某一个政策法规、选举结果等往往比较有争议的话题事件，“针对性观点总结”往往会有比较好的用户体验。

意见搜索

我们可以认为“意见搜索”是建立在意见总结之上的一个任务。通常情况下，意见搜索需要完成的任务是用户输入一个主体的名字，我们需要返回和这个主体相关的意见信息，这些意见信息有可能是通过意见总结而呈现给用户的。

意见搜索的难点，或者说是和传统搜索不一样的地方主要还是在于针对意见信息的索引和检索。

第一，我们需要在索引库中找到有哪些文档和字句包含了我们所需要查询的主体。可以说，这一点和传统的搜索是非常类似的。

第二，我们需要在找到的文档和字句中检查是否包含主体的某种意见，以及其褒义或者贬义的评价。这就是有别于传统搜索的地方。在找到了所有关于某个主体的情感评价以后，我们需要设计一个评分机制从而返回最有说服力的文档，并且还需要在这些文档的基础上进行意见总结。很显然，这些步骤都是传统的搜索中并没有的。

按照上面所说的这两点，我们可以把意见搜索分为两个阶段。

第一个阶段，就是利用现有的搜索技术，比如我们介绍过的文本搜索或者基于排序学习的搜索等方法，得到最初的一个文档的备选集。然后进入下一个阶段，就是通过一个模型，针对所有的文档进行基于意见的打分。这个模型可以是简单的分类器，用于分析当前的字句和主体的意见究竟有没有关系，也可以是一个更加复杂的模型，输出当前的文档和主体的哪一个方面有关系。在这里，任何一种文本分类器都可以被利用起来。

总体来说，意见搜索可以算是对于意见分析和总结的一个综合体现。

总结

今天，我为你介绍了一类比较高级的文本情感分析技术：意见的总结和搜索。至此，我们对于文本情感分析的分享就告一段落了。

一起来回顾下要点：第一，我们讲了意见总结的的重要性，基本概念和技术；第二，我们分享了意见搜索的基本概念和两个阶段的技术。

最后，给你留一个思考题，除了常见的观点和评分以外，用户对于产品的评价一般还在意哪些信息呢？

欢迎你给我留言，和我一起讨论。

复盘 3 | 自然语言处理及文本处理核心技术模块

到目前为止，我们讲完了人工智能核心技术的第三个模块——自然语言处理及文本处理核心技术。

整个模块共 18 期，6 大主题，希望通过这些内容，能让你对自然语言处理及文本处理核心技术有一个全面系统的认识和理解，为自己进一步学习和提升打下基础。今天我准备了 18 张知识卡，和你一起来对这一模块的内容做一个复盘。

点击知识卡跳转到你最想看的那篇文章，温故而知新。如不能正常跳转，请先将 App 更新到最新版本。

LDA 模型

基础文本分析

Word2Vec

基于深度学习的语言序列模型

基于深度学习的聊天对话模型

文本情感分析

积跬步以至千里

最后，恭喜你在这个模块中已经阅读了37690 字，听了120 分钟的音频，获得一张新的通关卡，这是一个不小的成就。在人工智能领域的千里之行，我们又往前迈出了一步。

感谢你在专栏里的每一个留言，给了我很多思考和启发。期待能够听到你更多的声音，我们一起交流讨论。

006 | Google的点击率系统模型

广告是很多互联网公司的重要收入来源，比如 Google、Facebook、微软、阿里巴巴、百度、腾讯等。以 Facebook 为例，它的 2017 年第一季度财报显示，公司总营收为 78.4 亿美元，这其中 98% 的收入来自广告。同样，在这些公司内部，都有着完善的广告系统来支撑其广告业务。

当然，大型广告系统的成功需要依靠很多相互协调的子系统和组件。今天我要和你聊的是广告系统里最基础的一个子系统，也是整个广告系统的核心功能之一——点击率预估系统。点击率预估，顾名思义就是根据环境和广告的类型，来估计用户有多大的可能性点击当前的广告。这个预估值会用于广告系统的其他组件，比如对广告主（投放广告的客户）的计费模块。因此，点击率预估的准确性和实时性就变得十分重要。

今天和你分享一篇广告点击率预估文献史上非常重要的论文，它来自 Google 广告团队，标题是《工程实践视角下的广告点击率预估》（“Ad Click Prediction: a View from the Trenches”）。

论文背景

这篇论文发表于 KDD 2013 年的工业论文组，在短短几年时间里就获得了近 200 次的文章引用数，不少公司争相研究其中的内容，希望能够复制类似的算法和技术。

这篇文章的作者群多达 16 人，他们都是来自 Google 西雅图、匹兹堡、硅谷以及剑桥等地办公室的研究人员和工程师，文章的致谢部分也有 9 人。可见整个论文以及里面的技术的确是团队协作的结果。

这里面有两位作者值得介绍一下。第一位是论文的第一作者布兰登（H. Brendan McMahan）。布兰登早年在卡内基梅隆大学计算机系获得博士学位。他的博士生导师是戈登（Geoff Gordon）以及布卢姆（Avrim Blum），这两位都是卡内基梅隆大学机器学习界的权威教授。布兰登本人长期对优化算法有深入的研究，这篇论文的重要核心算法就来自于他的研究成果。

文章的另外一位作者斯卡利（D. Sculley）从塔夫茨大学（Tufts University）博士毕业之后，一直在 Google 的匹兹堡分部工作，并着手研究大规模机器学习系统，其中重要的代表性研究成果是如何把回归问题和排序问题结合起来（发表于 KDD 2010 年）。斯卡利曾经是一个著名的开源大规模机器学习软件包 sofia-ml 的作者，里面实现了一个大规模版本的 RankSVM，一度受到关注。

在线逻辑回归（Logistic Regression）

文章首先讲解的是点击率预估的核心算法。因为 Google 要处理的数据集非常庞大，不管是样本数量还是样本的特征数都是百亿级别的，所以选用什么样的算法至关重要。2013 年，也就是这篇论文发表的时候，当时大规模深度学习的环境还没有完全成熟起来，Google 的科学家和工程师选择了逻辑回归，这是一个非常传统但也非常强大的线性分类工具。

我们这里简单回顾一下逻辑回归模型。

逻辑回归是要对二元分类问题进行建模，模型的核心是通过一组（有可能是非常巨大规模的）特征以及所对应的参数来对目标的标签进行拟合。这个拟合的过程是通过一个叫逻辑转换或函数来完成的，使得线性的特征以及参数的拟合能够非线性转换为二元标签。

普通的逻辑回归并不适应大规模的广告点击率预估。有两个原因，第一，数据量太大。传统的逻辑回归参数训练过程都依靠牛顿法（Newton's Method）或者 L-BFGS 等算法。这些算法并不太容易在大规模数据上得以处理。第二，不太容易得到比较稀疏（Sparse）的答案（Solution）。也就是说，虽然数据中特征的总数很多，但是对于单个数据点来说，有效特征是有限而且稀疏的。

我们希望最终学习到的模型也是稀疏的，也就是对于单个数据点来说，仅有少量特征是被激活的。传统的解法，甚至包括一些传统的在线逻辑回归，都不能很好地解决答案的稀疏性问题。

这篇文章提出了用一种叫FTRL（Follow The Regularized Leader）的在线逻辑回归算法来解决上述问题。FTRL 是一种在线算法，因此算法的核心就是模型的参数会在每一个数据点进行更新。FTRL 把传统的逻辑回归的目标函数进行了改写。

新的目标函数分为三个部分：第一部分是一个用过去所有的梯度值（Gradients）来重权（Re-Weight）所有的参数值；第二部分是当前最新的参数值尽可能不偏差之前所有的参数值；第三个部分则是希望当前的参数值能够有稀疏的解（通过 L1 来直接约束）。从这三个部分的目标函数来看，这个算法既能让参数的变化符合数据规律（从梯度来控制），也能让参数不至于偏离过去已有的数值，从而整个参数不会随着一些异常的数据点而发生剧烈变化。

在算法上另外一个比较新颖的地方，就是对每一个特征维度的学习速率都有一个动态的自动调整。传统的随机梯度下降（Stochastic Gradient Descent）算法或是简单的在线逻辑回归都没有这样的能力，造成了传统的算法需要花很长时间来手工调学习速率等参数。

同时，因为每一个特征维度上特征数值的差异，造成了没法对所有特征选取统一的学习速率。而 FTRL 带来的则是对每一个维度特征的动态学习速率，一举解决了手动调整学习算法的学习速率问题。简单说来，学习速率就是根据每一个维度目前所有梯度的平方和的倒数进行调整，这个平方和越大，则学习速率越慢。

系统调优工程

很明显，光有一个比较优化的在线逻辑回归算法，依然很难得到最好的效果，还会有很多细小的系统调优过程。

比如文章介绍了利用布隆过滤器（Bloom Filter）的方法，来动态决定某一个特征是否需要加入到模型中。虽然这样的方法是概率性的，意思是说，某一个特征即便可能小于某一个值，也有可能被错误加入，但是发生这样事件的概率是比较小的。通过布隆过滤器调优之后，模型的 AUC 仅仅降低了 0.008%，但是内存的消耗却减少了 60% 之多，可见很多特征仅仅存在于少量的数据中。

文章还介绍了一系列的方法来减少内存的消耗。比如利用更加紧凑的存储格式，而不是简单的 32 位或者 64 位的浮点数存储。作者们利用了一种叫 q2.13 的格式，更加紧凑地存储节省了另外 75% 的内存空间。

此外，前面我们提到的计算每一步 FTRL 更新的时候，原则上都需要存储过去所有的梯度信息以及梯度的平方和的信息。文章介绍了一种非常粗略的估计形式，使得这些信息可以不必完全存储，让内存的消耗进一步降低。这部分内容可能并非对所有读者都有益处，然而我们可以看到的是，Google 的工程师为了把一种算法应用到实际中做出了非常多的努力。

另外，文章也特别提出，虽然大家都知道在点击率预估这样非常不对称的问题上（也就是正例会远远少于负例）需要对负样本进行采样，但是这里面需要注意的是直接采样会对参数的估计带来偏差。同时文章也提出了需要对模型的最后预测进行调整（Calibration），使得模型的输出可以和历史的真实点击率分布相近。这一点对于利用点击率来进行计费显得尤为重要，因为有可能因为系统性的偏差，预测的数值整体高出或者整体低于历史观测值，从而对广告主过多计费或者过少计费。

失败的实验

这篇文章难能宝贵之处是不仅介绍了成功的经验，还介绍了一些失败的或者是不怎么成功的实验结果，让后来的学者和工程师能够少走弯路。

比如著名的Hashing Trick，在这篇文章里，Google 的工程师们经过实验发现，特征经过哈希之后并没有显著降低内存而且模型的精准度有所下降，同时哈希也让模型变得不可解释，于是 Google 的工程师觉得没有必要对特征进行哈希。

另外一个热门的技术Dropout也被作者们尝试了，在 Google 的实验数据上并没有显著的效果。还有一个经常见到的技术，那就是对学到的参数进行归一化（Normalization），这是让参数能够在一定的范围内不随便波动。遗憾的是，Google 的作者们也发现这个技术没有太大作用，模型的效果经常还会降低。

小结

今天我为你分享了这篇关于广告点击率预估的重要论文，你需要理解的核心要点有几个，一是 FTRL 模型的创新；二是这个模型如何应用到工业界的环境中特别是如何对内存的消耗进行调优；三是 Google 一系列失败尝试的总结。

总之，这篇论文是难得一见的工业界级别的科技论文分享。从 KDD 工业组的角度来说，很有借鉴意义；从业界贡献来说，除了广告之外，FTRL 也被广泛应用到推荐系统等领域。

最后，我们再来探讨个问题。假设你在负责公司的广告系统，那你应该如何判断自己的场景是不是应该使用 FTRL 呢？

欢迎你给我留言，和我一起讨论。

105 | 广告系统概述

在之前的分享里，我们已经介绍了搜索、推荐系统以及文本分析这三个重要的机器学习、人工智能领域。从基本的思想、算法以及架构说起，我们针对这几个领域要解决的问题和在解决这些问题的过程中出现的经典思路都做了比较详细的讲解。

可以说，搜索是最早利用机器学习以及人工智能思想和技术的应用领域。不管是从最初的图书馆信息检索系统还是到最近二十年年兴起的大规模现代搜索引擎，围绕搜索系统所产生的诸多方法论、算法和模型都影响着很多相关领域。特别是基于排序学习（Learning To Rank）的搜索排序算法的提出和成熟，让机器学习的一大批技术和搜索的现实问题得以结合，成为了机器学习和某个应用领域相互发展的一大典范。类似的，对于推荐系统来说，也在过去十几年间，通过机器学习技术和推荐问题的结合，迸发出了一系列经典方法，这些方法也影响了其他应用领域的发展。

从今天起，我们就来看另一个重要的应用领域：计算广告。计算广告这个领域深受搜索系统和推荐系统的影响，可以说有很多技术都是从这两个领域直接借鉴过来的。然而，因为其应用对象的不同和场景的不同，计算广告又有很多自己独特的问题，以及解决这些问题需要注意的限制条件。因此，在过去十多年间，计算广告慢慢发展出了一条独特的道路。

那么，我们首先来聊一聊广告系统的概述，看一下这个领域要解决的主要问题以及发展的简要历史。

计算广告的主要场景

为了给你建立一个感性的认识，我们先来讲一下计算广告的主要场景，了解这个领域需要解决什么样的问题。我们还会在后面的讲解中逐一展开这些场景下的问题设置，因此，这里主要是从大方向上来对这些场景进行一个把握。

互联网的应用和内容服务商慢慢意识到，提供广告可以作为一种重要的盈利手段，这以后，一个新兴的行业就此诞生了。

从最简单的场景来说，一个互联网内容服务商，例如一个新闻网站或者一个社交媒体网站，希望在自己的服务里插入广告，这基本上就是一个内容的匹配问题。我们把在自己的服务里提供广告的内容服务商叫作“发布商”（Publisher）。

发布商的目的是匹配广告和目标人群，有时候又叫“受众”（Audience），使得目标人群能够对广告产生兴趣并且点击，然后最终产生行动。这里的行动，可以是购买了广告里的商品，订阅了广告里的服务，也可以是非常广义下的行动，比如对某个品牌有了更加深刻的好印象等。

在这个最简单的场景里，有两种最基本的广告模式，一种叫作“搜索广告”，一种叫作“展示广告”。搜索广告是说发布商提供某种形式的搜索服务，然后将广告显示在搜索结果页面上。在这样的情况下，广告需要和查询关键词的语义有关系。从本质上说，这种情况下的广告是搜索结果的自然延伸。而对于展示广告来说，往往就是显示在发布商的普通页面上，一般并不直接和任何查询关键词相关。这又和经典的推荐系统的场景非常类似，也可以看做是推荐的一个自然延伸。

如果仅从这样的角度来看广告系统，那么我们基本上可以认定，广告就是特殊的搜索或者特殊的推荐。但其实广告系统还有另外一个和搜索以及推荐非常不一样的方面，最终决定了广告系统的特殊性，那就是“广告商”（Advertiser）。

广告商是那些愿意把自己的广告放到发布商上来显示给受众观看的服务提供商。广告商对于自己的目标往往有明确的定位，比如希望能够通过广告来增加销售，提高服务订阅数量，提高自己的品牌效应等等。因此，广告商自然希望能够在以下这一系列的决策上有更多的发言权，比如发布商究竟如何显示广告，在什么情况下显示广告，针对什么人群显示广告等，从而能够让自己的利益最大化。

也正是因为这个原因，为了满足广告商的需求，从而能够吸引更多的广告商来自己的服务打广告，发布商往往提供各种工具，帮助广告商了解自己的用户群体以及广告的效果，使得广告商认为这个发布商是一个可以值得依赖的合作伙伴。

然而，即便如此，发布商和广告商的利益往往是不完全一致的。发布商，作为一个内容的提供平台或是一个社交媒体平台，需要照顾自己用户群的感受。例如，一个医院希望在一个新闻网站上投放自己的广告，即便可以为新闻网站带来丰厚的广告收益，新闻网站也需要考虑，从长远来看，这些广告内容和自己的新闻内容是否和谐，是否慢慢地会让用户产生厌烦情绪等。从这个角度来看，发布商不仅仅是简单地进行广告和受众的匹配，还有一个最重要的工作，是从宏观上平衡广告投放效果和内容服务效果，从而达到自己价值的最大化。

随着发布商和广告商数目的增多，众多的发布商发现，如果都需要依靠自己的力量来构建大型广告管理系统，那无疑是非常耗时也是很多中小发布商所不具备的能力。同样，对于广告商来说，如果希望自己的广告能够投放到众多发布商中，逐一研究发布商的工具以及各个发布商用户的区别，就会为广告投放增加不小的难度。因此，针对发布商以及针对广告商的中间平台很快就应运而生。

对于发布商的中间平台而言，整合众多发布机会，从而能够让发布商接触到更多的机会，成为了“供应侧平台”（Supply Side Platform）。而对于广告商的中间平台而言，整合众多广告商机会，从而能够让广告商接触更广的发布机会，成为了“需求侧平台”（Demand-side Platform）。而连接这两大平台的则是“广告交换平台”（Ads Exchange Platform）。关于这些平台的具体功效，我们后面会慢慢接触到。

总之，现在你可以了解到，广告系统的重要场景是涉及广告商、发布商以及受众“三种角色”的复杂系统之间的平衡以及利益的最大化。

计算广告的简要历史

当我们熟悉了广告系统的一些经典场景之后，我们现在来回顾一下计算广告系统的一个发展简史。

最早的互联网广告出现在 1994 年 11 月 27 日。AT & T 这个电信运营商在当时展现了一个叫 HotWired 的广告商的广告。那个时候，整个互联网只有三千多万用户。

1998 年的时候，Goto.com 的比尔⋅格罗斯（Bill Gross）发明了“搜索广告”（Sponsored Search），或者有些搜索引擎也把它叫作“竞价排名”。Goto.com 后来在 2001 年成为了 Overtune，并最终在 2003 年被雅虎公司收购。

2002 年，谷歌也开始了自己的搜索广告产品 AdWords 并且很快引入了 Generalized Second-Price-Auction，或者简称GSP的机制来对广告进行投标竞价。2007 年，雅虎也跟进了这种方式来管理所有的广告投标。值得一提的是，当时的谷歌还针对一个广告专利技术纠纷，支付了 240 万股股票给雅虎。

另一方面，1998 年已经有公司开始尝试利用自己的内容页面展示广告。2003 年，谷歌收购了一家叫 Oingo 的公司并且将其业务更名为 AdSense，从而开始了其展示广告服务。其后，雅虎和微软等服务商也相继效仿，扩展了自己的广告业务线。

早在 2005 年前后，各种广告交换平台也纷纷出现。这些交换平台的出现为“实时竞价”（Real-Time-Bidding），或叫RTB提供了可能性。今天，绝大多数广告平台都支持 RTB 来为广告商以及内容发布商提供服务。

总结

今天我为你简单介绍了广告系统的概况。一起来回顾下要点：第一，我们讲了广告系统的基本应用场景以及其中的重要角色；第二，我们回顾了计算广告在过去发展的一个简单历史。

最后，给你留一个思考题，除了我们所说的搜索广告和展示广告，你还见过什么其他类型的互联网广告呢？

欢迎你给我留言，和我一起讨论。

106 | 广告系统架构

从本周开始，我们就进入了计算广告这个重要的应用领域。周一我们首先介绍了广告系统的概述，了解了这个领域要解决的主要问题以及发展的简要历史。我们知道了广告系统中有发布商、广告商、受众群这些实体，还有应运而生的各类中间平台。

今天，我们就更加细致地来看一下广告系统的架构，熟悉各个组件都是怎么运作的。

实时广告竞标的重要生态圈

在前一篇分享里，我们提到了“实时竞标”广告系统（简称为RTB）这个概念。现在，我们首先来回顾一下这个系统的重要生态圈。

实时竞标系统的生态圈里有四个重要的“角色”：广告商、发布商、广告交换商和用户。在此基础上，这个生态圈产生了一些重要的新的中间平台。

供应侧平台，简称 SSP，负责管理众多发布商的展示机会，接受来自需求侧平台的竞价（简称 Bid），同时自动地展示广告。

广告交易平台，简称 ADX，是负责多个 SSP 和需求侧平台进行匹配的中间平台。

需求侧平台，简称 DSP，是负责管理众多广告商诸多广告的平台。

数据处理平台，简称 DMP，是为 SSP、ADX、DSP 提供数据服务的中间商。

值得注意的是，以上的这种区别仅仅是一种概念上的区分，目的是为了让从业人员能够更加清晰地理解各个系统的目标和作用。在实际的运作中，不少平台都充当了多个角色，甚至有比较大的互联网广告平台在这几个子系统中都有所涉及。

用户行为定向

了解了实时竞价系统的生态环境之后，我们来看在一次广告显示的流程中，这些生态伙伴都参与了什么样的动作。

第一步，用户来到某个网站，网站产生了一个对实时竞价系统广告网络的请求。

第二步，实时竞价系统广告网络向某个 DSP 发送请求，这个请求里包含了用户是谁，当前页面是什么，以及一些上下文的数据。

第三步，DSP 收到请求以后，就向 DMP 发送一个数据请求，用于收集用户更多的信息，包括用户的年龄、性别以及喜好。

第四步，DSP 收到 DMP 的信息以后，会向实时竞价系统发出一个自己认为合适的广告以及竞价的价格。

第五步，实时竞价系统广告网络收集到所有的广告竞价以后，会举行一个拍卖（Auction）。每个实时竞价系统的拍卖规则可以不同。

第六步，实时竞价系统会向赢得广告位的 DSP 发送最后的收款价格，这个价格是根据某种拍卖规则决定的。

第七步，广告显示给了用户。

第八步，用户对广告的反馈，例如是否点击，是否购买广告相应的产品，是否订阅广告对应的服务等，这些信息会返回给 DSP。

注意，这里提到的实时竞价系统广告网络既可以是一个 SSP，也可以是一个 ADX。

我们通过这个流程可以看出，在广告生态系统中，几乎所有的角色，都要在每一个广告请求中参与其中。每一个流程的不精确都有可能让最后现实的广告不符合用户的喜好。

用户追踪

从上面这个广告请求的流程中，我们可以看到，在整个广告生态系统中，对用户的追踪是一种非常重要的能力。如果广告平台的任何一个部件无法对用户信息进行有效的管理，那么，我们就无法显示相关的广告。

广告生态群对用户信息的追踪有一个基本的技术，那就是存储用户的 Cookie。实际上，在广告生态圈里，就是用 Cookie 来对用户的身份进行识别的。当用户第一次访问一个网站的时候，一段 Cookie 就会被建立并且存储在用户的浏览器里。当用户下一次再访问的时候，这段 Cookie 就会被重新访问并且可能被更改。

需要注意的是，Cookie 是和某一个域名（Domain）相关联的。比如，在通常情况下，你访问了 A 网站，B 网站就无法访问你在 A 网站的 Cookie。这样做的初衷是在互联网上可以做到保护用户的隐私以及有限制的信息共享。但作为广告平台来说，这样做当然是无助于平台对于用户信息的访问。

那么，一种方法就是 B 网站直接得到 A 网站的允许，到 A 网址植入脚本从而来收取用户的 Cookie 信息。例如，在某个时期内，纽约时报的网站就有多达 17 个合作方在对用户的数据进行收集。然而，即便是这样，每个单独的数据收集方都只能对用户在互联网上的行为进行局部的数据采集。也就是说，这些收集方很难对用户在互联网上的全部行为进行建模。很明显，这是不利于展示最有价值的广告信息的。

在这样的情况下，也就慢慢催生了一个新的技术——Cookie 的整合。简单说来，Cookie 整合要做的事情就是把多个由不同的数据收集方收集的 Cookie 进行匹配，从而能够在逻辑上把这些 Cookie 都当做同一个人处理。据统计，一个用户在 30 次点击内，就有 99% 的概率会被互联网上前 10 大“数据追踪机构”所追踪，而至少有 40% 的 Cookie 可以得到有效的整合。

当然，用 Cookie 来追踪用户并不是万能的。用户可以删除 Cookie 信息甚至在浏览器的层面禁止 Cookie 信息。这就给广告平台提出了不小的挑战。最近几年，基于其他存储技术的用户追踪手段，例如 Canvas API 或者 Flash Cookie 等也慢慢流行起来。

总结

今天我为你介绍了广告系统的基本架构。一起来回顾下要点：第一，我们分享了广告系统中各个系统的角色；第二，我们聊了各个子系统在一个广告显示请求中都干了什么事情，从感性上为你建立一个整体的观念；第三，我们简单提及了用户追踪的概念以及现在最常见的用户追踪技术的一些基本思路。

最后，给你留一个思考题，对于一个电子商务网站来说，卖家希望通过在站内显示的广告来扩大收益，这种情况下，谁是 DSP、SSP 和 ADX 呢？

欢迎你给我留言，和我一起讨论。

107 | 广告回馈预估综述

在上一篇的分享里，我们详细地讨论了广告系统的架构，熟悉了各个组件都是怎么运作的，特别是我们重点剖析了对于每一个广告请求，供应侧平台（SSP）、广告交易平台（ADX）、需求侧平台（DSP）以及数据处理平台（DMP）都扮演了什么样的角色。同时，我们介绍了对于用户信息的追踪和整合，业界的基本技术就是存储用户的 Cookie，以及慢慢催生的 Cookie 的整合技术。

今天，我们就来看一看整个计算广告领域最核心的一个问题：广告回馈预估。

什么是广告回馈预估

什么是广告回馈预估？广告回馈预估要解决什么问题？我们先来弄明白这个问题。

我们说过计算广告有两大应用领域：搜索广告和展示广告，以及围绕这些广告的生态系统。这些系统或者领域都希望达到一个最终的目的，那就是用户和广告进行交互，并且能够对广告所代表的服务或者产品产生印象，从而达成某种程度的交易。

这里的“交互”包括对传统广告的点击，也包括对视频广告的观看。而在和广告交互之后，用户对于广告所代表的服务或商品达成的“交易”，包括购买、订阅甚至是改变印象等等。那么，这一切和广告本身的交互以及和广告所代表的服务或者商品达成的交易，我们都通通称为“回馈”（Feedback）。

而我们所说的“回馈预估”，就是要预测用户这种行为的可能性，或者说是概率。也就是说，我们希望了解用户是不是有可能点击这个广告；有多大概率观看完这段视频广告；有多大可能去购买这个广告所代表的商品。

对广告的回馈概率进行有效估计是很多广告生态系统组件的一个核心需求。对于发布商来说，显示广告，不管是通过搜索结果还是通常的页面，都希望能够有用户交互从而带来收入。很多广告系统的收入模式就是依靠用户的点击从而让广告商为此支付一定费用给发布商。

因此，对于发布商来说，越是能准确估计这部分的点击率，就越能保证自己的收入。相应地，对于广告商来说，很有必要知道某一种类型的广告在哪个发布商能够带来更多的点击，从而能够有针对性地对于某个发布商进行投放。由此看来，广告回馈预估是一个非常重要的有待解决的技术问题。

广告回馈预估的普遍挑战和技术难点

既然广告回馈预估很重要，我们是不是可以直接用现成的机器学习工具就可以解决这个问题呢？这个问题有什么自身的特点，又有哪些挑战和技术难点呢？

在比较简单的设定下，广告回馈预估可以看做是某种监督学习的任务。在这类监督学习任务里，标签是用户的动作，例如点击或者观看，或者购买等。我们需要建立的是一个用户在某种上下文中对广告标签的一个模型。这里的上下文包括查询关键词、用户信息、广告信息以及一切其他有用的信息。

那么，在这样的设定下，广告回馈预估的核心挑战是什么呢？

核心挑战其实来自于稀疏的数据。

不管是在搜索广告中也好，还是在展示广告中也好，从平均的角度来说，相比于用户和正常的搜索结果或者展示结果（比如新闻内容等）的互动，用户与广告的互动要成倍地减少。有一项研究表明，在同样一个位置，广告的点击率可以是正常内容的十分之一、百分之一甚至是千分之一。也就是说，从概率的角度来看，用户普遍是不点击广告的。这个观察基本上是符合我们对用户的普遍理解的。但是，较少的点击数据造成的结果就是，从监督学习的角度来说，大量的数据点都是未交互的数据，只能当做负例来处理。

实际上，在广告点击率预估的问题中，正例的数目常常是负例的百分之一或者千分之一。这样造成的就是非常“不均衡”的数据集。而要想在不均衡的数据里中进行概率估计，往往都是一件困难的事情。

而购买事件相对于广告点击来说就更加稀少，这一点其实也很正常。在点击了广告之后，又有多少人真正会去购买这些产品呢？因此，提高广告的转化率，也就是交易发生的概率，往往就是更富有挑战的任务。

值得一提的是，在监督学习的框架中，除了数据问题以外，广告回馈预估还有目标函数的挑战。具体是什么情况呢？

在真实的系统中，我们需要在很多候选可能的广告中，选出最优的一个或者几个显示在页面上。从某种程度上来说，这更像是一个排序问题。同时，对于不少 DSP（需求侧平台）来说，广告排序的最终目的是进行“竞拍”（Auction）。因此，最后估算广告的点击率以后，还需要看广告的竞价，由此来对广告是否会赢得竞拍从而被显示在页面上进行一个更加全面的估计。很显然，和传统的推荐或者搜索比较，这些问题都要复杂许多。

广告回馈预估的算法和模型

广告回馈预估的难点和挑战来自两方面，一方面是稀疏的数据，会造成不均衡的数据集；一方面是目标函数的挑战。那么，广告回馈预估有哪些比较常见的算法或者模型呢？

我们接下来会对这一系列有关的算法和模型进行详细讨论。今天，我会带你从宏观上进行一下总结。

从最直接的监督学习的角度来看，广告回馈预估的一个常见算法就是把这个问题当做二元分类问题，并且直接利用“对数几率回归”（Logistic Regression）来对这个问题建模。实际上，直到今天，对数几率回归依然是广告回馈预估领域的重要方法。

第二类经常使用的就是树模型，特别是 GBDT 这个通常在搜索中使用的模型。我们前面已经提到了这类模型对于排序学习的作用。

第三类目前比较火热的领域就是如何利用深度学习来对回馈预估进行建模。这一类模型在最近几年有了比较大的进展。

总结

今天我为你介绍了广告系统中最核心的一个问题：广告回馈预估。一起来回顾下要点：第一，广告回馈预估就是预测“用户与广告的交互以及达成交易这种行为”的概率；第二，广告回馈预估有两方面的难点和挑战，分别来自数据和目标函数；第三，在这个领域有一些流行的模型，比如对数几率回归和数模型等。

最后，给你留一个思考题，当我们有不均衡数据集的时候，我们一般都有哪些解决方案？针对广告预估，是否需要对这些方案进行额外的处理呢？

欢迎你给我留言，和我一起讨论。

108 | Facebook的广告点击率预估模型

上一篇文章我们讲了整个计算广告领域最核心的一个问题：广告回馈预估。广告回馈预估，就是预测“用户与广告的交互以及达成交易这种行为”的概率，也就是点击率预估和转化率预估。广告回馈预估存在着数据稀疏等难点和挑战，目前在这个领域比较流行的模型有对数几率回归和数模型等。

今天，我们就来看一个广告回馈预估的实例：Facebook 的广告点击率预估。我们会结合 2014 年发表的一篇论文《Facebook 的广告点击率预估实践经验》（Practical Lessons from Predicting Clicks on Ads at Facebook）来进行分析 [1]。

Facebook 广告预估

Facebook 的广告不是我们之前介绍过的搜索广告或者展示广告的简单应用，而是社交广告。可以说，社交广告是最近 10 年慢慢崛起的一种新的广告类型。在论文发表的时候，也就是 2014 年，Facebook 有 7.5 亿“日活跃用户”（Daily Active Users）和超过 1 百万的广告商，这个数字在当时是相当惊人的。而今天，在 Facebook 上活跃的大约有 14.5 亿用户和 5 百万广告商。因此，广告系统所需要应对的规模是成倍增加的。

我们说 Facebook 的广告是社交广告，也就是说，这些广告不依赖于用户输入的搜索关键词。从 Facebook 的角度来说，广告商在其平台上投放广告的巨大优势，在于能够精准地根据用户的地理位置、年龄、性别等重要信息进行有针对性的投放，因此这些信息能够帮助平台选择什么样的广告适合什么样的人群。那这里的难点就是，对于某一个人群来说，可能符合的广告数量是巨大的，这对广告的回馈预估以及整个系统都是一个不小的挑战。

广告点击率的评估

在我们详细解释 Facebook 点击率系统的一些核心组件之前，我们首先来看一看 Facebook 的研究人员是怎么评测他们的系统的。

我们之前提到过，广告系统中的一个巨大挑战就是数据的不均衡。负例，也就是用户没有点击过的广告非常多；而正例，也就是点击过的广告相对比较少。这个比例，根据不同的广告系统会不太一样，但是大体说来，负例与正例的比大概是 10:1、100:1 甚至 1000:1。

在这样的情况下，如果把点击率预估当做是一个分类问题，按照一般分类问题的评价标准，例如准确率，我们只要预测绝大多数，甚至是全部的实例为负例，那么就可以取得很高的准确率。因此，单独看准确率并不是一个很好的评测标准。

这个时候，一个比较通行的评测不均衡数据分类问题的指标是“曲线下面积”，或者简称为 AUC，这个评测办法可以算是一种替代方法。简单来说，AUC 就是看我们是不是能够把正例给排序到负例上面。也就是说，如果每一个正例和负例都有一个预测数值，那么我们按照这个数值排序，去数每一个正例下面有多少负例，然后对所有正例所对应的数取平均。AUC 的数值高，则代表我们可以把绝大多数正例排序到负例前面。

当然，AUC 也不是万能的。AUC 的一个最大问题就是它并不在乎所有实例的绝对预测数值，而只在乎它们的相对位置。这在广告系统中可以说是一个非常大的缺陷。我们之前也提过，有很多广告系统组件依赖于对于广告点击率的精确预估，比如收费系统，流量预测等。因此，仅有一个相对位置的正确是不够的。

在这篇论文中，Facebook 团队提到了一个概念叫“归一化的交叉熵”，简称 NE，用于衡量广告系统的好坏。NE 实际上是一个比值，比值的分母是数据中观测到的实际的点击率的数值，也可以叫作数据的“背景估计”（Background Estimation）；而分子是某一个模型对点击率的估计。这样做的归一化，目的就是来看，在去除了背景估计的情况下，对点击率的估计是否依然好或者坏。

层次化的点击率预估模型

Facebook 的研究人员在这篇论文中提出的点击率预估模型分为两个层次。也就是说，从最初的模型特性输入，需要经过两个不同的模型才对点击率做出最终的预测。这个两层架构对后来的很多点击率预估模型有巨大的影响。

我们首先来看第一层模型，这里的输入是最初的特性，其中连续数值的特性已经被转换成了离散的数值。然后，这些离散的数值经过了一个GBDT 树来进行特性转换。这里为什么会用 GBDT 呢？主要有两层意义。

第一，GBDT 可以对特性进行非线性组合。也就是说，GBDT 的输出一定是之前特性的非线性的转换，这是由树模型原本的性质所带来的，这个性质对于线性模型来说会有巨大的优势。

第二，经过 GBDT 转换之后，树模型其实选择出了对目标有用的特性，因此这里还起到一个“特性筛选”（Feature Selection）的作用。也就是说，经过 GBDT 的模型，最后剩下的特性肯定是要远小于最初的输入特性的，毕竟有作用的特性是少数的。

在经过了 GBDT 之后，Facebook 的研究者用树模型最后的叶节点当做新的特性，然后再学习了一个线性的分类模型。这里的思想其实和后来流行的深度学习的想法很类似，也就是先对输入特性进行非线性转换，然后再经过一个线性分类器来进行最后的预测。这个第二层的线性分类器可以用类似 SGD 的方法进行“在线学习”（Online Learning）。因此，学习到这样一个模型就相对比较容易。

在论文的实验中，作者们不仅展示了两层模型的优势，并且还讨论了很多选取特性方面的经验以及训练模型的经验，比如广告过去的历史信息非常重要，而绝大多数重要的特性都和历史信息有关。

总结

今天我为你介绍了 Facebook 的广告点击率预估的核心算法。一起来回顾下要点：第一，Facebook 的广告是社交广告，有其自身的特点和难点；第二，Facebook 对广告进行评测的指标主要有 AUC 和 NE；第三，Facebook 提出了两层模型的架构，其主要思想是先经过 GBDT 来进行特性转化，再经过一个线性分类器进行最后的预测。

最后，给你留一个思考题，对于两层架构来说，除了模型性能上的优势以外，在训练的方便程度上，这样的架构还没有什么优势或者劣势呢？

欢迎你给我留言，和我一起讨论。

参考文献

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.

109 | 雅虎的广告点击率预估模型

在上一篇文章中，我和你分享了广告回馈预估的一个实例：Facebook 的广告点击率预估。我们重点讲了 Facebook 利用“归一化的交叉熵”这个概念，来衡量广告模型的精准度。另外，我们还分享了 Facebook 提出的两层模型架构，也就是一开始先利用树模型 GBDT 来对特性进行非线性转换和选择，然后再利用一个在线学习的线性模型进行最后的预测，这个架构后来得到了很多研究者和实践者的追随。

今天，我们来分析另外一个经典的公司实例：雅虎的广告点击率预估模型。

雅虎早期的广告预估模型

对于曾经的互联网巨头雅虎来说，广告系统很早就成为其重要的经济支柱。早在 2007 年甚至更早的时候，雅虎的工程师和研究人员就投入到了对广告点击率预估的研究中。这方面的几个代表作我列在了文末的参考文献（[1]、[2] 和 [3]）里，如感兴趣，你可以进一步学习。

我们在这里集中讲讲这些工作的核心思路。

首先，雅虎的研发人员很早就注意到了广告预估模型的一个难点，那就是数据的稀疏性。这些具有稀疏性的数据带来了一个后果，那就是模型对很多“罕见事件”（Rare Events）的估计会出现很大的不稳定性。

我们来举个例子，如果广告 1 在纽约地区展示了 1 万次，点击 200 次，点击率是 0.02；而广告 2 在旧金山地区展示了 1 百次，点击 3 次，点击率是 0.03，在这样的情况下，我们能判断广告 2 就一定比广告 1 有更高的点击率吗？这里面至少有两个因素需要考虑。

第一，上下文的特性信息非常重要。这两个广告可能是类型不同，可能展示的地区不同，因此并不能完全直接来对这两个广告进行比较。第二，广告 2 在旧金山地区的展示次数还比较少，因此 0.03 这个预估值可能是非常不准确的，或者说至少是不稳定的，它的误差要大于第一个广告。

这个时候，研发人员就会思考，如何对这些广告的预估进行更加精确的处理呢？

在这样的背景下，雅虎的研发人员提出了一个点击率估计方法，其实也是一种两层模型。第一层模型就是最原始的对点击率的估计，也就是类似我们上面所说的直接按照数据进行估计。当然，这里的问题我们刚才也已经提到了，就是估计的不稳定性。第二层模型是对第一层模型的修正。所谓修正，就是利用层次化信息来对原始的估计值进行“平滑”（Smoothing）。

什么是层次化信息呢？我们举例来说明。比如，两个广告来自于同一个广告商，因此它们应该有一定的类似的点击率；两个广告被展示到同一个地区，它们也应该有一定的类似的点击率。这些层次信息给了我们一些启示，来对原始估计值进行修正。当然，根据我们这两个例子你就可以看出，一个广告可以受到多个层次信息的影响，比如广告商的层次信息，地理位置的层次信息，以及类别的层次信息等。所以，要想设计一套完善的基于层次信息的平滑方案也并非易事。

这个时期，雅虎在这方面的工作都围绕着一个主题，那就是如何对平滑方案进行创新。一种方法是利用“产生式模型”（Generative Model）的概念，把层次信息的叶子节点的数据产生过程，定义为基于其父节点数据的一个概率分布产生过程，从而把整个平滑方案的问题转换成为了一个有向无环图上的每个节点的后验概率参数的估计问题（参考文献 [1] 和 [2]）。另外一种方法则采取了一个不太一样的思路，那就是在做平滑的时候，在这种产生式建模之后，还追加了一个过程，利用树模型来对平滑的结果进行再次修正，使得最后的结果能够达到更高的精度（参考文献 [3]）。

这一系列工作虽然在概念上有很高的学术和实践价值，特别是如何利用层次性信息来对预测进行平滑这个方面，但是从整体来说，预估方案变得非常复杂而且环节太多。

雅虎后期的广告预估模型

雅虎后期的广告预估模型又从比较复杂的两层模式转换为了一层模式。这个转换主要是考虑到了整个流水线（Pipeline）的复杂度以及需要处理的数据规模逐渐变大，那么利用更加稳定和简单的方法就势在必行了。

对于雅虎后期的广告预估模型，我参考论文《简单和可扩展的展示广告响应预测》（Simple and Scalable Response Prediction for Display Advertising）[4]，在这里为你简单做一个总结。

总体来说，整个模型回到了相对简单的“对数几率回归”（Logistic Regression），并且直接对所有的特性（Feature）进行建模。这里面唯一可能和之前的很多工作不太一样的地方，是大量使用了“特性哈希”（Feature Hashing）的方法。简单来说，特性哈希就是把原来大规模的有可能是极其稀疏的特性给压缩到了一个固定维度的特性空间里。当然，这肯定会对精度等性能有一定影响，因此这是一个需要有一定取舍的决策。

在这篇论文中，作者们还介绍了如何对大量的数据进行采样，以及如何利用配对的特性（也就是把两种不同的特性，比如广告商和地理位置进行配对）来自动产生更多的非线性因素的方法。

那么这个一层模式的方法所达到的效果怎样呢？论文中论述，相比于之前的两层结构，这个方法所达到的效果有很大程度的提升。

总结

今天我为你介绍了雅虎的广告点击率预估模型。一起来回顾下要点：第一，雅虎早期的广告预估算法，其重点放在了一种两层模型架构上；第二，雅虎广告预估后期的一些思路，重点则放在了回归到一种更加简单的架构上。

最后，给你留一个思考题，如何在对数几率回归这样的线性模型中引入层次化的平滑思路呢？

欢迎你给我留言，和我一起讨论。

参考文献

1. Deepak Agarwal, Andrei Zary Broder, Deepayan Chakrabarti, Dejan Diklic, Vanja Josifovski, and Mayssam Sayyadian. Estimating rates of rare events at multiple resolutions. Proceedings of the 13th ACM SIGKDD international conference on Knowledge discovery and data mining (KDD '07). ACM, New York, NY, USA, 16-25, 2007.

2. Deepak Agarwal, Rahul Agrawal, Rajiv Khanna, and Nagaraj Kota. Estimating rates of rare events with multiple hierarchies through scalable log-linear models. Proceedings of the 16th ACM SIGKDD international conference on Knowledge discovery and data mining (KDD '10). ACM, New York, NY, USA, 213-222, 2010.

3. Nagaraj Kota and Deepak Agarwal.Temporal multi-hierarchy smoothing for estimating rates of rare events. Proceedings of the 17th ACM SIGKDD international conference on Knowledge discovery and data mining (KDD '11). ACM, New York, NY, USA, 1361-1369, 2011.

4. Olivier Chapelle, Eren Manavoglu, and Romer Rosales. Simple and Scalable Response Prediction for Display Advertising. ACM Trans. Intell. Syst. Technol. 5, 4, Article 61 (December 2014), 34 pages, 2014.

110 | LinkedIn的广告点击率预估模型

上一篇文章我们讲了雅虎的广告预估模型。雅虎早期的模型主要集中在如何利用两轮架构来对点击率进行精确建模，后期的模型回归到了比较传统的利用线性模型外加特性哈希来进行大规模点击率预估的模式。

今天，我们继续来做公司的案例分析，结合论文《LASER：在线广告的可扩展响应预测平台》（LASER: a scalable response prediction platform for online advertising）[1]，来了解 LinkedIn 这家公司是怎么来做最基本的广告预估的。

LinkedIn 广告预估模型

我们首先来看一看 LinkedIn 的广告预估模型。这个模型的一大“卖点”就是直接充分考虑了“冷启动”和“热启动”两种模式。

那么，什么是“冷启动”，什么又是“热启动”呢？

从我们之前的分享中可以看出，很多点击率预估的模型，都强烈依赖于对用户过去信息以及对广告过去表现的建模。比如刚刚讲过的雅虎预估模型，在它早期的模式中就已经见到了这种信息的作用。

然而，当我们出现新用户或者新广告时，就会有“冷启动”的问题。也就是说，“冷启动”主要是针对新用户或者新广告而言的。这时候基于历史信息的特性都无法起作用了，一般来说需要有专门的处理。

相对于“冷启动”，“热启动”指的是我们已经掌握了用户或者广告的一定信息，然后利用这些历史信息来对点击率进行预测。

这么说来，我们一般需要有两套对策，一套针对“冷启动”，一套针对“热启动”。LinkedIn 的方法就是希望通过一个模型来同时解决这两个问题。

具体来说，LinkedIn 把对点击率的预估拆成了三个部分。

第一部分，是利用用户、广告和上下文所建立的全局性预测。什么意思呢？就是我们利用用户特性、广告特性以及上下文特性来对点击率进行预测。这部分的核心思路就是这些特性所对应的系数是全局性的。也就是说，对于不同的用户、不同的广告以及不同的上下文所对应的系数是相同的。因为是全局性的系数，因此这部分其实提供了一种“冷启动”的需求，也就是不管是任何新的用户或是广告，只要有一定的特性，我们总能通过这部分得到一种粗略的估计。

第二部分，是利用第一部分的用户、广告和上下文信息组成交叉特性，从而学习这些特性之间的关系。如果说第一部分直接就是线性的预测，那么第二部分其实就是“交叉项”形成的非线性的部分。我们之前在讲推荐系统的时候提到过“分解机”（Factorization Machines）这个模型，讲到过这种“交叉项”所带来的非线性预测的好处。虽然这里和分解机的构成不完全一样，但是整体上表达了相似的意思。

第三部分，是 LinkedIn 模型提出来的独特之处（和其他公司模型不太一样的地方）。那就是同样是利用用户、广告和上下文特性，但是 LinkedIn 所提模型的系数则是每个用户、广告和上下文都不同。作者们认为这可以实现“热启动”效果。也就是说，当某个用户、某个广告或者某个上下文已经有比较多的数据以后，就可以依靠这些用户、广告或者上下文自己的系数了，而不仅仅依靠第一部分的全局系数。这个第三部分只有当数据比较多的时候才能够起作用。

模型的其他特性

这个模型在增加了这些系数的先验概率信息之后变得相对比较复杂。这篇论文介绍了一系列的模型训练思路，都是不错的可以借鉴的工业界经验。

首先，作者们认为，刚才模型中所说的三个部分所需要的模型更新频率是不一样的。比如第一部分和第二部分都可以认为是全局模型，也就是说系数是全局性的。因此这些模型的变化会比较慢，作者们建议一个星期对模型进行一次更新。而第三部分则是在已经积累了历史信息后慢慢呈现出的效果，因此对于数据会非常敏感，而且每个用户和每个广告都是不同的系数，因此需要在短时间内，比如半个小时甚至几分钟内，就重新训练模型，以达到个性化的目的。

其次，作者们还把提出的模型和 EE（Exploit & Explore）策略结合了起来。我们在讲推荐系统时介绍过 EE 的思路，简单回顾一下 EE 的目的，主要就是探索那些并没有太多机会被展示的物品，在这里也就是广告。我们刚才说了，所有的系数都加上了先验概率，因此其实可以很容易结合数据计算后验概率分布。有了后验概率分布，作者们提出了以汤普森采样为主的 EE 模式。这也可以算是论文提出模型的一大亮点。

最后我们提一下这个模型的训练算法。因为要在大规模的数据上对模型进行训练，这篇文章采用了一种ADMM 算法。在文章提出来的时候，作者们还是希望能够利用单个服务器对所有的模型参数进行训练。和其他的算法相比，一般认为 ADMM 这种算法的收敛速度更快，但是，利用这种算法的其他公司并不太多。

总结

今天我为你介绍了 LinkedIn 广告点击率预估的核心算法。一起来回顾下要点：第一，我们讲了 LinkedIn 把点击率预估分为三个部分，从而分别解决“冷启动”和“热启动”的思路；第二，我们聊了如何更加有效地对这个提出的模型进行训练学习。

最后，给你留一个思考题，回顾我们讲过的推荐系统模块，我们还介绍过什么方法可以结合“冷启动”和“热启动”呢？

欢迎你给我留言，和我一起讨论。

参考文献

Deepak Agarwal, Bo Long, Jonathan Traupman, Doris Xin, and Liang Zhang. LASER: a scalable response prediction platform for online advertising. Proceedings of the 7th ACM international conference on Web search and data mining (WSDM '14). ACM, New York, NY, USA, 173-182, 2014.

111 | Twitter的广告点击率预估模型

在上一篇文章的分享里，我们了解了 LinkedIn 这家公司是怎么来做最基本的广告预估的。LinkedIn 的广告预估模型分为三部分，这里面的核心思想是直接对“冷启动”和“热启动”进行建模，外加和 EE 策略（Exploit & Explore）结合在一起，从而提升了效果。

今天，我们就结合论文《Twitter 时间轴上的广告点击率预估》（Click-through Prediction for Advertising in Twitter Timeline）[1]，来看看 Twitter 的广告预估到底是怎么做的。

Twitter 的广告预估

我们前面提到过最基本的广告形态分类，可以分为“搜索广告”和“展示广告”。当计算广告在互联网上出现以后，这两种广告形态就迅速被很多网站和服务商所采纳。

在最近的 10 年里，随着社交媒体的发展，希望在社交媒体的用户信息流里投放广告的需求逐渐增强。我们之前谈到的 Facebook 的案例，其实也是往用户的信息流中插入广告。很多类似的社交媒体都争先恐后地开始进行相似的项目，这一类广告经常被称为社交广告。

社交广告的特点是，需要根据用户的社交圈子以及这些社交圈所产生的内容，而动态产生广告的内容。广告商和社交媒体平台都相信，不管是在投放的精准度上，还是在相关性上，社交广告都有极大的可能要强过搜索广告和展示广告。毕竟，在社交媒体上，用户有相当多的信息，例如年龄、性别，甚至在哪里工作、在哪里上学等，这些信息都有助于广告商的精准投放。而用户自己在社交媒体上追踪的各种信息，又可以让广告商清晰地知道用户的喜好。

Twitter 的工程师们在这篇论文里介绍的也是在信息流里投放的社交广告。只不过，Twitter 的工程师们认为，我们之前分享的 Facebook 的解决方案，并没有真正考虑往信息流里插入广告的难点，也就是广告的排序，依然把广告的排序问题当做分类问题，也就是用对数几率回归（Logistic Regression）来解决。

另外，Twitter 的工程师们认为，社交广告比类似 Google 的搜索广告更具挑战性。因为在社交信息流里，用户所看到的信息都是随时变化的，比如用户在 Twitter 中，可能随时有新的信息进入到信息流中，因此信息流的上下文会随时发生变化。那么，如果要投放和上下文相关的广告，这种变化无疑会带来前所未有的挑战。

利用排序学习来对广告排序

既然 Twitter 的工程师们认为，信息流广告的建模最重要的就是借鉴排序学习的办法。那么，我们就来看一看他们是怎么利用排序学习来为信息流社交广告建模的。

首先，排序学习中最基本的就是“单点法”（Pointwise）排序学习。回顾一下，单点法其实就是把排序学习的任务转化为分类问题。其实典型的就是直接利用“支持向量机”（SVM）或者对数几率回归模型。

第二种比较常用的排序学习的方法就是“配对法”（Pairwise）排序学习。通俗地讲，配对法排序学习的核心就是学习哪些广告需要排到哪些广告之前。这种二元关系是根据一组一组的配对来体现的。学习的算法，主要是看能否正确学习这些配对的关系，从而实现整个排序正确的目的。对于配对法排序，我们依然可以使用对数几率回归。只是这个时候，我们针对的正负示例变成了某个广告比某个广告排名靠前，或者靠后。

值得一提的是，通过配对法学习排序学习，对于一般的搜索结果来说，得到最后的排序结果以后就可以了。而对于广告来说，我们还需要对点击率进行准确的预测。这个我们之前提到过。于是在这篇文章中专门提到了如何从配对结果到点击率的预测。

具体来说，原理其实很简单，根据配对法学习排序完成以后的广告之间顺序是绝对的，但是绝对的数值可能是不太精确的。这里进行校准的目的是根据配对法产生的预测值，再去尽可能准确地转换为实际的点击率的数值。一般来说，这里就可以再使用一次对数几率回归。也就是说，这个模型的唯一特性就是配对法产生的预测数值，然后模型的目的是去估计或者说是预测最后的实际数值。这种使用一个回归模型来进行校准的方法，也用在比如要将支持向量机的结果转换成概率结果这一应用上。

虽然从原理上讲，先有一个配对模型进行排序，然后再有一个校准模型对模型的绝对估计值进行重新校正，这是很自然的。但是在实际的工业级应用中，这意味着需要训练两个模型，那无疑就变成了比较繁复的步骤。﻿

所以，在这篇文章里，作者们想到了一种结合的办法，那就是结合单点法和配对法。具体来说，就是直接把两者的目标函数串联在一起。这样做的好处是，可以直接用现在已经有的训练方法，而且同时解决了排序和更加准确预测点击率的问题。我们回顾一下，单点法的特性是尽可能准确地预测每一个广告的点击率，也就是刚才提到的校准的这一个步骤所需要干的事情。这种直接串联的好处是，只需要学习一个模型就可以做到既考虑了排序，又考虑了预测的绝对精准度的问题。

在机器学习应用中，串联多个目标函数是经常使用的一种技术。其目的和作用也就和这个串联的想法一样，就是希望针对多个不同的目标进行优化。一般来说，这里面的核心是，多个串联的目标函数需要共享模型参数才能形成有关联的总的大的目标函数；如果没有共享参数，那就仅仅是一种形式上的串联。

模型的实验

在这篇文章里，作者们也是用了 Facebook 提出的“归一化的交叉熵”，简称 NE 的概念以及业界比较常用的 AUC 来针对模型进行线下评价。

在线下实验中，配对法以及单点法和配对法结合的混合方法都在 AUC 上要超过单点法本身。这非常容易理解。只是配对法针对单点法在 NE 上的表现要差很多。这和我们刚才所说的没有对点击率进行估计有很大关系。这一点也在实验中得到了证实。

在在线实验中，单点法相对于以前的自然排序，点击率好了将近 14%，而混合法则好了 26% 左右。可以说效果非常明显。

总结

今天我为你介绍了 Twitter 广告点击率预估的核心算法。一起来回顾下要点：第一，我们讲了 Twitter 认为社交广告的难点是要解决广告的排序问题；第二，我们聊了如何利用排序学习来为点击率预估进行效果提升。

最后，给你留一个思考题，为什么 Twitter 不尝试使用树模型来对点击率进行提升呢？

参考文献

Cheng Li, Yue Lu, Qiaozhu Mei, Dong Wang, and Sandeep Pandey. Click-through Prediction for Advertising in Twitter Timeline. Proceedings of the 21th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (KDD '15). ACM, New York, NY, USA, 1959-1968, 2015.

112 | 阿里巴巴的广告点击率预估模型

今天，我们继续来进行点击率预估的案例分析，结合三篇核心论文，来看一看阿里巴巴的广告预估又有哪些值得我们学习的地方。

多段线性模型

我们之前介绍了多个公司关于点击率或者转化率预估的案例。从这些案例中，你可能已经发现有两个非常重要的特征需要机器学习模型来处理。

第一，就是数据中呈现的非线性化的关系。也就是说，我们的模型必须在某一个地方考虑到特性之间的非线性表征，以及对于目标标签的非线性关系。

第二，就是数据的不均衡以及数据的稀疏性。有很多广告商是新广告商，很多广告是新广告。在这样的情况下，我们就必须要处理“冷启动”和“热启动”这两种局面。

在《从广告点击率预估的大规模数据中学习多段线性模型》（Learning Piece-wise Linear Models from Large Scale Data for Ad Click Prediction）[1] 这篇文章中，作者们提出了一种多段线性模型来解决我们刚刚说的这两个问题，这个模型简称为LS-PLM（ Large Scale Piecewise Linear Model ）。

LS-PLM 的核心思路其实非常直观。既然数据在整个空间里可能呈现非线性的关系，那么我们是否能够把整个空间分割成较小的区域，使得每个区域内依然可以使用线性模型来逼近这个区域内的数据点呢？其实在统计学习中，这种模型常常被叫作“混合模型”。在很多机器学习教科书中都会讲授的一种混合模型是“高斯混合模型”（Gaussian Mixture Model）。

LS-PLM 在这篇论文的实际应用中，基本上可以被理解成为一种混合线性模型。这个模型的一个子模型叫作“分割函数”，也就是模型需要学习每一个数据点到底是依赖于哪一个线性模型来进行预测的。当然，这个分割是一种概率的分割。实际上，每一个数据点都依赖所有的线性模型来进行预测，只不过对每个模型的依赖程度不一样。对于每一个不同的线性模型来说，最大的不同就是每一个模型有自己的系数。也就是说，之前只有一个全局模型并且只有一组系数，相比之下，这里有多组系数来决定模型的预测效果。很明显，对于 LS-PLM 来说，每一个局部都是线性的，但是在整体上依然是一个非线性的模型。

LS-PLM 还借助了两种正则化机制。一种叫作L1 正则，这种正则化主要是希望模型保留尽可能少的特性，从而达到对于模型特性的选择。另外，模型还采用了一种L2,1 正则的方法，这种方法的目的也是特性选择，但是希望能够把一组特性全部选择或者全部置零。

在实际的实验中，作者们尝试了不同数目的数据分割，从 2 个到 36 个不等。最终，他们发现当数据分割为 12 个的时候，模型的效果达到最优，而之后，模型效果并没有明显提升。最终推出模型的 AUC 比直接使用一个对数概率回归的全局模型，效果要好 1.4%。

广告点击率预估和图像处理的结合

我们在电商上购物，对于商品的图像会不会影响我们的点击或者购买，应该有一个直观的感受。那么在广告的点击率预估上，商品的图像特征对于模型性能上的提高到底有没有帮助呢？我们再来看一篇论文 [2]，在这篇文章中，阿里巴巴的工程师就尝试对这个问题进行回答。

这篇文章结合了近期好几个利用深度学习来进行图像处理和广告点击率预估的工作。首先，就是所有的特性都利用一个“嵌入层”（Embedding Layer）把原始的特性转换成为数值特性。这种思路我们在之前介绍文本处理，特别是 Word2Vec 的时候曾经进行了详细的讲解。而在这里，不管是文本信息还是图像信息，都根据自己的特点转换成为了数值特性。

这里我们要解决的一个核心问题，就是用户和广告之间的匹配问题，这篇论文的模型是这么处理的。首先，对所有广告的 ID 及其图像进行单独的嵌入。然后对用户过去的喜好，特别是对图像的喜好进行了另外的嵌入，然后这些嵌入向量形成用户的某种“画像”。用户的画像和广告信息的嵌入被直接串联起来，形成最终的特征向量。在此之上，利用一个多层的神经网络来学习最后的点击率的可能性。

在深度学习建模中，这种把多种来源不同的信息通过简单的拼接，然后利用多层神经网络来进行学习的方法非常普遍和实用。

在这篇论文的介绍中，除了在模型上对图像进行处理以外，还有一个创新，就是提出了一个叫“高级模型服务器”（Advanced Model Server），简称AMS的架构理念。AMS 是针对深度学习模型的大计算量而专门打造的计算体系。总体来说，AMS 的目的是把深度学习模型中的很多基础步骤进行拆分，然后把这些步骤部署到不同的服务器上，从而能够把复杂的模型拆分成细小的可以互相交流的步骤。

从最终的实验结果上来看，基于深度学习的模型要比对数几率回归的模型好 2~3%。整体上来看，利用了图像的模型要比没有利用图像的模型都要好，哪怕是线性模型也是一样的效果。但是，这个好的程度非常之小，基本上可以忽略不计。看来如何好好利用图像的信息，依然是一个比较大的挑战。

深度兴趣网络

我们刚才介绍的这种把其他信息和图像信息进行结合的方法，最近在一篇文章 [3] 中有一个总结。在这篇论文中，作者们提出了一种叫“深度兴趣网络”，或者简称DIN的架构。

DIN 依靠一种基本的模型架构，那就是先把所有的特性变换成嵌入向量，然后针对不同的特性进行划组，一些特性得以直接进入下一轮，另一些特性经过类似图像中的池化（Pooling）操作抽取到更加高级的特性。之后，所有的特性都被简单串联起来，然后再经过多层的深度神经网络的操作。

DIN 在这个架构的基础上，提出了一种新的“激活函数”（Activation Function），叫DICE，目的是可以在不同的用户数据中灵活选择究竟更依赖于哪一部分数据。可以说，在某种意义上，这个架构非常类似深度学习中比较火热的Attention 架构，其目的也是要看究竟那部分数据对于最终的预测更有效果。

从最后的实验中看，不管是在内部数据还是外部公开的例如 MovieLens 或者 Amazon 的数据上，基于 DIN 的模型都比线性模型和其他的深度学习模型有显著的提高。

总结

今天我为你介绍了阿里巴巴广告点击率预估的核心算法。一起来回顾下要点：第一，我们讲了如何利用混合线性模型来引入非线性的因素从而提高预测效果。第二，我们聊了如何利用深度学习模型来对数据进行建模，谈到了图像在这里面起到的作用。

最后，给你留一个思考题，深度学习模型在点击率预估方面的最大优势是什么？又有什么劣势呢？

欢迎你给我留言，和我一起讨论。

参考文献

1. Kun Gai, Xiaoqiang Zhu, Han Li, Kai Liu, Zhe Wang. Learning Piece-wise Linear Models from Large Scale Data for Ad Click Prediction. CoRR abs/1704.05194 , 2017.

2. Tiezheng Ge, Liqin Zhao, Guorui Zhou, Keyu Chen, Shuying Liu, Huiming Yi, Zelin Hu, Bochao Liu, Peng Sun, Haoyu Liu, Pengtao Yi, Sui Huang, Zhiqiang Zhang, Xiaoqiang Zhu, Yu Zhang, Kun Gai. Image Matters: Jointly Train Advertising CTR Model with Image Representation of Ad and User Behavior. CoRR abs/1711.06505 , 2017.

3. Guorui Zhou, Chengru Song, Xiaoqiang Zhu, Xiao Ma, Yanghui Yan, Xingya Dai, Han Zhu, Junqi Jin, Han Li, Kun Gai. Deep Interest Network for Click-Through Rate Prediction. CoRR abs/1706.06978 , 2017.

113 | 什么是“基于第二价位的广告竞拍”？

在之前一段时间的分享里，我们重点讲解了广告系统中的回馈预测，也就是我们常说的点击率预测或是转化率预测的问题，和你一起分享了一些有代表性的公司对于点击率预测的技术方案。

在最早介绍计算广告系统的时候，我们介绍了 DSP，也就是需求侧平台的基本功能。这个平台的一个很重要的作用就是决定到底投放哪个广告。我们介绍过的点击率预测可以提供对广告优劣的一种预测，除此之外，我们还需要一种机制，来决定如何从众多的广告中进行选取，这就是广告的竞价排名。

广告位竞价排名的出现有两个原因。第一，发布商的广告位是有限的。不管是搜索广告还是展示广告，绝大多数的发布商都以一定的比例在原生的内容，例如新闻、社交媒体内容里插入一些广告位。但是这些广告位的数目是有限的，特别是在优质的发布商资源里，就会出现一些广告位有着很大的竞争。第二，既然有竞争，那么如果引入一种竞价机制的话，势必有可能抬高广告的单价，从而让广告中间平台例如 DSP，或者是发布商从中获取更高的价值。

今天，我们就来讲一讲广告位竞价的一个基本原理，特别是目前广泛使用的基于第二价位的广告竞拍。

基于第一价位的竞拍

在我们开始讨论基于第二价位的广告竞拍之前，我们首先来看一个更加自然的竞拍手段，基于第一价位的竞拍。其实，在现实生活中，基于第一价位的竞拍会显得更加普遍。

所谓基于第一价位的竞拍，指的是所有的投标方都定好自己的出价，然后一次性统一出价。在出价的过程中，所有的投标方都是看不见竞争对手的出价的，这保证了出价的诚实性。

当竞拍平台接到所有投标方的出价以后，按照出价由高到低排序，出价最高的投标方获得投标的胜利。

在广告系统中，如果要采用这样的形式，那么，决定最后投标顺序的不再是单纯的价格，而往往是一个投标价格和点击率的函数，最简单的函数就是点击率乘以投标价格。这其实也可以被认为是一种“期望收入”。也就是说，如果发布商或者 DSP 是按照广告的每一次点击来收取费用的话，那么，点击率乘以投标价格就是这种收入的一个数学期望值。

所以，基于第一价位竞价的广告系统，按照广告收入的期望值进行竞价排名。排名第一的广告被选为显示的广告。

这种机制在早期的互联网广告平台中曾被大量使用。但是一段时间以后，大家发现，基于第一价位竞价的竞价结果往往是“虚高”的。

这也很容易形象地解释，在大家都不知道对方出价的情况下，如果希望自己能在竞拍中胜出，势必就可能报出比较高的价格。另外一个方面，投标方并不清楚这个广告位的真实价值，大家只能在条件允许的情况下，尽量抬高价格来获取这个机会。

从某种意义上来说，这样的竞价并不利于广告商的长远发展，也打击了广告商的积极性。

基于第二价位的竞拍

就是在基于第一价位竞价的基础上，互联网广告界逐渐衍生出了一种新的竞拍方法——基于第二价位的竞拍。

当我们已经熟悉了基于第一价位的竞拍模式以后，理解基于第二价位的竞拍就比较容易了。

首先，和基于第一价位的竞拍模式一样，基于第二价位的模式也是按照广告的期望收入，也就是根据点击率和出价的乘积来进行排序。但和基于第一价位模式不一样的是，中间商或者发布商并不按照第一位的价格来收取费用，而是按照竞价排位第二位的广告商的出价来收取费用。也就是说，虽然第一名利用自己的出价赢得了排名，但是只需要付第二名所出的价格。

很多互联网广告平台采用了基于第二价位的竞拍之后，发现广告商的竞价表现整体上要比基于第一价位的时候要好。时至今日，基于第二价位的竞拍方式已经成为了互联网广告的主流竞拍模式。

那么，基于第二价位的竞拍方式究竟有什么好处呢？文末推荐一个参考文献 [1]，有比较详细的描述。简单来说，研究人员发现，在基于第二价位竞拍的形式下，广告商按照自己对于广告位价值的理解来竞拍是相对较优的策略。

在基于第二价位的竞拍方式的环境中，又有什么值得注意的技术难点呢？

对于广告商来说，主要是希望知道在当前出价的情况下，究竟有多大的概率赢得当前的竞拍。这也就是所谓的“赢的概率”，这对于广告商调整自己的出价有非常重要的指导意义。对于整个出价的概率分布的一个估计，有时候又叫作“竞价全景观”（Bid Landscape）预测。这是一个非常形象的说法，因为广告商希望知道整个赢的概率随着出价变化的整个分布，从而调整自己的安排。

这样的预测工作会用到一些简单的模型。比如，有学者认为，赢的价格服从一个“对数正态分布”（Log-normal）。也就是说，广告商出的价格并且最终赢得竞拍的这些价格，在取了对数的情况下，服从一个正态分布。当然，这是一个假设。但是有了这么一个假设以后，我们就可以从数据中估计这个对数正态分布的参数，从而能够对整个“竞价全景观”进行估计。

对于“竞价全景观”或者是赢的价格分布的估计有一个比较困难的地方，那就是，作为广告商来说，往往并不知道所有其他竞争对手的出价，以及在没有赢得竞拍的情况下，那些赢得竞拍的出价是多少。简而言之，也就是我们只观测到了一部分数据，那就是我们赢得这些广告位的出价。在这种只有一部分信息的情况下，所做的估计就会不准确。

已经有一些研究工作关注这样情况的预测。比如，论文《用截尾数据预测实时招标中的赢价》（Predicting winning price in real time bidding with censored data）[2] 就利用了一种对数几率回归来估计那些没有赢得竞拍情况下的赢的价格，然后和已知的赢的价格一起对整个“竞价全景观”进行估计，这也算是目前的一项前沿研究。

总结

今天我为你介绍了广告竞价系统中的基于第二价位的广告竞拍。

一起来回顾下要点：第一，我们讲了基于第一价位的竞价原理，就是按照广告收入的期望值进行竞价排名，排名第一的广告竞拍成功；第二，我们聊了基于第二价位的竞价原理和一些技术难点，主要是如何对整个“竞价全景观”进行估计。

最后，给你留一个思考题，既然竞价排名是按照点击率乘以价格，那如何避免下面这样一种情况呢？就是一些点击率比较低的广告商利用很高的价格占据广告位，从而让用户看到很多不相关的广告？

欢迎你给我留言，和我一起讨论。

参考文献

Jun Wang, Weinan Zhang and Shuai Yuan. Display Advertising with Real-Time Bidding (RTB) and Behavioural Targeting. Foundations and Trends® in Information Retrieval: Vol. 11: No. 4-5, pp 297-435, 2017.

Wu, W. C.-H., Yeh, M.-Y., and Chen, M.-S. Predicting winning price in real time bidding with censored data. Proceedings of the 21st ACM SIGKDD International Conference on Knowledge Discovery and Data Mining, pages 1305–1314. ACM, 2015.

114 | 广告的竞价策略是怎样的？

在上一次的分享里，我们讲了广告位竞价的一个基本原理，那就是目前广泛使用的基于第二价位的广告竞拍。简单来说，基于第二价位的广告竞拍需要利用广告点击率的估计值和竞拍的价格，把所有的竞拍广告进行排序，排名第一的广告赢得竞拍。和基于第一价位的广告竞拍不一样的是，基于第二价位的广告竞拍并不直接利用排名第一的广告的出价来对其进行收费，而是利用排名第二的价位进行收费。在这样的情况下，有理论工作和实际的数据表明，基于第二价位的广告竞拍更加符合广告商对于广告位本身真实价值的判断。

今天我们来看在基于第二价位的广告竞拍的基础上，DSP 或者广告商究竟该如何形成自己的竞价策略（Bidding Strategy）。

竞价策略

为什么需要竞价策略？其实这个问题主要是在“实时竞价”，或简称RTB的背景下来探讨的。

我们之前提到过，RTB 是 DSP 目前流行的竞价模式，也就是广告商等利用计算机程序来自动对广告竞拍进行出价。从实际的运作中来看，这样的自动竞价模式要比人工竞价更加方便快捷，也更加高效。然而，在自动竞价的模式下，我们势必需要一种指导思想，来让我们的计算机程序能够随着形式的变化来进行出价。

那么在 RTB 中，竞价策略的环境究竟是怎样的呢？

首先，竞价的一个重要特征，就是作为一个竞标方，我们并不知道其他竞标方的点击率和出价。因此，我们处在一个信息不完整的竞价环境中。在这样的环境中，我们只能根据自己的点击率估计和自己的出价，以及过去出价的成功与否来对整个市场的形势进行判断。这就是在 RTB 中竞价策略的一大挑战和难点。

在这样的背景下，RTB 竞价策略的研究和开发集中在以下两种思路上。

一种思路是把整个竞价策略当做一种“博弈”（Game），从而根据博弈论中的方法来对竞价环境中各个竞标方的行为和收益进行研究（比较经典的论文例如参考文献 [1]）。用博弈论的方法来对竞价进行研究有一个最大的特点，那就是博弈论主要是对各个竞标方行为之间的关联性进行建模，这种关联性包括他们之间的收益和他们的动机。

另外一种思路是把整个竞价策略当做是纯粹的统计决策，也就是直接对广告商的行为进行建模，而把整个竞价环境中的种种联系都当做是当前决策下的不确定因素（这种思路比较有代表性的论文是参考文献 [2]）。在这样的思路下，各个竞标方之间的行为关联变得不那么重要，而对于整个不确定性的建模则变得至关重要。

第一种思路，也就是利用博弈论的方法来对竞价策略进行研究主要存在于学术界。虽然从理论上来说，博弈论可能提供一种比较有说服力的解释，但是这种思路需要对整个竞价环境有非常多的假设（例如竞标方是不是理性，市场是不是充分竞争等等）。而第二种思路，仅仅需要从广告商自身的角度出发，因此在现实中，这种思路的操作性更强，从而受到工业界的青睐。

总的来说，第二种思路其实就是根据当前的输入信息，例如页面信息、广告信息、用户信息以及上下文信息等，学到一个输出价格的函数，也就是说，这个函数的输出就是在现在情况下当前广告的出价。当然，这个函数势必需要考虑各种不确定的因素。

搜索广告和展示广告的竞标

搜索广告和展示广告的竞标存在着不小的区别，因此，从技术上来讲，就发展出了一系列不同的方法。

对于搜索广告来讲，在大多数情况下，每一个出价都是针对某一个搜索关键词的。例如，一个汽车广告商可能会在一个搜索引擎里竞标针对自己车的品牌，如“大众汽车”、“奥迪汽车”相关的关键词，还可能竞标更加宽泛的关键词，如“买车”、“汽车”等。同时，这里的出价也往往是事先设置好的。

参考文献 [3] 是第一个利用机器学习方法对搜索广告的出价进行建模的工作。在这个工作里，每一个关键词的出价来自于一个线性函数的输出，而这个线性函数是把用户信息、关键词以及其他的页面信息当做特性，学习了一个从特性到出价的线性关系。这可以算是最早的利用线性函数来进行出价的例子了。

展示广告的竞价则面临着不同的挑战。首先，在展示广告中，场景中并不存在搜索关键词这种概念。因此，很多广告商无法针对场景事先产生出价。这也就要求 RTB 的提供商要能够在不同的场景中帮助广告商进行出价。

同时，相比于搜索广告针对每一个关键词的出价方式来说，针对每一个页面显示机会出价的挑战则更大。理论上讲，每一个页面显示机会的价格都可能有很大的不同。很多 RTB 都利用一种叫作CPM 的收费模式，也就是说，一旦某一个广告位被赢得之后，对于广告商来说，这往往就意味着需要被收取费用。所以，在展示广告的情况下，如何针对当前的页面显示机会以及目前的预算剩余等等因素进行统一建模，就成为一个必不可少的步骤。

竞价策略的其他问题

除了我们谈论到的基本的竞价策略以外，竞价系统还有一些其他问题需要考虑。

比如，一个广告商现在有 1 千元的预算参与到 RTB 竞价中。从广告商的角度来说，通常希望这 1 千元能够比较均匀地使用到整个广告竞价中。或者说，即便不是完全均匀使用，至少也不希望这笔预算被很快用完。这里面的一个原因是，在每天的各个时段，广告的表现情况，也就是说转化率或点击率是不一样的，广告商通常希望自己的广告能够在比较好的时段进行展示。而如果广告在比较好的时段还没有来临之前就已经将预算消耗殆尽，那就会让广告商觉得整个流程不是很友好。

因此，在广告竞价策略中，还存在着一个叫“预算步调”（Budget Pacing）的技术，也就是希望能够让广告的展示相对平缓而不至于在短时间内使用完全部的预算。这势必对于广告如何出价有着直接的影响。

另外，对于平台而言，虽然竞价保证了一定的竞争，但是也并不是所有的展示机会都有非常充分的竞争。因此，从平台的角度来说，如何能够保证一定的收益就变得十分重要。在这样的情况下，有的平台有一种叫作“保留价格”（Reserved Price）的做法，用来设置一个最低的竞价价格。保留价格虽然能够来保证收益，但是也可能会让广告商觉得不划算，因此如何来设置这个保留价格，也就成为了出价策略中的一个重要组成部分。

总结

今天我为你介绍了广告竞价的基础知识，也就是如何形成竞价策略。

一起来回顾下要点：第一，我们讲了 RTB 背景下竞价策略的两种思路；第二，我们介绍了搜索广告和展示广告竞价策略的不同之处；第三，我们简单聊了广告竞价策略的一些其他相关问题。

最后，给你留一个思考题，你觉得如何评价一个广告竞价策略的好坏呢？

欢迎你给我留言，和我一起讨论。

参考文献

Ramakrishna Gummadi, Peter Key and Alexandre Proutiere. Repeated auctions under budget constraints: Optimal bidding strategies and equilibria. In Eighth Workshop on Ad Auctions, 2012.

Yuan, S., Wang, J., and Zhao, X. Real-time bidding for online advertising: measurement and analysis. Proceedings of the Seventh International Workshop on Data Mining for Online Advertising, page 3. ACM, 2013.

Andrei Broder, Evgeniy Gabrilovich, Vanja Josifovski, George Mavromatis, and Alex Smola. Bid generation for advanced match in sponsored search. Proceedings of the fourth ACM international conference on Web search and data mining (WSDM '11). ACM, New York, NY, USA, 515-524, 2011.

115 | 如何优化广告的竞价策略？

广告的竞价排名是计算广告系统中非常重要的一个话题，我们介绍了目前广泛使用的基于第二价位的广告竞拍，以及在此基础上，DSP 或者广告商究竟该如何形成自己的竞价策略（Bidding Strategy）。

今天，我们就来看一些具体的广告竞价策略方法。

单个广告推广计划优化

我们首先来看单个广告“推广计划”（Campaign）的竞价策略的优化。

在上一次的分享里我们介绍了，利用统计决策的一个重要假设就是最终的出价是一个各种输入（例如环境、用户、页面等）的函数输出。这里我们采用一个简化的假设，认为一个推广计划的出价是点击率的一个函数。在这样的情况下，我们先来理清一些概念。

第一个概念是“赢的概率”（Winning Probability）。这里面，如果我们知道现在市场的一个价格分布以及我们的出价。那么，赢的概率就是一个已知概率密度函数求概率的计算，也就是通常情况下的一个积分计算。

第二个概念就是“效用”（Utility）。这是一个广告商关注的指标，通常情况下是点击率的某种函数，比如利润，那就是每一次点击后的价值减去成本。

在这种情况下的成本其实主要就是出价后产生的交易价格。如果是基于第一价位的竞价，那么这个成本就是出价；如果是基于第二价位的竞价，这个成本就是超过第二价位多少还能赢得竞价的价格。

最后还有一点需要说明，那就是所有的广告推广计划都必须要在预算内，这是一个很明显的限制条件。

理清了这些基本的概念和限制条件以后，我们来看一看最一般的竞价策略。为了方便讨论，我们先假设不需要考虑预算，同时也假设，我们竞价的核心是所谓的“按照价值”的竞价。那么，在这种情况下，最优的策略其实就是按照点击率乘以点击后产生的价值来进行出价。可以说，这种策略其实是业界接纳程度最好、也是最直观的一种竞价策略。

然而，在有了预算和当前的交易流量信息的情况下，这种竞价策略就并不是最优的策略了。为什么呢？因为在有了这些限制条件的情况下，我们是否还会按照自己客观认为的广告价值来竞标就成了一个疑问。

那么，如何来应对预算和交易流量的限制呢？有没有什么优化方法？ 我就结合几篇论文来跟你聊聊这个问题。

有一篇文章题目是《目标在线广告中的出价优化和库存评分》（Bid Optimizing And Inventory Scoring in Targeted Online Advertising）[1]，这篇文章提供了一种简单的思路来应对预算和交易流量的限制优化问题。

具体来说，与其完全按照广告的价值来进行出价，不如采用这个价值乘以某个系数，而利用这个系数来动态调整目前的出价。由于是在一个已知的可能出价前面乘以一个系数，所以整个出价策略其实是一种线性变换，因此也被叫作是线性出价策略。

线性出价策略在实际操作中比较方便灵活，在这篇论文中，这种算法也取得了比较好的效果。不过遗憾的是，这种做法并没有太多的理论支持。

相比之下，另外的两个研究工作（[2] 和 [3]）则提供了一种比较通用的理论框架，可以用于不同的效用函数和损失函数。在这里，我们不展开讲这个通用框架的细节，重点介绍它的核心思路。

这个框架的整体思路是把寻找最优出价，或者说是竞价函数的过程表达成为一个“有限制的最优化问题”（Constrained Optimization）。最优化的优化目标，自然就是当前竞价流量下的收益。而最优化的限制条件，就是竞价流量下的成本要等于预算。也就是说，在我们期望达到预算的情况下，我们需要尽可能地扩大收益，这就是最优化目标的最大化这个意思。而限制条件决定了这个最大化问题的解的空间，因此，那些不符合条件的解就可以不考虑了。

一旦我们的问题可以用有限制的最优化问题来表达以后，整个问题的求解就变得相对比较规范化了。对于这类问题有一个标准的求解过程，就是利用“拉格朗日乘数法”，把“有限制的优化问题”转换成为“无限制的优化问题”，然后针对最后的目标函数，求导并置零从而推导出最优解的结果。这一部分的步骤是标准的高等数学微积分的内容。

这个框架最后推导出了基于第一价位和基于第二价位的最优的出价函数形式。在两种情况下，最优的出价函数都是一个基于点击率、当前竞价流量和预算的非线性函数。那么，从这个框架来看，刚才我们提到的线性竞价策略就并不是最优的。

多个广告推广计划优化

了解了单个广告推广计划的优化后，很自然地，多个广告推广计划的优化也是一个很重要的话题。在这方面比较经典的论文，推荐你读一读《展示广告的统计套利挖掘》（Statistical Arbitrage Mining for Display Advertising）[4]。

从基本的思路上来讲，我们需要做的是把刚才的基于单个广告推广计划的有限制优化问题给扩展到多个广告推广计划上去。除了满足各种限制条件以外（比如需要满足总的预算要求），论文也提出了一种基于风险控制的思路，来计算每一个广告推广计划的均值和方差，从而限制方差的大小来降低风险。比较遗憾的是，论文提出的优化是一个基于 EM 算法的过程，也就是说相对于单个广告推广计划来说，多个广告推广计划找到的解可能并不是全局的最优解。

总结

今天我为你介绍了广告竞价的一些具体的竞价策略。

一起来回顾下要点：第一，广告竞价会有预算和交易流量的限制问题，我们介绍了单个广告推广计划的两种思路，分别是“线性出价策略”和转化为“有限制的最优化问题”；第二，我们简单聊了多个广告推广计划的思路，简单介绍了论文提出的一种基于风险控制的思路。

最后，给你留一个思考题，在广告竞价策略的诸多框架中，都基本假定我们知道了广告的点击率，这样的假设有没有问题呢？

欢迎你给我留言，和我一起讨论。

参考文献

1. Perlich, C., Dalessandro, B., Hook, R., Stitelman, O., Raeder, T., and Provost, F. Bid Optimizing And Inventory Scoring in Targeted Online Advertising. Proceedings of the 18th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining, pages 804–812. ACM, 2012.

2. Zhang, W., Yuan, S., and Wang, J. Optimal Real-Time Bidding for Display Advertising. Proceedings of the 20th ACM SIGKDD international conference on Knowledge discovery and data mining, pages 1077–1086. ACM, 2014.

3. Zhang, W., Ren, K., and Wang, J. Optimal Real-time Bidding Frameworks Discussion. arXiv preprint arXiv:1602.01007, 2016.

4. Zhang, W. and Wang, J. Statistical Arbitrage Mining for Display Advertising. Proceedings of the 21th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining, pages 1465–1474. ACM, 2015.

116 | 如何控制广告预算？

我们在前面的一系列分享里讲了广告位竞价的基本原理，那就是目前广泛使用的基于第二价位的广告竞拍。也分享了广告的竞价策略，以及具体的竞价策略优化方法，比如单个广告推广计划的优化等。

今天，我们来看在广告竞价策略中一个比较重要的问题，这个问题我们在前一篇的分享里也提到过，那就是如何能够比较流畅地利用广告商的预算，而不是把广告商的钱一下子都花完。

预算步调优化

控制广告预算的第一种方法是预算步调优化（Budget Pacing），这个方法的目的就是在某一个时间段里均匀地分配广告商的预算。同时，在每一个时段，发布商所面临的受众都有可能不太一样，所以，对于广告商而言，比较理想的状态是一个广告可以在一天的不同时段被不同的受众所看到，从而达到扩大受众面的目的。

预算步调优化有两种比较常见的思路，一种叫“节流”（Throttling），一种叫“修改出价”。

节流这种方法主要是把单位时间的支出或者是成本给控制在某一个速率内，使得预算能够被均匀地使用。这种方法往往是在我们已经介绍过的竞价模型之外运行。修改出价这个思路很直观，也就是直接修改我们的竞价，从而带来预算均匀化的结果。

关于节流思路，有一种做法 [1] 是把如何节流当做一种“线性优化”问题，并且是有限制的最大化问题。具体来说，对于每一个出价的请求，我们都可以做一个二元的决定，决定我们是否接受这个出价请求。当然，对于每一个出价请求，这里都有一个价值和一个成本。根据对不同出价请求的设置，我们来做优化，从而能够最大化总价值。但同时，我们需要遵守一个限制，总的成本不能超过预算。这其实就是在两种目标之间实现一个均衡，简言之，我们需要在不超过总预算的情况下达到总价值的最大化。

虽然这种算法本身能够通过我们之前介绍过的“拉格朗日乘数法”来求解，但是还存在一个根本的问题，那就是这种算法并不能实时地对整个竞价的安排进行计算和更新。因为，这种线性优化方法一般都是在线下计算好了以后再到线上运行。很明显，这种方法并不适合快速变化的竞价环境。因此，也就有一些工作 [2] 和 [3]，尝试通过节流，或者更确切地说，通过在线优化来控制预算的使用情况。

对竞价直接进行修改的相关工作也很多 [4] 和 [5]，这个思路是把控制理论中的一些思想借鉴到了对竞价的直接优化上，目标是让广告商的预算能够平滑使用。这里面的控制是指什么呢？主要是指我们引入一个新的模块在 DSP 中，从而能够实时监测各种指标，例如竞价赢的比率、点击率等，然后利用这些数据作为一个参考点，从而能够形成一种回馈信息以供控制系统来对出价进行实时的调整。

和节流的思想相对比，利用控制理论对出价进行直接优化这种思路明显要更加灵活。然而在实际的工作中，更加灵活的框架依赖于对点击率以及竞价全景观的准确预测，这其实是很困难的。在真实的情况下，利用节流的思想，也就是不去修改出价，只是在其基础上直接进行操作，则往往来得简单有效。

频率上限

在工业界，还有一种经常会使用的控制预算的方法叫“频率上限”（Frequency Cap）。简单来说，这种策略就是限制某一个或者某一种广告在某一种媒介上一段时间内出现的次数。比如，是否限制一个肯德基的广告在半天之内让同一个用户看见的次数？5 次、10 次还是 20 次？

为什么要限制频率呢？一个因素当然是我们希望广告的预算不要在短时间内消耗完。另外，短时间内反复观看某一个广告，很可能会让用户对某一个广告或者广告商产生厌烦情绪，那么广告的有效度就会降低。这对于一些广告商来说，其实是消耗了一些资源。因此，限制广告的投放是一种策略选择，从而让广告的投放花钱少、效率高。

这种频率上限的做法在工业界非常普遍，不过比较遗憾的是，关于这样做究竟是不是有很大的效果，用户多次看到广告是否会真正产生非常大的厌烦情绪从而使得广告效果降低，有没有理论支持等问题，目前还没有比较好的研究来解决。

总结

今天我为你介绍了广告竞价中的预算步调优化和频率上限两个思路。

一起来回顾下要点：第一，预算步调优化有两种常见思路，分别是“节流”和“修改出价”；第二，频率上限是一种工业界常用的方法，但是目前这方面缺乏理论依据。

最后，给你留一个思考题：今天我们介绍了使用节流的方法来控制预算，其中一种方法是线性优化，需要在预算允许的情况下最大化广告的价值。那么，对于广告商来说，如何衡量广告的价值？

欢迎你给我留言，和我一起讨论。

参考文献

1. Lee, K.-C., Jalali, A., and Dasdan, A. Real Time Bid Optimization with Smooth Budget Delivery in Online Advertising. Proceedings of the Seventh International Workshop on Data Mining for Online Advertising, page 1. ACM, 2013.

2. Xu, J., Lee, K.-c., Li, W., Qi, H., and Lu, Q. Smart Pacing for Effective Online Ad Campaign Optimization. Proceedings of the 21st ACM SIGKDD International Conference on Knowledge Discovery and Data Mining, pages 2217–2226. ACM, 2015.

3. Agarwal, D., Ghosh, S., Wei, K., and You, S. Budget Pacing for Targeted Online Advertisements at Linkedin. Proceedings of the 20th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining, pages 1613–1619. ACM, 2014.

4. Chen, Y., Berkhin, P., Anderson, B., and Devanur, N. R. Real-time Bidding Algorithms for Performance-based Display Ad Allocation. Proceedings of the 17th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining, pages 1307–1315. ACM, 2011.

5. Zhang, W., Rong, Y., Wang, J., Zhu, T., and Wang, X. Feedback Control of Real-time Display Advertising. Proceedings of the Ninth ACM International Conference on Web Search and Data Mining, pages 407–416. ACM, 2016.

117 | 如何设置广告竞价的底价？

在互联网广告生态系统的环境中，我们已经分享了不少关于点击率优化和竞价排名以及如何优化出价的内容，相信你对于广告的整体运作以及其中的核心算法都有了一定的了解。

我们首先来简单回顾一下，发布商和广告商或者 DSP 之间的关系。发布商，往往是类似于新闻网站、社交媒体网站和视频网站这样的内容提供方。这些网站的一个特点就是他们本身并不产生收益，甚至往往是免费提供服务。因为流量巨大，这些内容提供方希望能够通过在自身的网站上发布广告从而获得巨额收益。对于广告商和 DSP 来说，则是希望能够利用发布商的巨大流量来接触更多的用户从而推销自己的服务和产品。

我们之前的很多讨论，其实重点都放到了需求侧平台，也就是常说的 DSP 方面，包括点击率预估和很多调整竞价排名的方法等等。今天，我们就来看一个发布商在广告竞价流程中可以参与调优的地方，那就是广告竞价中的底价优化。

底价

底价，顾名思义，就是在广告的竞价中给竞拍设定一个最低价。

为什么需要这么做呢？其实在理想的状态下，一个充分竞争的，并且有着充分广告源的市场，广告的单价应该是逐渐升高的。因为广告位资源毕竟是有限的，在有充分广告源的情况下，所有的广告商为了竞争这些有限的广告位，必定是会逐渐抬高广告位的价格。而作为内容发布商，在这个过程中则可以享受到逐渐升高的广告位价值。

然而，在现实中的很多情况下，这种理想状态的竞争态势并不完全存在。比如，对于一个新闻内容提供商来说，在新闻首页顶端出现的广告位一般更能吸引眼球，这种广告位常常可以引起充分竞争，但是在新闻页面下方的广告位则很有可能无法带来充分竞争，因为这些广告位的点击率可能只有顶端广告位点击率的十分之一甚至更少。那么，对于那些无法带来充分竞争的广告位，内容发布商就有可能无法收取理想状态下的收益，甚至在一些比较极端的情况下，会以非常便宜的价格给予广告商。

也就是说，在真实的广告竞争市场中，很多时候广告位都无法得到充分竞争。除了我们刚才所说的因为广告位的位置所导致的不充分竞争以外，同一广告位在一天中的不同时段的竞争程度也是不尽相同的。另外，在搜索广告中，不同的搜索关键词也会有不同的竞争情况。

综合这些原因，对于内容发布商来说，如何保护自己的广告位价值并且保证最低收益呢？一种方法就是设置一个广告竞价的最低价格，也就是我们这里所说的底价。当我们设置了底价以后，所有的广告竞价都不会低于这个价格，也就人为地抬高了广告位的竞争水准。

既然这是一种保护广告位价值的简单做法，那么会不会带来一些其他的问题呢？答案是，当然会。一个重要的因素就是，这个底价设置得太高，会打击广告商的积极性，进一步影响广告位的竞争，从而让整个市场变得竞争不足拉低价格。而如果这个底价设置得太低，则没有起到实际的作用，广告商仍然可以利用较低的价格获得广告位，而内容发布商可能也没有获得足够的收益。

底价优化

在了解了这些关于底价的背景知识以后，我们来思考一下该如何设置底价。

在一个基于第二价位的竞价系统中，底价存在三种情况，这些情况的不同会导致发布商有不同的收益。

第一种情况，底价高于竞价的最高价。很明显，这个时候发布商没有收益，因为所有其他的出价都低于底价，也就是说底价过高。在实际的操作中，这一次广告位请求可能会被重新拍卖（Re-Sell）。

第二种情况，底价高于第二价位。因为是基于第二价位的竞价，所以已经用第一价位获取了广告位的广告商，这个时候就需要支付底价，而不是原本的第二价位的价格。这种情况下，发布商就获取了额外的收益。这个额外的收益就是底价减去之前原本的第二价位。

第三种情况，底价低于第二价位。同理，因为是基于第二价位的竞价，所以这个时候的底价并没有影响原本的第二价位，因此发布商的收益没有变化。

我们讨论了这三种情况以后，就会发现，对于发布商来说，在绝大部分情况下，第二种情况是最理想的，因为这种时候会有额外的收益。那么，如何学习到这个底价就成为了一个挑战。

这里面发布商面临的一个困难是，广告商在提交出价的时候，发布商往往是不知道这个出价的。因此，发布商需要去“猜”所有出价的分布，这无疑是一件非常困难的任务。

在比较早期的研究中 [1]，研究者们借用了“最优化竞拍理论”（Optimal Auction Theory）来研究究竟该如何设置这个出价。

最优化竞拍理论其实假设了发布商知道出价的一个概率密度函数，再进一步假设这个密度函数是服从“对数正态”（Log-Normal）分布的，然后推导出了一个最佳的底价。在有了这个假设之后，就可以利用最佳的底价对广告的竞价进行管理，最终在实验中显示，对于某一些广告，发布商的收益增加了 10% 以上。

一个更加近期的研究 [2] 则指出，在实时竞价（RTB）的很多场景中，出价的分布未必是对数正态分布，整个竞价的环境中也有很多并不符合最优化竞拍理论的情况，比如广告商出价未必是按照心中的价值出价，而是为了赢得更多的广告位。

在这项研究中，作者们提出了一种非常直观的类似于决策树的策略，然后研究了在不同情况下发布商策略的不同所带来收益的区别。总体说来，发布商可以采用这样一种策略来调整底价：当发现底价低于最高的出价时，保持或者提高底价；当发现底价高于最高出价时，降级底价。在这种策略的指导下，发布商能够达到一种最佳的收益。

总结

今天我为你介绍了广告竞价中底价的设置。

一起来回顾下要点：第一，在真实的广告竞争市场中，很多时候广告位都无法得到充分竞争，为了保证发布商的最佳收益，需要给竞拍设置一个最低价，也就是底价；第二，如何设置底价是一个很困难的任务，以往的研究给我们提供了两种策略可以借鉴，分别是最优化竞拍理论和类似于决策树的策略。

最后，给你留一个思考题，我们应该对所有广告位设置统一的底价吗？还是不同的广告位有不同的底价呢？

欢迎你给我留言，和我一起讨论。

参考文献

1. Ostrovsky, M. and Schwarz, M. Reserve Prices in Internet Advertising Auctions: A Field Experiment. Search, pages 1–18, 2009.

2. Yuan, S., Wang, J., Chen, B., Mason, P., and Seljan, S. An Empirical Study of Reserve Price Optimisation in Real-Time Bidding. Proceedings of the 20th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining, pages 1897–1906. ACM, 2014.

118 | 聊一聊“程序化直接购买”和“广告期货”

在周一的分享里，我们讨论了内容发布商优化自己收益策略的底价方案。如果能够把这种底价方案运用得当，就可以增加市场的竞争程度，从而人为地抬高竞价，达到增加收益的目的。

今天，我们来看关于计算广告竞价的另外两个话题：一个是程序化直接购买，另一个是广告期货。

程序化直接购买

程序化直接购买（Programmatic Direct）是指广告商不通过竞价的方式获取发布商的广告位。这往往意味着广告商需要和发布商直接签订合同来购买一定量的展示机会（Impression）。

在互联网的早期，其实有很多广告合同是通过直接购买的方式进行的。这一类合同的签订通常是经过相对比较传统的模式，也就是由公司的销售人员直接进行接洽。

直接购买的广告合作合同往往是比较大的。例如，可口可乐公司需要在雅虎主页显示一类新饮料的广告。这种广告要求涵盖的人群广，并且时间也比较长。如果按照竞标的方式，这可能是要竞标上百万次甚至上千万次的展示机会。在这样的情况下，对于广告商和发布商来说，比较快捷的方式反而可能是一次性购买下这些展示机会。

以雅虎为例，在很长的一段时间里，广告的销售都是分为“有保证的销售”和“无保证的销售”。后者类似于今天的 RTB 市场，而前者就是我们现在所说的直接购买。

时至今日，对于顶级的内容发布商来说，大家依然喜欢把最优价值的一些广告位，比如较好的位置或者尺寸较大的广告，留下来当做“独家”（Premium）广告位用于直接购买的合同。而近些年，如何使用程序让直接购买更加便捷就成为了很多广告中间平台的一个重要任务。

那么，对于内容发布商或者 SSP（供应侧平台）来说，需要做什么事情来推动程序化直接购买呢？

首先，内容发布商需要预估未来一段时间内展示机会的数量。例如，在下一个小时内，一共有多少展示机会。这种预估其实就是网站或者服务对流量的估计。然后，把这些预估的展示机会分为两个部分，一部分送入 RTB，用于我们之前介绍过的广告竞价排名，而另一部分则用于程序化直接购买。

和传统的直接购买不同的是，这时候的直接购买是程序化的，因此并不需要广告商和发布商之间直接建立联系，而是通过平台进行交易。从某种意义上来说，这种交易和股票交易十分类似。通常情况下，平台显示的是对这一批展示机会的一个统一价格。广告商以及 DSP（需求侧平台）可以根据自己的需要直接购买这个统一价格的展示机会。一般来说，这种购买可以提前几个星期甚至几个月。

一旦直接购买和通过竞价排名的方式都程序化以后，对于广告商来说，他们愿意提前直接购买广告位，因为这样购买的广告位价值低于他们的一个心理价位。而对于发布商来说，就需要权衡这两种渠道之间的收益平衡，其实在某种情况下，特别是市场竞争不完全的情况下，这也是发布商希望确保一定收益的方法，也就是在有一定折扣的情况下卖掉广告位。

在程序化直接购买方面进行研究的相关论文非常稀少 [1]，一个原因是这种技术的探讨往往需要比较高级的广告系统作为支撑。

广告的期权

到现在为止，我们已经讨论了广告的竞价排名以及程序化直接购买等话题，你是不是已经慢慢感受到，广告生态系统的构架和我们熟悉的另外一个领域的很多概念有着千丝万缕的联系。对，这个领域就是金融系统，特别是股票或者大宗商品的交易。

这里面的联系其实是非常直观的。第一，广告和股票交易一样，都有大量的交易机会。这就需要出现第三方系统和平台，对于股票来说是股票交易所，而对于广告来说则是广告的 DSP 和 SSP。第二，广告和股票交易一样，价值和价格都有可能因为交易带来瞬息万变的差别，因此越来越多的金融工具被制造出来，来为这个生态系统中的种种角色进行风险控制。

比如对于 RTB 来说，虽然这种机制为广告商和发布商创造了一种交易的模式，但是这种模式中，基于第二价位的竞价让广告商无法对最终的成交价进行有效控制；而且对于发布商而言，对于利润的把握也有一定的风险；同时广告商和发布商之间也谈不上什么“忠诚度”，因为相同的广告位还有可能在其他的发布商那里找到。在这种情况下，“期权”（Option）这种金融工具就被介绍到了计算广告的环境中。

最近一段时间以来，已经有了一些零星的研究工作讨论广告期权的理论和应用（[2] 和 [3]）。当前，很多发布商是这么设置广告期权的。发布商设置一个未来某个时间点的某个或某些广告展示机会的一个提前价格。这个价格并不是展示机会的实际价格，而是一个权利。对于广告商来说，可以购买这个权利，用于得到未来的这个展示机会。当然，广告商在未来并不一定购买这个展示机会，也可以放弃这个权利。

对于广告商来说，如何参与竞拍，如何在最佳的时机去购买期权，就变成了一个复杂的优化问题。当下关于这方面的很多研究，都借用了金融领域的一些模型和算法。

总结

今天我为你介绍了在线计算广告的另外两个重要话题：程序化直接购买和广告期权。到此为止，我们就完整地介绍了 DSP 和 SSP 中所有有关出价和竞价的话题。

一起来回顾下要点：第一，我们从广告的历史发展中介绍了程序化直接购买的意义；第二，我们简单聊了聊广告期权存在的目的。

最后，给你留一个思考题，对于一个 DSP 来说，能不能通过直接购买获得大量的展示机会，然后又通过 RTB 竞价排名把这些机会卖出去，这样做的风险是什么？

欢迎你给我留言，和我一起讨论。

参考文献

1. Chen, B., Yuan, S., and Wang, J. A dynamic pricing model for unifying programmatic guarantee and real-time bidding in display advertising. In Proceedings of the Eighth International Workshop on Data Mining for Online Advertising, pages 1:1–1:9. ACM, 2014.

2. Chen, B., Wang, J., Cox, I. J., and Kankanhalli, M. S. Multi-keyword multi-click advertisement option contracts for sponsored search. ACM Transactions on Intelligent Systems and Technology (TIST), 7(1):5, 2015.

3. Chen, B. and Wang, J. A lattice framework for pricing display advertisement options with the stochastic volatility underlying model. Electronic Commerce Research and Applications, 14(6):465–479, 2015.

119 | 归因模型：如何来衡量广告的有效性

在互联网广告生态系统的环境中，我们已经分享了不少关于点击率优化和竞价排名以及如何优化出价的内容。接下来我们开始讨论一些计算广告相关的高级话题。之所以说这些是高级话题，是因为作为机器学习在计算广告的应用，这些话题往往都比较偏冷，但在现实中又特别有实用价值。

今天我们先来聊一聊归因模型，这种技术在计算广告业中被广泛使用。

什么是归因模型

归因模型（Attribution Model）是一种计算广告中分配“贡献”的机制。

在现代网站或者应用中，每一个用户都有可能在每一次会话中看到多个不同的广告，或者在多个不同的会话中看到相同广告的不同展示。那么，当用户点击了某个广告，或者是当用户转化以后，比如购买了某个商品或是订阅了某种服务，广告商通常希望知道究竟是哪一个广告起了更大的作用。也就是说，广告商想知道用户接收到的不同广告对这个最后的转化事件都起了什么作用，这个问题就是归因模型研究的核心。

归因模型之所以重要，是因为这里面牵涉到了广告有效性这个话题。那么，如何来衡量广告的有效性呢？

衡量广告的有效性，就需要利用归因模型，针对每一个转化来分配“贡献”。这样，对于广告商来说，就可以通过贡献值的叠加来看某一个渠道或者某一个内容发布平台的转化效果。

然而，归因模型的难点在于，这里面并没有完全的“基本事实”（Ground Truth），全部都基于一定的假设。同时，归因模型直接关系到广告是否有效的计算，也就关系到我们能否推行一个“公平”的市场，以及能否防止其他的广告商在整个平台上进行博弈。

那么，现在各个平台普遍都在使用的是什么样的归因模型呢？下面我给你介绍几个最基本的归因模型。当然了，说这些方法是模型其实也是不够准确的，因为这些方法大多没有理论支撑，主要是基于经验或者基于传统的方法。

第一种经验方法叫“最后触碰”（Last Touch）。

顾名思义，最后触碰指的就是在转化前的最后一个广告拿走 100% 的贡献值。这是目前使用最广泛的归因方法，主要是因为它的简单直观。

我们之前讨论过的所有点击率或者转化率的计算都是基于这个归因方法的。一个可以去博弈“最后触碰”的方法就是让 DSP（需求侧平台）把广告投放给那些已经对品牌或者服务产生兴趣的人，从而能够以较大的概率获得用户的转化。在这个过程中，广告的投放其实并没有起作用，而 DSP 也并没有试图去转化新用户。

举一个例子，如果我们已知一个用户喜欢可口可乐，并且很可能在过去购买过可口可乐，那么给这个用户展示最新的可口可乐促销广告，就很有可能让这个用户点击广告并购买了一箱促销的可乐。但是，在这个情况下，我们还可以认为，这个用户很有可能不需要看这个广告也会购买可乐，所以这个广告其实是浪费了资源。“最后触碰”其实是鼓励了 DSP 采用更加保守的投放方式。

既然有“最后触碰”，那肯定就有“第一次触碰”（First Touch）的经验方法。这种方式和“最后触碰”截然相反，那就是只要一个用户最后转化了，那么这个用户第一次看到的广告就获得了 100% 的贡献值。尽管用户可能在第一次看到这个广告后还看了其他的广告，但是这些其他广告都不算数了。“第一次触碰”其实鼓励了 DSP 尽可能广地投放广告，把广告的投放当做品牌宣传。

除了这两种比较极端但是被广泛使用的归因方法以外，还有一系列的经验方法，都算是这两种方法的某种平衡状态。比如一种叫“线性碰触”（Linear Touch）的方法，是给用户在转化的道路上每一个广告都赋予一样的贡献值。还有一种叫“位置触碰”（Position Based）的方法，其实就是“最后触碰”和“第一次触碰”的结合。另外一种经验方法“时间递减”（Time Decay），则是按照由远到近，对所有的广告位都给一定的贡献值。离转化事件时间越近的广告获得的贡献值越多。

总之，你可以看到，这些林林总总的经验方法虽然都比较直观，但是在实践中，都有可能给一些广告商利用系统进行不公平投放的机会。

基于模型的归因方法

下面我们来看一些具备一定理论基础的归因方法，介绍一个在这方面比较早的探索研究 [1]。在这个研究里，作者们首先介绍了一种叫Bagged Logistic Regression的方法，这个方法根据当前广告的“触碰”信息，也就是用户看了什么广告，来预测用户是否将会转化。在这个模型里，所有的特征就是二元的用户是否观看了某个广告的信息，然后标签就是用户是否转化。通过这些二元的特征学习到的系数就表达了这个广告在这个预测模型下的贡献度。当然，作者们利用了 Bagged 的方法学习到所有的系数都是正的，确保能够解释这个模型的含义。

同时，作者们还提出了一个对归因问题的概率解法，我来介绍下这个概率解法的直观思路。某一个广告对用户转化的最后作用都来自两个部分：第一部分是这个广告对用户转化的直接作用；第二个部分是当前这个广告和另外一个广告一起作用使用户转化的概率。当然，这个第二部分的联合作用需要减去这两个广告分别单独作用于用户的情况。那么，一个广告对于用户的影响，就是这两个部分概率的加和，这其实就是考虑了一阶和二阶的关系下的归因模型。

知道了归因信息之后，我们还可以把这个信息利用到广告的竞价中。直白来说，就是针对有价值的渠道进行有效的出价，而对没有效果的渠道进行控制 [2]。除此以外，归因信息还可以帮助广告商来分配自己的预算，把大部分的预算用在优质的渠道中来投放广告 [3]。

总结

今天我为你介绍了在线计算广告的一个高级话题：归因模型。

一起来回顾下要点：第一，归因模型是一种计算广告中分配贡献的机制，广泛使用的方法有最后触碰和第一次触碰等；第二，有一些有一定理论基础的归因方法，我们其实可以拓展归因信息的应用场景。

最后，给你留一个思考题，如何来衡量一个归因方法是否有效呢？

欢迎你给我留言，和我一起讨论。

参考文献

Shao, X. and Li, L. Data-driven multi-touch attribution models. Proceedings of the 17th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining, pages 258–264. ACM, 2011.

Xu, J., Shao, X., Ma, J., Lee, K.-c., Qi, H., and Lu, Q. Lift-based bidding in ad selection. Proceedings of the 30th AAAI Conference on Artificial Intelligence, 2016.

Geyik, S. C., Saxena, A., and Dasdan, A. Multitouch attribution based budget allocation in online advertising. Proceedings of 20th ACM SIGKDD Conference on Knowledge Discovery and Data Mining, pages 1–9. ACM, 2014.

120 | 广告投放如何选择受众？如何扩展受众群？

从上一期的分享开始，我们来讨论计算广告相关的一些高级话题。作为机器学习在计算广告的应用，这些话题往往偏冷，但在现实中又有很大的实用价值。我们首先聊了归因模型，介绍了几种经验方法和一些基于模型的归因方法，这种模型在计算广告业中举足轻重，不过也常常被人忽视。

今天，我们来看另外一个重要的话题，那就是如何帮助广告商扩大受众群，我们也把这种技术称为受众扩展（Audience Expansion）技术。

什么是受众

广告商在投放广告时有一个最根本的需求，就是希望通过广告平台接触到更多有可能被转化的受众群。所以，对于绝大多数的广告平台而言，满足广告商的这个需求就成为了一个非常重要的功能。

为了让广告商来选择受众，不少广告平台提供两种最基本的功能。

第一种方式是搜索广告的模式，也就是广告商可以选择通过某个关键词或者一系列关键词来接触到希望投放的受众。这里面其实有一个假设，那就是受众的兴趣或者意图是和关键词联系在一起的，而如果投放的广告内容和受众的兴趣以及意图相符，那么对于广告商来说，就可以假设这种情况下受众的转化率是最高的。

第二种就是通过某种选择受众群的方式来让广告商自由地选择广告投放的对象。这里，最基本的方式是通过受众的“人口”（Demographic）信息来进行投放。典型的人口信息包括年龄、性别和地域。

不管是采用关键词还是人口信息来进行受众选择，这些方法看似简单直观，但其实也给广告商带来了不小的挑战。

首先，我们来看关于搜索关键词的难点。作为一个广告商，你怎么知道所有的跟你产品或者服务相关的关键词呢？理论上说，可能会有无穷无尽的关键词可供投放。但是关键词的投放数量也和成本有着密切的关系。所以，从现实的角度来讲，肯定是无法投放所有的关键词的。

其次，利用人口信息来选择受众，那如何来找到比较合适的人口信息呢？这里面就有很大的挑战了。广告商可以利用一些研究结果来找到对应的人口信息从而增强广告投放的效果。然而针对很多中小广告商来说，花费很大的精力和时间去研究这些不同的人口信息和广告效果之间的关系显然是不可能的。

除了我们刚才所说的这两种广告商选择受众的方式以外，现在也有不少的广告平台并不需要广告商进行“显式”的受众选择。这些服务其实就是看到了这种选择带给广告商的复杂性，与其让广告商来选择，还不如让广告平台来优化。于是，有很多广告平台提供的就是“傻瓜式”的广告服务，广告商仅需要设置预算信息，对于人群的投放则完全由广告平台来负责。

受众扩展

了解了受众的选择以后，一个很现实的问题就摆在了广告平台商的面前，如何帮助广告商来扩展已经选择了的受众群体，从而能够实现受众转化的最大化呢？

来自 LinkedIn 的几位作者就探讨了在社交媒体广告中受众扩展的这个问题 [1]。在 LinkedIn 平台上，广告商，也就是雇主，可以针对不同的群体限制条件，也就是我们所说的受众，来投放广告，以吸引潜在的雇员和候选人。广告商在投放广告的时候，可以按照雇员的职业技能（比如是否会 Java，是否会机器学习等）以及一些其他的信息（例如来自哪个公司、地理位置）来选择投放的受众。这和我们之前介绍的场景一样，很明显，即便是广告商精心选择一个看似比较有效的受众，在这种情况下，其实依然有很多种其他选择的可能性。

在这篇文章里，作者们介绍了这么几种受众扩展的思路。

第一种思路是和某一个广告推广计划（Campaign）无关的。这里主要是通过一种“类似”算法而找到类似的公司、类似的技能等等。这种扩展的好处是可以对任何广告推广进行扩展而无需积累数据。

第二种思路是广告推广相关的扩展。这里其实还是利用了“类似”算法，但是在扩展的时候是根据广告商对当前这个广告推广所选择的条件来进行选择，这样的选择自然就会和当前的广告推广更加相关。

在实际操作中，LinkedIn 采用了这两种思路结合的方法。先利用于推广无关的扩展方法来获取最初的一些扩展用户，尽管这部分用户可能质量不高。然后，当广告推广已经运行了一段时间以后，再针对这个广告推广的选择进行扩展，就可以找到更加高质量的扩展用户群体。

我们看到这些扩展方法都依赖于“类似”算法，这里我简单说一下这个算法的核心思想。

总体来说，这个算法是针对某一个实体（可以是公司、人名、地域、技能等），通过搜索的方法来返回最相关的 K 个其他实体。作者们把这个问题看成了一个监督学习的问题。其核心就是利用了一个对数几率模型，对相似的正例和负例进行学习。

那么，哪些实体是正例，哪些是负例呢？作者们把用户频繁选择放在一起投放的实体当做了正例，而把其他的实体当做负例。对于特性来说，这里广泛采用了文本特性，包括文本的词包表达、以及 N 元语法（N-gram）组成的特性。同时，这里还利用了图相关度来推算，比如两个公司在社交关系上的相关程度。然后，两个实体之间的余弦相关度也作为一种特性被包含在了模型中。

在线上实验的结果中，所有受众扩展的效果都比不用扩展有显著的提升。特别是在混合扩展的模式下，展示机会、点击率和总的收益都提升了 10% 以上。这个实验结果可以用来说明受众扩展的重要性。

总结

今天我为你介绍了在线计算广告的另外一个高级话题：受众扩展。

一起来回顾下要点：第一，广告商可以通过关键词或者人口信息等方式来选择受众，不过受众选择也并不容易，有很大的挑战性；第二，我们介绍了和推广计划有关的与无关的两种受众扩展思路，以及将两种思路结合的方法，并简单介绍了两种思路都依赖的“类似”算法。

最后，给你留一个思考题，在什么情况下受众扩展可能会出现问题，如何来衡量这些问题？

欢迎你给我留言，和我一起讨论。

参考文献

Haishan Liu, David Pardoe, Kun Liu, Manoj Thakur, Frank Cao, and Chongzhe Li. Audience Expansion for Online Social Network Advertising. Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (KDD '16). ACM, New York, NY, USA, 165-174, 2016.

121 | 如何利用机器学习技术来检测广告欺诈？

在上一期的内容中，我们聊了如何帮助广告商扩大受众群这个话题，也就是受众扩展技术。受众扩展的目的是让广告商投放的广告能够接触到更广泛的受众，甚至有可能提高广告效果。

在计算广告高级话题的最后一篇分享，同时也是整个广告模块的最后一篇分享里，我想来聊一聊广告中一个非常棘手，同时也是一个非常实际的问题：欺诈检测（Fraud Detection）。

什么是广告欺诈

广告欺诈是一个多大规模的问题呢？

根据一个统计数字 [1]，到 2015 年的时候，就因为广告欺诈，全美的市场营销和媒体业每年的耗费约为 82 亿美元。这个数字中大约有 56%，也就是 46 亿多美元的耗费来自于“非法流量”（Invalid Traffic）。我们把这个数字和全美每年 596 亿的广告支出进行对比，就可以看出这是一个惊人的数字。当然，因为各种欺诈手段层出不穷，并不是所有的欺诈都能够被甄别出来。因此，我们其实有理由相信真实的数字会更高。

那么，怎么来定义广告欺诈呢？什么样的行为算是广告欺诈呢？

我们这里主要讨论三种形式的广告欺诈。这三种广告欺诈模式其实对应着三种流行的广告计费模式。

第一种欺诈叫“展示欺诈”（Impression Fraud），也就是造假者产生虚假的竞价信息，然后把这些竞价展示放到广告交易平台上去贩卖，并且在广告商购买了这些展示后获利。

第二种欺诈叫“点击欺诈”（Click Fraud），也就是造假者在广告商产生虚假的点击行为。

第三种欺诈叫“转化欺诈”（Conversion Fraud），也就是造假者完成某种虚假的动作，例如填写表格，下载某个应用等来虚拟真实的转化事件。

在真实的场景中，这三种欺诈手段经常混合出现。例如点击欺诈和展示欺诈可能同时出现，这样就能在报表中展示一个看似合理的点击率。

广告欺诈的产生源

了解了广告欺诈的基本形式之后，我们来看一下这些欺诈产生的源头都在什么地方。因为广告产业的有利可图，产生欺诈的途径也是多种多样的，我们这里就看一些经典的形式。

首先，有一种欺诈来源途径叫PPV（Pay-Per-View）网络。

利用 PPV 进行欺诈的主要流程就是尝试通过购买流量，然后在一些合法的展示机会中插入用户肉眼看不见的 0 像素的标签（Tag），诱导广告商，让广告商以为产生了更多的合法流量。

对于这样的欺诈，一般来说，广告商必须去检测展示机会用户是不是看不见，或者是否是由 0 像素产生的。然后还可以采用黑名单的方式，对屡次利用 PPV 来进行欺诈的 IP 地址进行屏蔽。

另外一种欺诈手段是通过“僵尸网络”（Botnets）。

这种方法主要是试图直接控制用户的终端电脑或者其他的移动设备，从而进行很多方面的攻击。在过去，僵尸网络的一大应用主要是来产生拒接服务的 DDoS（Distributed Denial of Service）攻击和发送垃圾信息。

近年来，因为其灵活性，很多僵尸网络也被用于广告欺诈。僵尸网络的一大作用就是产生浏览信息，而这些浏览的行为是宿主电脑的用户所无法得知的。因此，对付僵尸网络的一大方法，就是检测从某些 IP 地址或者 DNS 产生的流量行为是否发生了突然的根本性的变化。

第三类欺诈手段是“竞者攻击”（Competitor Attack）。

正常的广告商设立预算参与竞价购买广告位。而竞争对手可以利用“点击欺诈”的方式产生虚假无效的点击信息，从而消耗广告商的预算。当把竞争对手的预算消耗光以后，攻击者反而可以用比较小的成本拿到这些广告位，因为竞争减少了。

另外，还有一种情况是仅仅大量调入竞争对手的广告而不点击。在这样的情况下，就容易产生非常低的点击率。而很多广告平台依赖点击率来进行排序，因此，如果点击率很低，那代价就是难以赢得竞价，通过这种方式也就间接打压了竞争对手。

欺诈检测

了解了什么是广告欺诈以及不同的广告欺诈来源之后，我们来看一看如何利用机器学习技术，来对各种不同的欺诈行为进行检测和挖掘。

首先介绍一个研究 [2]，作者们提出了一种技术，利用“同访问”图来分析异常的浏览行为。这里面有一个最基本的假设：对于大多数用户来说，对两个不同的网站并不具有相同的喜好程度，除非这些网站非常流行。也就是说，对于绝大多数的网站来说，其用户群体是不一样的。

如果用户和这些网站的相互关系发生了变化，那可能就是出现了一些异常的情况。当然，利用图分析的方法，就是把异常发掘当成了一种无监督学习的任务，自然也就会有无标签的困难。

还有一个研究 [3]，作者们提出了一种方法，来分析用户到底需要花多少时间来浏览显示的像素。这个方法其实就是来检测是否是 0 像素的展示欺诈。作者们通过研究发现，对于 50% 以上的像素，绝大多数用户至少需要 1~3 秒时间来观看。于是，广告商或者平台就可以用这种停留时间来作为一个最基本的检测手段。

当然，一种最普遍的做法就是把广告欺诈当做一个监督学习任务。通过产生各种格样的特性以及把过去已知的欺诈数据当做训练数据来进行学习。这种做法的难点是，欺诈数据在真实世界中毕竟是少数。于是，我们就有了数据不足以及需要训练和不平衡的分类问题。正是因为存在这些问题，欺诈检测依然是一个非常前沿的研究领域。

总结

今天我为你介绍了在线计算广告的最后一个高级话题：欺诈检测。

一起来回顾下要点：第一，我们讲了三种形式的广告欺诈，分别是展示欺诈、点击欺诈和转化欺诈，在真实场景中，这三种欺诈手段经常混合出现；第二，产生欺诈的源头很多，我们简单介绍了三种不同类型的广告欺诈来源，分别是 PPV 网络、僵尸网络和“竞者攻击；第三，我们讨论了欺诈检测的一些基本思路，比如利用图分析、利用停留时间的方法等等。

最后，给你留一个思考题，如何来检测转化欺诈，也就是我们怎么知道广告转化中哪些是虚假的呢？

欢迎你给我留言，和我一起讨论。

参考文献

1. Interactive Advertising Bureau (2015). What is an untrustworthy supply chain costing the us digital advertising industry?

2. Stitelman, O., Perlich, C., Dalessandro, B., Hook, R., Raeder, T., and Provost, F. Using co-visitation networks for detecting large scale online display advertising exchange fraud. In Proceedings of the 19th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining, pages 1240–1248. ACM, 2013.

3. Zhang, W., Pan, Y., Zhou, T., and Wang, J. An empirical study on display ad impression viewability measurements. arXiv preprint arXiv:1505.05788, 2015.

复盘 4 | 广告系统核心技术模块

今天我准备了 18 张知识卡，和你一起来对广告系统核心技术模块的内容做一个复盘。

在这个模块，我们一起学习了 18 篇文章，讨论了 5 大话题，包括广告系统架构、知名公司的广告点击率预估模型、出价系统、预算等。通过这些点，我们勾勒出了这个领域的主线。希望你能沿着这条线，去做更多探索。

提示：点击知识卡，可以一键到达你最想复习的那一篇文章。

广告系统架构

广告点击率预估

出价系统

预算

高级话题

积跬步以至千里

最后，恭喜你在人工智能领域的千里之行，又往前迈出了一步。

感谢你在专栏里的每一个留言，给了我很多思考和启发。期待能够听到你更多的声音，我们一起交流讨论。

140 | 什么是计算机视觉？

在之前的一系列分享中，我们详细讲解了人工智能核心技术中的搜索、推荐系统、计算广告以及自然语言处理和文本处理技术。从今天开始，我们来分享专栏里人工智能核心技术模块的最后一部分内容：计算机视觉技术。

可以说，计算机视觉技术是人工智能技术的核心方向，特别是深度学习技术在计算机视觉中的应用，在最近五六年的人工智能浪潮中担当了先锋者的角色。甚至可以说，如果没有深度学习技术在过去几年对计算机视觉一些核心领域的推动和促进，就很可能没有这一波的人工智能技术浪潮。

我们可以这么来看待人工智能技术，它可以说是利用计算机技术来对人的感官，例如视觉、听觉、触觉以及思维进行模拟，从而建立起逻辑推断等智能才具备的能力。其中，计算机视觉技术无疑是至关重要的，也是非常困难的。

今天我会带你先来看看究竟什么是计算机视觉，以及这个方向的研发都需要解决哪些核心问题。

计算机视觉的定义

关于计算机视觉（Computer Vision，CV），有两种人们普遍接受的定义。

第一种定义认为，计算机视觉是从数字图像（Digital Images）中提取信息。这些信息可以是图像中的物品识别（Identification）、导航系统的位置测量（Space Measurement）以及增强现实（Augmented Reality）的应用。

计算机视觉的第二种定义主要是从应用的角度出发，认为计算机视觉是为了构建可以理解数字图像内容的算法，从而有多种应用。

那到底什么是计算机视觉呢？主要解决哪些问题？我们可以拿人类视觉的主要功能来做类比，就比较容易理解了。

当人类面对一个现实中的场景时，我们有一个感官器官来收集信号，那就是“眼睛”。眼睛收集的原始信号转换为人可以处理的信息之后，这些信息就来到了“大脑”这一个人类信息处理中心，进行分析和处理。

这个过程中最主要的一个处理模块，就是对信号产生“语义”（Semantic）解释或者进行逻辑上的理解。比如，当我们看到一个公园的一角以后，需要识别这个场景里的桥梁、水、树等物体，并且在头脑中形成这些物体的概念。可以说，这就是人类视觉系统的一个简单的框架，眼睛收集信息，大脑处理信息。

那么，在整体的框架上，计算机视觉其实就是希望模仿人类的视觉系统构架。输入依然是一个现实中的场景，但是我们需要借助其他的感知仪器（Sensing Device）来从中获取原始信息。最常见的感知仪器包括照相机、摄像机以及现在广泛普及的手机摄像头。从这些感知仪器中获取了最初级的信息之后，计算机视觉的“大脑”就是计算机。这里的“计算机”其实是指计算机算法，通过算法理解原始数据，构建语义信息。

这么理解起来，计算机视觉技术好像挺简单的。就像 1966 年，麻省理工大学的一个本科生想做这样一个暑期项目，并且认为这个项目可以在一个暑假里解决。这或许就是计算机视觉的一个起源了。但是，令人感慨的是，计算机视觉绝不是可以在一个假期内解决的项目，整整半个多世纪已经过去了，计算机视觉依然有很多值得挑战的课题，也依然还在高速发展中。

计算机视觉的领域特点

了解了计算机视觉的定义之后，我们来进一步聊一聊这个领域的一些特点。

首先，计算机视觉是一个“跨学科领域”。正如刚才所说，对人类视觉的研究给计算机视觉带来了重要的启发。那这里就涉及到生物领域的研究，包括对人的眼睛以及视觉神经的研究。一方面，我们需要感知器来从现实世界中获取信息。那么，对于感知仪器来说，设备越是精确，就越能完整地捕捉外界世界的信息。这里就涉及到物理，特别是光学的研究。另一方面，人脑是处理所有信号并且形成语义概念的器官，理解人脑的信息处理机制就会对计算机视觉的发展有重要的作用，这就涉及到脑科学和认知科学等领域。

除此以外，计算机视觉毕竟是一个和计算机结合得很紧密的学科方向。因此，要想设计高效的计算机视觉算法，就必须和计算机科学的很多其他方向结合并借鉴，例如信息检索、计算机体系结构、机器学习等。

计算机视觉的另外一个特点，就是这个领域包含了很多非常深刻的困难问题。我们说，从计算机视觉被当作一个暑假项目到现在，五十多年已经过去了，这个领域依然在蓬勃发展着。时至今日，我们依然不能说计算机视觉是一个已经被完全解决的问题。

那计算机视觉任务“难”在哪里呢？我认为根本原因在于计算机视觉算法处理的输入，也就是数字化了的图像信息和我们需要理解的语义信息之间存在巨大的鸿沟。举例来说，一个 200 乘以 200 的 RGB 图像其实就是一个由 12 万个数字组成的矩阵，但是这个矩阵可能代表一个非常复杂的图像。从数字到具体的图像中的物体，再到去理解这个图像的语义，这中间有很长的距离。

一直以来，计算机视觉也在尝试去构造和逼近一些人类视觉系统的特点，但是困难重重。比如，人类视觉系统的反应很快。有实验表明，从一幅普通场景的图像中，人类只需要 150 毫秒就能够识别出里面的物体。另外，人类视觉系统的复杂性还来自于对世界认知的理解。例如，人可以依靠过去的记忆或者经验，还可以依靠其他外界知识，来对图像中的物体进行判断。这些都是计算机视觉系统难以企及的。

当然，在经历了半个世纪的研究之后，也有不少学者提出怀疑的观点，计算机视觉研究是否要对人类视觉系统进行完全的模仿呢？一种观点是，计算机视觉系统并不需要亦步亦趋地完全照搬人类视觉系统，这可能也并不是一条切实有效的道路。有一种观点认为，计算机视觉系统可以从人类视觉或者其他领域得到灵感，但是究竟应该如何搭建一个有效的系统，还是需要开辟新的研究道路。

计算机视觉的应用

计算机视觉技术的领用非常广泛，可以说是深入到了普通人生活的方方面面。在这些应用中，除了我们日常比较容易接触到的，例如面部识别、光学字符识别（OCR）、电影特效、视觉搜索以外，还包括最近几年飞速兴起的自动驾驶、自动无人商店、虚拟现实、增强现实等等。

可以说计算机视觉的应用任务领域众多。近几年都受到深度学习的影响，绝大多数领域都得到了高速发展，但是依然需要领域知识来构建更加有效的模型。

小结

今天我和你讲了计算机视觉技术的一个，是我们计算机视觉基础知识系列的第一篇，帮助你对计算机视觉有一个最基本的概念性的了解。

一起来回顾下要点：第一，我们聊了什么是计算机视觉；第二，我们讲了计算机视觉的特点；第三，我们简要提及了一些计算机视觉的应用。

最后，给你留一个思考题，我们说计算机视觉的核心挑战是从数字到语义的理解，那么理解图像数据有什么特殊的地方吗？

欢迎你给我留言，和我一起讨论。

141 | 掌握计算机视觉任务的基础模型和操作

今天，我们来聊一聊计算机视觉的一些最基础的操作和任务，包括像素表达、过滤器和边界探测。基于这些内容，我们一起讨论利用计算机来处理视觉问题的核心思路。很多时候，越是基础的内容就越重要，因为只有掌握了基础的思路，我们才能在今后复杂的任务中灵活应用。

像素表达

我们在上一次的分享中谈到了计算机视觉任务中一个非常重要的步骤，那就是把现实世界的信号通过感知仪器（Sensing Device）收集起来，然后在计算机系统中加以表达。那么，在所有的表达中，最基础的就是“像素表达”（Pixel）。我们这里就展开说一说这种表达的思路。

把图像信息利用像素来进行表达是一种非常直观简单的表达方式。

对于黑白图像来说，图像就被转换为了 0 或者 1 的二元矩阵。这个矩阵的每一个元素就是一个像素，0 代表黑，1 则代表白。

对于灰度图像来说，每一个像素，或者说是矩阵的每一个元素，代表灰度的“强度”（Intensity），从 0 到 255，0 代表黑，255 代表白。

对于彩色的图像来说，我们一般要先选择一种模型来表示不同的颜色。一种较为流行的表达方式是 RGB（红、绿、蓝）模型。在这样的模型中，任何一个彩色图像都能够转化成为 RGB 这三种颜色表达的叠加。具体来说，就是 RGB 分别代表三种不同的“通道”（Channel）。每一种通道都是原始图像在这个通道，也就是这个原始颜色下的表达。每一个通道都是一个矩阵像素表达。每一个像素代表着从 0 到 255 的值。换句话说，一个彩色图像在 RGB 模型下，是一个“张量”（Tensor），也就是三个矩阵叠加在一起的结果。

针对像素，你需要建立一种概念，那就是像素本身是对真实世界中的“采样”（Sample）。每一个像素是一个整数，整个像素表达并不是一个“连续”（Continuous）表达。因此，在把世界上的连续信号采样到离散像素的这一过程中，难免会有失真。而不同的“分辨率”，会带来失真程度不同的像素表达。

过滤器

既然已经把图像表达成为了像素，也就是某种矩阵的形式，那么我们就可以利用线性代数等工具在这个矩阵上进行变换，从而能够对图像进行某种操作。这就是“过滤器”（Filter）的一个基本思想。

很多计算机视觉的操作本质上都是过滤器操作。除了把过滤器想成某种线性代数变换之外，更普遍的一种思路是把在矩阵上的操作想成某种函数的操作。因此，我们也可以认为过滤器是函数在某一个特定区间内的操作。

举一个最简单的过滤器的例子，就是“移动平均”（Moving Average）。这个过滤器的本质就是针对每一个像素点，计算它周围 9 个像素点的平均值。如果我们针对每一个像素进行这样的操作，就会得到一个新的矩阵。然后我们把这个矩阵当作新的像素表达进行视觉化，就会发现是在原有图像基础上进行了“柔化”处理。反过来，如果我们需要对某一个图像进行柔化处理，就需要对其进行“移动平均”过滤操作。

有了这个直观的例子，你一定能够想到，很多我们熟知的图像特效处理，其实都对应着某种过滤器操作。

这里，我们提及一种比较特殊的过滤处理，那就是“卷积”（Convolution）。这个概念我们在深度学习中经常接触到。

刚才我们说到“移动平均”这个过滤器。如果我们把图像看作是一个函数 F 在某一个区域的取值，那么，“移动平均”这个过滤器是针对函数在某一点的取值（也就是某一个像素的取值），通过利用同样的函数 F 在周围的取值，从而得到一个新的计算值。

那卷积操作的思想是怎样的呢？卷积是针对 F 在某一个点的取值，除了需要利用 F 在周围的点以外，还需要利用另外一个函数，这里称作是 H 的取值。也就是说，我们要利用 H 来针对 F 进行操作。

边界探测

除了通过过滤器对图像进行简单操作之外，还有一些图像的基本操作蕴含了计算机视觉的基本原理。我们这里也稍微做一些介绍。

例如我们通常需要了解图像的边界。有研究表明，图像的边界对于人类认知图像的内涵有着特殊的意义。因此从一个完整的图像中找到不同物体的边界是一个很有现实意义的任务，并且通常被称作是“边界探测”（Edge Detection）。

那么，怎么来认识图像中的物体边界呢？我们先从直观上来想一想，在图像中，“边界”都有什么特征？一般来说，如果我们遇到了色彩、景深、照明的突然变化，或者是其他某种图像特质上的突然变化，我们就有可能遇到了边界。现在的问题是，在像素或者函数表达的情况下，如何来描述和检测这些“突然变化”？

在数学分析中我们学过，描述函数值变化的概念叫“导数”或者“梯度”（Gradient）。梯度大小（Gradient Magnitude）和梯度方向（Gradient Direction）都包含了函数变化的重要信息。

虽然梯度从数学的角度来说刻画了函数的变化，但是这对于设计一个实际的边界探测器依然是不够的。一个好的边界探测器需要真正能够探测到边界，也就是要尽可能少地出现错误，能够对边界进行定位（Location）的同时还需要尽量使边界平滑和链接。

在真实的边界探测中，我们往往先让图像变得更加平滑，比如利用“高斯柔化”（Gaussian Blur）的办法，然后在这个基础上计算梯度大小和方向，有了这些之后再进行一些后期处理。

小结

今天我和分享了计算机视觉的一些基本数学模型和操作。

一起来回顾下要点：第一，像素是对真实世界的采样，我们分别讲了对黑白、灰度和彩色图像的像素表达；第二，我们讲了在像素表达之上的过滤器，介绍了移动平均和卷积两种方式；第三，我们简要提及了利用函数的梯度计算来进行边界检测的任务。

最后，给你留一个思考题，从边界检测的任务中，如何知道检测到的像素是真正属于边界呢？

欢迎你给我留言，和我一起讨论。

142 | 计算机视觉中的特征提取难在哪里？

在上一次的分享中，我们聊了计算机视觉的一些最基础的操作和任务，包括像素表达和过滤器这两个视觉问题。我们还简单介绍了边界探测这个任务，了解如何从计算机视觉的角度来对这个任务进行建模。

今天，我们来看计算机视觉基础问题中的另一个核心任务，那就是特征（Feature）提取。

特征提取的目的

在深入讨论特征提取之前，我们先来了解一下特征提取的目的，或者说是研究特征提取的必要性。

从大的方面来说，计算机视觉的一部分任务是实现对图像的智能理解。那么，理解图像的语义就是其中一个非常重要的任务。

我们提到的边界检测或者是颜色检测，虽然都是理解图像的任务，但是这些任务并不理解图像中具体的物体，比如哪里是一只动物、哪里是行人等。那么，怎样才能理解图像中具体的物体呢？或者更进一步，整个图像表达了怎样的社会关系或者说是场景关系？例如一张会议室的图像，我们不仅关心里面的陈设和人物，还关心会议室的整体气氛，以及这样的气氛是不是传递出了更复杂的人物之间的社会关系。

那么，如何实现这种更高维度的语义理解呢？这往往需要我们对底层的一些图像先进行抽象，然后再在抽象出来的特征基础上，进一步来建模。

除了我们这里提到的对图像本身的理解以外，在很多任务中，我们还需要对图像和其他信息结合起来进行理解和分析。一种常见的形式是图像和一段文字结合起来，对某一个物品或者某一个事件进行描述。例如电商网站的商品信息，一般都有精美的图片和详细的介绍，这些信息组合起来完整地描述了整个商品的信息。

这个时候，我们就要同时理解图像和文字信息。很明显，在这样的任务中，一种比较容易想到的模式是先从图像和文字中分别抽取一定的抽象特征，有了高度概括的图像特征和文字特征之后，我们再在这个基础上进行建模。

从比较小的计算机视觉的任务来说，很多时候，一个任务会涉及到两个步骤：把任务抽象为提取特征，然后转换为一个普通的机器学习任务。这个流程的第二步可以是一个监督学习任务，例如回归或者分类；也可以是一个非监督学习任务。需要注意的是，我们这里提到的两个步骤，并不一定是绝对地把建模过程当作两个完全独立的步骤，而是从逻辑上对这两个步骤进行区分。事实上，在现代的深度学习架构中，这两个步骤往往都在统一的一个架构下进行训练，从而能够得到更好的效果。

今天，我们就从传统的计算机视觉的角度，来看看特征提取有哪些难点和经典方法。

特征提取的难点及基本思路

图像数据的特征提取为什么有难度呢？原因在于图像信息本身的复杂性。

试想我们有两张人民大会堂的建筑物照片，一张是从地面拍摄的，一张是从空中拍摄的。虽然这两张照片可能在角度、色彩、位置等方面有很多的不同，但是因为这两张照片本身所描述的对象是一致的，都是人民大会堂，因此我们希望从这两个图片中提取的特征有一些相似性。也就是说，我们需要找到在诸多变化因素中不变的成分。

一个经典的思路是从局部信息（Local Information）入手，从图像中提取相应的特征。从实际的效果来看，局部特征（Local Feature）比全局特征更加稳固。

回到上面的例子，如何构造一个能够匹配两个图片的普遍的局部特征呢？过程如下：第一，找到一组关键的点或者是像素；第二，在关键点周围定义一个区域；第三，抽取并且归一化这个区域；第四，从归一化后的区域提取“局部描述子”（Local Descriptor）。得到局部描述子之后，我们就可以利用它来进行匹配了。

从上面这个流程来看，整体的思路其实就是希望从局部找到具有代表性的特征，然后把所有因为各种因素造成的特征变化归一化掉。

当然，这个简单的流程是有一些问题的。比如，如果我们针对两幅不同的图像分别进行上述的流程，那么很有可能最后得到的关键点和局部描述子都不一样。所以我们需要一种更具普适性的方法。

其实从 70 年代开始，就有一大部分的计算机视觉工作是在研究如何构建局部特征描述子。在这 30 多年的发展历程中，很多研究工作者提出了不少既有理论基础又有实用价值的特征提取方法。甚至是最近的深度学习热潮，从某种程度上来说也是一个重要的特征提取成果。

在这些研究成果中，比较有代表性的局部描述子包括SIFT（Scale-invariant feature transform）描述子和HOG（Histogram of oriented gradient）描述子。关于这两个描述子，我在这里不展开介绍它们的细节，因为在深度学习浪潮中，大部分利用描述子来对特征进行提取的方法都被淘汰了，但是这些方法的思路，我们在很多类似的工作中依然可以借鉴。所以，如果你有兴趣继续了解，可以阅读我在文末提供的两个参考文献。

小结

今天我为你讲了计算机视觉中的又一个核心任务：特征提取。帮助你对计算机视觉的一些基本特征提取有一个了解。

一起来回顾下要点：第一，在图像理解任务中，高维度的语义理解，以及理解图像和其他信息的组合形式，都需要特征提取这个关键步骤；第二，特征提取的难点在于图像信息本身的复杂性，一个经典的思路是从局部信息入手，提取局部特征。

最后，给你留一个思考题，除了图像数据以外，还有没有其他形式的数据，也需要我们先对数据的不同形态（例如图像中的颜色、方位、角度等）进行处理，从而识别出相同的物体或者数据个体？

欢迎你给我留言，和我一起讨论。

参考文献

1. David G. Lowe, “Distinctive image features from scale-invariant keypoints,” International Journal of Computer Vision, 60, 2 (2004), pp. 91-110.

2. N. Dalal and B. Triggs. Histograms of Oriented Gradients for Human Detection. In CVPR, pages 886-893, 2005.

143 | 基于深度学习的计算机视觉技术（一）：深度神经网络入门

在最近几年的人工智能发展中，深度学习技术成为了一个强劲的推动力。对于计算机视觉来讲，深度学习在过去几年重新改写了这个领域的核心方法论。时至今日，深度学习已经深入到了计算机视觉技术的方方面面，成为解决各类视觉问题的有力工具。

从今天开始，我们将介绍一系列以深度学习为背景的计算机视觉技术。那么在这个环节的第一篇分享中，我们首先来了解一下什么是深度学习。

为什么是深度学习

在了解一些深度学习技术细节之前，我们首先要来看一下为什么需要深度学习技术。

初学者经常会有一个误区，那就是认为和“深度学习”相对的就是“浅层学习”（Shallow Learning）。这种看法也对，也不对。

“对”的地方在于“深度学习”的确强调从数据或者说是特征（Feature）中构造多层或深度的变换，从而能够得到非线性的表征（Representation）。显然，这种效果是线性模型所达不到的。

“不对”的地方是，在所谓的“深度学习”，或者准确地讲是深度神经网络技术发展之前，就已经有了很多构造复杂非线性表征的尝试和技术。这些技术在机器学习和人工智能的发展中都起到了举足轻重的作用。

说到这里，我们就要从线性模型聊起了。从线性模型发展到非线性模型，这一步貌似理所当然，但其实这里面有一个非常重要的思路，那就是线性模型并不是不能处理数据中的非线性关系，这一点很容易被忽视。很多时候，我们其实是可以构造非线性的特征，然后利用线性模型来把所有的非线性特征给串联起来。

举个例子，在网页搜索中，我们经常利用类似 PageRank 来表征一个网页的重要性。这个模型本身就是非线性的对网页图（Graph）的一种表征。所以，即便在此之上构建线性模型，整个模型其实也是包含了非线性的表征转换。

其实，对于很多深度学习模型而言，即便进行了复杂的表征转换，在最后一层对最终的输出进行建模的时候依然是一个线性模型。所以，线性模型在非线性特征的帮助下，依然能够满足整体的非线性建模的需求。

那么，这种非线性特征外加线性模型的方法有什么问题呢？

这类方法的主要问题是，如何才能系统性地找到这些非线性特征呢？其实，传统的机器学习中的特征工程（Feature Engineering）主要就是在做特征寻找这个事情，也就是要消耗人力和物力去寻找这些特征。有时候，找到一个好的特征可能还需要灵感和其他领域特定的知识。

那么，有没有办法让模型自身就能从现有的数据中发现这些非线性关系，从而不需要额外的特征工程呢？

其实在机器学习发展的早期，研发人员就意识到了这个方向的重要性，这样就发展出了各种各样的非线性模型。

这里面比较有代表性的模型是“决策树”（Decision Tree），以及在此基础上发展出来的一系列“树模型”（Tree Models）。我们在专栏里介绍过，树模型在搜索和推荐的一些场景中都有不错的性能表现。在很大程度上，树模型可以表达非线性的关系，但是它的困难之处在于无法表达过于深层次的数据关系。一般来说，3 到 4 层的树已经算是比较深的结构了，如果一个树模型有特别多层次还能被训练成功，这样的例子是比较少见的。

除了树模型之外，还有一类模型，用来挖掘数据中间的隐含关系，特别是非线性关系，这就是“概率图模型”（Probabilistic Graphical Model）。例如在文本挖掘领域非常流行的 LDA（Latent Dirichlet Allocation），以及在推荐领域流行的矩阵分解（Matrix Factorization），都可以被看作是概率图模型中的佼佼者。

概率图模型的一大优势是可以融入众多对于数据以及所需要处理问题的直觉，从而能够让模型具有一定的可解释性，甚至是“因果性”（Causality）。但是，概率图模型的最大挑战就是每一个模型都需要单独计算训练算法。也就是说，算法无法做到普适通用。这就极大地限制了概率图模型在实际问题，特别是大数据问题中的应用。

综合来看，我们急需一种方法，能够自动挖掘数据中的非线性关系，而且最好能够找到数据中的隐含规律，这种隐含的规律可能是非常多层次的非线性转换；并且，这种方法还需要在计算上直接通用，不同模型可以共用一个计算框架。

所有这些因素如何囊括在一个方法里呢？答案就是深度学习技术。

深度学习的特点

深度学习技术慢慢成为了主流的非线性模型。接下来我们来看一看深度学习技术的一些特点。

首先，深度学习技术是一个非常大的外延，这里面包含了很多不同的模型和模型的计算框架技术。这两者都是深度学习成功必不可少的组成部分。

深度学习中有一种最简单也是最基础的模型，就是“深度神经网络”（Deep Neural Networks）。这种模型其实很早就已经被提出了。

从形式上来说，深度神经网络就是把多层简单的非线性操作叠加起来，希望能够发现更加复杂的非线性关系。实际上，有理论研究表明，在有足够的内部隐含变量的情况下，深度神经网络可以表达任意复杂的函数关系。也就是说，深度神经网络有希望能够对现实世界中的复杂现象进行建模。这一点对于我们刚才提到的树模型和概率图模型来说，有相当大的难度或者说几乎是不可能的。

另外，回到我们刚才说的特征工程的需求，深度神经网络的确可以减轻这方面的压力。虽然并不如很多人预期的那样，深度神经网络依然需要依赖一定的初始数据，但是已经有实验表明，通过深度神经网络学习的特征在很多时候相比于研发人员手动挖掘的特征要更加健壮。

实际上，在计算机视觉这样的领域里，利用深度神经网络来挖掘特征基本上已经完全代替了手动的特征挖掘。

深度神经网络还有一个特点就是计算的普适性。刚才我们讲到概率图模型有一个“死穴”，就是计算无法做到模型普适，或者说在不牺牲性能的前提下，计算无法做到普适性。那么这一点来说，以深度神经网络为代表的深度学习，依赖简单的梯度下降就能对非常复杂的网络进行计算。而这种计算是可以针对不同的模型的，因此这就极大地降低了深度学习在实际工程应用中的代价。

小结

今天我为你讲了基于深度学习的计算机视觉技术的第一篇分享，帮助你对深度学习有一个更加明确的认识。

一起来回顾下要点：第一，深度学习技术能够自动挖掘数据中的非线性关系；第二，在计算机视觉领域里，利用深度神经网络来挖掘特征已经基本代替了手动的特征挖掘，而且，深度神经网络还具有计算的普适性。

最后，给你留一个思考题，和树模型或者概率图模型相比较，深度学习有什么劣势吗？如果有，你认为它最大的劣势是什么？

欢迎你给我留言，和我一起讨论。

144 | 基于深度学习的计算机视觉技术（二）：基本的深度学习模型

在上一期的介绍里，我们讨论了以深度学习为背景的计算机视觉技术，重点讲解了为什么需要深度学习，特别是从传统模型的眼光来看深度学习模型的特点。

今天，我们来聊一聊应用到图像上的一些最基本的深度学习模型。

前馈神经网络

前馈神经网络（Feedforward Networks）应该算是最基本的神经网络架构了。这种架构是理解其他神经网络结构的基础。

我们可以从最基本的线性模型（Linear Model）入手，来理解前馈神经网络。线性模型说的是有一组输入 x，然后有一个输出 y，我们学习到一组向量，有的时候也叫作系数 w，来通过 x 预测 y。这种线性模型可以算是最简单的机器学习模型了。在图像的情况下，输入往往是一个向量，输出也是一个向量，这个时候，我们需要学习的系数就从一个向量变为一个矩阵了。

那么，试想一下，如果我们把多层的线性模型进行叠加，能否得到多层的神经网络结构呢？答案是否定的。即便是多层的线性模型，只要每一层的变换是线性的，那么最后的结果一定也是线性的。因此，要想构建多层的非线性模型，每一层的变换也一定要是非线性的。

那么，如何在线性模型的基础上，我们只进行一些最小的改动，就能引入非线性的因素呢？

在这里，我们引入一个叫“激活函数”（Activation Function）的概念。直观地理解，激活函数就是在线性模型输出的基础上进行非线性变换。一个最简单的激活函数就是Sigmoid 函数，也就是把负无穷到正无穷的实数给映射到 0～1 这个范围内。我们经常提到的对数几率回归，其实就是对这种变换的另一种称呼。

利用了 Sigmoid 激活函数的线性模型，本质上就是在做二元分类。在神经网络发展的早期，Sigmoid 激活函数是一种普遍使用的非线性变换方式。遗憾的是，在之后的发展中，研究人员发现了 Sigmoid 函数在数值稳定性上存在严重的问题。

具体来说，在很多机器学习的优化算法中，我们都需要依赖“梯度下降”（Gradient Descent）的方法来优化目标函数。在前馈神经网络中，梯度下降也是一种简单的优化神经网络并且学习到系数矩阵的方法。但是因为有 Sigmoid 函数的存在，计算的梯度有可能会溢出或者归零。在这样的情况下，模型就无法得到正常的学习。

为了解决 Sigmoid 激活函数的问题，研究人员发明了“线性整流函数”（Rectified Linear Unit），或简称ReLu 函数。和 Sigmoid 函数相比，ReLu 函数直接留下大于 0 的数值，把小于 0 的数值统统归 0。在 ReLu 函数的帮助下，我们能够更容易地训练多层的前馈神经网络。

有了非线性的转换之后，前馈神经网络往往可以把多个非线性的转换给叠加在一起，形成多层的结构。有了这个多层的转换之后，最后一层往往是是把已经有的信息再映射到最终需要的输出上。这可以是一个回归问题，也可以是一个分类问题。

从我们之前提到的特征提取的角度来讲，前馈神经网络的中间层次就是利用最原始的信息来提取数据的特征，而最后一层可以当作是我们之前讲过的线性模型层。只不过和手动构造复杂特征有一个不同的地方，前馈神经网络是自动学习这样的特征。

卷积神经网络

了解了最基本的前馈神经网络之后，我们来看一看它是怎么应用到图像处理中的。我们在之前的计算机视觉基础知识中讲到过，一种最直观的表达图像数据的方法就是把图像看成矩阵数据。

比如，有一个长 32 像素、宽 32 像素并且有 3 个颜色通道（Channel），或者简称为“32 乘 32 乘 3”的图像，如果我们采用前馈神经网络来对这个图像进行建模，需要学习的系数或者说权重是多少呢？就是把这 3 个数乘起来，一共有 3072 个系数需要学习。如果说这还是一种可以接受的方案的话，那么一个长宽为 200 像素，也是 3 个颜色通道的图片就需要 12 万个系数。很显然，直接采用前馈神经网络来表达图想信息需要大量待学习的参数。那么，我们在这里就需要有一种方法能够更加简洁地表达数据。

卷积神经网络（Convolutional Neural Networks），简称为 CNN，就是来解决这类问题的一种神经网络架构。其实，CNN 最初就是专门为视觉问题而提出的。那么，如何利用 CNN 来解决这个问题呢？

首先，卷积神经网络试图用向量来描述一个矩阵的信息。从工具的角度来讲，卷积神经网络利用两个特殊的架构来对图像数据进行总结，一个叫“卷积层”（Convolutional Layer），一个叫“池化层”（Pooling Layer）。

在简单理解卷积层和池化层之前，我们先来看一下卷积神经网络是采用怎样的架构来处理图像的。一般来说，图像的输入要先经过一个卷积层，再经过一个线性整流函数，然后经过一个池化层，再经过一个全联通层（也就是前馈神经网络），最后得到一个向量的表达。需要注意的是卷积神经网络的优势就是直接处理 3 维数据，进行 3 维的变换。

现在我们来看卷积层是如何工作的。卷积层直接作用在 3 维的输入上，利用另外一个 3 维的“过滤器”（Filter）来对原始的数据进行卷积操作。例如对于一个“32 乘 32 乘 3”的图像来说，我们可以使用一个“5 乘 5 乘 3”的过滤器来对其进行卷积。

在这里，我不展开来讲卷积操作，如果你有兴趣可以在网上找到卷积操作的数学定义。在这里，我们只需要理解卷积操作是利用一个小的过滤器来对原始的更大的图像进行函数变换，从而希望能够提取图像的局部特征。

在刚才这个例子中可以看到，因为有了卷积层，我们就不需要针对原始大小的图像进行表达了，而仅仅需要学习过滤器上的参数，这种方法就大大减少了参数的数目。

池化层的目的是对数据进行进一步的高度总结和概括。对于一个矩阵来说，池化层针对某一个矩阵的局部，采用平均值、最大值来总结这个区域的矩阵数值。例如，我们有一个“4 乘 4”，一共 16 个单元的矩阵，如果我们针对每个“2 乘 2”的区域加以最大值（Max Pooling）池化，那么我们就可以把 16 个单元的数据总结为“2 乘 2”，也就是一共 4 个单元的数据。每个单元是原来矩阵中“2 乘 2”区域中的最大值。

当一个图像经过了卷积和池化等一系列的操作以后，我们就说已经提取了这个图像的关键特征。这个时候，我们往往会把数据经过基本的前馈神经网络来进一步融合，最后能够完整地总结数据信息。在前馈神经网络之后，这就又是一个线性的决策层，可以是回归，也可以是分类。

小结

今天我为你讲了基于深度学习的计算机视觉技术的第二篇分享，帮助你对深度学习的基本模型，包括前馈神经网络和卷积神经网络有一个基本的认识。

一起来回顾下要点：第一，我们从线性模型入手讨论了前馈神经网络架构，重点介绍了激活函数和线性整流函数；第二，我们讲了在前馈神经网络基础之上的卷积神经网络，核心是用向量来描述一个矩阵的信息。

最后，给你留一个思考题，卷积神经网络中池化层的必要性是什么？为什么需要总结周围的单元到一个单元？这难道不是丢失了很多信息吗？

欢迎你给我留言，和我一起讨论。

145 | 基于深度学习的计算机视觉技术（三）：深度学习模型的优化

在上一讲的分享里，我们聊了应用到图像上的一些最基本的深度学习模型，主要讨论了前馈神经网络和卷积神经网络的定义，以及它们在图像处理上的应用。

今天，我们从优化的角度来讨论，如何对深度学习模型进行训练。可以说，模型优化是成功利用深度学习模型的关键步骤。

一般机器学习模型的优化

要想了解深度学习模型的优化，我们首先得来看一看一般机器学习模型的优化。先了解一些基本的步骤，我们在讨论深度学习模型优化的时候就能更容易地看清事物的本质。

在开始说模型优化之前，要说一点需要注意的问题，我觉得这一点对于初学者来说尤为重要，那就是要区分开模型、目标函数和优化过程。这三个实体相互关联而且相互影响，我们需要对每一个实体都有一个清晰的理解。

我们以线性模型作为例子，来感受下这三个实体的关系。

我们说一个模型是线性模型，是指我们期望利用一组特征（Feature）来对一个输出反馈进行线性预测。这里的线性其实主要是指参数针对于反馈变量而言是线性的。

需要注意的是，线性模型是一个数学模型。线性模型的设置本身并没有限定这个模型的参数（也就是模型的系数）是如何得来的，也就是数学模型本身的设置和得到参数的过程往往是互相独立的。我们把得到参数的过程叫作模型训练或者简称为模型优化过程。

对于线性模型而言，我们常常利用最小二乘法来构造参数学习的目标函数。在最小二乘法的目标函数下，一般情况下，我们既可以得到一个“解析解”（Closed Form Solution），也能通过例如梯度下降的方法来进行数值优化。

对模型、目标函数和优化过程这几个概念有了清晰的认识后，那具体的模型优化过程是怎样的呢？

这里，我们就总结一下一般机器学习模型，主要是简单模型的优化过程。

模型优化的第一步就是选择目标函数。总的来说，简单的机器学习模型主要有两类目的，回归和分类。对于回归而言，我们选择最小二乘法，也就是“平方损失”（Squared Loss）作为目标函数；对于分类而言，我们选择“对数几率损失”（Logistic Loss）。这两种损失和模型是否是线性并没有直接的关系。当然，对于简单模型来说，模型往往是线性的。那么，当模型是线性的，而目标函数又是我们刚才所说的这两类，这种情况下，我们找到的其实就是线性回归和对数几率回归这两大基本模型。

当我们选择好了目标函数之后，下面一个步骤一般是尝试根据目标函数寻找参数的最优解。这一个步骤我们往往需要根据参数尝试写出参数的梯度。对于简单的线性模型来说，这一步往往相对比较容易。但是有一些模型，包括深度学习模型，梯度并不是那么直观就能够得到的。这也就直接导致下面的步骤变得更加复杂。

得到梯度以后，一般来说，我们首先尝试有没有可能得到一个解析解。

有解析解，往往就意味着我们并不需要通过迭代的方法来得到一个数值优化的解。解析解往往也不是近似解，而是一个确切的答案。当然，在真实的数据中，一些理论上的解析解因为数值稳定性的因素依然无法得到。对于解析解来说，我们需要写出参数的梯度，然后尝试把等式置零，然后看是否能够解出参数的表达式。这个过程并不一定对于每一个模型都适用。

如果我们没法得到解析解，就需要另外一个方法了，那就是利用数值计算来取得一个近似解。在有了梯度信息以后，一种最普遍的数值计算方法就是梯度下降法。从原则上来说，梯度下降是求一个函数最小值的数值流程。如果你需要求一个函数最大值的流程，那就需要梯度上升。

怎样才能保证梯度下降一定能够得到最优解呢？一般来说，梯度下降并不能保证找到函数参数的最优解，往往只能找到一个局部最优解。对于凸问题（Convex Problem）而言，局部最优也就是全局最优。因此，从理论上说，梯度下降能够找到凸问题的全局最优解。当然，到底多快能够找到这个最优解，也就是算法的收敛速度是怎样的，就又是另外一个问题了。

但是对于非凸（Non Convex Problem）问题而言，梯度下降仅仅能够收敛到一个局部最优解，这个解是否能够被接受，还有待考证。

深度学习模型的优化

在这里，我们从普通的模型衍生出来，看一看深度学习模型的优化问题。

和普通模型一样，深度学习模型也需要一个目标函数来对参数进行有效学习。我们前面在介绍深度学习模型的时候提到过，很多时候，深度模型都充当了更加复杂的特征提取器的角色。而在最后一层的表达中，我们可以认为是在复杂特征后的线性模型。因此，我们依然可以使用回归（或者说平方损失），抑或分类（或者说是对数几率损失），来对不同的问题进行建模。

遗憾的是，深度模型的特点就是多层。而进行优化的流程中，第一个步骤就是梯度的计算，这一步因为模型的多层变得复杂起来。从概念上来说，我们需要得到在当前迭代下，针对模型参数的梯度，这些梯度包括每一个隐含层的参数。我们之所以能够计算深度模型，第一个重要发展就是能够计算这些梯度。

在深度学习的语境中，计算梯度的方法叫作“反向传播”（Back Propagation）。关于如何计算反向传播，网络上有很多教程，我们在这里就不赘述了。你需要记住的是，反向传播是为了有效快速地计算梯度。

那么，有了梯度之后，我们是不是就能够得到深度模型参数的解析解呢？

很可惜，我们无法得到一个解析解。原因是深度模型的复杂性以及其高度的非凸性。我们不仅无法得到一个解析解，也没有办法轻易得到一个全局最优解。能够采用的一种办法就是使用梯度下降来对问题进行近似求解。而如何利用梯度下降的办法来对深度模型有效求解，一直都是深度学习研究领域的一个重心。

在过去将近 10 年的研究中，大家发现，一个好的初始值往往能够让优化过程变得容易一些。而在梯度下降的过程中，有一些下降方法也要好于其他的方法。一些小技巧，比如 Dropout，批量归一化（Batch Normalization）等，已经变成了深度模型优化的标准流程之一，目的就是能够有效地计算梯度，而且有较好的数值稳定性。

小结

今天我为你讲了机器学习模型，包括传统模型和深度学习模型的优化流程。

一起来回顾下要点：第一，我们聊了什么是模型、目标函数和优化过程这三个概念，清晰理解这三个概念之间的关系非常重要；第二，我们从一般机器学习模型的优化过程入手，讲了深度模型的优化。

最后，给你留一个思考题，有哪些因素造成了深度模型优化的困难？

欢迎你给我留言，和我一起讨论。

146 | 计算机视觉领域的深度学习模型（一）：AlexNet

我们继续来讨论基于深度学习的计算机视觉技术。从今天开始，我们进入一个新的模块，我会结合几篇经典的论文，给你介绍几个专门为计算机视觉而提出来的深度学习模型。这些模型都在最近几年的深度学习发展中，起到了至关重要的作用。

我们这个系列要分享的第一篇论文题目是《基于深度卷积神经网络的图像网络分类》（ImageNet Classification with Deep Convolutional Neural Network）[1]。因为这篇文章的第一作者名字叫 Alex，所以文章提出的模型也经常被称为AlexNet。

那接下来我们就先介绍一下这篇论文的作者群。

第一作者就是亚力克斯·克里切夫斯基（Alex Krizhevsky）。发表这篇论文的时候他在多伦多大学计算机系攻读博士学位；之后的 2013~2017 年间在谷歌任职，继续从事深度学习的研究。

第二作者叫伊利亚·苏兹克维（Ilya Sutskever）。发表这篇论文的时候，苏兹克维也在多伦多大学计算机系攻读博士学位；之后到斯坦福大学跟随吴恩达做博士后研究。2013~2015 年间，他在谷歌担任研究科学家一职。2016 年之后，他参与共同创立了 OpenAI 并且担任研究总监这一职位。苏兹克维在深度学习方面已经发表了很多篇论文，目前论文的引用数已经超过 7 万次。

最后一位作者是杰弗里·辛顿（Geoffrey Hinton）。对于辛顿，我们就比较熟悉了，他是多伦多大学计算机系的教授，是机器学习，特别是深度学习的学术权威。可以说，几十年来，辛顿都在以神经网络为代表的深度学习领域深耕，即便是在其他学术思潮涌动的时候，他都能够坚持在深度学习这一领域继续钻研，这种精神让我们钦佩。

论文的主要贡献

如何来描述这篇论文的主要贡献呢？简而言之，这篇论文开启了深度学习在计算机视觉领域广泛应用的大门。通过这篇论文，我们看到了深度学习模型在重要的计算机视觉任务上取得了非常显著的效果。

具体来说，在 ImageNet 2012 年的比赛中，文章提到的模型比第二名方法的准确度要高出十多个百分点。能够达到这个效果，得益于在模型训练时的一系列重要技巧。这篇论文训练了到当时为止最大的卷积神经网络，而这些技巧使得训练大规模实用级别的神经网络成为可能。

论文的核心方法

要了解 AlexNet 的一些核心方法，我们就需要简单提一下 ImageNet 竞赛的数据集。这个数据集在当时有大约 120 万张训练图片，5 万张验证图片和 15 万张测试图片。这些图片属于 1000 个类别。这个数据集在当时来说应该算是无可争议的大型数据集。为了能够方便地处理这些图片，作者们把所有图片的分辨率都重新调整到了“256*256”。AlexNet 直接在这些图片的 RGB 像素点上进行建模。

整个模型的架构是怎样的呢？AlexNet 一共包含 8 层网络结构，5 层全联通层（也就是前馈神经网络）。这 8 层网络架构总体来说是逐渐变小的一个趋势，也就是说每一层提取的信息越来越呈现高度的概括性。

那么在整个架构中，这篇文章提出的模型有哪些独到之处呢？

第一，AlexNet 采用了“线性整流函数”（ReLu）来作为激活函数。虽然这个选择在今天看来可以说是非常平常，甚至已经成为了神经网络建模的默认选项。但这个选择在当时还是很大胆的一种创新。这个创新带来了训练时间的大幅度减少，同时还能保持，甚至提升了模型性能。

第二，整个模型的训练大量采用了 GPU，并且使用了多个 GPU 来进行计算。这一点就在速度上和模型的大小上彻底解放了模型的选择。以前仅仅利用单个 GPU 的方式，没办法把所有的训练数据都放入一个 GPU 上。

第三，作者们介绍了一种叫作“局部响应归一化”（Local Response Normalization）的方法来对每层之间的单元进行归一。

如何进行最有效的归一，以及这些归一化有什么作用，这些问题一直都是深度学习研究面临的重要课题。从实际的使用上来看，这种局部响应归一化的方法在几年之后让位给了其他更为主流的归一方法。但是从这一个技术要点来看，我们要想把深度学习模型真正应用到实际场景任务中，归一化是一个必不可少的组件。

第四，作者们在 AlexNet 里面使用了所谓的“重叠池化”（Overlapping Pooling）这种方法。在普通的卷积神经网络中，“池化”的作用是从周围的单元中总结出必要的信息。一般来说，池化的过程中，并不重复覆盖相同的单元。也就是说，池化不会重叠。而在这篇论文中，作者们发现重叠池化能够降低错误率，虽然非常微量但是很重要。这个组件在之后的发展中并不多见。

除了在网络架构上的一些创新之外，AlexNet 的训练过程中最需要注意的是防止“过拟合”（Overfitting）。在很长的一段时间里，我们没有办法把深度神经网络模型应用在实际场景中，一个很重要的原因就是过拟合。可以说，如何防止神经网络模型过拟合，这个问题让研究人员伤透了脑筋。

所谓过拟合就是说模型在训练集上工作得很好，但是无法“泛化”（Generalization）到测试集，也就是没有出现过的数据上。无法泛化其实也就证明训练的模型对未知数据的预测能力很差。

这篇论文中主要提到了两种防止过拟合的方法。

第一种思路叫“数据增强”（Data Augmentation）。简单来说，这里的思路其实就是增加“虚拟数据”来增加数据的多样性，从而能够让模型更加健壮。那虚拟数据是怎么来的？虚拟数据其实来源于真实数据的变形。

第二种思路就是 Dropout。这种方法在当时看显得很随便，就是在训练的时候随机把一些单元置零。作者们发现在这样随机置零的过程后，模型会变得更加稳定。值得一提的是，Dropout 已经成为了这几年深度学习的一个标配。

小结

今天我为你讲了第一篇基于深度学习的经典论文，讨论了 AlexNet 这个模型，这个模型开启了深度学习全面进军计算机视觉领域的时代。

一起来回顾下要点：第一，AlexNet 模型在 ImageNet 2012 竞赛中胜出，让我们看到了深度学习模型在计算机视觉领域中所取得的显著效果；第二，我们讨论了 AlexNet 模型的四大创新之处，以及论文提出的两种防止过拟合的方法。

最后，给你留一个思考题，站在现在的立场，AlexNet 在当时的成功是否给你一些启发呢？

欢迎你给我留言，和我一起讨论。

参考文献

ImageNet Classification with Deep Convolutional Neural Networks, Alex Krizhevsky, Ilya Sutskever, and Geoffrey Hinton, NIPS, 2012.

147 | 计算机视觉领域的深度学习模型（二）：VGG & GoogleNet

在上第一期的分享中，我们通过一篇经典论文讲了 AlexNet 这个模型。可以说，这篇文章是深度学习在计算机视觉领域发挥作用的奠基之作。

AlexNet 在 2012 年发表之后，研究界对这个模型做了很多改进工作，使得这个模型得到了不断优化，特别是在 ImageNet 上的表现获得了显著提升。今天我们就来看看针对 AlexNet 模型的两个重要改进，分别是 VGG 和 GoogleNet。

VGG 网络

我们要分享的第一篇论文题目是《用于大规模图像识别的深度卷积网络》（Very Deep Convolutional Networks for Large-Scale Image Recognition）[1]。这篇文章的作者都来自于英国牛津大学的“视觉几何实验室”（Visual Geometry Group），简称 VGG，所以文章提出的模型也被叫作 VGG 网络。到目前为止，这篇论文的引用次数已经多达 1 万 4 千次。

首先，我们简单来了解一下这篇论文的作者。

第一作者叫卡伦·西蒙彦（Karen Simonyan），发表论文的时候他在牛津大学计算机系攻读博士学位。之后，西蒙彦加入了谷歌，在 DeepMind 任职，继续从事深度学习的研究。

第二作者叫安德鲁·兹泽曼（Andrew Zisserman），是牛津大学计算机系的教授，也是计算机视觉领域的学术权威。他曾经三次被授予计算机视觉最高荣誉“马尔奖”（Marr Prize）。

这篇论文的主要贡献是什么呢？一个重要贡献就是研究如何把之前的模型（例如 AlexNet）加深层次，从而能够拥有更好的模型泛化能力，最终实现更小的分类错误率。

为了更好地理解这篇文章的贡献，我们来回忆一下 AlexNet 的架构。AlexNet 拥有 8 层神经网络，分别是 5 层卷积层和 3 层全联通层。AlexNet 之所以能够有效地进行训练，是因为这个模型利用了“线性整流函数”（ReLu）、数据增强（Data Augmentation）以及 Dropout 等手段。这些方法让 AlexNet 能够达到 8 层。

但是，学术界一直以来都认为，从理论上看，神经网络应该是层数越多，泛化能力越好。而且在理论上，一个 8 层的神经网络完全可以加到 18 层或者 80 层。但是在现实中，梯度消失和过拟合等情况让加深神经网络变得非常困难。在这篇论文中，VGG 网络就尝试从 AlexNet 出发，看能否加入更多的神经网络层数，来达到更好的模型效果。

那 VGG 是怎么做到加深神经网络层数的呢？总体来说，VGG 对卷积层的“过滤器”（Filter）进行了更改，达到了 19 层的网络结构。从结果上看，和 AlexNet 相比，VGG 在 ImageNet 上的错误率要降低差不多一半。可以说，这是第一个真正意义上达到了“深层”的网络结构。

VGG 在“过滤器”上着手更改，那么具体的改变细节究竟有哪些呢？简单来说，就是在卷积层中仅仅使用“3*3”的“接受域”（Receptive Field），使得每一层都非常小。我们可以从整个形象上来理解，认为这是一组非常“瘦”的网络架构。在卷积层之后，是三层全联通层以及最后一层进行分类任务的层。一个细节是，VGG 放弃了我们之前介绍的 AlexNet 中引入的一个叫“局部响应归一化”（Local Response Normalization）的技术，原因是这个技巧并没有真正带来模型效果的提升。

VGG 架构在训练上的一个要点是先从一个小的结构开始，我们可以理解为首先训练一个 AlexNet，然后利用训练的结果来初始化更深结构的网络。作者们发现采用这种“初始训练”（Pre-Training）的办法要比完全从随机状态初始化模型训练得更加稳定。

GoogleNet

我们要分享的第二篇论文题目是《更深层的卷积》（Going deeper with convolutions）[2]。因为这篇论文的作者基本都来自于谷歌，所以文章提出的模型有时候又被叫作 GoogleNet。这篇论文拥有 8 千多次的引用数。

GoogleNet 不仅和 VGG 一样在把架构做“深”上下文章，而且在模型的效率上比 AlexNet 更加优秀。作者们利用了比 AlexNet 少 12 倍的参数，在更深的架构上达到了更好的效果。

GoogleNet 创新的重点是在网络架构上。和 AlexNet 以及 VGG 都不同的是，GoogleNet 的作者们认为更加合适的网络架构不是简单地把相同的卷积层叠加起来，然后再把相同的全联通层叠加。如果我们需要更深的架构，必须从原理上对网络架构有一个不同的理解。作者们认为，网络结构必须走向“稀疏化”（Sparsity），才能够达到更深层次、更高效的目的。

那么，能否直接用稀疏结构来进行网络的架构呢？过去的经验表明，这条路并不那么直观。第一，直接利用稀疏的结构所表达的网络结构效果并不好，第二，这样做就无法利用现代的硬件，特别是 GPU 的加速功能。现代的 GPU 之所以能够高效地处理视觉以及其他一系列类似的问题，主要的原因就是快速的紧密矩阵运算。所以，直接使用稀疏结构有一定的挑战。

这篇论文的核心思想就是希望用一组“局部的”（Local）紧密结构来逼近理想中的最优的稀疏化结构，从而能够在计算上达到高效率，同时在理论思想上，能够利用稀疏化结构来达到更深的网络架构。

这种局部模块被作者们称作是Inception 模块。什么意思呢？传统上，卷积层都是直接叠加起来的。而这篇论文提出的 Inception 模块，其实就是让卷积层能够在水平方向上排列起来，然后整个模块再进行垂直方向的叠加。至于水平方向排列多少个卷积层，垂直方向排列多少 Inception 模块，都是采用经验试错的方式来进行实验的。

这篇论文最终提出的 GoogleNet 有 22 层网络结构。如果把所有的平行结构都算上的话，整个网络超过了 100 层。为了能够在这么深的结构上训练模型，作者们还采用了一种方法，那就是在中间的一些层次中插入分类器。相比之下，我们之前遇到过的网络结构都是在最后一层才有一个分类器。分类器层的特点就是最终的标签信息会在这里被利用，也就是说，分类的准确性，或者说是图片中物体究竟是什么，都会被这个标签信息所涵盖。在中间层加入分类器，其实就是希望标签信息能够正确引导中间层的目标，并且能够让梯度依然有效经过。

在实验中，GoogleNet 模型可以说是达到了非常好的效果。在 2014 年的 ImageNet 竞赛中，GoogleNet 和 VGG 分列比赛的第一名和第二名。两个模型之间的差距仅有不到 1 个百分点。

小结

今天我为你讲了两篇基于深度学习的经典论文，讨论了两个模型 VGG 和 GoogleNet。这两个模型在 AlexNet 的基础上做了不少的革新。

一起回顾一下要点：第一，VGG 模型对卷积层的“过滤器”进行了更改，实现了 19 层的网络结构，可以说是第一个真正意义上达到了“深层”的网络结构；第二，GoogleNet 模型的创新是在网络架构上，利用稀疏化结构达到了更深的网络架构。

最后，给你留一个思考题，总结和比较 VGG 和 GoogleNet 这两个模型，我们看到了深度模型研发的一个什么趋势？

欢迎你给我留言，我们一起讨论。

参考文献

K. Simonyan, A. Zisserman. Very Deep Convolutional Networks for Large-Scale Image Recognition. International Conference on Learning Representations, 2015.

C. Szegedy et al. Going deeper with convolutions. IEEE Conference on Computer Vision and Pattern Recognition (CVPR), Boston, MA, pp. 1-9, 2015.

148 | 计算机视觉领域的深度学习模型（三）：ResNet

今天我们继续来讨论经典的深度学习模型在计算机视觉领域应用。今天和你分享的论文是《用于图像识别的深度残差学习》（Deep Residual Learning for Image Recognition）[1]。这篇论文获得了 CVPR 2016 的最佳论文，在发表之后的两年间里获得了超过 1 万 2 千次的论文引用。

论文的主要贡献

我们前面介绍 VGG 和 GoogleNet 的时候就已经提到过，在深度学习模型的前进道路上，一个重要的研究课题就是神经网络结构究竟能够搭建多深。

这个课题要从两个方面来看：第一个是现实层面，那就是如何构建更深的网络，如何能够训练更深的网络，以及如何才能展示出更深网络的更好性能；第二个是理论层面，那就是如何真正把网络深度，或者说是层次度，以及网络的宽度和模型整体的泛化性能直接联系起来。

在很长的一段时间里，研究人员对神经网络结构有一个大胆的预测，那就是更深的网络架构能够带来更好的泛化能力。但是要想真正实现这样的结果其实并不容易，我们都会遇到哪些挑战呢？

一个长期的挑战就是模型训练时的梯度“爆炸”（Exploding）或者“消失”（Vanishing）。为了解决这个问题，在深度学习研究刚刚开始的一段时间，就如雨后春笋般爆发出了很多技术手段，比如“线性整流函数”（ReLu），“批量归一化”（Batch Normalization），“预先训练”（Pre-Training）等等。

另外一个挑战是在 VGG 和 GoogleNet 的创新之后，大家慢慢发现单纯加入更多的网络层次其实并不能带来性能的提升。研究人员有这样一个发现：当一个模型加入到 50 多层后，模型的性能不但没有提升，反而还有下降，也就是模型的准确度变差了。这样看，好像模型的性能到了一个“瓶颈”。那是不是说深度模型的深度其实是有一个限度的呢？

我们从 GoogleNet 的思路可以看出，网络结构是可以加深的，比如对网络结构的局部进行创新。而这篇论文，就是追随 GoogleNet 的方法，在网络结构上提出了一个新的结构，叫“残差网络”（Residual Network），简称为 ResNet，从而能够把模型的规模从几层、十几层或者几十层一直推到了上百层的结构。这就是这篇文章的最大贡献。

从模型在实际数据集中的表现效果来看，ResNet 的错误率只有 VGG 和 GoogleNet 的一半，模型的泛化能力随着层数的增多而逐渐增加。这其实是一件非常值得深度学习学者振奋的事情，因为它意味着深度学习解决了一个重要问题，突破了一个瓶颈。

论文的核心方法

那这篇论文的核心思想是怎样的呢？我们一起来看。

我们先假设有一个隐含的基于输入 x 的函数 H。这个函数可以根据 x 来进行复杂的变换，比如多层的神经网络。然而，在实际中，我们并不知道这个 H 到底是什么样的。那么，传统的解决方式就是我们需要一个函数 F 去逼近 H。

而这篇文章提出的“残差学习”的方式，就是不用 F 去逼近 H，而是去逼近 H(x) 减去 x 的差值。在机器学习中，我们就把这个差值叫作“残差”，也就是表明目标函数和输入之间的差距。当然，我们依然无法知道函数 H，在实际中，我们是用 F 去进行残差逼近。

F(x)=H(x)-x，当我们把 x 移动到 F 的一边，这个时候就得到了残差学习的最终形式，也就是 F(x)+x 去逼近未知的 H。

我们引用论文中的插图来看这个问题，就会更加直观。（图片来源：https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/He_Deep_Residual_Learning_CVPR_2016_paper.pdf ）

在这个公式里，外面的这个 x 往往也被称作是“捷径”（Shortcuts）。什么意思呢？有学者发现，在一个深度神经网络结构中，有一些连接或者说层与层之间的关联其实是不必要的。我们关注的是，什么样的输入就应当映射到什么样的输出，也就是所谓的“等值映射”（Identity Mapping）。

遗憾的是，如果不对网络结构进行改进，模型无法学习到这些结构。那么，构建一个从输入到输出的捷径，也就是说，从 x 可以直接到 H（或者叫 y），而不用经过 F(x)，在必要的时候可以强迫 F(x) 变 0。也就是说，捷径或者是残差这样的网络架构，在理论上可以帮助整个网络变得更加有效率，我们希望算法能够找到哪些部分是可以被忽略掉的，哪些部分需要保留下来。

在真实的网络架构中，作者们选择了在每两层卷积网络层之间就加入一个捷径，然后叠加了 34 层这样的架构。从效果上看，在 34 层的时候 ResNet 的确依然能够降低训练错误率。于是，作者们进一步尝试了 50 多层，再到 110 层，一直到 1202 层的网络。最终发现，在 110 层的时候能够达到最优的结果。而对于这样的网络，所有的参数达到了 170 万个。

为了训练 ResNet，作者们依然使用了批量归一化以及一系列初始化的技巧。值得一提的是，到了这个阶段之后，作者们就放弃了 Dropout，不再使用了。

小结

今天我为你讲了一篇经典论文，提出了 ResNet，残差网络这个概念，是继 VGG 和 GoogleNet 之后，一个能够大幅度提升网络层次的深度学习模型。

一起来回顾下要点：第一，我们总结归纳了加深网络层次的思路以及遇到的挑战；第二，我们讲了讲残差网络的概念和这样做背后的思考以及在实际应用中的一些方法。

最后，给你留一个思考题，从 AlexNet 到 VGG、GoogleNet，再到 ResNet，除了网络深度加深以外，模型进化过程中是否还有一些地方也让你有所感触？

欢迎你给我留言，和我一起讨论。

参考文献

Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun. Deep Residual Learning for Image Recognition. The IEEE Conference on Computer Vision and Pattern Recognition (CVPR), pp. 770-778, 2016.

149 | 计算机视觉高级话题（一）：图像物体识别和分割

从今天开始，我们讨论几个相对比较高级的计算机视觉话题。这些话题都不是简单的分类或者回归任务，而是需要在一些现有的模型上进行改进。

我们聊的第一个话题就是图像中的物体识别（Object Recognition）和分割（Segmentation）。我们前面介绍过物体识别和分割。通俗地讲，就是给定一个输入的图像，我们希望模型可以分析这个图像里究竟有哪些物体，并能够定位这些物体在整个图像中的位置，对于图像中的每一个像素，能够分析其属于哪一个物体。

这一类型任务的目的是更加仔细地理解图像中的物体，包括图片分类、对图像里面的物体位置进行分析，以及在像素级别进行分割，这无疑是一个充满挑战的任务。

R-CNN

深度模型，特别是卷积神经网络（CNN）在 AlexNet 中的成功应用，很大程度上开启了神经网络在图像分类问题上的应用。这之后，不少学者就开始考虑把这样的思想利用到物体识别上。第一个比较成功的早期工作来自加州大学伯克利分校 [1]，这就是我们接下来要介绍的R-CNN 模型。

首先，R-CNN 的输入是一个图片，输出是一个“选定框”（Bounding Box）和对应的标签。R-CNN 采用了一种直观的方法来生成选定框：尽可能多地生成选定框，然后来看究竟哪一个选定框对应了一个物体。

具体来说，针对图像，R-CNN 先用不同大小的选定框来扫描，并且尝试把临近的具有相似色块、类型、密度的像素都划归到一起去。然后，再利用一个 AlexNet 的变形来对这些待定（Proposal）的选定框进行特征提取（Feature Extraction）。在模型的最后一层，R-CNN 加入了一个支持向量机（Support Vector Machine）来判断待选定框是否是某个物体。判断好了选定框以后，R-CNN 再运行一个线性回归来对选定框的坐标进行微调。

R-CNN 虽然证明了在物体识别这样的任务中，CNN 的确可以超越传统的模型，但整个模型由多个模块组成，相对比较繁琐。

Fast R-CNN

意识到了 R-CNN 的问题以后，一些学者开始考虑如何在这个模型上进行改进。第一个重大改进来自于 R-CNN 原文中的第一作者罗斯·吉尔什克（Ross Girshick）。吉尔什克这个时候已经来到了微软研究院，他把自己改进的模型叫作Fast R-CNN[2]。

Fast R-CNN 的一个重要特点就是观察到我们刚才介绍 R-CNN 中的第二步骤，也就是每一个待定的选定框都需要进行特征提取。这里的特征提取其实就是一个神经网络，往往非常消耗资源。而且很多待定的选定框有很多重叠的部分，可以想象就会有很多神经网络的计算是重复多余的。

那么，有没有什么办法我们可以针对一个图片仅仅运行一次神经网络，但是又可以针对不同的待选定框共享呢？这其实就是 Fast R-CNN 的核心思想。Fast R-CNN 的另外一个特点就是尝试用一个神经网络架构去替代 R-CNN 中间的四个模块。这样两个改进的结果是怎样的呢？Fast R-CNN 和 R-CNN 相比在效果上差不多，但是训练时间快了 9 倍以上。

Faster R-CNN 和 Mask R-CNN

在 Fast R-CNN 的技术上，一群当时在微软研究院的学者们把对 R-CNN 的加速往前推进了一步，这就是模型Faster R-CNN[3]。Faster R-CNN 是在如何提出待定的选定框上做了进一步的改进，使得这部分不依赖一个单独的步骤，而依赖我们已经训练的 CNN 网络。这在速度上比 Fast R-CNN 又快了不少。

在 Faster R-CNN 的基础上，Mask R-CNN不仅能够做到对图像中的物体进行判别，而且还能够做到像素级的抽取 [4]。前面我们在讲 2017 年 ICCV 最佳研究论文的时候，介绍过这部分内容。这里我带你做一个简单的回顾。

Faster R-CNN 分为两个阶段。第一个阶段是“区域提交网络”（Region Proposal Network），目的是从图像中提出可能存在候选矩形框。第二个阶段，从这些候选框中使用“RoIPool”这个技术来提取特征从而进行标签分类和矩形框位置定位这两个任务。这两个阶段的一些特征可以共享。

区域提交网络的大体流程是什么样的？大体来说，最原始的输入图像经过经典的卷积层变换之后形成了一个图像特征层。在这个新的图像特征层上，模型使用了一个移动的小窗口来对区域进行建模。

这个移动小窗口有这么三个任务需要考虑。首先移动小窗口所覆盖的特征经过一个变换达到一个中间层，然后经过这个中间层，直接串联到两个任务，也就是物体的分类和位置的定位。其次，移动的小窗口用于提出一个候选区域，也就是矩形框。而这个矩形框也参与刚才所说的定位信息的预测。当区域提交网络“框”出了物体的大致区域和类别之后，模型再使用一个“物体检测”的网络来对物体进行最终的检测。

Mask R-CNN 的第一部分完全使用 Faster R-CNN 所提出的区域提交网络，模型对第二部分进行了更改。那 Mask R-CNN 的第二部分都输出什么呢？不仅仅输出区域的类别和框的相对位置，同时还输出具体的像素分割。和很多类似工作的区别是，像素分割、类别判断、位置预测是三个独立的任务，并没有互相的依赖，这是作者们认为 Mask R-CNN 能够成功的一个重要的关键。

小结

今天我为你讲了计算机视觉高级话题之一的物体识别和分割技术。我们总结了从最早的 R-CNN 到加速的 Fast R-CNN 和更快的 Faster R-CNN，以及最后能够进行像素分割的 Mask R-CNN。

最后，给你留一个思考题，从这一系列模型的发展中，你能总结出一些心得体会吗？

欢迎你给我留言，和我一起讨论。

参考文献

Ross Girshick, Jeff Donahue, Trevor Darrell, Jitendra Malik. Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation. The IEEE Conference on Computer Vision and Pattern Recognition (CVPR), pp. 580-587, 2014.

Ross Girshick. Fast R-CNN. The IEEE International Conference on Computer Vision (ICCV), pp. 1440-1448, 2015.

Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks. Conference on Neural Information Processing Systems (NIPS), 2015.

K. He, G. Gkioxari, P. Dollar and R. Girshick. Mask R-CNN. In IEEE Transactions on Pattern Analysis and Machine Intelligence.

150 | 计算机视觉高级话题（二）：视觉问答

今天，我们继续分享计算机视觉领域的高级话题，聊一聊“视觉问答”（Visual Question Answering）这个话题。

我们在前面曾经提到过“问答系统”（Question Answering），可以说这是人工智能领域最核心的问题之一。传统的问答系统主要是针对文字而言的，问题和答案都是以文字的形式表达的。当然，问答所针对的内容，有可能来自一个外在的知识库，例如维基百科。

我们今天要讨论的视觉问答，特别是“自由形式”（Free-Form）或者“开放形式”（Open Ended）的视觉问答，主要指的是根据一个图片进行自由的基于自然语言的问答。例如，我们可以问一个图片中是否存在一只猫；或者可以问图片里的天气是不是阴天等等。

视觉问答的挑战

那么，为什么视觉问答会在最近几年里得到很多学者的关注呢？我们有必要先来分析一下视觉问答所面临的挑战。

首先，视觉问答需要对图片中的细节加以理解。例如，我们问图片中的匹萨用了哪种奶酪，那就代表着我们的系统必须能够识别匹萨中的奶酪，而这往往意味着非常微观的一些细节的物体的识别。

其次，视觉问答还需要我们对图片的上下文进行理解。例如，我们可以问图片中有几辆自行车。这个问题其实不仅需要我们对图片中的自行车进行理解，还需要能够计数，这显然是一种更加复杂的理解任务。

除此以外，我们还需要对图片中的物体进行推理。例如，我们问图片中的匹萨是不是素食匹萨。那这个问题就需要对匹萨的种类进行分类，这是一个最基本的推理。

当然，视觉问答的挑战还远远不止这些。但从这些例子我们已经可以看出，视觉问题是一个综合性的人工智能问题。

不少视觉问答的数据集除了纯粹的图片作为输入以外，还有一个图片的“标题”（Caption）。这个图片标题往往提供了不少的信息，也算是帮助研究者在一定程度上降低了任务的难度。

如果需要对视觉问答的总体情况有一个更加深入的理解，推荐你阅读我在文末列出的参考文献 [1]。

视觉问答建模

接下来我们来聊一个视觉问答的基础模型 [1]。这个模型需要对问题、图片以及图片标题分别进行建模，从而能够进行问答。

针对问题，模型利用所有问题中的重要词进行了“词包”（Bag of Words）的表达，并且得到了一个 1030 维度的输入表征。类似地，针对图片标题，模型也进行了词包表达，得到了一个 1000 维度最高频词的表征。最后，作者们利用了 VGG 网络来提取图片的特征，得到了一个 4096 维度的图像表征。一种更加简单的方法则是先利用神经网络的隐含层，针对每一种特征单独训练，然后把第一层中间层给串联起来。串联起来之后，这就是所有特征的一种联合的表达了。那么我们可以再经过一层隐含层学习到各个表征之间的相互关系。

文章中还讨论了另外一种模型，那就是利用 LSTM 来把问题和图像结合到一起，来最后对回答进行预测。

在这样的模型架构下，回答的准确度大概在 55% 左右。如何来理解这个准确度呢？在同样的一个数据集中，如果针对所有的问题回答都是“是”（Yes）所达到的准确度大概是 20% 多。

在最初的模型被开发出来以后的几年时间里，针对视觉问答的各类模型如雨后春笋般爆发式地增长。其中一个大类的模型利用了“关注”（Attention）机制。在深度模型中，关注机制是一种相对来说复杂一些的“加权”模式。也就是说，我们希望对某一些神经元或者是隐含变量更加关注一些。这个机制在视觉问答中的一种应用就是，针对不同的问题，我们希望让模型学习到图片的哪一部分来负责回答。

在一篇论文中 [2]，作者们提出了一种更加高级的“关注”机制，那就是“层次同关注”（Hierarchical Co-Attention）。

这个机制是什么样的呢？针对某一个回答，我们不仅要学习到究竟需要模型“看到”图片的某一个局部，这也就是我们刚才说到的“加权”，还需要针对问题，也就是文字，进行“加权”。这里的一个观察是，有时候一个问题中的核心其实就是几个关键词，这些关键词直接影响了回答。这就是“同关注”这一概念。

文章中还提出了另外一个概念，那就是“层次关注”，是指问题的文字，在单词、短语以及整个提问三个层次来进行建模。可以说，这种方法在语义的局部以及整体上更能找到问题的核心所在。

最后，需要提及一点，最近的一些研究又把视觉问答和“推理”（Reasoning），特别是“神经编程”（Neural Programming）联系起来，让回答问题变成自动生成程序的某种特殊形式 [3]。

小结

今天我为你讲了计算机视觉高级话题之一的视觉问答的概念。

一起来回顾下要点：第一，我们讲了视觉问答所面临的三大主要挑战；第二，我们讨论了对视觉问答进行建模的一些基本思路。

最后，给你留一个思考题，你觉得当前视觉问答的主要瓶颈是什么？

欢迎你给我留言，和我一起讨论。

参考文献

Stanislaw Antol, Aishwarya Agrawal, Jiasen Lu, Margaret Mitchell, Dhruv Batra, C. Lawrence Zitnick, Devi Parikh. VQA: Visual Question Answering. The IEEE International Conference on Computer Vision (ICCV), pp. 2425-2433, 2015.

Jiasen Lu, Jianwei Yang, Dhruv Batra, and Devi Parikh. Hierarchical question-image co-attention for visual question answering. Proceedings of the 30th International Conference on Neural Information Processing Systems (NIPS’16), Daniel D. Lee, Ulrike von Luxburg, Roman Garnett, Masashi Sugiyama, and Isabelle Guyon (Eds.). Curran Associates Inc., USA, 289-297, 2016.

Justin Johnson, Bharath Hariharan, Laurens van der Maaten, Judy Hoffman, Li Fei-Fei, C. Lawrence Zitnick, Ross B. Girshick. Inferring and Executing Programs for Visual Reasoning. ICCV 2017: 3008-3017.

151 | 计算机视觉高级话题（三）：产生式模型

今天，我们来讨论计算机视觉高级话题中的“产生式模型”（Generative Model）。

我们前面讲到的计算机视觉问题，绝大多数场景都是去学习一个“判别式模型”（Discriminative Model），也就是我们希望构建机器学习模型来完成这样的任务，比如判断某一件事情或一个图片的特征，或者识别图片里面的物体等，这些任务都不需要回答“数据是如何产生的”这一问题。简言之，针对判断类型的任务，不管是回归还是分类，我们都不需要对数据直接进行建模。

然而，判别式模型并不能解决所有的机器学习任务。有一些任务的核心其实需要我们针对数据进行有效的建模，这就催生了“产生式模型”。

产生式模型的一些基础概念

那么，针对数据建模的产生式模型都有哪些基本思想呢？

首先，产生式模型的一个核心思想就是模型要能够产生数据。也就是说，产生式模型不仅需要针对已有的数据建模，还需要有能力产生新的数据。产生出的这些新数据当然需要和已有的数据有一定的相似度。换句话说，新产生的数据要能够“以假乱真”。

那么，有哪些能够产生数据的工具呢？

在比较简单的模型中，概率分布其实就起了产生数据的作用。例如，在离散概率分布的世界里，如果我们知道了一个伯努利分布的参数，也就是某一个事件发生的概率，那么，从理论上来说，我们就可以模拟出这个事件的发生。

比如，我们利用伯努利分布来对掷硬币产生的正反面建模。一旦我们知道了这个分布的概率是 0.5（或者说是 50%），那么，我们从这个分布中产生的数据就可以形成和掷一枚没有偏差的硬币一样的效果。

同样的道理，如果我们利用正态（或者叫高斯）分布来针对一个连续变量建模，例如某一个地区的温度，那么一旦我们知道了这个正态分布的均值和方差这两个参数，我们就可以产生所有温度的可能值。假设温度完全服从这个正态分布，那么就可以认为这些可能值就是以后这个地区可能出现温度的真实情况。

当然，我们可以看到，简单概率分布无法对真实世界的绝大多数场景进行建模。这也不断激发研究人员来开发各种更加复杂的概率模型来对真实世界进行描述。

在过去十多年的时间里，一类机器学习思想逐渐成为主流的产生式模型，那就是概率图模型。顾名思义，概率图模型就是概率论和图论的巧妙结合，以此来对复杂的联合概率分布来进行描述。

我们今天就不针对概率图模型展开讨论了。你需要了解概率图模型的一个重要特点，那就是能够利用一个“显示的”表达式来写出这个联合概率分布，不管这个式子本身有多复杂。也就是说，概率图模型期望能够通过构建复杂的、显示的表达式来完成对真实场景的模拟。

产生式对抗网络

显然，构造一个概率图模型是一个极具挑战的任务，面对复杂的情况，我们都需要写出一个显示的表达式，或者是针对这种场景的数据来进行模拟。例如，图像和音频信息就是比较复杂的数据，很难用一个公式（不管这个公式多么复杂）来表达。

那究竟该怎么办？针对这种复杂的数据，研究人员提出了一种新的产生式模型，这就是“产生式对抗网络”（Generative Adversarial Nets），简称为 GAN[1]。在过去的几年里，这种模型因其概念简单而备受青睐。

GAN 的基本思想是怎样的呢？

首先，我们有一个数据的“产生器”（Generator）。这个产生器的作用是从一个我们可以控制的模型中产生数据。最终我们的期望是这个产生器能够产生和真实数据一样的数据。

其次，我们有一个数据的“判别器”（Discriminator），其目的是区分数据究竟是真实的数据还是产生器产生的数据。

GAN 的模型训练是一个迭代的过程。最开始，产生器肯定无法真正产生有效的数据，这个时候，判别器能够很轻松地对产生的数据进行一个评判：哪些是真实数据，哪些不是。但是产生器会根据这个判别结果，逐渐调整自己产生数据的过程，慢慢地让自己产生的数据趋于真实。一直到最后，判别器无法分别出数据的真伪。

GAN 其实代表了这么一类模型，那就是不再对数据的产生过程进行显式建模，因为这个太过于困难，而是想办法定义一个流程，通过这个流程产生数据，从而能够直接去对真实数据进行模拟。

GAN 和深度学习的结合点在哪里呢？就是产生器和判别器可以分别是多层的神经网络，甚至可以是更加复杂的深度学习模型。这样，GAN 的学习过程其实也就是两个不同的，各司其职的深度学习模型参数学习的过程。

在近几年的发展中，基于 GAN 的各类模型层出不穷，而且能够产生的图片质量也越来越高，甚至有的真的达到了能以假乱真的程度。

就在很多人都对这类模型充满了信心的时候，一些理论界的研究再次让大家对产生式模型，特别是 GAN 的前景萌生了怀疑。GAN 能够彻底解决产生式模型的所有问题吗？

最新的论文 [2] 论证了 GAN 在一些限定情况下并不是对数据的整个分布进行建模。一个通俗的例子是，如果我们训练了一个可以产生猫的图片的 GAN，那么在理想状态下，这个模型是不是应该可以产生各式各样不同种类的猫的图片呢？答案是，经过某种训练的 GAN 并不能做到这一点。相反，GAN 只能产生有限的猫的图片。这肯定是不太理想的一种情况。

那么，研究者究竟是应该修改 GAN 来克服这个问题，还是能够找到更好的方法来产生数据，目前这还是一个未知答案的研究课题。

小结

今天我为你讲了计算机视觉高级话题之一的产生式模型。

一起来回顾下要点：第一，我们来讲了为什么需要产生式模型和简单的基于概率分布的数据产生器；第二，我们讨论了基于 GAN 的产生模型和最新研究的 GAN 的一些局限。

最后，给你留一个思考题，有了能够以假乱真的产生式模型，我们可以有哪些应用呢？

欢迎你给我留言，我们一起讨论。

参考文献

Ian J. Goodfellow, Jean Pouget-Abadie, Mehdi Mirza, Bing Xu, David Warde-Farley, Sherjil Ozair, Aaron Courville, and Yoshua Bengio. Generative adversarial nets. Proceedings of the 27th International Conference on Neural Information Processing Systems - Volume 2 (NIPS’14), Z. Ghahramani, M. Welling, C. Cortes, N. D. Lawrence, and K. Q. Weinberger (Eds.), Vol. 2. MIT Press, Cambridge, MA, USA, 2672-2680, 2014.

Sanjeev Arora and Yi Zhang. Do GANs learn the distribution? Some theory and empirics. ICLR. 2018

复盘 5 | 计算机视觉核心技术模块

今天我们来对计算机视觉核心技术模块做一个复盘。在这个模块里，我们一起学习了 12 期内容，讨论了四个话题，这些话题主要围绕计算机视觉的基础知识和深度学习技术在这个领域的应用。

之所以这么安排，是因为没有深度学习技术，就不会有现在计算机视觉的发展。我们站得稍微高一点就可以看到，正是因为深度学习技术在计算机视觉中的成功应用，才有了近几年的人工智能浪潮。

提示：点击知识卡跳转到你最想看的那篇文章，温故而知新。

图像技术基础

基于深度学习的计算机视觉技术

计算机视觉领域的深度学习模型

计算机视觉高级话题

积跬步以至千里

最后，恭喜你学完了这个模块中的内容。今日记一事，明日悟一理，积久而成学。每一个收获都是一个不小的成就。

在计算机视觉领域你有怎样的经验、心得或者疑惑，都欢迎你留言和我一起交流讨论。

001 | 如何组建一个数据科学团队？

数据科学团队眼下已经成了很多数据驱动型公司的标准配置，数据科学家也成了最“性感”的职业。不少公司都在想办法建立或扩展自己的数据科学团队，而究竟需要什么样的数据科学团队，成了很多公司在发展过程中都会遇到的棘手问题。

在目前的职业市场上，有各种背景、各种经历的人都自称为“数据科学家”。那么，如何从这个蓬勃发展，却鱼龙混杂的人才市场中找到合适的团队成员呢？今天我就来和你聊一聊作为一个工程团队的负责人，或者一家公司的 CEO，该如何招聘并打造自己的数据科学团队。

数据分析还是算法模型

目前人才市场上大致有两类数据科学家，一类偏数据分析，一类偏算法模型。因为这两类人才的区别，不同公司乃至同一公司的不同数据科学团队就有了差别。在招聘之前你必须明白，这两类数据科学家的特质很难在同一个人身上体现出来。也就是说，你必须根据当前公司和团队的需求，来决定目前应该招聘更偏重数据分析，还是偏重算法模型的数据科学家。

先来说说偏重数据分析的数据科学家，他们可能来自于统计、数据分析等学科，也可能来自于很多需要数据分析的自然科学学科，比如实验物理、生物、计算化学等。作为团队的负责人，你需要重点考察候选人是否系统学习过数据分析的相关课程，是否具备数据分析的基本能力。下面我从理论知识和实际应用操作两个角度来和你介绍下考察要点。

从理论知识的角度来说，你需要考察候选人：

是否对概率统计有基本的认知；

是否能够使用基本的假设检验对数据进行分析；

是否对高级的假设检验方法，比如非参数假设检验（Nonparametric Hypothesis Testing）有所了解，能否快速学习和查询到相关的方法；

是否了解 A/B 实验，并基本了解实验设计；

是否了解高级的因果推论（Causal Inference）工具，并能够使用简单的因果推论工具对实验数据进行分析；

是否了解如何对时间序列下的数据进行合理分析。

当然这些技能只是作为数据分析候选人的一些基本素质，具体还需要和领域知识相结合。

从实际应用操作的角度来说，你还需要考察候选人：

是否熟悉一些基本的数据分析工具语言，比如 R 或者 Python；

是否对 SQL 有所了解；

是否对 Hadoop 等大数据处理工具有所涉猎；

是否了解一些基本的计算机算法。

同样的，这些也是基础素质，还需要和具体的职位相结合，你才能考察候选人的综合情况。

接着我们来看偏重算法模型的数据科学家，他们主要来自于计算机科学、计算机工程、电气工程等工程方向。你需要重点考虑他们是否有基本的算法建模能力；是否系统地学习过算法、机器学习、统计分析等课程；是否在实际工作中，有系统的相关开发经历；对数据的认识，特别是对数据驱动型产品是否有基本的了解。下面我依次从理论知识和实际应用操作两个角度来谈谈具体的考察内容。

从理论知识的角度来说，你需要考察候选人：

是否对概率统计有基本的认识；

是否对传统的机器学习算法模型有所了解，包括分类、回归、聚类等；

是否对概率图模型有所了解；

是否对深度学习模型有所了解；

是否对优化算法有所了解；

是否有基本的计算机算法、数据结构、数据库、操作系统的知识；

是否对某一些特定领域内的模型有所了解，包括但不限于信息检索、推荐系统、计算广告系统、计算机视觉、文本挖掘和分析、自然语言处理。

这些，特别是第 1 项到第 6 项是候选人的基本素质。第 7 项是针对某一个具体的职位所需要的背景知识。

从实际应用操作角度来说，你需要考察候选人：

是否可以使用某种计算机语言（比如 Python、C++、Java、Scala）来实现一些机器学习算法；

是否可以使用和扩展现有的机器学习工具（比如 Scikit Learn、XGBoost、Vowpal Wabbit 等）；

是否可以使用以 Hadoop 为基础的大数据工具（比如 Hive、Pig、Spark 等）来构建生产环境；

是否对深度学习框架（比如 TensorFlow、Caffe、MxNet、Torch 等）有所了解。

这里列出的也是一些基础素质，还需要和具体的职位相结合，来考察候选人的综合情况。

总体说来，如果你希望招聘的职位更偏重于理解现有数据，通过数据来对公司或团队的下一步决策有所帮助，那么这个职位就更偏向于数据分析。如果你希望通过算法和模型来改进你的产品，无疑你需要招聘一个算法模型方向的数据科学家。

小团队、大团队

不同的团队往往需要不同的数据科学家配置。即便是同一团队，在不同时期其实也需要不太一样的设置。我这里讲的是一些基本的团队设置理念，具体的团队还需要根据不同的领域有所调整。

总体说来，在团队比较小的时候，甚至是初创公司的团队，你需要具有“通才”性质的数据科学家，而在团队扩大、公司稳定以后，你需要各类“专才”性质的数据科学家。

团队比较小的时候，我们可能只需要招聘一两位数据科学家。这个时候的数据科学家必须同时承担数据分析和算法建模两个角色。有些情况下，这时候的数据科学家其实更偏向于“数据工程师”（Data Engineer）的角色，那就是和其他工程师一起搭建公司的数据平台，对数据的引入、整合、清理提供支持。

早期时候，因为公司内部基础设施的限制，数据科学家往往需要花费大部分时间在数据平台和通路的构建上。这时候，其实很难形成有效的数据分析和算法建模工作。从另外一个角度来说，在公司非常早期，也就是在数据平台还没有一个基本雏形的时候，招聘和建立数据科学团队是不现实的。当有了基础的数据平台时，和数据有关的工作一般就是计算一些简单的产品运行指标（Metrics）然后在仪表盘（Dashboard）里展现出来。能够达到这一阶段后，一个团队或者公司才具备了建立数据科学团队的最基本条件。

小团队所需要的“通才”数据科学家有两个内涵。第一，在初期，数据分析和算法建模都同样重要。甚至在有些情况下，数据分析有着更加急迫的需求（因为需要人为地对产品迭代进行决策）。这个时候，以数据分析为主导的数据科学家要能够对现在的产品需求有很强的理解，能和产品经理、其他工程师一起快速分析产品的问题，为产品迭代的决策提供数据支持。

第二，在初期，绝大多数产品所需要的算法和模型都并不复杂，甚至仅仅需要数据科学家部署最基本、最简单的算法。因此这个时候，即便有算法建模需求，也只需要数据科学家有比较广的知识就行，能够快速识别和实现最基本的模型。在这个阶段，对某一个方向有着深厚背景的“专才”往往并不能体现出优势。

当业务逐渐稳定并且扩展以后，团队也逐渐扩张，小团队的“通才”模式就慢慢不太适应组织的发展了。这个时候，我们需要针对目前的产品和业务招聘“专才”数据科学家。一般来说，我们需要有一部分数据科学家负责数据分析方面，需要另外一部分数据科学家负责算法和模型开发方面。这时候单个人往往已经不能胜任两方面的任务了。

从数据分析的方面讲，“专才”的模式需要我们更细地区分开两类数据科学家，一类是负责设计 A/B 实验、设计和分析产品指标的专项数据科学家，另一类是对各个产品领域进行长时间分析数据内涵（Insights）的数据科学家。

从算法建模的方面讲，“专才”模式往往就是针对不同的业务流程线，需要招聘单独的人才，比如针对图像处理的人才、针对搜索系统的人才、针对推荐系统的人才。这个时候，能否招聘到称职的领域专家，成了团队和产品能否持续良性发展下去的根本因素。这个阶段招聘需要注意的问题是，不要寄希望通过招聘“通才”来发现“专才”，因为从“通才”到“专才”的训练是需要很长时间的，这里面有短时间内不可逾越的鸿沟和难以积累起来的经验。所以，当公司和团队发展到一定规模的时候，分清形式进行“专才”招聘是必须要进行的任务目标。

小结

今天我为你简单分析了如果要组建一个数据科学团队，你需要招聘什么样的数据科学家。一起回顾下内容要点：第一，偏数据分析和偏算法建模的两类数据科学家在技能背景方面有很大区别；第二，“通才”和“专才”在公司或团队的不同阶段承担着不同的角色。

最后，给你留一个思考题：如何在筛选候选人简历的时候，就能够比较准确地了解这位候选人的经历和能力更偏向数据分析还是偏向算法呢？另外，如果你想成为数据科学团队的一员，不妨对照今天我们聊的考察要点自测一下，看看接下来还需要在哪些方面继续努力，做好积累呢？

期待你给我留言，和我一起讨论！

003 | 数据科学家基础能力之概率统计

学习人工智能的工程师，甚至是在人工智能相关领域从业的数据科学家，往往都不重视概率统计知识的学习和培养。有人认为概率统计知识已经过时了，现在是拥抱复杂的机器学习模型的时候了。实际上，概率统计知识和数据科学家的日常工作，以及一个人工智能项目的正常运作都密切相关，概率统计知识正在人工智能中发挥着越来越重要的作用。

和机器学习一样，概率统计各个领域的知识以及研究成果浩如烟海。今天我就和你聊一聊，如何从这么繁多的信息中，掌握能够立即应用到实际问题中的概率统计知识，以及如何快速入手一些核心知识，并能触类旁通学习到更多的内容。

使用概率的语言

概率统计中的“概率”，对于学习和掌握人工智能的诸多方面都有着举足轻重的作用。这里面最重要的，恐怕要数概率论中各种分布的定义。初学者往往会觉得这部分内容过于枯燥乏味，实际上，概率论中的各种分布就像是一门语言的基本单词，掌握了这些基本的“建模语言”单词，才能在机器学习的各个领域游刃有余。

值得注意的是，目前火热的深度学习模型，以及在之前一段时间占领机器学习统治地位的概率图模型（Probabilistic Graphical Models），都依赖于概率分布作为这些框架的基本建模语言。因此，能够真正掌握这些分布就显得尤为重要。

对于分布的掌握其实可以很容易。只要对少量几个分布有一定的认识后，就能够很容易地扩展开来。首先，当你遇到一个实际场景的时候，你要问自己的第一个问题是，这个场景是针对离散结果建模还是针对连续数值建模？这是一个最重要的分支决策，让你选择正确的建模工具。

当面对离散结果的时候，最需要掌握的分布其实就是三个：

伯努利分布

多项分布

泊松分布

这三种分布是其他离散分布的重要基础。对于这三种分布，记忆其实也相对容易。比如，任何时候，如果你的场景是一个二元问题（例如用户是否点击，是否购买），伯努利分布都是最直接的选择。当你遇到的场景需要有多于两种选择的时候，那自然就用多项分布。另外，文本建模常常可以看做这样一个问题，那就是在特定语境下，如何从上千甚至上万的可能性中选择出最恰当的字词，因此多项分布也广泛应用在文本建模领域。泊松分布则常常用在对可数的整数进行建模，比如一些物品的总个数。

了解应用场景和他们所对应的分布之间的联系，是掌握这些“语言”的重要环节。当你面临的问题是连续数值的时候，绝大多数情况下，你需要掌握和理解正态分布，有时候称为高斯分布。正态分布的重要性是再怎么强调都不为过的。任何你可以想到的场景，几乎都可以用正态分布来建模。由于中心极限定理的存在，在大规模数据的情况下，很多其他分布都可以用正态分布来近似或者模拟。因此，如果说学习概率知识中你只需要掌握一种分布的话，那无疑就是正态分布。

在理解概率分布的过程中，还需要逐渐建立起关于“随机数”和“参数”的概念。衡量一个分布是离散还是连续，指的是它产生的“随机数”是离散还是连续，和这个分布的“参数”没有关系。比如伯努利分布是一个离散分布，但是伯努利分布的参数则是一个介于 0 和 1 之间的实数。理解这一点常常是初学者的障碍。另外，建立起参数的概念以后，所有的分布就有了模型（也就是分布本身）和参数的估计过程两个方面。这对理解机器学习中模型和算法的分离有很直接的帮助。

当理解了这些概率最基础的语言以后，下面需要做的就是，了解贝叶斯统计中，怎么针对概率分布定义先验概率，又怎么推导后验概率。

了解贝叶斯统计不是说一定要做比较困难的贝叶斯估计，而是说，怎么利用先验概率去对复杂的现实情况进行建模。比如说，针对用户是否购买某一件商品而言，这个问题可以用一个伯努利分布来建模。假如我们又想描述男性和女性可能先天上就对这个商品有不同的偏好，这个时候，我们就可以在伯努利分布的参数上做文章。也就是说，我们可以认为男性和女性拥有不同的参数，然而这两个参数都来自一个共同的先验概率分布（也可以认为是全部人群的购买偏好）。那么这个时候，我们就建立起了一个具有先验的模型来描述数据。这个思维过程是需要初学者去琢磨和掌握的。

假设检验

如果说概率基础是一般学习人工智能技术工程师和数据科学家的薄弱环节，假设检验往往就是被彻底遗忘的角落。我接触过的很多统计背景毕业的研究生甚至博士生，都不能对假设检验完全理解吃透。实际上，假设检验是现实数据分析和数据产品得以演化的核心步骤。

对于一款数据产品，特别是已经上线的产品来说，能够持续地做线上 A/B 测试，通过 A/B 测试检测重要的产品指标，从而指导产品迭代，已经成为产品成败的关键因素。这里面，通过 A/B 测试衡量产品指标，或多或少就是做某种形式的假设检验。

你期望提高产品性能，那么如何理解假设检验，选取合适的工具，理解 P 值等一系列细节就至关重要，这些细节决定了你辛辛苦苦使用的复杂人工智能模型算法是否有实际作用。

首先，我们要熟悉假设检验的基本设定。比如，我们往往把现在的系统情况（比方说用户的点击率、购买率等）当做零假设，或者通常叫做 H0。然后把我们改进的系统情况或者算法产生的结果，叫做备择假设，或者叫做 H1。

接下来，一个重要的步骤就是检验目前的实验环境，看是否满足一些标准检验的假设环境，比如 T 检验、Z 检验等。这一步往往会困扰初学者甚至是有经验的数据科学家。一个非常粗略的窍门则是，因为中心极限定理的存在，Z 检验通常是一个可以缺省使用的检验，也就是说，在绝大多数情况下，如果我们拥有大量数据可供使用，一般会选择 Z 检验。当然，对于初学者而言，最常规的也是最需要的就是掌握 T 检验和 Z 检验，然后会灵活使用。

在选择了需要的检验以后，就要计算相应的统计量。然后根据相应的统计量以及我们选好的检验，就可以得到一系列的数值，比如 P 值。然后利用 P 值以及我们预先设定的一个范围值，比如经常设置的 0.95（或者说 95%），我们往往就可以确定，H1 是否在统计意义上和 H0 不同。如果 H1 代表着新算法、新模型，也就意味着新结果比老系统、老算法有可能要好。

需要你注意的是，这里说的是“有可能”，而不是“一定”、“确定”。从本质上来说，假设检验并不是金科玉律。假设检验本身就是一个统计推断的过程。我们在假设检验的流程中计算的，其实是统计量在 H0 假设下的分布中出现的可能性。可能性低，只能说，我们观测到的现象或者数值并不支持我们的 H0，但这个流程并没有去验证这些现象或者数值是不是更加支持 H1。

另外，即便“可能性”低，也并不代表绝对不出现。这也是初学者常常过度相信假设检验所带来的问题。比较正确的对待假设检验的态度，就是把这个流程提供的结果当做工具，与更加复杂的决策过程结合起来，从而对目前的系统、目前的产品有一个综合的分析。

值得注意的是，和假设检验有关联的一个概念“置信区间”往往也很容易被忽视。尽管初看没有太大作用，置信区间其实被广泛应用在推荐系统的“利用和探索”（Exploitation & Exploration）策略中。因此，明白置信区间的概念很有益处，对实际的计算有很大帮助。

因果推论

最后我想提一下因果推论（Causal Inference）。因果推论不是一般的统计教科书或者工程类学生接触到的统计教科书里的基本内容。然而最近几年，这个领域在机器学习界获得了越来越多的关注。对于学习机器学习前沿知识的朋友来说，了解因果推论十分必要。

同时，对于工程产品而言，并不是所有情况都能通过 A/B 测试来对一个希望测试的内容、模型、产品设计进行测试，并在一定时间内找到合理的结果。在很多情况下是不能进行测试的。因此，如何在不能进行测试的情况下，还能通过数据研究得出期望的结果，这就是因果推论的核心价值。基于此，越来越多的互联网公司开始关注这个技术。

对于多数人工智能工程师而言，因果推论所需要的场景其实无时无刻不陪伴着我们。一个常见的情况是，我们需要用数据来训练新的模型或者算法。这里面的数据采集自目前线上的系统，比如一个新闻推荐系统。然而，现在的线上系统是有一定偏差的，例如比较偏好推荐娱乐新闻。那么，这个偏差就会被记录到数据里，我们收集的数据就侧重于娱乐新闻。那么，要想在一个有偏差的数据中，依然能够对模型和算法进行无偏差的训练和评测，就可以运用因果推论为机器学习带来的一系列工具。

小结

今天我为你讲了掌握概率统计基础知识的一些核心思路。一起来回顾下要点：第一，学习概率分布的语言对于理解、甚至是创造新的机器学习模型和算法都有着重要作用。第二，假设检验是常常被人工智能工程师和数据科学家遗忘的知识。然而，它对我们做产品开发却至关重要。第三，因果推论是一个新兴的统计和机器学习结合的领域，希望你能有所了解。

最后，给你留一个思考题，我们之前说到假设检验约等于我们计算统计量在 H0 里发生的可能性，那么，为什么我们不直接计算在 H1 里发生的可能性呢？

欢迎你给我留言，和我一起讨论。

004 | 数据科学家基础能力之机器学习

想要成为合格的，或者更进一步成为优秀的人工智能工程师或数据科学家，机器学习的各种基础知识是必不可少的。然而，机器学习领域浩如烟海，各类教材和入门课程层出不穷。特别是机器学习基础需要不少的数学知识，这对于想进入这一领域的工程师而言，无疑是一个比较高的门槛。

今天，我来和你聊一聊如何学习和掌握机器学习基础知识，又如何通过核心的知识脉络快速掌握更多的机器学习算法和模型。

监督学习和无监督学习

要问机器学习主要能解决什么问题，抛开各式各样的机器学习流派和层出不穷的算法模型不谈，机器学习主要解决的是两类问题：监督学习和无监督学习。掌握机器学习，主要就是学习这两类问题，掌握解决这两类问题的基本思路。

什么是解决这两类问题的基本思路呢？基本思路，简而言之就是“套路”。放在这里的语境，那就是指：

如何把现实场景中的问题抽象成相应的数学模型，并知道在这个抽象过程中，数学模型有怎样的假设。

如何利用数学工具，对相应的数学模型参数进行求解。

如何根据实际问题提出评估方案，对应用的数学模型进行评估，看是否解决了实际问题。

这三步就是我们学习监督学习和无监督学习，乃至所有的机器学习算法的核心思路。机器学习中不同模型、不同算法都是围绕这三步来展开的，我们不妨把这个思路叫作“三步套路”。

那什么是监督学习呢？监督学习是指这么一个过程，我们通过外部的响应变量（Response Variable）来指导模型学习我们关心的任务，并达到我们需要的目的。这也就是“监督学习”中“监督”两字的由来。

也就是说，监督学习的最终目标，是使模型可以更准确地对我们所需要的响应变量建模。比如，我们希望通过一系列特征来预测某个地区的房屋销售价格，希望预测电影的票房，或者希望预测用户可能购买的商品。这里的“销售价格”、“电影票房”以及“可能购买的商品”都是监督学习中的响应变量。

那什么是无监督学习呢？通常情况下，无监督学习并没有明显的响应变量。无监督学习的核心，往往是希望发现数据内部的潜在结构和规律，为我们进行下一步决断提供参考。典型的无监督学习就是希望能够利用数据特征来把数据分组，机器学习语境下叫作“聚类”。

根据不同的应用场景，聚类又有很多变种，比如认为某一个数据点属于一个类别，或者认为某一个数据点同时属于好几个类别，只是属于每个类别的概率不同等等。

无监督学习的另外一个作用是为监督学习提供更加有力的特征。通常情况下，无监督学习能够挖掘出数据内部的结构，而这些结构可能会比我们提供的数据特征更能抓住数据的本质联系，因此监督学习中往往也需要无监督学习来进行辅助。

我们简要回顾了机器学习中两大类问题的定义。在学习这两大类模型和算法的时候，有这么一个技巧，就是要不断地回归到上面提到的基本思路上去，就是这个“三步套路”，反复用这三个方面来审视当前的模型。另外，我们也可以慢慢地体会到，任何新的模型或者算法的诞生，往往都是基于旧有的模型算法，在以上三个方面中的某一个或几个方向有所创新。

监督学习的基础

监督学习的基础是三类模型：

线性模型

决策树模型

神经网络模型

掌握这三类模型就掌握了监督学习的主干。利用监督学习来解决的问题，占所有机器学习或者人工智能任务的绝大多数。这里面，有 90% 甚至更多的监督学习问题，都可以用这三类模型得到比较好的解决。

这三类监督学习模型又可以细分为处理两类问题：

分类问题

回归问题

分类问题的核心是如何利用模型来判别一个数据点的类别。这个类别一般是离散的，比如两类或者多类。回归问题的核心则是利用模型来输出一个预测的数值。这个数值一般是一个实数，是连续的。

有了这个基本的认识以后，我们利用前面的思路来看一下如何梳理监督学习的思路。这里用线性模型的回归问题来做例子。但整个思路可以推广到所有的监督学习模型。

线性回归模型（Linear Regression）是所有回归模型中最简单也是最核心的一个模型。我们依次来看上面所讲的“三步套路”。

首先第一步，我们需要回答的问题是，线性回归对现实场景是如何抽象的。顾名思义，线性回归认为现实场景中的响应变量（比如房价、比如票房）和数据特征之间存在线性关系。而线性回归的数学假设有两个部分：

响应变量的预测值是数据特征的线性变换。这里的参数是一组系数。而预测值是系数和数据特征的线性组合。

响应变量的预测值和真实值之间有一个误差。这个误差服从一个正态（高斯）分布，分布的期望值是 0，方差是σ的平方。

有了这样的假设以后。第二步就要看线性回归模型的参数是如何求解的。这里从历史上就衍生出了很多方法。比如在教科书中一般会介绍线性回归的解析解（Closed-form Solution）。线性回归的解析解虽然简单优美，但是在现实计算中一般不直接采用，因为需要对矩阵进行逆运算，而矩阵求逆运算量很大。解析解主要用于各种理论分析中。

线性回归的参数还可以用数值计算的办法，比如梯度下降（Gradient Descent）的方法求得近似结果。然而梯度下降需要对所有的数据点进行扫描。当数据量很多的时候，梯度下降会变得很慢。于是随机梯度下降（Stochastic Gradient Descent）算法就应运而生。随机梯度下降并不需要对所有的数据点扫描后才对参数进行更新，而可以对一部分数据，有时甚至是一个数据点进行更新。

从这里我们也可以看到，对于同一个模型而言，可以用不同的算法来求解模型的参数。这是机器学习的一个核心特点。

最后第三步，我们来看如何评估线性回归模型。由于线性回归是对问题的响应变量进行一个实数预测。那么，最简单的评估方式就是看这个预测值和真实值之间的绝对误差。如果对于每一个数据点我们都可以计算这么一个误差，那么对于所有的数据点而言，我们就可以计算一个平均误差。

上述对于线性回归的讨论可以扩展到监督学习的三类基本模型。这样你就可以很快掌握这些模型的特点和这些模型算法之间的联系。

无监督学习的基础

现实中绝大多数的应用场景并不需要无监督学习。然而无监督学习中很多有价值的思想非常值得初学者掌握。另外，无监督学习，特别是深度学习支持下的无监督学习，是目前机器学习乃至深度学习的前沿研究方向。所以从长远来看，了解无监督学习是非常必要的。

我们前面说到，无监督学习的主要目的就是挖掘出数据内在的联系。这里的根本问题是，不同的无监督学习方法对数据内部的结构有不同的假设。因此，无监督学习不同模型之间常常有很大的差别。在众多无监督学习模型中，聚类模型无疑是重要的代表。了解和熟悉聚类模型有助于我们了解数据的一些基本信息。

聚类模型也有很多种类。这里我们就用最常见的、非常重要的K 均值算法（K-means），来看看如何通过前面讲过的“三步套路”来掌握其核心思路。

首先，K 均值算法认为数据由 K 个类别组成。每个类别内部的数据相距比较近，而距离所有其他类别中的数据都比较遥远。这里面的数学假设，需要定义数据到一个类别的距离以及距离函数本身。在 K 均值算法中，数据到一个类别的距离被定义为到这个类别的平均点的距离。这也是 K 均值名字的由来。而距离函数则采用了欧几里得距离，来衡量两个数据点之间的远近。

直接求解 K 均值的目标函数是一个 NP 难（NP-hard）的问题。于是大多数现有的方法都是用迭代的贪心算法来求解。

一直以来，对聚类问题、对无监督学习任务的评估都是机器学习的一个难点。无监督学习没有一个真正的目标，或者是我们之前提到的响应变量，因此无法真正客观地衡量模型或者算法的好坏。

对于 K 均值算法而言，比较简单的衡量指标就是，看所有类别内部的数据点的平均距离和类别两两之间的所有点的平均距离的大小。如果聚类成功，则类别内部的数据点会相距较近，而类别两两之间的所有点的平均距离则比较远。

以上我们通过“三步套路”的三个方面讨论了 K 均值算法的核心思路，这种讨论方法也适用所有的聚类模型和算法。

小结

当你可以熟练使用我今天介绍的“三步套路”，去分析更多监督学习和无监督学习的模型算法以后，对于基础的内容，也就是教科书上经常讲到的内容，你就可以去看这些内容究竟是在讲解这三个方面的哪个方面。

对于绝大多数模型来说，第一部分往往是最重要的，也就是说，这个模型究竟和现实问题的联系是什么。第二部分，也就是模型的求解，取决于模型本身的复杂度和成熟度，现在很多模型往往都有现成的软件包提供求解过程。而第三部分，模型的评估则在现实生产中至关重要。牢牢把握这三个方面，来对机器学习模型算法进行讨论，是成长为成熟数据科学家必不可少的过程。

今天我为你讲了掌握机器学习基础知识的一些核心思路。一起来回顾下要点：第一，机器学习主要的任务有监督学习和无监督学习。这两种机器学习任务的很多模型和算法都可以用一个“三步套路”的思路来进行分析。第二，我们用线性回归作为例子探讨了如何用这个“三步套路”来分析监督学习的模型和算法。第三，我们用 K 均值聚类算法作为例子探讨了如何用“三步套路”来分析无监督学习的模型和算法。

最后，给你留一个思考题，在现实场景中，当你发现一个模型并没有很好地解决你的问题时，从这个“三步套路”的角度来看，究竟哪个方面最容易出问题？

欢迎你给我留言，和我一起讨论。

005 | 数据科学家基础能力之系统

对于初学人工智能的工程师或者数据科学家来说，在知识积累的过程中，“系统”往往是一个很容易被忽视的环节。特别是非计算机科学专业出身的朋友，一般都没有真正地建立过“系统”的概念，在今后从事人工智能的相关工作时，很可能会遇到一些障碍。

今天我想给你分享一下，作为人工智能工程师和数据科学家，需要建立的关于“系统”的最基本认知。这些认知能够帮助你把书本的理论知识和现实的应用场景快速结合起来。

理解管道（Pipeline）

在很多人工智能初学者的认知中，机器学习的流程是这样的。有一个已经准备好的数据集，这个数据集里面已经有了各种特征以及所对应的标签或者响应变量。这个时候，你需要做的就是利用这个数据集和一些现成的机器学习工具包，来训练一些机器学习模型。模型训练好以后，就可以计算一些已知的评估指标了，比如准确度、精度等等。

这是一般教科书和课程上介绍的标准机器学习流程，也是很多机器学习论文中的实验环境。遗憾的是，这个静态的流程并不适用于工业级的数据产品。

要支持工业级的人工智能产品，一个最基本的概念就是，你需要搭建一个管道让你的环境是动态的、闭环的。在英文的语言背景里，“管道”这个词很形象地说明了这个环境的特点。我们把数据想象成“管道”里的水，这里面的一个核心思想，就是数据从一个环节到下一个环节，源源不断。我们再把最终的产品，也就是这个管道的末端，和最开始的数据采集部分，也就是这个管道的开始端，结合起来思考，这就是一个闭合的环路。

理解数据产品的核心，就要理解它是一个闭合环路。几乎关于数据产品的一切难点、问题以及解决方案都可以从这个闭合环路中产生。从一个静态的机器学习流程到一个动态的管道似的闭合环路，这是一个质变，对整个环节上的所有步骤都有全新的要求。

我这里就拿数据集来举个例子。静态的流程中，我们不需要太过关注这个数据集的来源。甚至采集数据集的代码或者脚本都可以是一次性的，可以不具备重复使用的价值。但是这种情况在管道的环境中是不可能的。

在管道中，采集数据的可靠性和可重复性是非常重要的步骤，这就对采集数据所采用的代码有不一样的要求。这部分代码需要被反复检验，每一步都需要人工智能工程师和数据科学家进行检验。如果我们把这个例子扩展到数据管道的其他部分，就可以很清楚地看到，数据管道对于构建一个机器学习流程所带来的根本变化。

管道的另外一个重要特性是自动化，一个不能自动化的管道是不能被称为管道的。这里的自动化有两层意思，一层意思是指数据本身可以被自动采集、整理、分析，然后自动流入机器学习部分，有结果后自动输出并能被线上的系统使用；另一层意思是指，每一个环节本身都不需要人工干预，或者仅需极少数的人工，自身可以高可靠地运行。由此可见，管道的自动化对每个环节的技术选择和实现都有非常高的要求。

现代互联网公司中，每个团队，甚至成立专门的团队，一般都会针对机器学习管道开发工具平台，使管道的灵活度、自动化、可靠性有足够保障。对于初学者而言，尝试从管道的角度去理解问题，从整个系统的角度来认识产品开发过程，认识机器学习流程，才有可能设计出能真正满足线上需求的技术方案。

理解线上和线下的区别

了解了一个数据系统的闭合回路以后，很自然地，就会出现下一个问题，这也是一个核心的系统级问题，在这个管道中，哪些部分是在“线上”，哪些部分又在“线下”呢？

这里我们先来理清“线上”这个概念。“线上”往往是说，对于交互性很强的互联网产品（包括电商、搜索引擎、社交媒体等），从用户来到某一个页面，到我们为这个页面准备好所需内容（例如推荐的商品或者搜索的结果），这中间的响应时间对应的就是“线上”，这部分时间非常短暂，往往只有几百毫秒。如何在这几百毫秒的时间内进行复杂的运算就非常有讲究了。

“线下”的概念是相对于“线上”而言的。通常情况下，不能在这几百毫秒之内完成的运算，都是某种程度的“线下”运算。

理解线上和线下的区别是初学者迈向工业级应用的又一个重要的步骤。哪些计算可以放到线上，哪些可以放到线下，就成了种种机器学习架构的核心区别。

初学者还需要注意的一个问题是，线上和线下都是相对的概念。今天放在线下计算的某些部分，明天可能就会放到线上进行计算。所以，慢慢学会把握两者之间的转换之道，对于初学者进阶至关重要。

我这里举一个简单的线上和线下分割的例子。比方说，我们要构建一个检测垃圾邮件的系统。对于这样一个系统而言，哪些部分是线上，哪些部分是线下呢？

初看，我们在这里讨论的是一个比较容易的架构，但并不代表实现这个架构的难度也很小。在最简单的情况下，检测垃圾邮件需要一个二分分类器。如何训练这个分类器的参数就是一个关键。

假设我们训练一个逻辑回归二分分类器。那么，逻辑回归的参数，也就是一组线性系数究竟应该在什么环境中得到呢？很明显，训练一个逻辑回归肯定需要大量的训练数据。在有一定量（大于几千的垃圾邮件和非垃圾邮件）的训练数据时，训练逻辑回归的参数就不可能在几百毫秒内完成。在这样的思路下，训练逻辑回归就不得不放到线下来计算。一旦这个决定做出以后，一系列的模块就都必须放在线下计算了。

另外，数据的收集肯定也得放到线下，这样才能保证可以把训练数据传输到后面的管道模块中。还有特征的生成，至少是训练数据特征的生成，很自然地也就需要放在线下。

训练逻辑回归本身，刚才我们提到了，需要放在线下。而放在线下这个决定（从某种意义上来说，无所谓时间多了一点还是少了一点，总之无法满足几百毫秒的线上计算就需要放在线下），又可以让训练逻辑回归本身，采用更加复杂的二阶算法，使参数能够得到更好的收敛。

你可以看到，因为一个决定，带来了关于整个管道的一系列决定。而这些决定又影响了模型算法的选择，比如可以选用相对耗时的更复杂的算法。

那么在这个架构下，线上的部分是什么呢？首先，训练完一个模型之后，要想使用这个模型，我们必须把模型的参数存放到某个地方（也许是一个数据库或者是一个存储系统），线上的系统可以在几百毫秒的时间内马上得到这些参数。仅仅得到参数是不够的，还需要对当前的邮件进行判断。

这一步就有一些问题了。一种选择是，线上的部分拿到模型参数，然后实时动态产生这个邮件的特征，再实时计算出一个分数，并且判断是否是垃圾邮件。整个过程的这三个步骤需要在几百毫秒内进行完毕。

实际上，这里面的第二步往往比较耗时，甚至有的特征并不能在线上进行计算。比如，也许有一个特征需要查询这个邮件的来源是否可靠，这里就可能需要数据库操作，这一步也许就会非常耗时（在几百毫秒的场景中而言）。因此，动态产生特征，除非特征都非常简单，很有可能并不能完全在线上完成。

我们可以对框架进行简单的修改。所有的邮件首先输送到一个特征产生的模块中，这里并不是一个完全线上的环境，运算的需求可能超过几百毫秒，但总体只是几秒，最多十多秒。所有的特征产生以后，对邮件的判断也在这里完成，最终将邮件是否是垃圾邮件这个简单的选项保存下来。在线上的系统，也就是用户来到这个邮件系统界面的时候，我们只是从保存的结果中，直接读出一个标签，速度非常快。

如上，我们通过检测垃圾邮件系统的例子，分析了线上和线下的分割情况。现在来做一个思考，刚才描述的这个架构有什么问题吗？问题就是，线上的结果是一个事先计算好的结果，模型本身也是事先计算好的。因此，当有大量突发数据（比如一大批新的垃圾邮件）来临的时候，这个架构可能无法很快反应，更新模型。可见，如何理解线上和线下是一个需要慢慢琢磨的学习过程。

小结

今天我为你讲了数据科学家和人工智能工程师需要掌握的关于系统基础的两个核心概念。一起来回顾下要点：第一，现代数据流程不是一个静态的数据集，而是一个动态的闭环管道。 第二，理解什么计算可以放到线上，什么计算可以放到线下至关重要。

最后，给你留一个思考题，如果让你设计一个商品的推荐系统，哪些部分放到线下，哪些部分放到线上呢？

欢迎你给我留言，和我一起讨论。

008 | 曾经辉煌的雅虎研究院

雅虎是最早成功的互联网公司之一，也是最早意识到需要把基础研究，特别是机器学习以及人工智能研究，应用到实际产品中的公司。雅虎从很早就开始招聘和培养研究型人才，雅虎研究院就是在这个过程中应运而生的。

今天我就来说一说雅虎研究院的历史，以及过去十多年间取得的成就，聊一聊如何通过引进高级人才，迅速构建起一支世界级的研发团队。当然，也会聊一聊研究院的衰落。高级研发机构对于企业而言往往是锦上添花的事情，在整个公司产品和视野都欠缺的情况下，也往往避免不了最后衰败的结局。

雅虎研究院的创立

雅虎研究院的故事要从一个叫乌萨马·菲亚德（Usama Fayyad）的人说起。乌萨马出生在北非突尼斯的迦太基（Carthage），早年在突尼斯以及其他地中海沿岸国家度过，包括中东、非洲以及南欧的一些国家。高中时期在约旦的安曼生活，后来在美国密歇根大学度过了他的本科（1984 年）、硕士（1986 年）以及博士（1991 年）生涯。毕业之后，乌萨马来到了美国加州南部隶属于美国国家航空航天局（NASA）的喷气推进实验室（Jet Propulsion Laboratory）工作，一直到 1996 年。之后加入微软研究院，从事数据挖掘的研究工作。

早在 1994 年，乌萨马就和拉马萨米（Ramasamy Uthurusamy）一起组织了最后一届 KDD 研讨班，然后在 1995 年，他们把这个研讨班升级成了会议，并在加拿大蒙特利尔举办了第一届 KDD 大会（First International Conference on Knowledge Discovery in Data）。从此，KDD 大会成了数据挖掘、数据科学以及应用机器学习的顶级会议。

1996 年，乌萨马又创办了一本叫《数据挖掘和知识发现》（Data Mining and Knowledge Discovery）的学术期刊，并亲自担任主编。这本期刊也渐渐成了数据挖掘领域主要的学术期刊之一。乌萨马本人可以说在 20 世纪 90 年代中期，就已经开始成为数据挖掘领域重要的领军人物。

进入 21 世纪，乌萨马先是在 2000 年创立了一家叫 Audience Science 的数据挖掘公司并担任 CEO，然后又在 2003 年创立了一家叫 DMX Group 的数据挖掘咨询公司，后者于 2004 年被雅虎收购。不久后，他成为雅虎的执行副总裁以及首席数据官（Chief Data Officer），这也是互联网历史上的第一位首席数据官。

因为雅虎在搜索以及广告业务上的扩展，乌萨马意识到应该成立一个类似于微软研究院，但更偏向于互联网业务的研究组织，这个想法得到了公司 CEO 杨致远的支持。乌萨马当时的首要任务是为研究院物色一位院长。

经过一段时间的寻找，他成功邀请到普拉巴卡·拉加万（Prabhakar Raghavan）来担纲。今天回头来看，普拉巴卡无疑成功地引领了雅虎研究院，并让其一度成为人人向往的互联网研究机构。当然，这跟普拉巴卡本人的经历也密切相关。

首先，他本人就是知名的学者，参与撰写的经典教科书《随机算法》（Randomized Algorithms）和《信息检索导论》（Introduction to Information Retrieval）在学术界享有盛誉。他还是 ACM、IEEE 的院士，也是美国工程院院士，这为他招纳学术界权威人士和博士生提供了便捷。加入雅虎之前，他已经在 IBM 研究院以及 Verity 任职多年，IBM 的从业经历更是让他对企业文化和工业界的研究机构有了很深的了解。

2005 年 7 月，雅虎研究院正式成立，普拉巴卡担任研究院负责人，向乌萨马汇报。2008 年，雅虎研究院与之前就在搜索与广告事业部存在的应用科学部门合并。在卡罗尔·巴茨（Carol Bartz）任职 CEO 期间，普拉巴卡直接给她汇报，并且普拉巴卡还曾担任首席战略官。

雅虎研究院的蓬勃发展和辉煌

雅虎研究院组建之后，首要任务当然就是吸引工业界和学术界的知名学者，从而能够组建一个有效的团队。普拉巴卡利用他个人和乌萨马的声望，很快就做到了这点。

比如，之前和普拉巴卡在 IBM 共事的安德鲁·汤姆金斯（Andrew Tomkins）加入团队，担任负责搜索的首席科学家以及搜索方面的副总裁（安德鲁后于 2009 年之后加入谷歌担任工程总监）。 再比如，曾和普拉巴卡在 IBM 共事的安德烈·布罗德（Andrei Broder）2005 年加入团队，担任负责计算广告方面的副总裁。

安德烈本人大有名头。他在斯坦福大学攻读博士期间师从图灵奖得主高德纳（Donald Knuth），然后在曾经名噪一时的第一代搜索引擎公司 AltaVista 担任首席科学家，之后加入位于纽约的 IBM 研究院组建企业级搜索平台。和普拉巴卡一样，安德烈也是 ACM 和 IEEE 的双料院士。2012 年安德烈加入谷歌，担任杰出科学家 （Distinguished Scientist）。

我们这里简单列举一些曾经在雅虎研究院工作过的知名学者，我们便可一览其盛况：

Ronald J. Brachman：哈佛大学计算机科学博士，加入雅虎研究院之前长期于贝尔实验室工作，曾担任贝尔实验室人工智能研究部的负责人。1996 年之后担任 AT&T 实验室通信服务研究中心副总裁。2005 年加入雅虎研究院协助普拉巴卡进行管理，并于 2012 年到 2016 年间担任雅虎研究院首席科学家以及负责人。Ronald 曾任 AAAI 主席。2016 年之后担任纽约康奈尔科技大学的 Jacobs Technion-Cornell 研究院院长。

Yoelle Maarek：以色列理工大学计算机科学博士，加入雅虎研究院之前曾任 IBM 研究院的杰出工程师和谷歌的工程总监。历任雅虎研究院以色列分部的负责人、高级研究总监，并在 2016 年 Ronald 离开之后任雅虎研究院的负责人。

Jan Pedersen：斯坦福大学统计学博士。2002 年加入 AltaVista 担任首席科学家（在安德烈之后）。2003 年加入雅虎研究院担任搜索和广告方面的首席科学家（在安德鲁·汤姆金斯之前）。2009 年加入微软，担任 Bing 核心搜索部门（Core Search）的首席科学家。2017 年加入 Twitter，担任数据科学副总裁。

Ben Shahshahani：普渡大学电气工程博士。曾在 Nuance Communications 担任工程总监。2005 年加入雅虎研究院，之后历任负责搜索广告的高级总监以及搜索与媒体科学组的副总裁。2012 年加入谷歌任工程总监。2014 年回到雅虎，任广告科学方面副总裁。

Ricardo Baeza-Yates：滑铁卢大学计算机科学博士，ACM 和 IEEE 双料院士，信息检索和搜索方面的权威，著有《现代信息检索》（ Modern Information Retrieval）一书。他在雅虎研究院担任拉美和欧洲分部的副总裁直至 2016 年，也是智利科学院以及工程院的院士。

Ravi Kumar：康奈尔计算机科学博士，加入雅虎研究院之前在 IBM 研究院从事数据挖掘算法的研究。2005 年加入研究院之后担任首席研究科学家。2012 年加入谷歌担任高级主任研究科学家（Senior Staff Research Scientist）。他的论文引用数达 3 万次以上。

Evgeniy Gabrilovich：以色列理工大学博士，在雅虎研究院担任首席研究科学家，并且担任自然语言处理方向研究的负责人。2012 年加入谷歌担任高级主任研究科学家。2012 年当选 ACM 杰出科学家（ACM Distinguished Scientist）。

Deepak Agarwal：康涅狄格大学（University of Connecticut）统计学博士，加入雅虎研究院之前在 AT&T 担任高级研究科学家一职。2006 年加入雅虎研究院担任首席研究科学家，主要研究推荐系统相关的内容。2012 年加入 LinkedIn，担任人工智能和机器学习方面的副总裁。

Alexander Smola：柏林理工大学计算机科学博士，加入雅虎研究院之前任澳大利亚国立大学教授。2008 年加入雅虎研究院后任首席研究科学家（Principal Research Scientist）。2013 年加入卡内基梅隆大学任教授一职。2016 年加入亚马逊担任机器学习方面的总监。他的论文引用数达 8 万次以上。

Jianchang (JC) Mao：密歇根州立大学计算机科学博士，加入雅虎研究院之前曾在 IBM 研究院任职，还曾担任 Verity 的首席软件架构师。2004 年加入雅虎之后任广告科学方面副总裁。2012 年加入微软之后，先后担任 Bing 的多个职务并于 2016 年被提升为公司副总裁。他的论文引用数达 1 万次以上。

Raghu Ramakrishnan：德克萨斯大学奥斯汀分校计算机科学博士，加入雅虎研究院之前担任威斯康星大学教授。2006 年加入雅虎研究院之后任云计算方面的副总裁。2012 年加入微软之后一直担任 CTO，负责云计算领域。他的论文引用数达 3 万次以上。

当然，在雅虎研究院工作过的知名人士还有很多，这里无法一一列举。不过我们可以看出，不少人在离开雅虎之后，依然在业界发挥着不小的作用。

除了招揽到一批优秀人才，雅虎研究院也发表了一系列有价值的研究成果，在很短的时间内建立了学术研究上的威望。在 10 年间，据不完全统计，雅虎研究院的学者获得过两次信息检索顶级会议 ACM SIGIR 的最佳论文、3 次数据科学和数据挖掘顶级会议 ACM KDD 的最佳论文、两次机器学习顶级会议 ICML 的最佳论文、两次推荐系统顶级会议 ACM RecSys 的最佳论文、两次信息检索以及网络信息挖掘的权威会议 ACM WSDM 的最佳论文、两次信息检索和数据库领域顶级论文 ACM CIKM 最佳论文以及一系列有影响力的最佳论文奖项，涵盖了搜索、广告、推荐系统、数据挖掘、机器学习、人机交互等诸多方面，为互联网研究和发展做出了重大贡献。

可以说在非常短的时间内，雅虎研究院就用卓越的研究成果向世人证明了这个团队和组织的实力。曾经在某一段时期内，世界各国的优秀研究人员和博士毕业生都希望跻身雅虎研究院的研发队列。

雅虎研究院逐渐成为历史

2012 年是雅虎历史上格外动荡的一年。先是公司 CEO 卡罗尔·巴茨在上一年的 9 月份被董事会解雇；然后经历了短暂的临时 CEO——蒂姆·莫尔斯（Tim Morse）；之后新 CEO 斯科特·汤普森（Scott Thompson）在 1 月上任，5 月份就因学历造假丑闻离职；罗斯·莱文索恩（Ross Levinsohn）之后担任公司临时 CEO 直至 7 月。然后，玛丽莎·梅耶尔（Marissa Mayer）加入公司担任 CEO。短短不到一年的时间里，共有 5 个人担当了 CEO 的职位。

在这个过程中，普拉巴卡离职并加入谷歌，很多之前追随他的人也先后加入谷歌。普拉巴卡离开后，罗纳德·布拉赫曼（Ronald J. Brachman）接过了研究院领导人的位置，并在 2012 到 2016 的 4 年间为玛丽莎重新招募了超过 100 名博士科学家。

2016 年 2 月，雅虎宣布研究院不再作为一个独立实体而存在，罗纳德离职，所有研究人员被分散到各个工程部门，依然保留雅虎研究院的对外旗号，耶艾尔·玛瑞克（Yoelle Maarek）担任负责人。2017 年雅虎和 Verizon 合并，雅虎作为一个独立的公司成为历史。

雅虎研究院逐渐淡出历史舞台，这固然有公司高层频繁更换的原因，也有一些更加深层次的原因。研究院的成果往往都需要一定时间才能直接在产品中体现出来，因此，虽然在技术上研究院能够帮助公司提升水平，但是实际产品的效果未必就一定能够受到用户的青睐。

例如，研究院曾经投入了大量人力物力，利用机器学习来提高搜索引擎的搜索品质。可以说，雅虎是最早将人工智能和机器学习技术大规模应用在搜索引擎上的公司。但是搜索引擎的好坏很多时候是一个产品、技术、设计的综合体现，雅虎研究院研发的算法并没有在产品的综合表现中挣得额外加分。

相似的例子还包括雅虎研究院在早期就投入了很多力量研发广告平台，甚至包括安德烈·布罗德本人到斯坦福大学开设了世界历史上第一门计算广告学的课程。然而，雅虎整个平台的产品都在下滑，因此广告平台受到了额外的压力。虽然研究院的科学家们在算法和模型上做出了很多创新，也在一定时间内带来了不小的收益，但都无法改变整个公司产品线运营不佳的情况。于是，雅虎研究院的成果在雅虎整体业绩不理想、公司产品缺乏想象力的大背景下显得杯水车薪，并不能从整体上扭转公司的颓势。在公司进入动荡之后，研究院对于高层领导来说，往往也就不是公司的重点发展对象了，研究院的瓦解也就成了必然。

小结

今天我为你分析了雅虎研究院的兴衰。一起回顾下要点：首先，雅虎研究院曾通过引进高级人才的方式，迅速构建起了一支世界级的研发团队，并发表了一系列有价值的研究成果，建立起在学术研究上的威望，创造了研究院曾经的辉煌；其次，因高层变动以及一些深层次的问题，雅虎研究院没有摆脱最后衰落的结局，一切辉煌终成历史。

最后，给你留一个思考题：到底什么样的企业环境能够最好地发挥研究院的成果，又是怎样的研发流程能够使研究院成为公司新动力的源泉？雅虎研究院在当年并没有找到答案。不知道随着最近一批互联网新贵纷纷成立人工智能研发团队的契机，大家是否能够找到更好的研究院运作模式。

欢迎你给我留言，和我一起讨论。

009 | 数据科学家高阶能力之分析产品

人工智能工程师和数据科学家的主要工作是什么？很多人认为，他们的主要工作是利用复杂的机器学习模型和算法来解决产品中的难题。这样的认识既“对”也“不对”。“对”的地方是说，机器学习模型和算法的确是人工智能技术在产品上落地的核心步骤。“不对”的地方是说，这种认识往往片面地总结了人工智能从业人员的工作范畴。

实际上，要想真正地提出一个好的人工智能解决方案，分析产品的能力是必需的。从较高的层次来讲，就是分析一个产品目前遇到的难题是什么，为什么需要用人工智能技术去解决，哪些是可以用人工智能技术解决的，哪些不能。

今天，我就来分享一下，站在人工智能工程师和数据科学家的角度，我们如何理解并提升分析产品的能力，学会了解产品的需求。

产品需求的庖丁解牛

一个数据驱动的产品往往是一个复杂的复合体。这里面当然有很多数据、人工智能的元素，也有不少其他元素，比如设计、人机交互、商业规则、心理学等等。那么，如何在这么一个综合复杂的体系中找到人工智能技术的合适位置，以及技术究竟要扮演什么样的角色，其实是一个数据驱动型产品能否成功的核心问题。

想要对这个问题有一个比较全面的认识，我们首先需要回答这么一个问题，那就是人工智能技术到底能够给产品带来什么？

很多朋友可能觉得这个问题不言自明。人工智能技术难道不是解决产品的核心算法难题吗？

这种看法其实不够全面。人工智能技术给产品带来的其实不仅是一些核心的模型和算法，更重要的是，带给产品一项根本性的能力：数据驱动的决策过程。

什么叫作“数据驱动的决策过程”呢？我们还是要从人工智能技术的特点说起。

人工智能技术的特点有两个方面：第一，数据驱动。第二，在不确定的因素下智能决策。

数据驱动

我们先来谈谈第一个方面，数据驱动。这里其实是两个部分，“数据”和“驱动”。

一个产品要想利用人工智能，第一步，也是非常重要的一个步骤，就是要有“数据”的概念。什么是“数据”的概念？就是一个产品需要有数据收集的意识，并有数据收集的机制。然后，一个有“数据”的产品需要慢慢建立数据管道，并开始建立数据的检测系统。这些都是人工智能介入的先决条件和基础设施。

没有数据，没有流畅的数据链条，是无法构建一个健康的人工智能决策环境的。这一点说起来容易，要真正做到其实需要很扎实的技术基础。很多团队、很多产品最终无法利用人工智能技术的方方面面，一个关键原因就是在数据链条上出了各种问题。

有了数据以后，第二个环节就是“驱动”。也就是说，只有数据是不行的，还必须有一个意识，主动利用这些数据来驱动产品的发展，驱动产品方方面面的进化。这个步骤其实不仅是针对产品的决策人员，比如产品经理、项目负责人，也是针对这个产品的所有参与人员的。

参与产品的各方面人员，包括工程方面的、设计方面的、市场方面的，大家有没有意识，在有了数据链条之后，通过数据检测、数据分析不断加深对产品的认识，提出更好的想法。当产品遇到各种问题时，大家有没有一个意识，那就是先到数据中去找答案，先去看数据是不是出了什么问题，去理解数据中显示出来的内容。

如果说数据驱动的第一部分是有关“硬件”的，是数据链条的技术以及实现，那么第二部分就是有关“软件”的，是项目人员的意识和责任。

智能决策

当一个产品有了数据驱动的基础以后，下一步，就需要建立“智能决策”的理念。

“智能决策”是什么意思？

要想明白“智能决策”的意义，我们首先要来想一想“非智能决策”是什么样的。

很多传统的产品或者不是数据驱动的科技产品都是非智能决策的产物。非智能决策主要是指，不依靠数据，或者依靠很少量的数据，由产品经理或产品负责人人工地进行决策。注意，非智能决策并不一定无法带来好的产品。实际上，在历史的很长时间里，各行各业都是依靠非智能决策在进行演化。

非智能决策的一大特点是决策的主观性。通俗地讲，就是决策者依靠自我的认识，主观“拍板”决策关于产品的方方面面。因为没有一个系统的方法论，或者说是没有一整套机制给决策者相应的信息，来帮助决策者完成决策，非智能决策所带来的产品结果往往有很大的偶然性。

这种偶然性来自于决策者本人的各种能力，来自于执行者的能力。由于这样的偶然性和主观性，非智能决策的另外一个特点，或者说是结果，就是不可复制性。这是因为决策的方法和方式都不能动态地随着时间、随着数据的变化而变化。

非智能决策在什么时候会变得比较困难呢？数据量太大的时候，需要做选择的可能性太多的时候，需要做的选择本身复杂度变高的时候。这些特征也正是新时期下互联网产品或者人工智能产品的特点。因此，在将来非智能决策会越来越多地让位给智能决策。

简单来说，智能决策就是产品的决策者依据产品的特点，把一些复杂的、需要依靠大量数据、选择面太广的决策交给人工智能模型和算法，并且建立起一整套体系，利用人工智能手段依靠数据来对整个产品进行快速迭代。

如果给这种产品决策找一些典型的类比，就像现代搜索引擎技术，代替了传统的图书馆管理员的角色；现代的电子商务网站为用户推荐各类商品，代替了传统商店里的导购；智能自动驾驶汽车，代替了人类的手工驾驶。

智能决策不仅仅是某一项任务的智能化，更重要的是一种理念的提升。也就是说，一旦产品的决策中出现了有需要大量数据、有复杂选项的时候，作为产品的决策者就需要马上意识到，这部分决策任务应该逐渐从人转移到智能模型和算法上，依靠数据驱动流程来加快迭代。这一点是智能决策的关键。

我们可以接着之前的电子商务网站的例子来说明智能决策的理念。最开始的时候，也许这个网站只有一个简单的界面，可以根据用户的一些历史信息来推荐商店的商品。这个时候，智能决策的部分还仅限于推荐模块这一部分。紧接着，越来越多的用户开始使用这个网站，于是任务就变得越来越多，也越来越困难。

比如，如何设计下一版的网站界面？设计师、前端工程师、用户体验工程师、甚至产品经理都会有自己的看法。这个任务本身就很困难，怎么能让上百万的用户满意？怎么能体现出不同用户的不同选择偏好？怎么能体现出这个产品自身的美学价值？你看，这就是一个需要基于数据的复杂的决策任务。

很多团队能够意识到推荐模块需要智能决策，却意识不到“下一版的界面”问题可能也需要智能决策。其实，一旦一个问题变成智能决策问题，我们反而有章可循。

比如这个界面问题，所有人的意见、想法或者创意，依据一定的规则，可以用一些人工智能模型和算法来表达。然后通过现代的 A/B 在线测试手段，可以针对不同的人群展示不同的界面。随后通过数据链条来对测试进行监控和分析。

这时候，决策反而变得简单。因为我们不需要为数百万用户拿一个主意，而需要做的是为智能决策提供足够多的创意，然后由智能模型和算法以及实验流程来选择用户喜欢的界面。最后，下一版的网站，不只有一个界面，而是有几十甚至是几百种不同的界面，为百万千万的用户服务。

小结

我们之前提到了数据驱动，提到了智能决策。那么回到我们今天最开始的主题，作为人工智能工程师或者数据科学家的一个高阶技能，就是能够培养这样一种理念，对产品进行持续分析，检测产品是否遵循了数据驱动的理念，挖掘产品有哪些需求可以进行智能决策。

一旦有了这个分析产品的能力以后，我们可以发现人工智能技术将成为产品进化的驱动器和核心机制，而不仅仅是锦上添花的一种噱头。这就是对产品的一种完全革新式的思维。

同时，我这里需要指出的是，今天在这里提到的数据驱动也好、智能决策也好，你可以认为这些都不是什么新思想。但是，如何把这些思想真正地应用到产品实践中却是一件非常困难的事情。

另外一点需要注意的是，这些理念本身也不是教条，也是一个与时俱进的过程。并不是所有的产品在所有的阶段都需要做数据驱动，都需要做智能决策。我们之前提到了，有很多没有真正数据驱动的产品也依然获得了成功。所以，对产品的分析能力，其实需要你在产品的迭代过程中逐步提升。

今天我为你讲了数据科学家和人工智能工程师如何提升产品分析能力。一起来回顾下要点：第一，产品分析的能力其实就是对产品需求的一个分解，而分解之后的产品迭代很大程度上依赖于数据驱动和智能决策。 第二，我详细地阐述了什么是数据驱动，什么是智能决策，究竟怎样可以为产品带来这两项核心能力。

最后，给你留一个思考题，什么样的产品不太适合数据驱动和智能决策呢？

欢迎你给我留言，和我一起讨论。

010 | 数据科学家高阶能力之评估产品

“如果你无法衡量它，你就无法改进它。”（If you can't measure it you can't improve it.）这是一句你可能会经常听到的话，这句话也被应用到很多不同的场景中。那么，对于人工智能工程师和数据科学家来说，这句话其实是他们工作核心的核心。不管是模型和算法，还是产品迭代，都离不开“指标”和“评估”这两个方面。

评估一个产品的好坏，是一项说起来最容易但做起来最困难的工作。任何人，从用户到产品经理，对某一个产品都可能有自己的主观意见。然而对一个产品，特别是要面对成千上万用户的产品来说，依靠主观感觉是很难有一个完整、全面的评价的。同时，有一个成熟的产品评价体系可以成为产品不断迭代的领航标。

今天，我就来聊一聊如何评估一个数据驱动型产品，又如何从评估产品的角度来推动产品的迭代。我们需要建立层次化的评估体系，需要一个衡量产品好坏的框架。这个框架要从宏观到微观，能够对你的产品进行全方位的检测，并且这种检测能够帮助你更容易地进行决策。

产品的经济收益

你可能要问，是的，我们需要评估一个产品，但是如何找到衡量产品的这些指标呢？

比方说你要做一个社交网络的网站，怎么来制定检测指标呢？首先，你要问自己，我做这个社交网络的最终目的是什么？很明显，一个商业网站的终极目标是赚钱，也就是说，你最终的指标是你网站的经济收益。知道了这一点远远不够，你至少还需要思考两个问题。第一，如何衡量你的经济收益；第二，你能否用经济收益来直接指导你的产品构建。

我们先谈谈第一个问题。衡量经济收益看似简单其实不易。从比较大的维度上来说，你可以衡量总收入，你也可以衡量利润，你可以衡量收入的年增长率，还可以衡量季度增长率。从比较具体的维度来说，很多社交网站依靠广告收入，对广告收入的衡量本身就是一个非常复杂的问题。

总体来看，衡量经济收益，有两点值得你思考。其一，如何衡量你收入的现状。其二，如何衡量你收入的增长。今天，关于收入的指标我就不展开讨论了。

刚才讲的第二个问题就更加复杂。衡量经济收入的指标往往太过宏观，而且衡量起来有难度，因此用经济指标来指导产品的发展是很困难的。我刚才说了一些经济收益指标，比如年收入、年增长率、季度增长率，这些指标的衡量需要至少等待一个季度以上，甚至一年的时间。这些有时间间隔的指标，无法给产品的快速迭代带来很大的指导意义。

另一方面，很多产品并不直接产生经济结果。也就是说，经济收益是一个“副产品”。这个时候，如果我们只看经济收益，就无法真正指导我们构建更好的产品。比如，我刚才提到，对于一个社交网站来说，广告收入是一个“副产品”，绝大多数用户来到这个网站的主要目的不是点击广告。因此，仅仅衡量广告有可能让社交网络产品的迭代误入歧途。

层次化的评估体系

如果单从经济指标无法对产品有全面的指导作用，那怎么才能更加有效地建立评估体系呢？这里就引出下一个话题，那就是多层次的评估体系。

接下来，我就由低到高依次从五个层面来说明一下，这个层次化的评估到底是什么意思。

最低层次的评估主要围绕着产品的最小组成单元。比如我们刚才用的社交网络的例子，社交网络的各个页面上的模块就可以是最小的被评估的单元。

为什么要用这个概念呢？原因是这样的，每一个模块往往是产品的一个逻辑单元，一个最小的承载产品理念的单元。不管是工程团队还是产品团队的运作，基本上都是为这些模块而工作。因此，观察最小单元的效果对产品和工程团队都有直接的指导意义。如果团队目前对这个模块做了一些更改，那么最直接的效果就是这个模块的一些指标会发生变化。这是产品迭代的一个重要组成部分。

在这个层次，衡量模块的指标主要是模块的直接效果指标。比如，模块本身的点击率，模块本身的驻留时间，模块上一些其他的用户活跃指标等。这些都是最低层次的模块级别的指标，和产品、工程团队的运作有密切联系。

第二个层次的指标是从单个模块上升到一个页面。这个时候，就不仅需要理解单个模块的情况，还需要对整个页面上所有模块产生的功能群进行深入研究。在这个层次，产品功能群的思考可能会涉及到多个产品团队，也可能会出现模块间冲突的情况。

比如不少现代搜索引擎的搜索页面往往都有广告模块。长期的经验告诉我们，广告模块的效果和普通搜索模块的效果往往有相反关系的耦合。也就是说，普通搜索模块的效果提高了，广告模块的某些指标反而可能下降。反过来，广告模块的效果提高了，也很有可能是因为普通搜索模块的质量突然变差。因此，在有经验的产品团队面前，广告效果有意想不到的提高，可能并不意味着是件好事情。

第二个层次的指标比第一个层次变得复杂起来。不过这个层次的指标依然是可以直接测量的。比如页面的点击率，页面的驻留时间，页面上其他的用户指标等等。这些指标虽然可以直接测量，但是分析时需要对页面上的所有模块有全面了解。

前两个层次的指标主要是测量用户在某一个模块或者页面上的表现，核心是看产品的更改对用户的直接影响。而且，第一层次和第二层次的指标非常易于检测。通常情况下，如果页面和模块发生了什么问题，这些指标就能很快地反映出页面的情况。然后通过排查，我们就能快速发现问题，这也就是通常所说的，这些指标都比较“敏感”。

“敏感”指标的第一个好处是，这些指标具有非常强的指导意义，能够帮助产品团队快速认识问题并提出解决方案。“敏感”指标的第二个好处无疑就是，产品团队的绝大多数改动都能够比较容易地反应到这些指标上。因此，这是一个容易建立的、良性循环的指标体系。当然，仅有这两个层次的指标还是远远不够的，我们可以看到，这两个层次的指标和一个产品最终目标的衡量还有一定距离。

第三个层次的指标，就从某一个模块、某一个页面上升到了用户这个层级，主要是检测用户在一个会话（Session）中的表现。这个时候，用户往往在一个会话中，和多个模块、多个页面进行非常复杂的互动。在这个层次上，我们已经很难仅凭观测就能琢磨出用户在这个会话中是否真正感觉满意。这个时候，我们往往就需要建立用户模型（User Model），以及通过一些统计的方法建模，从而实现真正理解用户行为的目的。

举一个例子，如果我们构建一个电子商务网站，在一个用户会话中检测用户是否购买了一些商品，这些商品的总价值又是多少。这个监测指标有时候被称作 GMV（Gross Merchandise Value），也就是通常所说的网站成交金额。GMV 还是比较容易计算的，就是计算每个会话之后用户购买的商品价值，然后对所有会话的结果求和。但是要真正理解用户会话行为对 GMV 的影响，就是一个比较困难的任务了。

我们可以想象，即便是同一个用户，是否在一个会话中购买商品，这是一个非常复杂的决策过程。在一个会话中，用户可能会接触到搜索页面，可能会接触到各种推荐的模块，也可能会跳转某个商品的页面，还可能会跳转首页。并且，每个用户的用户轨迹不同，接触各个页面和模块的流程也是不一样的。可以肯定地说，任何一个流程中的每一个环节，都有可能对用户是否购买商品、以及购买多少价钱的商品有或多或少的影响。而如何来测量和建模这样的影响，就是第三层次指标的核心挑战。

第四个层次的指标是从一个用户会话上升到多个用户会话。这个时候，我们关心的是用户较长时间的体验问题。对于一些复杂的任务，用户需要多个会话才能完成。套用我们刚才举的电商 GMV 的例子，很多用户购买比较贵重或者是一些有特定需求的商品（比如婚纱）时，往往无法在一个用户会话中完成决策。

那么这种情况下，检测指标的复杂性又进一步提高。比如说，用户可能先在电商网站上搜索了关于婚纱的信息，但在这一次会话中并没有完成交易。用户之后可能又从其他途径了解了一些更多的信息，然后又重新到电商网站开始一个新的会话。在这个会话中，用户也许重点比较了好几个婚纱，然后决定购买其中一件。这个例子还是一个比较简单的情况了。

第三和第四层次的指标有两个特点。第一，相对于第一、第二层次的指标而言，这些指标已经不那么“敏感”了。也就是说，仅改变某一个模块甚至某一个页面，是很难在短时间内改变第三，特别是第四层次的指标的。从上面的例子可以看出，用户的购买行为是非常复杂的，仅仅因为提高了某个推荐模块，是不是就能让用户多买贵的东西，答案是不确定的。第二个特点就是，第三和第四层次的指标依然可以用传统的 A/B 测试来进行观测，只不过需要很仔细地设计实验。

第五个层次的指标就是用户和产品的长期指标。我们最开始提到的经济指标其实就是第五层次的指标。类似的指标还包括月活跃用户、年度活跃用户等等。这些指标有两个特点。第一，这些指标往往是产品的终极目标，一般极其难以撼动，特别是对于成熟的产品而言。第二个特点是，这些指标往往无法通过 A/B 测试进行衡量。也就是说，我们往往无法通过常规的实验就能够观测到这些长期指标的变化，这也是为什么这些指标被称为“长期”的原因。

小结

今天我为你讲了数据科学家和人工智能工程师如何评估产品的能力，这属于比较高阶的分析问题的能力。一起来回顾下要点：第一，我们如何来认识衡量产品经济收益这件事情。第二，我们很详细地阐述了什么是五个层次的评估体系，以及这个评估体系每个层次的特点。

最后，给你留一个思考题，如果第五个层次无法直接通过 A/B 测试进行观测，那我们如何在平时进行 A/B 测试的时候，就能确保是在优化第五个层次的指标，也就是我们产品的终极目标呢？

欢迎你给我留言，和我一起讨论。

011 | 数据科学家高阶能力之如何系统提升产品性能

人工智能工程师和数据科学家的一个核心任务，就是依靠人工智能、机器学习这样的工具来帮助产品不断提升品质，吸引更多用户，以实现既定的长期目标。这里有一个关键点，就是我们如何开发出一套方法论，让提升产品性能的过程可以“有章可循”，并成为一个系统性的流程。

初入门槛的工程师和数据科学家，容易把精力和眼光都集中在具体的算法模型上面。这固然是短期内的重要工作，但是，如何能够持续不断地为产品提供前进的动力，才是让人工智能技术有别于之前多次技术浪潮的根本因素。今天，我就来为你剖析一下，持续不断地、系统性提升产品性能的一些关键步骤。

优化长期目标

一个产品如果需要利用数据驱动的人工智能技术来提升品质，第一件事情一定不是专注于部署某一个模型或者算法。或者说，如果已经急迫地上线了第一个简单的算法，接下来最重要的事情一定是停下来，看一看我们是否已经弄明白，这个产品到底需要“优化”什么目标，是否有一个指标检测体系，来指导我们的优化过程。

我们利用人工智能技术手段一定要优化产品的长期目标，这是系统性提升产品性能的一个关键。乍一听这是一句废话，难道算法和模型还有不优化产品长期目标的时候？你心中一定有这样的疑问。其实，确定你所制定的技术方案一定能够优化产品的长期目标，是一件比较困难的事情。

设想一下这些例子。比如你为一个在线视频的网站设计推荐系统，你根据很多教科书上的推荐系统案例，优化某一个视频的评分（Rating），这是在优化这个产品的长期目标吗？

比如，你为一个电子商务网站设计搜索系统，你根据传统的信息检索以及搜索的案例，优化查询关键词和产品的相关度（Relevance），这是在优化这个产品的长期目标吗？

再比如，你为一个新闻网站设计新闻流系统，你根据产品的基本特点，希望提高新闻的点击率，是在优化这个产品的长期目标吗？

针对上面这些问题，答案或许都是——不确定。或者说，你正在优化的可能会、也可能不会对这个产品的长期目标有影响，这就需要我们建立一个系统性的方法论，来引导我们回答这个问题。

因此，知道我们是否在优化产品的长期目标需要一个前提，那就是我们必须要建立产品的指标检测体系。在专栏的上一期内容里，我们已经介绍了五个层次的产品评估体系。对于提升产品来说，建立这些层次是关键的一步。然而，要想真正系统性地提升产品，还有一个至关重要的步骤，那就是打通这五个层次，建立一个立体的产品提升流程，从而实现优化产品的长期目标。

我们先来简单回顾一下这五个层次的指标。从最高层次说起，第五层次的指标主要是产品的长期指标，比如季度利润的增长、年利润、月活跃人数等。这些指标和产品的最终目的息息相关，却非常难直接衡量，也就是这些指标对产品的一般变化不是很敏感。

第四层次的指标主要是用户在多个会话的交互表现。第三层次的指标是指用户在单一会话的交互表现。这两个层次的指标比较容易在 A/B 测试的范畴内测量。这些指标能比较宏观地检测一个产品的高维度表现，了解用户一般是如何和这个产品进行交互的。

第二层次是页面层级的指标，这个时候，我们观测到的基本上已经是产品团队可以直接控制的因素了。第一个层次的指标是模块级别的指标，这是产品团队直接运作的结果。

这五个层次的指标从宏观到微观，构成了一个检测的体系。如果我们要优化产品的长期目标，也就是说第五层次的指标，而我们能够直接掌握的产品决策，往往只能带来第一、第二层次指标的显著变化，这两者之间的差距如何来弥补呢？

我们前面举了好几个例子，比如视频推荐、产品搜索、新闻流产品等等。之前提到的技术方案大多数直接针对第一或者第二层次的指标，这些方案是不是能够对第五层次的指标奏效，其实是一个不确定的问题。

那么，问题的核心就变成了，如何在只能运作第一或者第二层次指标的情况下，对第三、第四甚至五层次的指标有间接的控制和影响呢？

建立层级指标之间的联系

上面我们提到了，要想持续地提高产品，最重要的就是要一直优化产品的长期目标。但是，如果我们只能控制产品的短期指标，如何才能优化产品的长期目标呢？

答案其实很简单，就是我们必须在所有层级的指标之间建立联系。这些联系因产品而异，但核心思想却是一致的。

回到之前的一个例子，那就是构建一个视频推荐系统。如果我们希望直接优化用户对视频的评分，就必需回答一个问题，能够给用户推荐打高分的视频，和产品的长期指标之间有什么联系？假设这里产品的长期指标是月活跃用户数目，那么问题就是，给用户推荐打高分的视频，和月活跃用户数目之间的联系是什么？

注意，这里说的建立联系不仅是逻辑联系，而且也是数据链联系。也就是说，我们不仅需要尽可能地在逻辑上理清，为什么推荐高分视频有利于帮助月活跃用户数的增长，还需要用数据来为这样的观点提供证据，这才是最重要的一个环节。

简单说来，我们可以这么做。首先，从所有的用户群体中找到用户样本。然后，通过数据来研究，用户的活跃程度和被推荐的视频评分之间的关系。从最高的维度上说，那就是建立一个回归问题，比如用户的月活跃程度作为响应变量，被推荐视频的评分用作一个特征变量。

当然，这个时候我们还可以引入其他的重要变量，比如性别、年龄组、地区等等，用来排除这些因素的干扰。直接研究这两者之间的关系一般来说是一个有难度的工作。比如你很可能并没有那么全面的数据，也有可能这两个变量都需要做一些变形，还可能负例太多（也就是说有大量的用户并没有因为评分的高低而改变他们的行为）等等。

如何具体地建立这个模型我今天先不讲，但有一点是可以肯定的，那就是这样做一个分析，可以很好地帮助你了解优化对象和长期目标之间的联系。

我们不仅需要了解第一层级和第五层级指标之间的关系，每一个层级之间的关系也是需要去研究的，这样才能更加全面地了解自己的产品。这一步就是把之前分散的五个层级打通的重要步骤，也就是如何建立一个立体体系的关键。

那么，如果出现了这样的情况，长期运作的第一层级指标和自己的长期目标没有联系，该怎么办呢？第一，祝贺你，你进入了真实的产品运作环境。从很多产品的长期运作经验来看，很多传统的指标特别是教科书上的指标，都和真实的长期指标有很弱的关系，甚至根本没有太大的联系。第二，这会帮你早日抛弃错误的优化目标，转向更加正确的道路。

寻找一个正确的第一、第二层级的指标，让这个指标和最后第五层次的长期目标之间有正向联系，就是能够持续不断地推动产品前进的一个重要动力。因为这个因素，产品团队才能够不断地试错，但不会失去大方向。

然而，说起来貌似很容易的事情，做起来其实是很困难的。我刚才说了，很可能有一些指标，看上去有一定的意义，但并不一定和长期目标有任何正相关。怎么才能找到恰当的指标呢？

一个简单的方法是尽可能多地记录指标，然后根据后期的实验数据和分析来确定指标之间的联系。回到刚才那个例子，就是说，我们对于一个视频网站，可以记录很多第一、第二层级的指标，有可能有上百上千个。然后我们根据数据，从这么些指标中，和最终的长期目标做回归分析，建立一些备选集。

这里需要数据、也需要经验。我们还可能发现，最终的长期目标和好多第一或者第二层级的指标都有关系，这也是很正常的。这就说明，优化长期目标是一件复杂的事情，很多短期目标和长期目标并不是只有简单的线性关系。

当确定好了第一、第二层级的指标后，那就可以开始用机器学习的手段，把指标当做算法模型的目标函数，从而重新设计算法，使其能够开始优化新的指标。这一步也需要很高的机器学习技巧和丰富的经验，因为并不是所有的指标，都能很容易地转换成机器学习可以优化的对象。

小结

今天我为你讲了，人工智能工程师和数据科学家的一个高阶能力技巧，如何才能不断提升产品的品质。一起来回顾下要点：第一，我们要专注产品的长期目标。第二，一定要建立产品短期目标和长期目标之间的关系，从而能够在直接优化短期目标的同时间接优化长期目标。

最后，给你留一个思考题，请你认真想一想，对于我们上面举例的推荐视频网站来说，有哪些第一或者第二层级的指标和用户的活跃程度有关呢？

欢迎你给我留言，和我一起讨论。

045 | 职场话题：当数据科学家遇见产品团队

我们在之前的分享中已经聊了数据科学家应该具备的基本能力，主要是希望从机器学习、统计知识、系统知识等方面给你一个完整的基本知识框架。然后我们聊了一些数据科学家的高阶能力，主要是能够通过分析产品、建立产品的评估体系以及对产品的长短期目标进行建模来系统性地提升产品性能。

今天我们就把话题从数据科学家和人工智能算法工程师自身的修养和提升，扩展到一个更大的范围，那就是在职场中必然会遇到的发展和协作问题，我们来聊聊数据科学家和产品团队的关系这个话题。

作为数据科学家或者算法专家，不知道你有没有遇到过这样的场景：

你正在开发最新的推荐算法，产品经理找到你说，希望给在北京的女性用户推荐一款红色的高跟鞋；

你正在研究如何使用最新的深度学习技术来提高搜索结果，产品的设计师告诉你，产品团队现在决定在近期做一个推广，需要在搜索结果上方展示一个很大的条幅，使得整个搜索页面往下移动了不少；

你正在给公司的广告系统设计新的模型，产品的营销人员告诉你，这周需要展示给用户的折扣信息，广告位从以前的 6 个变成了 3 个。相信类似的场景你应该不陌生。这也就是我们今天要探讨的问题，数据科学家如何在一个更加广阔的环境中协作。

数据科学家和产品团队的关系会出问题吗？

数据科学家和产品团队究竟有着怎样的关系呢？先理清楚这个问题，我们才能去探讨这样的关系会有怎样的互相依赖以及可能存在的问题。

在很多数据驱动的互联网公司，产品团队（Product Team）和工程团队（Engineering Team）往往是实施一个具体产品的两个关键的力量。

产品团队通常情况下是产品经理领军，拥有各类不同的产品负责人、设计师、UI 设计师等人员对整个产品的设计、理念进行把关和掌控。

工程团队则主要是工程经理领军，各类架构师、算法工程师、前端工程师、数据库工程师等人员对整个产品的工程技术甚至运行维护进行把关和掌控。

在这个产品的图谱里，数据科学家所组成的“人工智能”团队有可能是独立于产品团队和工程团队的第三方力量，也可能是属于工程团队的一部分。这两种情况其实也略有不同。我们在这里就简化讨论一种情况，那就是数据科学家所在的团队和产品团队并不完全是一个团队的情况。

从大的格局来说，不管是什么团队，产品人员也好，工程师人员也好，都是为了产品的进步和提高出谋划策的，都是希望产品能够越做越好的。这一点毋容置疑。

然而，由于不同的团队分工以及各类人员不同的专业背景，在如何能够让产品做得越来越好这一点上可能就会存在不同的意见，甚至是严重分歧。设计人员可能认为产品下一步最大的可能性来自于更加简洁明亮的设计风格；产品营销人员可能认为用户应该会对下一场促销更感兴趣；工程师可能认为下一步需要整个团队重写一个重要框架代码，让页面渲染速度得到提升从而使得用户体验得到改善；数据科学家或者算法工程师正在考虑开发一个更加复杂的机器学习模型，来提升产品的智能响应；产品经理也许在想着如何做一个全新的手机界面，来体现一种新的用户生活体验。

这些想法也许都对产品有益，甚至都能让产品或多或少有所进步。但是，我们经常看到的是，不同背景的人员都对自己的专业很自信，有时候甚至是“过度 " 自信，从而只相信自己所处岗位所能发挥的作用。从数据科学家这个角度来说，因为大数据、机器学习以及其他人工智能技术手段的不断进步，可能就会导致我们过分强调算法和模型对产品带来的影响，而忽略了产品是一个非常有机的整体。

在这样的情况下，作为数据科学家或者人工智能工程师，往往会遇到我们今天开始提及的情景。一方面你在做着自己认为能让产品有最大收益的事情，而另一方面，整个产品有机整体的各个部分都在运作着，有可能会“破坏”掉你所做过的或者正在做的努力。如果这时候数据科学家以一种算法第一的心态看待产品，就会发现自己的工作非常难以展开，也会和产品的其他部门产生矛盾。

另外一种情形是，产品经理或者产品部门对机器学习或人工智能抱有不切实际的幻想，认为这是解决一切问题的灵丹妙药。于是所有和产品进步相关的想法都希望通过人工智能来得以实现，这无疑给数据科学家和工程师增加了很大的压力。

然而不管处在哪种场景中，我们都可以看到，数据科学作为一个技术工程范畴和其所从事的人，数据科学家，无疑都是在一个复杂的环境中对产品起着作用。要想充分发挥出数据科学的作用，我们必须深入理解数据科学家和产品团队的关系，从而打造一个有机的产品团队生态体，使得处于各个职能的人员都能够在一个和谐竞争的状态下对产品有所贡献。

如何把握数据科学家和产品团队的关系

既然我们聊到了数据科学家或者人工智能工程师和产品团队之间的微妙关系，那么，有没有什么方法能够让这种关系变得更加明朗，更有利于数据科学发挥出更大的作用呢？

首先有一点很重要，也是整个团队需要先明确的是，数据科学、人工智能在现阶段来说，依然是大多数产品的“奢侈品”。什么意思呢？也就是说，没有很多基础设施的建设，没有一些最基本的产品功能，没有最简单的数据链路，就不可能应用最基本的数据科学，也不可能对产品进行持续提高。正因为此，数据科学家其实应该和产品经理建立好关系，从而能够从一开始就心系整个产品的发展，能够有一颗包容的心，为产品能够快速达到这个最基本的状态出谋划策，同时也要让整个产品时刻都处于这个状态。

这里面涉及到一个“教育”和“再教育”的问题。不是所有的产品人员都对人工智能有所了解，也不是所有的产品人员对数据链条的概念都有所耳闻。比方说，产品的数据是通过前端的一段 JavaScript 代码进行数据传输的，而这段代码可能和某一个产品的界面设计有紧耦合。当设计人员“突然”对现在的设计进行了更改，满心希望这样的更改可以改进产品，哪知道这也许反而“破坏”了这段收集数据的代码，从而使得数据链条断裂，而机器学习的某些代码可能就无法正常运行，或者模型接收到的是垃圾数据。在传统的观念里，一位设计师，可能很难理解为什么自己的工作会和机器学习紧密结合。所以，这就需要数据科学家和各个岗位的人员去交流、去沟通，让更多的人能够理解数据产品的涵义。

其次，数据科学和人工智能让产品成为一个有机整体。我们一定要去理解产品效果的复杂性和组合性。比方说，在很多互联网产品中，通过经验我们经常能够发现，产品外观设计的改变，常常能够带来比纯算法改变好得多的效果提升，而很多营销手段又常常能够几倍地提高用户对产品的转化率，也使得产品的效果得以提升。当然了，这并不是说，夸大任何一方面就能够让产品有更大的提高。实际上，产品的最优情况往往是各个方面的一个复杂的协调平衡状态。因此，理解数据科学在整个大环境中的位置就十分重要。

最后还有一个可以去做的，那就是看如何利用人工智能和数据科学去帮助产品团队的其他人员，比如能否帮助设计师和前端找到更好的创意，能否帮助产品经理找到更好的产品迭代方法等等，让人工智能和数据科学融入到整个产品完整的图谱中，要比提高单个算法更有意义。

小结

今天我为你讲了人工智能工程师和数据科学家所面临的一个重要的职场话题，那就是如何把握和产品部门的其他人员的关系。

一起来回顾下要点：第一，我们简要剖析了数据科学家和产品团队之间可能产生问题的原因和一些经典的情况。第二，我们分析了要去更好地推动这个关系，有哪些需要注意的地方，有哪些可以做的事情。

最后，给你留一个思考题，如果营销人员告诉你一个他们的方案，但这会影响你所负责的产品算法的呈现，这个时候你会怎么做呢？

欢迎你给我留言，和我一起讨论。

046 | 职场话题：数据科学家应聘要具备哪些能力？

周一，我们探讨了在公司内部，数据科学家和产品团队的其他职能人员在协作中都会遇到哪些问题，以及如何看待数据科学家或者人工智能工程师所做的算法性工作在一个产品发展中的位置。

那么，今天我们稍微换一个方向，来讨论数据科学家和算法工程师在应聘方面的问题。一起来看看，作为数据科学家，在面试一家公司时，究竟应该怎么准备，有哪些信息是需要了解的。

希望今天的内容对正在思考进入这个行业的年轻学者、工程师有所帮助，从大的方向上为你的应聘提供一些可借鉴的内容。

数据科学家应聘的“硬”实力

对于数据科学家或者人工智能工程师来说，最核心的竞争力无疑是他们对人工智能、机器学习等技术的知识积累以及融会贯通的能力。

我们之前的一系列分享中已经提到了这些“硬”实力的大范畴，这里我做一个简单的归纳。

首先，我们需要理解和掌握一些机器学习的基本概念和理论。

第一个重点无疑就是监督学习。

什么是监督学习呢？监督学习就是指我们通过外部的响应变量（Response Variable）来指导模型学习我们关心的任务从而达到我们需要的目的这一过程。监督学习中需要彻底掌握三个最基础的模型，包括线性回归（Linear Regression）、对数几率回归（Logistic Regression）和决策树（Decision Trees）。

怎么理解我说的“彻底掌握”呢？这里的彻底掌握有三层含义。

第一，需要了解这些模型的数学含义，能够理解这些模型的假设和解法。比如，线性回归或者对数几率回归的目标函数是什么；写好了目标函数之后，如何求解最优解的过程。对于这些核心模型，必须能够做到完全没有差错地理解。

第二，需要了解什么场景下使用这些模型是最合适的，以及怎样把一个实际问题转化成为这些模型的应用，如果不能直接转换还有什么差距。

第三，能不能写实际的代码或者伪代码来描述这些模型的算法，真正达到对这些算法的掌握。

监督学习当然不限于这三个算法，但是这三个算法是绝大多数机器学习任务在工业界应用的起点，也是学习其他算法模型的支点，可以按照这个思路去了解更多的算法。在面试中，能够对这些基本算法的理解有扎实的基本功，这一点很重要。

了解机器学习的第二个重点就是无监督学习。

无监督学习并没有明显的响应变量，其核心往往是希望发现数据内部潜在的结构和规律，从而为我们进行下一步决断提供参考。

从面试角度来说，“K 均值算法”往往是考察数据科学家整个无监督学习能力的一个核心点。因此，对于这个算法有必要认真学习，做到真正的、彻底的理解。

怎么学习呢？和前面我们提到的监督学习一样，也需要从编程实现和算法本身两个方面入手对 K 均值进行把握。在掌握了 K 均值之后，还可以进一步去了解一些基于概率模型的聚类方法，扩宽视野，比如“高斯混合模型”（Gaussian Mixture Model）。

其次，虽然机器学习和统计学习有不少的重合部分，但是对于合格的数据科学家和人工智能工程师来说，一些机器学习方向不太容易覆盖到的统计题目也是需要掌握的。

第一，我们必须去理解和掌握一些核心的概率分布，包括离散分布和连续分布。这里的重点不仅仅是能够理解概念，而且是能够使用这些概率分布去描述一个真实的场景，并且能够去对这个场景进行抽象建模。

第二，那就是要理解假设检验。这往往是被数据科学家和算法工程师彻底遗忘的一个内容。我们要熟悉假设检验的基本设定和它们背后的假设，清楚这些假设在什么情况下可以使用，如果假设被违背了的话，又需要做哪些工作去弥补。

第三，那就是去学习和理解因果推断（Casual Inference）。这虽然不是经典的统计内容，但是近年来受到越来越多的关注。很多学者和工程师正在利用因果推断来研究机器学习模型所得结果的原因。

再次，还有一个很重要的“硬”技能，就是要对系统有一个基本了解。

第一，就是具备最基本的编程能力，对数据结构和基础算法有一定的掌握。编程语言上，近年来，Python 可以说受到了诸多数据相关从业人员的青睐。因为其语言的自身特点，相对于其他语言而言，比如 C++ 或者 Java，Python 对于从业人员来说是降低了学习和掌握的难度。但另一方面，我们也要意识到，大多数人工智能产品是一个复杂的产品链路。整个链路上通常是需要对多个语言环境都有所了解的。因此，掌握 Python，再学习一两个其他的语言，这时候选择 Java 或者 C++，是十分必要的。另外，很多公司都采用大数据环境，比如 Hadoop、Spark 等来对数据进行整合和挖掘，了解这些技术对于应聘者来常常说是一个让用人单位觉得不错的“加分项”。

第二，就是对于搭建一个人工智能系统（比如搜索系统、人脸识别系统、图像检索系统、推荐系统等）有最基本的认识。机器学习算法能够真正应用到现实的产品中去，必须要依靠一个完整的系统链路，这里面有数据链路的设计、整体系统的架构、甚至前后端的衔接等多方面的知识。考察候选人这方面的能力是查看候选人能否把算法落地的一个最简单的方式。因此，从我们准备面试的角度来说，这部分的内容往往就是初学者需要花更多时间了解和进阶的地方。

数据科学家应聘的“软”实力

前面我们聊了数据科学家应聘的“硬”技能，下面，我们再来看看候选人还需要注意和培养哪些“软”技能。

数据科学家的第一“软”技能就是如何把一个业务需求转化成机器学习设置的“翻译”能力。

什么意思呢？和纯理论学习的情况有所不同，大多数真实的业务场景都是非常复杂的。当产品经理提到一个产品构思的时候，当设计人员想到一个业务创新的时候，没有人能够告诉你，作为一个数据科学家而言，这个问题是监督学习的问题还是无监督学习问题，这个问题是可以转换成一个分类问题还是一个回归问题。有时候，你会发现好像几条路都走得通。因此，如何能够从逻辑上，从这些不同的设置所依赖的假设上来对业务场景进行分析，就成了数据科学家必不可少的一个核心能力。

分析业务场景这个“软”技能的确非常依赖工作经验。这里不仅仅是一个机器学习问题的“翻译”，还需要对整个系统搭建有所了解，因为真正合适的场景“翻译”往往是机器学习的问题设置和系统局限性的一个平衡和结合。举一个例子，一个推荐系统需要在百毫秒级给一个用户进行推荐，那么相应的方案就必然有一个计算复杂度的限制。

因此，场景的“翻译”其实是考察数据科学家和人工智能工程师的一个非常重要的步骤，也是看候选人是否真正能够学以致用的有效手段。

说到这里，你是不是会有疑问：如果我没有相关的从业经验，那如何来锻炼这种“翻译”能力呢？

其实，现在丰富的互联网产品已经为我们提供了一个无形的平台。当你在现实中看到一个真实产品的时候，比如京东的产品搜索、科大讯飞的语音识别系统等等，你设想一下，如果你是设计者，如果你是需要实现这个产品功能的数据科学家，你会怎么做？

实际上，很多面试问题，都是面试官直接询问你对某一个现成产品的设计思路，比如谷歌的面试官可能会询问你如何设计一个搜索查询关键字拼写检查组件。这个方法一方面是帮助你“开脑洞”，另一方面也是一种非常好的思维锻炼。

另外一个很重要的“软”技能就是数据科学家的沟通表达能力。

这可能会让有一些人感到意外，因为大家也许认为数据科学家和人工智能工程师完全是技术岗位，并不需要与人打交道。其实，这个理解是片面的。就像刚才提到的，数据科学家的一个重要职责就是把现实的业务场景“翻译”成机器学习的设置，那么在这个过程中，会和业务人员、其他工程师、科学家进行高频的沟通和交流。如何把你的思路、方案清晰地表达给同事和团队成员是非常重要的职责。

实际上，数据科学家不仅在公司内部承载着的这样的沟通任务，我们往往还需要在社区中做演讲、参与讲座等活动，成为社区中的一份子，都离不开沟通表达能力的磨练。

如何锻炼沟通表达能力呢？这里，我给初学者一个简单而实用的方法，那就是用一两句话来总结你的方案。你尝试用一小段话，但是不夹带任何专业术语，把你的方案说给不懂机器学习的人听。这个训练方法可以让你反复思考，直到找到一个最简洁有力的表达。

小结

今天我为你讲了人工智能工程师和数据科学家的一个重要的职场话题，那就是作为数据科学家应聘时需具备的“硬”实力和“软”实力。

一起来回顾下要点：第一，我们讨论了机器学习、统计知识和系统这三大“硬”实力。第二，我们分析了场景翻译和沟通能力这两个“软”实力。

最后，给你留一个思考题，当下深度学习框架大行其道，那么对于应聘来说，你觉得了解和掌握各种深度学习框架会让你更有优势吗？

欢迎你给我留言，和我一起讨论。

047 | 职场话题：聊聊数据科学家的职场规划

今天，我们继续来聊数据科学家或者人工智能工程师的职场话题。我们更进一步，来聊聊数据科学家的职场规划。

当然，说到职场规划，这确实是一个非常宽泛的主题。我们今天要探讨的不是数据科学家“应该”怎么发展，而是说，有哪些职业发展的“可能性”，希望能够为你规划自己的职业生涯起到一个抛砖引玉的作用。

数据科学家的“垂直发展”

数据科学家一个最直接的职场规划，就是在技术线上持续发展，逐渐成为一个技术专家。目前，不同公司对数据科学家类型，这里包括研究科学家、算法专家、人工智能工程师等职位的职业生涯设置并没有完全统一的模式。但是，数据科学家类型的职位在技术线上大体有这么几个台阶可以发展。

第一个台阶是“初级数据科学家”。

这个台阶对应很多公司入门级别的数据科学家，并且大概是对应博士生毕业直接入职，或者硕士生有 2-3 年工作经验后入职这样的情况。这个阶段的数据科学家，其主要职能是在一个比较大型的产品解决方案中，完成一个小的模块或者任务。当然，也可以是，在一个比较小型的产品解决方案中，完成较大的模块或者任务。

初级数据科学家对机器学习和人工智能的掌握程度主要集中于单独的算法。因为对业务需求接触不多，在如何利用模型和算法来对整个业务提供解决方案，也就是我们之前说的“翻译”业务的能力上，存在着比较大的挑战。这也是初级数据科学家在这个阶段最需要积累和进阶的部分。

下一个台阶就是“中级数据科学家”。

这个台阶对应很多公司的“高级数据科学家”（Senior Data Scientist）、“主管数据科学家”（Staff Data Scientist）。一般来说，“初级数据科学家”有 1-3 年工作经验之后就有机会晋升到“高级数据科学家”，然后再有 1-3 年工作经验之后就有机会晋升到“主管数据科学家”。“主管数据科学家”平均应该有 5 年左右的从业经验。

对于这个台阶的数据科学家而言，已经可以承担一个比较大型的产品解决方案的绝大部分甚至全部的模块和任务。并且在团队内部，这个台阶的数据科学家已经可以指导绝大多数的初级数据科学家。同时，这个级别的数据科学家对公司的整个宏观产品线有了更多的认识，对业务需求的“翻译”能力有很大幅度的提升。在纯技术层面，“中级数据科学家”对于机器学习和人工智能算法模型的把握已经跳出了单独一个算法或者模型的层面，可以比较好地去把握一个方向，特别是有可能的新的研究方向。

最后一个台阶，我称之为“高级数据科学家”。

这个台阶对应很多公司的“资深主管数据科学家”（Senior Staff Data Scientist）、“主任数据科学家”（Principal Data Scientist）以及其他更高的职位。一般来说，成为“中级数据科学家”后，再有 1-3 年的工作经验可以晋升到这个台阶。“高级数据科学家”平均应该有 5-7 年的从业经验。

对于这个台阶的数据科学家而言，基本上已经算是行业的专家，对某一个类型或者某几个类型的产品解决方案有深刻洞察。另外一个能力就是这个台阶的数据科学家相对比较容易举一反三，能够对新的产品或者新场景下的解决方案有相对快速和成熟的理解。在团队内部，这个台阶的数据科学家处于整个团队的核心的位置，对“中级数据科学家”和“初级数据科学家”都能够起到很好的指导作用。在纯技术层面，可以针对机器学习和人工智能过去 20 年的大部分算法融会贯通，能够带领团队对一系列新的研究方向有比较好的把握。

数据科学家的“升级发展”

数据科学家的另外一种职场规划，其实也和众多工程师的规划类似，那就是转到“管理线”或者叫“技术管理”的岗位，特别是管理和数据科学、人工智能直接相关的团队。

数据科学家对于管理职位的优势是，他们有着在这样团队中工作和运行的第一手经验和资料。这些也为数据科学家转到管理职位提供了一些先天的背景优势。

因为人工智能团队或者数据科学团队具有高度专业化和技术化的特点，没有相关技术背景的管理人员，会非常难以胜任这样的角色。主要表现在以下几个方面。

第一，这些团队往往意味着需要招聘、管理和拓展一个由硕士和博士背景为主体的团队，完全理解和体会这个人群的需求以及这种团队对于工程、技术等方面的独特需求，对于一般背景的技术管理人才来说可能会比较困难。

第二，这个技术管理职位往往需要和技术社区，特别是人工智能社区有一个积极的交互。完全没有相关技术背景，在这样的社区立足并且作为一个领导者得以发展，相对比较困难。

第三，当然还是在技术方案上，因为专业性过强，如果技术管理人员没有背景，就无法对方案进行评估，然后就变成了完全的“人事经理”（People Manager）。

除了从人工智能团队管理岗位入手以外，数据科学家还可以挑战和人工智能有关的一些管理岗位，比如数据，或者有时候叫大数据部门。这些部门和人工智能部门经常紧密合作，所以数据科学家也算是对这些部门耳濡目染，相对来说有着比较清晰的认识。

毋容置疑，数据科学家从纯技术岗位到管理岗位的转换过程中，肯定会面临不少困难。对于有志转岗的数据科学家来说，他们往往在纯技术岗位上工作得比较优秀，一些管理的机会自然出现，于是也就顺理成章地转了过去。然而，对于这些优秀的纯技术人员来说，比如“中级”或者“高级”数据科学家，真正的挑战在于，如何能够去领导一个团队去完成一个使命。一些优秀的数据科学家因为自身条件优异，往往存在大包大揽的情况，希望靠自己的能力做出比整个团队还要好的成绩，反而在管理岗上无法施展应有的水平。其实，如何做一个优秀的人工智能技术管理者，这还是一个非常有新意和挑战的话题，篇幅有限，今天就不展开了。

数据科学家的“跨界发展”

除了我们刚才说的在纯技术岗位的发展以及往管理职位发展以外，数据科学家其实还有一些横向发展的机会。

比如，最“无缝”发展的就是在工程团队或者数据分析类团队之间进行转换。因为数据科学家的工作性质，这两类团队的工作或多或少都已经包含在了数据科学家的日常工作中了。因此，数据科学家可以比较自然地转换到这些团队中。当然，这里还是需要对一些技能进行加强培训。

另外，数据科学家其实比较适合转移到产品经理岗位。在“中级数据科学家”之后，这些技术人员需要对业务、对整个产品有比较深入的理解，包括需求、数据、工程技术等，才能对一个产品提出比较合适和成熟的解决方案。另外，数据科学家还需要不断提升产品的质量水平，这里面其实就有不少产品经理的角色。因此，数据科学家算是具备成为一个产品经理的一些条件。不过，我们这里要指出的是，数据科学家的整个背景训练主要是以纯技术为主，特别是人工智能算法，因此转换到产品经理的时候，可能往往过分强调算法的力量，而忽视整个产品的其他方面。所以，即便是一个成熟的数据科学家依然需要一段时间的培养和培训，才能够转换到产品经理的角色。

小结

今天我为你讲了人工智能工程师和数据科学家的职场规划问题。一起来回顾下要点：第一，我们简单介绍了最为自然的一条发展途径，走纯技术的路子，数据科学家可以有怎样的一条道路向前发展。第二，我们分析了从技术岗位到管理岗位的一个转换，数据科学家又有什么优势。第三，我们简单讲了从数据科学家到其他类型职位一个转换的问题。

最后，给你留一个思考题，你有没有什么方法，可以知道自己比较适合什么样的职业发展规划呢？

欢迎你给我留言，和我一起讨论。

054 | 数据科学团队养成：电话面试指南

眼下，数据科学或者人工智能团队已经成了很多数据驱动公司的标准配置团队，数据科学家或者人工智能工程师也成为了最“性感”的职业。不少公司都在想办法建立或者扩展自己的数据科学团队。那么，对于一个公司来说，究竟需要什么样的数据科学团队呢？这就成了很多公司在发展过程中都会遇到的棘手的问题。

我们在之前的一篇分享里已经剖析过，作为一个工程团队的负责人，你该如何招聘自己的数据科学家团队。在那篇分享里，我们探讨了目前人才市场上大致有两类数据科学家，一类偏数据分析，一类偏算法模型。并且我们详细探聊了聊这两类数据科学家所需的技能和在不同团队（比如大团队和小团队）中起到的作用。

今天，我们来聊一聊组建数据科学家团队所必不可少的一个步骤：电话面试。

筛选简历

在电话面试之前，有一个步骤是必不可少的，那就是筛选简历。因为人工智能和数据科学家的职业背景的原因，我来分享一下如何筛选具有博士学历，特别是计算机专业相关毕业生的简历。筛选简历的过程需要很细心，对于普通的博士毕业生，我们会快速看以下两个方面的信息。

第一，候选人是否有高水平的论文发表。关于论文发表，首先需要看的是论文档次，也就是论文是否发表在高质量的会议上或者高水平的期刊上。对于计算机专业的博士生来说，会议一般比期刊更重要。其次，我们也要看候选人的论文是专注一个问题或者一个小领域还是很多领域都有涉猎。同时，对于这些论文，要关注候选人是第几作者。然后，我们需要关注的是论文发表频率，看论文工作是否都是一年做出来的。最后，我们可以去看一看这些论文的引用数。一般来说，博士刚毕业不会有很高的论文引用量，但也不乏水平比较高的候选人，论文会有惊人的引用量。

第二，我们需要看一看候选人是否有工业界实习经历，是研究实习还是工程实习。这里面，我们可能关注的是实习的公司。而且，我们可以关注是否是同一家公司还是多个公司。如果是研究实习的话，我们还需要去看一看候选人是否有相应的论文发表。

在看了这两个因素之后，我们心中对于这个候选人就有一个很基本的认识。在需要高标准的情况下，一个博士毕业生需要有 3-4 篇第一作者的高水平论文发表（在毕业的时候，引用数在 70-100 左右），然后有 1-2 次工业界实习经验。

除了这两个硬指标以外，我们还会关注下面这些内容：

简历里是否有一些信息不完整的部分。比如有一些明显断档的经历，没有本科学校，没有说明博士生导师；

会什么编程语言和开发工具。是否只熟悉 Matlab 或者 R，是否有开源项目贡献；

是否已经有审稿经验；

是否已经有组织会议的经验。

所有这些因素都没有明显问题之后，我们已经定位到了比较靠谱的候选人（通常，只有少数人能够通过上面这轮简历筛选）。我们可以根据实际情况来调整在筛选简历这里的标准线从而让候选人能够和我们直接交流证明自己的实力。

这里再说几个比较细的准则：

博士生的论文中，非第一作者的一般不算数；

已经发表的会议论文和同一内容的期刊文章算一篇；

可以有非第一档次会议或者期刊的论文，但没有第一档次就很难说明问题；

如果有单一作者的论文，是一个比较大的问题，电话面试的时候一定要问清楚原因；

课程项目原则上也不算数（注意，这是对博士毕业生而言）；

简历是 LaTex 生成还是 Word；

毕业学校和 GPA，一般不是很侧重要考虑的问题。

再说几个对于已经有工作经验的候选人的简历筛选要素：

如果有教职经验或者博士后经验，原则上是一个大问题，需要电话面试问清楚；

一两年左右频繁换公司是一个大问题，需要电话面试问清楚。

这里要多说一句的是，上面这些标准是对计算机相关专业比较适用的准则。而对于数学、应用数学、统计、物理等专业的人来说，可能有些标准需要重新设定（比如发表论文的标准需要降低）。总之，这里说的是一些比较大的方向，不过在把握了这些原则之后，我们就可以安排少量的候选人电话面试了。

这里我们简单说一下对于硕士阶段的候选人的简历筛选。一般来说，硕士和博士有不同的培养目标，因此上面所说的很多标准和原则对硕士毕业生并没有完全的指导意义。对于硕士毕业生来说，公司实习经验是很重要的。不排除一些优秀的硕士毕业生已经有论文发表，因此这方面也可以降低一些标准来衡量。对于硕士毕业生来说，学科项目可以作为一些参考，不过因为大多数学科项目都没有真正的应用性，我们只能从一个侧面了解这个候选人可能具备的一些技能。

电话面试

筛简历的过程之后，就是电话面试了。电话面试的目的是要验证这个候选人是不是像简历里所说的那样有相应的经历。当然，有一些公司在电话面试的时候也会考察候选人解决问题的能力，这个内容也会经常出现在电话面试的安排中。对于科学家的职位，我们一般需要 1-3 轮电话面试，来了解下面这些信息：

了解候选人简历上的基本信息，如果对简历上的内容有疑点，需要在这个阶段问清楚；

考察候选人是否具备基本的专业知识，并对相关领域有一定的见解，考察候选人是否有其他领域的知识；

考察候选人是否有基本的专业相关的编写代码能力；

初步感知候选人的表达能力。

在询问候选人简历信息的时候，以下这些内容是需要弄明白的：

对于候选人是第一作者的论文，候选人是否能够很清晰地说出这些论文所解决的问题及解决思路。在进一步的沟通里，候选人是否能够讲清楚模型细节甚至是公式细节。候选人能否把实验的目的、数据、比较算法讲清楚。当然，这需要面试官提前做好准备。同时，询问候选人其他作者在这篇论文中的贡献；

对于候选人是非第一作者的论文，询问候选人在这个工作中起到了什么作用。看候选人是否诚实可信，也可以看出候选人的学术道德水平；

对于单一作者的文章，需要候选人解释为什么这个工作没有合作人，博士生导师为什么不是合作者，这个论文的研究时间如何而来；

对于有博士后经验或者教职经验的候选人，要询问候选人是否了解工业界研究和学术界研究的区别，如果以后有机会，是否还考虑学术界教职；

对于有工作经验的候选人，要询问候选人反复换工作的原因，询问清楚候选人在项目里的具体贡献，候选人的职业规划，看职业规划和简历经历是否相吻合。对于在某一个公司待了很长时间没有升职的候选人，也需要询问一下为何在原公司里没有其他机会。

在考察候选人专业知识的时候，需要弄明白以下这些内容：

对于某一专业最基础的一些概念和知识，候选人是否能够清晰地讲解出来。这一条其实很多人很难做到，不少人能够做复杂的工作，却往往在最基础的内容上含混不清。而在一些跨领域的工作中，基础知识往往是一个科学家所能够依赖的，提供解决方案的最初的工具。所以，基础很重要；

候选人是否能诚实地说明自己懂什么，不懂什么。在广泛的领域里，科学家应该有足够的自信说自己的专长是什么，自己的局限在哪里；

候选人是否对跨领域知识一窍不通，还是略有知晓，界限在哪里；

在考察编程水平方面，虽然很多公司已经有比较完备的方案考察软件工程师，但这些题目和考察目的其实不太适合科学家，这需要公司专门针对科学家制定一些考察题目。

在上述考察候选人各个方面的过程中，一个贯穿始终的主题就是要看候选人是不是能和面试人员进行有效的沟通。当然，也要考虑到，有人可能不太适应电话面试，而在面对面的交流时则毫无问题。

小结

今天我们分析了组建一个数据科学或者人工智能工程师团队，你需要招聘什么样的数据科学家。我们重点讲了讲如何筛选博士阶段候选人的简历以及电话面试的问题，我们是从招聘的角度来讲这个问题，那么从应聘的角度来看，也希望能给你一些启发和借鉴。

最后，给你留一个思考题，如果一个候选人并没有什么论文，但是有多年的企业经验，如何来衡量这样的候选人呢？

欢迎你给我留言，和我一起讨论。

055 | 数据科学团队养成：Onsite面试面面观

本周我们来聊数据科学或者人工智能团队的招聘话题。周一的分享里，我们聊了聊组建数据科学家团队所必不可少的两个步骤，筛选简历和电话面试。我们着重从招聘博士毕业生的角度对这两个环节进行了剖析，梳理了如何看简历，以及在电话面试时需要考察哪些内容。

今天，我们来聊一聊电话面试后面的一个环节，也就是邀请候选人到公司面试，俗称 Onsite 面试。

从电话面试到 Onsite 面试

电话面试之后，如何判断是否要邀请候选人到公司来面试呢？一般来说，有这么两种情况是需要邀请候选人到公司来面试的，从而进一步判断候选人的水平。

第一，候选人的简历以及其在电话面试中表现的水平很高，的确是公司需要的人才。这样的候选人进入 Onsite 面试的通道是水到渠成的，要加快速度实施公司招聘流水线的后面步骤。对于这样的候选人来说，Onsite 面试主要是要考察候选人有没有其他特殊情况，导致其无法胜任工作。

第二，候选人的简历或电话面试中的表现存在争议。可能在好几轮的电话面试中，候选人在其中有些轮的表现要明显好于其他轮；或者候选人得到了很多好评，但是也有一些比较负面的评价。这个时候，我们采取不“一棒子打死”的态度，往往希望能够邀请候选人到公司来仔细考察。

Onsite 面试

在经历了简历筛选和电话面试的流程之后，我们已经对候选人有了一个初步的了解：他（她）的背景、熟悉以及不熟悉的领域、编程能力和沟通能力。对于各方面都表现不错的候选人，我们一般就会安排到公司来进行现场面试。对于科学家岗位，现场面试一般包括下面这些环节：

一场一个小时左右的学术报告会；

和招聘经理讨论可能的项目方向；

和其他科学家、工程师讨论技术和研究问题；

在白板上展示基本的编程开发能力；

和人事讨论职位的其他问题。

学术报告会是考察候选人学术水平的一个非常重要的环节。因为简历和电话面试都无法系统地看出候选人的整个学术生涯的特征，比如是偏理论还是偏应用？是蜻蜓点水似的研究，还是专注某几个问题？这样我们能够看到候选人的整个学术生涯的清晰明确的线条。

同时，报告会还是观察候选人语言能力的好机会，看候选人是否有较强的语言组织能力，能够清晰地表达自己。这一点之所以关键是因为有一些候选人连自己的工作都讲不清楚。

另外一个需要考察的就是，看候选人能否在公开场合接受各种质疑和对自己工作的挑战，包括候选人是否能够承认自己工作的局限和不足，是否能够礼貌且“一语中的”（To-The-Point）地回答技术问题。

和招聘经理讨论可能的项目方向，很多候选人显得很随意，觉得这就是闲聊。其实这也是考察候选人的一个很重要的机会。

首先，招聘经理可以说一些公司的产品或是项目，看看候选人是否有兴趣，是否能够通过一些简单的产品介绍，问出一些有科学价值的问题。会问问题，其实是一个非常重要的技能。

招聘经理也可以稍微深入地讨论一两个产品具体的现实问题，看候选人能否快速说出一些解决方案或者是一些思路。在整个谈话中，可以体会出候选人是否只有学术的经验而没有任何产品和产业的“感觉”（Sense）。有一些候选人在这个阶段会显得没法把谈话进行下去，完全是倾听问不出任何问题。这就需要招聘经理仔细控制谈话，来看候选人是否对新事物有好奇心，是否能够跟上思路，是否对新领域新问题有快速的思考。

和参加面试的科学家以及工程师讨论研究问题，主要考察的是候选人在一个类似工作的环境里能否“半”独立地完成科研解决方案的设计和实现。为什么说“半”独立，是因为这个环节里，沟通也是很重要的，很多条件、约束和限制都需要候选人和面试人员进行有效沟通来理解清楚。因此，候选人面对的并不完全是“应用题”似的独立解决问题的场景。

通常的形式是，面试人员针对某个具体的问题，询问候选人如何提供一个有效的科学解决方案。这里面需要注意下面这些环节。

1. 候选人能否问出有效的问题，这些问题是不是在帮助候选人自己减少问题的不确定性，帮助候选人自己寻找答案，还是漫无目的地问各种问题。

2. 候选人是不是不假思索地就提供一些思路，然后也没有认真思考，又反反复复更换思路。这是候选人没有系统思维能力的一个体现。

3. 候选人的整体思维模式是怎样的？

一般说来，有两种思维模式。第一种是先提出一个可能的多步骤解决方案，然后看是否能够简化步骤，再看能否提出比较规范的数学模型；第二种思维模式是先提出比较完整的数学模型，然后根据实际情况简化，提出更加快速的算法。

这两种思维模式都是行之有效的思维方式。但是也有候选人在两者之间踌躇，一方面提不出基本的解决方案，一方面也写不出完整的数学模型来。

4. 候选人能否在提出基本方案或者是数学模型之后，用自己掌握的方法把问题的细节算法写出来，并且能够分析算法的各方面特征。这考察的是候选人解决问题的连贯性和独立性。有一些候选人的确能够写出漂亮的数学模型，但是很可能完全没办法把模型算法化，写出来的程序惨不忍睹。

5. 还有一个需要考察的维度就是，候选人遇到领域之外的问题，是如何思考的。有的候选人就彻底懵了，完全不能理性地提出方案。而有的候选人则会小心翼翼地利用基础知识，尝试解决问题，或者是把新领域的问题转化成自己熟悉的问题。

值得注意的是，在这个环节中表现不好的候选人，不管过去在论文、学校方面有多么优秀的经历，都要打一个大问号。事实证明，在这个阶段不那么令人满意的候选人，在现实工作中往往也很难胜任实际的工作。

对于有经验的候选人，除了重点考察能否提出优秀的解决方案外，还可以看候选人是否具有“全局观”，比如对这些问题的考量：如何设计更加有效的数据通路，没有数据怎么办，上线以后系统表现不好怎么办等。

对候选人在白板上进行基本的编程能力的测试，是整个 Onsite 考察中的另外一个核心内容。总的说来，数据科学家或者人工智能工程师的编程能力需要和普通工程师的基本相当，有些时候甚至要更高。这里面，除了考察基本的算法问题以外，还需要考察能否对普通的机器学习算法进行编程，也就是说，看候选人是否真正能够把模型或者一些算法用程序实现出来。关于候选人的编程能力问题，这是一个单独的话题，今天我们就不在这里展开了。

有一点需要留意观察，候选人的表现是否在有压力或者劳累（毕竟一天的现场面试是很累的）的情况下有重大波动。优秀的候选人能够通过沟通来缓解自己的压力。

小结

今天我们讨论了 Onsite 面试，总结一下要点：第一，我们讲了如何决定一个候选人可以从电话面试过度到 Onsite 面试；第二，我们详细梳理了 Onsite 面试方方面面的问题。希望这些内容能给你一些启发和借鉴。

最后，给你留一个思考题，Onsite 面试之后，如何来决定是否录用这个候选人呢？是不是需要所有的人都赞同？ 如果不是所有人都赞同，怎么综合意见做出最后的决定呢？

欢迎你给我留言，和我一起讨论。

056 | 成为“香饽饽”的数据科学家，如何衡量他们的工作呢？

本周我们聊了在构建一个数据科学家团队时，从筛选简历入手到电话面试，再到 Onsite 面试这一系列的流程。从无到有，建立一个数据科学家或者人工智能团队的确是一件煞费苦心的事情。

那么今天，我们来聊一聊数据科学家团队管理的下一个重要的步骤，那就是如何来衡量数据科学家或者人工智能工程师在团队中的业绩，有时候也被称为是绩效评定（Performance Review）。绩效评定的种种规则必须在团队建立的初期就明确，否则就会出现一些不定因素，对于招聘、培训以及留住人才都有着不可估量的影响。

数据科学家的价值

如何对数据科学家团队进行绩效评定呢？这个问题的核心其实是要回答，数据科学家或者人工智能工程师究竟应该（以及实际）为你的公司或者组织带来什么核心价值？只有梳理清楚这个核心问题，才能真正建立起衡量数据科学家团队的价值体系，从而达到为公司和组织赋能的目的。

那么，数据科学家团队或者人工智能工程师团队应该为企业或组织带来什么样的价值呢？

对于这类相对来说比较抽象的问题，其实很难有一个标准答案。每一个组织或者公司都有自己一套衡量价值的方式。这里我们并不追求一个统一的答案，而是希望能够为这个问题提供一些参考。

关于这个问题，在我们前面的一些分享中，其实已经提到过，那就是数据科学团队最重要的一部分价值来自于为企业或者团队引入数据驱动的决策过程，这是数据科学团队或者人工智能团队的一个核心价值。很多企业或者组织，在没有这些团队之前是无法真正做到数据驱动、持续决策的。

也就是说，“数据驱动”和“持续决策”这两点可以看作是数据科学家团队的主要价值体现。那么，怎么衡量数据科学家团队这个问题，也就变成了如何来衡量这些团队在围绕这两方面的工作中做得怎么样。

注意，我在这里其实并没有明确提及数据科学团队和人工智能团队对产品直接带来的效果，比如点击率升高了多少，用户存留增加了多少，什么产品又上线了等等。主要是出于以下两点考虑。

第一，每一个公司、每一个组织甚至是每一个产品在这些价值上都有不一样的需求，没有一个统一的模式。

第二，如果数据科学团队为组织建立起了数据驱动的持续决策过程，那么很多产品级别的性能提高或者核心功能的实现就会成为顺理成章、水到渠成的结果。相反，如果仅仅强调某一个产品性能的提升或者某一个单点技术的突破，很可能无法真正建立有效的人工智能团队，并且团队的“战斗力”也无法真正得到最大程度的发挥。

数据科学家团队的评价误区

刚才我们从一个比较大的概念上做了一个讨论，看数据科学家团队的价值应该如何来评价。但在实际操作中，往往存在两种比较明显的误区。

第一种误区是“唯技术论”。那就是觉得人工智能团队能够快速帮助公司、组织甚至是项目很快打开突破口，希望人工智能技术能够给公司业务带来突破性的发展，从而对人工智能团队有过高的预期。

在这种思路的指导下，在前期往往可能有一个比较大的热情，能够招聘到不少的人才或者能够拉起团队开始一些不错的项目。但很快，由于急功近利的心态和不切合实际的需求，常常又让人工智能团队身陷绝境。而这个时候，最容易产生的一种情绪是走另外一个极端，那就是从“唯技术论”到“技术无用论”。在这样的背景下，产品遇到的任何困难、任何失败都有可能归因到人工智能团队上。

第二种误区是对人工智能团队或者数据科学家团队心存怀疑，本质上觉得这些团队都无法真正能够帮助到团队。因此从一开始就不信任这些团队，蹑手蹑脚，在政策和发展上限制这些团队。由于这种不信任，使得人工智能团队不能真正发挥作用，因此催生了进一步的不信任，恶性循环，最终得出这样的结论，“人工智能是花瓶，没有用”。

这两种误区的核心其实是一种行为，那就是忽略了人工智能团队需要一个“生态环境”。什么生态环境？比如产品部门、数据部门以及其他的工程部门，必须协调发展。

绝大多数数据科学团队和人工智能团队都需要依赖一个比较强有力的数据部门的支持。同时，产品上，如果人工智能的算法或者模型并不能和产品有机结合，那无论如何，都是无法真正帮助产品，为产品赋能的。我们之前也提过，其实在很多时候，人工智能都是锦上添花的部分，而产品的整体呈现才是最为重要、做需要认真思考的问题。

数据科学家的评定

有了前面这些思路作为基础，我们现在来看一看数据科学家的评定的问题。

第一，对于数据科学家或者人工智能工程师来说，我们需要看他们是否对于建立、完善、和推动“数据驱动的持续决策”这一长期任务有不间断的贡献。

具体来说，那就是数据科学家或者工程师是不是在帮助建立和推动数据驱动的链路，是不是在思考如何能够更快、更好地解决数据的问题。这里的数据包括获取数据、整理数据、分析数据以及利用数据的整个流程。我们的数据科学家或者人工智能工程师应该持续在这几个方面有所贡献。

你可能会有疑问，这不是数据工程师的责任吗？没错，这确实是数据工程师的职责。但是，如果我们的科学家并不清楚数据的情况，并不了解如何进一步推动数据链路的进步，那产品线将来肯定会出问题。

同理，数据科学家也需要在帮助“持续决策”上不断做出贡献。这里主要指的是实验的平台，以及围绕着实验平台进行决策的工具，比如图表，比如更加复杂的假设检验工具，比如因果推断的工具等等。数据科学家和人工智能工程师必须要具备这样的敏感度。

第二，那就是考察数据科学家和人工智能工程师本身的职责和专长，针对某一个产品能否提出切实可行的机器学习解决方案，能否和产品部门以及其他工程部门一起，让解决方案落地。

这一点检验的就是解决方案的落地能力。当然，这里不仅仅依赖于解决方案本身，还依赖于其他的因素，比如数据，比如产品。这里面有一部分是第一点的内容，主要是评定数据科学家或者人工智能工程师对于跨部门合作以及共同构建一个人工智能生态系统的能力。这一条的重点是评定在一个较小范围内落地解决方案的能力。

第三，那就是数据科学家和人工智能工程师必须能够不断提高自我修养，能够持续学习不断进步。

这一点，可能是在所有的工程团队和产品团队里面都比较突出的。虽然所有的团队都需要不断进步，然而人工智能这个领域实在是变化太快。因此，在这个方面，人工智能相关的工作都必须要有比较不一样的评价标准。

在一些企业中，数据科学家的持续学习主要体现为参加会议、发表论文、参与学术讨论、发表开源软件等形式。如果在一些初创公司或者是暂时没有这些能力的组织中，我们也要思考如何来评价员工是不是在积极地持续学习。

小结

今天我们分析了组建一个数据科学家或人工智能团队后，你怎样来认识这个团队的价值，怎么来评价员工的工作。

简单地做个总结：第一，我们讲了数据科学家团队对于推动“数据驱动持续决策”这一目标的作用；第二，我们梳理了面对人工智能团队上可能存在的两个误区；第三，我们简单聊了聊如何在大的方面来评定数据科学家的工作。希望这些内容能给你带来一些启发和借鉴。

最后，给你留一个思考题，需不需要把人工智能团队的工作和企业的 KPI 挂钩？如果需要，该怎么挂；如果你觉得不需要，又是什么理由呢？

欢迎你给我留言，和我一起讨论。

057 | 人工智能领域知识体系更新周期只有5～6年，数据科学家如何培养？

在上一期的分享里，我们聊了数据科学家团队管理的一个重要步骤，那就是如何来衡量数据科学家或者人工智能工程师在团队中的业绩，我们重点讲了如何看待数据科学家团队的价值和数据科学家评定的一些误区。

今天，我们来聊另一个数据科学家团队的高级话题，那就是数据科学家的培养的问题。

为什么要培养数据科学家

为什么要培养数据科学家？这个问题看上似乎是显而易见的，但实际上，如果不了解数据科学家或者人工智能团队的一个重要性质，你很可能无法很好地运营这样一个团队。究竟是什么性质这么重要呢？那就是数据科学家或者人工智能工程师有强烈的持续学习和不断更新自我的需要，这是数据科学家培养的一个非常重要的理念。

那么，数据科学家为什么需要不断学习？简单来说，是因为数据科学家所需要的技能和知识处在一个快速变化的环境中。如果数据科学家不能对这些快速变化的技能和知识加以学习，就很可能被迅速淘汰。

我们这里所说的技能有知识性的技能也有实际的工具性质的技能。

从知识性的来看，机器学习和人工智能技术每隔一段时间就会有一些重要的发展，了解和掌握这些更新的技术需要一定的门槛。因此，持续学习是为了能够迈过这些门槛。从过去的经验来看，每一次这样的重要发展所带来的新门槛都不可避免地让一些工程师和数据科学家落伍。

比如，在过去不到 20 年的时间里，机器学习就经历了“支持向量机”（Support Vector Machine）、“概率图模型”（Probabilistic Graphical Model）以及“深度学习”（Deep Learning）这三股大的思潮。也就是平均 5～6 年，数据科学家和人工智能工程师就需要面对一些完全不同的建模思想和工具。更不要说，在这些大的思潮之下，每年出现的新模型也是层数不穷。这还没有提及应用的领域，比如推荐系统、搜索、广告系统、计算机视觉、自然语言处理等等。如果不能在这些领域知识的快速变化中取得主动，很可能就无法胜任未来的工作。

在实际工具技能层面则更是日新月异。比如近日如火如荼的深度学习框架 TensorFlow 仅有 3 年多的历史，五六年前还根本就不存在。而如今借助机器学习迅速崛起的编程语言 Python 在五六年前也没有近日的火爆。而在支持向量机年代非常受欢迎的 LibSVM 和 SVMLight 工具，可能今天已经很少听到。知识框架的变化相比，工具技能层面的变化更加琐碎，更加细节，这也为人工智能科学家提出了更高的挑战。

那么，在知识结构和工具技能都快速变化的情况下，团队的负责人就需要针对这样的特点进行有远见的管理安排。

第一，需要为学习这些技能和知识提供时间。任何数据科学家现有的知识体系都不能保证永不过时。事实上，就像我们刚才提到的，现在每 5～6 年就有一个比较大的知识体系更新，这个更新速度在未来还有可能会更快。那么，花费了非常大的代价招聘来的整个团队就有可能面临着短时间内过时的危机，所以，要能够利用平时的时间，把持续学习的内容安排进团队的日常运作中，可以有效降低团队遭遇知识鸿沟（Gap）的风险。

第二，需要团队里的资深数据科学家能够战略性的挖掘接下来有可能进入主流视野的技术，从而早作准备。尽管这可能显得有一点过于超前，但是对于大多数的互联网或者高科技企业来说，技术实力上的领先无疑是最强大的生产力。因此，在日常的安排中，如果在团队人手富裕的情况下，能够有一些数据科学家专注比较“面向未来”的技术，从而为今后的技术积累以及整个团队的“技术纵深”打下基础。

其实，谷歌的 DeepMind 或者 Facebook 的人工智能研究院都有着这样的性质。这些机构研发的技术未必能够马上应用到这些公司的主流产品上，但是这些技术有可能让这些公司或者团队能够在未来 3～5 年内有一个比较舒适的纵深，这些公司的其他团队需要做的，就是沿着这个纵深前进。

除了从一个团队以及数据科学家本身的不断更新换代的这个思路来看待培训以外，还有一个方面，那就是绝大多数公司和团队的数据科学家都不可能是在招聘的时候就已经是最一流的数据科学家或者人工智能工程师了。

你往往只能招聘到博士毕业生、硕士毕业生。他们的知识面和技能在刚进入公司的时候还非常稚嫩。对于一些博士毕业生而言，以前做的一些研究都是在一个非常窄的领域，还没有形成一个完整的体系。对于一些硕士毕业生而言，很可能完全没有真正接触过现实的问题，之前的学习主要是课堂项目。因此，对于团队中的年轻成员，学习和培养就成为了一个非常必要的环节，让他们能够真正融入到工业级人工智能解决方案的研究和部署中。

全方位的培养计划

刚才我们简单聊了聊从技术层面培养数据科学家的一个思路。其实，我们之前反复强调的一个思想就是，人工智能团队并不是单独存在的。一个能够真正运转并且能够为公司或者组织带来价值的人工智能团队一定是整个组织中的一个有机部分，并且能够为公司和组织带来数据驱动的持续决策的能力。因此，在这样的一个目标下，数据科学家的培养不应该仅仅是技术层面上的，还应该是更加全方位的。

如果说简单一点，对于一个数据科学家的全方位培养中，很重要的一条，那就是团队协作的能力，特别是跨团队的组织、协调和沟通的能力。我们在之前的分享中已经提到过，数据科学家的工作需要和数据工程、设计师、前端工程师、后端工程师、产品经理等角色的人员打交道。而在这个过程中，任何一个环节的沟通出了问题，都有可能造成项目的失败。因此，有没有聆听的能力、有没有表达的能力、有没有了解需求的能力、有没有分清主次的能力等等，这些软实力就成为了数据科学家培养计划中的一个重点。

从过程上来说，一个新入职的数据科学家的核心目标还是从技术上慢慢从学生或者初级工程师逐渐成熟起来。最开始，年轻的数据科学家应该“多听”、“多看”、“多想”，但“少发表意见”。从和资深的员工一起参与项目开始，逐渐学习怎么和其他的部门一起工作，甚至从熟悉其他部门的词汇、语言入手。

最后，我想说的是，除了团队之间的沟通能力以外，数据科学家上台演讲的能力也很重要。能够把自己的解决方案说清楚，能够用通俗的语言来解释复杂的问题，能够不使用数学符号依然可以把解决方案的主要思想梳理明白并且能够传递出足够多的信息，这些都是数据科学家进阶必不可少的技能。

小结

今天我们分析了数据科学家或者人工智能工程师团队的培养问题。进行一个简单的总结：第一，我们讲了数据科学家为什么需要培养。在主要的技术技能培养的道路上，有什么样的情况；第二，我们详细梳理了数据科学家全方位培养中的重点是什么。希望这些内容能给你一些启发和借鉴。

最后，给你留一个思考题，怎么能够把数据科学家的持续学习纳入绩效考核呢？或者到底应不应该纳入考核？

欢迎你给我留言，和我一起讨论。

058 | 数据科学家团队组织架构：水平还是垂直，这是个问题

周一我们聊了数据科学家培养的话题，我们分析了数据科学家培养的重要性，要从技术的提高和整体的团队协作几个角度来进行培养。

今天我们来讨论数据科学家团队高级话题中的最后一个，也是非常现实的一个问题，那就是对于一个组织来说，究竟应该形成怎样的组织架构呢？是选择一个集中式的数据科学家团队或者叫水平式的组织架构？还是成立一个分散式的、每个产品部门都有数据科学家的垂直式的组织架构呢？对于很多公司或组织来说，在构建一个数据科学家团队的时候都会遇到这个棘手的问题。

水平架构的数据科学家团队

什么是水平架构的数据科学家团队呢？简单来说，那就是一个公司或者组织的所有数据科学家都在一个团队中，有一个统一架构管理，比如一个数据科学家总监或者一个首席科学家。这个团队负责和公司所有的其他团队合作，提供数据科学以及人工智能解决方案。

例如大家熟悉的微软研究院、谷歌 DeepMind、雅虎研究院、IBM 研究院、Facebook 人工智能研究院都是水平架构团队的卓越代表。

水平架构的团队有哪些好处呢？

第一，便于管理。这些团队有统一的招聘标准、业绩评价标准、员工晋升标准和内部的运作模式。这些管理体系的建立是需要时间和经验的。统一的管理常常意味着高效，大家对这些管理上的细节有统一的认识，因此整个团队对内管理上能够更加方便快捷。对于希望快速发展壮大的一些组织来说，这一点尤为重要。

关于这一点，很多管理者其实并没有完全理解，难免出现因多个相似团队存在而造成一些不必要的内耗。比如说，如果一个组织内部在没有协调的情况下出现了两个人工智能团队，而这两个团队各自有一套招聘方法、人员评定的方法以及项目管理的模式。如果没有足够重视，那很快就会演变为激烈的摩擦，从而无法让团队真正有效地运行。在很多公司的发展中都有这样的例子，因为有多个类似的人工智能团队而无法集中资源。

第二，品牌效益。刚才提到的类似微软研究院、雅虎研究院以及 IBM 研究院都是卓越的品牌。一个组织一旦形成了品牌，那就可以相对比较容易地收获一些品牌红利，比如说招聘的便利。很多年轻的研究员或者硕博毕业生的首选都还是进入知名的机构或者团队。甚至有很多时候，年轻的工程师或者科学家都希望追随某一位在这些组织获得成功的学者或者前辈，于是就考虑加入这些团队。还有一些优势比如在社区里的话语权效应，典型的例子就是谷歌的 TensorFlow 框架，这个框架就是凭借着谷歌以及 DeepMind 的品牌优势，从而能够在众多深度学习框架中后发制人，迅猛发展。

第三，团队对外协作变得更加清晰简单。这里主要是说和公司其他部门之间的协作会变得更加明了。试想公司现在有一个新的产品部门，希望能够利用人工智能的一些技术来构建自己的产品，那么如果公司内部有三个不同的人工智能团队，有几套差不多的系统框架，对于这个新的产品部门来说，该如何选择合作呢？这势必又会引发我们刚才提到的团队之间恶性竞争的问题。

垂直架构的数据科学家团队

刚才我们主要分析了水平架构团队的一些优势，中间提到了垂直架构团队的一些问题。那是不是垂直架构的团队就没有任何优势了呢？

凡事肯定都有正反两面。

垂直架构的团队往往是从不同产品线的需求中慢慢演变而来的。举个例子，在类似 Facebook、谷歌、雅虎等公司的内部，搜索、推荐以及广告部门往往由于各自的需求不同，在历史的进程中，都分别组建了自己的具有人工智能性质的团队。这些团队在发展过中，也都形成了一些自己的软件框架以及成熟的算法模型。由于这些产品线细节的复杂性，对于很大的公司来说，这些差异性所带来的麻烦就需要不同的团队来支持。同时，因为有不同的团队来做人工智能的研发，从整个公司的层面来看，公司会更加“坚韧”，也更容易有不同的创新点。

如果仅有一个集中的水平团队来支持公司所有的产品线，随着公司产品的增多，这个水平团队的任务将会越来越重。并且，这个水平团队将不可避免地开始选择那些这个团队认为更加重要的功能加以支持，这必然就难以满足所有团队的需求，正所谓“众口难调”。这个情况下，也就给了其他团队一定的“借口”开始发展自己的人工智能团队。这其实也是很多公司里，不同人工智能团队发展的一个轨迹。在某种程度上，这种情况也是“解放”了这个水平团队所承担的重负，让每个产品团队最终能够有比较完整的自主权来发展。

垂直发展模式是大多数公司发展到一定程度所经历的现实阶段，也是超大型公司规避技术风险的一种方式，即不同的团队之间互为“备份”，整个公司的发展存在合适的内部竞争。

混合组织架构

其实你可以想到，在水平结构和垂直架构之间，存在着一种混合的模式。这种混合的模式往往是希望能够汲取水平架构和垂直架构两者之间的优点，从而能够更大地发挥效益。

举例来说，谷歌存在 DeepMind 这样的水平架构人工智能团队，但同时各个产品组也有不少人工智能研发人员。这样，垂直的架构分布在各个产品组，能够保证产品线的正常运作以及不断推陈出新，又能够保证有 DeepMind 这样的相对比较独立的机构拥有较高辨识度，形成一个比较完整的实体可以进行更多的创新和尝试，而且也能够有一个清晰的品牌吸引人才。类似的情况还有 Facebook 的人工智能研究院和其他工程产品线内的人工智能团队的关系。简言之，就是希望用一个较小的、更加核心、更加精英化的水平团队以及各个产品线中的垂直团队一起相互作用。

当然，从管理的层面而言，这样两者都需要的混合模式对公司的领导智慧和协调能力都是极大的考验。事实上，你可以发现，在上述的区分中，产品团队中的人工智能研发人员和这个更加精英的水平架构的人工智能团队之间可能会产生不信任的摩擦。举例来说，理想状态下，这个核心的团队应该做一些更加超前的创新和思考，而产品的团队做一些更加“接地气”的项目。但是，有的时候产品团队中也会有工程师或者科学家的能力其实不错，也能做超前的研究和创新。慢慢地，就会让人觉得这个核心的研发团队的名声和实际在公司内部的影响力“名不副实”。

在混合模式下，我们现在还不能说业界已经有一个成熟的模型可以供大家参考了。很多在尝试的公司也在水平和垂直的架构中互相摇摆。

小结

今天我们分析了如果要组建一个数据科学家或者人工智能团队，你需要建立的是水平架构的组织还是垂直架构的组织。

我们来进行一个简单的总结：第一，我们讲了什么是水平架构的团队组织，这样的组织有什么优势；第二，我们详细梳理了一下垂直架构组织的由来，并且帮助你理解这种组织架构的现实原因和在大型公司中的好处；第三，我们简单谈了谈对混合架构的摸索。希望这些内容能给你一些启发和借鉴。

最后，给你留一个思考题，对于一个初创公司来说，如果希望建立人工智能团队，应该选取什么样的架构呢？

欢迎你给我留言，和我一起讨论。

122 | 数据科学家必备套路之一：搜索套路

到目前为止，我们已经完整地介绍了搜索、推荐和广告的主流技术，为你呈现了这些产品技术方向的整个生态系统。在这些系列的分享里，我们重点介绍了这些技术方向的基本模型，然后花了不少篇幅讲如何评测模型的好坏，包括如何进行线下评测以及线上评测。同时，我们从传统的经典模型讲到最近几年利用深度学习对这些技术方向的提升，帮助你理顺了这些技术发展的脉络。

尽管我们已经在之前的文章中分享了这些技术的方方面面，但是对于很多经验较少的数据科学家或者人工智能工程师来说，依然会感到无法得心应手地把这些模型和知识给应用到真实场景中。

其实，出现这种情况一方面是个人经验积累的原因，毕竟从初学者到能够熟练应用各种模型工具应对实际产品的需要，是一个长时间磨炼的结果；然而另一方面，也是因为搜索、推荐和广告这些产品场景其实是有一些套路，在没有接触到这些套路的时候往往会觉得不得要领，而在慢慢熟悉了这些套路之后，进步也就会慢慢加快。

那么，在接下来的三篇文章里，我就有针对性地来分享在这三个领域里的一些常见套路。今天，我们首先从搜索产品套路说起。

多轮打分套路

我们前面已经介绍过多轮打分的系统架构了。当我们想要构建任何一个搜索引擎时，都应该立刻想到多轮打分这个架构，这是一个基本套路。

我们先来回顾一下多轮打分最基本的模式：针对一个搜索关键词，我们首先从索引中找到第一批，也是数目相对比较多的相关文档，这就是第一轮打分；然后，我们再根据一个相对比较复杂的模型，对剩余的文档进行打分排序，这是第二轮打分。

很多时候，两轮打分就已经能够满足需求了，可以直接给用户返回结果集。当然了，我们也常常加入第三轮打分，这个时候经常是实现一个商业逻辑层，可以针对最后的搜索结构加上一些商业规则。

多轮打分这个套路之所以关键，是因为它其实影响了一系列的技术决定。

首先，只有第一轮是直接作用在索引上的。这一轮往往可以并行化，并且不需要太多考虑文档之间的顺序。

我来举个例子说明。在一个大型搜索引擎的架构下，假设我们有一亿个文档，每五百万个文档存放在一个数据节点上。如果我们有一个关键词是“人工智能”，那么就要到这 20 个数据节点上分别查找包含这个关键词的文档。当我们把所有的文档汇集起来以后，排序取出前 1000 个文档，这个时候就进入第二轮。最简单的第二轮打分是在一个计算节点上进行的，而且这个时候我们只针对 1000 个文档进行打分，对计算时间的要求就大幅度降低了。那么，在这样的情况下，第二轮打分使用的模型可以是比较复杂的模型。后面每一轮打分所针对的文档往往是越来越少，因此模型的复杂度可以越来越高。

从解决问题的角度上来说，第一轮在索引上的打分，是要解决“召回”（Recall）的问题。这一步有可能是从非常多甚至是成千上万的文档中返回几百到几千不等的文档，因此一旦一些文档没有在这一轮中被返回，就无法在后面的轮数中被重新筛选出来。所以，我们要理清这么一个思路，那就是如果你认定系统有“召回”的问题，也就是说，本该搜出来的东西，完全搜索不出来，那肯定是在第一轮打分就出了问题。第二轮以后的打分解决的就是“精度”（Precision）的问题。

同时，我们可以看到，什么时候解决“召回”问题，什么时候解决“精度”问题，这其实是取决于具体的业务场景。

对于“精度”非常看重的搜索场景，比如说网页的信息类关键词，例如“特朗普”、“比尔盖茨”，人们往往只关注前 10 位，甚至是前 3 位的搜索结果。那么很明显，我们可以先有一个比较简单的第一轮架构，比如就是文字匹配，而把功夫都下在第二轮以后的打分上。

而对于“召回”比较看重场景，比如说法律文档搜索，那必须要做好的就是第一轮的打分，这个时候可能需要采用简单的文字直接匹配和语义的模糊匹配。

高频和长尾的套路

刚开始接触搜索产品的朋友往往会有一个困惑，那就是不知道该如何提升一个搜索产品，有一种无从下手的感觉。那么，对于搜索产品的提高有没有什么套路可言呢？

一个比较基本的套路，就是把搜索关键词按照某种频率或者是流量分为“高频关键词”和“长尾关键词”，从而为这两类不同的关键词设计排序算法。

为什么要把关键词按照频率分开呢？我来介绍一下最主要的思路。

对于很多搜索网站来说，一些高频的关键词往往占据了相对来说比较大的流量，而很多长尾的关键词，也就是仅仅出现过几次的关键词则并没有太多人搜。因此，如果我们先解决了高频的关键词，也就解决了大部分的搜索问题，从而可以把精力留下来慢慢解决低频的长尾关键词。

而实际上，高频关键词因为有足够多的数据量，反而往往比较容易得以解决，而低频关键词，因为数据的匮乏，往往需要更多的精力和时间。所以说，从投资回报的角度来看，我们也需要做区分，首先来解决高频的搜索关键词。

刚才我们提到了高频关键词的一个特点，就是有足够多的用户数据。那么，这里有一种非常简单的思路，或者说是在没有较好模型的时候可以首先使用的一种方法，那就是每天记录下高频关键词文档的用户点击数据。然后我们可以直接按照点击率，或者是文档的转换率排序，并且把这个排序存在某种存储中。当用户在这一天搜索这些高频关键词的时候，我们甚至可以直接从存储中调出事先算好的排序结果。

更加极端的做法，就是手工对高频词进行更频繁的标注，这种做法往往也是非常有效的。例如我们刚才说的“特朗普”的例子，我们可以手工标注好前 10 名的结果，然后存下来。只需要每几天更新一下这个标注，我们甚至不需要使用任何模型就可以提供非常高质量的搜索结果。

当然，使用这种方法，显然无法对几百万的搜索关键词都这么一一处理。不过，我们这里针对的主要是高频关键词，所以，即便是针对最高频的 1 千个关键词进行手工标注，也会对整体的搜索效果有非常明显的提升。

相反，长尾的关键词往往需要花比较多的心思。对于长尾来说，我们还可以细分。比如对于有一定数据量的关键词，我们可以尝试针对这些关键词单独训练一个模型。之所以要单独训练一个模型，原因也很简单，如果针对所有的关键词只有一个模型的话，高频的关键词因为流量大，往往就会让模型偏重于去解释高频的信息，而忽略了这些中低频的关键词的作用。

因此，先把高频词单独处理了，然后就可以针对依然可以训练的中频关键词再选取一个单独的模型。而针对非常低频的关键词，我们往往需要借助其他的方法来挖掘这些关键词的信息，例如利用同类的其他关键词的数据，或者利用外界的知识库、知识图谱的信息等。

三大模型套路

除了分开处理高频和长尾关键词以外，搜索模型的提升还有一个非常简单的“三大模型套路”。

我们构建一个搜索引擎，从最原始的简单系统，慢慢到比较复杂的以至于到后期非常复杂的系统，从模型上来说要跨越三个台阶。在这里我们主要是针对第二轮的打分系统来进行讨论。

第一个台阶是使用线性模型。当我们设置好了最基本的第一轮打分系统以后，首先要做好的是能够利用线性模型对文档进行排序。这一步其实往往是搜索系统从“无人工智能”到“有人工智能”的第一步。这一步对搜索效果性能的提升可能会有 10%~20%。

第二个台阶是使用配对法线性模型。一般来说，这一步搜索效果会有 2%~5% 的提升。

第三个台阶是使用树模型，特别是 GBDT 模型。这一步搜效果的提升和第二步相似，约有 2%~5% 的提升。然而，要从第二个台阶到达这个步骤，模型的特性可能会发生不小的变化。这一个台阶可以算是一个比较困难的台阶。

从工程研发的角度来说，可以采用一年一个台阶的做法。在已经穷尽了当前台阶所有可能用到的特性以后，再进入到下一个台阶，也就是说要尽可能地“榨干”当前台阶模型效果的“养分”。

总结

今天我为你介绍了做搜索产品的几个套路。

一起来回顾下要点：第一，我们回顾和总结了多轮打分系统的架构套路；第二，我们介绍了区分高频关键词和长尾关键词的套路；第三，我们简单讨论了“三大模型套路”，跨越三个台阶，逐步提升搜索效果。

最后，给你留一个思考题，为什么不鼓励直接采用深度学习模型呢？

欢迎你给我留言，和我一起讨论。

123 | 数据科学家必备套路之二：推荐套路

在上一期的分享里我们讨论了做搜索产品的套路，给你介绍了多轮打分、高频和长尾以及三大模型套路。你有没有感受到这些高于某一个具体模型的套路的重要性呢？

今天，我们来看看推荐的一些套路。

多轮打分套路

上一篇我们提到，想要构建一个搜索引擎，应该立刻想到基于多轮打分的架构，有这个意识就是一个基本套路。

其实这个套路对于推荐，也是适用的。

把推荐问题构建成一个多轮打分的“类搜索”问题，其实是推荐在工业界应用的一个非常重要的套路。

这个思路的好处是把搜索和推荐问题给归一化了。也就是说，我们可以依靠同样一套软件架构来解决两大类相似的问题。搜索是有关键词的推荐，而推荐则是无关键词的搜索。虽然这是一种相对比较简化的看待这两种问题的方式，但是统一的架构在工程上面可以带来非常多的好处，比如重复构建相似的特征工程的流水线，以及更重要的如何优化索引等工程，这些都可以很快地应用在搜索和推荐这两个重要的场景上。

当然，在工程以外还有其他好处。在学术界，关于推荐系统搭建的方法往往是一种独立的模型，然后搜索系统又是另外一种独立的模型。这些模型之间缺乏能够系统性联系起来的纽带。把推荐问题看成是多轮打分的搜索问题之后，我们就找到了一种简单又自然的方法，能够把很多不同类型的推荐模型给整合到一起。

比如，很多之前我们介绍过的推荐模型就可以担任第一轮打分，也就是我们常说的“候选集选择”（Candidate Selection）这一组件的角色。像协同过滤模型，就可以是我们为每一个用户或者每一个物品产生最终推荐物品的一个候选集合。

在搜索里，我们是利用索引以及简单的检索方法，从海量的文档中找到几百或者几千个初步相关的文档，然后再根据第二轮的复杂模型来重排序。那么在推荐里，我们其实就可以利用各种不同的协同过滤、矩阵分解等模型来达到第一步的筛选功能。

而对于第二轮打分，我们就完全可以依赖基于特性的排序学习模型来学习推荐的结果。这种方式其实是极大地利用各种搜索算法，特别是排序学习的进步，来提升推荐的效果。

是否把推荐问题看成是多轮打分的搜索问题，是区别工业界和学术界推荐模型的一个重要标志。

高频用户和低频用户套路

既然我们提到了把推荐问题看成是某种意义上的搜索问题，那么，根据用户行为的频率来进行不同的推荐策略，其实就是一个顺理成章的套路了。

这个套路的思路和搜索类似。对于高频用户而言，我们有足够多的数据，所以往往可以学习到一个比较好的模型。而且，对于真正的高频用户来说，提高推荐的质量往往需要个性化，也就是说，我们需要更多地利用这些高频用户他们自己的数据，来提供推荐结果。

一般来说，针对高频用户的个性化推荐有两种比较常见的方法。

一种方法就是构造更多的高频用户的特性。比如，有一个用户点击了某一个物品的信息，或者这个用户购买了某一个物品，这些特性都有助于我们的模型学习到关于这个用户的具体喜好。

另外一种比较常见的方法是为这些高频用户单独构建模型。这个方法其实主要是针对第二轮打分的模型而言的。一般来说，一个比较简单直观的方法是把所有用户的数据收集起来，然后训练一个全局的第二轮打分模型。这样做的好处当然是可以利用所有的数据，并且学习出来的模型往往也比较稳定。但是，一个全局的模型往往并不能为某一个用户提供最优的推荐结果，这一点其实很容易理解，因为一个全局的模型往往是某种“平均结果”。所以，我们可以根据用户的数据来为这些高频用户“定制模型”。

说了针对高频用户的一些思路以后，我们来看看针对低频用户的一些套路。

当我们需要为低频用户进行推荐的时候，因为数据缺乏的关系，这时候的选择就不太多了。一个普遍使用的方法，是对低频用户进行分组。这种分组一般来说是根据用户的人口信息，例如年龄、性别和地理位置。分组之后，我们把这些组别中的用户信息整合起来，统一建立这些组别的模型。

还有一个比较普遍方法，是给低频用户推荐流行的信息。这里的假设是，流行信息之所以是流行的，就是因为这些信息本身可能就有较高的点击率、驻留时间和购买率，因此在不清楚这些低频用户喜好的情况下，推荐这些内容其实是相对比较合理、也是保险的。

批量和实时套路

这个“批量和实时”套路其实和多轮打分以及高频、低频用户都有一些关联，但是有时说的是不太一样的事情。

在设计推荐系统架构的时候，我们刚才讲了多轮打分的思路，那是不是每一个用户到我们的网站或者服务时，系统都需要从第一轮开始一直到最后一轮，完全重新生成一个用户的所有推荐结果？

其实，我们可以这么想一想，如果一些用户，特别是低频用户，每周仅仅光顾几次我们的网站或服务，甚至每个月才光顾一次，我们并不需要针对这些用户来实时更新推荐结果，而可以按照一定的频率，例如每天一次或者每周一次提前生成好所有这些用户的推荐结果，然后存储到某一个地方。等用户访问网站时，我们就可以直接从存储中调出已经生成好的推荐结果。

其实这个思路不仅仅用于低频用户，高频用户也可以采用这样的方式。不过，更新推荐结果的频率可能就不是每天或者每周，而应该是每几个小时、每几十分钟甚至是更短的时间。

对于很多应用来说，推荐的结果其实并不需要是实时的。即便是在很多看似需要实时的应用上，我们依然可以用很多的批量计算来达到推荐的目的。

举个例子，在很多移动场景中，我们可以为一个用户生成一个基本的推荐结果，一两百个物品，然后从服务器端推送到用户的手机上。当用户在手机上产生了新的行为之后，我们可以根据这些行为对用户已经在手机上的这个集合进行模型的微调，然后重新排序。这里用户看到的可能是感觉上已经有更新的推荐结果，但这种实时的效果其实是建立在批量预处理上的。

能够理解什么时候需要利用批量的计算结果，什么时候需要实时的计算结果，是处理好推荐问题的一个关键套路。

总结

今天我为你介绍了做推荐产品的几个套路。

一起来回顾下要点：第一，把推荐问题看成一个多轮打分的“类搜索”问题，是推荐在工业界应用的一个重要套路；第二，对高频用户进行个性化推荐有两种常用的思路，包括构造更多的特性和定制建模；针对低频用户的推荐套路也有两个，一个是分组一个是推荐流行的信息；第三，我们聊了批量处理和实时处理的套路，关键是判断在什么场景下使用哪种套路。

最后，给你留一个思考题，从多轮打分系统的架构看，推荐和搜索又有哪些区别需要注意呢？

欢迎你给我留言，和我一起讨论。

124 | 数据科学家必备套路之三：广告套路

讲完了搜索产品和推荐系统的套路，今天我们继续来看数据科学家应该掌握的广告产品的一些套路。

利用搜索和推荐的套路

前面我们讲过两种普遍使用的互联网广告模式，搜索广告和展示广告。对于搜索广告而言，一个基本套路就是尽量利用现有的搜索系统来推送广告。而对于展示广告而言，一个基本套路就是尽量利用现有的推荐系统来推送广告。

我们在介绍推荐套路时提过，推荐系统和搜索系统的很多方面其实都有重叠，所以做好一套搜索系统是非常有必要的，几乎所有的广告应用其实最终也可以在搜索系统的架构上搭建。因此，我们可以说，搜索系统是很多现代人工智能系统应用的一个核心技术组件。

具体来说，广告其实也和一般的文档一样，首先利用搜索引擎的索引把这些广告都存储起来。对于搜索广告来说，利用关键词的倒排索引，可以轻松地找到相关的广告，这和找到相关文档的原理其实是一样的。

当然，我们前面也提到过，广告的排序和普通文档有一个不一样的地方，那就是竞价。因此，在从索引中提取广告的时候，我们必须要去思考一个问题，如何让广告竞价的赢家能够从索引中被提取出来？

我们知道，广告的竞价常常是以点击率和出价的乘积来作为排序的依据。这就会有一个问题，如果我们从索引中提取广告的时候，仅仅看哪些广告从关键词的角度是相关的，而忽略了点击率和出价，那么，最后提取出来的广告很有可能不是真正能够赢得竞价的广告。

如何来对这个问题进行修正呢？一种做法是在索引里面增加点击率信息。也就是针对每一个关键词，我们不是按照文本的相关度去索引最相关的文档，而是按照点击率去索引点击率最高的一系列文档。

那么，当需要针对某一个关键词提取广告的时候，我们就直接从这个关键词所对应的索引中提取点击率最高的几个广告。这个时候，我们再从某一个存储出价的数据库中读取这些广告的出价，并且进行竞价排序。

从这个流程我们可以看出，最终的竞价排名很可能并不是完全依赖点击率和出价的乘积，而是在点击率先有了一定的保证下的这个乘积的排序。这种有保障的点击率常常被叫做“质量值”（Quality Score），用来描述这些广告的点击率高于一个设定的阈值。

接下来，我们来看广告提取的另外一个重要的要求，就是需要满足广告投放的业务逻辑。比如，有一个广告的投放要求是针对男性，现在有一个女性用户，那么，我们就不应该针对这个用户显示这个广告，而不管这个广告的点击率和出价信息是怎样的。

如何实现这样的效果呢？我们依然可以利用索引。在索引中，我们插入广告的各种投放条件作为被索引的对象，然后把在这个投放条件下的各种广告作为文本。这样，我们就可以提取满足任意投放条件的广告了。

针对这些投放条件的组合，例如投放条件是“女性、在北京”，我们可以认为是在索引上进行“且”操作，也就是提取出同时满足两个关键词的操作。事实上，针对任意一个关键词的广告，我们都是进行了多个“且”操作。例如，针对“可乐”这个关键词，我们可能是需要提取这个关键词点击率最高的 100 个广告（如果有那么多的话），并且这些广告的投放条件都满足“女性、在北京”。当提取出了这些广告之后再进行竞价排名。

当然，在这样的架构下，我们就需要对索引有快速更新的能力，例如某一个广告的点击率或者投放条件都有可能发生变化。

层次建模套路

对于广告系统的建模有一个基本的套路，那就是层次建模（Hierarchical Modeling）。什么是层次建模呢？在广告的生态系统中，至少有广告商、广告推广计划、单一广告这三个层次的实体。提高广告投放精准度的一个核心问题，就是如何能够对这这三种实体进行有效建模。

当我们对当前的广告商一无所知的时候，需要看一看过去有没有其他类似的广告商在平台投放过广告，如果有，那么能否借鉴那些过去的数据。当这个广告商开始投放广告以后，我们就可以积累数据，慢慢就能够增强对这个广告商的建模能力。

类似的，当我们计划推出某一个广告推广计划的时候，我们先看一看同一个广告商有没有类似的推广计划，或者看一看其他类似的广告商有没有相近的推广计划。当某一个广告开始运行的时候，我们看一看同一个推广计划下其他广告的表现，或者是同一个广告商下其他广告的表现。

层次建模的一个重要的特点就是利用可以利用的一切其他信息来进行建模。在计算广告中，经过验证，层级信息往往是最有用的特性。

具体和泛化的套路

这个套路其实并不是完全针对广告的。就像我们之前所说的广告、搜索和推荐之间的关系，这个套路其实也可以应用在搜索中。

前几年，Google 的工程师发现，如果仅仅利用深度学习模型来学习抽象的特性，从而寄希望模型的性能得以提升，这种方法也许可以很好地解决计算机视觉的一些问题，但是对于搜索、广告和推荐的效果则并不好。

下面我们聊聊工程师们发现的这里面的原因 [1]。

一个好的模型必须具备两种能力。第一，能够对具体的关键词进行匹配。比如，我需要匹配“可口可乐”，那么任何与“百事可乐”相关的广告其实都是不能显示的。这就要求模型中针对每一个具体的关键词能够进行字对字的匹配，而不是模糊匹配。第二，那就是具有泛化能力。比如，我们要去对“可口可乐”在 2018 年的广告推广进行建模，模型就能够借鉴“可口可乐”在 2017 年的推广数据，以及借鉴“可口可乐”公司其他推广的数据。这里面的借鉴能力其实就是模型的泛化能力。

由此，我们可以得到一个好模型的重要套路：一个好的模型既要能够精确记忆某一种关键词，又要能够在广告层次上进行泛化。

总结

今天我为你介绍了做广告产品的几个套路。

一起来回顾下要点：第一，搜索系统是很多现代人工智能系统应用的一个核心技术组件，广告系统也可以借鉴搜索系统的套路；第二，广告生态中层次建模的套路，就是利用可以利用的一切其他信息来进行建模；第三，一个好模型的套路，关键是模型的具体能力和泛化能力并存。

最后，给你留一个思考题，为什么在计算机视觉中，对于具体匹配的要求没有那么高呢？

欢迎你给我留言，和我一起讨论。

参考文献

1. Heng-Tze Cheng, Levent Koc, Jeremiah Harmsen, Tal Shaked, Tushar Chandra, Hrishi Aradhye, Glen Anderson, Greg Corrado, Wei Chai, Mustafa Ispir, Rohan Anil, Zakaria Haque, Lichan Hong, Vihan Jain, Xiaobing Liu, and Hemal Shah. Wide & Deep Learning for Recommender Systems. Proceedings of the 1st Workshop on Deep Learning for Recommender Systems (DLRS 2016). ACM, New York, NY, USA, 7-10, 2016.

137 | 如何做好人工智能项目的管理？

关于数据科学团队养成这个主题，在之前的分享中，我们已经聊了数据科学团队招聘以及一些高级话题，主要是围绕如何组建一个高效的团队，包括数据科学家的绩效评定、培养以及如何构建水平和垂直的组织架构这些内容。

在接下来的几篇分享里，我们重新回到数据科学团队的本源，来看一看数据科学团队在整个公司的位置，以及在数据科学团队的发展和运行中，又有哪些至关重要的环节。

今天我们就来聊一聊运行数据科学团队里面的一个核心问题，就是如何针对人工智能项目进行管理，从而保证团队运行的项目能够顺利完成，同时能够真正帮助企业利用人工智能技术来推动产品的发展。

一说到项目管理，很多成熟的工程师或者项目经理可能会不以为然，觉得不需要对人工智能项目进行额外的关注。但是在实际工作中，如何运作数据科学项目关系到整个产品的推进，甚至可能对公司的发展都会有不小的影响。

那么，通常情况下，针对人工智能项目会有哪些项目管理的模式呢？我们先来看看两种极端模式。

把人工智能项目当作“研究项目”

第一种模式是把人工智能项目完全当作是研究项目。很多从学术界转到工业界的研究人员和工程师，在处理人工智能项目时就很容易陷入这种状态。那么研究项目有哪些特点，或者说，如果我们把人工智能项目完全当作是研究项目，会带来什么问题呢？

首先，在很多状态下，研究项目并没有特别明确的目标。有些项目看似是利用一个现成的方法来解决一个实际问题，但是做了一阵子才发现问题的定义并不清晰，而那个现成的方法可能需要重新修改，才能在新的问题上使用。而且，修改这个方法也许还需要进行一些理论推导，即便做了所有这些步骤以后，依然没有人可以保证这个方法对新的问题一定有效。

也就是说，研究项目的每一个步骤都充满了不确定性。这种过程和结果的不确定性，可以说是研究项目最大的特点。不确定的特点带来的结果，往往就是不太好控制整个研究项目的范围。

举一个例子，如果我们要针对一组图像构建一个分类器。这个项目其实可大可小，可快可慢。如果我们直接用现成的模型，然后利用迁移学习的办法，不去重新训练模型，仅仅是把模型直接应用到新数据上，那快则一天，慢则一个星期，可能就完成了这个任务。

然而，这么做对分类精度是没有任何保证的。我们可能会发现分类器的精度比我们想象的要低得多。那么，这个时候就会达到一个比较危险的时刻。原始项目范围内需要做的任务都已经完成了，但是没有达到效果，后面可以做的事情，范围可能就会非常大，也没人能说得清楚，做了这些额外的任务之后，是不是一定能提高分类器的精度。

因此，把人工智能项目完全看作研究项目的弊端就很明显了，我们无法很好地把握整个项目的周期，特别是完成时间。同时，种种的不确定还可能造成项目范围的不可控。显然，这种局面是工程项目中最不愿意看到的。

把人工智能项目当作“软件工程项目”

另外一个人工智能项目管理的极端模式，就是完全按照软件工程的模式来进行管理。我们这里不讨论具体的软件工程管理方法，我们仅从宏观上来讨论软件工程管理模式对于人工智能项目管理的弊端。

软件工程管理的一个核心思想，就是能够把一个大的任务拆分成一些细节的任务，然后假设如果能够完成小的细节任务，那么大的项目也就能顺利完成。同时，软件工程管理还有一个重要的假设，那就是工程的绝大多数步骤都是确定的，没有过多的变数。

遗憾的是，正如我们刚才提到的，人工智能项目的一个特征，就是不确定性。因此，按照软件工程进行管理，就容易做一些看似有意义，但其实对工程进展并没有真正帮助的任务。这些任务往往是数据科学家或者工程师凭空制造出的，目的就是为了符合软件工程的管理流程。过于细节的任务划分，往往就会把整个项目真正的目标给迷失掉，从而无法针对是否达到目标很好地进行控制。

回到上面那个图像分类器项目的例子，如果我们采用纯粹的软件工程管理方式，那步骤很可能是这样的：需要先写一个计划书，再对数据进行描述，然后找责任相关方来探讨是否需要重新训练模型等等。这些步骤耗费了大量时间，但是对于能否构造出高精度的分类器并没有帮助。

人工智能项目的管理

那到底该如何来管理人工智能项目呢？人工智能还处于发展的初期，目前其实并没有一个完全成型的项目管理方法论和一个放之四海而皆准的框架。不过，通过刚才对两种极端情况的讨论，相信我们可以在真实的项目管理过程中想出一些办法。

首先，我们需要有一个迭代的思路。迭代思路是为了能够有效地管理项目的范围。还是回到我们所说的图像分类器项目，如果我们利用迭代的思路来进行项目管理，就不会把一个绝对的模型精度当作是项目的唯一目标，而把提高精度当作目标，但事先不会针对精度有过分苛责的追求，那么每一天每一周需要做的工作就相对比较容易可控。

其次，我们需要分清楚项目中哪些部分是相对可控的，而哪些部分是比较不容易控制的。当一个模型被训练出来后，要把这个训练流程形成一个每天可以更新的工作流（Workflow），这个任务是相对比较可控的。可控的部分我们就可以利用软件工程的项目管理方法了，来对这些任务进行细分。那不可控的任务呢？比如希望提高当前模型的精度，或者是数据量大了十倍以上，依然希望能够进行操作等等。针对这些任务都没有直接的答案，寻找解决方法的过程充满了不确定性，那就无法真正利用软件工程的项目手段了。

最后，是人工智能工程项目管理的一个“小窍门”，那就是设置完整的“交工日期”（Deadline）。不同的交工日期往往意味着完全不同的解决方案，甚至这些解决方案之间会有非常大的精度区别。我们的交工日期要建立在迭代思想上，这样就能保证我们的项目在每一个交工日期都有一个成型的结果。如果模型的精度还有提升的空间，我们就可以依赖下一次迭代去完成精度的提高。

小结

今天我为你讲了数据科学团队的一个核心问题，那就是如何针对人工智能项目进行管理。

一起来回顾下要点：第一，我简单介绍了什么是人工智能项目管理；第二，我们分析了两种极端的项目管理模式以及各自的弊端；第三，我们讨论了如何利用两种极端模式来寻求中间路线的办法。

最后，给你留一个思考题，你自己的经验里，人工智能项目在运行过程中，哪些步骤或者说是流程是最消耗时间的？

欢迎你给我留言，和我一起讨论。

138 | 数据科学团队必备的工程流程三部曲

今天，我们继续来聊一聊数据科学团队的一些基础构建思路，讨论一些日常的在“工程流程”方面所需要注意的问题。和我们上一次分享的项目管理不一样，工程流程没有很多可以直接借鉴的经验，需要从业人员进行更多的思考和创新。

什么是工程流程

我们首先来看一看什么是“工程流程”。一般来说，工程流程指的是我们有什么制度或者说是策略来保障所做的项目能够达到一定的质量标准。

那工程流程和项目管理流程有什么区别呢？我们说，项目管理流程是从宏观上把握项目的进展，而工程流程则主要是在微观上，定义和掌控具体的每一个步骤上的输入、输出和过程。从另外一个角度来说，这两者之间并不存在一个必然的关联关系，一个项目在细节的工程流程上成功与否和一个项目自身的最终成功与否，并不能完全划等号。

你是不是有疑问，既然如此，那我们为什么还要关注工程流程呢？原因是虽然一个好的工程流程并不一定带来项目的成功，但是可以增加成功的可能性或者说是概率。同时，一个好的工程流程可以帮助一个团队在日常的运作中减少问题的发生，从而能够达到事半功倍的效果。

那么，工程流程究竟包含哪些方面呢？

我们在今天的分享里讲三个方面。第一，代码管理的流程；第二，开发部署环境的流程；第三，数据管理的流程。这三个流程可以说是涵盖了一个人工智能项目发展和成功所必不可少的三个重要方面。

代码管理流程

人工智能项目一个很重要的环节就是开发代码。然而，因为数据科学、人工智能项目的一些特殊性，从业人员对于代码的管理普遍存在不够重视的情况。

我们在上一期的分享里提到过，数据科学和人工智能的很多项目，往往会被当作学术界的研究项目来进行开发。如果是研究项目，代码开发有哪些特点呢？我简单归纳了两大特点。第一，代码的主要目的是完成学术文章发表所需要的实验结果；第二，在绝大多数情况下，代码很容易变成无人维护和不能继续更新的情况。如果是当作研究项目来开发，那研究人员很可能并不在意代码的可读性、可维护性以及可扩展性等软件工程非常重视的方面，那么这样开发出来的代码就无法真正扩展为一个大型项目的代码库。

那么，对于一个人工智能项目的代码管理，我们需要去关注哪些因素呢？

第一，所有的代码一定要保存在代码版本管理工具中（而不是某一个数据科学家或者工程师自己的电脑上），这也是一个先决条件。在当今的软件开发的工具中，Git（或者是企业级的 GitHub）已经成为了一个标准的工具，用于代码版本管理、追踪和分享。任何项目以及任何人只要开始进行开发，都需要把所有的代码，包括核心的文档存放在代码版本管理工具中。这保证了代码能够被追踪并得到及时的备份。

第二，如果我们利用 Git 或者类似的代码版本管理工具，代码的开发一定要尽量遵循这个版本管理工具所提倡的某种流程。比如，我们有两个工程师在同一个项目中一起工作，在这样的情况下，大部分的代码版本管理工具都可以允许这两个工程师在不同的“分支”（Branch）进行开发。这两个分支和项目当前的“主分支”（Master）又不同，因此，项目目前代码的运行不会受到这两个分支的影响，而这两个分支之间也不会互相影响。尽管进行分支开发已经算是软件开发的一个标准流程了，但是在人工智能项目中，依然有很多开发人员不遵循这个方法来进行代码不同开发进度之间的隔离。

开发部署环境流程

了解了代码版本管理的重要性之后，我们来看一看开发环境流程的控制。

从代码到可以被运行和部署的软件包，成为一个大型互联网产品或者人工智能产品中的一个组成部分，往往还有很多路要走。

首先，开发部署环境中一个重要的组成就是流畅的从代码到部署软件包的“直通流程”。目前在软件开发领域，有诸如“持续集成”（CI，Continuous Integration）和“持续交付”（CD，Continuous Delivery）这样的方法，来帮助工程师能够相对方便地对代码进行包装和部署。我们在这里并不去展开讨论 CI/CD 的内涵，但是要意识到，对于人工智能项目，我们也需要有能够流畅部署的思想。

那么，具体来说，哪个部分需要有流畅部署的思想呢？如果我们从大的角度来看，一个数据科学项目最需要动态更新的部分，往往是模型的产生，也就是说我们希望能够用最新的数据来训练和测试模型，让模型能够考虑到最新的用户行为。因此，就可以说，只要是对模型的产生流程有影响的步骤，都需要能够达到流畅部署。假如我们更新了模型产生的代码，这些代码必须能够快速地反应到生产系统中。

除了快速和持续部署，人工智能项目的另外一个重要需求就是可以对代码的不同分支进行测试和运行。也就是说，我们不仅仅需要能对“主分支”（Master）进行部署，还需要能够对不同的其他分支进行部署，从而能够无缝运行这些不同的分支。

这一点我们在开发环境中往往很容易忽视。举个例子，人工智能项目需要做大量的 A/B 测试，而这些测试中的“控制组”（Control）和“待遇组”（Treatment），往往就对应着代码中不同分支的开发成果。因此，在我们不清楚“待遇组”所对应的代码是不是能够真正带来好处之前，最好不要把这个分支和主分支进行合并。我们首先需要在线测试这个分支的效果，这就带来了运行不同分支的一个需求。

数据管理流程

最后我们来简单聊一聊数据管理流程。这也是从事数据科学项目我们最容易忽视的一个部分。

对于绝大多数的人工智能产品来说，代码，也就是项目的业务逻辑，是和数据是密不可分的。从某种意义上说，我们应该把对数据的关注程度排在第一位。因为即便有正确的代码，如果数据出现偏差，有时候哪怕是一点点小的偏差，都有可能对最后的结果（例如模型）产生重大的影响。因此，我们需要不断地强调数据质量的重要性。

那么，对于一个项目的数据管理，又有哪些方面需要注意呢？

在绝大多数的项目或者是产品中，数据的产生者、数据的运营者以及数据的使用者往往是不同的团队，这是数据管理的最大挑战。这种角色上的差别往往导致了对于数据质量的忽视。

举一个例子，如果数据的产生者是一个产品团队，在最近的一次软件更新中，一个工程师把旧代码中对数据进行追踪的部分主观臆断地删除了一些字段，或者是为了变量名好看，更改了字段的名字。如果这个更新没有通知数据的运营者或者是使用者，这往往会带来什么后果呢？后果是下游整个软件线的流程中，数据可能发生重大变化。严重的时候，这样的问题会导致模型发生完全异常，产生不可控的后果。

因此，从“端到端”的思维来考虑数据链路是非常有必要的。在数据的产生、运行和使用的链条上，所有的用户必须达成某种数据的 API，或者说是“共识”。任何对于数据的改变都需要在满足这种共识的基础上来沟通和进行。同时，数据的检测也是非常重要的，否则就是“垃圾进入导致垃圾输出”。

小结

今天我为你讲了数据科学团队的另外一个核心问题，那就是如何对工程流程进行管理。

一起来回顾下要点：第一，我们简单介绍了什么是人工智能项目的工程流程，以及这个概念和项目管理流程的区别；第二，我们分析了人工智能项目工程流程的三个主要方面，包括代码管理的要素，如何开发和部署环境，以及数据管理的要素。

最后，给你留一个思考题，除了我们所提及的工程流程的这三个方面，你还能想到什么其他的方面，在工程流程中也是至关重要的，需要我们在开发中注意呢？

欢迎你给我留言，和我一起讨论。

139 | 数据科学团队怎么选择产品和项目？

上一期内容，我们聊了聊数据科学团队在工程流程方面所需要注意的三大问题，分别是代码管理流程，开发部署环境流程和数据管理流程。

今天，我们来继续讨论数据科学团队发展这个话题，来看另外两个关键问题：如何选择合作产品以及如何选择项目。

如何选择合作产品

选择什么样的产品进行合作，对于一个数据科学或者人工智能团队的发展来说，是一个非常重要的问题，是决定工作能否事半功倍的关键步骤。

作为工程技术团队，很多数据科学或者人工智能团队都需要支持多个产品，或者说是有机会选择产品。一个稳定的产品往往可以让一个人工智能团队得到快速健康的发展，并且能够逐渐形成良性循环，发展到可以支持更多的产品。

那么，什么样的产品是值得合作的产品呢？

我先来说一类需要谨慎合作的产品，那就是全新的产品方向。对于全新的产品来说，公司之前在这个方向没有太多的产品积累，也可能完全没有技术积累。对于这一类项目，我们需要格外小心，特别是当你的团队还在发展的初期。

新产品有一个特点，那就是极大的不确定性。产品范围、需求和时间一般都是不确定的，这些都是一个稳定项目的天敌。另外，还有一个比较棘手的问题，那就是新的产品方向，特别是公司以前从来没有研发过的项目，往往缺乏数据。对于机器学习来说，数据匮乏就是“巧妇难为无米之炊”了。

然而从另外一个角度来说，新的产品方向往往又能得到公司高层的重视。毕竟新产品往往是公司“新的赌注”（New Bet），所以很多时候也能够得到不少团队的支持和资源的倾斜。

那么，在这种情况下，如果你是数据科学团队的负责人，你就要对这个新产品的利弊有一个充分的认识。如果你的团队已经相对比较成熟，有好几个稳定的产品支持，还有一些剩余的资源可以分配，那么接受一个全新的产品也不失为一种尝试，虽然有一定的风险。最坏的情况是这个产品方向完全失败，但是不会对团队产生致命的影响。

了解了这种风险比较高的产品之后，我们来看一看什么类型的产品更值得一个人工智能团队来合作。总结来说，这样的产品一般需要满足以下两个方面。

第一，看方向，这个产品最终是需要数据来驱动的。如果一个产品最终会产生大量的数据，而且这些数据能够表征这个产品方方面面的发展，那么，针对这样的项目，人工智能可以起到巨大的推动作用。

第二，看地位，这个产品是公司的核心发展项目。这一点看似容易识别，但是在一个相对比较大的公司里，有时候反而并不那么容易识别。那怎么判断呢？介绍一个相对比较简单的方法，就是看一个产品是否和公司的利润或者说是公司的核心用户数据有关系。因为从公司的层面看，一个团队的投资回报率很关键，很多时候会以此来决定是否继续支持这个团队的发展。

举个例子，有这么一个产品，虽然不直接产生公司的利润，但是能够帮助公司增长用户，那这个项目也可以算是公司的核心项目。能够支持公司的核心项目，是人工智能团队稳定快速成长的基石。

如何选择项目

选择好了合作的产品之后，一个产品的迭代过程中还会产生很多不同的项目。是不是这些项目都值得做呢？接下来我们就来看一看究竟应该选择什么样的项目来做。

关于项目的选择，我们先有这样一个共识。在团队和产品发展的不同时期，对于如何选择项目应该有不同的考虑。

在这里，有一种思维模式可以帮助我们来对不同的项目进行筛选，那就是“投资组合”（Portfolio）的思维。通俗地讲，投资组合思维的核心就是“不能把所有的鸡蛋都放在一个篮子里”。

简单来说，我们可以利用四象限法，把不同的项目分为“高投入、高回报”、“低投入、高回报”、“高投入、低回报”和“低投入、低回报”这四种类型。那么，针对这四种不同的类型，我们就需要利用投资组合的思路来选择项目。

从理论上来说，我们希望所有的项目都是“低投入、高回报”的，肯定不希望项目是“高投入、低回报”。那么，从表面上看，对于项目的选择，我们其实并没有太多可以争议的地方。但是，实际的情况是，对于绝大多数项目来说，我们并不知道这个项目属于什么类型，最好的情况也无非是对项目有一个估计，而这种估计很有可能会和真实情况相差甚远。

因此，对于投资组合的思路来说，这不仅仅是一种对于投入和回报的估计，还包括对于不同类型项目的选择。这里呢，我就讲一些在以往工作中积累的项目选择经验。

一般来说，对于一个人工智能项目来说，特征工程（Feature Engineering）都是属于“高回报”的项目。对于大多数的类似项目来说，特征工程往往能够针对项目带来本质上的提升。寻找到好的特征是一个项目能够持续成功的重要途径。

在“高回报”的情况下，我们需要考虑的是，这个项目是“高投入”的？还是“低投入”的？如何评价一个特征工程项目的投入成本呢？我们问以下三个问题。这个项目可以基于现在的数据链路（Pipeline）来做吗？是否只是计算一些数据的简单统计量？是否只是把每天不同的统计量做一些叠加？如果三个问题的答案都是“是”，那么这种类型的特征工程项目就属于“低投入”。

在一个产品的早期，应该尽量尝试这样的项目，快速发现有用的，特别是那些能够让产品的效果得到迅速提升的特性。而且，因为特征工程“高回报”的特点，在产品迭代的任何一个时期，我们其实都可以关注某一部分的特征工程项目。只是说，也许在产品的初期，找到一系列特征，或者说挖掘出一系列有效的特征，往往会非常容易；但是在产品的中后期，难度就要大一些。

我介绍的另一个经验可能和你想象的不太一样，对于核心算法（例如搜索、推荐、广告）的改进，比如改进排序算法属于“高投入”的项目。这类改进算法项目的一个明显特点，就是往往需要有较长时间的研发周期。而且，这类项目的升级换代往往需要“基础设施”（Infrastructure）或者平台级别的变化。也就是说，这类项目的投入比较大，周期比较长。

当然了，这类项目的回报如何，其实并不是特别容易估算的。例如，我们在特征不变的情况下，从线性模型更改到树模型，可能会有 5%~10% 的性能提升。但是更改到树模型之后，也许我们还能够加入更多适应于树模型的特性，带来后面的 10%~20% 的提升。因此，如果考虑到一个回报的系列性效果，算法的更改升级还是应该引起我们足够的重视的。

小结

今天我为你讲了数据科学团队的两个核心问题，那就是如何选择产品以及如何选择项目。

一起来回顾下要点：第一，我们聊了聊产品的选择，尽量对新产品持谨慎态度，同时尽量支持并开发公司的核心产品；第二，我们分析了如何选择项目，重点是对四种类型的项目进行一个探讨。

最后，给你留一个思考题，如果我们希望从树模型升级到“深度模型”，这种项目属于我们介绍的四种类型项目中的哪一类呢？

欢迎你给我留言，和我一起讨论。

155 | 微软研究院：工业界研究机构的楷模

随着人工智能的兴起，各大公司纷纷建立起自己的研发团队，来对这一重要技术领域进行探索。一些有一定规模的公司还会成立更加精英的“研究院”或者“实验室”，吸引业界顶尖人才到自己的公司进行基础的和前沿的研发工作。

那如何来组建这样的机构呢？有没有可以参考的类似机构呢？答案是有这样一个机构，甚至很多公司会不惜重金去聘请这个机构的研究和管理人才。今天我们就来聊聊这个机构，那就是“微软研究院”。

微软研究院自 1991 年成立以来，已经走过了接近 40 年的岁月。依托于微软这个软件时代的巨头，微软研究院也和微软公司一起经历了从软件时代到互联网时代、到移动时代、再到人工智能时代的重大变迁，见证了这几个时代中前沿科技对公司的影响。

微软研究院的历史有多辉煌呢？至少有五位图灵奖得主曾经在微软研究院工作过，包括发明了“霍尔逻辑”和快速排序的托尼·霍尔（Tony Hoare）爵士、在数据库领域有卓越贡献的吉米·格雷（Jim Gray）、个人计算的先驱巴特勒·兰普森（Butler Lampson）、个人电脑的先驱查尔斯·萨克尔（Charles P. Thacker）和在分布式算法方面有突出贡献并发明了 LaTeX 排版语言的莱斯利·兰波特（Leslie Lamport）。研究院里的美国科学院院士、工程院院士、IEEE 院士以及其他各类最高学术成就获得者，可以说是数不胜数。更别提发表了 2 万多篇论文，每年都有各种激动人心的项目的研发。从很多角度来看，微软研究院都堪称工业界研究机构的模板。

接下来我们就一起来梳理一下微软研究院这个具有传奇色彩研究机构的传奇故事。

微软研究院的成立

虽然微软研究院在工业界研究机构中有着显赫的地位，但是其最早的发展则鲜为人知。我们了解微软研究院成立的早期历史，也是为了体会一下缔造者们的思想和视野，以及他们是如何一步一步地把一个小的团队发展成为了工业界的典范的。

先介绍第一个关键人物，他的名字叫内森·米尔沃德（Nathan Myhrvold）。1996 年，他成为了微软历史上首位首席科技官（CTO）。米尔沃德说服了比尔盖茨等微软高层来建立一个研究性质的机构。这个决定其实让很多人都感到出乎意料，那米尔沃德是怎么想的呢？

他认为，微软之前的成功是把大型计算机的一些经验移植到了当时方兴未艾的小型计算机，也就是个人电脑上。这样把现成经验进行产品转换的思路迟早会让微软黔驴技穷，应该及早着眼于一条能够“持续造血”的路，所以微软需要有一个长期专注基础研究的部门。

米尔沃德不仅仅只是提出了这样一个洞见，他还为基础研究的一些特性拟定了基调。首先，基础研究或者说是更高级的研发工作和产品开发有本质的区别。其次，有时候基础研究并不一定能给母公司带来足够的好处，但这种失败率其实和普通的产品研发也很类似，因此没有必要因为基础研究的一些失败而过分敏感。

同时，米尔沃德对基础研究能够给公司带来什么样的好处也做了深刻思考，他总结了三点：第一，基础研究能够让公司在时间上获得接触到最新科技的优势；第二，能够帮助公司更广泛地接触先进技术；第三，能够给公司带来知识财产，比如专利等。

当这个在微软建研究机构的想法得到认同后，米尔沃德希望为这个新的研究部门找一个领军人，他想到了理查德·拉希德（Richard Rashid），这是我们要介绍的第二个关键人物。

拉希德于 1974 年从斯坦福大学毕业，获得数学和比较文学的学士学位。1980 年，他在罗杰斯特大学（University of Rochester）获得计算机科学博士学位，然后成为了卡内基梅隆大学计算机系的一名教授。在担任教授期间，他在计算机系统、网络系统、人工智能以及编程语言等诸多领域发表了众多论文。除了论文之外，他比较有影响的工作还包括一款叫作“Mach”的计算机操作系统微内核。

米尔沃德通过共同的好友找到拉希德，那已经是 1991 年夏天的事情了。拉希德的第一反应是觉得这是一个玩笑。1991 年，微软还不是今天这样的大公司。一家规模并不大的公司要成立一个研究机构让人感觉不太现实。

拉希德和家人被邀请到微软访问，和比尔盖茨以及其他微软的管理高层见了面。他原以为微软的人并不明白建立一个研究部门要干什么，也不一定真心希望有这么一个研究机构。所以，当发现比尔盖茨非常支持并且非常真诚地理解建立研究机构的需求时，拉希德还是相当吃惊的。然而，即便如此，他还是拒绝了这个邀约，因为他当时觉得对这个职位并不感兴趣。

米尔沃德也没放弃，在接下去的一段时间，他把拉希德的电话打烂了。恰好在这个时候，拉希德也迎来了他职业生涯的一个选择关口，卡内基梅隆大学希望他出任计算机学院的院长。这样，他就需要在两份工作邀约之间做一个抉择。

时间到了 1991 年的 8 月 31 日，拉希德决定出任微软研究院的院长。从 1991 年到 2013 年，拉希德都是微软研究院的领导人。这个研究机构在他带领下的 20 多年时间里发生了惊天动地的变化。

微软研究院模式

刚刚我们回忆了微软研究院历史中最初的一个片段。但是从这个片段中，我们其实已经体会到了这个组织之所以成功的一些因素，这些因素是在最开始就深深根植到了组织的架构中的。

第一个要素是研究院的领导人一定要有深厚的研究背景。成立研究院的时候，米尔沃德第一时间想到的是到学术界找到一个学术权威。实践告诉我们，正是拉希德的加入，让微软研究院在招收顶级人才方面有着无与伦比的优势。当然，是不是任何一个学术大家都胜任这样的工作呢？这是另外一个值得我们思考的问题。

具体来说，拉希德带来的优势有哪些呢？一方面，他可以借助曾经是卡内基梅隆大学教授这个身份从学校吸引人才；另一方面，他在学术界的朋友也会因此加入。实际上，拉希德决定加入微软研究院后，第一个电话就打给了他在 IBM 研究院的一个好友，邀请他加入微软。而拉希德卸任之后接手微软研究院的彼得·李（Peter Lee）也曾经是卡内基梅隆大学计算机系的主任。

由此看来，虽然米尔沃德在一开始颇费了一番工夫才把拉希德纳入微软，但是后续的招聘工作就相对顺利起来。类似地，李开复到北京建立微软亚洲研究院，基本上也是一样的思路。

第二个要素就是研究院这样的部门必须要有公司最高层的一致支持。这种支持还必须是一种真诚的支持。试想没有米尔沃德和比尔盖茨以及微软高层和拉希德的真挚交流，拉希德不可能选择加入微软研究院，那这个机构是否还存在可能就是另外一番光景了。微软高层对研究院的支持不是一朝一夕，而是 30 多年来一直如此。并且在最近的人工智能浪潮下，这种支持只增不减，这也是这个机构能够成功的一个重要因素。

第三个要素也就是公司的高层一定要明确研究院究竟会对公司造成什么样的影响，或者说，要对研究院的产出有一个合理预期。从这一点来说，微软的早期领导人非常明确地认识到基础研究和一般的产品开发是有区别的，并且对基础研究的失败率有一个完整的理解。这一点是非常惊人的。对于 1991 年的微软，就能有这样一种非常不容易的状态，并且还能够一致保持这样状态，这也许就是这个机构和这家公司几经沉浮依然茁壮发展的秘诀。

小结

今天我和你一起简单回顾了微软研究院早期的一些不为人知的历史，并归纳了微软研究院成功的三个要素。

最后，给你留一个思考题，微软最近又在研究院的基础上成立了一个全新的 AI 部门，你觉得原因是什么？这个部门和研究院是不是有重叠呢？

欢迎你给我留言，和我一起讨论。

156 | 聊一聊谷歌特立独行的混合型研究

上一讲我们介绍了微软研究院发展早期的一段故事，一起讨论了为什么说微软研究院是工业界研究院的楷模。

今天我们来看另外一种“混合型”的工业界研究机构模式，聊一聊谷歌研究院，一起来讨论这种模式是不是更加适合互联网企业的需求。

研究背景起家的谷歌

谷歌的创立比微软晚了将近 20 年，但两个公司有一些相似的地方，其中之一就是创始人都是中断了学业，投身到创业的浪潮中。不过拉里·佩奇（Larry Page）和谢尔盖·布林（Sergey Brin）当时是在攻读博士学位，关于如何进行网页搜索的最初想法，是从他们的博士研究课题衍生出来的 [1]。由此可见，谷歌从一开始就和研究类项目有着千丝万缕的联系。

佩奇和布林的论文发表在 1998 年的国际万维网（WWW）大会上。这篇论文介绍了 PageRank 算法，在当时这简直就是一个石破天惊的算法。那它和当时其他搜索引擎的关键技术相比，独特之处在哪里呢？计算网页的相关度或者说是重要度完全不依赖文本信息，而仅仅依靠由网页之间关系组成的图，而且能够得到一种非常稳定的排序。或许就是因为这个独特的算法让两个斯坦福大学的年轻人放弃了继续攻读博士学位的想法，转身在硅谷找了一个车库，从而演绎了一个传奇的创业故事。

或许就是因为创始人的背景，我们可以看到谷歌对学术界的最新研究成果有一种特殊的青睐，在谷歌发展的路上，屡屡上演收购案例，收购的很多公司都是因为有一些研究成果而成立的小公司。

举几个例子。同样来自斯坦福的博士毕业生塔哈尔·哈维利瓦拉（Taher H. Haveliwala），改进了 PageRank 算法 [2]，他创办的公司在 2003 年的时候被谷歌收购。2010 年，达蒙·霍洛维兹（Damon Horowitz）和瑟潘达·卡姆瓦尔（Sepandar D. Kamvar）在当年的国际万维网大会上发表了一篇“社交搜索”（Social Search）的论文，论文标题都跟佩奇和布林当年发表的 PageRank 论文有异曲同工之妙。两个作者所在的公司很快就被谷歌收购了。最近的例子就是我们都熟知的杰弗里·辛顿（Geoffrey Hinton）所创立的公司以及位于英国的 DeepMind 公司，也都是因为在深度学习方面的重要贡献被谷歌先后收购。

混合型工业界研究

尽管谷歌对于学术研究有一种天然的亲近，然而在很长一段时间里，谷歌其实并没有真正成立完全独立的基础研究部门。所以很多学术圈的研究人员，还有工业界的研究同仁，都对谷歌产生了一种误解。

2012 年的时候，谷歌的研发总监彼得·诺维格（Peter Norvig）发表了一篇文章 [4] 来介绍谷歌的研究模式。

谷歌的研究模式到底是怎样的呢？简单来说，就是让研究和产品的研发紧密结合起来，而不完全建立独立运行的研究院。当然，这个模式在收购了 DeepMind 之后算是被打破了。但是在谷歌 20 年的发展历史上，混合型研究一直是谷歌研发的主流。

诺维格在文章中解释道，谷歌研究工作的一大重要目的就是为终端用户带来重要的和实际的好处。很明显，这一目的和纯粹的学术研究有很大的距离。我们来看微软研究院和雅虎研究院，它们的重要贡献指标就是学术论文发表的质量和数量。

我们再具体来看看这两种道路的差异。

传统的学术研究是这样的：研究人员首先构想一个学术课题，然后在一种比较受限的环境中对这个课题进行研究。这里说的受限的环境，往往是指数据并不是全量数据，而是采样过后的数据，这些数据能够在学者们的笔记本或者小型集群中进行计算。甚至在有的情况下，研究人员会使用完全虚拟的数据。另外，在这种受限的环境中进行研究还会带来这样一个问题，由于开发的代码和软件不需要重复使用，也不需要开发生产环境的代码，所以这些代码质量都相对较低。

那谷歌的研究工作是怎样做的呢？谷歌研究要求从一开始就使用生产环境来编写代码。这些代码和普通的产品代码没有区别，也使用和一般产品线代码相同的数据、相同的流程。这样，一旦有了研究成果就可以无缝接入现在的产品线中。这样的要求对于研究者来说，其实是拔高了研究的难度，但是对于研究成果和产品对接来说就将困难降低到了最小。

总结一下，让工程和研究结合在一起，并且有意模糊这两者的区别，就是谷歌混合型研究的核心思想。工程师和科学家在同样的项目中工作，大家都面临同样的限制，这样就可以让研究的课题不至于完全天马行空，而是能够落到实处。

混合型研究的思考

我们上面介绍了谷歌的研究背景以及基于此慢慢形成的混合型研究模式。为什么这条道路在谷歌就能够落地实施呢？我想这里面有一个非常重要的先决条件，这是诺维格的文章里没有提到的，那就是大量高素质人才的涌入。

在这些人才中，博士生比比皆是，甚至有很多教授。所以，谷歌的工程团队中有很多博士生担任着普通工程师的角色。说得通俗一点，谷歌用博士生在干硕士生甚至是本科生就可以胜任的工作。一个团队中的工程师和科学家并没有本质的区别，这才使得任何一个科研想法都可以很容易地在工程层面得以实现。

由此我们可以看到，从某种意义上来说，谷歌其实并不需要单独的研究机构，自己工程团队的水平就已经非常出色了。我们从 TensorFlow、语言翻译等知名项目就可以看出来，这些项目都是工程团队达到了很高的研究水平。

当然，在这种模式下，谷歌的基础研究其实是受限的。在收购了 DeepMind 后，谷歌也开始依靠这样单独的研发机构来推动和产品结合得不那么紧密的研究方向。

小结

今天我为你介绍了谷歌与众不同的混合型研究模式。这种模式对工程团队的水平要求比较高，如果没有高水平的工程团队，研究人员和工程师就会产生隔阂，沟通不畅，研发就会有问题。从这个角度来看，建立单独的研究机构或许更能实现很多公司的初衷。

讲到这里，如果我们要借鉴谷歌的这种混合型模式，你觉得挑战是什么？如果有了高水平工程团队这一保障后，你觉得想要成功还有什么挑战？

欢迎你给我留言，我们一起讨论。

参考文献

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.

Taher H. Haveliwala. Topic-sensitive PageRank. Proceedings of the 11th international conference on World Wide Web (WWW '02). ACM, New York, NY, USA, 517-526, 2002.

Damon Horowitz and Sepandar D. Kamvar. The anatomy of a large-scale social search engine. Proceedings of the 19th international conference on World wide web (WWW '10). ACM, New York, NY, USA, 431-440, 2010.

Alfred Spector, Peter Norvig, and Slav Petrov. Google’s hybrid approach to research. Commun. ACM 55, 7 (July 2012), 34-37, 2012.

复盘 6 | 数据科学家与数据科学团队是怎么养成的？

今天，我准备了 24 张知识卡，和你一起复盘数据科学家养成和数据科学团队的养成这两个模块。在这两个模块里，我们一共讨论了 8 个话题，从方方面面分享了数据科学家所需具备的技能；也从组建一个团队的角度出发，让你更了解自己在团队中的角色；最后，我们还聊了雅虎研究院等知名团队，帮你拓展视野。

提示：点击知识卡跳转到你最想看的那篇文章，温故而知新。

数据科学家基础能力

数据科学家高阶能力

数据科学家职场话题

数据科学家套路

数据科学团队基础

数据科学团队招聘

数据科学团队高级话题

著名数据科学人工智能团队漫谈

积跬步以至千里

最后，恭喜你学完了这个模块的所有内容。不管你是一名数据科学或人工智能的初学者，还是已经积累很多宝贵的经验，亦或要组建自己的数据科学或人工智能团队，都希望这一模块的内容对你有所帮助和启发。

学无止境，选择了人工智能这条路，就意味着我们选择了一种生活方式。今天就让我们以几句诗结尾，作者是我很喜欢的美国诗人罗伯特·弗罗斯特（Robet Frost）。

Two roads diverged in a wood, and I—

I took the one less traveled by,

And that has made all the difference.

树林中分出两条路，而我——

我选择了那条少有人走的路，

从此一切与众不同。

欢迎你给我留言，和我一起交流讨论。

002 | 聊聊2017年KDD大会的时间检验奖

国际数据挖掘与知识发现大会ACM SIGKDD（ACM SIGKDD Conference on Knowledge Discovery and Data Mining），简称KDD，是由美国计算机协会ACM（The Association for Computing Machinery）的数据挖掘与知识发现专委会SIGKDD（Special Interest Group on Knowledge Discovery and Data Mining）主办，堪称数据挖掘研究领域的顶级会议。

KDD 最早是从 1989 年开始的 KDD 研讨班（Workshop）发展而来，当时的研讨班依托于人工智能顶级会议 IJCAI 大会或者 AAAI 大会，而后在 1995 年升级成为会议的模式，到现在已经有 20 多年的历史。今年的 KDD 大会于 8 月 13 日至 17 日在加拿大哈利法克斯成功召开。

SIGKDD 每年都会奖励一篇论文，这篇论文要在过去十年间对研究、方法论以及实践产生重大影响，这就是所谓的时间检验奖（Test of Time Award），引用次数以及对一个领域的影响力度是评选这个奖项的重要指标。

2017 年的 KDD 时间检验奖授予了美国康奈尔大学信息科学系主任、计算机科学系教授索斯藤·乔基姆斯（Thorsten Joachims）。这次授予是为了表彰他的论文《线性时间内训练线性支持向量机》（Training Linear SVMs in Linear Time），这篇论文也是 2006 年的 KDD 最佳论文，引用数超过 1600 多次。

Thorsten 的学术贡献

Thorsten 是一位机器学习界享有盛誉的学者，也是 ACM 和 AAAI 的双料院士，他所有论文的引用数加起来超过了 4 万次。2001 年从德国多特蒙德大学博士毕业后，他正式加入康奈尔大学从事机器学习研究。

获得这个奖项之前，Thorsten 曾多次获得重要奖项，比如 2017 年 ACM WSDM 的最佳论文奖（Best Paper Award）、2016 年 ACM SIGIR 的时间检验奖、2015 年 ACM KDD 的时间检验奖、2009 年 ECML 的最佳论文奖、2009 年 ICML 的 10 年最佳论文奖（Best 10-Year Paper Award）、2006 年 ACM KDD 的最佳论文奖、2005 年 ICML 的最佳论文奖、2005 年 ICML 的优秀学生论文奖、2005 年 ACM KDD 的最佳学生论文奖等。

Thorsten 在机器学习领域一直有着非常特殊的贡献。首先，他在支持向量机（SVM）的应用上做出了诸多努力。比如这次的时间检验奖，就是奖励他如何把支持向量机的训练达到线性复杂度，从而使支持向量机在大规模数据上的应用成为可能。

Thorsten 还致力于把支持向量机的基本算法，也就是仅仅支持分类问题和回归问题的算法，应用到更加复杂的有结构的输出结果上，俗称结构化的支持向量机算法。得益于这项工作，支持向量机可以对信息检索中很多复杂的、非二分的评估指标进行直接优化，如 F1 值（F-score）、平均精度均值（Mean Average Precision），从而让支持向量机的应用变得更加广阔。

在让支持向量机能够顺利应用到信息检索的过程中，Thorsten 还发现了另外一个问题，那就是如何利用搜索引擎的间接用户反馈（Implicit Feedback）来训练排序算法（经常是一个结构化的支持向量机模型）。具体来说，传统的搜索系统和信息检索系统主要是依靠人工标注的训练数据来进行优化和评估。这里所说的人工标注训练数据，主要是指人为地评价目标查询关键字和所对应的网页是否相关。

早期大家发现，虽然搜索引擎可以利用这样的数据来优化排序算法，但是搜索引擎在使用过程中会产生很多用户数据。这些数据可以是用户点击搜索页面结果产生的信息，也可以是其他的信息（比如用户在搜索页面的驻留时间等等）。早期这些信息并没有用于优化搜索引擎。以 Thorsten 为主的一批学者意识到点击信息的重要性，然后开始利用这些数据来训练和评估排序算法。这是 Thorsten 的第二个主要学术贡献。

Thorsten 第三个主要学术贡献，也是他最近几年的学术成功，那就是把因果推论（Causal Inference）和机器学习相结合，从而能够更加无偏差地训练模型。可以说这部分工作开创了一个新领域。

长期以来，如何有效地应用用户产生的交互数据来进行模型训练，都是大规模机器学习特别是工业界机器学习的难点。一方面，工业系统能够产生很多用户数据；另一方面，这些用户数据又受到当前部署系统的影响，一般都有一定的偏差。

因此工业级机器学习系统面临一个长期挑战，那就是，如何能够在评估模型以及训练模型的时候考虑到这样的偏差，从而去除这样的偏差。

Thorsten 利用因果推论中的倾向评分（Propensity Scoring）技术以及多臂赌博机（Multi-armed Bandit）思想，把这样的方法成功地引入到机器学习中，使得无偏差地训练模型成为可能。目前，这方面的新研究和新思想正在机器学习以及应用界产生越来越多的共鸣。

线性大规模支持向量机

回到这篇时间检验奖的论文，它解决的是大规模优化支持向量机的问题，特别是线性支持向量机。这篇文章第一次提出了简单易行的线性支持向量机实现，包括对有序回归（Ordinal Regression）的支持。算法对于分类问题达到了 O(sn)（其中 s 是非 0 的特征数目而 n 是数据点的个数），也就是实现了线性复杂度，而对有序回归的问题达到了 O(snlog(n)) 的复杂度。算法本身简单、高效、易于实现，并且理论上可以扩展到核函数（Kernel）的情况。

在此之前，很多线性支持向量机的实现都无法达到线性复杂度 。比如当时的 LibSVM（台湾国立大学的学者发明）、SVM-Torch、以及早期的 SVM-Light 中采用的分解算法（Decomposition Method）都只能比较有效地处理大规模的特征。而对于大规模的数据 (n)，则是超线性（Super-Linear）的复杂度。

另外的一些方法，能够训练复杂度线性地随着训练数据的增长而增长，但是却对于特征数 N 呈现了二次方 (N^2) 的复杂度。因此之前的这些方法无法应用到大规模的数据上。这样的情况对于有序回归支持向量机更加麻烦。从德国学者拉尔夫·赫布里希（Ralf Herbrich）提出有序回归支持向量机以来，一直需要通过转化为普通的支持向量机的分类问题而求解。这个转换过程需要产生 O(n^2) 的训练数据，使得整个问题的求解也在这个量级的复杂度。

这篇文章里，Thorsten 首先做的是对普通的支持向量机算法的模型形式（Formalism）进行了变形。他把传统的分类支持向量机（Classification SVM）写成了结构化分类支持向量机（Structural Classification SVM），并且提供了一个定理来证明两者之间的等价性。粗一看，这个等价的结构化分类支持向量机并没有提供更多有价值的信息。然而这个新的优化目标函数的对偶（Dual）形式，由于它特殊的稀疏性，使它能够被用来进行大规模训练。紧接着，Thorsten 又把传统的有序回归支持向量机的优化函数，写成了结构化支持向量机的形式，并且证明了两者的等价性。

把两种模型表达成结构化向量机的特例之后，Thorsten 开始把解决结构化向量机的一种算法——切割平面算法（Cutting-Plane），以下称 CP 算法，运用到了这两种特例上。首先，他展示了 CP 算法在分类问题上的应用。简单说来，这个算法就是保持一个工作集合（Working Set），来存放当前循环时依然被违反的约束条件（Constraints），然后在下一轮中集中优化这部分工作集合的约束条件。

整个流程开始于一个空的工作集合，每一轮优化的是一个基于当前工作集合的支持向量机子问题，算法直到所有的约束条件的误差小于一个全局的参数误差为止。Thorsten 在文章中详细证明了这个算法的有效性和时间复杂度。相同的方法也使得有序回归支持向量机的算法能够转换成为更加计算有效的优化过程。

Thorsten 在文章中做了详尽的实验来展现新算法的有效性。从数据的角度，他使用了 5 个不同的数据集，分别是路透社 RCV1 数据集的好几个子集。数据的大小从 6 万多数据点到 80 多万数据点不等，特征数也从几十到四万多特征不等，这几种不同的数据集还是比较有代表性的。从方法的比较上来说，Thorsten 主要比较了传统的分解方法。

有两个方面是重点比较的，第一就是训练时间。在所有的数据集上，这篇文章提出的算法都比传统算法快几个数量级，提速达到近 100 倍。而有序回归的例子中，传统算法在所有数据集上都无法得到最后结果。Thorsten 进一步展示了训练时间和数据集大小的线性关系，从而验证了提出算法在真实数据上的表现。

第二个重要的比较指标是算法的准确度是否有所牺牲。因为有时候算法的提速是在牺牲算法精度的基础上做到的，因此验证算法的准确度就很有意义。在这篇文章里，Thorsten 展示，提出的算法精度，也就是分类准确度并没有统计意义上的区分度，也让这个算法的有效性有了保证。

Thorsten 在他的软件包 SVM-Perf 中实现了这个算法。这个软件包一度成了支持向量机研究和开发的标准工具。

小结

今天我和你分享了 Thorsten 的这篇论文，堪称支持向量机文献史上的经典。一起来回顾下要点：第一，Thorsten 在机器学习领域有三大主要学术贡献；第二，这篇论文理论论证非常扎实，算法清晰，而且之后通过有效的实验完全验证了提出算法的有效性。文章开启了支持向量机在搜索领域的广泛应用，不愧为 2006 年的 KDD 最佳论文以及今年的时间检验奖论文。

最后，给你留一个思考题，在什么应用场景下，线性大规模支持向量机可以有比较好的效果？

欢迎你给我留言，和我一起讨论。

扩展阅读：Training Linear SVMs in Linear Time

012 | 精读2017年KDD最佳研究论文

前面我们介绍过 KDD 大会的时间检验奖，每年大会的另外一个亮点奖项就是最佳论文奖，有两类，一类是最佳研究论文，一类是最佳应用数据科学论文。今天我就先来说说前者。

大会每年都会在众多的学术研究论文中，选择最有新意和价值的研究论文，评选出最佳研究论文的第一名和第二名。从过去十多年的经验来看，KDD 历年的最佳研究论文，都会对之后很多领域的研究有开创性的影响。因此，不论是从阅读经典文献的角度，还是从学习最新研究成果的角度来说，认真分析和探讨每年的最佳研究论文都是一个不错的选择。

今天，我就带你认真剖析一下 KDD 2017 年的最佳研究论文《通过挖掘类比关系加速创新》（Accelerating Innovation Through Analogy Mining）。

作者群信息介绍

第一作者汤姆·霍普（Tom Hope）来自耶路撒冷的希伯来大学（The Hebrew University of Jerusalem），计算机博士，在读第三年。同时，他还是英特尔以色列的资深数据科学员，对深度学习的很多方面都有研究。目前他正在写一本基于 TensorFlow 的深度学习简明技术书籍。

第四作者达夫娜·沙哈夫（Dafna Shahaf）是霍普的博士导师，目前在希伯来大学计算机系任助理教授。达夫娜于 2012 年从卡内基梅隆大学博士毕业。她曾经在微软研究院以及富士通公司实习，并在斯坦福大学攻读博士后。达夫娜的论文曾获得 2010 年的 KDD 最佳研究论文，可以说她一直站在机器学习研究的前沿。

第二作者乔尔（Joel Chan）是来自卡内基梅隆大学人机交互学院的科学家。乔尔于 2014 年从匹兹堡大学毕业，获得认知心理学博士学位。他一直在人机交互领域进行研究。

第三作者安尼凯特·科图（Aniket Kittur）是来自卡内基梅隆大学人机交互学院的副教授。他于 2009 年从加州大学洛杉矶分校毕业，获得认知心理学博士学位，之后就一直在卡内基梅隆大学任教。

从整个作者群的情况来看，这篇文章是一个比较典型的机器学习技术与人机交互领域的交叉成果。

论文的主要贡献

我们先来看一下这篇文章的主要贡献。当然，要想深入理解这篇文章的贡献，我们还要先弄明白，这篇文章主要解决的是一个什么场景下的问题。

这篇文章主要阐述了帮助创新的一个重要步骤，那就是如何找到合适并且有效的类比案例。什么叫作类比案例？在人类发展的历史上，特别是科学技术的革新历程中，有很多重要的发明发现，都是因为当时的科学家借鉴了一些类似场景中的解决方案，或者是从这些场景中获取了灵感，进一步做出了创新。在这个步骤中，从类似场景中借鉴往往被称作类比。

比如，莱特兄弟从自行车中得到灵感，制造出了可以滑行的飞行器。再比如，诺贝尔生理学或医学奖得主萨尔瓦多·卢里亚从对赌博机运行的观察中，进一步发现了细菌基因突变的规律。同时，类比在很多国家的法律，不管是成文中或者是运行中都比比皆是。因此，我们可以看到，如何找到合适的类比，并能从中获取灵感，可能就是创新的一个关键因素。

时至互联网时代的今天，我们已经有很多数据库、文献库可以作为获取类比灵感的重要数据源泉。比如，谷歌学术搜索（Google Scholar）有上百万的论文和专利信息；OpenIDEO 有上百份关于社会问题的分析；Quirky 有超过两百万份的产品构想；InnoCentive 有超过四万份的社会、政治以及科技方面的解决方案；美国专利局有超过九百万份的专利信息，类似的例子还有很多。

与此同时，海量数据也为寻找灵感带来了很大的挑战。如何才能在这些百万级别的信息库里快速定位可能的类比场景，就成了阻碍创新速度的一大瓶颈。

找到类比场景有一个很大的挑战，那就是如何定义“类似”或者“相似”。如果仅从一些表面特征来看，很多场景之间的相似程度是很低的。因此，好的类比场景一定是能够找到，刨除表象相似以外的深层次相似的案例。另外一个挑战就是，寻找类比场景中，是否能有一个非常丰富的数据结构来支持推理，如果有，往往就能有比较简单的方法。

这篇论文的重点是如何从海量的无结构或者弱结构的文本数据中找到这样的类比。我们可以看出，这确实是一个巨大的挑战。

理解了这篇论文的目的，我这里就直接给你总结一下它的贡献，那就是提出了一种自动的在海量无结构的文本数据中挖掘类比场景的方法。这篇文章关注的是产品信息数据。作者们通过实际的数据，验证了提出的方法比之前的一些文本处理方法更加有效。

论文的核心方法

了解了这篇文章的目的和贡献后，接下来，我就来剖析一下作者们究竟提出了一个什么方法。

首先，作者们提出了一组叫“目的”（Purpose）和“机制”（Mechanism）的概念。什么叫“目的”呢？那就是当前的产品是要解决什么问题的。什么叫“机制”呢？那就是当前的产品是使用什么手段或者方法来解决这个问题的。对于一个产品，如果我们能够明确这个产品的目的和机制，找到类比就变得更加容易。

比如，我们可以针对某一个问题，相同的目的，采用不同的机制或者对不同的问题采用相同的机制。作者们认为，这种对产品信息的分类符合很多工程设计的过程，是创新过程中的一个必要环节。

有了这种想法以后，很自然的下一个步骤就是如何从数据中学习到目的和机制，如何自动挖掘出海量产品信息的目的和机制。要想学习到这样的信息，作者们提出了一种依靠标签数据的监督学习（Supervised Leanring）机制。具体说来，作者们把文本信息中的每句话、短语交给亚马逊土耳其机器人（Amazon Mechanical Turk）上的在线工人，来标注每个文本信息是目的信息还是机制信息。也就是说，作者们依靠有标注的数据来训练提出的算法。

首先，我们有一组文本，每组文本都有这些文本的原始文字。针对每个文档，我们都收集 K 个目的标注和 K 个机制标注。这时，我们定义一组“目的标注”（Purpose Annotation）向量，其实也就是一组 0 或者 1 的向量。当文本原始文字中的某个字被标识为目的的时候，这个向量的相应元素置 1，反之置 0。类似的，我们也可以定义“机制标注”（Mechanism Annotation）向量。因为我们有 K 个标注，因此我们也有相应的 K 个“目的标注”向量和“机制标注”向量。这两组向量可以说是原始标签信息的一种向量的表达。

下一步就是从每一个有标签信息的文档里产生唯一的目的向量和机制向量。这篇文章采用的方法是，利用每个单词的嵌入向量（Embedding）来获得这个唯一的向量。

具体方法是这样的，首先，针对每一个标注（总共有 K 个），我们收集属于这个标注的单词的嵌入向量，并把这些嵌入向量都拼接起来。然后计算这组拼接好的向量所对应单词的TF-IDF 值（Term Frequency–Inverse Document Frequency，词频 - 逆向文件频率），并且取 TF-IDF 值最高的一些单词相对应的嵌入向量，加权平均以后，就得到了相应的唯一的目的向量或者是机制向量。作者们发现这种利用 TF-IDF 值加权的方法可以更加有效地表达文本的各种重要信息。注意，这个步骤是依赖于文档标签的，也就是说，我们只能对训练数据进行这样的构造。

到目前为止，我们描述了如何从文本到达文本对应的目的向量和机制向量的步骤。那么，如何基于这样的数据以及向量，来对未知的文档进行提取目的向量和机制向量呢？文章采用了深度模型RNN（Recurrent Neural Network，循环神经网络），具体说来是双向的 RNN 并且有一个GRU（Gated Recurrent Unit，门控循环单元）。

这里我就不复述细节了，总体的思路就是，根据文档的嵌入向量信息，我们希望得到一组文档的隐含表达（中间参数），然后可以从这个隐含表达来预测目的向量和机制向量。注意，因为需要预测两组目标，目的向量和机制向量，因此，这里至少需要分别有两组参数。

除了预测文档的目的向量和机制向量以外，作者们还提出了一个用少数关键词来解释这两组变量的机制。具体说来，就是设立一个新的学习目标函数，希望通过少数关键词所对应的嵌入向量来重构目的向量或者机制向量，让得到的误差最小。

方法的实验效果

作者们使用了 Quirky 数据集，通过亚马逊土耳其机器人标注了八千多组产品信息。首先，检测了利用学习到的目的向量和机制向量，是否能够比较容易地从海量数据中提取相应的类比信息。这里，作者们直接利用把目的向量和机制向量拼接的方式来表达问题。答案是，效果非常显著。在前 1% 到 25% 的提取结果中，精度（Precision）和召回（Recall）都比之前的标准文本处理方法，比如 LDA、TF-IDF、全局的嵌入向量要好 10% 到 20%，可以说这是非常有效果的。

作者们还测试了，通过提出的方法，是否能够为用户推荐比较好的类比场景。这里，文章又找了 38 个亚马逊土耳其机器人的虚拟工人来为 12 个产品思路打分。在不知道推荐方法的情况下，虚拟工人认为这篇文章提出的方法能够推荐更有新意、在深层次上更加类似的场景。这也部分解决了我们前面说到的文章希望解决的问题。

小结

今天我为你讲了 KDD 2017 年的年度最佳研究论文，这篇论文提出了一种自动的方法来挖掘类比信息，为快速创新铺平道路。一起来回顾下要点：第一，我简单地介绍了这篇文章的作者群信息，帮你了解到这篇文章是机器学习和人机交互研究的一个结合。第二，我详细地介绍了这篇文章想要解决的问题以及贡献。第三，我简要地介绍了文章所提出方法的核心内容。

最后，给你留一个思考题，这篇文章提出的是使用标注信息来获取目的向量和机制向量，我们有没有办法能够不使用标注信息，采用完全无监督的方式呢？

欢迎你给我留言，和我一起讨论。

拓展阅读：Accelerating Innovation Through Analogy Mining

013 | 精读2017年KDD最佳应用数据科学论文

周一我们讲了 2017 年 KDD 最佳研究论文，今天我们继续来聊今年的 KDD 最佳应用数据科学论文。

与研究类论文不同的是，KDD 的应用类学术论文更加强调论文所描述的方法或者系统在实际应用中发挥的作用。比如，很多论文都是对现有的已部署的系统进行总结，对工业界的很多研究人员和工程师往往都有不小的借鉴意义。和研究类论文一样，从阅读经典文献和学习最新研究成果的角度，我们都应该认真分析和探讨每年的最佳应用类论文。

2017 年 KDD 最佳应用数据科学论文题目是，《HinDroid：基于结构性异构信息网络的智能安卓恶意软件检测系统》（HinDroid: An Intelligent Android Malware Detection System Based on Structured Heterogeneous Information Network）。可以说 2017 年是信息安全备受关注的一年，2016 年美国大选过程中传出了种种关于俄罗斯利用黑客入侵大选候选人的新闻，让整个社会对信息安全的话题变得异常敏感。这是一篇有关如何智能地分析安卓恶意软件的论文，真是非常应景。

作者群信息介绍

文章的第一作者和第二作者都来自西弗吉尼亚大学（West Virginia University）的计算机科学与电气工程系。第一作者 Shifu Hou 是该系的博士生，先后发表过多篇论文。第二作者叶艳芳（Yanfang Ye）是该系的助理教授。叶艳芳 2010 年从厦门大学博士毕业，先后在金山公司和科摩多（Comodo Security Solutions）从事信息安全方面的研究和开发工作。2013 年，她加入西弗吉尼亚大学任教。这篇 KDD 论文因为第一作者也是在读学生，因此也是最佳学生论文。

第三作者宋阳秋（Yangqiu Song）是来自香港科技大学的计算机系助理教授。宋阳秋有丰富的学术和工业界经历。2016 年加入香港科技大学，在这之前曾经在西弗吉尼亚大学任教。2012 年到 2015 年之间他曾在伊利诺伊大学香槟分校、香港科技大学、华为诺亚方舟实验室等地访问。2009 年到 2012 年曾在微软亚洲研究院和 IBM 研究院工作。2009 年于清华大学博士毕业。

最后一位作者是土耳其企业家米勒夫·阿杜勒哈尤格鲁（Melih Abdulhayoğlu）。他是科摩多（Comodo）的 CEO，于 1998 年创立了公司。这篇论文挂了他的名字是因为使用了科摩多的数据。

论文的主要贡献

我们首先来看一下这篇文章的主要贡献。类似地，按照我们周一分析最佳研究论文的思路，首先必需弄明白，这篇文章主要解决了什么场景下的问题。

这篇文章希望解决的问题描述起来很直观，那就是如何有效地监测安卓手机系统下的恶意软件。经预测，到 2019 年，全球的手机市场中，77.7% 将是智能手机，这里面安卓系统的市场占有率至少是 80%。由于安卓系统的开放性以及分散的各类安卓手机软件市场，对安卓软件进行监控和分析存在很大难度。各类恶意软件在安卓生态系统中可以说层出不穷，比如 Geinimi、DroidKungfu 以及 Lotoor 等等。更悲观的统计来自赛门铁克（Symantec）的《互联网安全威胁报告》，认为五分之一的安卓软件是恶意软件。

之前很多恶意软件的分析和检测都是基于某种“指纹签字”技术，然而这种技术常常被恶意软件开发者的新手段绕过。因此，寻找更加复杂有效的检测方式就成了各种信息安全公司所追逐的目标。

这篇论文的主要贡献是根据安卓的 API，提出了一种新的基于结构性异构信息网络的方法，来对安卓程序的 API 模式进行更加复杂的建模，从而能够理解整个安卓程序的语义。作者们还采用了多核学习（Multi-Kernel Learning）的方法，在结构性异构信息网络的基础上对程序语义模式进行分类。

最后，文章提出的方法在科摩多的真实数据上达到了非常高的准确度，远远优于现在的一些主流方法。并且，科摩多已经在产品中部署了这个方法。

论文的核心方法

了解了这篇文章的目的和贡献，接下来，我就来剖析一下作者们提出的方法。

首先，需要将安卓的程序代码转换为可以分析的形式。一般来说，安卓的软件被打包为后缀名为 Dex 的 Dalivik 执行文件，这个执行文件无法被直接分析。于是，需要把这个执行文件通过一个叫 Smali 的反汇编器解析成 Smali 代码。这个时候，软件的语义就能够通过 Smali 代码来解析了。作者们从 Smali 代码中提取所有的 API 调用，通过对 API 的分析来对程序行为建模。

下一步，就是要从繁复的 API 调用中摸索出这里面的规律。作者们这个时候构建了四类矩阵来表达 API 和某个 App 之间的基本特征：

某一个 App 是否包含了某一个 API；

某两个 API 是否同时出现在某一段代码中；

某两个 API 是否出现在同一个 App 中；

某两个 API 是否使用了相同的调用方法。

可以看出，这些矩阵可以抓住 API 和 App 之间的一个基本信息，还可以抓住一系列 API 同时出现进行某种操作的特征信息。这些矩阵成了发现高阶规律的基础。

为了发现更加复杂的规律，作者们在这里引入了一个工具叫异构信息网络。异构信息网络的概念最早由伊利诺伊大学香槟分校的数据挖掘权威韩家炜（Jiawei Han）和他当时的学生孙怡舟（Yizhou Sun，目前在加州大学洛杉矶分校任教）提出。异构信息网络的核心思想就是希望能够表达一系列实体（Entity）之间的复杂规律。

传统的方法把实体表达成图（Graph）的节点，实体之间的关系表达成节点之间的链接。这样的方式忽略了实体本身的不同以及关系的类型也有所不同。异构信息网络就是更加完整和系统地表达多种不同实体和实体关系的一种建模工具。在这篇文章中，有两类实体：App 和 API 调用，有四类关系（和刚才定义的矩阵相同）。而刚才定义的矩阵其实就是这四类关系所对应的图的邻接矩阵。

把 App 和 API 的关系描述成为异构信息网络以后，下面的工作就是定义更高阶的规律关系。为了更好地定义这些复杂关系，作者们使用了一个叫元路径（Meta-Path）的工具。元路径其实是提供一个描述性的模板语言来定义高阶关系。

比如，我们可以定义一个从 App 到 API 再到 App 的“路径”，用于描述两个 App 可能都含有相同的 API 调用。这个路径就可以帮助我们从最开始的四个矩阵推出更加复杂的矩阵来表达一些信息。那么，根据人们的领域知识（这里就是安全领域），作者们就定义了多达16 种元路径，从而全面捕捉 App 和 API 之间的各种关系。

利用异构信息网络和元路径构建了程序的语义表达后，下一步就是进行恶意软件的判别。这里，作者们采用了多核学习的思想。简而言之，就是把之前通过元路径所产生的新矩阵看作一个“核”。这里的多核学习就是要学习一个线性的分类器，特征是每个 App 到某一个核的一个非线性转换，这个转换是在学习过程中得到的。换句话说，这个多核学习的流程要同时学习一个分类器来判断一个程序是不是恶意程序，还需要在这个过程中学习从 App 到核的转换。

方法的实验效果

作者们使用了科摩多的数据集，收集了 2017 年两个月里 1834 个 App 的信息。正常程序和恶意程序几乎各一半。另外还有一个数据集包含 3 万个 App 信息，也几乎是正例负例各一半。从实验结果来看，结合了 16 个定义好的元路径的多核学习能够实现高达 98% 的 F1 值。F1 值可以认为是精度和召回的一个平衡，同时准确率也是高达 98%。

文章还比较了一些其他比较流行的方法，比如神经网络、朴素贝叶斯（Naïve Bayes）分类器、决策树以及支持向量机，这些方法基本的 F1 值都在 85% 和 95% 之间，和文章提到的方法有较大差距。另外，文章还和现在的一些商业软件，比如 Norton、Lookout、CM 做了比较。这些商业软件的准确度也在 92% 上下徘徊。因此，文章所采用的方法的确比之前的很多方法都更有效果。

小结

今天我为你讲了 KDD 2017 年的最佳应用类论文。这篇论文提出了，如何来分析安卓手机软件的行为进而检测手机应用是否是恶意软件。一起来回顾下要点：第一，简要介绍了这篇文章的作者群信息。第二，详细介绍了这篇文章要解决的问题以及贡献。第三，简要分析了文章提出方法的核心内容 。

总结一下，文章解决的问题就是如何有效监测安卓手机系统下的恶意软件，主要贡献是提出了一种新的基于结构性异构信息网络的方法，来理解安卓程序的语义。使用元路径的工具定义复杂关系，还采用了多核学习的方法完成恶意软件的判别。论文使用科摩多的数据集，验证了所提出的方法比当下流行的一些其他方法都更加有效。

最后，给你留一个思考题，文章中提到的多核学习方法这个步骤，是不是必需的？能否换成其他方法呢？

欢迎你给我留言，和我一起讨论。

拓展阅读：HinDroid: An Intelligent Android Malware Detection System Based on Structured Heterogeneous Information Network

015 | 精读2017年EMNLP最佳长论文之一

自然语言处理实证方法会议EMNLP（Conference on Empirical Methods in Natural Language Processing），是由国际计算语言学协会ACL（Association for Computational Linguistics）的专委会SIGDAT（Special Interest Group on Linguistic Data and Corpus-based Approaches to NLP）主办，每年召开一次，颇具影响力和规模，是自然语言处理类的顶级国际会议。从 1996 年开始举办，已经有 20 多年的历史。2017 年的 EMNLP 大会于 9 月 7 日到 11 日在丹麦的哥本哈根举行。

每年大会都会在众多的学术论文中挑选出两篇最具价值的论文作为最佳长论文（Best Long Paper Award）。 今天，我就带你认真剖析一下 EMNLP 今年的最佳长论文，题目是《男性也喜欢购物：使用语料库级别的约束条件减少性别偏见的放大程度》（Men Also Like Shopping: Reducing Gender Bias Amplification using Corpus-level Constraints） 。这篇文章也是很应景，近期学术圈对于数据和机器学习算法有可能带来的“偏见”（Bias）感到关切，有不少学者都在研究如何能对这些偏见进行评估、检测，进而可以改进甚至消除。

作者群信息介绍

第一作者赵洁玉（Jieyu Zhao），论文发表的时候在弗吉尼亚大学计算机系攻读博士学位，目前，已转学到加州大学洛杉矶分校，从事如何从机器学习算法中探测和消除偏见的研究。之前她从北京航空航天大学获得学士和硕士学位，曾于 2016 年在滴滴研究院实习。

第二作者王天露（Tianlu Wang）也是来自弗吉尼亚大学计算机系的博士生，之前在浙江大学获得计算机学士学位。第三作者马克·雅茨卡尔（Mark Yatskar）是来自华盛顿大学的计算机系博士生，已在自然语言处理以及图像处理领域发表过多篇高质量论文。

第四作者文森特（Vicente Ordóñez）目前在弗吉尼亚大学计算机系任助理教授。他的研究方向是自然语言处理以及计算机视觉的交叉学科。他于 2015 年从北卡罗来纳大学教堂山分校计算机系博士毕业。博士期间，他在微软研究院、eBay 研究院以及谷歌都有过实习经历。他是第二作者王天露的博士导师。

文章最后一位作者是 Kai-Wei Chang，也是第一作者赵洁玉的导师。他目前在加州大学洛杉矶分校任助理教授，之前在弗吉尼亚大学任职。他于 2015 年从伊利诺伊大学香槟分校博士毕业，师从著名教授丹·罗斯（Dan Roth）。在之前的研究生涯中，曾先后 3 次在微软研究院实习，也在谷歌研究院实习过。在他研究的早期，曾参与了 LibLinear 这个著名支持向量机软件的研发工作。

论文的主要贡献

机器学习的一个重要任务就是通过数据来学习某些具体事项。最近机器学习的研究人员发现，数据中可能蕴含着一些社会赋予的偏见，而机器学习算法很有可能会放大这些偏见。这种情况在自然语言处理的相关任务中可能更为明显。比如，在一些数据集里，“做饭”这个词和“女性”这个词一起出现的比例可能要比和“男性”一起出现的比例高 30%，经过机器学习算法在这个数据集训练之后，这个比例在测试数据集上可能就高达 68% 了。因此，虽然在数据集里，社会偏见已经有所呈现，但是这种偏见被机器学习算法放大了。

因此，这篇文章的核心思想就是，如何设计出算法能够消除这种放大的偏见，使得机器学习算法能够更加“公平”。注意，这里说的是消除放大的偏见，而不是追求绝对的平衡。比如，我们刚才提到的数据集，训练集里已经表现出“女性”和“做饭”一起出现的频率要高于“男性”和“做饭”一起出现的频率。那么，算法需要做的是使这个频率不会进一步在测试集里升高，也就是说，保持之前的 30% 的差距，而不把这个差距扩大。这篇文章并不是追求把这个差距人为地调整到相同的状态。

文章提出了一个限制优化（Constrained Optimization）算法，为测试数据建立限制条件，使机器学习算法的结果在测试集上能够得到和训练集上相似的偏见比例。注意，这是对已有测试结果的一个调整（Calibration），因此可以应用在多种不同的算法上。

作者们使用提出的算法在两个数据集上做了实验，得到的结果是，新的测试结果不但能够大幅度（高达 30% 至 40%）地减小偏见，还能基本保持原来的测试准确度。可见，提出的算法效果显著。

论文的核心方法

那么，作者们提出的究竟是一种什么方法呢？

首先，引入了一个叫“偏见值”（Bias Score）的概念。这个值检测某一个变量和目标变量之间的比例关系。例如，“男性”这个词和某个动词（比如之前我们举了“做饭”）一起出现的比例关系以及“女性”这个词和同一个动词一起出现的比例关系。

注意，因为“男性”和“女性”都是“性别”的可选项，因此，这两个词对于同一个动词的比例关系的和一定是 1。偏见值在训练集上和测试集上的差别，构成了衡量偏见是否被放大的依据。在之前的例子中，“女性”和“做饭”一起出现的的偏见值在训练集上是 0.66，而到了测试集则变成了 0.84，这个偏见被算法放大。

有了偏见值这个概念以后，作者们开始为测试集的结果定义限制条件（Constraint）。这里的一个基本思想就是，要对测试集的预测标签进行重新选择，使测试标签的预测结果和我们期待的分布相近。用刚才的例子就是说，我们要让“女性”在“做饭”这个场景下出现的可能性从 0.84 回归到 0.66 附近。能够这么做是因为这个算法需要对测试结果直接进行调整。

对所有的限制条件建模其实就变成了一个经典的限制优化问题。这个问题需要对整个测试数据的预测值进行优化，那么，这个优化就取决于测试数据集的大小，往往是非常困难的。于是，作者们在这里采用了拉格朗日简化法（Lagrangian Relaxation）来对原来的优化问题进行简化。

也就是说，原来的限制优化问题经过拉格朗日简化法后，变成了非限制优化问题，原来的算法就可以成为一个动态更新的过程。针对每一个测试用例，都得到当前最优的标签更改方案，然后又进一步更新拉格朗日参数，这样对整个测试数据集遍历一次后算法就中止了。

方法的实验效果

作者们使用了两个实验数据。一个是imSitu，一个是MS-COCO。imSitu 是一个视觉语义角色识别（Visual Semantic Role Labeling）的任务，里面有多达 12 万张图片和这些图片的文字语义信息。比如一些图片是关于做饭场景的，里面的角色就是男性或者是女性。作者们整理出了 212 个动词用作实验。MS-COCO 是一个多标签图片分类问题（Multi-label Classification），需要对 80 类物品进行标签预测。

对于这两个任务，作者们都选择了条件随机场（Conditional Random Field）来作为基础模型。条件随机场往往是解决往往是解决这类问题方法的方法的第一选择。对于特征，作者们采用了数据集提供的基于深度学习的各种特征。在条件随机场的基础上，对测试集采用了提出的偏见调整算法。

值得指出的是，虽然算法本身需要使用测试数据，但并不需要知道测试数据的真实标签。标签信息仅仅是从训练集中得到。这一点也是作者们反复强调的。

从两个数据集的结果来看，效果都不错。原本的预测准确度并没有很大的降低，但是性别偏见值则在测试集的调整结果后大幅度降低，最大的结果可以降低 40% 以上。

小结

今天我为你讲了 EMNLP 2017 年的年度最佳长论文，这篇论文针对数据集可能带来的社会偏见以及机器学习算法可能进一步扩大这种偏见的问题，提出了一个对测试数据集的预测结果进行调整的算法。这个算法的核心是减小这种偏见，使偏见值在测试数据集中和训练数据集中的水平相当。

一起来回顾下要点：第一，简要介绍了这篇文章的作者群信息。第二，详细介绍了这篇文章要解决的问题以及贡献 。第三，介绍了文章提出方法的的核心内容 。

最后，给你留一个思考题，为什么机器学习算法可能扩大训练集上已有的偏见呢？这跟某些具体的算法有什么关系呢？

欢迎你给我留言，和我一起讨论。

拓展阅读：Men Also Like Shopping: Reducing Gender Bias Amplification using Corpus-level Constraints

016 | 精读2017年EMNLP最佳长论文之二

EMNLP 每年都会选出两篇最佳长论文，我们已经分析过第一篇《男性也喜欢购物：使用语料库级别的约束条件减少性别偏见的放大程度》。今天我继续来讲第二篇。

EMNLP 2017 年最佳长论文的第二篇是《在线论坛中抑郁与自残行为风险评估》（Depression and Self-Harm Risk Assessment in Online Forums）。这篇文章探讨了利用自然语言处理技术来解决一个社会问题。最近一段时间以来，如何利用机器学习、数据科学等技术来解决和处理社会问题，正逐渐成为很多社会科学和机器学习研究的交叉领域。

作者群信息介绍

第一作者安德鲁·耶特斯（Andrew Yates），计算机博士，毕业于美国华盛顿的乔治城大学（Georgetown Univeristy），目前在德国马克思普朗克信息学院（Max Planck Institute for Informatics）攻读博士后。他在博士阶段已经发表了多篇采用深度学习技术和信息检索、自然语言处理相关的论文。

第二作者阿曼·可汗（Arman Cohan），来自伊朗，是乔治城大学计算机系博士生。阿曼已在信息检索和自然语言处理相关方向发表了多篇论文。2016 年，在华盛顿的 Medstar Health 实习并发表了两篇论文。2017 年暑假，在美国加州圣何塞（San Jose）的奥多比（Adobe）研究院实习。

第三作者纳兹利·哥汗（Nazli Goharian）也来自乔治城大学计算机系，目前在系里担任计算机教授。第一作者是他之前的学生，第二作者是他当前的学生。纳兹利在长达 20 年的职业生涯中先后在工业界和学术圈任职，可以说有很深厚的学术和工业背景，他在信息检索和文本分析领域已发表 20 多篇论文。

论文的主要贡献

在理解这篇文章的主要贡献之前，我们还是先来弄明白，这篇文章主要解决了一个什么场景下的问题。

现代社会，人们生活工作的压力越来越大。研究表明，很多人都可能受到各式各样精神疾病（Mental Conditions）的困扰。在当下发达的互联网时代，在线场所为这些精神疾病患者寻求帮助提供了大量的资源和信息，特别是一些专业的在线支持社区，或是一些更大的在线社区比如 Twitter 或者 Reddit。

因此，研究这些人在各种在线社区的行为，对设计更加符合他们需要的系统有很大帮助。对于很多社会研究人员来说，分析这些人的精神状态，才能更好地帮助他们长期发展。

这篇文章提出了一个比较通用的框架，来分析这些精神疾患者的在线行为。在这个框架下，可以比较准确地分析发布信息的人是否有自残（Self-Harm）行为，还可以比较容易地分析哪些用户有可能有抑郁症（Depression）的状况。

整个框架利用了近年来逐渐成熟的深度学习技术对文本进行分析。所以，这里的应用思路很值得借鉴和参考，也可以用于其他场景。

论文的核心方法

在介绍这篇文章提出的方法之前，作者们用不小的篇幅介绍了文章使用的数据集和如何产生数据的标签。

首先，作者们从著名的在线社区 Reddit 中找到和精神疾病有明确联系的帖子。这些帖子是按照一个事先准备的语料库来筛选的，这个语料库是为了比较高精度地发现与精神疾病相关的帖子。利用语料库里的句式，比如“我已经被诊断得了抑郁症”，这样就可以保证，找到的帖子在很大程度上是来自精神疾病患者的。

如果一个用户发布了这样的帖子，但在这之前发布的帖子少于 100 条，这个用户就不会包含在数据库中。做这样的筛选可能作者们的考虑是，太少的帖子无法比较全面地包含用户方方面面的行为。

作者们在 Reddit 社区中挖掘了从 2006 年到 2016 年十年时间里符合条件的所有帖子，并利用人工标注的方式筛选出了 9210 个有精神疾病困扰的用户。这些可以当做机器学习的正例。

那么如何寻找负例呢？作者们当然可以利用所有的用户，但是这样带来的后果很可能是研究没有可比性。如果正例的用户和负例的用户之间差别太大，我们就很难说这些差别是因为精神疾病造成的还是由其他区别带来的。于是，作者们想到的方法则是尽可能地对于每一个正例的用户都找到最接近的负例用户。

实际操作中，作者们采取了更加严格的方式，那就是负例的用户必须没有发布过任何与精神疾病相关的帖子，并且在其他方面都需要和正例用户类似。在这样的条件下，作者们找到了 107274 个负例用户。

对于数据集中的用户而言，每个用户平均发布 969 个帖子，平均长度都多于 140 个字。可以说，由这些用户构成的这个数据集也是本文的一个主要贡献，这个数据集用于分析抑郁症。

对于自残行为而言，作者们利用了一个叫 ReachOut 的在线社区的数据，收集了包括 65024 个论坛的帖子，其中有 1227 个帖子提到了自残。而对于提及自残的程度，数据分了五个等级用于表示不同的紧急情况。

这篇论文主要提出了基于卷积神经网络的文本分析框架，分别用于检测抑郁症用户和检测自残倾向度的两个任务中。虽然这两个任务使用的数据不同，最终采用的模型细节不同，但是两个任务使用的都是同一个框架。下面我就来说一说这个框架的主要思想。

首先，作者们利用每个用户的发帖信息来对每一个用户进行建模，基本的思路是通过神经网络来对用户的每一个帖子建模，从中提取出有效信息，然后把有效信息汇总成用户的一个表达。有了这个思路，我们再来看看具体是怎么做的。

每个帖子一个范围内的单词首先通过卷积层（Convolutional Layer）提取特征，然后提取的特征再经过最大抽取层（Max Pooling Layer）集中。这个步骤基本上就是把目前图像处理的标准卷积层应用到文本信息上。每一个帖子经过这样的变换就成了特征向量（Feature Vector）。有了这样的特征向量之后，用户的多个特征向量整合到一起，根据不同的任务形成用户的整体表征。

在检测抑郁症的任务上，作者们采用的是“平均”的方式，也就是把左右的帖子特征向量直接平均得到。而在检测自残的任务上，作者们则采用了一种比较复杂的形式，把所有的帖子都平铺到一起，然后再把当前帖子之前的帖子，作为负例放在一起，注意，不是平均的形式，而是完全平铺到一起，从而表达为用户的整体特征。

在经过了这样的信息提取之后，后面的步骤就是构建分类器。这个步骤其实也是深度学习实践中比较常见的做法，那就是利用多层全联通层（Fully Connected Layer），最终把转换的信息转换到目标的标签上去。

可以说在整体的思路上，作者们提出的方法清晰明了。这里也为我们提供了一种用深度学习模型做文本挖掘的基本模式，那就是用卷积网络提取特征，然后通过联通层学习分类器。

方法的实验效果

作者们在上面提到的实验数据集上做了很充分的实验，当然也对比了不少基本的方法，比如直接采用文本特征然后用支持向量机来做分类器。

在辨别抑郁症的任务上，本文提出的方法综合获取了 0.51 的 F1 值，其中召回（Recall）达到 0.45，而直接采用支持向量机的方法，精度（Precision）高达 0.72，但是召回指数非常低只有 0.29。

而在检测自残的任务上，提出方法的准确度能够达到 0.89，F1 值达到 0.61，都远远高于其他方法。

应该说，从可观的数值上，本文的方法效果不错。

小结

今天我为你讲了 EMNLP 2017 年的第二篇年度最佳长论文，这篇文章介绍了一个采用深度学习模型对论坛文本信息进行分析的应用，那就是如何识别有精神疾病的用户的信息。

一起来回顾下要点：第一，我简要介绍了这篇文章的作者群信息。第二，这篇文章是利用自然语言处理技术解决一个社会问题的应用，论文构建的数据集很有价值。第三，文章把目前图像处理的标准卷积层应用到文本信息上，提出了基于卷积神经网络的文本分析框架，用于辨别抑郁症和检测自残倾向，都实现了不错的效果。

最后，给你留一个思考题，如果说在图像信息上采用卷积层是有意义的，那为什么同样的操作对于文本信息也是有效的呢？文本上的卷积操作又有什么物理含义呢？

欢迎你给我留言，和我一起讨论。

拓展阅读：Depression and Self-Harm Risk Assessment in Online Forums

017 | 精读2017年EMNLP最佳短论文

在今年的 EMNLP 大会上，有两类研究论文得到发表，一类是 8 页的长研究论文，主要是比较完整的研究结果；另一类是 4 页的短研究论文，主要是比较新的有待进一步推敲的研究结果。大会从长研究论文中选出两篇最佳论文，从短论文中选出一篇最佳论文。

前面我们分别讨论了两篇最佳长论文，今天，我就带你认真剖析一下 EMNLP 2017 年的最佳短论文《多智能体对话中，自然语言并非“自然”出现》（Natural Language Does Not Merge ‘Naturally’ in Multi-Agent Dialog）。我们今天讲的论文虽然是最佳短论文，但是作者们已经在 arXiv 发表了较长的文章版本，因此我今天的讲解将基于 arXiv 的长版本。

这篇文章研究的一个主要命题就是，多个“机器人”（Agent）对话中如何才能避免产生“非自然”（Unnatural）的对话。以前很多机器人对话的研究都关注准确率的高低，但实际上机器人产生的对话是不自然的，人类交流不会用这样的方式。这篇文章希望探讨的就是这样非自然的对话是如何产生的，有没有什么方式避免这样的结果。

作者群信息介绍

第一作者萨特维克·库托儿（Satwik Kottur）来自卡内基梅隆大学，博士第四年，研究领域为计算机视觉、自然语言和机器学习。2016 年暑假他在 Snapchat 的研究团队实习，研究对话系统中的个性化问题。2017 年暑假在 Facebook 研究院实习，做视觉对话系统（Visual Dialog System）的研究。近两年，萨特维克已在多个国际顶级会议如 ICML 2017、IJCAI 2017、CVPR 2017、ICCV 2017 以及 NIPS 2017 发表了多篇高质量研究论文，包括这篇 EMNLP 2017 的最佳短论文，可以说是一颗冉冉升起的学术新星。

第二作者何塞·毛拉（José M. F. Moura）是萨特维克在卡内基梅隆大学的导师。何塞是 NAE（美国国家工程院）院士和 IEEE（电气电子工程师学会）院士，长期从事信号处理以及大数据、数据科学的研究工作。他当选 2018 年 IEEE 总裁，负责 IEEE 下一个阶段的发展。

第三作者斯特凡·李（Stefan Lee）是来自乔治亚理工大学的研究科学家，之前在弗吉尼亚理工大学任职，长期从事计算机视觉、自然语言处理等多方面的研究。斯特凡 2016 年博士毕业于印第安纳大学计算机系。

第四作者德鲁·巴塔（Dhruv Batra）目前是 Facebook 研究院的科学家，也是乔治亚理工大学的助理教授。德鲁 2010 年博士毕业于卡内基梅隆大学；2010 年到 2012 年在位于芝加哥的丰田理工大学担任研究助理教授；2013 年到 2016 年在弗吉尼亚大学任教。德鲁长期从事人工智能特别是视觉系统以及人机交互系统的研究工作。文章的第三作者斯特凡是德鲁长期的研究合作者，他们一起已经发表了包括本文在内的多篇高质量论文。

论文的主要贡献

我们先来看看这篇文章主要解决了一个什么场景下的问题。

人工智能的一个核心场景，或者说想要实现的一个目标，就是能够建立一个目标导向（Goal-Driven）的自动对话系统（Dialog System）。具体来说，在这样的系统中，机器人能够感知它们的环境（包括视觉、听觉以及其他感官），然后能和人或者其他机器人利用自然语言进行对话，从而实现某种目的。

目前对目标导向的自动对话系统的研究主要有两种思路。

一种思路是把整个问题看做静态的监督学习任务（Supervised Learning），希望利用大量的数据，通过神经对话模型（Neural Dialog Models）来对对话系统进行建模。这个模式虽然在近些年的研究中取得了一些成绩，但是仍然很难解决一个大问题，那就是产生的“对话”其实不像真人对话，不具备真实语言的很多特性。

另外一种思路则把学习对话系统的任务看做一个连续的过程，然后用强化学习（Reinforcement Learning）的模式来对整个对话系统建模。

这篇文章尝试探讨，在什么样的情况下能够让机器人学习到类似人的语言。文章的一个核心发现就是，自然语言并不是自然出现的。在目前的研究状态下，自然语言的出现还是一个没有确定答案的开放问题。可以说，这就是这篇最佳短论文的主要贡献。

论文的核心方法

整篇文章其实是建立在一个虚拟的机器人交互场景里，也就是有两个机器人互相对话的一个环境。这个环境里有非常有限的物件（Object），每个物件包括三种属性（颜色、形状和样式），每一个属性包括四种可能取值，这样，在这个虚拟的环境中一共就有 64 个物件。

交互任务其实是两个机器人进行“猜谜”。为了区分，我们把两个机器人分为 Q 机器人和 A 机器人。猜谜一开始的时候，A 机器人得到一个物件，也就是三种属性的某种实现组合，Q 机器人并不知道这个物件。这个时候，Q 机器人拿到两个属性的名字，需要通过对话最终猜出 A 拿到的这个物件所对应属性的取值。

在这个“游戏”的过程中，A 是不知道 Q 手上的两个属性究竟是什么的，而 Q 也不知道 A 所拿的物件以及物件所对应属性的取值。因此，对话就是 Q 能够取得成功的关键因素。

在这篇文章里，Q 和 A 的这个游戏通过强化学习进行建模。Q 保持一组参数用于记录当前的状态。这组状态有最开始需要猜的属性，以及后面到当前状态为止所有 Q 的回答以及 A 的问题。类似地，A 也保持这么一组状态，用于记录到目前位置的信息。这个强化学习最终的回馈是，当最后的预测值完全正确时，会有一个正 1 的反馈，而错误的话就是负 10 的反馈。

Q 和 A 的模型都有三个模块：听、说和预测。以 Q 来举例，“听”模块是从要猜的属性这个任务开始，往后每一个步骤接受 A 的语句，从而更新自己的内部状态。“说”模块是根据当前的内部状态，决定下一步需要说的语句。最后“预测”模块则是根据所有的状态预测最后的属性值。

A 机器人的结构是对称的。每一个模块本身都是一个 LSTM （Long Short-Term Memory，长短期记忆）模型。当然，所有这些 LSTM 模型的参数是不一样的。整个模型采用了REINFORCE 算法（也被称作“vanilla” policy gradient，“基本”策略梯度）来学习参数，而具体的实现则采用了 PyTorch 软件包。

方法的实验效果

在提出的方法上，作者们展示了 Q 均能很快地以比较高的准确度做出预测，并且在和 A 的互动中产生了“语言”。不过遗憾的是，通过观察，作者们发现这样的“语言”往往并不自然。最直观的一种情况就是，A 可以忽视掉 Q 的各种反应，而直接把 A 的内部信息通过某种编码直接“暴露”给 Q，从而 Q 可以很快赢得游戏，取得几乎完美的预测结果。这显然不是想要的结果。

作者们发现，在词汇量（Vocabulary）非常大的情况下，这种情况尤其容易发生，那就是 A 把自己的整个状态都暴露给 Q。于是，作者们假定要想出现比较有意义的交流，词汇数目一定不能过大。

于是，作者们采用了限制词汇数目的方式，让词汇数目与属性的可能值和属性数目相等，这样就限制了在完美情况下交流的复杂度，使得 A 没办法过度交流。然而，这样的策略可以很好地对一个属性做出判断，但是无法对属性的叠加（因为 Q 最终是要猜两个属性）做出判断。

文章给出的一个解决方案是，让 A 机器人忘记过去的状态，强行让 A 机器人学习使用相同的一组状态来表达相同的意思，而不是有可能使用新的状态。在这样的限制条件以及无记忆两种约束下，A 和 Q 的对话呈现出显著的自然语言的叠加性特征，而且在没有出现过的属性上表现出了接近两倍的准确率，这是之前的方法所不能达到的效果。

小结

今天我为你讲了 EMNLP 2017 年的最佳短论文，这篇文章介绍了在一个机器人对话系统中，如何能让机器人的对话更贴近人之间的行为。

这篇文章也是第一篇从谈话的自然程度，而不是从预测准确度去分析对话系统的论文。文章的一个核心观点是，如果想让对话自然，就必须避免机器人简单地把答案泄露给对方，或者说要避免有过大的词汇库。

一起来回顾下要点：第一，我简要介绍了这篇文章的作者群信息，文章作者在相关领域均发表过多篇高质量研究成果论文。第二，这篇文章论证了多智能体对话中自然语言的出现并不自然。第三，论文提出在词汇量限制条件和无记忆约束下，机器人对话可以呈现出一定的自然语言特征。

最后，给你留一个思考题，文章讲的是一个比较简单的对话场景，有一个局限的词汇库，如果是真实的人与人或者机器与机器的对话，我们如何来确定需要多大的词汇量呢？

欢迎你给我留言，和我一起讨论。

名词解释：

ICML 2017，International Conference on Machine Learning ，国际机器学习大会。

IJCAI 2017， International Joint Conference on Artificial Intelligence，人工智能国际联合大会。

CVPR 2017，Conference on Computer Vision and Pattern Recognition，国际计算机视觉与模式识别会议。

ICCV 2017，International Conference on Computer Vision，国际计算机视觉大会。

NIPS 2017，Annual Conference on Neural Information Processing Systems，神经信息处理系统大会。

拓展阅读：Natural Language Does Not Merge ‘Naturally’ in Multi-Agent Dialog

048 | 精读2017年ICCV最佳研究论文

ICCV（International Conference on Computer Vision，国际计算机视觉大会），是每两年举办一次的计算机视觉顶级会议。从 1987 年开始举办，已经有 30 年的历史。2017 年的 ICCV 大会于 10 月 22 日至 29 日在意大利的水城威尼斯举行。

在每届 ICCV 大会上，都会从众多学术论文中挑选出两篇最有新意和价值的论文作为最佳研究论文和最佳学生论文。ICCV 的最佳论文奖又叫作“马尔奖项”（Marr Prize），是为了纪念英国的心理学家和神经科学家大卫·马尔（David Marr）而设计的奖项。马尔将心理学、人工智能和神经生理学的研究成果结合起来，提出了全新的关于视觉处理的理论，他被认为是计算神经科学的创始人。

今天，我就来带你认真剖析一下 ICCV 2017 年的最佳研究论文“Mask R-CNN”。这篇论文是一个集大成的工作，介绍了一个新的方法可以用于同时解决图像的“物体识别”（Object Detection）、“语义分割”（Semantic Segmentation）和“数据点分割”（Instance Segmentation）的工作。

什么意思呢？通俗地讲，那就是给定一个输入的图像，利用这篇论文提出的模型可以分析这个图像里究竟有哪些物体，比如是一只猫，还是一条狗；同时能够定位这些物体在整个图像中的位置；并且还能针对图像中的每一个像素，知道其属于哪一个物体，也就是我们经常所说的，把物体从图像中“抠”出来。

作者群信息介绍

这篇论文的作者全部来自 Facebook 的人工智能研究院（Facebook AI Research）。

第一作者就是近几年在计算机视觉领域升起的学术之星何恺明博士（Kaiming He）。他于 2016 年加入 Facebook 人工智能研究院，之前在微软亚洲研究院进行计算机视觉的研究工作；他还是 CVPR 2016 年和 CVPR 2009 年的最佳论文得主。目前，何恺明在计算机视觉领域有三项重大贡献。

第一，他与其他合作者发明的 ResNet 从 2016 年以来成为了计算机视觉深度学习架构中的重要力量，被应用到了计算机视觉以外的一些领域，比如机器翻译和 AlphaGo 等，相关论文引用数超过 5 千次。

第二，他与其他合作者开发的 Faster R-CNN 技术，发表于 NIPS 2015 上，是图像物体识别和语义分析的重要技术手段，也是今天我们要讨论的这篇论文的基础，论文引用数超过 2 千次。

第三，他与其他合作者在 ICCV 2015 年发表论文《深入研究整流器：在 ImageNet 分类上超越人类水平》（Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification），研究了一种改进的 ReLU（Rectified Linear Unit，线性整流函数，又称修正线性单元）结构从而达到了更好的效果，论文引用数近 2 千次。

第二作者乔治亚⋅吉克里奥夏里（Georgia Gkioxari）目前是 Facebook 人工智能研究院的博士后研究员。乔治亚可以说是师出名门，在 Facebook 工作之前才从加州大学伯克利毕业，师从计算机视觉泰斗吉腾德拉⋅马利克（Jitendra Malik）。乔治亚之前还分别在谷歌大脑和谷歌研究院实习过。在过去几年中，乔治亚在计算机视觉界已经发表了多篇高质量论文。

第三作者皮奥特⋅多拉（Piotr Dollár）是 Facebook 人工智能研究院的一名经理。2007 年从加州大学圣地亚哥分校获得博士学位，2014 年加入 Facebook，这之前在微软研究院工作。皮奥特长期从事计算机视觉的研究工作。

最后一个作者罗斯⋅吉尔什克（Ross Girshick）是 Facebook 人工智能研究院的一名科学家。他于 2012 年毕业于芝加哥大学，获得计算机博士。罗斯之前也在微软研究院工作，也曾在计算机视觉泰斗吉腾德拉的实验室里担任博士后的研究工作。

论文的主要贡献

我们首先来看一下这篇文章的主要贡献。还是要先去理解，这篇文章主要解决的是一个什么场景下的问题。

刚才我们已经简单地谈到了，这篇文章要解决的问题，就是对输入图像的物体识别、语义分割，以及数据点分割，是这三个任务的一个集成。在之前的一个工作中，“Faster R-CNN”[1] 已经解决了前两个任务。那么，这篇论文其实就是 Faster R-CNN 在逻辑上的一个扩展。然而，这个扩展也并不是那么显而易见的。为了解决数据点分割的任务，Mask R-CNN 提出了深度学习网络结构上的一个创新，这是本篇论文的一个重要贡献。

本文提出的模型不仅在数据点分割的标准数据集 COCO 上表现强劲，击败所有之前提出的模型以外，还能够很容易地扩展到其他的任务中，比如“人体形态估计”（Human Pose Estimation），从而奠定了 Mask R-CNN 作为一个普适性框架的地位。

论文的核心方法

要想理解 Mask R-CNN 的核心思想，我们就必须先简要理解 Faster R-CNN 的一些基本原理。刚才说到了，Mask R-CNN 就是在其之上的一种改进和延伸。

Faster R-CNN 对于每一个输入图像中的每一个候选物体，都会有两个输出，一个是候选物体的标签（比如，猫、狗、马等），还有一个就是一个矩形框（Bounding Box），用于表达这个物体在图像中的位置。第一个标签输出是一个分类问题（Classification），而第二个位置预测则是一个回归问题（Regression）。

Faster R-CNN 分为两个阶段（Stage）。第一个阶段叫作“区域提交网络”（Region Proposal Network），目的是从图像中提出可能存在的候选矩形框。第二个阶段，从这些候选框中使用一个叫“RoIPool”的技术来提取特征从而进行标签分类和矩形框位置定位这两个任务。这两个阶段的一些特性可以共享。

区域提交网络的大体流程是这样的。最原始的输入图像经过经典的卷积层变换之后形成了一个图像特征层。在这个新的图像特征层上，模型使用了一个移动的小窗口（Sliding Window）来对区域进行建模。这个移动小窗口有这么三个任务需要考虑。

首先移动小窗口所覆盖的特征经过一个变换达到一个中间层，然后经过这个中间层，直接串联到两个任务，也就是物体的分类和位置的定位。其次，移动的小窗口用于提出一个候选区域，有时候也叫 ROI，也就是矩形框。而这个矩形框也参与刚才所说的定位信息的预测。

当区域提交网络“框”出了物体的大致区域和类别之后，模型再使用一个“物体检测”（Object Detection）的网络来对物体进行最终的检测。在这里，物体检测实际是使用了 Fast R-CNN[2] 的架构。所以，也就是为什么 Faster R-CNN 的名字里用“Faster”来做区分。Faster R-CNN 的贡献，在于区域提交网络和 Fast R-CNN 的部分，也就是物体检测的部分达到了共享参数，或者叫共享网络架构，这样也就起到了加速的作用。

Mask R-CNN 在第一部分完全使用 Faster R-CNN 所提出的区域提交网络，在此基础上，对第二部分进行了更改。也就是说，不仅仅在第二部分输出区域的类别和框的相对位置，同时，还输出具体的像素分割。然而，和很多类似工作的区别是，像素分割、类别判断、位置预测是三个独立的任务，并没有互相的依赖，这是作者们认为 Mask R-CNN 能够成功的一个重要的关键。对比之前的一些工作，像素分割成了类别判断的依赖，从而导致这几个任务之间互相干扰。

Mask R-CNN 在进行像素分割的时候，因为要在原始的图像上进行分割，因此需要在整个流程中保留原始图像的位置关系。这个需求是类别判断和位置预测所不具备的。而在 Faster R-CNN 中，因为不需要这个需求，因此类别判断和位置预测所依赖的信息是一个压缩过后的中间层。那么很明显，Mask R-CNN 依靠这个压缩层就不够了。在这篇文章中，作者们提出了一个叫 RoIAlign 的技术来保证中间提取的特征能够反映在最原始的像素中。如果对这部分内容感兴趣，建议你去细读文章。

方法的实验效果

作者们使用 Mask R-CNN 在目前流行的图像物体检测任务数据集 COCO 2015 和 COCO 2016 上做了检测，相对于之前的这两个竞赛的冠军，实验结果表明 Mask R-CNN 的精度都大幅度增加。在一个“平均精度”（Average Precision）的度量上，Mask R-CNN 比 COCO 2015 的最佳结果好了近 13%，而比 COCO 2016 的最佳结果好了 4%，可以说效果非常明显。在实验结果中，作者们非常细致地测试了整个 Mask R-CNN 中每一个部件的效果。其中，把三个任务分开、以及 RoIAlign 方法都有非常显著的作用，证明了这些模型组件是优秀结果的必要步骤。

小结

今天我为你讲了 ICCV 2017 年的最佳研究论文，这篇文章介绍了目前在图像物体识别中的最新算法 Mask R-CNN 的大概内容。

一起来回顾下要点：第一，我们简要介绍了这篇文章的作者群信息。第二，我们详细介绍了这篇文章要解决的问题以及贡献 。第三，我们简要地介绍了文章提出方法的核心内容 。

最后，给你留一个思考题，你觉得为什么 Mask R-CNN，包括之前的一些工作，要把物体检测的工作分为两步，第一步先分析一个大的矩形框，第二步进行物体检测，这两步都是必要的吗？

欢迎你给我留言，和我一起讨论。

参考文献

Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks. IEEE Trans. Pattern Anal. Mach. Intell. 39, 6 (June 2017), 1137-1149, 2017.

Ross Girshick. Fast R-CNN. Proceedings of the 2015 IEEE International Conference on Computer Vision (ICCV) (ICCV '15). IEEE Computer Society, Washington, DC, USA, 1440-1448, 2015.

049 | 精读2017年ICCV最佳学生论文

周一我们认真剖析了 ICCV 2017 年的最佳研究论文“Mask R-CNN”。今天我们来分享 ICCV 2017 的最佳学生论文《焦点损失用于密集物体检测》（Focal Loss for Dense Object Detection）。

可以说，这篇文章是我们周一分享的最佳论文的孪生兄弟。首先，这篇论文的作者群也基本是 Facebook 人工智能研究院的班底。其次，这篇文章解决的问题也很类似，也是物体识别和语义分割，只是不解决数据点分割的问题。

作者群信息介绍

除第一作者外，这篇论文的作者都来自 Facebook 的人工智能研究院。

第一作者林仓义（Tsung-Yi Lin），目前在谷歌大脑（Google Brain）团队工作，发表论文的时候在 Facebook 人工智能研究院实习。林仓义在台湾国立大学获得本科学位，在加州大学圣地亚哥分校获得硕士学位，2017 年刚从康奈尔大学博士毕业。博士期间，他师从计算机视觉专家塞尔盖⋅比隆基（Serge Belongie），发表了多篇高质量的计算机视觉论文。

第二作者皮里亚⋅高耶（Priya Goyal）是 Facebook 人工智能研究院的一名研究工程师。在加入 Facebook 之前，皮里亚从印度理工大学获得了学士和硕士学位。

第三作者罗斯⋅吉尔什克（Ross Girshick），第四作者何恺明，还有最后一个作者皮奥特⋅多拉（Piotr Dollár），这三位作者也是周一的最佳研究论文的作者，我们已经介绍过了，你可以回去再了解一下。

论文的主要贡献

我们首先来看一下这篇文章的主要贡献。

刚才我们已经简单地谈到了，这篇文章要解决的问题，就是对输入图像进行物体识别和语义分割这两个任务。对于这个问题有两种主要的思路，这两个思路都在不断地发展。

第一种思路，那就是直接从输入图像入手，希望能够从输入图像中提取相应的特征，从而能够直接从这些特征中判断当前的图像区域是否属于某个物体，然后也能够一次性地找到矩形框的位置用于定位这个物体。

这种思路虽然直观，但有一个致命的问题，那就是对于一个输入图像来说，大量的区域其实并不包含目标物体，因此也就可以被认为是学习过程中的“负例”（Negative Instance）。如何有效地学习这么一个“不均衡”（Imbalanced）的数据集是这种思路需要考虑的问题。

因为这个因素，研究者们就开始思考另外一种思路，那就是先学习一个神经网络用于找到一些候选区域，然后在第二个阶段根据候选区域再去最终确定物体的类别和矩形框的位置。

在最近几年的实际评测中，基于两个阶段（Two-stage）的模型，包括我们在上一篇分享中提到的 Faster R-CNN 以及其他变种一般都有比较好的表现。而基于一个阶段（One-stage）的模型，在这篇文章发布之前还不能达到两个阶段模型的水平。

本篇文章提出了一个新的目标函数，叫作“焦点损失”（Focal Loss），用于取代传统的“交叉熵”（Cross Entropy）的目标函数。这个新目标函数的主要目的就是让一个阶段模型能够在正负例比例非常不协调的情况下，依然能够训练出较好的模型，从而使得一个阶段模型在效果上能够和两个阶段模型媲美。同时，文章还提出了一种比较简单易用的深度网络结构，可以简单地训练出整个模型。

论文的核心方法

在这一节，我们来讲一讲“焦点损失”的含义。因为这是一个新的目标函数，建议你还是阅读原文来理解这个目标函数的数学性质。这里，我们针对这个新的目标函数进行一个高度概括性的解释。

我们从普通的二分分类问题中常用的交叉熵，我们简称为 CE 目标函数说起。首先，我们认为模型预测类别是正例的概率是 P。CE 目标函数基本上可以认为是这个概率的对数的负数，也就是在机器学习中经常使用的“负对数似然”（Negative Log Likelihood）。模型的目的是最小化“负对数似然”，从而学习模型参数。

作者们观测到这么一个现象，那就是 CE 目标函数在 P 是一个比较大的数值时，比如大于 0.5 的时候，依然会有一个“损失”（Loss）。什么意思呢？就是说，某一个数值点，我们现在已经知道它可能是正例的可能性大于 0.5 了，也就是我们其实已经大体知道这个结果了，但是目标函数依然认为学习算法需要去对这个数据点进行作用，从而减少这个“损失”。

这其实也就是整个问题的核心，那就是传统的 CE 目标函数，并没有指导机器学习算法用在“应该使劲”的地方，而是分散到了一些原本已经不需要再去关注的数据点上。当然，这也就造成了学习困难的局面。

这篇文章提出的“焦点损失”对 CE 进行了一个看上去很小的改动，那就是在 CE 目标函数的“负对数似然”之前乘以一个“相反概率”的系数，并且这个系数有一个指数参数去调节这个系数的作用。如果你对这个内容感兴趣，建议你参考原论文查看细节。如果对细节不感兴趣，那重点理解这个目标函数的作用就可以了。

“焦点损失”有两个性质。第一，当一个数据点被分错类的时候，并且这个数据点的真实概率很小，那么，损失依然和 CE 类似。当一个数据点的真实概率趋近 1，也就是原本算法就可以比较自信的时候，损失会相对于 CE 变小。第二，刚才所说的系数起到了一个调节作用，决定究竟需要对哪些“容易分类的数据点”降低损失到什么程度。

文章在新的“焦点损失”的基础上提出了一个新的网络结构叫 RetinaNet，使用一个阶段的思路来解决物体检测和语义分割的任务。这里我简要概括一下 RetinaNet 的一些特点。

第一，RetinaNet 使用了 ResNet 来从原始的输入图像中抽取基本的图像特性。

第二，文章采用了一种叫 FPN（Feature Pyramid Net）的网络架构来对图像的不同分辨率或者不同大小的情况进行特性抽取。

第三，和 Faster R-CNN 相似的，RetinaNet 也是用了 Anchor 的思想，也就是说从小的一个移动窗口中去寻找一个比较大的矩形框的可能性。

最后，RetinaNet 把从 FPN 抽取出来的特性用于两个平行的网络结构，一个用于物体分类，一个用于矩形框的定位。这一点很类似两个阶段模型的做法。

方法的实验效果

作者们使用 RetinaNet 在目前流行的图像物体检测任务数据集 COCO 上做了检测。首先，RetinaNet 的“平均精度” （Average Precision）要好于之前的所有一个阶段模型，初步验证了提出的目标函数和网络架构的优越性。并且，在实验中，作者们分别使用了不同的“焦点损失”指数参数来展示这个参数对于结果的重要性。同时，作者们还展示了，RetinaNet 能够比 Faster R-CNN 这种经典的两阶段模型，以及一些变种在实验结果上至少持平甚至要更好。

小结

今天我为你讲了 2017 年 ICCV 的最佳学生论文，这篇文章介绍了目前在图像物体识别中的最新目标函数“焦点损失”的大概内容。

一起来回顾下要点：第一，我们简要介绍了这篇文章的作者群信息。第二，我们分析了这篇文章要解决的问题和主要贡献 。第三，我们详细介绍了文章提出方法的核心内容 。

最后，给你留一个思考题，除了这篇文章介绍的更改目标函数的方法，针对不平衡的数据集，你觉得还有哪些通常使用的方法？

欢迎你给我留言，和我一起讨论。

050 | 如何将“深度强化学习”应用到视觉问答系统？

本周我们一起来剖析 ICCV 2017 的论文，周一和周三分别讲了最佳研究论文和最佳学生论文。今天，我们来分享一篇完全不同的文章，题目是《使用深度强化学习研究协作性视觉对话机器人》（Learning Cooperative Visual Dialog Agents with Deep Reinforcement Learning），讲的是如何通过“深度强化学习”来解决视觉问答系统。

作者群信息介绍

第一作者阿布谢克·达斯（Abhishek Das）是一名来自佐治亚理工大学的在读博士生。他于 2017 年和 2018 年在 Facebook 人工智能研究院实习，已经获得了 Adobe 的研究奖学金和 Snapchat 的研究奖学金，可以说是一名非常卓越的博士生。之前在智能系统，特别是在利用强化学习研究智能机器人会话系统的领域已经发表了多篇论文。

共同第一作者萨特维克·库托儿（Satwik Kottur）来自卡内基梅隆大学，博士第四年，研究领域为计算机视觉、自然语言和机器学习。2016 年暑假他在 Snapchat 的研究团队实习，研究对话系统中的个性化问题。2017 年暑假在 Facebook 研究院实习，研究视觉对话系统。近两年，萨特维克已在多个国际顶级会议如 ICCV 2017、ICML 2017、IJCAI 2017、CVPR 2017、NIPS 2017 以及 EMNLP 2017 发表了多篇高质量研究论文，可以说是一颗冉冉升起的学术新星。

第三作者何塞·毛拉（José M. F. Moura）是萨特维克在卡内基梅隆大学的导师。何塞是美国工程院院士和 IEEE 院士，长期从事信号处理以及大数据、数据科学的研究工作。他当选 2018 年 IEEE 总裁，负责 IEEE 下一个阶段的发展。

第四作者斯特凡·李（Stefan Lee）是来自乔治亚理工大学的研究科学家，之前在弗吉尼亚理工大学任职，长期从事计算机视觉、自然语言处理等多方面的研究。斯特凡 2016 年博士毕业于印第安纳大学计算机系。

第五作者德鲁·巴塔（Dhruv Batra）目前是 Facebook 研究院的科学家，也是乔治亚理工大学的助理教授。德鲁 2010 年博士毕业于卡内基梅隆大学；2010 年到 2012 年在位于芝加哥的丰田理工大学担任研究助理教授；2013 年到 2016 年在弗吉尼亚大学任教。德鲁长期从事人工智能特别是视觉系统以及人机交互系统的研究工作。文章的第四作者斯特凡是德鲁长期的研究合作者，他们一起已经发表了包括本文在内的多篇高质量论文。

论文的主要贡献

我们首先来看一下这篇文章的主要贡献，理解这篇文章主要解决了什么场景下的问题。

这篇论文是建立在这么一个虚拟“游戏”（Game）的基础上的。

首先，我们有两个“机器人”（Agent），一个叫“Q 机器人”（Q-Bot），一个叫“A 机器人”（A-Bot）。这个游戏的规则是这样的。一开始，A 机器人得到一张图片 I，Q 机器人一开始得到 I 的一个文字描述 c，而并不知道图片本身。然后，Q 机器人开始问 A 机器人关于图片的各种问题，A 机器人听到问题之后进行作答，帮助 Q 机器人更进一步理解图片。Q 机器人最终的目的是能够把这个图片“猜到”，也就是说能够把图片从一个数据库中“提取”（Retrieve）出来。当然在实际的操作中，这一步可以是去衡量 Q 机器人对于图像的理解，也就是“描述图像的向量”和“真实图像的描述向量”的差距，差距越小说明越成功。

那么，你可以看到，这其实是一个很难的问题。Q 机器人必须从 A 机器人提供的图像文字描述中寻找线索，并且能够提出有意义的问题。而 A 机器人必须了解 Q 机器人到目前为止究竟理解什么信息，才能帮助 Q 机器人成功。

整个游戏，或者叫任务，常常被称作是“协作性的视觉对话系统”（Cooperative Visual Dialog System）。这篇文章的主要贡献就是第一个利用深度加强学习来对这样一个系统进行建模，并且，与之前的非加强学习模型相比，提出的解决方案极大地提高了准确度。

论文的核心方法

那么，既然要把整个问题使用深度强化学习来建模，我们肯定就需要定义强化学习的一些构件。

第一，我们来看看模型的“动作”（Action）。两个机器人的动作空间就是自然语言的词汇表。因为，在这个游戏或者说在强化学习的每一轮中，两个机器人都是需要根据现在的状态，来进行下一步的动作，也就是问问题的语句。这是一个离散的动作空间。除此以外，Q 机器人还需要在每一轮之后对自己理解的图像向量进行更新。那么，这是一个连续的动作空间。

第二，我们来看看模型的“状态”（State）。对于 Q 机器人来说，每一轮的状态，是一个这些信息的集合，包括最初的 A 机器人提供的图像的描述，以及到目前为止所有轮问答的每一句话。而 A 机器人的状态空间，则包括最初的图像本身，图像的描述，以及到目前为止所有轮的对话。

第三，我们来看看模型的“策略”（Policy）。对 A 机器人和 Q 机器人来说，都是要根据现在的状态，来评估下面的语句的可能性。这里，评估的机制其实分别用两个神经网络来学习 A 机器人和 Q 机器人的策略。同时，Q 机器人还需要有一个神经网络来根据现有的 A 机器人的回答，来更新对图像的一个认识。

第四，我们来看一看模型的“环境”（Environment）和“回馈”（Reward）。在这个游戏里，两个机器人都会得到一样的回馈，而这个回馈的根据是 Q 机器人对图像的认识所表达的向量和图像的真实表达向量的一个距离，或者更加准确地说是距离的变化量。

以上就是整个模型的设置。

那么，我们来看两个模型策略神经网络的一些细节。首先，对于 Q 机器人来说，有这么四个重要的部件。第一，Q 机器人把当前轮自己问的问题和 A 给的回答，当做一个组合，用 LSTM 进行编码产生一个中间变量 F。第二，当前步骤的 F 和以前的所有 F 都结合起来，再经过一个 LSTM，产生一个中间变量 S。然后第三步，我们根据这个 S 来产生下一步的语句，以及当前对图像的一个重新的认识。也就是说，F 其实就是一个对历史所有状态的描述，而 S 则是一个压缩了的当前描述信息，并且我们使用 S 来作为下一步的一个跳板。A 机器人的策略神经网络的架构非常类似，这里就不赘述了，区别在于不需要去产生图像的理解。

整个模型采用了目前深度强化学习流行的REINFORCE 算法来对模型的参数进行估计。

这篇文章其实有不少技术细节，我们在今天的分享里只能从比较高的维度帮助你进行总结，如果有兴趣一定要去阅读原文。

方法的实验效果

作者们在一个叫 VisDial 的数据集上做了实验。这个数据集有 6 万 8 千幅图像，是从我们之前提到过的 COCO 数据集里抽取出来的，并且提供了超过 68 万对问答。可以说这个数据集还是比较大型的。

文章比较了利用普通的监督学习以及“课程学习”（Curriculum Learning）的方法。从效果来看，强化学习的效果还是很明显的。最直接的效果是，强化学习能够产生和真实对话相近的对话效果，而其他的办法，比如监督学习，则基本上只能产生“死循环”的对话，效果不理想。不过从图像提取的角度来讲，强化学习虽然比监督学习的效果好，但是差距并不是特别明显，基本上可以认为目前的差距依然是在误差范围内的。

小结

今天我为你讲了 ICCV 2017 的一篇有意思的文章。这篇文章介绍了如何利用深度强化学习来搭建一个模型去理解两个机器人的对话并能够理解图像信息。

一起来回顾下要点：第一，我们简要介绍了这篇文章的作者群信息。第二，我们详细介绍了这篇文章要解决的问题以及贡献 。第三，我们重点介绍了的文章提出方法核心内容 。

最后，给你留一个思考题，你认为把强化学习用在这样的对话场景中，难点是什么？

欢迎你给我留言，和我一起讨论。

051 | 精读2017年NIPS最佳研究论文之一：如何解决非凸优化问题？

机器学习与人工智能领域的顶级会议 NIPS（Conference on Neural Information Processing Systems，神经信息处理系统大会）从 1987 年开始举办，已经有 30 多年的历史。NIPS 2017 大会于 2017 年 12 月 4 日到 9 日在美国加利福尼亚州的长滩（Long Beach）举行。

每年大会都会在众多的学术论文中挑选出几篇最有新意和价值的论文作为最佳研究论文。在 NIPS 2017 上，一共有三篇论文获得了最佳论文的称号。今天，我就来带你认真剖析一下其中的一篇《具有凸目标的基于方差的正则化》（Variance-based Regularization with Convex Objectives）。这篇论文的两位作者都是来自斯坦福大学的学者。

这篇文章理论性很强，主要研究的是一种“健壮的优化问题”（Robust Optimization），也就是说我们在优化一个“损失函数”（Loss Function）的时候，不仅要考虑损失函数的“均值”（Mean），还要考虑损失函数的“方差”（Variance）。然而，一个既要考虑均值又要考虑方差的综合的损失函数，往往是一个“非凸”（Non Convex）的问题。对于一般的非凸优化问题来说，我们往往不能找到一个全局的最优解，甚至是找到局部最优解也很困难。这篇文章就是要来解决这么一个问题。

作者群信息介绍

第一作者洪升⋅南空（Hongseok Namkoong）是斯坦福大学“运筹学”（Operations Research）的一名在读博士研究生。他的导师分别是约翰⋅达齐（John C. Duchi）和彼得⋅格林（Peter W. Glynn）。2013 年到斯坦福之前，南空在韩国的韩国科学与技术高级研究所（Korea Advanced Institute of Science and Technology），有时候又称为 KAIST，获得工业工程和数学学士学位。最近两三年，南空已经在发表了两篇 NIPS 的文章（包括这篇最佳论文），以及一篇 ICML 的论文。

第二作者约翰⋅达齐（John C. Duchi）是南空的导师之一。达奇可以说是师出名门，他于 2007 年从斯坦福本科毕业，接着在斯坦福跟随机器学习权威达菲⋅科勒（Daphne Koller），拿到了计算机科学的硕士学位；然后又到加州大学伯克利分校跟随统计学习权威迈克尔⋅乔丹（Michael Jordan）拿到了计算机科学的博士学位。在博士阶段的暑假里，达奇还到 Google 研究院中追随约然⋅辛格（Yoram Singer）积累了非常有价值的实习经验。之后，他来到了斯坦福大学担任统计和电气电子工程系的助理教授。

有了这些良好的基础，达奇的学术成绩也是非常扎实。他于 2010 年获得了 ICML 最佳论文奖。紧接着，2011 年在 Google 实习期间的工作 AdaGrad，成为了现在机器学习优化领域的经典算法，这个工作的论文有超过 2500 次的引用，而且也是深度学习优化算法的一个重要基础。目前，达奇所有论文的引用数超过 6 千次。

论文的主要贡献

我们首先来看一下这篇文章的主要贡献，理解文章主要解决了一个什么场景下的问题。

很多机器学习问题其实都可以最终归结于优化一个目标函数（Objective Function）或者有时候叫做损失函数（Loss Function）的问题。针对训练数据集上损失函数的优化（即最大化或最小化）并且在测试集上表现优异，是可以被证明为最终能够较好“泛化”（Generalization）的一种体现。

那么，通常情况下，这个损失函数都是针对均值的一个描述，比如在整个训练数据集上的平均误差，或者说在整个训练数据集上的平均准确度。然而，我们都知道，在一些很“偏斜”（Skewed）的数据分布上，均值并不是很好的一个数据描述。即便我们的函数能够在“平均”的情况下优化一个损失函数，这个函数也有可能在一些，甚至大部分数据点上表现得不尽如人意。

于是，研究人员就引入了“健壮的优化问题”。也就是我们希望损失函数在更多的点上有优异的表现。那么，损失函数的健壮性是用损失函数的方差来衡量的。也就是说，我们希望损失函数在不同数据点上的波动要小。

有了这个概念之后，下一步就显得比较自然了，那就是把损失函数的均值部分，也就是我们通常要做的部分和有方差的部分串联起来，形成一个新的目标函数。这个目标函数有两个部分，第一部分就是均值部分，第二个部分就是方差的部分，中间有一个自由的参数，把这两个部分衔接起来。这样，我们就有了一个既考虑均值又考虑方差的新的健壮化的优化问题。

然而，一个既要考虑均值又要考虑方差的综合的损失函数，往往是一个“非凸”（Non Convex）的问题。什么叫做非凸函数？一个“凸”（Convex）问题可以简单理解为函数只有唯一的最小值，并且我们具备有效算法来找到这个最小值。而对于非凸问题来说，我们往往不能找到一个全局的最优解，或者找到局部最优解也很困难。

健壮优化问题已经在之前的研究中提了出来，那么这篇文章的主要贡献在于，为健壮优化问题找到了一个“凸”问题的逼近表达，并基于此提出了一个优化算法，解决了这个新提出的凸问题的近似解。

这里，值得注意的一点是，对于非凸问题提出凸问题的近似表达，是解决非凸问题的一个重要思路。有很多经典的非凸问题，都是通过凸问题的近似来得到解决或者部分解决的。从这个思路来说，这篇文章是延续了解决这种问题的一贯的策略。

论文的核心方法

这篇论文的核心方法以及证明都有很强的理论性，需要有一定的数学功底和类似研究背景，才能更好地理解。如果对文章内容有兴趣，建议不仅要阅读原本的 NIPS 论文，还需要去阅读其附加的文档，一共有 50 多页，才能比较全面地理解这篇文章的细节。我们在这里仅仅从概念上做一个高度浓缩的概括。

作者们在文章中提出了一种叫“健壮化的正则风险”（Robustly Regularized Risk）的目标函数。这个新的目标函数是建立在一个叫“经验分布”（Empirical Distribution）上的“散度”（Divergence）。而这个新的健壮化正则风险是一个凸问题。

直白一点说，这个健壮化的正则风险可以被认为是一个包含两项的式子，这两项是在数据集上的损失函数的期望加上一个损失函数的方差。在这个新的两项的式子中，期望和方差都是定义在数据的经验分布上的。于是这样就把这个新提出的风险式子和我们实际需要解决的问题挂上了钩。当然后面大段的论文就是要证明这两个式子之间的差距到底有多少，是不是新的式子提供了一个比较“紧”的“界限“（Bound）。

紧接着，这篇文章其实讨论了这个健壮化的正则风险可以写成一个更加简单的优化问题，然后文章在附录中提供了这个简化后的优化问题的求解。

方法的实验效果

虽然这篇文章的核心内容是一个理论结果，或者是算法革新。但是这篇文章依然是在两个数据集中做了实验，一个是在 UCI ML 的数据集上，展示了提出的新的健壮化的目标函数达到了比一般的目标函数更好的效果；另外一个则是在 RCV1 文本分类的问题上比一般的优化目标函数有更好的效果。

小结

今天我为你讲了 NIPS 2017 年的最佳研究论文之一，文章非常理论化。文章的一个核心观点是希望能够通过对损失函数的均值和方差同时建模从而达到让目标函数健壮化的目的。

一起来回顾下要点：第一，我们简要介绍了这篇文章的作者群信息。第二，我们详细介绍了这篇文章要解决的问题以及贡献 。第三，我们简要地介绍的文章提出方法的核心内容 。

最后，给你留一个思考题，要想控制目标函数的预测结果的方差，除了本文提出的把均值和方差都设计到目标函数里，还有没有别的方法？

欢迎你给我留言，和我一起讨论。

052 | 精读2017年NIPS最佳研究论文之二：KSD测试如何检验两个分布的异同？

本周我们来分析和探讨 NIPS 2017 上的三篇最佳论文。周一我们分享的文章主要研究的是一种“健壮的优化问题”，也就是说我们在优化一个“损失函数”的时候，不仅要考虑损失函数的“均值”，还要考虑损失函数的“方差”。

今天，我们来看另外一篇最佳论文《线性时间内核拟合优度测试》（A Linear-Time Kernel Goodness-of-Fit Test），讲的是如何来衡量一组数据是否来自于某一个分布。

今天的这篇文章理论性也很强，这里我尝试从更高的维度为你做一个归纳，如果对文章内容感兴趣，建议你一定要去阅读原文。

作者群信息介绍

本文一共有五位作者，我们在这里进行一个简要介绍。

第一作者叫维特瓦特·吉特克鲁特（Wittawat Jitkrittum），刚从伦敦大学学院（University College London）的“加斯比计算人脑科学所”（Gatsby Computational Neuroscience Unit）博士毕业。他在博士期间的主要研究是“统计测试”（Statistical Tests），特别是如何利用“核方法”（Kernel Method）来对“分布特征”（Distributional Features）进行测试。吉特克鲁特在泰国完成本科学习，于日本京的东京科技学院（Tokyo Institute Of Technology）获得硕士学位。最近几年，吉特克鲁特已经在 NIPS、ICML、UAI 等会议连续发表了多篇高质量论文，可以说是统计测试界的学者新秀。

第二作者许文凯（Wenkai Xu）是加斯比计算人脑科学所的一名博士生。

第三作者佐尔坦·萨博（Zoltán Szabó）来自法国一所著名的理工大学“巴黎综合理工学院”（École Polytechnique）。萨博之前也曾在加斯比计算人脑科学所工作过，目前在巴黎综合理工学院任职研究副教授（类似于研究员），长期从事核方法、信息论（Information Theory）、统计机器学习等方面的研究。

第四作者福水健次（Kenji Fukumizu）是“统计数学学院”（The Institute of Statistical Mathematics）的教授，长期从事核方法的研究，可以说是这方面的专家。

最后一个作者阿瑟·格里顿（Arthur Gretton）是加斯比计算人脑科学所的机器学习教授，长期从事机器学习，特别是核方法的研究。他的论文有 9 千多次的引用数。

论文的主要贡献和核心方法

我们首先来看一下这篇文章的主要贡献，理解这篇文章主要解决了什么场景下的问题。

在一般的建模场景里，我们常常会对一组数据提出一个模型，来描述产生这些数据背后的过程。这个过程我们通常是看不见的，是一个隐含的过程。那么，当我们提出了模型之后，如何知道用这个模型描述现实就是准确的呢？这时候我们就需要用到一些统计检验（Statistical Testing）的方法。

一种比较普遍的方法，那就是假设我们的模型是 P，而数据的产生分布是 Q。说得直白一些，就需要去验证 P 是不是等于 Q，也就是需要验证两个分布是否相等。一个基本的做法就是，从 P 里“产生”（Generate）一组样本，或者叫一组数据，然后我们已经有了一组从 Q 里产生的数据，于是用“两个样本假设检验”（Two Sample Tests）来看这两组数据背后的分布是否相等。

这个想法看似无懈可击，但是在实际操作中往往充满困难。最大的操作难点就是从 P 中产生样本。比如 P 是一个深度神经网络模型，那从中产生样本就不是一个简单且计算效率高的流程，这就为基于“两个样本假设检验”带来了难度。

另一方面，我们在做这样的统计检验的时候，最好能够针对每一个数据点，得到一个数值，来描述当前数据点和模型之间的关系，从而能够给我们带来更加直观的认识，看模型是否符合数据。

这里，有一种叫作“最大均值差别”（Maximum Mean Discrepancy），或者简称为 MMD 的检验方法能够达到这样的效果。MMD 的提出者就是这篇论文的最后一位作者阿瑟·格里顿，MMD 是在 NIPS 2016 提出的一个检验两个样本是否来自同一个分布的一种方法。当 MMD 值大的时候，就说明这两个样本更有可能来自不同的分布。

和一般的衡量两个分布距离的方法相比，MMD 的不同之处是把两个分布都通过核方法转换到了另外一个空间，也就是通常所说的“再生核希尔伯特空间”（Reproducing Kernel Hilbert Space），或者简称为 RKHS。在这个空间里，测量会变得更加容易。然而遗憾的是，MMD 依然需要得到两个分布的样本，也就是说我们依然需要从 P 里得到样本。

那么，这篇文章的最大贡献，就是使用了一系列的技巧让 P 和 Q 的比较不依赖于从 P 中得到样本，从而让数据对于模型的验证，仅仅依赖于 P 的一个所谓的“打分函数”（Score Function）。

其实在 MMD 里，这个打分函数就是存在的，那就是针对我们从 P 或者是 Q 里抽取出来的样本，我们先经过一个函数 F 的变换，然后再经过一个叫“核函数”T 的操作，最后两个样本转换的结果相减。

在这篇文章里，作者们提出了一个叫“核斯特恩差异”（Kernel Stein Discrepancy），或者叫KSD 测试的概念，本质上就是希望能够让这两个式子中关于 P 的项等于零。

什么意思呢？刚才我们说了 MMD 的一个问题是依然要依赖于 P，依赖于 P 的样本。假设我们能够让依赖 P 的样本这一项成为零，那么我们这个测试就不需要 P 的样本了，那也就是绕过了刚才所说的难点。

KSD 的本质就是让 MMD 的第二项在任何时候都成为零。注意，我们这里所说的是“任何时候”，也就是说，KSD 构造了一个特殊的 T，这个 T 叫作“斯特恩运算符”（Stein Operator），使得第二项关于 P 的样本的计算，在任何函数 F 的情况下都是零，这一点在文章中提供了详细证明。于是，整个 KSD 就不依赖于 P 的样本了。

这篇文章不仅阐述了 KSD 的思想，而且在 KSD 的思想上更进了一步，试图把 KSD 的计算复杂度，也就是在平方级别的计算复杂度变为线性复杂度。什么意思呢？也就是说，希望能够让 KSD 的计算复杂度随着数据点的增加而线性增加，从而能够应用到大数据上。这个内容我们就不在这里复述了。

方法的实验效果

虽然这篇文章的核心内容是一个理论结果，或者是算法革新，文章还是在“受限波兹曼机”（Restricted Boltzmann Machine），简称 RBM 上做了实验。本质上就是在 RBM 的某一个链接上进行了简单的改变而整个模型都保持原样。

如果我们有从这两个 RBM 中得到的样本，其实是很难知道他们之间的区别的。在实验中，传统的 MMD 基本上没法看出这两个样本的差别。然而不管是 KSD，还是线性的 KSD 都能够得出正确的结论，而最终的线性 KSD 基本上是随着数据点的增多而性能增加，达到了线性的效果。

最后，作者们用了芝加哥犯罪记录来作为说明，使用“打分函数”来形象地找到哪些点不符合模型。应该说，理论性这么强的论文有如此直观的结果，实在难能可贵。

小结

今天我为你讲了 NIPS 2017 年的另外一篇最佳研究论文，文章的一个核心观点是希望能够通过构建一个特殊的运算符，使得传统的通过样本来检验两个分布的异同的方法，比如 MMD 方法，可以不依赖于目标分布的样本，并且还能达到线性计算速度。

一起来回顾下要点：第一，我们简要介绍了这篇文章的作者群信息。第二，我们详细介绍了这篇文章要解决的问题以及贡献 。第三，我们简要地介绍了文章的实验结果 。

最后，给你留一个思考题，这种衡量分布之间距离的想法，除了在假设检验中使用以外，在机器学习的哪个环节也经常碰到？

欢迎你给我留言，和我一起讨论。

053 | 精读2017年NIPS最佳研究论文之三：如何解决非完美信息博弈问题？

今天，我们来分享一下 NIPS 2017 的最后一篇最佳论文《安全和嵌套子博弈解决非完美信息博弈问题》（Safe and Nested Subgame Solving for Imperfect-Information Games）。这篇文章讲的是什么内容呢？讲的是如何解决“非完美信息的博弈”问题。

和前两篇分享的文章类似，这篇文章也是理论性很强，并不适合初学者，我们在这里仅仅对文章的主要思想进行一个高度概括。如果你对文章内容感兴趣，还是建议要阅读原文。

另外一个值得注意的现象是，即便在深度学习如日中天的今日，我们本周分享的三篇 NIPS 最佳论文均和深度学习无关。这一方面展现了深度学习并不是人工智能的全部，另一方面也让我们看到机器学习和人工智能领域的宽广。

作者群信息介绍

本文一共两位作者。

第一作者叫诺阿·布朗（Noam Brown）。布朗是卡内基梅隆大学计算机系的博士生，目前的主要研究方向是利用强化学习和博弈论的思想来解决大规模的多机器人交互的问题。这篇文章提到的“非完美信息博弈”也是这里面的一个分支问题。布朗已经在这个方向发表了多篇论文，包括三篇 AAAI 论文、两篇 NIPS 论文、一篇 ICML 论文、以及一篇 IJCAI 论文。

和本文非常相关的一个研究内容在 2017 年发表于《科学》（Science）杂志上，讲述了如何利用博弈论来解决“Heads-up 无限制扑克”（Heads-up No Limit Poker）的问题，并且在现实比赛中已经超过了人类的表现。这个工作也得到了不少媒体的报道。布朗 2017 年也在伦敦的 Google DeepMind 实习；在博士阶段之前，他曾经在金融领域工作。

第二作者是布朗的导师托马斯·桑德霍姆（Tuomas Sandholm）。桑德霍姆是卡内基梅隆大学计算机系的教授，其在“机制设计”（Mechanism Design）以及“拍卖理论”（Auction Theory）等领域有长期的研究，发表了 450 多篇学术论文，并且有超过 2 万多的引用数。除了他在学术上的造诣以外，桑德霍姆还有一些轶事，比如，他还有非常广泛的兴趣爱好，在他的主页就列举了他冲浪、喜好魔术以及对飞行的热爱。

论文的主要贡献和核心方法

我们首先来看一下这篇文章的主要贡献，弄明白这篇文章主要解决了什么场景下的问题。

对于一篇理论性很强的文章来说，我们通常需要不断地提问，这篇文章的核心主旨到底是什么，这样才能够帮助我们了解到文章的主干。

首先，文章讲的是一个“非完美信息的博弈”问题。这是什么意思呢？要理解“非完美信息博弈”，我们就必须要说一下“完美信息博弈”。

简单来说，“完美信息博弈”指的是博弈双方对目前的整个博弈状况都完全了解，对于博弈之前，以及整个博弈时候的初始状态也完全了解。在这种定义下，很多大家熟悉的游戏都是“完美信息博弈”，比如围棋、象棋等等。那么，DeepMind 开发的 AlphaGo 以及后来的 AlphaGo Zero 都是典型的针对“完美信息博弈”的人工智能算法。

“非完美信息博弈”并不是说我们不知道对方的任何信息，而只是说信息不充分。什么意思呢？比如，我们可能并不知道对手在这一轮里的动作，但我们知道对手是谁，有可能有怎样的策略或者他们的策略的收益（Payoff）等。

除了在表面定义上的区别以外，在整个问题的机构上也有不同。

“完美信息博弈”有这样的特征，那就是在某一个时刻的最优策略，往往仅需要在问题决策树当前节点的信息以及下面子树对应的所有信息，而并不需要当前节点之前的信息，以及其他的旁边节点的信息。

什么意思呢？比如我们看 AlphaGo。本质上在这样“完美信息博弈”的场景中，理论上，我们可以列出所有的棋盘和棋手博弈的可能性，然后用一个决策方案树来表达当前的决策状态。在这样的情况下，走到某一个决策状态之后，往往我们仅仅需要分析后面的状态。尽管这样的情况数目会非常巨大，但是从方法论的角度来说，并不需要引用其他的信息来做最优决策。

“非完美信息博弈”的最大特点就正好和这个相反，也就是说，每一个子问题，或者叫子博弈的最佳决策，都需要引用其他信息。而实际上，本篇论文讲述了一个事实，那就是“非完美信息博弈”在任何一个决策点上的决策往往取决于那些根本还没有“达到”（Reach）的子博弈问题。

在这一点上，论文其实引用了一个“掷硬币的游戏”来说明这个问题。限于篇幅，我们就不重复这个比较复杂的问题设置了，有兴趣的话可以深读论文。

但是从大体上来说，这个“掷硬币的游戏”，其核心就是想展示，两个人玩掷硬币，在回报不同，并且两个人的玩法在游戏规则上有一些关联的情况下，其中某一个玩家总可以根据情况完全改变策略，而如果后手的玩家仅仅依赖观测到先手玩家的回馈来决策，则有可能完全意识不到这种策略的改变，从而选择了并非优化的办法。这里的重点在于先后手的玩家之间因为规则的牵制，导致后手玩家无法观测到整个游戏状态，得到的信息并不能完全反应先手玩家的策略，从而引起误判。

为解决这样博弈问题，这篇文章提出的一个核心算法就是根据当前的情况，为整个现在的情况进行一个“抽象”（Abstraction）。这个抽象是一个小版本的博弈情况，寄希望这个抽象能够携带足够的信息。然后，我们根据这个抽象进行求解，当在求解真正的全局信息的时候，我们利用这个抽象的解来辅助我们的决策。有时候，这个抽象又叫作“蓝图”（Blueprint）策略。这篇文章的核心在于如何构造这样的蓝图，以及如何利用蓝图来进行求解。

方法的实验效果

文章在“Heads-up 无限制扑克”的数据集上做了实验，并且还比较了之前在《科学》杂志上发表的叫作“利不拉图斯”（Libratus）的算法版本。人工智能算法都大幅度领先人类的玩家。

有一种算法叫“非安全子博弈算法”（Unsafe Subgame Solving），也就是说并不考虑“非完美信息的博弈”状态，把这个情况当做完美信息来做的一种算法，在很多盘游戏中均有不错的表现，但是有些时候会有非常差的结果，也就是说不能有“健壮”（Robust）的结果。这里也从实验上证明了为什么需要本文提出的一系列方法。

小结

今天我为你讲了 NIPS 2017 的第三篇最佳研究论文，文章的一个核心观点是希望能够通过构建蓝图来引导我们解决非完美信息博弈的问题，特别是在扑克上面的应用。

一起来回顾下要点：第一，我们简要介绍了这篇文章的作者群信息。第二，我们详细介绍了这篇文章要解决的问题以及贡献 。第三，我们简要地介绍了文章的实验结果 。

最后，给你留一个思考题，为什么非完美博弈的整个问题求解现在并没有依靠深度加强学习呢，大家在这个问题上有什么直观上的体会呢？

欢迎你给我留言，和我一起讨论。

060 | WSDM 2018论文精读：看谷歌团队如何做位置偏差估计

WSDM（International Conference on Web Search and Data Mining，国际搜索和数据挖掘大会）是每年举办一次的搜索、数据挖掘以及机器学习的顶级会议，其从 2008 年开始举办，已经有 11 届的历史。

尽管 WSDM 仅仅举办了 11 届，在计算机科学领域算是一个非常年轻的会议。但是，WSDM 快速积累的影响力已经使其成为了数据挖掘领域的一个顶级会议。根据谷歌学术搜索公布的数据，目前 WSDM 已经是数据挖掘领域仅次于 KDD 的学术会议，而 KDD 已经举办了 20 多年。

WSDM 的一大特点就是有大量工业界的学者参与，不管是投稿和发表论文还是评审委员会或者大会组织委员会的成员，都有很多工业界背景的人员参加。这可能也是 WSDM 备受关注的一个原因，那就是大家对于工业界研究成果的重视，同时也希望能够从中学习到最新的经验。

2018 年的 WSDM 大会于 2 月 5 日到 9 日在的美国的洛杉矶举行。今天，我们就来分享 WSDM 2018 上来自谷歌的一篇文章《无偏排序学习在个人搜索中的位置偏差估计》（Position Bias Estimation for Unbiased Learning to Rank in Personal Search）。这篇文章的核心内容是如何结合“因果推断”（Causal Inference）和排序学习（Learning to Rank）来对用户数据进行进一步无偏差的估计。

作者群信息介绍

这篇论文的所有作者都来自谷歌，我们这里对作者群做一个简单的介绍。

第一作者王选珲（Xuanhui Wang）2015 年起在谷歌工作。他之前在 Facebook 工作了三年，一直从事广告系统的开发；再往前，是在雅虎担任了两年的科学家。王选珲于 2009 年毕业于伊利诺伊大学香槟分校，获得计算机博士学位，他的博士生导师是信息检索界著名的华人学者翟成祥（Chengxiang Zhai）。

第二作者纳达夫⋅古尔班迪（Nadav Golbandi）于 2016 年加入谷歌，之前在雅虎研究院担任了 8 年的主任级研究工程师（Principal Research Engineer），一直从事搜索方面的研发工作。在雅虎研究院之前，古尔班迪在以色列的 IBM 研究院工作了 6 年。他拥有以色列理工大学的计算机硕士学位。

第三作者迈克尔⋅本德斯基（Michael Bendersky）于 2012 年加入谷歌，一直从事个人以及企业信息系统（Google Drive）的研发工作。本德斯基于 2011 年从马萨储塞州阿姆赫斯特分校（University of Massachusetts Amherst）毕业，获得计算机博士学位，他的导师是信息检索界的学术权威布鲁斯⋅夸夫特（Bruce Croft）。

第四作者唐纳德⋅梅泽尔（Donald Metzler）也是 2012 年加入谷歌的，一直负责个人以及企业信息系统（Google Drive）搜索质量的研发工作。梅泽尔曾在雅虎研究院工作过两年多，然后还在南加州大学（University of South California）担任过教职。梅泽尔是 2007 年从马萨储塞州阿姆赫斯特分校计算机博士毕业，导师也是信息检索界的学术权威布鲁斯⋅夸夫特。

文章的最后一个作者是马克⋅诺瓦克（Marc Najork）于 2014 年加入谷歌，目前担任研发总监（Research Engineering Director）的职位。诺瓦克之前在微软研究院硅谷分部工作了 13 年，再之前在 DEC 研究院工作了 8 年。诺瓦克是信息检索和互联网数据挖掘领域的学术权威，之前担任过 ACM 顶级学术期刊 ACM Transactions on the Web 的主编。他发表过很多学术文章，引用数在七千以上。

论文的主要贡献

按照我们阅读论文的方法，首先来看这篇文章的主要贡献，梳理清楚这篇文章主要解决了什么场景下的问题。

众所周知，所有的搜索系统都会有各种各样的“偏差”（Bias），如何能够更好地对这些偏差进行建模就成为了对搜索系统进行机器学习的一个重要的挑战。

一种方式就是像传统的信息检索系统一样，利用人工来获得“相关度”（Relevance）的标签，不需要通过通过人机交互来获取相关度的信息。所以，也就更谈不上估计偏差的问题。

第二种，文章中也有谈到的，那就是利用传统的“点击模型”（Click Model）。点击模型是一种专门用来同时估计相关度和偏差的概率图模型，在过去 10 年左右的时间内已经发展得相对比较成熟。文章中也提到，大多数点击模型的应用主要是提取相关度信息，而并不在乎对偏差的估计是否准确。

第三种，也是最近几年兴起的一个新的方向，那就是利用“因果推断”（Causal Inference）和排序学习的结合直接对偏差进行建模。在 WSDM 2017 的最佳论文 [1] 中，已经让我们见识了这个思路。然而，在去年的那篇文章里，并没有详细探讨这个偏差的估计和点击模型的关系。

简言之，这篇论文主要是希望利用点击模型中的一些思路来更加准确地估计偏差，从而能够学习到更好的排序结果。同时，这篇文章还探讨了如何能够在较少使用随机数据上来对偏差进行更好的估计。这里，作者们提出了一种叫作“基于回归的期望最大化”（Regression-based EM）算法。

论文的核心方法

文章首先讨论了如果已知“偏差值”（Propensity Score），也就是用户看到每一个文档或者物品时的概率，我们就可以构造“无偏差”的指标，比如“无偏差的精度”（Unbiased Precision）来衡量系统的好坏。

这里，无偏差的效果主要是来自于重新对结果进行权重的调整。意思就是说，并不是每一个点击都被认为是同样的价值。总的来说，如果文档位于比较高的位置上，那权重反而会比较低，反之，如果文档位于比较低的位置上，权重反而较高。这里的假设是一种“位置偏差”（Position Bias）假设。意思就是不管什么文档，相对来说，放在比较高的位置时都有可能获得更多的点击。因此，在较低位置的文档被点击就显得更加难得。

这种情况下，一般都无法直接知道“偏差值”。因此，如何去估计偏差值就成了一个核心问题。

这篇文章在进行“偏差值”估计的方法上，首先利用了一个叫“位置偏差模型”（Position Bias Model）的经典点击模型，对偏差值和相关度进行了建模。“位置偏差模型”的假设是用户对于每一个查询关键字的某一个位置上的文档点击概率，都可以分解为两个概率的乘积，一个是用户看到这个位置的概率，一个就是文档本身相关度的概率。那么，位置偏差模型的主要工作就是估计这两个概率值。

如果我们能够对每一个查询关键字的结果进行随机化，那么，我们就不需要估计第一个概率，而可以直接利用文档的点击率来估计文档的相关度。但是，作者们展示了，彻底的随机化对于用户体验的影响。

另外一种方法，相对来说比较照顾用户体验，那就是不对所有的结果进行随机化，而仅仅针对不同的“配对”之间进行随机化。比如，排位第一的和第二的文档位置随机互换，然后第二的和第三的随机互换等等。在这样的结果下，作者们依然能够对偏差和相关度进行估计，不过用户的体验就要比第一种完全随机的要好。只不过，在现实中，这种方法依然会对用户体验有所损失。

于是，作者们提出了第三种方法，那就是直接对位置偏差模型进行参数估计。也就是说，不希望利用随机化来完全消除其中的位置概率，而是估计位置概率和相关度概率。

这里，因为有两个概率变量需要估计，于是作者利用了传统的“期望最大化”（EM）算法，并且提出了一种叫做“基于回归的期望最大化”的方法。为什么这么做呢？原因是在传统的期望最大化中，作者们必须对每一个关键字和文档的配对进行估计。然而在用户数据中，这样的配对其实可能非常有限，会陷入数据不足的情况。因此，作者们提出了利用一个回归模型来估计文档和查询关键字的相关度。也就是说，借助期望最大化来估计位置偏差，借助回归模型来估计相关度。

方法的实验效果

这篇文章使用了谷歌的邮件和文件存储的搜索数据，采用了 2017 年 4 月两个星期的日志。数据大约有四百万个查询关键字，每个关键字大约有五个结果。作者们在这个数据集上验证了提出的方法能够更加有效地捕捉文档的偏差。利用了这种方法训练的排序模型比没有考虑偏差的模型要好出 1%～2%。

小结

今天我为你讲了 WSDM 2018 年的一篇来自谷歌团队的文章，这篇文章介绍了如何估计文档的位置偏差，然后训练出更加有效的排序算法。

一起来回顾下要点：第一，我们简要介绍了这篇文章的作者群信息；第二，我们详细介绍了这篇文章要解决的问题以及贡献；第三，我们简要地介绍了文章提出方法的核心内容 。

最后，给你留一个思考题，如果要估计位置偏差，对数据的随机性有没有要求？

欢迎你给我留言，和我一起讨论。

参考文献

1. Thorsten Joachims, Adith Swaminathan, and Tobias Schnabel. Unbiased Learning-to-Rank with Biased Feedback. Proceedings of the Tenth ACM International Conference on Web Search and Data Mining (WSDM '17). ACM, New York, NY, USA, 781-789, 2017.

061 | WSDM 2018论文精读：看京东团队如何挖掘商品的替代信息和互补信息

本周我们来精读 WSDM 的几篇论文，周一我们分享了一篇来自谷歌团队的文章，其核心是利用点击模型来对位置偏差进行更加有效的估计，从而能够学习到更好的排序算法。

今天，我们来介绍 WSDM 2018 的最佳学生论文《电子商务中可替代和互补产品的路径约束框架》（A Path-constrained Framework for Discriminating Substitutable and Complementary Products in E-commerce），这篇文章来自于京东的数据科学实验室。

作者群信息介绍

这篇论文的所有作者都来自京东大数据实验室，我们这里对几位主要作者做一个简单介绍。

第三作者任昭春（Zhaochun Ren）目前在京东数据科学实验室担任高级研发经理。他于 2016 年毕业于荷兰阿姆斯特丹大学，获得计算机博士学位，师从著名的信息检索权威马丁⋅德里杰克（Maarten de Rijke）。任昭春已经在多个国际会议和期刊上发表了多篇关于信息检索、文字归纳总结、推荐系统等多方面的论文。

第四作者汤继良（Jiliang Tang）目前是密歇根州立大学的助理教授。汤继良于 2015 年从亚利桑那州立大学毕业，获得计算机博士学位，师从著名的数据挖掘专家刘欢（Huan Liu）教授。他于 2016 年加入密歇根州立大学，这之前是雅虎研究院的科学家。汤继良是最近数据挖掘领域升起的一颗华人学术新星，目前他已经发表了 70 多篇论文，并且有四千多次的引用。

最后一位作者殷大伟（Dawei Yin）目前是京东数据科学实验室的高级总监。2016 年加入京东，之前在雅虎研究院工作，历任研究科学家和高级经理等职务。殷大伟 2013 年从里海大学（Lehigh University）获得计算机博士学位，师从信息检索领域的专家戴维森（Davison）教授。目前已经有很多高质量的研究工作发表。殷大伟和笔者是博士期间的实验室同学以及在雅虎研究院期间的同事。

论文的主要贡献

我们首先来看一下这篇文章的主要贡献，梳理清楚文章主要解决了一个什么场景下的问题。

对于工业级商品推荐系统而言，一般通过两个步骤来产生推荐结果。第一步，产生候选集合，这里主要是从海量的物品中选择出几百到几千款用户可能会购买的商品；第二步，利用复杂的机器学习模型来对所有候选集中的产品进行排序。

这篇文章主要探讨了如何能够更好地产生候选集产品，即如何更好地产生“替代品”（Substitutes）和“互补品”（Complements）来丰富用户的购买体验。

那么，什么是替代品和互补品呢？

根据这篇文章的定义，替代品就是用户觉得这些商品可以互相被替换的；而互补品则是用户会一起购买的。挖掘这些商品不仅对于产生候选集具有很重要的意义，也对于某些场景下的推荐结果有很好的帮助，比如当用户已经购买了某一件商品之后，给用户推荐其他的互补品。

虽然替代品和互补品对于互联网电商来说是很重要的推荐源，但并没有多少文献和已知方法来对这两类商品进行有效挖掘。而且这里面一个很大的问题是数据的“稀缺”（Sparse）问题。因为替代品或者互补品都牵扯至少两个商品，而对于巨型的商品库来说，绝大多数的商品都不是两个商品一起被同时考虑和购买过，因此如何解决数据的稀缺问题是一大难点。

另一方面，商品的属性是复杂的。同一款商品有可能在某些情况下是替代品，而在另外的情况下是互补品。因此，如何在一个复杂的用户行为链路中挖掘出商品的属性，就成为了一个难题。很多传统方法都是静态地看待这个问题，并不能很好地挖掘出所有商品的潜力。

归纳起来，这篇文章有两个重要贡献。第一，作者们提出了一种“多关系”（Multi-Relation）学习的框架来挖掘替代品和互补品。第二，为了解决数据的稀缺问题，两种“路径约束”（Path Constraints）被用于区别替代品和互补品。作者们在实际的数据中验证了这两个新想法的作用。

论文的核心方法

文章提出方法的第一步是通过关系来学习商品的表征（Representation）。这里文章并没有要区分替代品和互补品。表征的学习主要是用一个类似 Word2Vec 的方式来达到的。

也就是说，商品之间如果有联系，不管是替代关系还是互补关系，都认为是正相关，而其他的所有商品都认为是负相关。于是，我们就可以通过 Word2Vec 的思想来学习商品的表征向量，使得所有正相关的商品之间的向量点积结果较高，而负相关的向量点积结果较低。这一步基本上是 Word2Vec 在商品集合上的一个应用。

通过第一步得到的每个商品的表征，是一个比较笼统的综合的表征。而我们之前已经提到了，那就是不同的情况下，商品可能呈现出不同的属性。因此，我们就需要根据不同的场景来刻画产品的不同表征。文章采用的方法是，对于不同类型的关系，每个商品都有一个对应的表征。这个关系特定的表征是从刚才我们学到的全局表征“投影”（Project）到特定关系上的，这里需要学习的就是一个投影的向量。

第三个步骤就是挖掘替代关系和互补关系了。这篇文章使用了一个不太常见的技术，用“模糊逻辑”（Fuzzy Logic）来表达商品之间的约束关系。在这里我们并不需要对模糊逻辑有完整的理解，只需要知道这是一种把“硬逻辑关系”（Hard Constraints）转换成为通过概率方法表达的“软逻辑关系”（Soft Constraints）的技术。

在这篇文章里，作者们重点介绍的是如何利用一系列的规则来解决数据稀缺的问题。具体来说，那就是利用一些人们对于替代关系或者互补关系的观察。

比如，商品 A 是商品 B 的替代品，那很可能商品 A 所在的类别就是商品 B 所在类别的替代品。再比如，商品 B 是商品 A 的替代品，而商品 C 又是商品 B 的替代品，而如果 A、B 和 C 都属于一个类别，那么我们也可以认为商品 C 是 A 的替代品。

总之，作者们人工地提出了这样一系列的规则，或者叫做约束关系，希望能够使用这样的约束关系来尽可能地最大化现有数据的影响力。当然，我们可以看到，这样的约束并不是百分之百正确的，这也就是作者们希望用“软逻辑关系”来进行约束的原因，因为这其实也是一个概率的问题。

整个提出的模型最终是一个集大成的优化目标函数，也就是最开始的物品的综合表征，在特定的关系下的投影的学习，以及最后的软逻辑关系的学习，这三个组件共同组成了最后的优化目标。

方法的实验效果

这篇文章使用了京东商城的五大类商品来做实验，商品的综述大大超过之前亚马逊的一个公开数据的数量。作者重点比较了之前的一个来自加州大学圣地亚哥团队的模型，以及几个矩阵分解的经典模型，还比较了一个基于协同过滤的模型。

从总的效果上来看，这篇文章提出的模型不管是在关系预测的子任务上，还是在最后的排序任务上均要大幅度地好于其他模型。同时，作者们也展示了逻辑关系的确能够帮助目标函数把替代关系和互补关系的商品区分开来。

小结

今天我为你讲了 WSDM 2018 年的一篇来自京东数据科学团队的文章，这篇文章介绍了如何利用多关系学习以及模糊逻辑来挖掘商品的替代信息和互补信息，然后训练出更加有效的排序算法。

一起来回顾下要点：第一，我们简要介绍了这篇文章的作者群信息；第二，我们详细介绍了这篇文章要解决的问题以及贡献 ；第三，我们简要地介绍了文章提出方法的核心内容以及实验的结果。

最后，给你留一个思考题，互补商品或者替代商品是双向关系还是单向关系，为什么呢？

欢迎你给我留言，和我一起讨论。

062 | WSDM 2018论文精读：深度学习模型中如何使用上下文信息？

今天，我们继续来精读 WSDM 2018 的一篇论文《隐含交叉：在循环推荐系统中利用上下文信息》（Latent Cross: Making Use of Context in Recurrent Recommender Systems）。这篇文章同样出自谷歌团队，其核心思想是希望通过深度模型来模拟并实现在推荐系统中广泛使用的“交叉特征”（Cross Feature）的效果。

作者群信息介绍

这篇论文的所有作者都来自谷歌，我们这里对其中的主要作者做一个简单介绍。

文章的第一作者亚力克斯·布伦特（Alex Beutel）是谷歌的资深科学家，于 2016 年加入谷歌。布伦特毕业于卡内基梅隆大学，获得计算机科学博士学位，师从机器学习的权威亚力克斯·斯莫拉（Alex Smola）。

最后一位作者艾德·池（Ed H. Chi）是谷歌的主任科学家，他拥有 39 项专利，已经发表了 110 多篇论文。在加入谷歌之前，池是帕罗奥图（Palo Alto）研究中心的主任研究员。池毕业于明尼苏达大学，获得计算机科学博士学位。

论文的主要贡献

我们首先来看这篇文章的主要贡献，梳理文章主要解决了一个什么场景下的问题。

推荐系统经常需要对当下的场景进行建模，有时候，这些场景被称作“上下文”（Context）。在过去比较传统的方法中，已经有不少方法是探讨如何利用上下文信息进行推荐的，比如使用“张量”（Tensor）的形式进行建模；还有一些方法是利用对时间特性的把握，从而对上下文信息进行处理。

近些年，随着深度学习的发展，越来越多的深度学习模型被应用到推荐系统领域中，但还没有直接探究如何在深度学习模型中使用上下文。这篇文章就想在这一方面做一个尝试。

这里面有一个比较棘手的问题。过去，这样的上下文常常使用“交叉特性”，也就是两个特征的乘积成为一个新的特征。这样的方法在矩阵分解或者张量分解的模型中得到了非常广泛的使用。然而在深度学习中，过去的经验是不直接使用这样的特性。但是，在上下文非常重要的推荐系统中，不使用交叉特性的的结果，往往就是效果不尽如人意。

这篇文章提出了一个叫“隐含交叉”（Latent Cross）的概念，直接作用在嵌入（Embedding）这一层，从而能够在深度模型的架构上模拟出“交叉特性”的效果。

论文的核心方法

作者们首先探讨了推荐系统中一个常见的特性，那就是利用交叉特性来达到一个“低维”（Low-Rank）的表达方式，这是矩阵分解的一个基本假设。比如每一个评分（Rating）都可以表达成一个用户向量和物品向量的点积。

那么，作者们就提出了这样一个问题：作为深度学习的基石，前馈神经网络（Feedforward Neural Network）是否能够很好地模拟这个结构呢？

通过模拟和小规模实验，作者们从经验上验证了深度学习的模型其实并不能很好地抓住这样的交叉特性所带来的“低维”表达。实际上，深度学习模型必须依赖更多的层数和更宽的层数，才能得到相同的交叉特性所达到的效果。对于这一点我们或多或少会感到一些意外。同时，作者们在传统的 RNN 上也作了相应的比较，这里就不复述了。

得到了这样的结果之后，作者们提出了一个叫作“隐含交叉”的功能。这个功能其实非常直观。传统的深度学习建模，是把多种不同的信息输入直接拼接在一起。“隐含交叉”是让当前的普通输入特性和上下文信息进行乘积，从而直接对“交叉特性”进行建模。

这样做的好处是不言而喻的。之前，我们寄希望于深度学习模型自身能够学习到这样的交叉关系。而现在，作者们直接让上下文信息作用于输入信息和其他的中间特征，使得上下文信息的作用得到了提升。

这篇文章提出的办法可以说是第一个尝试解决传统推荐系统的一些想法，使之移植到深度学习的语境中。

方法的实验效果

这篇文章使用了谷歌的 Youtube 数据来做实验。作者们比较了一系列的方法，得出的结论是 RNN 配合“隐含交叉”比仅仅使用 RNN 的效果要好 2%~3%，这个提升已经是一个非常可观的数字了。

小结

今天我为你讲了 WSDM 2018 的一篇来自谷歌团队的文章，这篇文章介绍了在传统推荐系统的模型中（比如矩阵分解等）都有的交叉特性如何应用在深度学习中。

一起来回顾下要点：第一，我们简要介绍了这篇文章的作者群信息；第二，我们详细介绍了这篇文章要解决的问题以及贡献 ；第三，我们分析了文章提出方法的核心内容以及实验结果。

最后，给你留一个思考题，深度学习模型在默认状态下并不能很好地抓住交叉特性，这是深度模型的问题吗？

欢迎你给我留言，和我一起讨论。

101 | The Web 2018论文精读：如何对商品的图片美感进行建模？

“万维网大会”（The Web Conference 2018）前身叫作“国际万维网大会”（International World Wide Web Conference），从 1994 年开始举办，已有 20 多年的历史了，在 Google 学术排名上，是“信息系统”排名第一的国际顶级学术会议。

从万维网大会最初举办开始，这个会议就成为了互联网方面独一无二的权威学术会议。会议包含搜索、推荐、广告、数据库、信息提取、互联网安全等诸多领域的优秀论文，每年都吸引着上千名世界各地的学者和工程师来分享他们的最新研究成果。

2018 年的万维网大会于 4 月 23 日~27 日在法国里昂举行。整个会议收录了 171 篇论文，还有 27 个研讨班（Workshop）、19 个讲座（Tutorial）、61 个展板论文（Poster）和 30 个演示（Demo）。

万维网大会的一大特点就是论文成果涵盖了非常广的领域。要在这些论文中找到有价值的学习信息是一件非常耗时、很辛苦的任务。这里给你分享几篇我认为今年这个会议上最有价值的论文，希望能起到抛砖引玉的作用。

今天，我们就来看一篇优秀论文提名，题目是《基于美感的服装推荐》（Aesthetic-based Clothing Recommendation）。这篇论文一共有六位作者，除了两位分别来自新加坡国立大学和美国的埃默里大学之外，绝大多数作者都来自清华大学。

论文的主要贡献

在现代的电商推荐系统中，商品特别是服装服饰的图片，其美观和质量是用户进行购买决策的关键参考因素。不少过去的商品推荐系统已经考虑了图片的属性，特别是尝试同时利用图片信息和文字信息来实现多模（Multi-Modal）数据理解的目的，从而能够进行更加智能的推荐。不过，当前的大多数方案都只是考虑基本的图片特性。

从思路上来说，大多数的类似工作都是利用某种深度神经网络提取图片特性，然后和其他特性（例如我们说过的文本信息）加以组合，从而能够扩宽我们对商品信息的提取。这样提取出来的图像特征自然没有显式地对图像的“美感”（Aesthetic）进行建模。

这篇文章的作者们认为，商品图片的“美感”是非常重要的属性，针对美感进行建模会有更显著的商品推荐效果。概括来说，这篇论文的一个贡献就是提供了一种模型，来对图片的美感和一般性的图片语义特性同时进行建模。这是一个在过去的工作中都没有的创新点，我们接下来会详细说明一这个模型的架构。

当作者们提取出了图片的美感信息以后，接下来的一个问题就是如何利用这些特性。这篇论文使用了张量分解（Tensor Factorization）的思路。我们在前面介绍推荐系统的时候曾经提到过，张量分解是一种很有效且常用的利用上下文语义信息的推荐模型。和一些之前的工作类似，这里作者们采用了三维的张量来表达用户、商品和时间之间的关系。同时，作者们还把图片信息有效地结合到了张量分解中，从而能够利用美感信息来影响推荐结果。

论文的核心方法

了解了这篇论文的大体思路以后，我们现在来看看论文的第一个核心部件：如何利用深度神经网络来提取图片的美感信息？

首先，这篇论文提出的模型假设对于每一个商品，我们都有一个综合的美感标签，并且还有一个细节标签来表达这个商品图案的“图像风格”（Style）。美感的综合标签是一个 1~10 的打分，而图像风格则是文字的图像特征，比如“高曝光”、“对比色”等。那么，我们需要一个神经网络模型，来同时对美感标签和细节的图像风格进行建模。

具体来说，文章提出的模型分为了两个层次。第一个层次是用来解释细节的图像风格。在本文采用的数据中，一共有 14 种图像风格，作者们就用了 14 个子网络（Sub Network）来针对这些风格。每个风格都对应一个独立的子神经网络。每一个子神经网络都是标准的“卷积网络”（CNN）。他们的目标是尽可能地学习到特性来表示每个细节的图像风格。

当我们有了第一层的 14 个子网络之后，再把这些子网络学习到的特性都整合起来，形成中间特性层，然后再经过一个卷积网络，从而学习到一个对商品的整体美感评分进行解释的神经网络。

在文章中，作者们提到这两个层次的神经网络并不是分类进行训练的，而是在一个整体中进行训练。意思就是说，我们同时训练底层的针对图像风格的 14 个子网络的参数，以及高层次的针对美感评分的网络的参数。

当我们得到了图片的美感信息之后，下一步，就来看一下如何利用张量分解来进行商品推荐。

相比于传统的张量分解，在这篇文章中，作者们提出了一种新颖的，针对商品推荐的张量表达模式，叫作“动态协同过滤”（Dynamic Collaborative Filtering），或简称 DCF。

DCF 认为，每一个用户对于某个商品的购买取决于两个方面的因素。第一，用户是否对这个商品有喜好。第二，这个商品是不是符合时间维度上面的“流行度”。作者们认为，只有当这两个条件同时满足的时候，也就是用户喜欢某个当季的商品时才会做出购买的决定。因此，作者们使用了两个矩阵分解来分别代表这两个假设。

第一个矩阵分解是针对用户和商品这个矩阵，这里我们会学习到用户对商品的喜好度。第二个矩阵分解是针对时间和商品这个矩阵，这里我们会学习到时间和商品的流行度。然后，作者把这两个矩阵分解（或者说是把两个矩阵）相乘，这就得到了一个张量，来表达用户在时间维度上对商品的喜好。

那么，如何把刚才学习到的图片美感信息给融入到这个新的张量学习框架下呢？作者们是这么做的，针对我们刚才所说的两个矩阵分解进行“扩展”。

刚才我们说，这个张量分解是基于一个假设，那就是用户在时间维度上的购买决定取决于，用户是否对这个商品有喜好，以及这个商品是不是符合时间维度上面的“流行度”。我们用了两个矩阵分解来表达这两个假设。每一个矩阵分解都是把一个大的矩阵分解成两个向量，比如用户和商品的矩阵就被分解为用户特性和商品特性。

基于此，作者们就在这个用户和商品的矩阵后面，再加上一个商品和图片美感信息矩阵，用来混合这两种信息。也就是说，我们刚才的第一个假设，用户对商品的好感，就被扩展成了两个矩阵的加和，用户和商品矩阵以及商品和图片信息矩阵，这两个矩阵的加和依然是一个矩阵。同理，时间和商品的流行度，被扩展成了时间和商品矩阵以及商品和图片信息矩阵的加和。也就是说，新的模型是两个矩阵的乘积组成的张量分解，而这里的每个矩阵分别又是两个矩阵的加和。这就是作者们最终提出的模型。

方法的实验效果

作者们在亚马逊的衣服数据集上做了实验来验证模型的有效性。这个亚马逊的数据集由将近四万的用户、两万多的商品和超过二十七万的购买信息构成。除了这篇文章提出的模型以外，作者们还比较了一些其他算法，例如完全随机的算法、只推荐最流行的商品、传统的矩阵分解模型以及只有基本图像信息但没有美感信息的算法。文章汇报了排序的精度 NDCG 以及“召回”（Recall）等指标。

从实验效果来看，这篇文章提出的模型要明显好于矩阵分解以及只有基本图像信息的算法，表明针对产品的图像美感进行建模是有价值的。并且，作者们提出的新的张量分解方法也被证明是切实有效的。

小结

今天我为你讲了今年万维网大会的一篇优秀论文。文章介绍了如何对商品的图片美感进行建模，以及如何把提取到的信息融入到一个基于张量分解的推荐系统中。

一起来回顾下要点：第一，我们详细介绍了这篇文章要解决的问题以及贡献；第二，我们简要地介绍了文章提出方法的核心内容；第三，我们简单分享了一下模型的实验成果。

最后，给你留一个思考题，有没有在没有标签情况下对图片的美感进行建模的呢？

欢迎你给我留言，和我一起讨论。

102 | The Web 2018论文精读：如何改进经典的推荐算法BPR？

今天，我们来看万维网大会上的一篇优秀短论文。在万维网大会上，主要发表两类论文。一类是 10 页的长论文，一类是 2 页的短论文或称作展板论文。短论文主要是发表短小的成果或者是还在研究过程中的重要成果。每一届的万维网大会，都会评选出一篇最佳短论文奖。

今天我和你分享的论文，题目是《利用查看数据，贝叶斯个性化排序的一种改进的取样器》（An Improved Sampler for Bayesian Personalized Ranking by Leveraging View Data）。这篇论文也有六位作者，和我们介绍的上一篇论文一样，都来自清华大学和新加坡国立大学。

贝叶斯个性化排序

要想理解这篇论文的内容，我们必须要讲一下什么是“贝叶斯个性化排序”（Bayesian Personalized Ranking），或者简称是BPR。有关 BPR 的详细介绍，可以阅读参考文献 [1]。我们在这里仅对 BPR 进行一个高维度的总结。

简单来说，BPR 是推荐系统中的一个配对排序（Pairwise）学习算法。在我们前面介绍搜索算法的时候，曾经提到了各种配对排序学习算法。配对排序学习不是针对每一个数据实例来学习其标签或者响应变量，而是学习一个相对的顺序，希望能够把所有的正例都排列到负例之前。也就是说，对于配对排序来说，每一个数据实例的预测值本身并不重要，排序算法在意的是对于一正一负的一个配对来说，是否能够把正例给准确地排列到负例之上。这其实就要求 BPR 在数值上对正例的预测值能够比负例的预测值高。

BPR 主要是解决了在推荐系统中长期以来只对单个数据点进行预测，比如需要对用户物品的喜好矩阵建模的时候，之前的大多数算法都无法有效地对没有观测到的数据进行建模。而 BPR 是配对算法，因此我们只需要关注观测的数据以及他们之间的关系，从而能够对用户的喜好，特别是有“隐反馈”（Implicit Feedback）数据的时候，取得更加明显的效果。这里的隐反馈指的并不是用户告诉系统其对每一个物品的喜好程度，而是用户在和系统的交互过程中通过一些行为表达出的喜好。这些用户的行为往往并不全面，因此需要算法和模型能够对这些行为进行有效建模。

论文的主要贡献和核心方法

了解了 BPR 大概是怎么回事以后，我们来看一看这篇论文的主要贡献和核心方法。

首先我们刚才讲到 BPR 的核心是学习一个配对的排序问题。那么在训练的时候，我们需要对一个正例和一个负例的配对进行学习，更新参数。然而在一个自然的用户隐反馈数据集里，正例相对来说往往是少数，负例则是绝大多数。因此，一个传统的方法就是在组成一个配对的时候，相对于一个正例来说，我们都“均匀地”（Uniformly）选取负样本来组成配对，这个过程有时候也叫“采样”（Sampling）。

这篇论文有两个主要贡献。第一个贡献是，作者们发现，如果在全局均匀地采样负样本，第一没有必要，第二可能反而会影响最后学习的效果。第二个贡献是，针对电子商务的应用，作者们发明了一种负样本采样的方法，使得学习算法可以利用到更多的用户“浏览”（View）信息，从而能够对算法的整体训练效果有大幅度的提升。

方法的实验效果

这篇论文的数据集分别使用了母婴产品“贝贝网”和天猫的数据。其中，贝贝网有约 16 万用户、12 万商品、260 万次购买和 4600 万次浏览；天猫的数据则有 3 万用户、3 万多商品、46 万次购买和 150 多万次浏览。两个数据集都呈现了大于 99% 的“稀疏度”（Sparsity）。

首先，作者们实验了不从全局中选取负样本而仅仅采样一部分，而且是相比于原来的空间非常小的样本，比如仅仅几百个负样本而不是几万个的情况。实验效果在贝贝网上不仅没有影响算法的精确度，算法的精确度反而还有提升。而在天猫的数据集上，算法效果没有提升，而有一些小幅度的下降，但是作者们认为这样的代价还是值得的，因为数据集的减少，算法的训练时间会大幅度降低。从这个实验中，作者们得出了不需要从全局进行采样的结论。

紧接着，作者们提出了一个新的概念，那就是，对用户的数据集合进行划分，把用户的行为分为“购买集”（C1）、“浏览但没有购买集”（C2）、“剩下的数据”（C3）这三个集合。作者们提出，BPR 要想能够达到最好的效果，需要对这三种数据集进行采样。也就是说，我们需要组成 C1 和 C2、C1 和 C3 以及 C2 和 C3 的配对来学习。

具体来说，用户在贝贝网和天猫的数据中尝试了不同的比例来对这三种集合进行采样。总体的经验都是 C3 中采样的数据要大于 C2 中的，然后要大于 C1 中的。这其实就是说训练算法要更好地学习到用户不喜欢某件东西的偏好。采用这样的采样方式，作者们展示了模型的效果比传统的 BPR 或仅仅使用“最流行的物品”作为推荐结果要好 60% 左右。

小结

今天我为你讲了今年万维网大会的一篇优秀短论文。文章介绍了如何对一个经典的推荐算法 BPR 进行改进，从而提高效率并且大幅度提升算法有效度。

一起来回顾下要点：第一，我们从高维度介绍了 BPR 的含义；第二，我们简要介绍了论文的主要贡献和思路；第三，我们简单分享了论文的实验成果。

最后，给你留一个思考题，除了这篇论文提出的组成正例和负例的配对思路以外，你能不能想到在用户浏览网站的时候，还有哪些信息可以帮助我们组成更多的配对呢？

欢迎你给我留言，和我一起讨论。

参考文献

1. Steffen Rendle, Christoph Freudenthaler, Zeno Gantner, and Lars Schmidt-Thieme. BPR: Bayesian personalized ranking from implicit feedback. Proceedings of the Twenty-Fifth Conference on Uncertainty in Artificial Intelligence (UAI '09). AUAI Press, Arlington, Virginia, United States, 452-461, 2009.

103 | The Web 2018论文精读：如何从文本中提取高元关系？

今天我们来看万维网大会 2018 的最佳论文，标题是“HighLife: Higher-arity Fact Harvesting”。作者都来自德国著名的“马克斯·普朗克计算机科学研究所”（Max Plank Institute for Informatics）。这个研究所是德国最大的基础科学研究组织“马克斯·普朗克学会”（Max-Planck-Gesellschaft）的分支研究机构，致力于在科学刊物上发表新的研究成果，开发软件系统和培养新的科学研究工作者。马克斯·普朗克学会因其杰出的科研成果在德国甚至全世界都获得了很高的声誉。

什么是高元关系？

这篇论文主要是涉及到高元（Higher-Artiy）关系的提取。那什么是高元关系呢？

传统的信息提取和知识库主要是关注二元关系的提取和存储。例如，我们可以知道居里夫人分别于 1903 年和 1911 年获得了诺贝尔奖。但是关系数据库中并不知道这两年的奖项分别是物理和化学。同理，我们可以在知识库中存放居里夫人获得过诺贝尔物理奖以及诺贝尔化学奖的信息，但是就无法和 1903 年和 1911 年这两个信息进行配对。通过这个例子我们可以看出，基于二元关系的信息提取和知识库虽然简单易行，但是有其先天的局限性。

这篇论文要讨论的高元关系，就是希望能够直接对“居里夫人在 1903 年获得了诺贝尔物理学奖”这样的三元甚至更高元的关系进行提取和表征。作者们认为这篇论文是较少的关注高元关系提取的先驱工作。

论文的主要贡献

我们刚才说了，这篇论文的一个重要贡献就是针对高元关系的提取所作出了很多努力。

具体来说，作者们使用“种子事实”（Seed Facts）作为一种监督信息来学习模式（Patterns），并且利用这些学习到的模式来寻找更多的“候选事实”（Facts Candidates），如此循环。这是把过去的一种针对二元关系提取的方法给扩展到高元关系。这个方法的潜在问题是：在能够保证“高召回”（High Recall）的情况下，得到的很多关系可能存在“噪声”和“目标浮动”（Target Drifts）。这里所说的目标浮动指的是我们提取的事实有可能存在主题上的偏差。

为了解决这个问题，作者们在这篇论文里利用了“限制推理”（Constraint Reasoning），来对已经得到的事实进一步筛选以得到最后的结果。这里的限制可以是“类型”（Type）上的，比如，我们限制提取到的普利策奖为“书籍”而非“电影”或“音乐”。通过这些在取值或者类型上的限制，我们可以对获取到的事实进行清理。

论文解决的另外一个难点就是很多高元信息在原始的文本中就是缺失的，或者是不完全的。比如，“Google 于 2014 年收购了 Nest”这个事实就没有提及金额，而“Google 以 32 亿美元收购了 Nest”这个事实又没有提及时间。作者们针对这个情况，把整个框架给扩展到了缺失信息中，从而能够从原始文本中拼凑多元关系。

论文的核心方法

文章提出了一个由好几个组件组成的系统用于信息的提取。

首先，有一个叫作 NERD的组件，即“人名识别和去歧义”组件，用于从句子中提取不同的“实体”。这里面运用到了很多外部的信息库，比如医疗生物实体库“联合医疗语言系统”（Unified Medical Language System）、支持新闻实体的 AIDA 系统以及 WordNet 语料库。同时，在这个部分，NERD 还依赖于“斯坦福自然语言处理核心库”（Stanford CoreNLP）提供“人名识别”以及“词类分析”（Part of Speech）等基础功能。

在提取了人名和实体名之后，作者们就开始构建一个从词类分析得到的树型数据结构。这个数据结构的目的是反映 N 元关系和内部信息的架构。这个部分基本上也是依赖传统的自然语言处理所得到的树结构，只不过进行了简单的修正。

得到树结构之后，接下来的一系列工作都是在这个树结构上获取不同的模式，从而能够得到想要的高元关系。这里面有很多细节，我们在这里就不赘述了。比如，作者们利用“树挖掘”（Tree Mining）技术来发现频繁出现的子树结构，从而认定某个子树模式是不是一个好的候选事实。这里的思路其实和经典的“频繁模式挖掘”（Frequent Pattern Mining）一样，都是去不断地计算一个结构的“支持度”（Support）和“置信度”（Confidence），从而通过两个值来决定是不是要把这个模式给留下来。

除此以外，这一部分的部件还需要支持“部分 N 元候选事实”（Partial N-ary Fact Candidate）的匹配。之前我们也讲过了，这个功能也算是这篇论文的一个贡献。这里面的重要职能就是能够对树的一部分结构进行匹配，而不需要对所有的部分都能够完全一致。

当作者们通过树挖掘从而发现了基本的候选事实之后，下面需要做的工作就是针对这些候选事实进行推理盘查，看是不是所有的事实都能经得住推敲。也就是说，我们需要查看有没有存在多个事实不一致的地方。

需要指出的是，从整体上来看，所有组件的流程基本上都是无监督的数据挖掘操作。也就是说，整个系统并不需要依赖于什么训练数据。

方法的实验效果

作者们在纽约时报数据集以及 PubMed 数据集上都进行了实验，主要观测的指标是“精度”（Precision）。我们之前提到过，这篇文章所研究的高元关系提取，这个问题很新颖。因此，作者们还利用 CrowdFlower 众包平台来获取了数据的标签，用于检测所提取关系的准确度。当然这部分数据量相对来说是比较小的。

从实验的效果上来说，文章提出的方法能够达到平均接近 80%~90% 的精度，这可以说是非常令人振奋的结果了，而达到这样的结果仅仅需要几百个种子事实。

小结

今天我为你讲了今年万维网大会的优秀论文。文章介绍了如何从文本中提取高元关系，这是一个比较新的研究领域。

一起来回顾下要点：第一，我们简单讨论了高元关系的含义；第二，我们重点介绍了论文的主要贡献和核心思路；第三，我们简单分享了提出方法的实验成果。

最后，给你留一个思考题，在什么样的应用中，我们可以利用到这篇文章提出的高元关系？

欢迎你给我留言，和我一起讨论。

125 | SIGIR 2018论文精读：偏差和“流行度”之间的关系

2018 年的 SIGIR（国际信息检索研究与发展大会）于 7 月 8 日~12 日在美国密歇根州的安娜堡举行。从今天开始，我将精选几篇大会上最有价值的论文，和你一起来读。

我先简单介绍一下这个大会。SIGIR 从 1978 年开始举办，有 40 年的历史，是信息检索和搜索领域的顶级会议。SIGIR 2018，全称是 The 41st International ACM SIGIR Conference on Research and Development in Information Retrieval。

从最初举办开始，这个会议就成为了信息检索领域，特别是搜索技术和推荐技术方面的权威学术会议。会议的内容往往包含了搜索、推荐、广告、信息提取、互联网数据挖掘等诸多领域的优秀论文，每年都吸引着来自世界各地的学者和工程师参会，来分享他们最新的研究成果。

今天，我们首先来看一看今年的最佳论文，标题是《推荐系统中流行度有效性的概率分析》（Should I Follow the Crowd? A Probabilistic Analysis of the Effectiveness of Popularity in Recommender Systems）。

这篇论文一共有两位作者，均来自马德里自治大学（Universidad Autónoma de Madrid）。第一作者罗西奥·卡纳马雷斯（Rocio Cañamares）已经发表了好几篇相关主题的论文，第二作者帕布罗·卡斯蒂罗斯（Pablo Castells）是马德里自治大学、甚至是整个欧洲的信息检索学术权威。论文有超过 5 千次的引用。

论文的主要贡献

想要理解清楚这篇论文的主要贡献，我们首先要从推荐系统，或者是从更大的方向上，来看所有信息检索系统都存在的一个核心问题，那就是“偏差”（Bias）。偏差会带来一系列问题。这对推荐系统甚至信息检索系统的建模和评价都带来了巨大的挑战。

那么，为什么信息检索系统会有偏差呢？

我这里举一个简单的例子来说明。假设我们有两个物品和很多用户。对于每一个用户来说，系统都按照随机的顺序，分别给用户展示这两个物品，并且询问用户是否喜欢。

在这样的假设里，顺序是随机的，因此对于同一个用户来说，用户是否喜欢某一个商品，就完全是取决于这个物品本身的属性。对于所有用户来说，在整体上呈现的用户对这两个物品的喜好，则完全来自于大家对这两个物品本身的一种评价。那么，我们可以看到这里面没有任何的偏差。

然而，只要这个场景稍微有一些改变，就很容易引入各种偏差。比如，我们有超过一万件物品。尽管我们还是随机地展示给用户，但用户可能在看过一定数量的物品之后就慢慢厌倦了，那么，用户对于物品的喜好判断或许就会受到厌倦的影响，甚至，用户还很有可能直接放弃查看后面的物品。

还有很多相似的情况，比如我们不是把每个商品逐一展示给用户看，而是提供一个列表。那么，用户很有可能会以为这个列表有一定的顺序，比如在列表排名上方的物品可能是比较重要的。有研究表明，在有列表的情况下，用户很可能会按照列表的顺序提供某种喜好判断。很明显，在这样的情况下，用户的喜好判断就受到了这个列表顺序的干扰。

上面我们提到的都是“表现偏差”（Presentation Bias）。除此以外，一个信息系统其实还有很多类型的偏差，比如系统性偏差：一个新闻系统，只给用户推荐娱乐新闻，而不给用户看时政新闻，在这样的情况下，用户表现出来的喜好性就是有偏差的，因为系统没有给用户表达对时政新闻喜好的可能性。

信息检索和推荐系统的学者其实很早就意识到了偏差对于建模的影响。不管是我们这里提到的表现偏差还是系统性偏差，如果我们直接利用用户和系统交互产生的数据，那么训练出来的模型以及我们采用的衡量模型的办法也会有偏差，那我们得出的结论有可能就是不精准的。

这篇论文就是希望能够系统性地讨论偏差在推荐系统中所带来的问题。具体来说，这篇论文主要是探讨偏差和“流行度”（Popularity）之间的关系。

这里描述的是这样一种情况：有一些物品很有可能曾经给很多人推荐过，或者同时还被很多人喜欢过或者评价过，那么，这种流行度高的物品会不会对推荐结果的评价带来意想不到的偏差呢？

在过去的研究中，大家只是对这种流行度高的物品有一种直观上的怀疑，认为如果一个推荐系统仅仅能够推荐流行的物品，那肯定是有偏差的。但之前的很多工作并没有定量地去解释这里面偏差和评价之间的关系。这篇论文就提供了一个理论框架，指导我们去理解偏差以及偏差带来的评测指标的一些变化。

论文的核心方法

今天我们不去讲这篇论文的理论框架细节，我会重点提供一个大体的思路，帮助你理解这篇论文希望达到的目的。

简单来说，为了表达偏差和流行度之间的关系，作者们用了这么几个随机变量：用户是否对某个物品打分，用户是否对某个物品有喜好，以及用户是否观看某个物品。这里面的一个细节，或者说技巧，就是如何用概率的语言把这三者之间的关系给表达清楚。

作者其实采用了一些简化的假设，比如假设在测试集上的物品是训练集上没有出现过的等等。这样，就能够写出在测试集上用户对物品评价的一个期望关系，这个期望关系包含用户对所有测试物品是否有喜好。有了这层期望关系以后，就开始推导出，在测试集上理想状态下的最佳排序是一个什么样子。在这里的理论讨论其实并没有很大的现实意义，但是这是第一次研究人员用数学模型去详细表征一个最优的在测试集上的按照流行度排序的结论。

紧接着，作者们还讨论了这个最优排序在两种极端情况下的变化。一种情况是用户过往的行为都是仅依赖于物品本身的属性，而没有任何其他偏差。另外一种情况是用户过往的行为和物品本身的属性无关，意思就是仅依赖于其他的偏差。

在第一种极端情况下，最优的排序其实也就是我们所能观测到的最优排序，那就是按照物品的流行度。在第二种极端情况下，最优的排序其实是按照平均打分。

当然，你可能会说讨论这两种极端情况并没有现实意义呀。但这两种极端情况的讨论其实就证明了，只有在没有偏差的情况下，按照物品的流行度排序才是平均情况下最优的。而很明显，现实存在偏差，因此依靠流行度的排序，即便是平均情况下，也不是最优的选择。

然后，论文讨论了用户是否观看某一个物品对用户行为的影响。关于这一部分的讨论，其实之前已经有很多工作都做了一些类似的探索。不过这篇论文得出了一个有意思的结论。在考虑了用户观看物品的偏差以后，通过模拟的方法，我们会发现：随机结果的效果其实要比之前的观测值要好很多，而按照流行度的排序虽然不错，但是比随机的效果并没有好很多，而基于平均打分的结果其实要优于按照流行度的排序。可以说，这是一个有别于之前很多工作的新发现。

延申讨论

虽然这篇论文获得了 SIGIR 2018 的最佳论文奖，但是如果我们站在更大的角度上来分析这篇论文，其实就会发现，作实际上作者们是开发了一套特有的理论框架来描述推荐系统中的某一种偏差。更加普适化的对偏差的建模其实需要有随机化的数据，以及利用因果推断的办法来对任意情况下的偏差进行分析。文章提出的概率模型仅仅在这篇文章讨论的假设情况下才能成立。

当然，瑕不掩瑜，这篇文章不管是从结论上，还是从实际的分析过程中，都为我们提供了很多有意义的内容，帮我们去思考偏差对于建模所带来的挑战以及我们应该如何应对。

总结

今天我为你讲了今年 SIGIR 2018 的最佳论文。

一起来回顾下要点：第一，我们详细介绍了这篇文章要解决的问题和贡献，探讨偏差和流行度之间的关系，系统性地来讨论偏差在推荐系统中所带来的问题；第二，我们简要地介绍了文章提出方法的核心内容，包括设定随机变量、期望关系以及推导理想状态下的最佳排序；第三，针对论文我们简单进行了讨论。

最后，给你留一个思考题，在不考虑偏差的情况下，为什么一般的推荐系统会偏好于推荐流行物品的算法呢？

欢迎你给我留言，和我一起讨论。

126 | SIGIR 2018论文精读：如何利用对抗学习来增强排序模型的普适性？

今天，我们继续来精读 SIGIR 2018（国际信息检索研究与发展大会）的论文，今天分享的是本次大会的最佳短论文，标题是《使用对抗学习实现神经排序模型的跨领域正则化》（Cross Domain Regularization for Neural Ranking Models using Adversarial Learning）。

非常有必要先简单介绍一下这篇文章的作者群，可以说这是一个“明星阵容”。

第一作者丹尼尔·科恩（Daniel Cohen）来自马萨诸塞大学阿默斯特分校（University of Massachusetts Amherst），是计算机科学系的博士生。2017 年曾经在微软研究院剑桥分部实习。这篇获奖论文就是实习项目的总结。在深度学习模型在信息检索的应用这个方向上，科恩已经发表了多篇论文。

第二作者巴斯卡·米特拉（Bhaskar Mitra）是微软研究院剑桥分部的主任级科学家。近些年米特拉在信息检索领域很活跃，并且极力推动深度学习在这个领域的发展，他在这个领域发表了很多篇论文，在过去几年的很多学术会议上，也主持了多个关于深度学习和信息检索相结合的讲座。

第三作者卡特娜·霍夫曼（Katja Hofmann）也是来自微软研究院剑桥分部的科学家。霍夫曼在信息检索领域的主要贡献是研究在线排序学习。

论文的最后一位作者，布鲁斯·克罗夫特（W. Bruce Croft）是信息检索领域的学术权威，也是科恩的博士导师。他是美国 ACM 院士，还是信息检索领域最高学术荣誉奖杰拉德·索尔顿（Gerard Salton）奖的获得者。

论文的主要贡献

这篇论文主要涉及了这么两个重要概念的结合。第一个概念是“跨领域”（Cross Domain）信息检索，第二个概念就是“对抗学习”（Adversarial Learning）。

跨领域信息检索主要是指我们需要对一个以上的领域进行搜索。这里所说的领域主要是指不太相同，或者非常不同的文档集合。例如，如果我们要针对体育新闻、金融新闻等进行搜索，这里的“体育”和“金融”就是不同的领域。

跨领域信息检索的核心挑战是我们如何针对不同的领域都能进行有效搜索。比如，如果我们的排序算法本身或者其特性依赖于某个特定领域的信息，例如关于体育方面的搜索，需要依赖体育运动员的名字，那这种信息肯定会很少甚至完全不出现在另外一个领域。因此，依靠某些领域特有的信息很难做到真正的跨领域信息检索。

这篇文章的贡献是作者们认为，想要对跨领域的信息进行较好地检索，就需要训练这样的排序模型：不容易被某一个特定的领域所主导，同时也尽量不偏好某一个特定领域的具体信息。

如何实现这个目的呢？作者们使用了一种叫做“对抗学习”的技术。这也是这篇论文能够获奖的重要原因。

我在这里简单介绍一下对抗学习的原理。对抗学习最初的思想来自于利用深度产生模型解决计算机视觉中的一系列问题。最基本的对抗学习的模式主要是用于产生数据，而且是比较复杂的数据，例如图像。

对抗学习有两个模块，一个模块叫产生器，一个模块叫判别器。产生器的作用就是产生数据。判别器的作用是判断产生的数据是不是“真实数据”。产生器的最终目的是产生能够以假乱真的数据来扰乱判别器的判断能力。判别器的最终目的是不断提高判断能力从而能够分辨出数据的真假。

当然，最初的时候，产生器产生数据来源于随机噪声，因此判别器可以很容易地判断数据的真假。但是慢慢的，产生器产生的数据就会越来越接近真实数据，而判别器也很快在这个过程中得到优化，从而能够判别数据的真假。当然，这是一个动态的过程，最终，判别器和产生器的状态会稳定下来。

对抗学习这种思想最初被提出来的时候，主要是应用在计算机视觉领域中，用来产生以假乱真的图片。之后，这种技术被广泛应用到人工智能的各个领域。

这篇论文最大的一个贡献，就是利用了对抗学习的理念来增强学习到的排序模型的普适性，从而尽量避免学习到仅仅对一个领域有用的信息。

论文的核心方法

具体来说，这篇文章提出了这样一种方法。首先，我们有两套模型，一套是用于学习查询关键词和文档之间的相关关系的；一套是对抗学习的模型。然后，这两套模型的首要任务是更加精准地针对相关的文档和不相关的文档进行建模。这是整个框架里最主要的目标函数。

文章提出框架中新的模块是利用对抗学习来分别产生相关的和不相关的文档。具体来说，某一种类型的文档就像我们刚才提到的图片一样，我们希望能够利用产生器来进行产生这类数据。当然，我们依然需要判别器来引导产生器的工作。

在这篇文章中，相关的概念主要是看一个文档是不是某一个领域的。也就是说，我们希望对抗学习能够帮助识别某一个文档是不是来自于一个领域。当对抗学习模型被训练好的时候，对于查询关键词和文档的相关模型，我们就会利用一种叫做“梯度反转”的技术，强行偏离模型希望去拟合某一个领域的倾向。

从网络结构上看文章提出的模型，查询关键词和文档都需要经过卷积层、提取层等变换，然后进行俗称的“哈达马积”（Hadamard product），其实就是对应项乘积。这样，文档和查询关键词所提取出来的隐含特征就结合在一起。这个结果之后又经过一系列稠密层的变换，最终预测一个相关度的标签。对于对抗学习模型来说，对抗中的判别器从刚才所说的架构中提取一些中间层作为输入，然后判断这个文档是不是出现在某个领域中。

实验结果

在一个雅虎的搜索数据集以及另外两个数据集上，作者们对论文所提出的模型进行了实验。实验主要是看如果我们在某一个领域上训练出的模型，会不会在另外一个领域上表现优异。

一个不令人意外的结果是，如果我们在全部领域上进行训练数据，自然在所有的领域上效果都不错。当然，文章展示了，如果利用文章提出的方法，针对某一个领域，比如运动类文档，在训练的时候完全移除所有的文档，在测试集上依然有不错的表现。实验的结果比不进行对抗训练的效果要好 5% 以上。

小结

今天我为你讲了今年 SIGIR 上的最佳短论文。

一起来回顾下要点：第一，这篇论文主要涉及了两个概念，分别是跨领域信息检索和对抗学习，我们详细介绍了这篇文章的主要贡献，就是利用对抗学习的理念来增强所学排序模型的普适性；第二，我们简要地介绍了文章提出的方法核心内容，训练两套模型，利用对抗学习来分别产生相关的和不相关的文档；第三，我们简单介绍了论文的实验结果，进行对抗训练会有更好的效果。

最后，给你留一个思考题，除了使用对抗训练，你还能想到什么方法，能够比较好地学习到不属于某一个特定领域信息的排序模型？

欢迎你给我留言，和我一起讨论。

127 | SIGIR 2018论文精读：如何对搜索页面上的点击行为进行序列建模？

今天我们将继续来精读 SIGIR 2018 的论文。

我们已经分享了 SIGIR 2018 的最佳论文，介绍了如何对推荐系统中的偏差进行建模，从而能够利用这种对偏差的理解，来更加准确地对待基于流行度的推荐结果。周一我们分享了本次大会的最佳短论文，主要讲了如何利用对抗学习的技术来让学习的排序模型更加“健壮”，可以被应用到多个领域上。

今天我们分享的论文题目是《页面搜索的点击序列模型》（A Click Sequence Model for Web Search）。

文章的第一作者阿列克谢·博里索夫（Alexey Borisov）来自俄罗斯的搜索引擎 Yandex，并且在阿姆斯特丹大学攻读博士学位。之前，他已经发表过了多篇关于“点击模型”（Click Model）和深度学习模型结合的论文。

文章的第二作者马丁·万德纳（Martijn Wardenaar）、第三作者伊雅·马尔科夫（Ilya Markov）和最后的作者马顿·德里克（Maarten de Rijke）也都来自阿姆斯特丹大学。其中，马顿是荷兰的计算机科学家，欧洲的信息检索学术权威，并且还是荷兰皇家科学院成员。

论文的主要贡献

我先对这篇论文的核心思想做一个提炼，就是利用深度学习模型，来对用户在搜索页面上的点击行为进行建模。

传统上，这种对用户在搜索页面上的点击行为进行建模的思路就是“点击模型”。从 2000 年开始，对点击模型的研究，就成为了信息检索以及搜索领域中一个非常活跃的课题。在最近 10 年的时间里，研究人员提出了几十种不同的点击模型。总体来说，不同的点击模型主要是对不同的用户行为进行编码，从而能够更加准确地对用户的点击行为进行预测。

在很多传统的点击模型中，为了简化模型，经常使用的一个假设是：针对每一个查询关键词，用户在搜索结果页只进行一次点击。在这种简化了的假设下，研究人员对用户的浏览、点击以及页面的偏差（例如位置偏差）进行建模，就会变得更加容易。然而，在很多场景中，这种假设就显得过于简化了。在同一个查询关键词的搜索结果页面下，很多用户都会点击多个结果。因此，对于多个点击结果的建模就变得重要起来。

这篇论文就是针对用户在搜索页面上的点击行为进行了序列建模，使得我们可以轻松地对每一个搜索页面进行预测，比如会有多少点击以及在什么位置点击等。

同时，这篇论文还有一个贡献，就是利用了深度学习中的循环神经网络（RNN）来对查询关键词的结果进行建模，扩宽了传统的完全基于概率建模的点击模型在深度学习时代下的表现力。

论文的核心方法

论文提出方法的核心思路是针对每一个查询关键词，模型需要对所有可能的点击序列进行建模。这个任务是通过构建一个神经网络来完成的。

具体来说，文章提出的模型有两个重要的模块，编码器（Encoder）和解码器（Decoder）。

编码器的作用是利用查询关键词和搜索结果为输入，生成它们的“嵌入向量”（Embedding Vector）。近年来，嵌入向量是深度学习建模中的一个重要技术手段，它的目的往往是先把一些离散变量信息转化为连续信息。在这里，查询关键词和搜索结果都可以首先表征为离散的输入信息，然后需要映射到一个共同的语义空间。这可以被认为是一个中间结果，或者在概率模型中，这往往被认为是一个隐含变量。

解码器的作用是根据这个中间的嵌入向量表达下的查询关键词和搜索结果，然后决定在哪一个位置上可能会或者不会发生点击。这其实就是一个多类的分类问题。那么，怎么才能让解码器终止在某一个状态呢？作者们引入了一个特殊的符号代表序列的终止。这样，解码器也需要预测是否需要终止。类似的对解码器的操作在深度序列建模中十分常见。

可以说，作者们在设计编码器和解码器的结构上也是费了一番功夫的。

对于编码器而言，作者们认为一个好的嵌入向量必须包含当前的结果信息，以及当前结果周围的结果，或者说是上下文的信息，以及查询关键词的信息。这样，可以把每一个搜索结果都当做是一个独立的单元，有着足够丰富的信息来进行后面的建模。

因此，作者们首先把查询关键词和每一个搜索结果转换成为第一个层次的嵌入向量，组成一个大的第一层次的嵌入向量。然后，作者们利用这个第一层次的嵌入向量，并且引入了循环神经网络，来对当前结果前后的结果进行了两次编码，一次正向，一次逆向，从而形成了第二层次的嵌入向量。这个第二层次的嵌入向量就是最终表征每一个搜索结果的向量。

对于解码器而言，作者们利用了“关注”（Attention）机制来对每一个搜索结果施加不同的权重，或者说是关注度。每个时间点，也就是每一次做“是否要点击”的决策之后，都会重新生成一个关注向量，或者说是一组新的关注权重。这里的核心是一个循环神经网络，自己更新内部的状态变量，并且根据关注向量以及输入的嵌入向量，来预测下面一个点击的位置。

有了编码器和解码器之后，一个难点是如何生成最有可能的点击序列。我们刚才提到了，整个模型其实可以预测多种不同的点击序列。因此，生成最优可能的 K 个序列就成为了必要的一个步骤。在这篇文章里，作者们利用了“集束搜索”（Beam Search）的方法来近似生成最佳的 K 个序列，在文章中，K 的值是 1024。

模型的训练采用了标准的SGD以及Adam 优化法，同时作者们还采用了“梯度裁剪”（Gradient Clipping）的方式来防止在优化过程中发生“爆炸问题”（Gradient Clipping）。

实验结果

作者们在 Yandex，俄罗斯的搜索引擎数据上进行了实验。因为之前没有类似的模型，因此文章并没有可以直接比较的其他模型。作者们主要进行评估的地方是，看历史数据中已经发生的点击序列，会不会被正确预测出，会不会出现在 K 个模型认为最有可能发生的点击序列中。这也就是作者们为什么选择 K 等于 1024 的原因，因为在这种情况下，接近 97% 的历史序列都在模型的预测序列中。

作者们还评估了模型能否预测出总的点击次数等一系列和点击预测有关的任务，论文中提出的模型都能够以接近 1 的概率预测所有的点击，并击败一些过去的基于概率的点击模型。可以说，提出的模型的确可以对用户在搜索页面的点击行为进行有效的建模。

小结

今天我为你讲了今年 SIGIR 2018 的一个篇精彩论文。

一起来回顾下要点：第一，我们详细介绍了这篇文章要解决的问题以及贡献，主要是对用户在搜索页面上的点击行为进行序列建模；第二，我们简要介绍了文章提出方法的核心内容，主要是编码器和解码器两个模块；第三，我们简单介绍了论文的实验结果。

最后，给你留一个思考题，如果针对多个连续的查询关键词的点击行为进行建模，你能否用这篇论文提出的思路来扩展模型呢？

欢迎你给我留言，和我一起讨论。

128 | CVPR 2018论文精读：如何研究计算机视觉任务之间的关系？

今年 6 月 18 日~22 日，计算机视觉和模式识别大会 CVPR（Conference on Computer Vision and Pattern Recognition），在美国的盐湖城举行。CVPR 大会从 1985 年开始举办，已经有 30 多年的历史，是计算机视觉领域的顶级会议。

最近几年，CVPR 大会发展成为了人工智能领域的盛会。受人工智能浪潮的影响，大会的投稿数量和参会人数都有了明显增加。大会今年共收到了 3300 份论文投稿，录取了 979 篇，录取率将近 30%。最终，选出了 70 篇论文做口头报告，224 篇论文做快速汇报。近两年的参会人数都保持着近 1 千人的增长势头，而今年更是达到了 6 千多人，是 2014 年参会人数的 3 倍多。同时，大会的审稿人也达到了惊人的 1 万人。

除了主会议以外，CVPR 大会还组织了 21 个讲座，48 个研讨班和博士论坛，有超过 115 家公司的赞助。

想要在这么多论文里找到最有价值、最有影响力的信息，可以说是大海捞针。我在这里为你精选了三篇今年 CVPR 的论文，希望能够起到抛砖引玉的作用。

今天，我们来分享大会的最佳论文，题目是——Taskonomy: Disentangling Task Transfer Learning。

我先来简单介绍下论文的作者群。

第一作者阿米尔·扎米尔（Amir R. Zamir）目前是斯坦福大学和加州大学伯克利分校的博士后研究员，已经在计算机视觉领域发表了 30 多篇论文，还获得过 CVPR 2016 的最佳学生论文奖。

第二作者亚历山大·萨克斯（Alexander Sax）刚刚从斯坦福大学计算机系硕士毕业，即将前往加州大学伯克利分校攻读博士，已经以硕士生的身份发表了两篇 CVPR 论文。

第三作者沈博魁刚从斯坦福大学计算机系本科毕业，即将在本校继续攻读博士。尽管是本科刚刚毕业，他已经发表了 2 篇 CVPR 论文和 1 篇 ICCV 论文。

第四作者利昂奈达·圭巴斯（Leonidas Guibas）是斯坦福大学计算机系教授，也是 ACM 和 IEEE 院士，还是美国工程院和科学院院士。他的博士导师是图灵奖获得者高德纳（Donald Knuth）。

第五作者吉腾德拉·马立克（Jitendra Malik）是加州大学伯克利分校计算机系教授，也是 ACM 和 IEEE 院士，并且是美国工程院以及科学院院士。马立克是计算机视觉方向的学术权威。

最后一位作者西尔维奥·萨瓦瑞斯（Silvio Savarese）是斯坦福大学计算机系的教授。他的研究方向是计算机视觉和计算机图形学。我们对华人学者李飞飞都很熟悉，萨瓦瑞斯是李飞飞的丈夫。

论文的主要贡献

概括来说，这篇论文主要是研究了计算机视觉任务之间的关系，并且提出了一个计算框架，能够定量地学习到这些任务之间的相似度。同时，这些相似的任务可以帮助数据较少的任务达到比较好的效果。这其实就是迁移学习（Transfer Learning）的核心思想：如何从已经学习到的任务或者领域迁移到数据较少、学习更加困难的任务或者领域。

很多研究人员在平时的研究过程中可能都会有这样的感觉，一些计算机视觉任务之间有某种逻辑或者直觉上的联系。例如，在计算机视觉界，像物体识别（Object Recognition）、景深估计（Depth Estimation）、边界发掘（Edge Detection）以及姿势估计（Pose Estimation）这些任务，大家都普遍认为它们是有关系的一系列任务。但是，有一些视觉任务之间的关系则显得没有那么直观，比如，边界发掘和光影（Shading）如何帮助姿势估计，就不得而知了。

如果我们单独来解决每一类任务，必然会有很大的挑战。这篇论文其实展示了，很多任务之间是有关联性的，而利用这些任务的关联性其实可以带来数据上的巨大便利。也就是说，我们可以利用更少的数据来学习到更多的任务。从这个角度来看，迁移学习也为新任务带来了希望，当我们没有大量的人工标注的数据时，依然能够在新任务上获得有效的结果。

这篇论文的另外一个重要贡献是提出了一个计算框架，这个框架并不需要事先准备的知识，比如人为地决定哪两个任务之间是有关联的，或者说，并不像之前的一些利用概率建模的方法，需要对任务之间的结构加以一个先验概率。这篇论文提出的框架完全从数据和结果的角度出发，从而避免了这些先验信息的不完整和不准确。

论文的核心方法

这篇论文提出的方法由四个组成部分，分别是：任务相关的建模、迁移建模、任务与任务关系归一化以及最后计算任务的关系图谱。每一个组成部分都有不同的目标。

首先，我们需要建立的是每一个独立任务自己的一个模型。这些模型有两个任务：第一就是尽可能地提高对自身任务的精度；第二就是在这个过程中，尽可能提取有代表性的中间表征结果，能够有助于迁移学习。

第二个部分就是迁移建模。这个部分主要是利用第一部分学习到的中间表现层，然后再在目标任务上学习到从原本的表现层到任务目标的迁移。这里面，除了一个原表现层，或者是原任务可以借鉴以外，作者们提出还可以利用多个原任务，来达到提升效果的目的。这样也就把多个任务和一个目标任务关联了起来。

第三个部分是任务关系的归一化。这一部分其实是这篇文章的一个亮点。当我们得到迁移学习的结果以后，我们就可以利用每两个任务之间的关系来获得一个矩阵，这个矩阵就完全表征了所有任务的联系。然而，如果直接利用任务的迁移损失函数的值来刻画两个任务之间的关系，那么每两个任务之间的这个数值其实是没办法直接比较的。如果我们采用机器学习界归一化数据的办法，比如把数据归一到 0 和 1 之间，也是不行的，因为这样就完全没有考虑损失函数变化的速度和目标任务精度之间的关系。

所以，这篇论文的作者们提出了一种按照次序来做归一化的方法。简单来说，就是不再看两个任务之间的绝对的迁移数值，而是看在测试集上哪一个原任务相比于其他任务能够更多地获取目标任务的精度。这样所有的任务就可比了。总之，任务关系归一化的目的就是构建了任务与任务之间关系的矩阵。

最后一个部分的目的就是从这个关系矩阵中提取出所有任务的一个真正的关系图谱。也就是说，我们希望从一个完全的全连通图，找到一个最有价值的子图。在这里，作者们采用了一种叫作“布尔值整数规划”（Boolean Integer Programming）的方法，在一些限制条件下，挖掘出了一个有代表性的子图。

实验结果

作者们提出了一个有 4 百多万张图片的新的数据集。在这个数据集里，有 26 个计算机视觉任务。从实验中，作者们挖掘出了这样一些情况，例如 3D 的、2D 的任务自然被归类到了一起，而其他的例如上下文分割、景象识别这种高层次的任务则被分在了一起。

为了研究这种挖掘出的结构是否真的能够实现迁移学习的目的，作者们还把不同的两两任务随机组合在一起，也就是某种随机任务的图谱，按照学习到的结构进行迁移学习，看是不是比随机结果要好。答案是，的确要好很多。在这篇论文里，作者们展示了学习到的结构不仅能够帮助目标任务提升性能，而且在任务之间关系的解释性上效果也非常不错。

小结

今天我为你讲了 CVPR 2018 的最佳论文。

一起来回顾下要点：第一，我们详细介绍了这篇文章要解决的问题以及贡献，论文研究了计算机视觉任务之间的关系，并且提出了一个计算框架，能够起到迁移学习的作用；第二，我们简要介绍了文章提出的核心方法，主要有四个组成部分；第三，我们简单介绍了论文的实验结果。

最后，给你留一个思考题，当前挖掘的关系主要是任务的两两关系，能否有一个方法挖掘任务的高维度关系，比如三个任务之间的关系？

欢迎你给我留言，和我一起讨论。

129 | CVPR 2018论文精读：如何从整体上对人体进行三维建模？

今天我们来分享 CVPR 大会的最佳学生论文，标题是《全方位捕捉：用于跟踪面部表情，手势和身体运动的 3D 变形模型》（Total Capture: A 3D Deformation Model for Tracking Faces, Hands and Bodies）。

很多学术会议都利用最佳学生论文这个奖项来鼓励学生参与学术研究活动，所以这个奖项的一般要求是第一作者必须是在校学生。

这篇论文的作者群来自卡内基梅隆大学。

第一作者周寒星（Hanbyul Joo）是来自韩国的学者，目前在卡内基梅隆大学机器人学院（The Robotics Institute）攻读博士。他的博士论文方向是“计算行为科学”（Computational Behavioral Science）。他已经在计算机视觉方向发表了多篇 CVPR、ICCV 论文。

第二作者托马斯·西蒙（Tomas Simon）也是卡内基梅隆大学机器人学院的博士生。他的研究方向是“三维运动的时空建模”（Spatiotemporal Modeling of 3D Motion）。

最后一位作者是这两位学生的导师亚瑟尔·舍艾克（Yaser Sheikh），是机器人学院的教授。

论文的主要贡献

这篇论文想要解决的问题很直观，那就是希望对人体进行三维建模，并且能够跟踪（Track）人体的行为以及活动。

这个任务看似简单，但有不少难点。

首先，过去绝大多数的对人体进行三维建模的工作，都是针对人体的不同部分分别进行的，比如对脸部、对身体和对手部分别建模。在对这些部位进行建模的时候，整体的设定都不太一样。例如，对脸部的建模一般是近景（Close-Up），而对身体则主要是看身体的整体行动。也就是，对于人体不同部位的建模经常在不同的尺度下进行，那就无法把各个部分的建模很容易地对接上。

其次，还有一些人体的部位，过去并没有太多专门的建模工作，比如针对头发和脚，但这些在全身的建模中也是必不可少的部分。

这篇论文就加入了对头发和脚这些部分建模的讨论，提供了对人体从整体上进行建模的一个框架。确切地说，论文提供了两个模型：一个叫“弗兰肯斯坦”（Frankenstein），一个叫“亚当”（Adam）。

“弗兰肯斯坦”主要还是依靠对人体不同部分的建模，然后把这些模型连接起来，通过一些处理，能够让最终呈现的三维建模符合现实。在这个模型的基础上，“亚当”则加入了头发和脚的元素，抛弃了“弗兰肯斯坦”的一些特殊处理的地方，从模型的角度来说更加简单，并且达到了更加逼真的程度。

论文的核心方法

首先，我们来看一看这个叫“弗兰肯斯坦”的模型。这个模型的思路是尽量把能够对人体各个部分建模的最好的模型先拼接到一起。总体来说，每一个部分基本上都由三组参数组成：运动参数（Motion Parameters）、形状参数（Shape Parameters）和全局翻译参数（Global Translation Parameter）。

对于人的身体部分，作者们采用了SMPL 模型[1]。这个模型根据人体形状的均值和形状的变化量进行线性的叠加，然后经过一个LBS 变换来得到对身体部分的最终建模。

对人脸的部分，作者们采用了一个叫FaceWarehouse 的模型[2]。这个模型是根据人脸形状的均值、形状的变化量，以及动态的变化量来进行线性的叠加。

对于手而言，目前并没有模型可以直接用。作者们在这篇论文中提出了自己的模型，总的来说就是对手的骨架和关节进行建模，然后进行类似于身体的 LBS 变换。同样，也对人体的脚进行了类似的建模。

当我们有了身体、人脸、手和脚的模型以后，下面的工作就是把这些部分衔接上。首先，作者们保留了人体模型，移除这个模型上的人脸、手和脚。然后利用人脸模型、手的模型以及脚的模型相应的全局翻译参数，使得这些部分的坐标能够拼接上。最后，作者们还应用了一个“融合函数”来构建出一个平滑的人体结构。

“弗兰肯斯坦”的模型有一个四项的目标优化函数。这个函数的第一项是拟合“关键点”（Key Points），让人体的躯干骨架能够拟合上运动轨迹。第二项是拟合“三维点云”（3D Point Cloud），也就是让人体大部分躯体的实体能够拟合运动轨迹。第三项就是作者们附加的一个“小技巧”（Heuristic）用来把人体的每个部分连接在一起。这一项解决的就是整个模型设计带来的问题，也就是每个部分都是单独的形状参数，而并没有完全在模型上连接起来。最后一项是高斯先验概率，用来帮助模型找到唯一的解。

在“弗兰肯斯坦”的基础上，作者们开发了“亚当”模型。为了构建“亚当”，他们捕捉了 70 个人体的形态数据，首先构建这些人体的“弗兰肯斯坦”模型。在这些模型基础之上，作者们加入了人体的头发和衣服的形态，并且重新定义了整个模型的框架。

和“弗兰肯斯坦”相比，“亚当”是对所有的人体部件直接进行建模。这个模型和我们前面描述的某个具体部分的模型其实很类似，也是把人体的形态均值、形态的变化值和人脸表现值进行线性叠加，然后进行 LBS 变换。

因为“亚当”在模型上进行了简化和创新，所以在目标优化函数中只有三项变量。而我们刚刚讲过的用于“弗兰肯斯坦”模型的小技巧在“亚当”中就变得不需要了。

实验结果

在实验中，作者们使用了 140 个 VGA 照相机对三维身体的关键点进行重建，用了 480 个 VGA 照相机，对脚进行重建，31 个高清照相机用于脸部和手部关键点的重建以及三维点云的构建。

作者们显示了利用“弗兰肯斯坦”和“亚当”这两个模型对人体的三维运动进行建模。总体来说，这两个模型的表现非常相似。“亚当”因为有了头发和衣服的形态，在运动中显得更加真实。只是在有一些情况下，“亚当”构建的腿会显得有一些不协调的瘦，出现这种情况的原因，作者们归结于数据的缺失。

不过，从总体效果上来讲，这篇论文作为第一个对于人体的全身进行三维建模并动态跟踪的工作，应该算是达到了满意的结果。

小结

今天我为你讲了 CVPR 2018 的最佳学生论文。

一起来回顾下要点：第一，我们详细介绍了这篇文章要解决的问题，就是从整体上对人体的运动进行三维建模；第二，我们简要介绍了文章提出的两个模型，“弗兰肯斯坦”和“亚当”核心内容；第三，我们简单介绍了这篇论文所取得的不错的实验结果。

最后，给你留一个思考题，如果我们需要对“亚当”这个模型进行改进，你认为下一步应该做什么？

欢迎你给我留言，和我一起讨论。

参考文献

1. M. Loper, N. Mahmood, J. Romero, G. Pons-Moll, and M. J. Black. SMPL: A Skinned Multi-Person Linear Model. In TOG, 2015.

2. C. Cao, Y. Weng, S. Zhou, Y. Tong, and K. Zhou. FaceWareHouse: A 3D Facial Expression Database for Visual Computing. In TVCG, 2014.

130 | CVPR 2018论文精读：如何解决排序学习计算复杂度高这个问题？

今天，我们来看这次大会的一篇最佳论文提名，标题是《基于排序的损失函数的有效优化》（Efficient Optimization for Rank-based Loss Functions）。

还是先简单介绍下论文的作者群。这篇论文的作者来自好几个不同的学术机构。

第一作者普里迪什·莫哈帕德拉（Pritish Mohapatra）是印度海得拉巴的国际信息科技大学（International Institute of Information Technology，Hyderabad）的计算机科学博士生。他已经在 NIPS、CVPR、ICCV、AISTATS 等国际机器学习权威会议上发表了多篇论文。

第二作者米卡尔·罗莱内克（Michal Rolinek）来自德国的马克思普朗克智能系统大学（Max Planck Institute for Intelligent Systems），博士后研究员。在这篇论文中，第一作者和第二作者的贡献相当。

第三作者贾瓦哈（C.V. Jawahar）是来自印度国际信息科技学院的教授。他是第一作者莫哈帕德拉的博士生导师。

第四作者弗拉迪米尔·科莫格罗夫（Vladimir Kolmogorov）是奥地利科技大学（Institute of Science and Technology Austria）的机器学习教授。

最后一个作者帕万·库玛（M. Pawan Kumar）来自牛津大学。

论文的主要贡献

这篇论文提出了一个针对排序学习中基于整个排序的损失函数的快速优化算法，这是一个重要贡献。

在计算机视觉中，有很多机器学习的任务都需要针对两个图像进行一个偏好的排序。而在信息检索或者搜索中，排序是一个核心问题。因此，任何对于排序学习算法的重大改进都会有广泛的应用。

先来回顾下我们学过的三种形态的排序学习算法。

第一种是单点法排序。这个算法针对每一个查询关键词和相对应的某个文档，我们仅仅判断每一个文档是不是相关的。大多数的单点法排序算法都把整个问题转换成为分类或者回归问题。这样就可以利用大规模机器学习的便利来快速地学习排序函数。

第二种是配对法排序。这个算法是以单点法为基础。因为单点法完全忽略两个文档之间的相对关系。所以配对法是对两个文档与同一个查询关键词的相对相关度，或者说是相关度的差值进行建模。

第三种是列表法排序。列表法是直接针对排序的目标函数或者指标进行优化。这种方法虽然在理论上有优势，但是计算复杂度一般都比较高，在现实中对排序效果的提升比较有限，因此在实际场景中，依然有大量的应用采用单点法或者配对法排序。

这篇论文就是针对列表法排序学习的“计算复杂度高”这个问题，作者们发明了一套叫作“基于快速排序机制”（Quicksort flavoured algorithm）的优化框架。在这个优化框架下，排序学习计算复杂度高的这个问题得到了大幅度优化。作者们然后证明了流行的针对 NDCG 和 MAP 进行排序学习都满足所发明的优化框架，这样也就在理论上提供了快速优化的可能性。

论文的核心方法

要理解这篇论文的核心方法，我们先从配对法排序学习讲起。

针对每一个查询关键词，我们可以构建一个文档和文档的矩阵。这个矩阵的每一个元素代表两个文档在当前查询关键词下的关系。如果这个矩阵元素是 +1，那么就表明这一行所代表的文档排位要优先于这一列所代表的文档。如果这个矩阵元素是 -1，那么就表明这一行所代表的文档要比这一列所代表的文档排位低。当然，还有矩阵元素是 0 的情况，那就是这两个文档的排位可以是一样的。在这个数据基础上，我们可以从所有这些二元关系中推导出一个整体的排序。

下面来看配对法排序的核心思路。对于同一个查询关键词而言，我们从和这个查询关键词相关的文档中，随机抽取一个文档，然后从和这个查询关键词不相关的文档中也抽取一个文档，这两个抽取出来的文档就组成一个配对。我们希望建立一个模型或者函数，对于这样任意的配对，总能够让相关文档的函数值大于不相关文档的函数值。

如果我们对这个配对法稍微做一些更改，得到的就是列表法排序。首先，我们依然针对每一个正相关的文档进行函数值预测，也针对每一个负相关的文档进行函数值预测。我们把这两个函数值的差值，当做是预测的配对矩阵中这两个文档相对应的那一个元素。只不过在这个时候，我们关注的不是这两个文档的关系，而是配对矩阵所代表的排序和真实排序之间的差别。这个差别越小，我们就认为最终的基于列表的损失函数就小；如果差别大，那损失函数的差别就大。

如何针对这个基于列表的损失函数进行优化，从而能让我们针对单一文档的函数打分最优呢？这就是列表法排序学习的一个核心困难。

有一个优化办法，就是找到在当前函数打分的情况下，有哪个文档配对违反了排序原则。什么是违反排序原则呢？我们刚才说了，模型是希望把正相关的文档排在负相关的文档前面。但是，如果函数并没有完全被学习好，那么负相关的文档也会排到正相关的文档之前，这就叫违反排序原则。

如果我们找到这样的配对，那么就可以通过调整函数的参数，让这样的违反配对不出现。很显然，当我们有很多这样的配对时，找到违反排序原则最严重的那个配对，也就是负相关的函数值要远远大于正相关函数值的这个配对，对于我们改进函数的参数就会很有帮助。所以，这里的关键就变成了如何找到违反排序原则最严重的配对（Most-violating ranking）。

作者们针对这个任务发明了一个框架，叫作“基于快速排序机制”。具体来说，作者们发现，违反排序原则最严重的配对需要满足一些原则。我们需要对当前的数据序列进行快速排序，从而能够找到这个违反排序原则的配对。这里有很多的细节，有兴趣的话建议去读读原论文。你只需要记住，这个快速排序机制利用了快速排序的时间复杂度，来实现寻找违反排序原则最严重配对的这个目的。

那么，是不是大多数排序指标都符合这个机制呢？作者们提供的答案是普遍的 MAP 和 NDCG 都符合这个机制。论文给出了证明，因此我们就可以直接使用论文的结论。

实验结果

作者们在 PASCAL VOC 2011 数据集上进行了实验，主要是比较了直接进行单点法排序以及直接进行列表法优化，和这篇论文提出的优化算法之间的性能差距。在这个比较下，本文提出的方法优势非常明显，基本上是以单点法的时间复杂度达到了列表法的性能。

小结

今天我为你讲了 CVPR 2018 的最佳论文提名。

一起来回顾下要点：第一，这篇文章的主要贡献是提出了一个基于整个排序的损失函数的快速优化算法；第二，文章提出方法的核心内容是发明了一个框架，叫作“基于快速排序机制”；第三，我们简单介绍了一下论文的实验结果。

最后，给你留一个思考题，回忆一下我们曾经讲过的 LambdaMART 算法，那里其实也有这么一个寻找违反排序原则配对的步骤，你能想起来是什么步骤吗？

欢迎你给我留言，和我一起讨论。

131 | ICML 2018论文精读：模型经得起对抗样本的攻击？这或许只是个错觉

2018 年 7 月 10 日~15 日，国际机器学习大会 ICML 2018（The 35th International Conference on Machine Learning），在瑞典的斯德哥尔摩举行。

ICML 从 1980 年开始举办，已有 30 多年的历史 ，是机器学习、人工智能领域的顶级会议。

今年 ICML 大会共收到了 2473 份投稿，投稿量和去年相比增加了 45%。今年最后录取了 621 篇论文，录取率近 25%。除了主会议以外，ICML 大会还组织了 9 个讲座，67 个研讨班。

在接下来的几期内容里，我会为你精选三篇 ICML 2018 的论文，我们一起来讨论。

今天，我和你分享的是大会的最佳论文，题目是《梯度混淆带来的安全错觉：绕过对对抗样本的防御》（Obfuscated Gradients Give a False Sense of Security: Circumventing Defenses to Adversarial Examples）。

先简单介绍下这篇论文的作者群。

第一作者阿尼什·阿提耶（Anish Athalye）是麻省理工大学的博士生，主要研究方向是机器学习算法的安全。他在今年的 ICML 大会上就发表了 3 篇论文。

第二作者尼古拉·泽多维奇（Nickolai Zeldovich）是阿提耶的导师。他是麻省理工大学计算机系的教授，做安全相关的研究。

第三作者大卫·瓦格纳（David Wagner）来自加州大学伯克利分校，是计算机系教授，也是安全研究方面的专家。

论文的背景

这篇论文的内容对于大对数人来说可能是比较陌生的。想要弄清楚这篇论文的主要贡献，我们首先来熟悉一下这篇论文所要解决的问题。

试想我们比较熟悉的监督学习任务。一般来说，在监督学习任务中，我们会有一个数据集，用各种特性（Feature）来表征这个数据集里的数据点。拿最普通的监督学习来说，比如需要把图像分类为“猫”、“狗”等，机器学习算法就是学习一个分类器，可以根据不同的输入信息来做分类的决策。

当然，我们所说的是在正常情况下使用分类器的场景。有一类特别的应用场景，或者说是“对抗”场景，其实是希望利用一切方法来破坏或者绕开分类器的决策结果。

一个大类的“对抗机制”是尝试使用“对抗样本”（Adversarial Examples）。什么是对抗样本呢？就是说一个数据样本和原来正常的某个样本是非常类似的，但是可以导致分类决策出现很大不同。例如在我们刚才的图像识别的例子中，一个有效的对抗样本就是一张非常像狗的图片，但是可以导致分类器认为这是一只猫或者别的动物。利用这种类似的样本，可以使分类器的训练和测试都产生偏差，从而达到攻击分类器的目的。

除了“对抗样本”的概念以外，我们再来看一看攻击分类器的一些基本的模式。

一般来说，对分类器的攻击有两种模式，一种叫作“白盒攻击”（White-Box），一种叫作“黑盒攻击”（Black-Box）。白盒攻击主要是指攻击者可以完全接触到分类器的所有内部细节，比如深度模型的架构和各种权重，但无法接触到测试数据。而黑盒攻击则是指攻击者无法接触分类器的细节。

这篇论文考虑的场景是白盒攻击。攻击方尝试针对每一个合法的数据点，去寻找一个距离最近的数据变形，使得分类器的结果发生变化。通俗地说，就是希望对数据进行最小的改变，从而让分类器的准确率下降。

在完全白盒的场景下，最近也有一系列的工作，希望让神经网络更加健壮，从而能够抵御对抗样本的攻击。但是到目前为止，学术界还并没有完全的答案。

论文的主要贡献

通过上面的介绍，我们知道目前有一些防御对抗样本的方法，似乎为分类器提供了一些健壮性的保护。这篇文章的一个重要贡献，就是指出，这些防御方法有可能只是带来了一种由“梯度混淆”（Obfuscated Gradients）所导致的错觉。

梯度混淆是“梯度屏蔽”（Gradient Masking）的一种特殊形式。对于迭代攻击方法来说，如果发生梯度混淆，防御方会形成防御成功的假象。

作者们在这篇论文中对梯度混淆进行了分析，提出了三种类型的梯度混淆：“扩散梯度”（Shattered Gradients）、“随机梯度”（Stochastic Gradients）和“消失梯度或者爆炸梯度”（Vanishing/Exploding gradients）。

针对这三种不同的梯度混淆，作者们提出了相应的一些攻击方案，使得攻击方可以绕过梯度混淆来达到攻击的目的，并且在 ICLR 2018 的数据集上展示了很好的效果。

值得注意的是，这篇论文针对的是在防御过程中“防御方”的方法所导致的梯度混淆的问题。目前学术界还有相应的工作是从攻击方的角度出发，试图学习打破梯度下降，例如让梯度指向错误的方向。

论文的核心方法

我们首先来看一看这三种类型的梯度混淆。

扩散梯度主要是指防御方发生了“不可微分”（Non-Differentiable）的情况。不可微分的后果是直接导致数值不稳定或者梯度不存在。扩散梯度其实并不意味着防御方有意识地希望这么做，这很有可能是因为防御方引入了一些看似可以微分但是并没有优化目标函数的情况。

随机梯度主要是由随机防御（Randomized Defense）引起的。这有可能是神经网络本身被随机化了，或者是输入的数据被随机化，造成了梯度随机化。

消失梯度和爆炸梯度主要是通过神经网络的多次迭代估值（Evaluation）所导致。例如，让一次迭代的结果直接进入下一次迭代的输入。

刚才我们说了，梯度混淆可能是防御方无意识所产生的结果，并不是设计为之。那么，攻击方有什么方法来识别防御方是真的产生了有效果的防御，还是仅仅发生了梯度混淆的情况呢？

作者们做了一个总结，如果出现了以下这些场景，可能就意味着出现了梯度混淆的情况。

第一种情况，一步攻击的效果比迭代攻击（也就是攻击多次）好。在白盒攻击的情况下，迭代攻击是一定好于一步攻击的。因此如果出现了这种一步攻击好于迭代攻击的情况，往往就意味着异常。

第二种情况，黑盒攻击的效果比白盒好。理论上，白盒攻击的效果应该比黑盒好。出现相反的情况，往往意味着不正常。

第三种情况，无局限（Unbounded Attack）效果没有达到 100%。最后的这种情况，就是随机寻找对抗样本，发现了比基于梯度下降的攻击要好的对抗样本。

那么，针对梯度混淆，攻击方有什么办法呢？

针对扩散梯度，作者们提出了一种叫BPDA（Backward Pass Differentiable Approximation）的方法。如果有兴趣，建议你阅读论文来了解这种算法的细节。总体说来，BPDA 就是希望找到神经网络不可微分的地方，利用简单的可微分的函数对其前后进行逼近，从而达到绕过阻碍的目的。

针对随机梯度，作者们提出了“变换之上的期望”（Expectation over Transformation）这一方法。这个方法的特点是针对随机变化，变换的期望应该还是能够反映真实的梯度信息。于是作者们就让攻击方作用于变换的期望值，从而能够对梯度进行有效的估计。

针对消失或者爆炸的梯度，作者们提出了“重新参数化”（Reparameterization）这一技术。重新参数化是深度学习中重要的技术。在这里，作者们使用重新参数化，其实就是对变量进行变换，从而使得新的变量不发生梯度消失或者爆炸的情况。

小结

今天我为你讲了今年 ICML 的最佳论文。

一起来回顾下要点：第一，这篇论文讨论了一个比较陌生的主题，我们简要介绍了论文的背景；第二，我们详细介绍了论文提出的三种类型的梯度混淆。

最后，给你留一个思考题，我们为什么要研究深度学习模型是否健壮，是否能够经得起攻击呢？有什么现实意义吗？

欢迎你给我留言，我们一起讨论。

132 | ICML 2018论文精读：聊一聊机器学习算法的“公平性”问题

在上一次的分享里，我们介绍了今年 ICML 大会的一篇最佳论文，这是一篇非常优秀的机器学习和计算机安全相结合的论文。这篇论文剖析了目前在白盒攻击的场景下，攻击方如何绕过一种叫作“混淆梯度”的情况，来实现有效攻击的目的。

今天，我们来分享 ICML 2018 的另一篇最佳论文，题目 Delayed Impact of Fair Machine Learning。这篇论文主要探讨了“公平”（Fair）在机器学习中的应用。论文的五位作者都来自加州大学伯克利分校。

论文的背景

这篇论文所探讨的主题是机器学习的“公平性”问题。近些年，这个主题受到了学术界越来越多的关注，但是对于普通的人工智能工程师和数据科学家来说，这个议题依然显得比较陌生和遥远。所以，我先来简单梳理一下这方面研究的核心思想。

机器学习有一个重要的应用，就是在各类决策场景中提供帮助，例如申请贷款、大学入学、警察执勤等。一个不可否认的特点是，这些决策很有可能会对社会或者个人产生重大的不可逆转的后果。其中一个重要的后果就是，针对不同的人群，有可能会产生意想不到的“不公平”的境况。比如，有一些普遍使用的算法，在帮助警察判断一个人是否可能是罪犯的时候，系统会认为美国黑人相对于白人更容易犯罪，这个判断显然存在一定的问题。

机器学习研究者已经注意到了这种算法中的“公平”问题，并且开始探讨没有任何限制条件的机器学习算法，是否会对少数族裔（Underrepresented Group）产生不公平的决策判断。基于这些探索，研究者们提出了一系列的算法，对现有的各种机器学习模型增加附带了公平相关的限制条件，希望通过这种方法来解决各种不公平定义下的决策问题。

论文的主要贡献

这篇论文从理论角度展开讨论，基于什么样假设和条件下的具有公平性质的机器学习算法，在决策场景中能够真正为少数族群带来长期的福祉。值得注意的是，这里所谓的少数族裔是一个抽象化的概念，指的是数目相对较少的，或者在某种特性下比较少的一组数据群体。这篇论文并不直接讨论社会学意义下的少数族群的定义。

作者们主要是比较两个人群 A 和 B，在不同的公平条件下，看这两组人群的某种“效用”（Utility）的差值会发生什么变化。这个差值可以是正的，没变化或者是负的。

论文的主要结论是，在不同的公平条件下，效用差值会有各种可能性。这其实是一个非常重要的结论。有一些公平条件，直觉上我们感觉会促进少数族群的效用，但这篇论文向我们展示了，即便出发点是好的，在某些情况下，效用差值也可能是负的。

除此以外，这篇论文还探讨了“测量误差”（Measurement Error）对效用差值的影响。作者们认为测量误差也应该被纳入整个体系中去思考公平的问题。

需要指出的是，论文的分析方法主要建立在时序关系的“一步预测”（One Time Epoch）基础上的。也就是说，我们利用当前的数据和模型对下一步的决策判断进行分析，并不包括对未来时间段所有的预测。从理论上说，如果在无限未来时间段的情况下，结论有可能发生变化。

论文的核心方法

这篇文章的核心思路是探讨针对人群 A 和 B 所采取的一种“策略”（Policy），是怎么样影响这两组人群的效用差别的。如果某种策略会导致某个群体的效用差别为负，那么我们就说这个策略对群体产生了“绝对损坏”（Active Harm）作用；如果效用差别是零，就说明这个策略对群体产生了“停滞”（Stagnation）作用；如果效用差别是正的，就说明这个策略对群体产生了“推动”（Improvement）作用。

除此以外，我们认为有一种不考虑人群 A 和 B 具体特征的期望最大化效用的策略，称之为“最大化效用”（MaxUtil）。这种策略其实就是在没有约束条件的情况下，利用一般的机器学习算法达到的效果。我们需要把新策略和这个策略进行比较，如果新的策略比这个策略好，就是产生了“相对推动”（Relative Improvement），反之我们说新的策略产生了“相对损害”（Relative Harm）。

为了进一步进行分析，作者们引入了一个叫“结果曲线”（Outcome Curve）的工具来视觉化策略和效用差值的关系。具体来说，曲线的横轴就是因为策略所导致的对某一个群体的选择概率，纵轴就是效用差值。当我们有了这个曲线之后，就能非常直观地看到效用差值的变化。

从这个曲线上我们可以看到，效用差值的确在一个区间内是“相对推动”的，而在另一个区间是“相对损害”的，在最右边的一个区间里是“绝对损害”的。这就打破了我们之前的看法，认为有一些选择策略会一致性地导致唯一结果。

在此基础上，我们专门来看这两种特殊的策略。第一种叫“种族公平”（Demographic Parity），思路是希望在两个人群中保持一样的选择概率。另一种策略叫“公平机会”（Equal Opportunity），思路是希望某个人群中成功的概率（例如申请到贷款、学校录取等）和人群无关。这两种策略都是典型的试图利用限制条件来达到公平的方法。我们希望来比较的就是这两种策略以及之前说的最大化效用之间的一些关系，得出以下三个主要结论。

第一个比较出乎意料的结论是最大化效用这个策略并不会导致“绝对损害”。意思就是说，和人们之前的一些想法不同，最大化效用也有可能让少数族裔的效用得到提升或者不变。

第二个结论是，这两种公平策略都可能会造成“相对推动”。这也是推出这两种策略的初衷，希望能够在选择概率上进行调整，从而让少数族裔的效用得到提升。

第三个结论是，这两种公平策略都可能会造成“相对损害”。这是本篇论文的一个重要结论，正式地证明了公平策略在某个区间上其实并没有带来正向的“推动”反而是“损害”了少数族群。作者们进一步比较了“种族公平”和“公平机会”这两个策略，发现“公平机会”可以避免“绝对损害”而“种族公平”则无法做到。

小结

今天我为你讲了今年 ICML 的另一篇最佳论文。

一起来回顾下要点：第一，这篇论文讨论了计算机算法的公平性问题；第二，我们详细介绍了论文提出的两种策略以及得出的主要结论。

最后，给你留一个思考题，研究算法的公平性对我们日常的应用型工作有什么启发作用？

欢迎你给我留言，和我一起讨论。

133 | ICML 2018论文精读：优化目标函数的时候，有可能放大了“不公平”？

今天我们要分享的是 ICML 2018 的一篇最佳论文提名，题目是 Fairness Without Demographics in Repeated Loss Minimization。

这篇论文讨论了这样一个话题，在优化目标函数的时候，如何能够做到针对不同的子群体，准确率是相当的，从而避免优化的过程中过分重视多数群体。这篇论文的作者都来自斯坦福大学。

论文的主要贡献

这篇论文其实也是希望讨论算法带来的“公平性”问题，但是出发的角度和我们上一篇讨论公平性的论文非常不一样。这篇论文的核心思想，是希望通过机器学习目标函数优化的原理，来讨论机器学习和公平性的关系。

作者们发现，基于“平均损失”（Average Loss）优化的机器学习算法，常常会给某一些少数群体带来巨大的不准确性。这其实并不是模型本身的问题，而是优化的目标函数的问题。在这样的情况下，目标函数主要是关注有较多数据的群体，保证这些群体的损失最小化，而可能忽略了在数量上不占优势的少数群体。

在此基础上，还带来了另外一个用户“留存度”（Retention）的问题。因为少数群体忍受了比较大的优化损失，因此这些群体有可能离开或者被这个系统剔除。所以，长期下去，少数群体的数目就可能逐渐变少。这也许是目标函数的设计者们无从想到的一个平均损失函数的副产品。作者们还把这个现象命名为“不公平的放大”（Disparity Amplification）。

这篇论文的一个重要贡献是发现ERM（Empirical Risk Minimization，经验风险最小化）其实就存在这种不公平的放大性。ERM 包含了很多经典的机器学习模型的目标函数，例如支持向量机（Support Vector Machines）、对数回归模型（Logistic Regression）以及线性回归等。作者们还发现，ERM 可以让即便在最初看上去公平的模型，在迭代的过程中逐渐倾向于不公平。

为了解决 ERM 的问题，作者们开发了一种新的算法框架，DRO（Distributionally Robust Optimization，分布式健壮优化）。这种框架是为了最小化“最差场景”（Worst-Case）的风险，而不是平均风险。作者们在真实的数据中展示了 DRO 相比于 ERM 更能够解决小众群体的不公平性问题。

论文的核心方法

为了解决在 ERM 下的对不同群体的不公平性问题，作者们首先对数据做了一种新的假设。

作者们假设数据中有隐含的 K 个群体。每一个数据点，都有一定的概率属于这 K 个群体。我们当然并不知道这 K 个群体本身的数据分布，也不知道每个数据点对于这 K 个群体的归属概率，这些都是我们的模型需要去估计的隐含变量。

对于每一个数据点而言，在当前模型下，我们都可以估计一个“期望损失”（Expected Loss）。在新的假设框架下，因为每个数据点可能属于不同的 K 个群体，而每个群体有不同的数据分布，因此会导致在当前群体下的期望损失不一样，也就是会出现 K 个不一样的期望损失。我们的目的，是要控制这 K 个损失中的最差的损失，或者叫最差场景。如果我们可以让最差的损失都要小于某一个值，那么平均值肯定就要好于这种情况。这也就从直观上解决了不公平放大的问题。

那么，如果我们直接在这样的设置上运用 ERM，会有什么效果呢？这里，有一个数值是我们比较关注的，那就是在整个框架假设下，每个群体的期望人数。这个数值等于在期望损失的情况下，当前群体剩余的人数加上新加入的人数。作者们在论文中建立了对这个期望人数的理论界定。

这个结论的直观解释是，如果在当前更新的过程中，期望人数的数值估计能够达到一个稳定的数值状态，那么就有可能稳定到这里，不公平放大的情况就不会发生；而如果没有达到这个稳定的数值状态，那么不公平放大的情况就一定会发生。也就是说，在 ERM 优化的情况下，群体的大小有可能会发生改变，从而导致人群的流失。

在这个理论结果的基础上，作者们提出了 DRO。DRO 的核心想法就是要改变在优化过程中，可能因为数据分配不均衡，而没有对当前小群体进行足够的采样。

具体来说，DRO 对当前群体中损失高的人群以更高的权重，也就是说更加重视当前目标函数表现不佳的区域。对于每一个数据点而言，损失高的群体所对应的群体概率会被放大，从而强调这个群体当前的损失状态。换句话说，DRO 优先考虑那些在当前情况下损失比较大的小群体。这样的设置就能够实现对最差情况的优化从而避免不公平放大。

作者们在文章中展示了 DRO 所对应的目标函数可以在递归下降的框架下进行优化，也就是说任何当前利用 ERM 的算法，都有机会更改为 DRO 的优化流程，从而避免不公平放大的情况。

论文的实验结果

作者们在一个模拟的和一个真实的数据集上进行了实验。我们这里简单讲一讲真实数据的实验情况。

作者们研究了一个“自动完成”（Auto Completion）的任务。这个任务是给定当前的词，来预测下一个词出现的可能性。而数据则来自两个不同人群，美国白人和黑人所产生的推特信息。在这个实验中，作者们就是想模拟这两个人群的留存度和模型损失。这里面的隐含假设是，美国白人和黑人的英语词汇和表达方式是不太一样的。如果把两个人群混合在一起进行优化，很有可能无法照顾到黑人的用户体验从而留不住黑人用户。

在实验之后，DRO 相比于 ERM 更能让黑人用户满意，并且黑人用户的留存度也相对比较高。从这个实验中，DRO 得到了验证，的确能够起到照顾少数人群的作用。

小结

今天我为你讲了今年 ICML 的最佳论文提名。

一起来回顾下要点：第一，这篇论文也讨论了算法带来的“公平性”问题，是从机器学习目标函数优化的角度来考虑这个问题的；第二，这篇论文的一个重要贡献是发现 ERM 确实存在不公平的放大性，基于此，作者们开发了一种新的算法框架 DRO；第三，文章的实验结果验证了 DRO 的思路，确实能够解决小众群体的不公平性问题。

最后，给你留一个思考题，这两期内容我们从不同的角度讨论了算法的公平性问题，你是否有自己的角度来思考这个问题？

欢迎你给我留言，和我一起讨论。

134 | ACL 2018论文精读：问答系统场景下，如何提出好问题？

今年 7 月 15 日~20 日，计算语言学协会年会 ACL 2018（56th Annual Meeting of the Association for Computational Linguistics），在澳大利亚的墨尔本举行，这是自然语言处理和计算语言学领域的顶级会议。

计算语言学协会（ACL）最早成立于 1962 年，每年都赞助举行各种学术交流和研讨大会。ACL 大会是 ACL 的旗舰会议，可以说这个会议是了解自然语言处理每年发展情况的重量级场所。

会议今年收到了 1018 篇长论文和 526 篇短论文的投稿。最终，大会接收了 256 篇长论文以及 125 篇短论文，综合录用率达到 24.7%。

今天，我们来看这次会议的一篇最佳论文，题目是《学习提出好问题：使用完美信息的神经期望价值对澄清问题进行排序》（Learning to Ask Good Questions: Ranking Clarification Questions using Neural Expected Value of Perfect Information）。

首先给你简单介绍下论文的作者。

第一作者萨德哈·饶（Sudha Rao）来自马里兰大学学院市分校（University of Maryland, College Park），是计算机系的博士生。她已经在 ACL，EMNLP、NAACL 等自然语言处理大会上发表了多篇论文，并且在微软研究院实习过。

第二作者是饶的导师哈尔·道姆三世（Hal Daume III），是马里兰大学学院市分校计算机系的一名教授，目前也在纽约的微软研究院工作。他是机器学习和自然语言处理领域的专家，在诸多领域都发表过不少研究成果，论文引用数达到 9 千多次。

论文的主要贡献

这篇论文关注的是“问答系统”（Question & Answering）。问答系统不仅在实用领域受到大量用户的青睐，产生了诸如 Quora、知乎、Stack Overflow 等知名的在线问答服务，也在人工智能系统开发领域受到研究者的关注。

我们曾经提到过“图灵测试”，用来衡量一个系统或者说是一个机器人是否具有真正的人工智能，这个测试其实就是建立在人机问答的交互场景下的。因此，建立有效的问答系统一直是人工智能研究，特别是自然语言处理研究的核心课题之一。

这篇论文的作者们认为，在问答系统的场景中，一个非常重要的手段是针对已经提出的问题进行“澄清式”（Clarification）提问，从而能够引导其他回答者更加有效地进行回答。也就是说，作者们研究的主题是，如何找到这些具有桥梁作用的“澄清式问题”，这是这篇论文的第一个重要贡献。

论文的第二个主要贡献是利用了“决策论”（Decision Theoretic）框架下的EVPI（Expected Value of Perfect Information，完美信息的期望价值），来衡量一个澄清式问题会对原始的问题增加多少有用的信息。简而言之，EVPI 就是这篇论文提出来的一个衡量有用信息的测度（Measure）。

论文的第三个贡献是通过 Stack Exchange 平台（Stack Overflow 是其一个子站点），构造了一个 7 万 7 千条含有澄清式问题的数据集。作者们从这个数据集中选取了 500 个样本进行了实验，并且发现，提出的模型要明显好于一些之前在问题系统中的类似算法。

论文的核心方法

既然这篇论文的一个核心贡献是提出了“澄清式提问”这么一个新的概念，用于帮助问答系统的开发。那么，究竟什么是“澄清式提问”呢？

实际上在这篇文章里，作者们并没有对“澄清式提问”给出一个清晰的定义，而是仅仅提供了一个实例来解释什么是“澄清式提问”。

例如，一个用户在 Ask Ubuntu 这个子论坛里，询问在安装 APE 程序包时遇到的问题。这个时候，如果我们需要问“澄清式问题”，究竟什么样的问题可以激发其他人或者提出澄清式问题的人来进一步解答原始的问题呢？

我们看下面几个从不同角度提出的问题：可以问这个用户使用的 Ubuntu 系统具体的版本号；也可以问用户的 WiFi 网卡信息，还可以问用户是不是在 X86 体系下运行 Ubuntu。

那么，在这一个场景下，后两个问题要么无法为原始的问题提供更多有价值的信息，要么就是彻底的不相关，而第一个问题关于具体的版本号，很明显是用户可以提供的，并且可以帮助回答问题的人来缩小问题的范围。

这也带出了这篇论文的第二个贡献点，如何衡量一个帖子的价值呢？

要回答这个问题，我们需要知道这里有两种帖子是模型需要处理的。第一种帖子集合是候选的澄清式问题集合。第二种帖子集合是候选的最终回答集合。我们最终的目的是得到最佳的最终回答。这里面起到“搭桥”作用的就是澄清式问题。

所以，作者们就构造了一个针对每一个最终问题的 EVPI 值，用于衡量这个问题的“期望价值”。为什么是期望价值呢？因为这里面有一个不确定的因素，那就是根据不同的澄清式问题，可能会产生不同的回答。因此，作者们在这里使用了概率化的表达。

也就是说，EVPI 的核心其实就是计算给定当前的原始问题以及某一个澄清式回答的情况下，某一个最终回答的概率，乘以这个回答所带来的“收益”。当我们针对候选最终回答集合中所有的回答都进行了计算以后，然后求平均，就得到了我们针对某一个澄清式回答的 EVPI。换句话说，某一个澄清式回答的 EVPI 就是其所能产生的所有可能的最终回答的加权平均收益。

从上面这个定义中，我们有两点不确定。第一，我们并不知道给定当前的原始问题以及某一个澄清式回答的情况下，某一个最终回答的条件概率；第二，我们并不知道问题的收益。因此，作者们利用了两个神经网络模型来对这两个未知量进行联合学习（Joint Learning）。这可以算是本文在建模上的一个创新之处。

具体来说，首先，作者们利用LSTM来针对原始问题、候选澄清问题、以及最后解答产生相应的表达向量。然后，原始问题和某一个候选澄清问题的表达向量，通过一个神经网络产生一个综合的表达。最后，作者们定义了一个目标函数来针对这些初始的表达向量进行优化。

这个目标是需要我们学习到的答案的表达靠近初始得到的答案的表达，同时，也要靠近最终答案的表达，如果这个最终答案所对应的问题也靠近原来的问题。换句话说，如果两个问题的表达相近，答案的表达也需要相近。

那什么样的问题是相近的问题呢？作者们利用了 Lucene 这个信息检索工具，根据一个原始的问题寻找相近的问题。这里，作者们并没有真实的标签信息，所以利用了一些方法来标注数据，从而能够让模型知道两个问题是否相关。

论文的实验结果

作者们利用了 Stack Exchange 来构建一个分析澄清式问题的数据集。具体的思路是，如果原始问题曾经被作者修改过，那么后面的某一个帖子中所提出的问题就会被当作是澄清式问题，而原始问题就被当作是因为澄清式问题而得以改进的帖子。很明显，这是一个非常粗略的数据收集条件。当原始问题被作者修改过以后，并且最后因为这个修改得到回复，就被认为是一个最终的答案。经过这么一番构建，作者们整理了 7 万 7 千多条帖子。

作者们利用论文提出的方式和其他的经典模型进行比较。最后的结论是，提出的模型能够更好地找到最佳的澄清式问题，效果要好于仅仅是简单利用神经网络，来匹配原始问题和相应的澄清式问题。

小结

今天我为你讲了 ACL 2018 的一篇最佳论文。

一起来回顾下要点：第一，这篇论文提出了“澄清式提问”这个概念，来帮助问答系统的开发；第二，文章提出了一系列方法，对澄清式问题进行描述和衡量；第三，文章构建了一个数据集，通过实验论证了所提出方法的有效性。

最后，给你留一个思考题，通过这篇文章关于澄清式问题的介绍，你能否给澄清式问题下一个定义呢？

欢迎你给我留言，和我一起讨论。

135 | ACL 2018论文精读：什么是对话中的前提触发？如何检测？

今天，我来和你分享 ACL 2018 的第二篇最佳论文，题目是《让我们“再”次做到：检测副词前提触发词的第一种计算方法》（Let’s do it “again”: A First Computational Approach to Detecting Adverbial Presupposition Triggers）。

这篇论文的作者都来自加拿大麦吉尔大学（McGill University）的计算机系。前三位学生作者是这篇论文的共同第一作者，对论文的贡献相同。他们的导师张智杰（Jackie Chi Kit Cheung）助理教授是这篇论文的最后一个作者。张智杰于 2014 年从多伦多大学博士毕业，之前曾两次在微软研究院实习过，他长期从事自然语言处理的研究。

论文的主要贡献

这篇论文的背景要从“语用学”（Pragmatics）说起。语用学是语言学的一个分支学科，与符号学理论相互交叉、渗透，研究语境对语言含义产生的影响和贡献。语用学包括言语行为理论、对话内涵义、交流中的对话，以及从哲学、社会学、语言学以及人类学等角度解析人类语言行为的研究。

语用学分析研究语言行为（如招呼、回答、劝说）的文化准绳和发言规则。不同的文化之间皆有约定俗成、客套的对话，在跨文化交流中，为了避免因为语言规范的差异而在交谈之中产生误解，社会语言学的知识与务实能力是语言学习者所不能忽视的。

在语用学中，“前提”（Presuppositions）是交谈的参与者共同约定的假设和认知，而且在谈话中被广泛使用。同时，在这篇论文中，作者们把提示“前提”的“表达”（Expression）定义为“前提触发”（Presupposition Triggers），包括一些动词、副词和其他短语。为了更加清晰地说明这些概念，作者们举了这么一个例子。

假设我们现在有两句话：

约翰再次要去那家餐厅（John is going to the restaurant again）。

约翰已经去过了那家餐厅（John has been to the restaurant）。

第一句话要能够成立必须要建立在第二句话的基础上。特别是“前提触发”词“再”（Again）的使用，是建立在第二句话真实的情况下。换句话说，第一句话必须在第二句话的上下文中才能够被理解。值得一提的是，即便我们对第一句话进行否定，“约翰不打算再去那家餐厅了”（John is not going to the restaurant again），依然需要第二句话的支持。也就是说，“前提触发”词在这里并不受到否定的影响。

这篇论文的核心贡献就是对以副词为主的前提触发词进行检测。这里面包括“再”（Again）、“也”（Also）和“还”（Still）等。再此之前，还没有对这方面词汇进行检测的学术研究工作。能够对这类前提触发词进行检测，可以应用到文本的归纳总结（Summarization）和对话系统等场景中。

为了更好地研究这个任务，作者们还基于著名的自然语言处理数据 Penn Treebank 和 English Gigaword，建立了两个新的数据集从而能够进行触发词的分类检测工作。最后，作者们设计了一个基于“关注”（Attention）机制的时间递归神经网络（RNN）模型来针对前提触发词进行检测，达到了很好的效果。

论文的核心方法

现在，我们来讨论这篇论文的一些细节。

首先，我们来看看数据集是如何生成的。数据中的每一个数据点都是一个三元组，分别是标签信息（正例还是负例），文本的单词，文本单词所对应的“词类标签”或简称为 POS 标签（例如动词、名词）。

数据点正例就表明当前数据包含前提触发词，反之则是负例。另外，因为我们需要检测的是副词性的前提触发词，因此我们还需要知道这个词所依靠的动词。作者们把这个词叫作副词的“管理词”（Governor）。

作者们首先针对文档扫描，看是否含有前提触发词。当发现有前提触发词的时候，提取这个触发词的管理词，然后提取管理词前 50 个单词，以及管理词后面到句子结束的所有的单词。这就组成了正例中的单词。当找到了所有的正例之后，作者们利用管理词来构建负例。也就是说，在文本中寻找哪些句子含有一样的管理词，但并不包括后面的前提触发词，这样的句子就是负例。

下面，我们来看一下作者们提出模型的一些构成。从大的角度来说，为了识别前提触发词，作者们考虑了一个双向 LSTM的基本模型架构，在此之上有一个“关注机制”，在不同的情况下来选择 LSTM 的中间状态。

具体来说，整个模型的输入有两部分内容。

第一部分，是文本的单词进行了词向量（Embedding）的转换。我们已经反复看到了，这是在自然语言处理场景中利用深度学习模型必不可少的步骤。这样做的好处就是把离散数据转换成了连续的向量数据。

第二部分，是输入这些单词相对应的 POS 标签。和单词不一样的是，POS 标签依然采用了离散的特性表达。

然后，连续的词向量和离散 POS 标签表达合并在一起，成了双向 LSTM 的输入。这里，利用双向 LSTM 的目的是让模型针对输入信息的顺序进行建模。跟我们刚才提到的例子一样，前提触发词和其所依靠的动词，在一个句子的段落中很明显是和前后的其他单词有关联的。因此，双向 LSTM 就能够达到对这个结构进行记忆的目的，并且提取出有用的中间变量信息。

下面需要做的就是从中间变量信息到最终的分类结果的变换。这里，作者们提出了一个叫“加权池化网络”（Weighted Pooling Network）的概念，并且和“关注”机制一起来进行这一步的中间转换。

可以说，作者们这一步其实是借助了计算机视觉中的经常使用的卷积神经网络 CNN 中的池化操作来对文档进行处理。具体来说，作者们把所有 LSTM 产生的中间状态堆积成一个矩阵，然后利用同一个矩阵乘以其自身的转置就得到了一个类似于相关矩阵的新矩阵。可以说，这个新矩阵是完全抓住了当前句子通过 LSTM 中间变量转换后所有中间状态的两两关系。

然后，作者们认为最后的分类结构就是从这个矩阵中抽取信息而得到的。至于怎么抽取，那就需要不同的权重。这种根据不同的情况来设置权重的机制就叫作“关注”机制。经过矩阵中信息的抽取，然后再经过全联通层，最终就形成了标准的分类输出。

论文的实验结果

作者们在我们上面提到的两个新数据集上进行了实验，并且和一系列的方法进行了比较。其他的方法包括简单的对数几率回归方法（Logistic Regression），简化了的但是依然利用了双向 LSTM 结构的模型，还有一个利用 CNN 来进行提取信息的模型。

在两个数据集上，论文提出的方法比对数几率回归以及 CNN 的方法都要好 10%～20% 左右。和简化的 LSTM 模型相比，优势并没有那么大，但依然有统计意义上的好效果。

小结

今天我为你讲了 ACL 2018 的另外一篇最佳论文。

一起来回顾下要点：第一，这篇论文的背景是语用学，核心贡献是对以副词为主的前提触发词进行检测；第二，论文的核心方法是提出一个双向 LSTM 的基本模型架构，并利用“关注机制”，根据不同的情况来设置权重；第三，论文构建了两个数据集，取得了较好的实验结果。

最后，给你留一个思考题，这篇论文使用了双向 LSTM 的架构，能不能使用单向 LSTM 呢？

欢迎你给我留言，和我一起讨论。

136 | ACL 2018论文精读：什么是“端到端”的语义哈希？

今天，我们来看今年 ACL 大会的一篇最佳论文提名，题目是《NASH：面向生成语义哈希的端到端神经架构》（NASH: Toward End-to-End Neural Architecture for Generative Semantic Hashing）。

先来简单介绍下论文的作者群，我着重介绍三位。

第一作者沈丁涵（Dinghan Shen 音译）是杜克大学计算机科学系的博士生。他已经发表了多篇自然语言处理和机器学习相关的论文，并且在 NEC 实验室和微软研究院都实习过。

论文的共同第一作者苏勤亮（Qinliang Su 音译），目前是中山大学数据科学与计算机学院的副教授。他在香港大学取得博士学位，之后曾在杜克大学从事博士后研究工作。

作者中的劳伦斯·卡林（Lawrence Carin）是杜克大学教授。卡林是机器学习的权威，也是沈丁涵的导师。

论文的主要贡献

在很多的应用中，我们都需要根据一个已有的文档表达和一个文档库，找到最相近的，或者说最类似的文档。这经常被叫作“相似查找”（Similarity Search）或者“最近邻查找”（Nearest-Neighbor Search），在推荐系统、信息检索、图片检索等领域都有非常广泛的应用。

“语义哈希”（Semantic Hashing）被认为是解决“相似查找”的一个重要并且行之有效的方法。简单来说，“语义哈希”要做的就是把文档表达为离散的，也就是二元的向量。这些向量保留了文档在原始空间中的相似关系。因此常常被认为是带有语义的哈希过程，这也就是“语义哈希”这个名字的来历。

当我们把文档转换为语义哈希空间之后，文档之间相似度的计算就变成了利用“汉明距离”（Hamming Distance）来计算离散向量之间的距离。在当下的计算机体系架构中，上百万文档之间的“汉明距离”都可以在几个毫秒间完成计算。因此，我们可以看到，“语义哈希”的一个优势就是计算快捷，并且保持了原始空间的语义信息。

那么，看似这么有优势的“语义哈希”有没有什么劣势呢？

虽然已经有相当多的研究针对文字数据产生哈希，但是这些现有的方法都有一些明显的问题，其中最紧要的一个问题就是这些方法大多都需要两个阶段。

具体是哪些方法呢？我把这些方法归纳为两种思路。

第一种思路，我们首先需要在无监督的条件下学习文档的二元哈希；然后，我们需要训练 L 个二元分类器来预测 L 个二元位的哈希值，这个步骤是监督学习过程。

第二种思路，我们首先针对文档学习连续的表达向量，然后在测试阶段再把连续值进行二元离散化。

很明显，不管是哪一种思路，这种两个步骤的方法都不可避免地会仅仅得到次优的结果。这是因为两个步骤的优化流程是脱节的。而且，在从连续的表达向量到二元离散化的过程中，往往利用的是经验法则（Heuristic），因此语义信息可能被丢失。

基于这些问题，这篇论文提出了“端到端”（End-to-End）的“语义哈希”训练过程。作者们认为，经过一个阶段就可以得到完整哈希值的研究工作，这篇文章是第一个。在此之上，作者们利用了最新的NVI 框架（Neural Variational Inference，神经化的变分推断），来学习文档的二元编码，在无监督和监督环境下都取得了不错的结果。

这篇论文的另一个贡献就是在提出的方法和“比率损失理论”（Rate Distortion Theory）之间建立了联系。在这个联系的基础上，作者们展示了如何在模型的训练过程中“注入”（Inject）“数据相关的噪音”（Data-Dependent Noise）来达到更好的效果。

论文的核心方法

作者们首先把从文档生成“语义哈希”看作是一种编码（Encode）和解码（Decode）的流程。文档的二元哈希向量则被看成了表达文档的一种隐变量（Latent Variable）。也就是说，作者们认为文档的哈希向量是从文档的特性（可以是 TF-IDF 值）产生的一组隐变量，这也被认为是一种编码的过程，是从文档的特性向量到哈希向量的编码。

在过去的模型中，编码过程是被反复关注的，但是解码过程则很少有模型去直接建模。所谓的解码过程就是从已经产生的哈希向量转换成为文档的特性向量的过程。也就是说，我们希望能够重新从哈希向量中生成原始的数据。

对原始数据和中间隐变量的编码过程统一进行建模，是当前神经网络生成式模型的一种标准方法。在这里，编码和解码都各自有不同的神经网络，用于表达相应的条件概率分布。

具体来说，数据的原始信息 X 首先经过一个多层感知网，然后再变换成为二元的中间变量 Z。这时候，Z 其实就是我们需要得到的哈希向量了。只不过在提出的模型中，还有第二个部分，那就是从 Z 得到 X 的一个重现，也就是我们刚才提到的利用哈希来重构数据。很明显，我们希望重构的 X 和原始的 X 之间要非常相似，也就是说距离最小。

作者们发现，从数据中学习一个二元编码是“信息论”（Information Theory）中典型的“有损源编码”（Lossy Source Coding）问题。因此，“语义哈希”其实也可以被看作是一个“比率损失平衡”（Rate Distortion Tradeoff）问题。

什么意思呢？就是说，我们希望用较少的比率来对信息进行编码，同时又希望从编码中重构的数据能够和原始的数据尽量相近。很明显，这两者有一点“鱼与熊掌不可兼得”的意思，也就是这两者需要一个平衡才能达到最优。

把重写模型的目标函数定为“比率损失平衡”，通过这种形式，作者们意识到模型中的从编码到重构数据的条件分布，也就是一个高斯分布中的方差值，其实控制了这个平衡的关系。那么，就需要针对不同的文档对这个方差值进行调整，从而达到最优的编码效果，同时又是比率损失平衡的。作者们并没有采用去优化这个方差值的办法，而是在一个固定的方差值周围加入一些随机噪声，从而在实际实验中收到了不错的效果。

论文的实验结果

作者们利用了三个数据集进行实验，所有的数据集都首先转换成为 TF-IDF 的形式。作者们把提出的方法和其他的五种基本方法进行了比较。

从总体上来说，文章提出的方法在没有随机噪声的情况下，已经比其他五种方法要好得多。加入随机噪声之后，模型就有了更好的表现力。同时，作者还展示了学到的二元哈希值的确能够保持语义信息，相同文本类别的文档，它们的哈希值非常类似，也就是我们之间说过的，他们之间的汉明距离很近。

小结

今天我为你讲了今年 ACL 的一篇最佳论文提名，至此，我们关于 ACL 2018 的分享就告一段落。

一起来回顾下要点：第一，这篇文章针对语义哈希产生过程的劣势，提出了“端到端”的语义哈希训练过程；第二，论文的核心方法是把文档生成语义哈希看作是一种编码和解码的流程，进一步发现“语义哈希”其实也可以被看作是一个“比率损失平衡”问题；第三，论文取得了不错的实验效果。

最后，给你留一个思考题，在现实中利用语义哈希，有没有什么障碍？比如要在推荐系统中做语义哈希，最大的挑战会是什么？

欢迎你给我留言，和我一起讨论。

复盘 7 | 一起来读人工智能国际顶级会议论文

今天我准备了 30 张知识卡，和你一起来复盘“人工智能国际顶级会议”模块。在这个模块里，我总共介绍了 10 个顶级会议，包括机器学习方面的 ICML、NIPS；机器视觉的 CVPR、ICCV；自然语言处理的 ACL、EMNLP；数据挖掘和数据科学的 KDD、WSDM；信息检索和搜索的 SIGIR；互联网综合的 WWW。

提示：点击知识卡跳转到你最想看的那篇文章，温故而知新。

KDD 2017（数据挖掘与知识发现大会）论文精讲

EMNLP 2017（自然语言处理实证方法会议）论文精讲

ICCV 2017（国际计算机视觉大会）论文精讲

NIPS 2017（神经信息处理系统大会）论文精讲

WSDM 2018（网络搜索与数据挖掘国际会议）论文精讲

The Web 2018（国际万维网大会）论文精讲

CVPR 2018（国际计算机视觉与模式识别会议）论文精讲

SIGIR 2018（国际信息检索大会）论文精讲

ICML 2018（国际机器学习大会）论文精讲

ACL 2018（计算语言学学会年会）论文精讲

积跬步以至千里

学习是独立的，需要你一个人去完成。但学习者从来都不必孤独，我们走进这些国际顶级学术会议的论文，其实就是和每一篇论文背后的作者进行一场对话。与优秀的人同行一定能让我们走得更快。

这个模块我根据自己的经验，为你选择了 10 个顶级会议。针对每一个会议，我都会在会议结束后用 3 篇文章来详细剖析这个会议的精髓和一些前沿信息。我希望通过我的眼睛和思考让你看到在这个领域里那些激动人心的发展，收获新知、拓展视野，同时也把我的学习方法分享给你。

我想你应该已经掌握了我分析论文的套路了，对于每一篇文章，我一定会先去做一些背景研究，了解作者群，了解对应的学术机构或者公司信息；然后弄清楚论文解决了什么问题，核心贡献是什么；再详细研究论文的具体方法。这个方法很简单，就是牢牢抓住一个主线，找到最核心的内容来消化吸收。但是真正让这个方法内化成你的思维模式，还是需要大量的阅读和练习。相信我，如果想在人工智能领域继续深耕，阅读大量论文，一定是一个最值得做的投资，因为回报极大。

那回到阅读论文本身，最后想跟你分享的一点只有八个字：学好英语，阅读原文。我知道你可能会说我英语还真不好，但是到达能够阅读原文的水平其实也并没那么难。你不妨直接找一篇我们专栏里讲过的论文原文，就把每一段的第一句读一下，看看能否学到东西。先开始看起来，遇到不会的且影响你理解的单词或句子再去查，你的英语水平就已经开始变得越来越好了。

以上就是我们对论文精读这个模块的一个复盘，希望专栏里的这三十篇论文是一个起点，能够帮助你养成关注国际顶级会议、阅读论文的习惯，拥有这一强大的学习利器，提升自己的学习效率。

最后，关于这一模块，关于国际会议，或者是在论文阅读方面，你还有什么问题和想法，欢迎你留言和我讨论。

014 | 精读AlphaGo Zero论文

长期以来，利用人工智能技术挑战人类的一些富有智慧的项目，例如象棋、围棋、对话等等都被看做人工智能技术前进的重要参照。人工智能技术到底是不是能够带来“拟人”的思维和决策能力，在某种意义上成了衡量人工智能水平以及整个行业发展的试金石。

在这些项目中，围棋可以说是一个难度很大的项目，更是饱受关注。一方面，围棋的走棋可能性非常多，且棋局变化多端，这似乎给计算机算法带来了很大的困难。另一方面，围棋在一些国家和地区（比如中国、日本和韩国）不仅仅是一个智力竞技项目，更有一系列理念、人格等全方位的配套文化概念，使得人们对此产生怀疑，人工智能模型和算法是否能够真正学习到有价值的信息，而不仅仅是模拟人的行为。

2015 年，来自谷歌 DeepMind 团队的 AlphaGo 打败了职业二段樊麾，在这之后短短两年的时间里，该团队的人工智能技术迅猛发展，不仅以 4 比 1 击败韩国的李世石九段，更是在今年战胜了即时世界排名第一的柯杰，可谓战胜了被誉为“人类智慧皇冠”的围棋项目。

前段时间，DeepMind 团队在《自然》杂志上发表了 AlphaGo 的最新研究成果，AlphaGo Zero，这项技术更是把人工智能在围棋上的应用推向了一个新高度，可以说是利用计算机算法把围棋的棋艺发展到了一个人类之前无法想象的阶段。

今天，我就来带你认真剖析一下这篇发表在《自然》杂志上的名为《不依靠人类知识掌握围棋》（Mastering the Game of Go without Human Knowledge）的论文 。标题中的不依靠人类知识当然有一点夸张，不过这也正是这篇论文的核心思想，那就是仅用少量甚至不用人类的数据来驱动人工智能算法。在之前的很多人工智能模型和算法来看，这是一个巨大的挑战。

作者群信息介绍

文章共有 17 位作者，都来自伦敦的谷歌 DeepMind 团队。AlphaGo 的第一篇论文也是发表在《自然》杂志，当时有 20 位作者，比较起来，这篇论文的作者数目减少了。另外，虽然两篇论文的主要作者都是三名（共同贡献），但是这三个人发生了一些变化。下面，我就介绍一下本文的三个主要作者。

第一作者大卫·希尔维（David Silver）目前在 DeepMind 领导强化学习（Reinforcement Learning）的多项研究。大卫的经历很传奇，早年曾在南非生活和学习，1997 年从剑桥大学毕业后，先到一家名为 Elixir Studios 的游戏公司工作了好几年。然后到加拿大的阿尔伯塔大学（University of Alberta）学习机器学习，特别是强化学习。他当时就开始尝试开发用计算机算法来进行围棋博弈。大卫 2013 年全职加入 DeepMind，之后迅速成了 DeepMind 在强化学习，特别是深度学习和强化学习结合领域的领军人物。

第二作者朱利安·施瑞特维泽（Julian Schrittwieser）是谷歌的一名工程师，他长期对围棋、人工智能感兴趣。值得注意的是，朱利安这次成为主要作者，而在之前的第一篇文章中还只是普通贡献者，可以推断在 AlphaGo Zero 这个版本里有相当多的工程优化。

第三作者卡伦·西蒙彦（Karen Simonyan）是 DeepMind 的一名科学家，长期从事计算机视觉和人工智能技术的研究。他来自 2014 年 DeepMind 收购的一家名为 Vision Factory 的人工智能公司。卡伦最近几年的论文都有高达几千的引用量。

论文的主要贡献

首先，这篇论文的主要“卖点”就是较少利用、或者说没有利用传统意义上的数据驱动的棋局。第一篇论文里的 AlphaGo 以及后面的一些版本，都是主要利用人类的棋局作为重要的训练数据，采用监督学习（Supervised Learning）和强化学习结合的形式。在 AlphaGo Zero 这个版本里，人类的棋局被彻底放弃，而完全依靠了强化学习，从完全随机（Random）的情况开始，“进化”出了具有人类经验的各种走法的围棋策略，并且达到了非常高的竞技水平。可以说这是本篇论文的核心贡献。

在核心的模型方面也有不少改进，比如一个很大的改进就是把策略网络（Policy Network）和价值网络（Value Network）合并，这样就能更加有效地用简单统一的深度模型来对这两个网络进行建模。另外，整个模型的输入特征也有变化，从深度模型提取特征外加人工挑选特征，到这篇文章提出的完全依靠棋盘的图像信息来自动抓取特征，可谓是减少人工干预的一个重要步骤。

文章的另一大看点是实验结果。作者们展示了新的 AlphaGo Zero 模型能够战胜之前很多版本的模型，最令人惊奇的可能莫过于 AlphaGo Zero 在“自学”的过程中，还“悟”到了很多人类在围棋学习过程中领悟的棋局招数。

论文的核心方法

AlphaGo Zero 模型的核心起源于一个简单的深度网络模型。这个深度网络的输入是棋盘当前位置的表达（Representation）以及过去的历史信息，输出一个走子的概率以及对应的价值。这个价值是用来描述当前棋手能够赢的概率。刚才我们已经说了，这个深度网络集合了策略网络和价值网络，形成了这么一个统一的评价整个棋盘的神经网络。在具体的网络架构方面，AlphaGo Zero 采用了计算机视觉领域最近流行的残差架构（ResNet），可以说也是这个方法的一个小创新。

有了这个基本的神经网络之后，作者们就需要和强化学习结合起来。具体来说，在每一个位置的时候，算法都会去执行一个蒙特卡罗树搜索（Monte Carlo Tree Search），对当前的神经网络模型输出的走子策略进行一个修正，或者可以认为是“加强”。这个蒙特卡罗树搜索的输出结果依然是走子的概率，但是这个概率往往比之前单从神经网络得到的要强。然后，更新神经网络的参数，使得参数尽可能地接近蒙特卡罗树搜索的结果。

那么，什么是蒙特卡罗树搜索？简单来说，就是我们从当前的棋盘情况出发，对整个棋盘产生的所有可能性进行有限制情况的搜索，也就是说，不是“穷举法”。大体说来，从某一个可能性走到下一个可能性主要是依靠下一个可能性发生的概率，以及通过神经网络来判断是否能赢的可能性。

整个算法最开始的时候是从随机的位置初始化，然后通过对神经网络的更新，以及每一个迭代通过利用蒙特卡罗树进行搜索，从而找到更加合适的神经网络模型的参数，整个算法非常简单明了。不管是结构上还是复杂度上都比之前的版本要简洁不少。文章反复强调公布的算法可以在单机上运行（基于 Google Cloud 的 4 TPU 机器），相比于最早的 AlphaGo 需要使用 176 个 GPU，也可以看到整个模型的进化效果。

方法的实验效果

AlphaGo Zero 的实验效果是惊人的。从模拟中看，大约 20 小时后，这个版本的模型就能够打败依靠数据的监督学习版本的 AlphaGo 了。而到了 40 小时后，这个版本已经可以打败挑战了李世石的 AlphaGo。也就是说，不依靠任何人类棋局，AlphaGo Zero 在不到 2 天的运算时间里，就能够达到顶级的人类水平。

除了可以打败之前的 AlphaGo 版本以外，这个版本相比于监督学习的版本，在大约 20 小时以后也可以更好地预测人类对战的走子。并且随着训练时间的推移，这种预测的准确性还在不断提升。

刚才我们也提到了，AlphaGo Zero 在自我训练的对战中，在不依靠人类数据的情况下，的确是发现了相当多的人类熟悉的对战套路。然而，有一些人类在围棋历史中较早发现的套路却没有或者较晚才在 AlphaGo Zero 的训练历史中习得。这打开了很多问题，比如发生这样情况的原因究竟是什么等等。

最后，作者们展示了 AlphaGo Zero 非常强大的实战能力，在和之前最强的 AlphaGo 版本，也就是 AlphaGo Master 的对战中，AlphaGo Zero 取得了 100 比 0 的绝对优势。而相同的 AlphaGo Master 与人对弈的成绩是 60 比 0。

小结

今天我为你讲了发表在《自然》杂志上的这篇关于 AlphaGo Zero 的论文，这篇文章介绍了一个简洁的围棋人工智能算法，结合深度学习和强化学习，不依靠人类的信息。

一起来回顾下要点：第一，关注这篇文章主要作者的信息，我们可以推断出文章的一些变化方向。第二，这篇文章有两大看点，一是很少或者几乎没有利用人类的棋局数据，二是得到了显著的实验结果。第三，文章提出的核心模型将策略网络和价值网络合并，与强化学习相结合。

最后，给你留一个思考题，有人说 AlphaGo Zero 并不是完全不依靠人类信息，比如围棋本身的规则就是很强的监督信息；再比如，不管每一步的走动如何，棋局最后是输是赢，依然是很强的信息。那么，AlphaGo Zero 到底是不是还是依赖了很强的数据呢？我们能不能把 AlphaGo Zero 看做是监督学习的产物呢？你怎么看？

欢迎你给我留言，和我一起讨论。

059 | 2017人工智能技术发展盘点

今天是大年初一，在这里先给你拜个年，祝新年新气象，新年新开始！

在今天这个辞旧迎新的日子里，我们对过去一年的人工智能技术发展做一个简单的盘点，梳理思路，温故知新。

2017 年，对于人工智能整个领域的发展，是举足轻重的一年。这一年，人工智能的各个领域都蓬勃发展，我们目睹了一些在 AI 发展史上的标志性事件。比如，从人工智能的技术上看，人工智能系统 AlphaGo Master 与人类世界实时排名第一的棋手柯洁展开围棋人机对决，最终连胜三盘；从人工智能的投入上看，很多互联网公司都先后成立单独的人工智能研发机构，像阿里巴巴的达摩院；从云服务和人工智能结合的发展来看，2017 年谷歌在这一方向发展迅猛，不仅在中国开设了研发中心，还宣布已经有超过万家企业和组织正在使用谷歌的人工智能接口。

今天我希望能够从几个关键领域和发展方向出发，在繁多的科技进步中，理清关键信息，对过去一年的产业动态和发展做出点评，给你一个清晰而简单的信息参考。

人工智能在棋牌上的迅猛发展

2017 年的一个标志性的事件，无疑是 AlphaGo 在围棋这项运动中的“收官”表现。虽然 2016 年 AlphaGo 战胜李世石之后，很多人依然对人类能够在围棋这个古老的运动中有所发挥保留着期望，也给予其他围棋选手以希望。然而，5 月 27 日，AlphaGo Master 与当时人类世界实时排名第一的棋手柯洁展开人机对决并且直接连胜三盘，可以说这个结果完全摧毁了人类在这个项目上的希望。随后，AlphaGo 团队的负责人德迈斯⋅哈萨斯（Demis Hassabis）宣布，乌镇围棋峰会将是 AlphaGo 参加的最后一场赛事，这也意味着 AlphaGo 以完美的表现“收官”。

几个月后的 10 月，DeepMind 团队在《自然》杂志上发表了一篇文章，介绍了 AlphaGo Zero，一个没有用到人类棋局数据的 AlphaGo，比以前任何击败人类的版本都要强大。通过跟自己对战，AlphaGo Zero 经过 3 天的学习，以 100:0 的成绩超越了 AlphaGo Lee 的实力，21 天后达到了 AlphaGo Master 的水平，并在 40 天内超过了所有之前的版本。这种完全不依靠人类棋局的办法，并且能够通过自我训练达到最高人类水平，可以说是让人工智能界目瞪口呆。我们在之前的分享中曾经详细介绍了这篇论文的核心内容（精读 AlphaGo Zero 论文）。

从 2016 年开始到 2017 年年底，短短一年多的时间内，AlphaGo 经历三次重大进化，并以非常完整的形式在《自然》杂志上总结最后成果，不得不让人惊叹人工智能在这一方向上发展的神速。

另外一项成就和 AlphaGo 在围棋上所取得的成就旗鼓相当，那就是来自卡内基梅隆大学团队的“利不拉图斯”（Libratus）在宾夕法尼亚州匹兹堡的“里维斯”（Rivers）赌场战胜四位德州扑克顶级选手获得最终胜利。这个胜利背后的一些原理已经被团队发表在了 NIPS 2017 的论文中，并且这篇论文也获得了 NIPS 2017 的最佳论文。我们在之前的 NIPS 2017 最佳论文推荐中也介绍了这方面的内容（精读 NIPS 2017 最佳研究论文之三：如何解决非完美信息博弈问题？）。相比于围棋来说，德州扑克这种非对称信息博弈的难度应该说更大，而卡内基梅隆大学团队的成绩在未来应该会有更大的发挥空间。

计算机视觉的发展

自从和深度学习紧密结合以来，计算机视觉在最近的 5～6 年里迅猛发展。2017 年，在像素级别的分割工作上有了一个不错的进展。通俗地讲，就是给定一个输入的图像，我们希望能够不仅分析这个图像里究竟有哪些物体，还能够对于图像中的每一个像素，知道其属于哪一个物体，也就是我们经常所说的，把物体从图像中“抠”出来。

来自 Facebook 人工智能研究院的明星团队在 ICCV 上的两篇最佳论文可以说给这个问题提供了非常漂亮的解决方案。

第一篇的重要进展是 Mask R-CNN 这篇文章中，作者们提出了“两个阶段”的策略。第一个阶段叫做“区域提交网络”（Region Proposal Network），目的是从图像中提出可能存在的候选矩形框。第二个阶段，从这些候选框中使用一个叫 RoIPool 的技术来提取特征从而进行标签分类和矩形框位置定位这两个任务。Mask R-CNN 主要是针对第二部分进行了更改。也就是说，不仅仅在第二部分输出区域的类别和框的相对位置，同时，还输出具体的像素分割。

和很多类似工作的区别是，像素分割、类别判断、位置预测是三个独立的任务，并没有互相的依赖。这是作者们认为 Mask R-CNN 能够成功的一个重要的关键。之前的一些工作，像素分割成为了类别判断的依赖，从而导致这几个任务互相有了干扰。我们在介绍 ICCV 2017 最佳论文中已经对这篇文章有了详细的论述（精读 2017 年 ICCV 最佳研究论文）。

另外一个重要工作则是“焦点损失（Focal Loss）”，这也是图像分割的一个重要进展。如果说 Mask R-CNN 是“两个阶段”的的代表作的话，焦点损失则是在“一个阶段”工作上有了显著进展。焦点损失要解决的问题，就是对输入图像进行物体识别和语义分割这两个任务。和两阶段的模型不同的是，一个阶段模型是希望直接从输入图像入手，希望能够从输入图像中提取相应的特征，从而可以直接从这些特征中判断当前的图像区域是否属于某个物体，然后也能够一次性地找到矩形框的位置用于定位这个物体。

这种思路虽然直观，但是有一个致命的问题，那就是对于一个输入图像来说，大量的区域其实并不包含目标物体，因此可以认为是学习过程中的“负例”（Negative Instance）。如何能够有效地学习这么一个“不均衡”（Imbalanced）的数据集是这一种思路需要考虑的问题。

焦点损失提出了一个新的目标函数，用于取代传统的交叉熵（Cross Entropy）的目标函数。这个新的目标函数的主要目的就是让一个阶段模型能够在正负例比例非常不协调的情况下，依然可以训练出较好的模型，使得一个阶段模型在效果上能够和两个阶段模型媲美。我们在之前的论文分享中已经详细介绍过这个工作的内容（精读 2017 年 ICCV 最佳学生论文）。

人工智能研究机构的发展

2017 年我们见证了越来越多的公司和机构设立人工智能研发团队。

10 月 11 日，在阿里云栖大会上阿里巴巴 CTO 张建锋宣布阿里巴巴成立全球研究院。达摩一成立就打算在一系列的领域做出成绩。从宣布的战略看来，达摩希望涉足量子计算、机器学习、基础算法、网络安全、视觉计算、自然语言处理、人机自然交互、芯片技术、传感器技术、嵌入式系统等，涵盖机器智能、智联网、金融科技等多个产业领域，整个布局可谓雄心壮志。

第一步的计划是在全球各地组建前沿科技研究中心，包括亚洲达摩院、美洲达摩院、欧洲达摩院，并在北京、杭州、新加坡、以色列、圣马特奥、贝尔维尤、莫斯科等地设立不同研究方向的实验室，初期计划引入 100 名顶尖科学家和研究人员。这样的布局会对阿里的中长远发展有什么帮助，我们拭目以待。

很多公司在人工智能团队的布局也可谓争先恐后。一个比较突出的代表是今日头条。互联网的新贵今日头条 2017 年扩张明显。2 月 14 日，前微软亚洲研究院常务副院长马维英离职微软，加入今日头条，出任副总裁，管理今日头条人工智能实验室。之后，任职华为诺亚方舟实验室主任的李航博士也选择离开了华为，加入今日头条人工智能实验室。如果加上之前比较知名的李磊、王长虎，今日头条的阵容可谓兵强马壮。这样的人员配置能够在今后的发展中对今日头条产生多大的影响呢？这一点还需要时间的检验。

年底，谷歌的人工智能团队在李飞飞博士和李佳博士的带领下，高调在北京开设分部，成立一个致力于人工智能的中国中心。在公开的新闻稿里，谷歌认为北京有在未来技术领域拥有发言权的野心，这种野心推动了中国政府的大力投入，让国内在人工智能领域展现出日益增长的实力。谷歌已在北京有数百名从事研发和其他工作的员工。谷歌中国人工智能中心将由李飞飞和李佳领导。李飞飞是斯坦福大学人工智能实验室的负责人，领导着谷歌云业务的人工智能部门。李佳是谷歌云业务的人工智能部门研发主管。

小结

今天我为你简单梳理了 2017 年人工智能领域发生的一些事情，希望能够帮助你去回顾这一年。人工智能的蓬勃发展，表现在每天都有太多的新技术新动态，这里我们只是以点带面，让你感受到过去这一年行业的飞速变化。

对于 2017 年人工智能领域的发展，你有怎样的感受和体验呢？

欢迎你给我留言，和我一起讨论。

104 | 如何快速学习国际顶级学术会议的内容？

我们在专栏中已经多次分享了计算机科学（特别是机器学习、数据挖掘和人工智能）领域顶级学术会议的会议论文，向你介绍了这些会议中一些最新的学术和研究成果，希望这些内容能够起到抛砖引玉的作用。

最近今年，随着机器学习和人工智能的逐渐火热，越来越多的研究人员投入到这些领域中，这些顶级会议的投稿论文数和收录稿件数都成倍增长，不少会议会有几百篇论文被收录。这就给希望学习这些论文的人，不仅是初学者，甚至是长期在这些领域工作的研究人员和实践者，都带来了不小的挑战。

现实情况下，尝试去看完一个会议的所有论文是不现实的，从某种程度上看也是不必要的。那么，怎样才能从这些会议中快速地、有效率地吸收到更多的内容呢？想要事半功倍地学习顶级学术会议的论文，究竟有没有什么方法可以帮助我们实现这个目的呢？

今天我就结合自己的经验，和你分享如何快速学习顶级会议的内容。

顶级会议的基本内容架构

在学习任何顶级会议的论文内容之前，我们其实最需要了解的就是这些会议本身有什么规律，或者说会议的内容安排上是不是遵循了一定的逻辑架构。这里，我们首先来看一看这些顶级会议在内容安排上的规律。

毫无疑问，所有顶级会议的核心内容是收录的论文。这一点，我已经反复提及了。有一个细节可能是初学者容易忽视的，那就是很多会议都对收录的论文进行了区分，用于区分出最优秀的论文和一般的论文。

这种区分一般有两种形式。第一种形式是论文在会议上的表现形式有区别。最优秀的少量论文是时长 20～30 分钟的演讲报告，而其他大量的论文是时间很短的报告，或者有的会议干脆就没有这些论文报告时间。第二种形式是这些论文在会议论文集中发表的长度有区别，这也就有了所谓长论文和短论文的区分。通常情况下，长论文是 8～11 页，而短论文则是 2～6 页不等。

除了收录的论文以外，顶级会议往往还有很多精彩的内容。你可以关注的第二个有价值的内容形式是“讲座”（Tutorial）。“讲座”的形式常常有半天的、全天的，以及超过一天由几个研究者针对某一个特定主题的集中式分享和讨论。一般来说，“讲座”往往是一些最新的热点问题，但同时有了一整套阶段性的成果，这时候，在这个领域有突出贡献的研究者，就利用“讲座”的模式把这些内容给总结出来进行分享。

第三种你可以关注的内容形式就是“研讨班”。“研讨班”是针对某一个特定的近期热门的主题，由一些学者或者工程师组织的小型会议。和“讲座”一样，“研讨班”往往也是半天到一天不等。“研讨班”被认为是小型会议，因此有时候也还会收录一些论文。然而，这些论文的数量和质量都有很大的差别。

从组织的角度来讲，“研讨班”的目的主要是吸引更多人对某个主题的关注，以及给目前针对这个主题工作的研究者们提供一个交流的场所和平台。从这个角度来讲，很多“研讨班”分享的内容可能都是“还在进行的工作”（Work In Progress）。所以，“研讨班”所关注的热点往往比“讲座”还要激进。近年来，机器学习和人工智能的热点越来越多，有的会议有多达十几个甚至二十几个“研讨班”在大会期间举行。

最后，还有一个可以关注的则是很多会议和研讨班中都有的“邀请演讲”（Invited Talk）或者叫作“主题演讲”（Keynote Talk）。如果是亲自参加这些会议或者有视频录像，那么这些演讲往往还是值得一听的。从会议组织的角度来说，这些演讲往往是邀请在本领域有重大贡献的学者或者是相关领域的权威学者。因此，通过这些演讲，我们可以了解到这些领域的重要学者都在针对什么问题进行思考，以及他们眼中这些领域的发展方向是怎样的。

上面介绍了几个顶级会议值得关注的点，需要注意的是，并非所有会议都有“研讨班”或者“讲座”。

如何精选内容

了解了这些顶级会议内容的一个基本架构以后，我们现在来聊一聊如何从这些不同形式的内容中精选出你可以学习的信息。

首先，我们来说一说论文。刚才提到了，论文可能分为长论文、短论文以及报告论文和非报告论文。那么，有一些比较粗浅的方法可以帮助你筛选。例如，针对长论文和短论文，可以首先关注长论文。对于报告论文和非报告论文，可以先关注报告论文。利用这种简单的方法，我们已经过滤掉了至少一半以上的论文数量。这里的一个基本假设是，会议安排这些论文的区分其实就是一个最基本的质量控制。

另外，很多会议把所有的论文分为不同的“组”（Track）。每一个组其实有一个主题，例如搜索、推荐、用户建模等等。这其实也是帮助你通过论文内容的类别进行区分。所以，如果你已经知道自己感兴趣的内容，那就可以直奔主题。再庞大的会议，针对某一个主题的论文数目往往也是非常有限的。

还有一种便捷的方法就是“跟踪”某一些学者。当然，这需要你对这些领域有哪些活跃的学者、有哪些权威的学者要先有一个了解。你心里有这么一个清单，那么，只关注这些你清单上的学者在这个会议上发表的论文就是一个非常简洁的方法。

举一反三，还有一些和追踪学者类似的办法，比如你可以追踪某几个研究组或者公司。当然，这也需要你对这些领域有一定的了解。

对于论文来说，另外一个精选内容就是获奖论文。虽然对于获奖论文在长期来看是不是最具有学术价值一直存在争议，但是作为快速学习和扩宽视野的方法，浏览这些获奖论文以及获奖作者的一些附带研究，可以说是了解一个领域的另外一个捷径。

说完了论文之后，我们来看一看“讲座”。其实，这里也有一个窍门，那就是如果你是一个初学者，我建议你不要一上来就去看一个会议的论文，而是从“讲座”入手。

我们前面提到过，“讲座”是学者已经总结好的最近已经形成一定系统性的研究成果。这里，“总结好”和“系统性”这两个特点非常重要。这意味着“讲座”里面的内容往往不是一篇论文的介绍，而是多篇相对于一组主题论文的总结。这一组论文以及相关主题极有可能已经形成了一个稳定的内容块，而“讲座”的目的就是希望更多人认可、学习、普及这个内容块。有很多“讲座”的内容在几年后就成为了这些领域核心经典思想的一部分。因此，学习“讲座”其实就是一个走捷径的过程。

另一方面，因为“讲座”具有总结性质，所以肯定会提供很多具体论文的文献资料，这些资料可以作为进一步学习的“指南针”。正因为这个性质，对于“讲座”内容的把握你可以做到先从概念上和大思想上对一个主题进行把握，例如看你自己能不能简单地把这个“讲座”中的核心技术、核心思想复述出来。同时，你也可以来衡量一下到底需不需要对这个“讲座”具体指引的论文进行阅读。绝大多数的时候，我们对于“讲座”的把握在这个层次其实就够了。

最后，我们来说一说“研讨班”的内容。和“讲座”不同的是，“研讨班”的内容因为其性质，往往比较杂。我们刚才也提到了，“研讨班”重在为一线的研发人员提供一个交流的平台。因此，他们的交流是第一目的。而且，“研讨班”的很多方向和主题都比较新，因此对于初学者而言，需要甄别哪些内容值得细看哪些内容可以忽略。总体说来，这里面的内容都不推荐给初学者。当然，如果你对某一个领域已经追踪了一段时间，有了一定的了解，那么“研讨班”无疑是最前沿的讨论平台之一。

小结

今天我为你梳理了如何快速学习顶级会议的内容，希望这篇文章可以帮助你在海量的会议内容中找到自己感兴趣的信息。

一起来回顾下要点：第一，我们讲了顶级会议的内容架构；第二，我们简要地介绍了如何在这些内容中进行快速筛选。

最后，给你留一个思考题，拿到一篇 10 页的长论文，究竟该如何快速阅读呢？

欢迎你给我留言，和我一起讨论。

152 | 在人工智能领域，如何快速找到学习的切入点？

到现在，我们专栏的人工智能核心技术模块就已经全部介绍完了，我们讲了推荐系统、搜索系统、广告系统、自然语言处理及文本挖掘、计算机视觉这五大模块。相信你对这些领域都有了一个最基本的认识。同时，我们还对一些前沿领域的学术会议进行了专项的讨论，和你分享了一些读论文的经验。

这个过程中，我收到了很多反馈，在人工智能领域，面对日新月异的新模型、新方法、新思路，很多人都感到非常难找到切入点来学习和提高。那么，今天我就来分享一下如何快速入门人工智能领域，帮你找到一些学习的捷径。

关注知识主干

我们已经介绍了这么多知识模块，不知道你是否注意到，在每个人工智能的子领域里，真正的知识主干其实是非常有限的。我这里说的“主干”是指构成这个子领域的重要的假设、思路和方法。如果你能够掌握这些主干的内容，那么也就能够相对容易地了解其他枝节信息了。

之所以要了解主干内容，还有一个原因。从时间这个尺度上来看，有一些技术和思想在某个时期曾经有很大的影响力，但是随着时间的变化，它们会被后来更新的技术所取代。因此，只抓主干，也会比较容易看清楚不同类型的技术的时效性。

那么，我们怎么去了解什么是知识主干呢？

对于比较成熟的子领域，或者是传统领域，我们可以依靠教科书。一说起教科书，很多人的第一反应就是枯燥。确实，教科书对于很多知识点的描述过于细节，但是从大的知识块上来讲，教科书还是能够帮助初学者尽快把握重要的知识主干，是一个非常高效的途径。

对于一些比较新的、发展迅速的领域，知识的重要结构发生了很大的变化。在这些领域，要么我们还没有成形的教科书，要么就是即便有，教科书的内容也可能是过时的。所以，比较新的领域我们往往需要借助其他的信息途径。

在这里，我给你介绍两个途径。

第一，“文献综述”（Survey）论文。这一类论文的目的就是对一个较新的，而且是快速变化的领域做一些阶段性的总结。从某种意义上来说，我们其实可以把文献综述看成是另外一种“教科书”。既然某个领域变化快速，那么针对这个领域知识的文献综述就会有很强的时效性。所以，阅读文献综述时，我们需要关注发表的时期，以确保文献的新鲜度。

第二，顶级学术会议的“讲座”（Tutorial）。我们之前在如何学习会议内容的分享中提到，讲座往往包含了一些最新的热点问题，同时针对这些问题的研究也有了一整套阶段性的成果，这时候，在这个领域有突出贡献的研究者，就利用“讲座”的模式把这些内容给总结出来进行分享。换句话说，关注这些讲座，也就相当于了解了某个领域的文献综述。

值得说明的是，关注知识的主干内容这一方法其实是可以“循环使用的”。什么意思呢？

举个例子，例如我们要了解深度学习究竟有哪些最基本的内容。在这个层次上的主干内容就有前馈神经网络、卷积神经网络和递归神经网络。那么，接下来，我们就需要大概了解这三种不同的神经网络究竟是什么，解决什么样的问题。层层递进，对于某一个神经网络，比如卷积神经网络，我们要了解的主干知识有“卷积是什么意思”，“这种结构要达到什么目的”。

总结一下，不论是学什么内容，第一个思路就是先看看它的主干知识是什么，养成这样一个思考习惯，你的学习效率就会大大提升。

关注知名学者

针对人工智能领域入门的另外一个“捷径”是关注你所喜欢领域的学者的研究动态。

在一些人工智能的子领域，经常出现这样一种局面，那就是少数学者的研究成果奠定了整个领域的重大发展。你有没有发现，这其实也就是另外一种意义上的主干内容。追踪和学习这些学者的研究成果有两个目的：一方面可以了解到最新的动态；另一方面可以让学习有的放矢，达到事半功倍的效果。

如果我们针对一个领域搜集到五个左右的学者，然后关注这些学者本人以及所在机构或者实验室的成果，那么一般情况下，你阅读了差不多 10 篇论文后，就基本能够把握住这个方向发展的大概内容。

需要注意的是，我们这里所说的知名学者，主要还是指在某一个领域有重要贡献，特别是贡献了核心思想的学者。对于这些学者，我们不能仅仅关注他们论文的数目，还是要看论文的影响力。对于绝大多数人工智能领域而言，我们可以很容易地在网上找到知名学者的名字和介绍。

补充一点，如何在一个完全陌生的领域寻找知名学者呢？寻找这类学者的一个简单的方法是先看这个领域引用度最高的前几篇论文，然后找到这些论文中经常出现的某个学者的名字，然后根据这个学者的名字稍微查询一下，看一看这个学者过去的一些论文发表经历，从而判断这个学者是不是在某个领域持续进行研究。

深入学习少量的模型

对于很多人工智能的初学者而言，各种眼花缭乱的模型往往让人会觉得不知所措。这个时候，与其一头扎入各式各样层出不穷的新模型里，还不如扎扎实实学懂吃透少数几个模型。这个思路也符合软件领域我们常说的“T 型”人才模型，广度很重要，但是没有深度的广度，很多时候就没有价值。先有了深度，广度的拓展就会更容易。

比如，从工业界的应用角度来说，我们一般需要掌握的模型就那么几个。可以说，如果你掌握了线性模型、树模型和神经网络模型，就可以解决超过 80% 甚至更多的业务需求了。那么，我们要做的就是深入细致地学习这三种模型，而不是去了解几十种甚至上百种模型，但是每一种都只是了解了一点皮毛内容而已。

那么，对于这些核心内容，多深入才算是深入学习呢？

首先，也是最基本的，我们要“理解”这些模型的最基本的原理。其次，最好能够从数学的角度来理解这些模型的数学推导。再次，还要理解这些模型的“模型本身和优化算法的区别”，以及各种优化算法的好坏。最后，我们最好能够自己动手写一写这些模型的基本实现。另外，还有很多方面能够帮助我们进行深入学习，比如这些模型会有什么特点？在什么场景下比较适用？这些问题都是非常好的参考。

小结

今天我为你梳理了快速入门人工智能领域的几个思路，希望你能在学习的过程中快速定位到有用的信息，提高自己的学习效率。但是，有一点我想推心置腹地跟你说，虽然我们今天分享的内容叫作如何快速入门，但是要想在这个领域真正获得成长，我们更需要有一颗平稳的心，要抱持着一种愿意踏踏实实学习基础的态度，这一点是非常必要的。换句话说，成长为一名有能力的数据科学家或者人工智能工程师，往往并没有太多的捷径可走。

一起来回顾下要点：第一，我们讲了抓住内容主干的思想；第二，我们简要地介绍了如何跟踪知名学者；第三，我们讨论了深入学习少量模型的好处。

最后，给你留一个思考题，你现在要学习一个新模型，是要深入了解模型的数学细节，还是仅仅知道一个大概信息就可以，你怎么做判断呢？

欢迎你给我留言，和我一起讨论。

153 | 人工智能技术选择，该从哪里获得灵感？

在上一讲的内容里，我们分享了在人工智能领域快速学习的一些方法。学习到这些人工智能技术后，我们肯定是希望能够把技术应用到工程实践中，来解决实际产品的问题。

这里面有一个非常重要的问题，就是面对这些论文、或者是别人分享的工程实践，作为初学者或者是有一些经验的工程师，我们应该如何来选择技术呢？是去实现当前最新论文介绍的技术？还是跟随其他公司已经有了的架构？

今天，我们就来聊一聊人工智能领域的工程技术选择这个话题。

如何看待学术论文和技术选择的关系

首先，我们来看一看论文和工程技术选择之间的关系。我们是不是需要去实现最新论文里的模型呢？

在回答这个问题之前，我们来聊一下学术论文本身的一些特点。

学术论文，作为科学知识和信息传播的一种载体，本身是有其内在的使命和一定的规律的。学术论文的核心功能是在一定的规范框架下，传播、总结和讨论新知识。这里面我们需要注意的是“一定的规范框架”和“新知识”。

我们先来说说新知识，这其实是整个学术论文存在的核心价值。很多新知识其实是某种意义上的学术尝试和创新，例如提出的一种新观点、一种新思想、一种新方法或者是一种新算法。这些新知识是不是能够沉淀下去成为某种主流思想，或者说是否能够在实际系统中真正发挥作用，还有待时间的检验。换句话说，新知识的知识结构还不完整，我们并不知道这些知识点后续会有什么样的发展，我们并不能简单地在学术创新和实现现实意义之间划等号。

因此，冒然利用最新的技术往往会因为技术不成熟、信息不完整而带来很多风险。举个例子，如果我们在 2009 年的时候就采用了深度学习技术，当时的很多方法，例如“事先训练”（Pre-Training）等，在后面更加成熟的技术面前都已经被遗弃了。很明显，当时的深度学习框架远远没有现在的成熟，所以就会有很大的前期工程成本。

再举个例子，在最基本的“随机梯度下降”算法上进行改进的优化算法，绝大多数都是在理论上对收敛速度的改进。而这些收敛速度基本上都取决于当数据点趋近于无穷多的时候。那么，这种改进其实并没有太大的现实意义。

我们刚才还提到学术论文都在“一定的框架范围内”，其实就是说目前计算机科学的绝大多数论文都遵循某种格式和写作要求，也可以说是某种程度的“八股论文”式的写作。这种格式虽然统一了论文发表内容的差异性，但是过分注重在某个标准数据集上的一些性能提升，就有可能发明了一些在其他数据集上完全无法推广的技术。比如，有的论文甚至把在某些标准数据集上非常小（例如小于 1%）的提升当作重要的创新。显然，这样的成果往往都无法在工程环境中复现，又何谈现实意义呢？

说了这么多学术论文的特点，我们再回到刚才最开始的话题，那就是学术论文和工程选择的关系。学术论文提供了一种思路，帮助我们开阔眼界，但是切记，我们不能把学术论文当作是金科玉律和亘古不变的真理。相反，对于每一篇学术论文，我们要带着批判的眼光，有所保留地来看待论文背后的创新点。

那学术论文中的思路是不是就完全不要去采用呢？其实也不是。当我们发现有一系列的学术论文，或者很多学术会议都在探讨某个类似的技术时，那么这个技术也许就值得我们尝试去实现一下，来做一些早期的评测，看这样的技术在自己工程环境的数据中是不是依然有效果。

如何看到工业界技术分享和技术选择的关系

除了正规的学术论文以外，在人工智能火热的今天，各类工业界的技术分享也是层出不穷，这里面的内容水平和可复制性可以说是千差万别。那么，我们到底应该如何看待这些技术分享呢？我总结了两点给你借鉴。

第一，一般来说，很多公司的技术分享其实都是只言片语或者说一个整体平台的片段。因此，如果我们直接把这些分享用于自己团队的工程实践中，往往就会产生断章取义的效果。

实际上，一个公司的技术选择和这个公司在做选择那个时间段的很多因素都有着密不可分的关系。比如，一个比较大的机器学习系统往往和公司的其他业务需求、数据基础、机器学习基础设施以及团队当时的工程水平等因素相关。某一个系统在一个时期内的形态就是这些相关因素的一个综合体现。然而，技术人员的分享内容很难涵盖所有的方方面面，使得我们容易忽略某个技术选择和公司以及团队的这种内在的紧密联系，而单纯考虑技术分享的内容。因此，尽量去理解其他公司的技术选择思路，要比只关注所分享的内容本身更重要。

第二，公司的很多技术选择并不是同行审议的结果，需要我们带着批判的眼光去看待。这一点是和学术论文相比较而言的。一般来说，一篇高水平的论文要想发表在顶级学术会议（或者期刊）上，往往都需要得到同行的审议。这种审议的重点一般会看论文是不是比较了类似方法，以及能否真正说清楚论文的创新点和贡献在哪里，这其实就是对论文质量的某种程度的把关。那么，这个同行审议的环节在公司做技术选择的过程中是不一定存在的。很多公司的技术发展路线选择都不能摆脱种种外部的和内部的限制，最后的结果并不是无懈可击或者不容置疑的。

所以，我们不太可能直接复制其他公司的技术框架，但是这些公司的技术分享对我们的好处也是显而易见的。我们一定要抱着开放的心态来学习这些分享中的精华之处，重点是能够理解各个组件之间的逻辑关系，以及一些关键技术点选择背后的推理过程和取舍过程，这种思考对于我们的提高是非常有帮助的。

小结

今天，我们从如何借鉴学术论文和工业界技术分享两个角度，一起来梳理了人工智能技术选择的思路。工程技术选择是一个综合的复杂问题，我们一方面着眼于创新技术本身，一方面着眼于自己公司、产品和团队的实际情况，以批判的眼光吸收新知识和新实践，最后做出最适合自己发展的技术选择。

最后，给你留一个思考题，在一个公司的最佳实践分享中，他们提出了一个模型 A，大幅度提高了模型 B，现在你会如何来看待这个分享呢？

欢迎你给我留言，和我一起讨论。

154 | 近在咫尺，走进人工智能研究

在前面两次的分享里，我们聊了一些在人工智能领域快速入门的捷径，以及面对不同的论文或别人分享的技术实践，我们该如何来选择技术。我们今天来看另一个话题：如何做人工智能研究。

对于初学者来说，可能很多人会觉得人工智能研究离自己比较远，在工作中一时半会儿也接触不到。但实际上，我们有必要了解做研究的一些基本原理，而且这些思路能够应用到我们的日常工作中。

对于中高阶的工程师来说，能够在研究方向更进一步，我们就可以更好地理解优秀的学术论文是怎么写成的，能够快速挖掘出论文的核心价值。同时，也可以把自己手上的工作总结成论文发表出去，真正参与到学术社区的建设当中。当然了，即便我们不以写论文为目的，用做研究的标准来要求自己平时的工作，也可以让很多工作更加严谨，这也是一种不错的进阶。

什么是人工智能研究

那到底什么是人工智能研究呢？

简单来说，只要是针对某一个问题，我们有新的方法、新的见解或是新的结果，这都是潜在的研究成果。另外一方面，如果我们发现了一个新的问题，甚至是一个新的领域，那就更具备总结出来加以发表的潜质。

你是不是已经注意到了，研究的一个核心要素就是“新”。这也是让很多初学者感到困惑的地方：我们平时的很多工作看上去都那么普通，没有什么创新的地方呀！

其实，哪怕是在人工智能技术应用非常广泛的很多领域和场景，依然有相当多的地方存在创新点，只是初学者不太容易注意到。我这里举几个例子，你可以感受一下。

例如，一个互联网网站经常使用在线测试，也就是通常所说的 A/B 测试，来判断这一个网站的新功能（或者新特性）是否好于现在的版本。一个最基本的设置就是把现在的版本当做“对照组”，然后把新的功能当做“实验组”，分别在 50% 的流量上运行这两个组别。然而，在线 A/B 测试存在一些根本上的挑战。

第一，我们举例是把整个网站流量的一半用于测试某一个组别，而有一些小的改变在 50% 的流量上可能需要 2~3 周的时间才能看出效果。而在真实情况中，拿来进行 A/B 测试的流量往往是占比更小的，因此等到能够看出一个实验的效果需要很长时间，这本身就是一个非常耗时的过程。

第二，如果我们测试的功能和收入相关，那么假设对照组或者实验组有明显的收入增加或者减少，观察到了这样的结果，但是我们无法在实验的过程中动态地调整这个预先设置好的比例。

你看，关于传统意义上 A/B 测试所面临的难题，我们这里仅仅是列举了两条，其实还有很多其他的问题。从这些问题出发，我们是不是就可以问问自己，能否找到节省 A/B 测试时间的方法呢？能否让实验达到同样的效果但是使用尽可能少的时间？能否在 A/B 测试的过程中动态调整用户或者流量的比例呢？这些问题，其实就都是研究课题。

再比如，传统的推荐系统非常适合电影推荐的场景，例如著名的 Netflix 大赛。经历了十多年的发展后，推荐系统方法重点都集中在矩阵分解这样的协同过滤的方向上。那是不是这样的方法就解决了所有的推荐问题呢？

我们试想一下，如果是电影推荐，我们作为一个用户，看了《纸牌屋 1》之后，系统就给我们推荐《纸牌屋 2》、《纸牌屋 3》以及这一个系列，虽然有一点重复，但依然是可以接受的非常相关的推荐结果。那么，如果我们在一个电商网站上购买了一款佳能相机以后，系统依然给我们推荐类似的相机，我们是不是就会觉得这样的推荐短期内意义不大了呢？

我们可以看到，推荐系统对场景有非常高的要求。对于一些特定场景的推荐，我们无法直接照搬现有的方法。这个时候，这个场景，就需要一些创新，有可能是把现有的方法进行改进和调整，也有可能是完全提出一些新的思路或新的方法。

说到这里，你是不是对人工智能研究的范围有了一个新的认识呢？按照我们在这里举例的思路，你可以观察一下自己手边的项目，这里面或许就潜藏着不少值得研究的课题，说不定你就能发现一个新的研究领域。

怎么做人工智能研究

由此可见，作为普通的工程师或者初学者，我们的工作中也有机会接触到研究课题和研究领域。那么，接下来，我们就来看一看怎么做人工智能研究。这其实是一个非常大的话题，今天我来给你提供一个简单的指南。

要做人工智能研究一般有这么几个步骤。

第一，好好总结一下在当前这个场景下，我们要解决的是什么问题，也就是针对要研究的问题进行建模归纳。回到刚才所提的电商推荐的例子，我们需要解决的问题是把类似的相机过滤掉？还是要推荐买了相机后其他的附件？还是要推荐相机的替代品？或者是要从根本上理解这样的情况是怎么产生的，消费者的心理预期是什么样的？你可以看到，即便是尝试解决同一个问题，我们也可以有好多不同的切入点。所以，最重要的第一步就是找准一个切入点。

第二，了解前人的工作，查找和学习相关文献。相信我，即便你认为找到了一个貌似完全新的问题或者领域，认真查找了相关文献之后，有很大可能你会发现其实已经有人做了一些类似的工作。甚至，你还可能发现你设想的某种方法已经有人尝试过了。

了解前人工作这个步骤，初学者或者是完全在工业界的工程师，往往容易忽略。这一步的核心，其实就是看前人在你设想的问题中是如何寻找方案的，和你设想的思路是不是完全一致。通常情况下，你会发现一定的差异性。于是，基于这些差异性，你可以提出一些“进阶性”（Incremental）的创新思路。这也就是我们常说的“站在巨人的肩膀上”。

另外，多了解前人的工作，我们不会把自己的思想和整个大的方法论孤立开来，能够更好地融入到研究的整个社群中去。

第三，选择一种测试数据集和一些“基线方法”（Baseline）来进行比较。无论是多么重要的新方法，也无论是什么样的新领域，如果我们不能通过一些标准的数据集，或者是构造一些可以值得信赖的数据集，而且和多种方法进行比较，那么这些创新也都无法通过检验。换句话说，我们提出的新方法、新思路再好，必须有一个相对的比较者，最好这个比较者是之前提出的，已经使用了的，这样，我们才能够更清楚地说明新的方法究竟好在哪里。

研究工作，特别是“了解前人工作”和“进行基线比较”这两点，是和一般的技术分享有区分的重要标志。这其实也是我们在上一次的分享中讲到的，有的技术分享其实只是描述做了一件事情，或者是描述了一个系统，我们无法真正知道这个系统的设计和整体的思路在社群中的位置，也不知道这个系统是否和类似系统进行过比较，这其实也给我们的技术选择设置了挑战。通过今天的内容，我们了解了研究工作的思路，把用研究的思路应用在工作中，会让我们平时的技术选择更加严谨。

小结

今天我为你梳理了进行人工智能研究的一些思路。通过今天的内容，你会发现，人工智能研究离我们并不遥远，很多场景都有可能发现新问题、找到新方法。另外，了解一些研究思路对我们的日常工程开发也会有所借鉴。

最后，给你留一个思考题，如何来衡量我们自己做研究的价值？

欢迎你给我留言，和我一起讨论。

内参特刊 | 和你聊聊每个人都关心的人工智能热点话题

受极客邦科技邀请，1 月份我回国参加 AICon，1 月 13 日晚做了一场直播，直播的主题是“人工智能 20 问”，编辑们收集整理了一些大家感兴趣的有关人工智能的话题，我在直播中分享了我自己这些年来的一些经验和心得。这场直播的文字精简版已经发布在 InfoQ 的公众号上，今天我也和你在专栏里分享，希望其中的某些话题能够对你有所启发，也欢迎你留言和我讨论。

暖场篇

Q：您本硕博学的都是计算机科学专业，这个专业其实有很多方向，您为什么会选择人工智能这样一个比较新的领域？

A：我到美国读博的时候，开始并没有想去学习人工智能，而是想做一些操作系统及软件的研发。到了美国以后，我的导师认为社交媒体的数据挖掘、机器学习应用比较前沿，希望有一个相关课题，当时把新的课题给了我。我从这个课题入手，接触了机器学习，接触了人工智能，然后慢慢地走上了人工智能的发展方向。

Q：您怎么定义人工智能？

A：我认为人工智能有两个方面非常重要。一是人工智能是数据驱动的，也就是说一个人工智能产品一定得是有数据支撑的；另一方面人工智能是一个持续的决策过程，比如说 AlphaGo、无人驾驶等，都是利用机器学习，以及其他算法进行持续决策的一个过程。在人工智能这个定义中，数据驱动和持续决策应该说是非常重要的两个元素。

落地篇

Q：您能不能详细介绍一下目前在 Etsy 有哪些人工智能的技术是实实在在落地了的？落地的场景是什么？取得了什么样的效果？

A：Etsy 人工智能应用主要是围绕三块在做。

第一块是搜索。其实这也是普通电商的一个场景，你来到电商平台输入一个关键字，Etsy 返回一个搜索的结果，这个看上去很简单，好像跟传统的搜索没有什么区别。但实际上电商的搜索，不管是大一点的电商，如亚马逊、京东、阿里，还是小一点的电商，真正能够做到比较完美的搜索体验是非常困难的。比如一部分用户的购买欲望很强烈，那么我们如何能够帮助他找到最合适的商品；也有一部分用户，并没有特别强的购买意愿，这个时候他希望通过搜索一些关键字来获取灵感，从你的平台上能得到一种逛街的体验，所以这个时候，搜索带来的东西就未见得一定是他要买的，如何能够通过搜索给他带来逛街的体验是比较困难的。这块搜索是我们现在一直在做的，并且用不同的模型来进行落地尝试。

那么第二个方向就是推荐系统。电商的推荐也是一个老生常谈的话题了，但在一些新的场景下如何做？比如 Etsy 上有很多的商品是手工艺品，数量可能很少，那么在给用户推荐的时候，必须考虑到它的件数是有限的，这个地方也是有一些难点。

第三个当然就是我们的广告平台。如何能够通过人工智能帮助广告提升，广告是一个买卖的双方系统，如何帮助卖家实现好的宣传效果，这个也需要通过算法来更新的。

Q：目前已落地的一些人工智能技术，起到的作用和我们传统的一些办法相比，效果明显吗？

A：人工智能在搜索广告和推荐这块效果已经比较明朗了，肯定是比传统的方法做得好，但是它的提升度在不同的情况下区别还蛮大的。我们如果能够让效果最大化，必须跟产品界面，还有前端等融合，形成一个统一的产品，才能让算法得到的结果以最好的形式展现出来。

Q：您认为人工智能落地遇到的最大的一个挑战，或者困难是什么？

A：现在人工智能落地最难的并不是算法本身，最难的是和场景的对接。算法本身可能是一个数学描述，是个模型，但是真实的场景跟模型中间还有一段距离。这个距离需要数据科学家进行“翻译”，把我们的场景和算法衔接起来，需要我们的工程师，能够去根据新翻译的场景调整算法。所以不是所有的经典的算法你都能够马上利用，而是需要一些更改，这种更改必须是基于你的场景，你去理解这个场景，并且能够进行合理的翻译，这实际上是最困难的。

观点篇

Q：人工智能对程序员就业有什么影响?

A：我刚才已经谈到了，数据科学家和人工智能工程师职能有重叠，但也略有不同。打个比方，就像你踢一场足球赛，需要有 11 个队员，有前锋，有中场，有后卫，有守门员，一个复杂的人工智能产品需要有不同的角色，这些角色都需要有一定人工智能机器学习背景，比如说前端工程师，一些设计的人员，一些产品经理都需要人工智能背景。那么从这个角度看这个问题，我觉得反而是大家的机会更多了，大家可以根据自己的背景，根据自己的喜好，寻找适合自己的角色。

Q：人工智能会在哪个行业爆发？

A：我觉得另外一个角度看这个问题更好，有多少行业能够去利用人工智能？就像你刚才提到的，这个人工智能可能会像空气，会像水，会像电一样，成为一个基础设施，我很认同，今年可能会有一些新的契机，我对这方面也很感兴趣。我们也看到，像吴恩达，他想去对传统制造业和人工智能做一些结合，我觉得这个趋势就是一个很好的切入点，不是说现在就能够彻底地改变制造，因为毕竟各行各业有些很深的问题，你得去了解它，但是它可以打开一扇门，让更多的传统行业，比如像制造业的人来了解人工智能，我觉得这个可能会是未来的方向。

Q：现在有一种说法是人工智能就是人工智障，您怎么看？

A：今天我们所看到的人工智能，像 AlphaGo 也好，或者图像识别的一些突破，云技术的一些突破，它的确比 10 年前，比 20 年前的技术要好的多，我觉得人工智能的确到了一个好的阶段。同时，我们也必须要承认，人工智能不能做的事情也很多，并且它做绝大多数事情可能不如我们想象的完美。但是我觉得我们也不必给它贴上人工智障的标签，以表达我们的失望之情。人工智能目前还处于一个很初级的阶段，前面还有很长的路走。我自己希望通过做一个传播者和一个教育者，让更多的人了解人工智能。

Q：您觉得人工智能存在泡沫吗？

A：我个人觉得现在的确是有些泡沫，比如说媒体的热炒，媒体可能不是很了解情况，然后去下一些断言。但是，我个人感觉现在的泡沫处于一个比较健康的状况，这个泡沫帮助更多的人了解这个行业，帮助更多的人投身到这个行业，帮助更多的社会资源聚焦到人工智能。

人才篇

Q：我相信大家都比较关心数据科学团队的招聘的情况，您现在会做很多招聘的工作，您在招聘的过程中有怎样的一个标准，或者最看中候选人的一个特质是什么？

A：招聘大概有这么几个方面，一个是对候选人的基础知识的考察，比如说机器学习基础、统计背景、计算机的基本系统的掌握。第二点，我们会给一些场景，去考察这个候选人是否有能力把一个现实的场景跟他所学的挂上钩，他能否用机器学习或人工智能算法作为一种语言去描述这个场景，这个能力也是很重要的。第三个是动手的能力，比如说他是不是会一些最基本的编写代码，或者数据结构等，大概是分这么三块。

Q：您在专栏里面提到过，数据科学家大概有两类，您能具体说说这两类吗？有什么区别呢？

A：在国外，数据科学家是一个比较范的统称，大概有两大类。

一类是偏数据分析，比如我有一个商业的问题，或者产品的问题，我想去挖掘这个数据，看能不能回答我这个问题，它重在分析，不偏重如何提高产品品质。比如说他分析圣诞期间什么东西卖得比较火，明年男生会不会更喜欢某款相机，回答类似的静态问题。

另外一类的数据科学家主要侧重于怎么用机器学习的算法提高我们的搜索、推荐或广告效率，更偏重于驱动产品。这两类数据科学家的技能有一些重叠的部分，比如最基本的机器学习、统计背景、编程背景等，但是他们的侧重方向不一样。

Q：是不是硕士学历及以上才能做人工智能？

A：我觉得要分现状和未来两方面。现状是本科生没有全面的一个训练，一些需要高阶技能的部分，可能硕士也没有完整训练过，并不是说，做人工智能就一定要博士生，而是需要的这些技能刚好只有一些博士生满足。但是随着教育和推广的演进，这个门槛会逐渐降低。我跟朋友闲聊的时候经常举一个例子，牛顿发明整个力学体系时候，那会儿全世界可能只有几个人知道，但是现在牛顿力学体系只是高中的一堂课，它的门槛低多了。未来人工智能、机器学习的门槛也会降低，普通人也可以从事相关的工作。

学习篇

Q：如何入门和学习人工智能？

A：一方面要去看经典的教材和经典的书籍，这个是不可或缺的；另一方面，人工智能这个领域发展太快了，很多的新东西都是在顶级学术的论文里面，去阅读学习论文也是必不可少的。

Q：如何提高看书的效率？

A：这个需要在实践中去学，如果需要某个知识点，要去通读这个知识点相关的内容，相同的内容多看一些不同的观点，把它搞懂搞透。有的讲的比较粗的，需要去其他地方找到比较细的论证，有的比较细可能没有抽象到一个高度，在其他地方反而能找到，要互补，这样看书的方式是最高效的。

Q：您前面提到除了看书，看要看国际会议论文。如果让您给大家推荐三个顶尖国际会议，您推荐哪三个？

A：我个人觉得，工业界的朋友可以关注这几个会议。

第一个是KDD（Conference on Knowledge Discovery and Data Mining，数据挖掘与知识发现大会）。这个会议有个工业组，论文包括一些已经落地的项目经验，或者将要上线的经验，并且在开会的过程中，会跟工业界有互动的环节。你去 KDD 可以看到很多人在翻译现实中的场景，这对工业界的朋友来说是很有帮助的。

另外一个是WSDM（International Conference on Web Search and Data Mining，网络搜索与数据挖掘国际会议）。这个会议缘起于雅虎、谷歌等硅谷公司，认为传统的学术会议不能满足工业界需求，最近几年，工业界的不少解决方案和新问题都是在这个会议上提出的。

第三个是CVPR（Conference on Computer Vision and Pattern Recognition，国际计算机视觉与模式识别会议）。这个会议可以帮助很多初学者拓宽视野，让大家知道机计算机视觉是一个非常广的领域，深度学习只是其中的一部分。

Q：外行看热闹，内行看门道，有很多报道只关注谁获得了最佳论文奖，谁获得了终身成就奖，除此之外，您觉得对于这些顶级会议我们还应该关注什么？

A：现在这些会议会有上百篇，甚至将近一千篇的论文。作为一个初学者，或者是想进阶的工程师，或者是数据科学家，一个比较有效的方法，就是根据你的领域去了解。像我比较关注搜索、推荐等，我一次性去了解这次会议在该领域大概有多少论文，有些什么新的东西，这就极大的缩小了关注范围，节省了时间。另一个需要去了解这个会议上有哪些新的想法，这些也许跟你现实的工作不直接相关，但是对于你拓宽视野很有帮助。

Q：那针对阅读论文，我们应该怎么入手呢，您的经验是怎样的？

A：学习人工智能方面的知识，特别是读论文，很多时候大家觉得难以入手，因为有太多的论文，一个比较高效的方法是先读文献综述。文献综述总结了当前的发展状况，能帮你解决至少两个问题，第一个问题是，了解相关术语，你用这些术语能查到更多相关的东西，如果你连术语都不知道，可能连这些论文查都查不出来，这些综述能帮助你熟悉这个领域的语言，和它里面的一些子问题。另外一个，能够起到文献综述作用的是国际的顶级会议，这些会议会邀请学者做分享，分享往往会有一个 PPT，这些 PPT 会归纳最近几年的发展和观点。通过综述和讲座，你就已经对这个领域有了一个概念性的理解，然后你再去读三到五篇该领域、子领域的经典论文，这是我个人去体会过相对比较高效的一个方法。

Q：小白如何入门人工智能？

A：如果你想真正投身到人工智能，我个人建议，还要相对系统地去学习整个知识体系，比如刚才我们聊过的，机器学习、统计、系统概念、最基本的编程的能力等，还有一些工具，比如 Python 等，磨刀不误砍柴工，但这肯定需要一个过程。

Q：目前有个说法，Python 是机器学习第一语言，一般推荐大家先学习 Python，您怎么看？

A：Python 的确是一个比较好的机器语言学习工具，并且现在围绕 Python 也产生了不少生态系统，使得 Python 比较适合机器学习、数据分析，或者是一些场景。但这里我必须强调一下，在一个比较完整的端到端的人工智能应用中，特别是工业级的应用中，往往是一个比较异构化的环境。所谓异构化是指不是单一的语言，或者单一的工具就能够完全的把数据转化成你想要的模型，并且能够用这个模型去推动我们的产品，这里面可能有 Python 的部分，但可能还有 Java 的部分，有 C++ 的部分等，如果你真想要有一个进阶，成为一个更加全面的工程师，或者是科学家，就不能只掌握 Python。

结束语 | 雄关漫道真如铁，而今迈步从头越

去年，“极客时间”联系到我，询问是否愿意开一个人工智能主题的专栏，因为我对知识经济充满好奇，对知识分享更是有极大的热情，所以我几乎是不加思考就答应了下来，对于接下来一年会遇到的挑战和收获丝毫没有准备。

一年过去了，我们的专栏到了说再见的时候。现在我的感受是，我和你一起完成了一个不可能完成的任务。今天就和你聊聊一路走来我遇到的那些挑战和收获。

我的第一个挑战就是在浩如烟海的人工智能知识库中，究竟要为你准备什么样的内容才能照顾到不同人群的需求。人工智能技术涵盖面广，变化更新很快，涉及到大量的工程实践以及纯粹的理论工作，如何取舍呢？

最后呈现给你的 156 期内容，涵盖推荐、搜索、广告、自然语言处理和计算机视觉这五个人工智能核心技术模块，带你了解最关键的概念、模型和技术；最新的顶级学术会议论文导读，帮助你跟踪最新的技术动态；以及数据科学家成长和数据科学团队建设的经验之谈，帮助初学者快速入门。

一切取舍之间的纠结都是为了打造一整套丰富的内容，给初学者一个理想的入门手册，带你跨进人工智能的大门，看清这里面都有什么，在心里画出一张人工智能的地图；同时还能给你一个进阶指南，让你能够找到继续精进的方向。

对于顶级学术会议中精彩论文的分享，我花费了很多精力。现在很多会议动辄发表一两百篇甚至几百篇新论文，我每次都要扎进去选取我认为最优质的内容你给解读。我之所以觉得这个部分很重要，是因为在一个发展如此快速的领域，我们不能只埋头学技术、做工程实现，还得关注最新发展、最新思路，这样我们的学习才能事半功倍。

在整个专栏准备中的第二个挑战就是内容的撰写。一方面是时间上的安排。白天，我要管理和发展一个 15 人左右横跨美国东西海岸的工程团队。晚上，我要写出一篇 3000 字左右的 AI 技术文章。每篇文章平均 3000 字，一年的内容就是 40 多万字。不管是中国的假期还是美国的假期，专栏都没有停止更新。这中间的艰辛和挑战是我在去年欣然答应时所始料未及的。但从另一个角度来说，也正是这份压力和挑战一直督促着我，整整一年，每周雷打不动写出 3 篇原创文章，最后完成了这项看似不可能完成的任务。

另一方面就是内容要怎么写。因为人工智能内容的特殊性，同时专栏文章也都要转成音频形式，我需要尝试使用通俗易懂的语言，来讲解很多即便有数学公式和图表都难以说清楚的机器学习内容，这个难度非常大，我也在不断学习中。在这个过程中，我也逐渐清晰了专栏内容和完整的课本教学之间的关系。专栏内容并不是专业知识的一个替代，也不可能成为替代，但专栏文章可以是一个很好的“向导”，帮助初学者入门，找到经典知识的主脉络和进阶的快速通道。

所以，如果有一些内容你还是没有弄明白，欢迎你留言和我继续讨论。另外，可以认真想想到底是哪里不明白，这恰恰是最好的学习机会。通过专栏学习，抓住知识树的树干，然后再去看每一个枝杈上还缺什么，一点一点添枝加叶，日积月累，这棵知识树终会枝繁叶茂、开花结果。

过去一年里，我在迎接这些挑战的过程中收获很多，还获得了不少惊喜，在好几次学术和工业界会议上、电话面试甚至面对面的面试中，我都听到这么一句越来越熟悉的话，“洪老师，我是您专栏的用户。”在这个时候，我感到欣慰，也感受到了更大的责任。我越来越体会到当一名知识转播者的快乐和影响力，也让我更加坚定了自己在人工智能知识的传播上贡献自己力量的决心。

我相信，“AI 技术内参”这个专栏是我系统分享知识的一个开始，也是你学习人工智能的一个开始。接下来，就像在专栏开篇中的期许那样，我们齐头并进，在人工智能的世界里走得更快、更高、更远！

最后，感谢你一年 365 天的陪伴。AI 是海，我们一起乘风破浪；AI 是山，管他雄关漫道，我们一起迈步从头越！