深入浅出推荐系统(四):召回:向量化的潮流

只要对机器学习稍有涉猎,就会发现如今机器学习,无论是推荐、图像、语言等领域,随处可见embedding,可以说,在深度学习主宰机器学习领域的今天,万物皆可embedding。那么,什么是embedding,怎么对实体进行embedding,推荐领域里,embedding会怎么应用呢?且待本文一一道来。

embedding简介

embedding是什么

在本文之前的几篇文章里,曾经提及对用户或物品的embedding,实际上,embedding就是将实体的自然表达变化成向量化表达的方法。

将实体(用户、物品、图像等)表示为向量有什么用处呢?因为基于文字或者图片表达的实体,并不能够被计算机理解,因此它们彼此之间无法进行相互比较,而一旦转换成计算机可理解的向量,则能够计算它们彼此的距离,从而可以对他们进行相似度的计算了。

其实,在embedding之前,也有各种讲实体进行数值化的方法,比如LDA,plsa,tfidf等, embedding可以看作是将实体在高维数值空间进行映射,只要向量维度足够高,且映射方式合理,就能够很好地表达复杂的实体,因此embedding甫一出世,便获得了热烈的追捧。

embedding的起源及发展

说起embedding,就不得不提word2vec。word2vec是embedding的开天辟地之作,奠定了embedding的根基。对word2vec的学术理解可以参考Mikolov等人的文献[1]和[2]和[3](文献[3]是doc2vec,使用向量来表达整个文档)。

这里用白话简单介绍下word2vec: word2vec构建了一个通过上下文来预测单词概率的任务。它的思路是:设置一个滑动窗口(比如5),当滑动窗口滑过文章时,出现在滑动窗口中的几个单词,掩盖住其中一个,通过其他单词来预测被掩盖的那个单词。 16487014636952.jpg

上图展示了经典的word2vec模型,对于V个单词,通过滑动窗口选中若干连续单词,这几个单词经过Hidden layer(隐藏层)后,再次映射到V个单词上,预测每个单词的概率,如果目标单词的概率最高,则说明这个网络可以很好地对单词进行预测,也就是隐藏层很好地表达了目标单词。 上面这个模型是word2vec中的CBOW方法,Mikolov还提出了另一个对word做embedding的方法,即Skip-gram。与Skip-gram的结构与CBOW完全一致,仅仅是任务不同,它会在滑动窗口中掩盖大多数单词,仅保留一个单词,用这个单词去预测其他被掩盖的单词。下图展示了这两种方法的区别。

16487017740986.jpg

因为在全量单词空间预测概率是个非常耗时的事情,因此word2vec分别使用了Hierarchical Softmax(层次化Softmax)和Negative Sampling(负采样)对目标进行近似处理,减少目标预测的任务量。其中Hierarchical Softmax使用哈夫曼树对单词进行编码,使得高频词更容易被采样到,从而从整体上减少对目标单词的预测任务。而Negative Sampling则是通过采样一定的负例(非目标单词),减少对全量负例的训练。

由于Hierarchical Softmax方法并不能很好地进行并行化,因此,当今的embedding模型中,大部分优化方式都是Negative Sampling,Hierarchical Softmax在深度学习中并不常见。以上两种优化方法包含在常用的机器学习训练包里,直接使用即可。

from gensim.test.utils import common_texts
from gensim.models import Word2Vec

model = Word2Vec(sentences=common_texts, vector_size=100, window=5, min_count=1, workers=4)
model.save("word2vec.model")
复制代码

需要注意的是,虽然大量的深度学习会用到embedding的概念,但是作为embedding始祖的word2vec,本身却并不是深度学习模型,因为它的模型里仅包含一层隐层。

embedding的思路非常好地在物体的现实表达和数值化表达构建出一个桥梁。它的精髓在于构建一个合理的任务,在训练任务的过程中,得到向量化的副产品。作为范本,word2vec很好地展现了这一思路,那之后,embedding的应用便在机器学习领域如火如荼地兴起了。

推荐系统中的经典embedding模型

embedding的思路在推荐系统里非常有意义:若用户和物品能够在同一向量空间被训练出来,那么就可以计算用户和物品的相似性,从而为用户推荐了。

DSSM

DSSM全称为Deep Structured Semantic Model(深度结构化语义模型),是由微软研究院在2013年开发的,其出处见论文[3]。该模型原用于搜索引擎,用于对query(查询词)和文章的匹配。我们来回顾下整个DSSM算法:

Screen Shot 2022-04-11 at 3.33.24 PM.png

DSSM网络如上图所示。它的原理比较简单,通过搜索引擎中的Query(Q)和Document(D)之间的曝光点击日志做样本,使用深度网络来训练模型,最终将Query和Embedding表达成128维的向量,并使用余弦距离来计算两者相似度,判断点击概率。该模型最终训练点击概率,同时也得到了副产物--128维向量,用于表达query和文档。

上图中,网络中几层向量含义如下:

  1. Term Vector:表示原始词向量,即500K的单词表。
  2. Word Hashing:该层是很独特的一层,论文中对原始词表进行了特殊处理,在英文语境下,采用letter-ngams来对单词进行切分,采用tri-gram(即三个字母一切分)的方式。比如#good#可以切分为(#go, goo, ood, od#)四个,由于英文只有26个字母,加上首尾标识#,其排列组合数目有限,可以对原始词表进行有效降维,因此本层维度被降至30k。需要注意的是,如果是中文语境,则使用单字即可(因为单字组成的词组数量反倒不可控)。
  3. 接下来的三层是特征提取层,是普通的DNN网络,每层公式如下:
l i = f ( W i l i 1 + b i ) y = f ( W N l N 1 + b N ) l_i = f(W_il_{i-1}+b_i) \\ y = f(W_Nl_{N-1}+b_N)
每层使用tahn作为激活函数:
$$
f(x) = \dfrac{1 - e^{-2x}}{1 + e^{-2x}}
$$
最终将原始的向量层转化为128维向量。注意此处$W_i$在Query和Doc处是完全共享的,这样保证了Query和Doc最后被映射到同一个空间中,相互计算相似度才有意义。
复制代码
  1. 匹配层:现在query和doc都转化成128维向量,接下来通过用户点击行为做正负样本,来计算两者相似度:
    R ( Q , D ) = c o s i n e ( y Q , y D ) = y Q T y D y Q y D R(Q, D) = cosine(y_Q, y_D) = \frac{y_Q^Ty_D}{\Vert y_Q \Vert \Vert y_D \Vert}
    再对负样本(浏览未点击样本)按照正负1:4比例进行采样,再对正样本的相似度结果进行softmax。
    P ( D + Q ) = e x p ( γ R ( Q , D + ) ) D D e x p ( γ R ( Q , D ) ) P(D^+|Q) = \frac{exp(\gamma R(Q, D^+))}{\sum_{D' \in D}{exp(\gamma R(Q, D))}} \\
    其中, γ \gamma 为平滑因子,D为文档样本。
  2. 训练:训练过程中,通过极大似然估计对网络权重进行迭代调整,最小化损失函数为L( λ \lambda ) = -log Q , D + P ( D + Q ) \prod_{Q,D^+}{P(D^+|Q)}

DSSM已经属于深度学习的范畴,相对于word2vec,它是有监督的学习方式,更为准确;n-gram方式可以较好地处理新词问题;且由于计算出的query的embedding与Doc的embedding在同一个向量空间,因此能计算它们的相似度。这个特性在功能上有很多想象空间,在文档召回和粗排阶段都可以使用。但是DSSM也有它的缺点,首先,它采用词袋模型,没有考虑词的位置关系,这对语义理解是一个大的损失(所以后续又有了CNN-DSSM [ 5 ] ^{[5]} 、LSTM-DSSM [ 6 ] ^{[6]} ,等变种模型,用于对原始词进行语义和语序映射);此外,采用端到端的模型,预测结果不可控。

由于DSSM本身涉及到文档相关性排序,与推荐场景不谋而合,因此在DSSM诞生之后不久就被引入到推荐领域中。推荐领域的DSSM是使用两个独立的复杂网络来分别构建用户和物品的特征,最后用用户embbedding和物品embedding进行相似性计算来构建目标。由于用户和物品分别使用一个网络,因此DSSM也称为双塔模型。

推荐系统的DSSM模型大致如下:

16482557085271.jpg

与最早的DSSM不同,推荐系统的DSSM对用户和物品分别构建深度网络,是两个独立的塔,两者在最后一层进行余弦距离计算,通过引入大量的用户和物品特征,完成复杂网络的训练。

在线上召回阶段,当线上来了用户请求之后,按理应该对当前用户和物品分别走一遍双塔模型,进行目标预估,再根据预估结果进行排序,并截取概率最高的几百物品。但线上物品的动辄千万,使得该方案在性能上无法得到保障,这也是许多深度学习模型线下表现很好,但无法在线上大规模应用的原因。 在实际应用中,DSSM的产出实际是用户embedding和物品embedding,它们被保存在内存数据库中,线上按照向量相似度进行检索(线上召回方案一般使用ANN做近似检索,详见下文),这一方法是对效果和性能进行了折中,考虑到用户和物品经过历史数据充分训练后,其在短时间内的变化不大,牺牲一些效果,却能换取性能上的巨大提升,这也是DSSM能够在工业界风靡一时的原因。

双塔模型的另一个好处在于用户和物品完全分离建塔,不涉及到交叉特征,从模型角度看,这种方式牺牲了组合特征带来的效果提升,但由于在线上服务时,每个塔可以单独服务,用户和物品都有各自的表达。以协同过滤的思想来看,它能提供的召回方式及其丰富,既可以做u2i(直接查找用户相似物品)的召回,也可以i2i的召回(查找用户感兴趣物品的相似物品),甚至可以做u2u2i的召回。工业界较为有名的是百度 [ 7 ] ^{[7]} 和谷歌 [ 8 ] ^{[8]} 的双塔模型,感兴趣的朋友可以进行扩展阅读。

YouTube的深度学习网络

YouTube的《Deep Neural Networks for YouTube Recommendations》 [ 9 ] ^{[9]} (2016)是使用Embedding进行推荐的开山之作,在当年还没有大量深度学习应用到推荐系统的背景下,YouTube的作品可谓十分惊艳。论文中对深度学习在召回和排序中的应用都进行了详尽阐述。本文简单介绍下召回中的使用方式。

下图是YouTube的DNN召回模型架构,它以对用户观看的下一个视频时长为目标进行训练。这是一个经典的多层DNN网络图。输入层对用户历史看过的视频和搜索过的词进行embedding,同时结合用户的人口统计学特征以及其他相关特征,如性别、年龄、地域、设备等信息,将这些统一组合成一条长龙向量。

16484410778907.jpg

该向量经过几层Relu之后,与全站视频相连接,预测用户会看哪一个,相当于一个多分类器。出于性能考虑,对负样本进行了采样处理。在模型最后得到user embedding和item embedding,用于线上预估。

Youtube的模型看起来并不复杂,其经典之处,在于它本身进行了大量细致化的处理,给后人很多启发,我们详细展开看看:

  1. user embedding和item embedding究竟是如何生成的?与DSSM不同,YouTube模型中user embedding和video embedding并非是同样维度的向量,其中user embedding是三层ReLU之后最后一层的结果,假设是长度为d的向量;而video embedding则是ReLU结果与全量video(假设有N个)连接的权重系数,可以看作是d * N维矩阵,user embedding与video embedding相乘后softmax的结果,就是N维向量,表达的是观看每个视频的概率,按照该概率排序即可。实际应用时,video embedding在离线训练后存入内存数据库,而user embedding则在线上请求时,走一遍模型,实时得到,线上依然使用ANN的方式快速召回。
  2. 特征的处理:模型输入都是用户特征,对用户历史观看视频和搜索词进行embedding,地域和设备类信息同样被embedding,而其他类特征如年龄、性别、登录状态等则归一化到[0,1],除了归一化值,还对值取平方或开根号,目地是想捕获特征的非线性,以取得更好的效果。此处需要注意人口统计学特征的重要性,对于新用户来说,可能仅仅具备该类特征,有了这类特征,才能够为新用户生成embedding。
  3. 在样本处理上,对每个用户提取了等量训练样本,这是为了防止极度活跃用户对模型loss产生过多影响。
  4. 特殊的特征:example age。表示视频从发布距用户观看的时间,这个特征的引入是考虑到:从业务角度看,用户更倾向于看新视频,但实际上老视频由于曝光时间充分,能够得到更多表现,因此更容易被推荐,为了消除业务和模型上的偏差,在模型中引入视频发布的时长,即example age。在线上模型预估时,则将example age置为0,对所有视频同等对待。对广告熟悉的朋友知道,在广告模型训练时,会引入广告曝光的位置,以消除越靠前广告点击率越高的偏差。这个思路与example age是殊途同归的。这个思路非常有价值,值得被其他推荐系统借鉴采用。

YouTube的召回模型尽管不如DSSM在当下那么盛行,但它在工程上做的许多细致处理在如今仍然值得吸收和借鉴。

Item Embedding

Item Embedding是将物品进行向量化,继而将物品向量用于推荐领域的方法。Item Embedding最早起源于微软2016年的作品 [ 11 ] ^{[11]} ,它扩展了word2vec的应用范围,使得其从NLP领域拓展到推荐领域。

Item Embedding的思路很新奇,它的关键之处在于对问题的建模,认为:每个用户session内按时间顺序点击/下单的商品,具有一定关联,就像同一篇文章中的word一样。这样每个用户操作的物品集(Item Set)通过时间先后排序,就产生了句子,使用滑动窗口遍历句子,即可以使用word2vec一样的方法,对item进行向量化了。Item向量化之后,就可以用于基于Item的协同过滤中,进而进行推荐了。

微软的工作非常有工程借鉴意义,在我们日常推荐系统中,可以采用类似的将会话域中的若干实体(物品,发布者,搜索词,类目等)进行组合,再施以word2vec的方法,就可以对实体进行embedding了。

微软之后,房源租赁平台Airbnb在2018年也发表了对listing(Airbnb的物品是它们的在线房源)进行Embedding的方法 [ 12 ] ^{[12]} 。其思路仍然是对用户session内的房源listing进行滑动窗口遍历,再构建word2vec模型,但Airbnb结合其自身的业务场景,增加了许多策略处理,如对下单的房源进行额外的预测,负采样时按地理位置进行局部负采样,等。这篇论文在工程和业务上有许多有趣的思考,感兴趣的朋友可以仔细读读。

图Embedding

图Embedding是embedding近年来较为流行的研究领域,通过对大规模图的节点或子图进行embedding,从而能够使用向量对图进行表达和关系计算,在推荐和风控领域都有实用价值。

图embedding的思路基本来自word2vec或doc2vec [ 10 ] ^{[10]} (doc2vec是在word2vec基础上加入文档id,从而在训练过程中对文档整体进行了embedding化,详见本系列前文介绍过的doc2vec,关键在于如何能将图结构变化成文档中word词的形式。

DeepWalk

DeepWalk [ 12 ] ^{[12]} 是2014年被提出的模型,是Graph Embedding中的经典模型。它为图结构转化成word2vec输入结构打开了思路。DeepWalk的建模思路如下:同一个图中,相近的节点可以认为是相似的。对每个节点,采取截断式随机游走的方式,把节点的局部拓扑信息转换为序列信息,如下图所示:

16487039665326.jpg

假设原始图中有A到H共8个节点,结构如上面左图所示,设置截断距离,从某节点出发,随机游走,就可以得到节点序列。注意:图为无向图,每个节点到其他节点的概率与该节点的连通节点个数相关。假设从A点出发,以1/2概率游走到C点,C以1/3概率游走到E点......,这样就构建出一个长度为5的序列,通过大量的随机游走,就得到了足够的输入样本序列,接着把word2vec模型应用到样本序列上,就可以学习的到每个节点的embedding表示。

从推荐系统应用角度看,DeepWalk算法和微软的Item Embedding大同小异。不同之处在于微软的Item Embedding将每一条序列限定在同一个用户的物品操作集合里。而图的构建则可以跨越这个限制,通过对不同用户访问物品间构建关联,则可以构建出一个足够大的图,继而使用DeepWalk算法来对物品进行embedding了。

EGES

EGES(Enhanced Graph Embedding with Side information)是淘宝提出的一套游走算法,它在DeepWalk基础上引入Side Information,如品牌、类目、价格等信息,其目标在于能够对冷启动的物品进行更好的embedding表示。EGES的图构建部分与DeepWalk相似,其新增的关键部分如下图:

16488823065850.jpg

其中SI 0表示item自身,SI 1到SI n表示item不同的描述性信息,如品牌、类目、价格等,即所谓的Side Information。因为每类物品附加信息重要度不同(如苹果手机用户更看重品牌,而衣物类商品用户可能更看重价格),因此对每个SI都进行加权平均,再聚合在一起,形成初始化的embedding H。输出层则直接对所有item进行softmax概率预测,对负样本进行降采样即可。

除了上述算法,图Embedding还有Node2Vec算法,根据参数调节,来捕获同质子网络或是结构相似子网络,但一般应用于风控场景;还有LINE算法,它对节点的一阶亲密度和二阶亲密度进行建模,再进行拼接而构成最终embedding,同样用于风控场景。

线上召回机制

当实体embedding之后,如何在海量向量中高效查找近邻实体,是非常关键的问题,可以说,正是由于该问题得到妥善解决,才使得embedding技术能在推荐系统中得到迅猛发展。向量召回从实践上来说属于工程范畴,但由于其中涉及到巧妙的算法设计,这里做一个简要介绍。

高维向量检索技术使用的是ANN,即Approximate Nearest Neighbor搜索,它并不是某个算法,而是指一系列用于解决近邻查找问题的算法。ANN包括基于暴力的方法,基于树的方法,哈希方法和基于图的方法,以及向量量化的方法 [ 14 ] ^{[14]} 。工程实践中常用的成熟第三方库包括Facebook开源的Faiss和Zilliz开源的Milvus。其中Milvus提供了各类向量检索方案,且能满足高性能,强实时性要求。Faiss作为开源多年的常用库,能满足大部分的研究和实时性要求不是特别高的场景。Faiss使用的是向量量化方法中的PQ(Product Quantization,乘积量化)来对存储进行压缩,并使用IVFPQ来实现高效检索。

PQ是将对高维向量进行压缩的一种算法。如下图所示,N个D维向量,每个向量都划分为M(通常取8)段,每一段使用K-means算法进行聚类,聚成K个中心点,每一段的向量都使用其聚类中心表示,这样就压缩了向量的表达空间。K通常取256,使用8bits可以表达,这样每一段就变为8位向量空间,最终向量从N * D * 32bit的空间,压缩成了N * M * 8bit的空间。

16495071080046.jpg

当计算query与空间中某个向量x的距离时,可以计算该query所在聚类中心与x所在聚类中心的距离,该距离可线下计算好,因此在线查询的效率很高;另外,也可以计算query本身与x所在聚类中心的距离,需要线上计算,查询效率相对低,但更准确。 从性能上看,若要查找最相近的k个邻居,PQ仍然是不够的,因为仍需要遍历M*K次。IVFPQ在PQ基础上对这个问题进行了很好的解决。它的思路是,先对N个向量进行K个聚类,每个聚类中心索引其类内向量。查找时,先对聚类中心进行遍历,找到最近的聚类中心,再进行类内PQ查询。IVFPQ在每个聚类内部进行向量压缩构建时,做了一些细致化处理,如下图所示:聚类之后,在每个类内,先将向量进行处理,不保存原始向量,而保存原始向量与所在聚类中心的差值,PQ则针对差值向量进行。这一做法的背后思想是:差值之间的方差相较原始向量之间的方差更小,因此在差值向量上进行聚类和近似表达,所带来的误差会更小。

16496595100160.jpg

使用faiss进行向量构建和查找的代码如下:

import faiss 
index = faiss.IndexIVFPQ(quantizer, d, nlist=100, m=4, 8) #构建索引,每个向量都被编码为8个字节大小
index.train(xb) 
index.add(xb) #添加向量
D, I = index.search(xq, k) #搜索top k个向量
复制代码

faiss作为成熟的工业界开源应用,把PQ推向了前台。但PQ本身存在着较大的精度损失。向量检索目前趋势是向图索引发展,比较有代表性的是hnsw算法,它将基于“邻居的邻居也是邻居”的思想,由疏到密构建了多层图,从而提升查询的效率。Milvus有基于hnsw的实现。感兴趣的朋友可以进行深入阅读。

总结

embedding由于能够广泛融合各类特征,更好地学习到用户和物品的抽象化表达,同时能够通过深度学习网络抓住用户和物品的交互特征,所以在推荐系统上具有非常好的性能。

作为深度学习在推荐领域落地的一个代表性应用,embedding尽管兴起时间不长,但从工业界视角看,已经成为推荐系统在召回领域的基础构件之一。同时,学术界与工业界对embedding的研究一直如火如荼地进行,使得当今时代的推荐系统,几乎言必称embedding。

今天介绍的DSSM和YouTube,以及微软的item embedding都是embedding的杰出代表,尤其是DSSM,由于其思路简单,效果显著,在很多公司都得到了落地应用。而图计算的发展则将推荐系统的embedding带入了一个新天地。当然,复杂模型所带来的工程挑战同样不可忽略。以Faiss和Milvus为代表的ANN召回算法,为这些模型的线上部署提供了极大的便利。

需要注意的是,推荐系统没有万灵丹,embedding也有其自身的局限性。它存在着新用户和新物品冷启动的问题,以及深度学习一向存在的可解释性问题。同时,由于embedding过分关注用户与物品的交互,则在一定程度上损失了对用户和物品的内容结构上的捕获与表达。 因此,在推荐系统的召回应用时,仍然需要考虑业务场景来选择合适的方法与特征。

参考文献 [1] Efficient Estimation of Word Representations in Vector Space, Tomas Mikolov, Kai Chen, Greg Corrado, Jeffrey Dean, arxiv.org/abs/1301.37… [2] Distributed Representations of Words and Phrases and their Compositionality. T. Mikolov, I. Sutskever, K. Chen, G. Corrado, and J. Dean. dl.acm.org/doi/10.5555… [3] Huang P S, He X, Gao J, et al. Learning deep structured semantic models for web search using clickthrough data[C]// ACM International Conference on Conference on Information & Knowledge Management. ACM, 2013:2333-2338. [4] 词袋模型-维基百科. zh.wikipedia.org/wiki/%E8%AF… [5] Yelong Shen, Xiaodong He, Jianfeng Gao, Li Deng, Grégoire Mesnil. A Latent Semantic Model with Convolutional-Pooling Structure for Information Retrieval.www.microsoft.com/en-us/resea… [6] H. Palangi, L. Deng, Y. Shen, J. Gao, X. He, J. Chen, X. Song, R. Ward. Semantic Modelling with Long-Short-Term Memory for Information Retrieval. arxiv.org/pdf/1412.66… [7]《Al筑巢;机器学习在凤巢的深度应用》, 百度 刘斌新, www.docin.com/p-247202565…. [8]Sampling-Bias-Corrected Neural Modeling for Large Corpus Item Recommendations. Xinyang Yi, Ji Yang, Lichan Hong, Derek Zhiyuan Cheng, Lukasz Heldt, Aditee Kumthekar, Zhe Zhao, Li Wei, Ed Chi. dl.acm.org/doi/10.1145… [9] Deep Neural Networks for YouTube Recommendations. Paul Covington, Jay Adams, Emre Sargin. static.googleusercontent.com/media/resea… [10] Distributed Representations of Sentences and Documents. Quoc Le, Tomas Mikolov. 2014. [11] Item2vec: Neural Item Embedding for Collaborative Filtering. Oren Barkan, Noam Koenigstein. ceur-ws.org/Vol-1688/pa… [12] DeepWalk: Online Learning of Social Representations. Bryan Perozzi, Rami Al-Rfou, Steven Skiena. arxiv.org/abs/1403.66…. [13] Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba. KDD 2018. arxiv.org/abs/1803.02… [14]一文纵览KNN(ANN)向量检索。zhuanlan.zhihu.com/p/264367144

猜你喜欢

转载自juejin.im/post/7104256908189499422