今天的博客主要参考了2018年KDD会议的一篇paper《Learning and Transferring IDs Representation in E-commerce》。主要讲了盒马鲜生Embedding的生成策略,因为盒马鲜生是一个比较新的平台,所以新用户和新商品的冷启动问题会比较突出,同时又由于盒马生鲜主打的是卖当季的生鲜,故新商品冷启动问题会持续存在。
从整体来看,作者指出生成的商品Embedding在盒马生鲜平台中可以有一下几个用处:
1 可以方便的计算商品之间的相似性,用来推荐系统的召回(粗排)环节;
2 可以利用方法用已知商品的Embedding向量生成未知商品的Embedding向量;
3 生成的商品向量可以在不同的平台之间进行迁移;
4 可以在统一平台中的不同任务中进行迁移。
我认为上图就体现了这篇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和其对应的属性来一起进行联合训练。
可以看出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(itemi∣IDs(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(itemi∣IDs(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(itemi∣IDs(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=N1∑n=1N(−logp(IDs(itemn+j)∣IDs(itemn))−αlogp(itemn∣ID(itemn))+β∑k=1K∣∣Mk∣∣2)。
在得到了商品的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(itemi∣IDs(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(itemi∣IDs(itemi))
=>
p
(
i
t
e
m
i
∣
I
D
s
(
i
t
e
m
i
)
)
p(item_i | IDs(item_i))
p(itemi∣IDs(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}
ei1≈∑k=2KwikMkeik
(PS:其实最后这一步约等我是不太理解的,因为向量内积大,不一定能得出两个向量完全一致的结论,前提必须是在两个向量模长一致的情况下)。
整体来说论文的思想并不是非常新的,但是合理的应用在自己的业务场景中,并取得了较好的效果,还是值得我们这些致力于AI技术落地化同行的学习。