阿里系——盒马鲜生的Embedding策略

今天的博客主要参考了2018年KDD会议的一篇paper《Learning and Transferring IDs Representation in E-commerce》。主要讲了盒马鲜生Embedding的生成策略,因为盒马鲜生是一个比较新的平台,所以新用户和新商品的冷启动问题会比较突出,同时又由于盒马生鲜主打的是卖当季的生鲜,故新商品冷启动问题会持续存在。

从整体来看,作者指出生成的商品Embedding在盒马生鲜平台中可以有一下几个用处:
1 可以方便的计算商品之间的相似性,用来推荐系统的召回(粗排)环节;
2 可以利用方法用已知商品的Embedding向量生成未知商品的Embedding向量;
3 生成的商品向量可以在不同的平台之间进行迁移;
4 可以在统一平台中的不同任务中进行迁移。

阿里系——盒马鲜生的Embedding策略_第1张图片
我认为上图就体现了这篇paper Embedding策略的核心思想,即除了参考了每一个item ID包含的信息之外,同时将这个item进行了分解,在生成Embedding的过程中同时考虑了这个item ID对应的属性信息。其实这个思想并不新鲜,之前我的博客《使用knowledge-based方法提升词向量的生成质量》就是在生成词向量的时候考虑了每个词的属性——义元。只不过这篇paper考虑属性的方式不太一样而已。

首先我要说一下整个生成item Embedding的算法框架其实就是词向量算法skip-gram,这里每一个用户对于item的交互序列就相对于nlp中的sentence,每一个item就相当于nlp中的word。关于skip-gram的细节这里就不作为重点讲了,可以参考我之前的博客。这篇博客重点讲解一下如何融合item ID和其对应的属性来一起进行联合训练。
阿里系——盒马鲜生的Embedding策略_第2张图片
可以看出target item ID和context item ID把各自对应的所有相关属性展开进行关联,具体的关联有两个方式: p ( I D s ( i t e m j ) ∣ I D s ( i t e m i ) ) p(IDs(item_j ) | IDs(item_i)) p(IDs(itemj)IDs(itemi)) p ( i t e m i ∣ I D s ( i t e m i ) ) p(item_i | IDs(item_i)) p(itemiIDs(itemi))
1 对于 p ( I D s ( i t e m j ) ∣ I D s ( i t e m i ) ) p(IDs(item_j ) | IDs(item_i)) p(IDs(itemj)IDs(itemi))来说,其中 I D s ( i t e m i ) = [ i d 1 ( i t e m i ) , . . . i d k ( i t e m i ) , . . . i d K ( i t e m i ) ] IDs(item_i)=[id_1(item_i),...id_k(item_i),...id_K(item_i)] IDs(itemi)=[id1(itemi),...idk(itemi),...idK(itemi)],k代表了item被分解对应的属性个数。那么就有 p ( I D s ( i t e m j ) ∣ I D s ( i t e m i ) ) = σ ( ∑ k = 1 K ( w j k e j k ‘ ) ( w i k e i k ) ) . ∏ s = 1 S σ ( − ∑ k = 1 K ( w s k e s k ‘ ) T ( w i k e i k ) ) p(IDs(item_j ) | IDs(item_i))= \sigma(\sum_{k=1}^K(w_{jk}e^`_{jk})(w_{ik}e_{ik})).\prod_{s=1}^S \sigma(-\sum_{k=1}^K (w_{sk}e^`_{sk})^T(w_{ik}e_{ik})) p(IDs(itemj)IDs(itemi))=σ(k=1K(wjkejk)(wikeik)).s=1Sσ(k=1K(wskesk)T(wikeik)),其中 S S S代表了负采样的样本数量, w i k = 1 V i k w_{ik}=\frac{1}{V_{ik}} wik=Vik1,代表了属性i的权重, V i k V_{ik} Vik i t e m i item_i itemi对应的取值数量。
这一项的目的就是使用一个商品i的所有属性信息来预测某一个商品j对应的所有属性信息。

2 对于 p ( i t e m i ∣ I D s ( i t e m i ) ) p(item_i | IDs(item_i)) p(itemiIDs(itemi))来说, p ( i t e m i ∣ I D s ( i t e m i ) ) = σ ( ∑ k = 2 K w i k e i 1 T M k e i k ) p(item_i | IDs(item_i))=\sigma(\sum_{k=2}^K w_{ik}e_{i1}^TM_ke_{ik}) p(itemiIDs(itemi))=σ(k=2Kwikei1TMkeik),其中参数 e i 1 e_{i1} ei1代表item ID向量,其他的2至k代表的是item的属性向量信息,参数 M k M_k Mk是一个为了适配不同属性维度的变换矩阵。
这一项的目的就是使用一个商品的属性信息来预测该商品的ID信息。这其实就是可以利用方法用已知商品的Embedding向量生成未知商品的Embedding向量的理论依据。

最终整个模型的损失函数如下:
L = 1 N ∑ n = 1 N ( − l o g p ( I D s ( i t e m n + j ) ∣ I D s ( i t e m n ) ) − α l o g p ( i t e m n ∣ I D ( i t e m n ) ) + β ∑ k = 1 K ∣ ∣ M k ∣ ∣ 2 ) L=\frac{1}{N}\sum_{n=1}^N(-log p(IDs(item_{n+j})|IDs(item_n))-\alpha log p(item_n|ID(item_n))+\beta\sum_{k=1}^K ||M_k||_2) L=N1n=1N(logp(IDs(itemn+j)IDs(itemn))αlogp(itemnID(itemn))+βk=1KMk2)

在得到了商品的Embedding之后,用户的Embedding可以由该用户最近一段时间交互过的商品Embedding平均得到。之所以使用这么简单的方式而不是RNN等复杂的方式,是因为用户的行为会不断的方式变化,因为用户的Embedding需要频繁的更新,RNN等训练过程太过复杂,不太适合频繁更新的场景。

其实整个paper已经讲的差不多了,最后我来讲一下:可以利用方法用已知商品的Embedding向量生成未知商品的Embedding向量是如何做到的。
精髓就在一句话:虽然会有新的item产生,但是组成这些新的item的属性都是固定的,就像是世界万物都是由几百个基础元素组成的一样。那么既然这篇paper提出的方法可以联合训练item和其对应属性的Embedding,那么就可以使用这些item属性的Embedding来合成item Embedding的形式。
由于联合优化的目标有一项是 m a x max max p ( i t e m i ∣ I D s ( i t e m i ) ) p(item_i | IDs(item_i)) p(itemiIDs(itemi))
=> m a x max max ∑ k = 2 K w i k e i 1 T M k e i k = e i 1 T ( ∑ k = 2 K w i k M k e i k ) \sum_{k=2}^K w_{ik}e_{i1}^TM_ke_{ik} = e_{i1}^T(\sum_{k=2}^Kw_{ik}M_ke_{ik}) k=2Kwikei1TMkeik=ei1T(k=2KwikMkeik)

由于 m a x max max p ( i t e m i ∣ I D s ( i t e m i ) ) p(item_i | IDs(item_i)) p(itemiIDs(itemi))
=> p ( i t e m i ∣ I D s ( i t e m i ) ) p(item_i | IDs(item_i)) p(itemiIDs(itemi)) -> 1,
=> e i 1 T ( ∑ k = 2 K w i k M k e i k ) e_{i1}^T(\sum_{k=2}^Kw_{ik}M_ke_{ik}) ei1T(k=2KwikMkeik)非常大
=> e i 1 ≈ ∑ k = 2 K w i k M k e i k e_{i1} \approx \sum_{k=2}^Kw_{ik}M_ke_{ik} ei1k=2KwikMkeik
(PS:其实最后这一步约等我是不太理解的,因为向量内积大,不一定能得出两个向量完全一致的结论,前提必须是在两个向量模长一致的情况下)。

整体来说论文的思想并不是非常新的,但是合理的应用在自己的业务场景中,并取得了较好的效果,还是值得我们这些致力于AI技术落地化同行的学习。

你可能感兴趣的:(深度学习)