互联网大厂推荐算法实战:零基础解析—第三章 推荐系统中的Embedding

第三章 推荐系统的Embedding

        第二章讲,高维、稀疏的类别特征是推荐系统中的一等公民,接下来的问题是,我们如何讲这些类别特征喂入推荐模型?

        目前最常见的接入类别特征的方式是将稀疏的类别特征映射成一个稠密限量,即所谓的Embedding。本章深度聚焦于Embedding这个话题。

        本章将分以下几个部分展开。

  • 3.1节先从传统推荐算法开始讲起,逐步过渡到Embedding。通过这一节,读者将明白Embedding技术并非凭空出现的,而是为了应对推荐算法两大永恒主题之一的扩展性而产生的
  • 3.2节将讨论不同推荐算法在Embedding层的大小技术路线:共享与独占
  • Embedding 的引入极大提升了推荐模型的扩展性,但是也增加了训练难度。为了解决这一难题,基于Parameter Server的分布式训练范式应运而生,并且已经成为各大厂推荐系统的标配。3.3节将介绍Parameter Server,并通过代码揭示它的具体工作原理。

3.1 无中生有:推荐算法中的Embedding

        推荐算法面临的经典问题就是记忆与扩展。

3.1.1 传统推荐算法:博闻强识

        我们希望推荐系统记住什么呢?答:常见、高频的模式。举个简单的例子,到了春节,对于国内客户,电商网站给他们推荐饺子,大概率他们能够购买。到了感恩节,对于美国鬼子,电商网站给他们推荐火鸡,大概率他们也能购买。

        为啥呢?因为<春节,中国人,饺子>的模式、<感恩节,美国鬼子,火鸡>的模式在训练样本中出现得太多了,推荐系统只需要记住,下次遇到同样的场景时“照方抓药”就可以“药到病除”。

        那么如何才能让模型记住呢?借助“评分卡”。“评分卡”是金融风控中的一种常用手段,直白的说,其实就是Logistic Regression (LR) 模型。如果形象的描绘出推荐系统中的“评分卡”,如图3-1所示。一个特征(比如中国、美国)或特征组合(比如,<春节,中国人,饺子>)占据“评分卡”中的一项。可想而知,一个工业级的推荐模型LR的评分卡中的条目会有上亿项。每项特征或特征组合都对应一个得分(Score)。

图3-1 推荐系统的“评分卡”

        得分卡中的得分是由LR模型学习出来的,有正有负,代表对最终目标(比如成交)的贡献。比如Score (<春节,中国人,饺子>) = 500,代表这种组合非常容易成交。反之,Score(<中国人,鲱鱼>)=-100000,代表这个组合极不容易成交。

        简单理解一下就是,正样本中 出现越多的特征或特征组合,其得分越高;反之,负样本中出现越多的特征或特征组合,其得分越低。

        LR模型的最终得分是一条样本能够命中的评分卡中所有条目的得分综合。比如,春节期间一个中国客户访问购物网站,LR模型预测他对一款“鲱鱼馅水饺”的购买意愿=Score(<春节,中国人,饺子>)+Score(<中国人,鲱鱼>)=500-100000 = -99500,也就是几乎不会购买。因此,推荐系统也就不会像该用户展示该款商品。

        LR模型(评分卡)具有如下特征。

  • LR的特点就是强于记忆,只要评分卡的规模足够大(比如几千亿项),它就能记住历史上发生过的所有模式(比如特征及其组合)。
  • 所有模式都依赖于人工输入,所有在推荐模型的LR时代,特征工程既需要创意,也是一项体力活
  • LR本身并不能发掘出新模式,它只能负责评估各模式的重要性。这个重要性是通过大量的历史数据拟合得到的
  • LR不发掘新模式,反而能够通过正则剔除一些得分比较低的罕见模式(比如<中国人,冰岛发酵鲨鱼肉>),既避免了过拟合,又降低了评分卡的规模。
    但是这个也是个问题,强于记忆,弱于扩展。仍举例:中国顾客来了推荐饺子,美国顾客来了推荐火鸡,效果都不错。但是,当一个中国客户来了,你的推荐系统永远不会给他推荐火鸡,因为LR只有记忆功能,因为<中国人,火鸡>属于小众模式,在历史版本中罕有出现,LR的L1正则化直接将得分置为0,从而从评分卡中被剔除。这就有损小众需求。换句话说,推荐的个性化太弱,这使得你只能和你的同行在“满足大众需求”的这一片红海里“相互厮杀”。

3.1.2 推荐算法的刚需:扩展性

        为了避免大众推荐这一片内卷严重的红海,而拥抱个性化精准推荐的蓝海,推荐算法不能只满足于记住训练数据中频繁出现、常见、高频的模型,而必须能够自动挖掘出训练数据中罕见、低频、长尾的模式。这就要求推荐系统必须具备扩展性,也就是能够举一反三。

        那么如何让模型可扩展呢?其实就是将细粒度的概念拆解成一系列粗粒度的特征,从此以后“看山非山,看水非水”。仍举例饺子、火鸡。在之前讲记忆的时候,饺子、火鸡都是彼此独立的概念,看起来没有什么相似度。但是,我们可以根据业务知识,将概念拆解成特征向量,如图3-2:

图3-2 细粒度概念拆解成粗粒度的特征

        在这里:

  • 两个特征向量的第一位表示“是否是食物”,从这个角度看,饺子和火鸡都是
  • 两个特征向量的第二位表示“是否和节日有关”,从这个角度看,饺子和火鸡也都是

        在寻来呢LR模型的时候,每条样本除了将原来细粒度的概念<春节,中国人,饺子>和<感恩节,美国人,火鸡>作为特征,也将扩展后的<节日,和节日相关的事物>作为特征,一同喂入LR模型。这样训练后的“评分卡”不仅包含<春节,中国人,饺子>和<感恩节,美国人,火鸡>的得分,也包括粗粒度特征<节⽇ ,和节⽇ 相关的⾷物>的得分。 ⽽且因为<节⽇ ,和节⽇ 相关的⾷物>在训练数据中出现频繁, 所以这⼀项必然在“评分卡”中占据⼀席之地,不会被正则机制过滤掉。

        但是这种方法依靠人工拆解、也就是所谓的特征工程,这增大了工作量,而且劳神费力。再考虑饺子和火鸡两个概念,还能不能从其他的角度拆解,从而发现更多的相似性呢?这就会受到工程师的业务水平、理解能力、创意水平的制约。

        既然人工拆解有困难、受局限,那么能不能让算法自动将概念拆解成特征分量呢?如果你能够想到这一步,那恭喜你,你已经一只脚迈入了深度学习的大门。悟“道”有成,余下的便是“技”了。

3.1.3 深度学习的核心思想:无中生有的Embedding

        深度学习所谓的无中生有是指,你需要用到一个概念的特征v(比如前面例子里的饺子、火鸡)或者一个函数f(比如阿里巴巴的DiN中的注意力函数),但是不知道如何定义它们。没关系,我们按照一下三步完成。

  1. 将v声明为特征向量,将f声明为一个小的神经网络,并随机初始化
  2. 使v和f随主目标一同被随机梯度下降(SGD)优化
  3. 当主目标被成功优化之后,我们也就获得了有意义的v和f

        这种“将特征、函数转化为待优化变量”的思想并不是深度学习发明的,早在用矩阵分解进行推荐的时代就已经存在了,只不过那时,它还不叫Embedding,而是叫作隐向量(Latent Vector)。

        深度学习对推荐算法的贡献与提升,其核心就在于Embedding,如前文所述,Embedding是一门自动将概念拆解为特征向量的技术,目标是提升推荐算法的扩展能力,从而能够自动挖掘出那些低频、长尾、小众的模式,拥抱个性化推荐的蓝海。那Embedding到底如何提升扩展能力,其实跟前面的方法差不多,都是将精确匹配转为模糊查找,从而让模型能够举一反三。

        图3-3

这里看一个图3-3,在使用倒排索引的召回中,是无法给一个喜欢“科学”的用户推荐一篇带“科技”标签的文章的,因为“科学”和“科技”是两个完全不同的词,但是经过Embedding,我们发现向量空间中表示“科学”和“科技”的两个向量并不是正交的,而是有很小的夹角。设想一个极其简化的场景,用户用“科学”向量来表示,文章用其标签的向量来表示,那么有“科学”向量在所有标签向量里进行前K近邻搜索,一篇带“科技”标签的文章就能够被检索出来,有机会呈现在用户眼前,从而破除了之前因为只能精确匹配“科学”标签而给用户造成的“信息茧房”。

3.1.4 Embedding的实现细节

        Embedding在操作起来还是非常简单的。假设我们有假设我们有{“⾳乐”,“影视”,“财经”,“游戏”,“军事”, “历史”}这6个⽂章类别, 其编号分别为0~ 5, 我们想把每个类别映射成⼀个长度为4的稠密浮点数向量, 整个过程如图3-4所⽰。

        首先我们定义了一个6*4的矩阵,矩阵行数少进行Embedding的特征的总数,矩阵列数是希望得到的向量的长度。先随机初始化这个Embedding矩阵。矩阵的内容会随着主函数优化,训练结束时,矩阵内的内容会变成能表达“文章类别”语义的、有意义的数字。

        以Embedding“财经”这个类别为例,整个Embedding过程从数学上相当于,一个稠密的Embedding矩阵与挚友“财经”所载2号位置为1、其余位置全为0的独热向量相乘。得益于独热向量的稀疏性,以上相乘过程又相当于,从Embedding矩阵直接提取“财经”所在的第二行

       【更新ing--明天从开始搞代码】       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值