现代推荐算法
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

前言

在介绍本书之前,请允许我先讲一段当推荐算法工程师时令我自己最满意的工作经历。因为这段工作经历让我找到了与模型的相处方式,或者说得到了一个职业“秘籍”,之后我在工作中遇到的很多难题都是通过这个“秘籍”解决的,这个“秘籍”也会贯穿全书,帮助大家更好地理解和把握推荐系统的本质,助力职业发展。

这段工作经历涉及两个不同的域,我们用A域和B域来表示。A域的样本很常见,也经常被研究,因此基于A域数据训练的模型预估性能很好;而B域的数据难以采集,样本质量也不够理想。在某种需求下,我们希望模型既能识别A域的样本,又能进行A域和B域之间相同样本的比对。由于B域中的样本质量很差,直接跨域对比效果不理想。

为了便于理解,这里举个例子,A域是汉语,B域是英语,我们要做的任务是判断两个句子的含义是否相同。比如汉语中“在原来的荒山野岭上,经过十二年的时间,他用双手奇迹般地创造了这蒙着如丝细雨显得格外郁郁葱葱的大片森林””“他用12年把渺无人烟的荒地变成了一片绿色的海洋”,而英语的表述是“After 12 years,he transformed the wasteland as a huge forest”,我们可以看出,这三个句子说的是同样的意思。该任务既涉及中文句子间的相互比对,又涉及中文和英文句子间的比对,额外的困难之处在于,由于设备采集原因,B域的句子很多是残缺的,缺少一些词,语义容易模糊,这就给解决问题带来了难度。

笔者一开始尝试同时训练中文句子间比对和中英文句子间比对的两个任务。由于中文的语料非常丰富,中文句子间的比对效果很好。难题发生在中文句子和英文句子比对之间,由于缺失了一些词,模型性能异常,它遇到了一个复杂问题,无所适从,只能根据过去的习惯来强行拟合,但效果并不好,项目因此陷入了瓶颈。

笔者隐隐觉得,模型此时的处境和人很像:在我们求学的过程中,要先学会基础代数,才能学微积分,接着才能学懂机器学习。对于一个没有高等数学背景的学生,要求他学习机器学习会如何呢?他会随意猜测,就和模型一样产生强行拟合的问题。

因此,笔者决定像对待一个人一样对待自己的模型,首先,学习应该是循序渐进的,学习的目标要拆解开。具体来说,加入一个辅助任务,让模型先学会英文句子间的比对。在学习该任务的过程中,将两个分别遗失不同信息的句子对应在一起,在这个过程中,模型能够学到“在英文句子中哪些信息是重要的”。等过了这个阶段,模型学会了这个辅助任务,再进行中英文句子比对。此时模型已经学会了避免把判断的依据全放在那些容易缺失的词汇上,中文和英文句子之间的比对就简单了很多。有了辅助任务的加持,模型的性能一下子就提升了不少,中英文句子对比的效果甚至能和中文句子间的对比差不多。

沿着这个思路,接下来会发生什么呢?等到我们已经学会机器学习的知识之后,还有必要再继续做微积分的题目吗?肯定是不需要的,生活中也没人这么做。同理可得,当模型已经学会提炼英文句子中的关键信息,并能做到中英文句子比对之后,继续学习英文句子间比对的意义可能不大了。于是在确认模型已经逐渐收敛之后,笔者去掉了辅助任务,发现模型的效果还能再提升一些。最终,笔者总结出一个“先用辅助任务过渡,再去掉辅助任务,并专注于目标任务”的模型训练方式,按照这个方式训练模型成功的概率很高。

从这次工作经历中提炼个最关键的点,就是把机器学习的模型当成人来看待,用生活中观察到的经验帮助我们认识、理解和运用模型。

把模型当成人来看待

拟人化是我从业以来最常使用的方法。很多人会说,神经网络是个“黑盒子”,里面发生了什么,既难以控制,也不易解释。但我觉得可以从一个简单的角度来看待模型,比如,把它看成一个“学生”。打个比方,有一个很复杂的问题,学生经过一番苦算,终于得到一种结果。此时我们问他:“这样的结果置信吗?需不需要重新验算一遍?”于是他又从头开始计算,得出了另一种结果。现在我们再问他:“这两个结果哪个更好?”他认为两个都不够理想。“那么如何得到更好的结果?”他想了想,把两个结果综合(求和或投票)起来作为最终结果。经过综合的结果果然比任何一个都好。这也可用于理解集成学习(Ensemble Learning)。

不做“温室里的花朵”

推荐算法工程师经常遇见的问题是:某个特征因为在训练和部署时的抽取方法不一样,导致训练时的覆盖度很高(如99%以上),部署时的覆盖度却很低(10%~20%)。这样模型的表现就会变得很差。这类问题的专业说法叫作“线上、线下不一致”。训练时,特征的覆盖度高,预估很容易,模型就会待在自己的舒适区。可在实际部署时,缺失特征的问题就像一场意外的暴雨,事先根本没有做好准备,作为“温室里的花朵”的模型该如何承受呢?

这就是数据增强(Data Augmentation)能改善模型性能的原因。在计算机视觉任务中,数据增强方法包括把图片裁剪为一个片段,在图片上施加噪声,以及把图片旋转一定角度等。这样做就是让模型在训练时把各种奇奇怪怪的例子都经历了,从而就能适应更困难的环境,等到真正应用时就能克服更多的困难。

精准地描述需求,既不欠缺,也不超出

作为“学生”,模型会有注意力集中或不集中的时候,也会顾此失彼,就是能力终究有限。我们把样本丢给它,让它学习,它会尽力完成任务,但在这个过程中,也会暴露一些“人性”弱点。如果任务设定的要求太高,它可能就直接“自暴自弃”,出现很奇怪的行为,甚至连低一些的要求都无法达到。这种情况常见于任务难度远远超出模型能力的情况,例如,让一个很小的端上[1]模型分辨双胞胎的图片,最后可能会发现模型预测的结果很混乱,连一般情况的人脸都难以区分。反过来,如果要求太宽松,模型又会“洋洋自得”。对于每个样例,它都认为当前已经学习得够充分了,不会主动把精力花在那些难以预测的例子上。

推荐算法工程师往往在扮演一位严厉的“老师”,不停地纠正模型任何试图“偷懒”或“注意力不集中”的问题。有一点是我想强调的:在网络训练的最终阶段,损失函数的数量应该等于且仅等于任务数量。学生要完成什么目标应该是老师准确定义的,因此,作为“老师”的推荐算法工程师应该既不让模型做无关的任务,也不能让它忽略必要的任务设定。这句话还有一个另一种说法:在网络训练未收敛的阶段,可以增加辅助任务,暂时不引入最终任务

关于本书

本书是一本讲解现代推荐系统、推荐算法的图书。与市面上现存的一些书不同,本书并不涉及具体代码,也不讲解某个架构如何实践剖析,包括本书的两大核心部分是模型和算法。模型是算法中最主要的部分,也是笔者最擅长的部分。除了梳理模型发展的历史,我们更关注背后的思想,面对什么样的问题应该选择什么样的模型,如何做出适合当前场景的改进。本书旨在全面介绍现代推荐系统中所需要的各种算法,并深入解析当下最前沿、最先进的算法及其实践应用,让读者快速掌握前言的发展动态。

本书的主要内容

本书的具体布局如下。

首先我们在总览篇中介绍推荐系统的基本概念和近年来它越来越重要的原因,以及基本的环节。推荐系统演变至今,已经形成一套复杂的链路。想要进入推荐系统相关行业,首先得理解这些基本环节在整个链路中所发挥的作用,以及各个环节之间如何协调。这一篇是整本书的基础,也是从业者入行的第一步。

模型作为机器学习的基石,在推荐系统中扮演着重要的角色。尤其在深度学习爆火之后,以神经网络为主的模型已经出现在了推荐系统中的各个环节。从深度学习之前的模型,到目前最新的结构,都将被梳理在模型篇中。具备这些基础知识之后,从业者就能更轻松地解决实际工业生产中的问题,做出更正确的策态。

经过一段时间的研究和发展,一些问题逐渐聚合在一起,形成一个个子领域。这些子领域代表了当下业界的前沿方向,因此我们以前沿篇来总结归纳。前沿篇中的问题虽然有难度,但总能找到不错的解决方案。此外,还有一些目前业界没有定论、可能需要顶尖的技术人员来解决的问题,汇总在难点篇中。立志在推荐算法领域中做出成绩的读者,可以通过这两篇学习推荐系统的核心理论和实践应用,找到灵感。

最后,我们对推荐系统整体的理解、对平台与用户的理解最终都会体现为一些关键的决策。在决策篇中,我们从技术原理和用户心理出发,解释一些常见决策背后的依据。策略也是算法,而且往往是从更宏观的角度出发所提出的算法。对技术人员来说,本篇可以拓宽视野,帮助读者从执行层面进阶到决策层面;对产品运营人员来说,本篇可以解释决策背后的原理,加深理解。

除了知识介绍,书中有大量我个人对推荐系统中问题的理解。就像上面所说的,在当前阶段,很多问题没有定论,这些理解作为我一家之言也未必全对,但我希望这些理解能引发读者更多的思考和开放性的讨论。

由于本书不涉及基础的机器学习概念和数学知识,所以对于还没有深入了解过机器学习的读者,笔者建议先补充一下相关知识;对于已经有一定基础知识的学生和相关领域的从业者,笔者强烈建议阅读本书,本书中不仅有对技术点背后原理的分析,还有对当下领域发展的总结和展望。

作者

2023年5月


[1] 这里的“端”指的是移动端,也就是用户的手机等设备,另一个相对的概念是云端,本书简称“云上”。