参考自《深度学习推荐系统》——王喆,用于学习和记录。
介绍
Embedding,中文直译为“嵌入”,常被翻译为“向量化”或者“向量映射”。它的主要作用是将稀疏向量转换成稠密向量,便于上层深度神经网络处理。事实上,Embedding技术的作用远不止于此,它的应用场景非常多元化,而且实现方法也各不相同。
在学术界,Embedding本身作为深度学习研究领域的热门方向,经历了从处理序列样本,到处理图样本,再到处理异构的多特征样本的快速进化过程。在工业界,Embedding技术凭借其综合信息的能力强、易于上线部署的特点,几乎成了应用最广泛的深度学习技术。
什么是Embedding
形式上讲,Embedding就是用一个低维稠密的向量“表示”一个对象(object),这里所说的对象可以是一个词、一个商品,也可以是一部电影,等等。其中“表示”这个词的含义需要进一步解释。“表示”意味着Embedding向量能够表达相应对象的某些特征,同时向量之间的距离反映了对象之间的相似性 。
词向量的例子
Embedding方法的流行始于自然语言处理领域对于词向量生成问题的研究。
在词向量空间内,甚至在完全不知道一个词的向量的情况下,仅靠语义关系加词向量运算就可以推断出这个词的词向量。Embedding就是这样从另外一个空间表达物品,同时揭示物品之间的潜在关系的,某种意义上讲,Embedding方法甚至具备了本体论哲学层面上的意义。
Embedding 技术在其他领域的扩展
既然Embedding能够对“词”进行向量化,那么其他应用领域的物品也可以通过某种方式生成其向量化表示。
例如,如果对电影进行Embedding,那么Embedding(复仇者联盟)和Embedding(钢铁侠)在Embedding向量空间内两点之间的距离就应该很近,而 Embedding(复仇者联盟)和Embedding(乱世佳人)的距离会相对远。
同理,如果在电商领域对商品进行Embedding,那么Embedding(键盘)和Embedding(鼠标)的向量距离应该比较近,而Embedding(键盘)和Embedding(帽子)的距离会相对远。
与词向量使用大量文本语料进行训练不同,不同领域的训练样本肯定是不同的,比如视频推荐往往使用用户的观看序列进行电影的Embedding化,而电商平台则会使用用户的购买历史作为训练样本。
Embedding 技术对于深度学习推荐系统的重要性
(1)推荐场景中大量使用one-hot编码对类别、id型特征进行编码,导致样本特征向量极度稀疏,而深度学习的结构特点使其不利于稀疏特征向量的处理,因此几乎所有深度学习推荐模型都会由Embedding层负责将高维稀疏特征向量转换成稠密低维特征向量。因此,掌握各类Embedding技术是构建深度学习推荐模型的基础性操作。
(2)Embedding本身就是极其重要的特征向量。相比MF等传统方法产生的特征向量,Embedding,Graph Embedding,Embedding几乎可以引入任何信息进行编码,使其本身就包含大量有价值的信息。在此基础上,Embedding向量往往会与其他推荐系统特征连接后一同输人后续深度学习网络进行训练。
(3)Embedding对物品、用户相似度的计算是常用的推荐系统召回层技术。在局部敏感哈希(Locality-SensitiveHashing)等快速最近邻搜索技术应用于推荐系统后,Embedding更适用于对海量备选物品进行快速“初筛”,过滤出几百到几千量级的物品交由深度学习网络进行“精排”。
所以说,Embedding技术在深度学习推荐系统中占有极其重要的位置,熟悉并掌握各类流行的Embedding方法是构建一个成功的深度学习推荐系统的有力武器。
Word2vec——经典的 Embedding 方法
Word2vec是“word to vector”的简称,顾名思义,Word2vec是一个生成对“词”的向量表达的模型。
为了训练Word2vec模型,需要准备由一组句子组成的语料库。假设其中一个长度为 T T T 的句子为 w 1 , w 2 , … , w T w_{1},w_{2},\dots,w_{T} w1,w2,…,wT ,假定每个词都跟其相邻的词的关系最密切,即每个词都是由相邻的词决定的(图中CBOW模型的王要原理),或者每个词都决定了相邻的词(图中Skip-gram模型的主要原理)。如图所示,**CBOW模型的输人是 ω t \omega_{t} ωt 周边的词,预测的输出是 ω t \omega_{t} ωt ,而Skip-gram则相反。经验上讲,Skip-gram的效果较好。
Word2vec 模型的训练过程
为了基于语料库生成模型的训练样本,选取一个长度为 2 c + 1 2c{+}1 2c+1 (目标词前后各选洗 c c c 个词)的滑动窗口,从语料库中抽取一个句子,将滑动窗口由左至石滑动,每移动一次,窗口中的词组就形成了一个训练样本。
有了训练样本,就可以着手定义优化目标了。既然每个词 w t w_{t} wt 都决定了相邻词 w t + j w_{t+j} wt+j ,基于极大似然估计的方法,希望所有样本的条件概率 p ( w t + j ∣ w t ) p(w_{t+j}|w_{t}) p(wt+j∣wt) 之积最大,这里使用对数概率。因此,Word2vec的目标函数如(式4-1)所示。
1 T ∑ t = 1 T ∑ − c ⩽ j ⩽ c , j ≠ 0 log p ( w t + j | w t ) \frac{1}{T}\sum_{t=1}^{T}\sum_{-c\leqslant j\leqslant c,j\neq0}\log p\left(w_{t+j}\middle|w_{t}\right) T1t=1∑T−c⩽j⩽c,j=0∑logp(wt+j∣wt)
接下来的核心问题是如何定义 p ( w t + j ∣ w t ) p(w_{t+j}|w_{t}) p(wt+j∣wt) ,作为一个多分类问题,最直接的方法是使用softmax函数。Word2vec的“愿景”是希望用一个向量 ν w \pmb{\nu}_{w} νw 表示词 w w w 用词之间的内积距离 ν i T ν j \pmb{\nu}_{i}^{\mathrm{~T~}}\pmb{\nu}_{j} νi T νj 表示语义的接近程度,那么条件概率 p ( w t + j ∣ w t ) p(w_{t+j}|w_{t}) p(wt+j∣wt) 的定义就可以很直观地给出,如下所示,其中 w O w_{O} wO 代表 w t + j w_{t+j} wt+j ,被称为输出词; w I w_{\mathrm{I}} wI 代表 w t w_{t} wt ,被称为输人词。
p ( W O ∣ W I ) = exp ( V w O ′ T V w I ) ∑ w = 1 W exp ( V w ′ T V w I ) p(\mathcal{W}_{O}|\mathcal{W}_{\mathrm{I}})=\frac{\exp\bigl({V_{w_{O}}^{\prime}}^{\mathrm{T}}V_{w_{\mathrm{I}}}\bigr)}{\sum_{w=1}^{W}\exp\big({V_{w}^{\prime}}^{\mathrm{T}}V_{w_{\mathrm{I}}}\big)} p(WO∣WI)=∑w=1Wexp(Vw′TVwI)exp(VwO′TVwI)
目标是用向量表示词,所以词的条件概率可以等价于向量内积距离的softmax函数,输出词和输入词向量的softmax概率就是输出词本身对输入词本身的条件概率
看到上面的条件概率公式,很多读者可能会习惯性地忽略这样一个事实,在Word 2 vec w t w_{t} wt 预测 w t + j w_{t+j} wt+j ,但其实二者的向量表达并不在一个向量空间内。就像上面的条件概率公式那样, V w O V_{w_{O}} VwO 和 V w I V_{w_{\mathrm{I}}} VwI 分别是词 w w w 的输出向量表达和输人向量表达。那什么是输入向量表达和输出向量表达呢?这里用Word2vec的神经网络结构图来做进一步说明。
根据条件概率 p ( w t + j ∣ w t ) p(w_{t+j}|w_{t}) p(wt+j∣wt) 的定义,可以把两个向量的乘积再套上一个softmax的形式,转换成上图所示的神经网络结构。
将条件概率转换成softmax的形式以后,word2vec模型就可以看成是一个简单的神经网络,输入层是输入词的向量表示,隐层是一个隐藏的非线性变换,输出层是通过softmax函数得到的词汇表中所有词的概率分布
用神经网络表示Word2vec的模型架构后,在训练过程中就可以通过梯度下降的方式求解模型参数。那么,输人向量表达就是输入层(input layer)到隐层(hidden layer)的权重矩阵 w V × N \pmb{w}_{V\times N} wV×N ,而输出向量表达就是隐层到输出层(output layer)的权重矩阵 w N × V ′ {\pmb{w}}_{N\times V}^{\prime} wN×V′ 。
在获得输人向量矩阵 w V × N \pmb{w}_{V\times N} wV×N 后,其中每一行对应的权重向量就是通常意义上的“词向量”。于是这个权重矩阵自然转换成了Word2vec的查找表(lookuptable)(如图4-4所示)。例如,输人向量是10000个词组成的one-hot向量,隐层维度是300维.那么输入层到隐层的权重矩阵为 10000 × 300 10000{\times}300 10000×300 维。在转换为词呵量查找表后,每行的权重即成了对应词的Embedding向量。
word2vec训练过程中得到的输入权重矩阵也就是查找表,每一行对应于词汇表中一个词的词向量,因此,当我们有一个词的索引时,可以直接从查找表中检索对应的词向量,而不需要再进行复杂的计算
Word2vec 的 “负采样” 训练方法
事实上,完全遵循原始的Word2vec多分类结构的训练方法并不可行。假设语料库中的词的数量为10000.就意味着输出层神经元有10000个,在每次送代更新隐层到输出层神经元的权重时,都需要计算所有字典中的所有10000个词的预测误差(predictionerror),在实际训练过程中几乎无法承受这样巨大的计算量。
Word2vec,往往采用负采样(Negative Sampling)的方法进行训练。相比原来需要计算所有字典中所有词的预测误差,负采样方法只需要对采样出的几个负样本计算预测误差。在此情况下,Word2vec模型的优化自标从一个多分类问题退化成了一个近似二分类问题,如下所示。
E = − l o g σ ( v w o ′ T h ) − ∑ w j ∈ W n e g l o g σ ( − v w j ′ T h ) E=-\mathrm{log}\sigma\big({v_{w_{o}}^{\prime}}^{\mathrm{T}}h\big)-\sum_{w_{j}\in W_{\mathrm{neg}}}\mathrm{log}\,\sigma\left(-{v_{w_{j}}^{\prime}}^{\mathrm{T}}h\right) E=−logσ(vwo′Th)−wj∈Wneg∑logσ(−vwj′Th)
其中 v w O ′ \pmb{v}_{w_{O}}^{\prime} vwO′ 是输出词向量(即正样本), h \pmb{h} h 是隐层向量, W n e g W_{\mathrm{neg}} Wneg 是负样本集合, v w j ′ \pmb{v}_{w_{j}}^{\prime} vwj′ 是负样本词向量。由于负样本集合的大小非常有限(在实际应用中通常小于10),在每轮梯度下降的选代中,计算复杂度至少可以缩小为原来的1/1000(假设词表大小为10000)。
Word2vec 对 Embedding 技术的奠基性意义
Word2vec对深度学习时代Embedding方向的研究具有奠基性的意义。 在Word2vec的研究中提出的模型结构、目标函数、负采样方法及负采样中的目标函数,在后续的研究中被重复使用并被屡次优化。掌握Word2vec中的每一个细节成了研究Embedding的基础。
Item2vec——Word2vec 在推荐系统领域的推广
在Word2vec诞生之后,Embedding的思想迅速从自然语言处理领域扩散到几乎所有机器学习领域,推荐系统也不例外。既然Word2vec可以对词“序列”中的词进行Embedding,那么对于用户购买“序列”中的一个商品,用户观看“序列”中的一个电影,也应该存在相应的Embedding方法,这就是Item2vecl方法的基本思想。
Iten2vec 的基本原理
相比 Word2vec 利用“词序列”生成词 Embedding。Item2vec 利用的"物品序列”是指由特定用户的浏览、购买等行为产生的历史行为记录序列。
假设 Word2vec 中一个长度为 T T T 的句子为 w 1 , w 2 , … , w T w_{1},w_{2},\dots,w_{T} w1,w2,…,wT ,则其优化百标如上节所示;假设 Item2vec 中一个长度为 K K K 的用户历史记录为 ω 1 , ω 2 , … , ω K \omega_{1},\omega_{2},\dots,\omega_{K} ω1,ω2,…,ωK ,尖比Word2vec,Item2vec的优化目标如下所示。
1 K ∑ i = 1 K ∑ j ≠ i K log p ( w j ∣ w i ) \frac{1}{K}\sum_{i=1}^{K}\sum_{j\neq i}^{K}\log p\big(w_{j}|w_{i}\big) K1i=1∑Kj=i∑Klogp(wj∣wi)
通过观察两者的区别会发现,Item2vec与word2vec唯一的不同在干Item2vec编弃了时间窗口的概念,认为序列中任息网个物品郁相大,因此在Item2vec的自标函数中可以看到,其是网网物品的对数概率的和,而不仅是时间窗口内物品的对数概率之和。
在优化目标定义好之后,Item2vec剩余的训练过程和最终物品Embedding的产生过程都与word2vec完至一敏.最终物品向量的查找表就是Word2vec中词向量的查找表。
“广义”的 Item2vec
事实上,Embedding对物品进行向量化的方法远不止Item2vec。广义上讲,任何能够生成物品向量的方法都可以称为Item2vec。典型的例子是曾在百度、Facebook等公司成功应用的双塔模型(如下所示)。
在广告场景下的双塔模型中,广告侧的模型结构实现的其实就是对物品进行Embedding的过程。该模型被称为“双塔模型”,因此以下将广告侧的模型结构称为“物品塔”。那么,“物品塔”起到的作用本质上是接收物品相关的特征向量。经过物品塔内的多层神经网络结构,最终生成一个多维的稠密向量。从Embedding的角度看,这个稠密向量其实就是物品的Embedding向量,只不过Embedding模型从Word2vec变成了更为复杂灵活的“物品塔”模型,输人特征由用户行为序列生成的onle-hot特征向量,变成了可包含更多信息的、全面的物品特征问量。二者的最终目的都是把物品的原始特征转变为稠密的物品Embedding向量表达,因此不管其中的模型结构如何,都可以把这类模型称为“广义”上的Item2vec类模型。
双塔模型通过各自的神经网络学习用户和物品的复杂特征表示,然后分别生成用户的Embedding向量和物品的Embedding向量,用于计算用户和物品之间的相似度,从而进行排序或推荐
Item2vec 方法的特点和局限性
Item2vec作为Word2vec模型的推广,理论上可以利用任何序列型数据生成物品的Embedding向量,这大大拓展了Word2vec的应用场景。广义上的Item2vec模型其实是物品向量化方法的统称,它可以利用不同的深度学习网络结构对物品Embedding。
Item2vec方法也有其局限性,因为只能利用序列型数据,所以Item2vec在处理互联网场景下大量的网络化数据时往往显得捉襟见肘,这就是GraphEmbedding出现的动因。
Graph Embedding——引入更多结构信息的图嵌入技术
Word2vec,Item2vec Embedding,二者都是建立在“序列”样本(比如句子、用户行为序列)的基础上的。在互联网场景下,数据对象之间更多呈现的是图结构。典型的场景是由用户行为数据生成的物品关系图,以及由属性和实体组成的知识图谱(Knowledge Graph)。
在面对图结构时,传统的序列Embedding方法就显得力不从心了。在这样的背景下,GraphEmbedding成了新的研究方向,并逐渐在深度学习推荐系统领域流行起来。
Graph Embedding Embedding。最终生成的节点Embedding向量一般包含图的结构信息及附近节点的局部相似性信息。不同GraphEmbedding方法的原理不尽相同,对于图信息的保留方式也有所区别,下面就介绍几种主流的GraphEmbedding方法和它们之间的区别与联系。
DeepWalk——基础的Graph Embedding方法
它的主要思想是在由物品组成的图结构上进行随机游走,产生大量物品序列,然后将这些物品序列作为训练样本输人Word2vec进行训练,得到物品的Embedding。可以看作一个过渡方法。
(1)(a)是原始的用户行为序列。
(2)(b)基于这些用户行为序列构建了物品关系图。可以看出,物品A和B之间的边产生的原因是用户 U 1 \mathrm{U}_{1} U1 先后购买了物品A和物品B。如果后续产生了多条相同的有向边,则有向边的权重被加强。在将所有用户行为序列都转换成物品关系图中的边之后,全局的物品关系图就建立起来了。
(3)(c)采用随机游走的方式随机选择起始点,重新产生物品序列。
(4)将这些物品序列输入(d)所示的Word2vec模型中,生成最终的物Embedding。
在上述DeepWalk的算法流程中,唯一需要形式化定义的是随机游走的跳转概率,也就是到达节点 ν i \nu_{i} νi 后,下一步遍历 ν i \nu_{i} νi 的邻接点 ν j \nu_{j} νj 的概率。如果物品关系图是有向有权图,那么从节点 ν i \nu_{i} νi 跳转到节点 ν j \nu_{j} νj 的概率定义如下所示。
P ( v j ∣ v i ) = { M i j ∑ k ∈ N + ( v i ) M i k if v j ∈ N + ( v i ) 0 if e i j ∉ ε P(v_j | v_i) = \begin{cases} \frac{M_{ij}}{\sum_{k \in N_+(v_i)} M_{ik}} & \text{if } v_j \in N_+(v_i) \\ 0 & \text{if } e_{ij} \notin \varepsilon \end{cases} P(vj∣vi)={∑k∈N+(vi)MikMij0if vj∈N+(vi)if eij∈/ε
其中ε是物品关系图中所有边的集合, N + ( ν i ) N_{+}(\nu_{i}) N+(νi) 是节点 ν i \nu_{i} νi 所有的出边集合, M i j M_{i j} Mij 是节点 ν i \nu_{i} νi 到节点 ν j \nu_{j} νj 边的权重,即DeepWalk的跳转概率就是跳转边的权重占所有相关出边权重之和的比例。
如果物品关系图是无向无权图,那么跳转概率将是一个特例,即权重 M i j M_{i j} Mij 将为常数1,且 N + ( ν i ) N_{+}(\nu_{i}) N+(νi) 应是节点 ν i \nu_{i} νi 所有“边”的集合,而不是所有“出边”的集合。
Node2vec——同质性和结构性的权衡
斯坦福大学的研究人员在DeepWalk的基础上更进一步,提出了Node2vec模型,它通过调整随机游走权重的方法使GraphEmbedding的结果更(homophily)或结构性(structural equivalence)。
具体地讲,网络的“同质性”指的是距离相近节点的Embedding应尽量近似,如图所示,节点 u u u 与其相连的节点 s 1 , s 2 × s 3 × s 4 s_{1},\ s_{2}\times\ s_{3}\times\ s_{4} s1, s2× s3× s4 Embedding接近的,这就是网络“同质性”的体现。
“结构性”指的是结构上相似的节点的Embedding应尽量近似,图中节点 U U U 和节点 s 6 s_{6} s6 都是各自局域网络的中心节点,结构上相似,其Embedding的表达也应该近似,这是“结构性”的体现。
为了使GraphEmbedding的结果能够表达网络的“结构性”,在随机游走的过程中,需要让游走的过程更倾向于BFS,因为BFS会更多地在当前节点的邻域中游走遍历,相当于对当前节点周边的网络结构进行一次“微观扫描”。当前节点是“局部中心节点”,还是“边缘节点”,或是“连接性节点”,其生成的序列包含的节点数量和顺序必然是不同的,从而让最终的Embedding抓取到更多结构性信息。
另外,为了表达“同质性”,需要让随机游走的过程更倾向于DFS,因为DFS更有可能通过多次跳转,游走到远方的节点上,但无论怎样,DFS的游走更大概率会在一个大的集团内部进行,这就使得一个集团或者社区内部的节点的Embedding更为相似,从而更多地表达网络的“同质性”。
那么在Node2vec算法中,是怎样控制BFS和DFS的倾向性的呢?主要是通过节点间的跳转概率。
从节点 ν \nu ν 跳转到下一个节点 x x x 的概率 π v x = α p q ( t , x ) ⋅ ω v x \pi_{v x}=\alpha_{p q}(t,x)\cdot\omega_{v x} πvx=αpq(t,x)⋅ωvx ,其中 ω v x \omega_{v x} ωvx 是边 ν x \nu x νx 的权重, α p q ( t , x ) \alpha_{p q}(t,x) αpq(t,x) 的定义如(式4-6)所示。
α p q ( t , x ) = { 1 p , 如果 d t x = 0 1 , 如果 d t x = 1 1 q , 如果 d t x = 2 \alpha_{p q}(t,x)=\left\{\begin{array}{l l}{\displaystyle\frac{1}{p},如果d_{t x}=0}\\ {\displaystyle1, 如果 d_{t x}=1}\\ {\displaystyle\frac{1}{q},如果d_{t x}=2}\end{array}\right. αpq(t,x)=⎩ ⎨ ⎧p1,如果dtx=01,如果dtx=1q1,如果dtx=2
其中, d t x d_{t x} dtx 指节点 t t t 到节点 x x x 的距离,参数 p p p 和 q q q 共同控制着随机游走的倾向性。参数 p p p 被称为返回参数(return parameter), p p p 越小,随机游走回节点t的可能性越大,Node2vec就更注重表达网络的结构性。参数 q q q 被称为进出参数(in-outparameter), q q q 越小,随机游走到远方节点的可能性越大,Node2vec就更注重表达网络的同质性;反之,则当前节点更可能在附近节点游走。
Node2vec这种灵活表达同质性和结构性的特点也得到了实验的证实,通过调整参数 p p p 和 q q q 产生了不同的Embedding结果。图(a)就是Node2vec更注重同质性的体现,可以看到距离相近的节点颜色更为接近,图(b)则更注重体现结构性,其中结构特点相近的节点的颜色更为接近。
Node2vec所体现的网络的同质性和结构性在推荐系统中可以被很直观的解释。同质性相同的物品很可能是同品类、同属性,或者经常被一同购买的商品,而结构性相同的物品则是各品类的爆款、各品类的最佳凑单商品等拥有类似趋势或者结构性属性的商品。毫无疑问,二者在推荐系统中都是非常重要的特征表达。由于Node2vec的这种灵活性,以及发掘不同图特征的能力,甚至可以把不同Node2 vec偏向"结构性"的”Embedding和偏向“同质性”的Embedding 结果共同输入后续的深度学习网络,以保留物品的不同图特征信息。
EGES——阿里巴巴的综合性 Graph Embedding 方法
单纯使用用户行为生成的物品相关图,固然可以生成物品的Embedding,但是如果遇到新加人的物品,或者没有过多互动信息的“长尾”物品,则推荐系统将出现严重的冷启动问题。为了使“冷启动”的商品获得“合理”的初始Embedding,阿里巴巴团队通过引入更多补充信息(side information)来丰富Embedding的来源,从而使没有历史行为记录的商品获得较合理的初始Embedding。
生成GraphEmbedding的第一步是生成物品关系图,通过用户行为序列可以生成物品关系图,也可以利用“相同属性”“相同类别”等信息建立物品之间的边,生成基于内容的知识图谱。而基于知识图谱生成的物品向量可以被称为补充信息Embedding向量。当然,根据补充信息类别的不同,可以有多个补充信息Embedding。
如何融合一个物品的多个Embedding向量,使之形成物品最后的Embedding呢?最简单的方法是在深度神经网络中加人平均池化层,将不同Embedding平均起来。为了防止简单的平均池化导致有效Embedding信息的丢失,阿里巴巴在此基础上进行了加强,对每个Embedding加上了权重(类似于DIN模型的注意力机制),如图所示,对每类特征对应的Embedding向量,分别赋予权重 a 0 , a 1 , . . . , a n a_{0},a_{1},...,a_{n} a0,a1,...,an 。图中的隐层表达(Hidden Representation)Embedding进行加权平均操作的层,将加权平均后的Embedding向量输人softmax层,通过梯度反向传播,求得每个Embedding的权重 a i ( i = 0 … n ) a_{i}(i{=}0{\ldots}n) ai(i=0…n)
图4-11EGES模型
在实际的模型中,阿里巴巴采用了 e a j \mathbf{e}^{a_{j}} eaj 而不是 a j a_{j} aj Embedding,笔者认为主要原因有二:一是避免权重为0;二是因为 ⋅ e a j \cdot\mathbf{e}^{a_{j}} ⋅eaj 在梯度下降过程中有良好的数学性质。
EGES并没有过于复杂的理论创新,但给出了一个工程上的融合多种Embedding的方法,降低了某类信息缺失造成的冷启动问题,是实用性极强的Embedding。
EGES是将不同补充信息的不同Embedding融合,得到能够降低信息缺失造成的冷启动的问题的Embedding,是否需要用到补充信息和如何使用都是结合实际场景来的。
时至今日,GraphEmbedding仍然是工业界和学术界研究和实践的热点,除Deep Walk、Node2vec、EGES等主流方法, L I N E [ 10 ] \mathrm{LINE}^{[10]} LINE[10] 、SDNEII等方法也是重要的GraphEmbedding模型。
Embedding 与深度学习推荐系统的结合
在推荐系统实践过程中,Embedding需要与深度学习网络的其他部分协同完成整个推荐过程。作为深度学习推荐系统不可分割的一部分,Embedding技术主要应用在如下三个方向。
(1)在深度学习网络中作为Embedding层,完成从高维稀疏特征向量到低维稠密特征向量的转换。
(2)作为预训练的Embedding特征向量,与其他特征向量连接后,一同输入深度学习网络进行训练。
(3)通过计算用户和物品的Embedding相似度,Embedding可以直接作为推荐系统的召回层或者召回策略之一。
下面介绍Embedding与深度学习推荐系统结合的具体方法。
深度学习网络中的 Embedding 层
高维稀疏特征向量天然不适合多层复杂神经网络的训练,因此如果使用深度学习模型处理高维稀疏特征向量,几乎都会在输人层到全连接层之间加人Embedding层,完成高维稀疏特征向量到低维稠密特征向量的转换。
可以清楚地看到,三个模型的Embedding层接收的都是类别型特征的one-hot 向量,转换的目标是低维的Embedding向量。所以在结构上,深度神经网络中的Embedding层是一个高维向量向低维向量的直接映射。
用矩阵的形式表达Embedding层,本质上是求解一个 m m m (输入高维稀疏向量的维度) × n \times n ×n (输出稠密向量的维度)维的权重矩阵的过程。如果输人向量是one-hot特征向量,则权重矩阵中的列向量为相应维度one-hot特征的Embedding向量。
将Embedding层与整个深度学习网络整合后一同进行训练是理论上最优的选择,因为上层梯度可以直接反向传播到输入层,模型整体是自洽的。但这样做的缺点是显而易见的,Embedding层输人向量的维度往往很大,导致整个Embedding层的参数数量巨大,因此Embedding层的加入会拖慢整个神经网络的收敛速度
正因如此,很多工程上要求快速更新的深度学习推荐系统放弃了Embedding层的端到端训练,用预训练Embedding层的方式替代。
Embedding 的预训练方法
为了解决“Embedding层训练开销巨大”的问题,Embedding的训练往往独立于深度学习网络进行。在得到稀疏特征的稠密表达之后,再与其他特征一起输入神经网络进行训练。
典型的采用Embedding预训练方法的模型是之前介绍的FNN模型。它将FM模型训练得到的各特征隐向量作为Embedding层的初始化权重,从而加快了整个网络的收敛速度。
在FNN模型的原始实现中,整个梯度下降过程还是会更新Embedding的权重,如果希望进一步加快网络的收敛速度,还可以采用“固定Embedding层权重,仅更新上层神经网络权重”的方法,这是更彻底的Embedding预训练方法。
再延伸一下,Embedding的本质是建立高维向量到低维向量的映射,而“映射”的方法并不局限于神经网络,可以是任何异构模型。例如,2.6节介绍的GBDT+LR组合模型,其中GBDT部分在本质上就是进行了一次Embedding操作,GBDT Embedding,Embedding(即逻辑回归)进行CTR预估。
2015年以来,Graph Embedding,Embedding力进一步增强,而且能够将各类补充信息全部融人Embedding中,使Embedding成为非常有价值的推荐系统特征。通常,GraphEmbedding的训练过程只能独立于推荐模型进行,这使得Embedding预训练成为在深度学习推荐系统领域更受青睐Embedding。
诚然,将Embedding过程与深度神经网络的训练过程割裂会损失一定的信息,但训练过程的独立也带来了训练灵活性的提升。举例来说,物品或用户的Embedding是比较稳定的(因为用户的兴趣、物品的属性不可能在几天内发生巨大的变化),Embedding的训练频率其实不需要很高,甚至可以降低到周的级别,但上层神经网络为了尽快抓住最新的数据整体趋势信息,往往需要高频训练甚至实时训练。使用不同的训练频率更新Embedding模型和神经网络模型,是训练开销和模型效果二者之间权衡后的最优方案。
Embedding 作为推荐系统召回层的方法
Embedding自身表达能力的增强使得直接利用Embedding生成推荐列表成了可行的选择。因此,利用Embedding向量的相似性,将Embedding作为推荐系统召回层的方案逐渐被推广开来。其中,YouTube推荐系统召回层(如图所示)的解决方案是典型的利用Embedding进行候选物品召回的做法。
YouTube推荐系统召回层模型的结构图
其中模型的输人层特征全部都是用户相关特征,从左至右依次是用户观看历史视频的Embedding向量、用户搜索词Embedding向量、用户地理属性特征Embedding向量、用户(样本)年龄、性别相关特征。
模型的输出层是softmax层,该模型本质上是一个多分类模型,预测目标是用户观看了哪个视频,因此softmax层的输人是经过三层ReLU全连接层生成的用户Embedding,输出向量是用户观看每一个视频的概率分布。由于输出向量的每一维对应了一个视频,该维对应的softmax层列向量就是物品Embedding。通过模型的离线训练,可以最终得到每个用户的Embedding和物品Embedding。
在模型部署过程中,没有必要部署整个深度神经网络来完成从原始特征向量到最终输出的预测过程,只需要将用户Embedding和物品Embedding存储到线上内存数据库,通过内积运算再排序的方法就可以得到物品的排序,再通过取序列中Top N N N 的物品即可得到召回的候选集合,这就是利用Embedding作为召回层的过程。
但是,在整体候选集动辄达到几百万量级的互联网场景下,即使是遍历内积运算这种 O ( n ) O(n) O(n) 级别的操作,也会消耗大量计算时间,导致线上推断过程的延迟。那么工程上有没有针对相似Embedding的快速索引方法,能够更快地召回候选集合呢?
局部敏感哈希——让 Embedding 插上翅膀的快速搜索方法
Embedding最重要的用法之一是作为推荐系统的召回层,解决相似物品的召回问题。推荐系统召回层的主要功能是快速地将待推荐物品的候选集从十方、百万量级的规模减小到几干甚至几百量级的规模,避免将全部候选物品直接输人深度学习模型造成的计算资源浪费和预测延迟问题。
Embedding技术凭借其能够综合多种信息和特征的能力,相比传统的基于规则的召回方法,更适于解决推荐系统的召回问题。在实际工程中,能否应用Embedding的关键就在于能否使用Embedding技术“快速”处理几十万甚至上百万候选集,避免增大整个推荐系统的响应延迟。
“快速” Embedding 最近邻搜索
传统的Embedding相似度的计算方法是Embedding向量间的内积运算,这就意味着为了筛选某个用户的候选物品,需要对候选集合中的所有物品进行遍历。
在 k k k 维的Embedding空间中,物品总数为 n n n ,那么遍历计算用户和物品向量相似度的时间复杂度是 O ( k n ) O(k n) O(kn) 。在物品总数 n n n 动辄达到几百万量级的推荐系统中,这样的时间复杂度是承受不了的,会导致线上模型服务过程的巨大延迟。
换一个角度思考这个问题。由于用户和物品的Embedding同处于一个向量空间内,所以召回与用户向量最相似的物品Embedding向量的过程其实是一个在向量空间内搜索最近邻的过程。如果能够找到高维空间快速搜索最近邻点的方法,那么相似Embedding的快速搜索问题就迎刃而解了。
通过建立kd(k-dimension)树索引结构进行最近邻搜索是常用的快速最近邻搜索方法,时间复杂度可以降低到 O ( log 2 n ) O(\log_{2}n) O(log2n) 。一方面,kd树的结构较复杂,而且在进行最近邻搜索时往往还要进行回溯,确保最近邻的结果,导致搜索过程较 复杂;另一方面, O ( log 2 n ) O(\log_{2}n) O(log2n) 的时间复杂度并不是完全理想的状态。那么,有没有时间复杂度更低,操作更简便的方法呢?下面就介绍在推荐系统工程实践上主流的快速 Embedding 向量最近邻搜索方法——局部敏感哈希(Locality SensitiveHashing,LSH)
局部敏感哈希的基本原理
局部敏感哈希的基本思想是让相邻的点落入同一个“桶”,这样在进行最近邻搜索时,仅需要在一个桶内,或相邻的几个桶内的元素中进行搜索即可。如果保持每个桶中的元素个数在一个常数附近,就可以把最近邻搜索的时间复杂度降低到常数级别。那么,如何构建局部敏感哈希中的“桶”呢?下面先以基于欧式距离的最近邻搜索为例,解释构建局部敏感哈希“桶”的过程。
首先要明确一个概念,如果将高维空间中的点向低维空间进行映射,其欧式相对距离还能否保持?如图所示,中间的彩色点处在二维空间中,当把二维空间中的点通过不同角度映射到 a ^a a 、b、 c c c 三个一维空间时,可以看到原本相近的点,在一维空间中都保持着相近的距离;而原本远离的绿色点和红色点在一维空间 a ^a a 中处于相近的位置,却在空间 b ^b b 中处于远离的位置,因此可以得出一个定性的结论:
高维空间点向低维空间映射
在欧式空间中,将高维空间的点映射到低维空间,原本相近的点在低维空间中肯定依然相近,但原本远离的点则有一定概率变成相近的点。
利用低维空间可以保留高维空间相近距离关系的性质,就可以构造局部敏感哈希“桶”。
对于Embedding向量来说,也可以用内积操作构建局部敏感哈希桶。假设 ν \pmb{\nu} ν 是高维空间中的 k k k Embedding, x _x x 是随机生成的 k k k 维映射向量。如下所示,内积操作可将 ν \pmb{\nu} ν 映射到一维空间,成为一个数值。
h ( v ) = v ⋅ x h(v){=}\;v\cdot{\pmb x} h(v)=v⋅x
由上文得出的结论可知,即使一维空间也会部分保存高维空间的近似距离信息。因此,可以使用哈希函数 h ( ν ) h(\nu) h(ν) 进行分桶:
h x , b ( v ) = ⌊ x ⋅ v + b w ⌋ h^{x,b}(v) = \left\lfloor \frac{x \cdot v + b}{w} \right\rfloor hx,b(v)=⌊wx⋅v+b⌋
其中,丨」是向下取整操作, w w w 是分桶宽度, b ^b b 是0到 w w w 间的一个均匀分布随机变量,避免分桶边界固化。
映射操作损失了部分距离信息,如果仅采用一个哈希函数进行分桶,则必然存在相近点误判的情况。有效的解决方法是采用 m m m 个哈希函数同时进行分桶。同时掉进 m m m 个哈希函数的同一个桶的两点,是相似点的概率将大大增加。通过分桶找到相邻点的候选集合后,就可以在有限的候选集合中通过遍历找到目标点真正的 K K K 近邻。
局部敏感哈希多桶策略
采用多个哈希函数进行分桶,存在一个待解决的问题:到底是通过“与”(And)操作还是“或”(Or)操作生成最终的候选集。如果通过“与”操作(“点A和点B在哈希函数1的同一桶中”并且“点A和点B在哈希函数2的同一桶中”)生成候选集,那么候选集中近邻点的准确率将提高,候选集的规模减小使需要遍历计算的量降低,减少了整体的计算开销,但有可能会漏掉一些近邻点(比如分桶边界附近的点);如果通过“或”操作(“点A和点B在哈希函数1的同一桶中”或者“点A和点B在哈希函数2的同一桶中”)生成候选集,那么候选集中近邻点的召回率提高,但候选集的规模变大,计算开销升高。到底使用几个哈希函数,是用“与”操作还是“或”操作来生成近邻点的候选集,需要在准确率和召回率之间权衡,才能得出结论。
以上是欧式空间中内积操作的局部敏感哈希使用方法,如果将余弦相似度作为距离标准,应该采用什么方式进行分桶呢?
余弦相似度衡量的是两个向量间夹角的大小,夹角小的向量即为“近邻”,因此可以使用固定间隔的超平面将向量空间分割成不同哈希桶。同样,可以通过选择不同组的超平面提高局部敏感哈希方法的准确率或召回率。当然,距离的定义方法远不止“欧氏距离”和“余弦相似度”两种,还包括“曼哈顿距离”“切比雪夫距离”“汉明距离”等,局部敏感哈希的方法也随距离定义的不同有所不同。但局部敏感哈希通过分桶方式保留部分距离信息,大规模降低近邻点候选集的本质思想是通用的。
总结——深度学习推荐系统的核心操作
本章介绍了深度学习的核心操作一Embedding技术。从最开始的Word2vec,到应用于推荐系统的Item2vec,再到融合更多结构信息和补充信息的GraphEmbedding,Embedding在推荐系统中的应用越来越深人,应用的方式也越来越多样化。在局部敏感哈希应用于相似Embedding搜索后,Embedding技术无论在理论方面,还是在工程实践方面都日趋成熟。
推荐模型是驱动推荐系统达成推荐效果的引擎,也是所有推荐系统团队投入精力最多的部分。读者也一定能够在之前的学习中感受到推荐模型在学术界和业界的发展进化速度之快。我们要清楚的是,对于一个成熟的推荐系统,除了推荐模型,还要考虑召回策略、冷启动、探索与利用、模型评估、线上服务等诸多方面的问题。