最近有一些小伙伴给我留言说非常想要我开一个推荐系统专题,其实我也有过这个想法,一直没动笔主要有两个原因。第一个原因是担心自己水平不够,班门弄斧或者是误导了一些读者。第二个原因是,我的确不知道这个专题应该怎么写。但是读者有求,总得回应不是,所以咬着牙写了本文。
文章有点长,但是干货不少,希望大家能够耐心读完。
推荐、广告、搜索三兄弟互联网行业当中有这么一句话,叫做:搜索、广告、推荐三兄弟。这句话是说这三个领域或者是三个方向的技术栈非常接近,甚至可以说是相差无几,可以自由转化。比如我也是今年才转到的推荐team,之前在广告组。转岗的时候只做了一件事,就是和老板说我要转岗,去推荐。
你可能会很好奇,为什么会这样?这三个也不是一回事吧?从表面上来看的确不是一回事,但是从本质上起是一样的。我简单画一个架构图,最最简单的那种。
这张图我相信谁都能看懂,推荐系统也好广告系统也罢或者是搜索系统也一样,本质上都只做了一件事,就是根据信息从内容库里取得合适的内容给到用户。这句话有两个关键点,第一个关键点是根据信息,第二个关键点是合适的内容。这三个系统本质上就是围绕着这两个关键点在运作。
举个例子,搜索系统,大家首先会想到搜索引擎比如某度。搜索引擎的使用场景是什么?很简单就是我们输入搜索词,搜索引擎返回我们想要的网页。我们在淘宝搜索,其实也是一个搜索引擎。我们一样是输入搜索词,淘宝返回我们想要的商品。在这个例子当中,信息主要成分就是用户的搜索词,合适的内容呢,某度的内容是网页,淘宝的内容就是商品。
广告系统其实也是一样的, 我们在搜某度的时候有时候会弹出一些没羞没臊的小网站。这些网站也不是凭空来的,其实也是引擎搜出来的,只是在广告系统里,这里的合适的内容就变成了合适(能赚钱)的广告。
你可能又会问了,我打开淘宝的时候啥也没输入啊,推荐系统自动就帮我筛选了一批商品,怎么能说推荐和广告是一样的呢?
的确,我们打开电商网站的时候,什么也没输就能看到商品,打开抖音什么也没干就能看到小姐姐。但是这并不意味着网站什么信息也没有,它其实有的信息有很多。比如你之前的消费记录、点击记录、创建账号的时候填写的个人信息等等。推荐系统其实可以理解成使用的这些隐藏信息来进行的“搜索”,本质上一样是信息的检索。
也就是说我们站在更高的角度来看,搜索、推荐、广告其实本质上都是搜索引擎。只是搜索的形式不一样,搜索的目标不一样,所以会拆分成几个团队来做。
具体多说一点,比如广告的目标是盈利,承担电商公司的大部分收入,不仅要让你点广告,还要让你点比较金贵的广告,赚钱的期望要最大。搜索的目标一般是准确性和质量,就是当用户搜索的时候搜出来的结果首先质量要高,和搜索词要匹配,不能搜什么都出小姐姐。推荐的目标一般是点击率,因为没什么推荐准不准确一说,主要还是让用户能够点,让用户多看看。
搜索、推荐、广告只是形式不同,目标不同,具体的做法上也会有一些差异,但核心的逻辑都是一样的,称为三兄弟并没有什么不妥,推荐系统搞明白了,广告、搜索也都差不多了,就是那么回事,大同小异,吹牛都会更有信心一点。
推荐系统架构我们把广告和搜索先放在一边,主要来看推荐系统。推荐只是表象,其实核心还是搜索,推荐的目标是搜索出那些你可能还没看过,但是你可能感兴趣的东西。
这里面关键点就是用户的兴趣,也是推荐的难点。它不像是搜索,用户会输入搜索词,意图很明确。我搜乒乓拍就是要看乒乓拍,你给我出别的结果都不对。推荐不是,用户什么都没有输入,我们要盲猜。当然也不是真盲猜,其实也是根据用户之前的行为猜。所以有些上古时期的推荐相关的书籍当中会说推荐系统分为两种,一种是基于用户行为的推荐,一种是纯内容的推荐。
怎么说呢,这样划分当然是没错,但是有些落伍了。现在人工智能时代,啥都要智能,讲究千人前面。纯内容的推荐基本上已经看不到了,可能在一些小场景当中还有在使用。除此之外基本上清一色的基于用户行为的推荐了,如果你找工作说我精通纯内容的推荐,估计面试官就直接让你出门左拐了。如果你开公司和投资人说,我们这个项目的特点就是基于内容推荐做得好但是没有千人前面,估计投资人也出门左拐了。
这其实是挺悲哀的一点,网上的资料都比较古老,想要钻研只能在实际的应用场景当中学习领悟。对于想要自学成才的少年来说不是很友好。
扯远了,我们回到主题。我们推荐的时候,主要是根据用户的内容。这里面也有两个问题,第一个问题是新用户怎么办,我之前从来没逛过淘宝,或者现在还没登陆,难道我打开首页就什么也看不见吗?这肯定不行。第二个问题是也不能纯基于行为,比如我之前点过乒乓拍,你就全给我推荐乒乓拍,那肯定也不行,一点新鲜感都没有。
其实这样类似的问题还有很多,说白了只有一点,就是我们不能一根筋,就只用一种策略来推荐。要采取多种策略,比如热门的商品选一些,比如用户之前点过的商品选一些,用户之前经常看但是没买的商品选一些,比如用户之前感兴趣的类目下的商品选一些,感兴趣的店面下的商品选一些……
光选还不行,选了这么多商品,我们怎么展示呢?总不能一排一排展示吧,肯定要把用户最有可能点的放在前面,把次要一点的放在后面。问题是用户可不可能点并没有一个明确的指标,所以针对这个问题,我们只能把它交给模型,用一个模型来预测用户会不会点击这个商品,他的点击率有多高。
我们把上面的这些逻辑整理一下,可以发现推荐的过程主要分为两个步骤。第一个步骤是选商品学名叫召回(recall),第二个步骤是排序。一般来说还有第三个步骤,夹在这两个步骤中间,叫做过滤。因为多种召回策略可能会召回到一些非法违禁的商品,或者是重复的商品,我们需要过滤掉,防止用户看到引起反感。
这样我们就可以画出完整的推荐系统的架构了:
我们之前介绍过的以及网上到处充斥着的协同过滤算法,其实只是召回策略当中的一个。所以协同过滤其实不能算是推荐算法(可能上古时期算),现在只能算是推荐策略的一种。
所以如果你看到什么培训班或者是课程上面说手把手教你做一个推荐系统,然后点进去看看讲来讲去都只有协同过滤,什么tfidf的话,趁早找他退钱。并不是这些东西不重要,而是这些内容已经不是推荐系统的重点了,仅仅学会这些其实真的一点用也没有(可能那种十几个人的公司有用)。
技术分析到这里,我们已经清楚了,推荐系统可以分为这么三个模块,其实广告、搜索也差不多,也是这么三个模块,只是模块当中的实现逻辑不太一样。我们简单说说这三个模块当中的逻辑。
召回在互联网公司当中召回相关的工作岗位其实不多,工作量也比较少。这并不是它不重要,而是它实在没有太多可做的。目前电商行业除了一些顶级的公司会用上一些先进的方法之外,其他公司可能还是在用一些比较古老的策略,比如热门商品召回、协同过滤召回等等。
主要有这么几个原因,一个原因是受到业务的限制比较深,不仅行业之间没有共通性,甚至不同的公司也不一定可以用同一套方案。比如音乐推荐和商品推荐,召回的逻辑肯定不一样,再比如淘宝和唯品会的面向人群以及商品情况也都不同,用户习惯可能也不一样,也不一定就能够使用同一套方案。
另外一个原因是召回这一块承载的流量比较大,很难经得起大的折腾。比如每一个用户到了首页都会看到商品推荐,基本上首页的流量就等于推荐系统的流量。所以召回引擎一定要保证效率和性能,因为后面的排序是性能开销的大头,所以前面要尽可能地留出空间,给后面的系统使用。
我们拍拍脑袋可能会想到很多看起来很不错的策略,但是实际上这些策略并没有这么简单,因为我们面向的可能是一个海量的内容库,比如电商公司里面上亿甚至十亿的商品。再好的策略可能都得打个问号,究竟能不能抗住这么大的流量?
最后一个原因是一些先进的手段要求很高,并不是什么公司都有条件用。举个例子,比如召回当中有一个比较先进的方法叫做向量召回。也就是把一个商品使用神经网络映射成一个向量,然后根据用户之前的行为召回一些相似度很高的向量。由于神经网络的泛化性能比较好,我们可以召回出一些普通的方法召回不了的优质商品。但问题是这种方案对于数据的准确性以及模型的性能要求很高,别人用起来效果出色,是因为别人的数据质量高,系统成熟。对于中小型公司而言,这两条是很难保证的,所以一些听起来特别牛叉的方案可能只有大公司在用。
结合这么几点,会得到一个结论,就是对于中小型公司的召回策略来说,其实基本上可以认为是固定的。可能也会有些改进,但是很有限。他们也很难招到水平非常高的架构师,让整个系统升级换代。并且也没有人能保证升级换代一定会有更好的效果。
过滤过滤就更没有什么好说的了,过滤的业务导向性更强,基本上不具有普适性。一些特殊的情况可能只有这个公司和这个产品能遇到,换个公司换个产品就完全不一样了。
所以过滤层基本上都是做着类似补丁的活,当然这其中也可能会用到一些比较高端的技术。比如一些反作弊或者是风控的策略,再比如一些检测非法、鉴黄的模型等等。但是这些高端的做法一般也是大公司才有,小公司里一般都是朴素的策略,能用就行。
排序这么一通分析一下,很明显推荐的核心在于排序。实际上也的确如此,如果我们去翻翻各大期刊的paper,里面充斥着的也都是各种各样的排序策略以及排序优化方案。这也是最需要算法工程师的地方,也是算法工程师就业的主要岗位。
算法工程师主要做什么呢?当然还是老一套了,调整参数、做几个新的特征、训练模型。看起来很无聊对不对,其实也很无奈,因为算法工程师往往接触不到完整的系统,实际上整个系统也是半定型的,很少会有重构或者是调整的机会。对于下游的召回以及过滤接触一般也不会太多,能看到的只有自己的模型和数据,也就是这么一亩三分地。虽然是一亩三分地,但是里面可以做的事情可不少,需要做新的数据,需要分析旧的数据,如果效果不好得分析原因,得尝试一些新的方案。很简单的事情来来回回就可以做几个月,这是非常正常的。
你可能会问,难道就不会用一些更高端的方法,照paper上实现一下模型,获得更好的效果吗?
对不起,可能会让你失望了,这样的机会的确有,但是并不多。先不说这些paper列举出来的结果和使用的数据有没有水分,就算没有水分,也不代表它能适合所有的场景。可能只在它的数据场景才有效,在我们的场景就未必适用。再者,别人能用的方案不代表其他公司也能用得了,就拿itemvec来说,有几家公司有能力对上亿的商品集训练出效果很好准确的embedding的?DIN是好,没点体量和技术能力的公司是真的无福消受。退一万步来说,即使真的有用,带来的提升也是非常非常小的,可能还不如挖掘一个厉害一点的特征,或者是找一找数据中的trick。
从整体上来说,排序这一块的确是最有技术含量也是最需要模型效果的。但是从实际的工作上来说,它依然是骨感的,可能远不像大家想的做科研那样高大上和性感。
一点感想说到推荐系统,我们可能会首先想到各种各样的算法,但实际上算法严格说起来并不是推荐系统的核心。因为paper都是公开的,业内的先进的做法也都不是秘密。但为什么有的公司的推荐就做的非常好,有的就做不起来呢?
归根结底还是系统与架构的原因,推荐系统需要承受海量的流量,需要海量的数据训练,没有一套优秀的架构是玩不转的,这才是真正技术的核心,考验一家公司以及架构师的地方。这也是为什么一些中小型公司不给力的原因,他们既没有足够的计算资源去支撑这样的系统,也招聘不到足够优秀的架构师来升级系统设计,能做的事情自然就非常有限了。
所以如果大家对推荐系统感兴趣的话,闭门造车是不行的。最好还是要去规模比较大的公司,这样才能接触到业内最前沿的做法。并且也不能只关注算法和模型,最好能站在高角度望一望整个系统的架构,这也是最值钱也是最能提升我们能力的地方。
今天的文章就到这里,衷心祝愿大家每天都有所收获。如果还喜欢今天的内容的话,请来一个三连支持吧~(点赞、关注、转发)