JEEK
容易脸红的编程大神
本文首先介绍Embedding召回框架和封装的算法,然后介绍Embedding召回在vivo手机的阅图锁屏、以及内置i主题App这2个推荐场景中的应用效果。
背景
Embedding向量召回
无监督
1)Item2Vec
Item2Vec[1]由Oren Barkan和Noam Koenigstein于2016年提出,论文把 Word2Vec 的 Skip-Gram with Negative Sampling (SGNS)算法思路迁移到基于物品的协同过滤上。它是一种通过用户行为来理解内容的方式,使用包含一个隐层的神经网络,并基于一段时间内被点击物品具有内在相似性的假设,来学习物品Embedding向量。训练数据是用户的点击物品序列,物品间的共现为正样本,并按照物品的频率分布进行负样本采样。
实际应用时,我们基于 Skip-Gram和负采样来做 Item2Vec ,由于用户的点击序列不像自然语言那样具有严格的局部空间句法结构,并且实际业务中用户点击序列比较短,我们选取了7天的数据生成点击序列。另外,考虑到序列带来的影响,我们参照论文提到的方式,对点击序列进行了Shuffle,并将上下文窗口设置为5,正负样本控制在1:10,隐层的 Embedding Size 取32, 这些取值是效果和性能的折中,根据具体的业务可以调整。
2)GloVe
GloVe[2](Global Vectors for Word Representation),是一个基于全局词频统计的词Embedding算法,Embedding向量捕捉到了单词之间一些语义特性。类似Item2Vec,我们可以把用户的点击序列看成一个句子,每个物品就是单词。其实现主要可以分为三步:
1. 根据点击序列数据构建共现矩阵,其权重根据两个物品在上下文窗口的距离d进行衰减1/d;
2. 构建词向量和共现矩阵之间的近似关系;
3. 构造损失函数,作者在平方损失上加了一个权重函数,保证共现次数多的物品之间的权重不会过大,其公式如下:
更多细节可以参考论文。
3)Line
Item2Vec和GloVe都是建立在“序列”样本(如点击列表)的基础上,但在推荐场景下,物品之间的关系更多呈现的是图(网络)结构,比如典型的场景是通过用户行为数据生成物品关系图,节点表示物品,边表示物品之间的关系,用低维、稠密、实值的向量表示网络中的节点,即物品向量。
其中比较有代表性的是微软亚洲研究院在 2015 年发布的Line[3](Large-scale Information Network Embedding),它定义了两种相似度来表征节点之间的关系,即一阶相似度(存在直接相连的边,衡量两个节点自身的相似度)和二阶相似度(是否存在相同的邻居节点,衡量两个节点邻近网络结构之间的相似度),使得训练出来的Embedding向量既保留局部网络结构信息又保留了一定的全局网络结构信息。
在业务中我们将用户的点击序列输入模型,构建图网络,然后分别训练一阶相似度模型和二阶相似度模型,得到两个向量,最后将其拼接得到物品向量。
图 2 二阶相似度,例如5和6共享邻居,是二阶相似的
4)小结
上述三种模型都会产生物品向量,那用户向量又是如何得到的呢?我们的做法比较简单,直接选取用户最近一段时间内点击/下载的物品,查询对应物品的物品向量,然后取平均得到用户向量,即Average Pooling的思想,以此反映用户最近的兴趣。
上述模型学习出来的物品向量具有很好的相似度,但缺点也比较明显:
只考虑了训练样本中物品与物品之间的局部/全局共现关系,没有利用丰富的用户侧特征,用户个性化不够;
需要用到用户的行为数据,无法解决冷启动问题,另外使用短期的用户行为进行训练,只能覆盖活跃用户,且只能评估用户的短期兴趣。
有监督
1)FM
FM算法(Factorization Machine)是在CTR预估中常用的模型,它主要解决特征的二阶组合问题,对于稀疏的数据具有很好的学习能力。它其实就是LR模型加上特征之间的二阶交叉项,公式如下
x是特征的值,v是特征的Embedding向量,每个特征学习一个Embedding向量。特征交叉时,以两个特征的Embedding向量的內积作为交叉项的权重。
但从原始的FM模型中我们无法得到用户和物品的Embedding向量。因此,我们采用[9]中提出的方法,简化FM模型,只考虑用户特征和物品特征之间的交叉,目的是为了抽离出用户和物品的Embedding向量。如果我们只保留用户特征和物品特征之间的交叉,二阶交叉项可以改写为:
是各用户特征乘上对应的Embedding之后求和,维度与每个用户特征的Embedding维度相同,
是各物品特征乘上对应的Embedding之后求和。假设特征Embedding的长度都是n维,最后拼接上一阶项和bias,用户和物品的Embedding向量长度为n+3,如图3所示。
图 3 FM用户和物品Embedding向量
2)FFM
FFM算法(Field-aware Factorization Machine)是FM算法的改进版。FFM相对于FM更加细致,它认为每个特征与其他不同域的特征交叉时使用的Embedding向量不同,即对于每一个特征域学习一个Embedding向量。如果一共有F个特征域,那么每个特征都会学习F-1个Embedding向量(除了自己所在的特征域)。类似于FM的简化方法,为了简化FFM得到用户的Embedding向量和物品的Embedding向量,我们按照[10]中提出的方法,只考虑用户特征和物品特征之间的交叉。
图 4 FFM用户和物品向量二阶部分
如图4所示,假设用户侧有M个特征域,物品侧有N个特征域,则每一个用户特征都会学习N个Embedding向量,每个物品特征会学习M个Embedding向量。经过重新排序后用户侧Embedding向量可以和物品侧Embedding向量一一对应。将向量拼接就可以得到用户和物品的Embedding向量,向量的长度为M*N*K(K为特征Embedding向量的长度)。但是一般特征的数量会比较大,因此拼接得到的用户和物品的向量长度太长,影响向量检索的速度。[10]中进一步提出了几种简化的方法,我们采用了“混合提速”策略。即用户侧特征对应同一物品侧特征域的Embedding先相加再拼接,物品侧同一特征域的Embedding先相加,不同特征域之间再拼接。另外,一阶项和bias项的添加方式和FM相同,最后用户和物品Embedding向量的长度为N*K+3。
3)YoutTube DNN
YouTube DNN算法来自于YouTube 2016年发表在RecSys上的文章。它把推荐问题看成一个超大规模多分类问题。网络结构如图5所示,用户历史行为特征由物品Embedding求平均表示,另外拼接上用户的属性特征。经过一个全连接网络之后得到用户的Embedding向量。深度神经网络的目标就是在给定用户历史行为、用户特征以及上下文的情况下,学习出用户的Embedding向量,然后用于Softmax分类器来召回物品。在物品库V里选择的物品为第i个视频的概率,其数学表达式如下:
其中表示(用户,上下文)的embedding向量,
表示每个候选物品的embedding向量。
图 5 YouTube DNN模型
在我们的实现中,模型输入层物品的Embedding没有经过预训练,而是共用Softmax矩阵中的物品Embedding向量,发现有更好的效果。此模型的特点是可以同时利用用户的历史行为特征以及用户的属性特征,对用户的兴趣有更好的挖掘。
4)双塔DNN
图 6 双塔 DNN模型
双塔DNN模型来自于YouTube 2019年发表在RecSys上的文章,在业界其实也早有应用。相对于只有用户塔的DNN模型,它加入了物品塔。用户塔还是输入用户的历史行为特征和用户属性特征,物品塔可以输入物品的id类特征和属性特征。两个塔的最后一层输出分别代表用户的Embedding向量和物品的Embedding向量,然后通过Softmax函数得到点击概率。相对于单塔的DNN模型,双塔模型加入了更多物品侧的特征,能够更好地刻画物品。
5)小结
FM/FFM算法为了实现Embedding召回做了一定的改造,与原始的FM/FFM算法有一定区别。在FM算法实现中,我们省略了上下文特征,以及用户特征、物品特征的内部交叉,后续可以考虑加上这些特征;在FFM算法实现中除了部分特征的省略,为了减小向量维度,用了混合提速的方法,也会损失一定的模型精确度。
在YouTube DNN和双塔DNN的实现中,需要对id特征做Embedding操作,常规方法是用一个[Index_size,Embedding_size]的Variable矩阵做Embedding参数,然后根据id查表得到相应的Embedding向量。但是实际的id特征往往不是从0 开始,甚至不一定是整数。利用Tensorflow的lookup.index_table_from_tensor函数可以将原始id特征映射到从0开始的index,但是还是需要设置Variable矩阵的大小,而且需要预留一定的数量给新增的id。因此我们使用了vivo的Embedding Table工具,在模型中直接使用物品的原始id,并且Embedding Table可以动态增加。另外,考虑到性能、训练数据量和模型参数量之间的关系,当物品数量非常大的时候,我们会筛选出较为活跃的物品进行Embedding,使得到的Embedding能较好地反映物品的特征。尽量保证模型参数和训练样本数的比例在1:20~1:10。
以上模型训练完之后并不能直接得到用户和物品的Embedding向量,除了YouTube DNN模型参数中包含物品的Embedding向量。其余模型需要为每一个用户或物品构造一条预测数据输入到模型中,通过predict过程将模型的最后一层输出结果作为用户或者物品的Embedding向量。如果是离线处理,则选择用户或者物品最新的特征。
有监督学习算法目前都已经实现了增量更新,可以提升模型更新速度,但无监督算法目前还没有实现;
无监督算法存在的普遍问题是,偏向热门物品,对长尾物料挖掘不足;
有监督的算法通过利用丰富的物品侧、用户侧特征,可以进一步实现个性化,另外像双塔DNN、FM/FFM通过加入物品特征,可以解决物品冷启动问题,并且通过实时获取新物品特征,可以让新物品得以曝光。
实际业务落地
不足和展望
参考文献
回顾上篇: