研究推荐算法的一大痛点是什么?不是文章太少,而是文章太多,信息爆炸。每年KDD, SIGIR, CIKM上有那么多中外的王婆一起卖瓜,各种各样的NN、FM、Attention满天飞,其中不乏实打实的干货,更不缺乏湿漉漉的灌水文,让人不知道哪个方法才是解决自己问题的灵丹妙药(当然抱着找银弹的想法来读论文,也是too young, too naive)。
造成这种“永远追新、无所适从”的原因是,有些同学孤立地读论文,结果只能是一叶障目,只见树木,不见森林。正确的姿势应该是,梳理一门学问的脉络,然后在读论文的时候,就根据这个脉络分门别类,比如某篇文章到底是在哪个分支上进行了改进。等日后,你遇到实际问题,先拆解问题,再到问题涵盖的分支上去寻找合适的解决方案。只有这样,才能真正将各篇论文中的观点融汇贯通,读的论文越多,对学问掌握得越清晰,而不是“狗熊掰棒子”,读得越多反而越糊涂。
本文介绍我自己为“推荐算法”梳理出来的脉络。我把推荐算法总结成5个关键词,戏称"五环"。当然这种梳理方法,只是我的一家之言,或许有其他的角度。“横看成岭侧成峰”,只要能够构建出属于你自己的、清晰的知识体系,就没有高低对错之分。
我们希望推荐系统记住什么?能够记住的肯定是那些常见、高频的模式。举个简单的例子:
为什么?因为<春节,中国人,饺子>的模式、<感恩节、美国人、火鸡>的模式在训练样本中出现得太多太多了,推荐系统只需要记得住,下次遇到同样的场景,“照方扒抓药”,就能“药到病除”。
Logistic Regression就是一个非常擅于记忆的模型。说是模型,其实就是一个超大规模的“评分卡”。
SCORE(<春节,中国人,饺子>)=5
,代表这种组合非常容易成交;反之SCORE(<中国人、鲱鱼罐头>)=-100
,代表这个组合极不容易成交SCORE(<春节、中国人、饺子>)+SCORE(<中国人,榴莲>)=5-3.5=1.5
,即推荐系统猜他有可能会购买,但是欲望并不那么强烈。LR强于记忆,弱于扩展。还举刚才的例子
不要小看这个问题,它关乎到企业的生死,也就关系到你老板和你的腰包
综上所述,为了避开“大众推荐”这一片内卷严重的红海,而拥抱“个性化精准推荐”的蓝海,推荐算法不能只满足于记住“常见、高频”的模式(训练数据中频繁出现的),而必须能够自动挖掘出**“低频、长尾”(训练数据中罕见的)**模式。
看似神秘,其实就是将粗粒度的概念,拆解成一系列细粒度的特征,从而“看山非山、看水非水”。还举饺子、火鸡的例子
<春节,中国人,饺子>
和<感恩节,美国人,火鸡>
,还有细粒度的模式,比如<节日,节日相关的食物>
。这样一来,<春节,中国人,火鸡>
这样的小众模式,也能够命中评分卡,并获得一个中等分数(因为<节日,节日相关的食物>
在正负样本中都有出现,所以得分中等)。相比于原来被L1正则优化掉,小众模式也有了出头之日,获得了曝光的机会。这样看来,只要我们喂入算法的,不是粗粒度的概念,而是细粒度的特征向量,即便是LR这样强记忆的算法,也能够具备扩展能力。
但是,上述方法依赖于人工拆解,也就是所谓的“特征工程”,有两方面的缺点:
既然人工拆解有困难、受局限,那能不能让算法自动将概念拆解成特征向量?如果你能够想到这一步,恭喜你,你一只脚已经迈入了深度学习的大门。你已经悟到了“道”,剩下的只是“技”而已。
我将深度学习形象地总结为“无中生有”:
v
(比如前面例子里的饺子、火鸡),或者一个函数f
(比如阿里Deep Interest Network中的“注意力”函数、CNN中的filter),但是却不知道如何定义它们。v
声明为特征向量,将f
声明为一个小的神经网络,并随机初始化。v
和f
,随着主目标(最终的分类或回归loss),一同被SGD所优化。v
和f
。这种“无中生有”的套路,好似“上帝说,要有光,于是便有了光”的神迹。以讹传讹,后来就变成了初学者口中“深度学习不需要特征工程”,给了某些人“我只做深度学习,不做机器学习”的盲目自信。其实这种“将特征、函数转化为待优化变量”的思想,并不是深度学习发明的,早在用矩阵分解推荐的“古代”就已经存在了,只不过那时候,它不叫Embedding,而叫“隐向量”。
深度学习对于推荐算法的贡献与提升,其核心就在于Embedding。如前文所述,Embedding是一门自动将概念拆解为特征向量的技术,目标是提升推荐算法的扩展能力,从而能够自动挖掘那些低频、长尾、小众的模式,拥抱“个性化推荐”的“蓝海”。
Embedding到底是如何提升“扩展”能力的?简单来说,Embedding将推荐算法从“精确匹配”转化为“模糊查找”,从而能够“举一反三”。
比如在使用倒排索引的召回中,是无法给一个喜欢“科学”的用户,推出一篇带“科技”标签的文章的(不考虑近义词扩展),因为“科学”与“科技”是两个完全独立的词。但是经过Embedding,我们发现“科学”与“科技”两个向量,并不是正交的,而是有很小的夹角。设想一个极其简化的场景,用户向量就用“科学”向量来表示,文章的向量只用其标签的向量来表示,那么用“科学”向量在所有标签向量里做Top-K近邻搜索,一篇带“科技”标签的文章就有机会呈现在用户眼前,从而破除之前“只能精确匹配‘科学’标签”带来的“信息茧房”
再回到原来饺子、火鸡的例子里,借助Embedding,算法能够自动学习到火鸡与饺子的相似性,从而给<中国人,火鸡>的组合打一个不低的分数,从而能更好地给那些喜欢过洋节的中国人提供更好的个性化服务。
和机器学习的其他领域一样,推荐算法中所使用的特征主要分为两大类:
这两类特征中,后者才是推荐算法的“一等公民”,按郭老师的话说,就是VIP中P,需要我们这群打工人小心伺候着。
说类别特征是“一等公民”,一是因为它们更受欢迎,在推荐算法中无处不在:
用户过去1小时观看的视频数
”当特征,然后其数值是3
。因为这样一来,这个特征只能有一个影响因子(权重),显然无法兼顾"用户无论过去1小时看了3个"和"30个视频"这两类情况(前者可能因为用户喜欢看长视频,后者可能因为用户喜欢看短视频)。用户过去1小时观看小于10个视频
”当特征,其数值是1。另外,还有“用户过去1小时观10~50个视频
”等其他特征,来应对其他情形。这样才更符合”目标~特征“非线性关系的本质。用户过去1小时观看的视频数
,数值是3
”这个方案,而是采用“特征是用户过去1小时观看小于10个视频
,数值是1
”的方案?除了为体现“目标~特征”之间的非线性关系,还有一个重要原因就是后者的计算开销更小。以LR为例,,如果将所有实数特征都离散化,那么
只能是0或1,则LR在线上预测时简化为
,即找到非零特征对应的权重并累加,避免了乘法运算,计算速度更快。
说类别特征是“一等公民”,二是因为推荐系统中的很多技术都是为了更好地服务这些VIP而专门设计的
都不为0的样本才能训练<
>组合特征的系数
,FM借助矩阵分解的思想巧妙解决了这一难题,使得只有
与
的样本也能够参与训练
,对组合特征的训练更加充分
刚才在介绍第3环时已经说了,单个特征的表达能力太弱,所以需要交叉多个特征来增强模型的表达能力。
其实目前主流的基于深度学习的排序算法都衍生自Wide & Deep,比如DeepFM或DCN。
在不同的文章中,有不同的叫法,有的叫Field,有的叫Slot,还有的叫Feature Group,但是含义是相同的,都是若干关联特征的集合。
原来我们的LR、FM都是只有Feature的概念,不涉及Field,不也干得好好的,怎么现在凭空多出来一个Field的概念?这还是与推荐系统“高维、稀疏的特征空间”这一特点分不开:
所以正确的姿势是,
刚才说了,Pooling是将一个Field下的多个Feature Embedding压缩成一个向量的过程。而不同论文在压缩方法上也是各有千秋
表示feature embedding,则Field Embedding=
=
充分理解了上面的5环,你就不难理解推荐算法中的经典套路
至此,“推荐5环”梳理完毕。尽管给这5个关键词,起名“五环”有凑梗之嫌,但是也还算贴切,因为它们之间环环相扣
推荐五环
通过将推荐算法梳理成这5环,再读论文,你会发现某些文章吹嘘的“显著提升、巨大进展”只不过是在某一环上进行的小小改进,而它们在其他环上的所采用的方法可能还有瑕疵,不值得借鉴。
而当你面临实际问题时,可以先将问题的难点拆解到五环中的某些环上,然后从那些环的研究成果中汲取解决问题的灵感,而不是胡子眉毛一把抓,急病乱投医。总之,有了这5环组成的知识体系,你头脑中的推荐算法就变得更加清晰,就可以吃着火锅,唱着歌,在你日常的调参、炼丹生活中谈笑风生,“啊啊,五环,......”