1)训练一个模型M,将Q中的每个实例q和T中的每个实例t映射到同一个向量空间 2)将T中所有实例映射成向量,并存入向量数据库,建立索引 3)在线服务时,对于Q中的一个实例q,通过M映射为向量
E
m
b
q
Emb_q
Embq。再在向量数据库中,通过近似最近邻ANN搜索算法,查找与
E
m
b
q
Emb_q
Embq最近的K个T类的邻居向量作为召回结果
模型结构上,召回必须各自处理用户特征和物料特征。用户子模型只利用用户特征,生成用户向量
E
m
b
u
s
e
r
Emb_{user}
Embuser。物料子模型只利用物料特征,生成物料向量
E
m
b
i
t
e
m
Emb_{item}
Embitem。只允许最后计算
E
m
b
u
s
e
r
⋅
E
m
b
i
t
e
m
Emb_{user}\cdot Emb_{item}
Embuser⋅Embitem或
c
o
s
i
n
e
(
E
m
b
u
s
e
r
,
E
m
b
i
t
e
m
)
cosine(Emb_{user},Emb_{item})
cosine(Embuser,Embitem)时,才产生用户信息与物料信息的唯一一次交叉
通过上述的解耦方式并结合以下的操作,可以实现实时性
1)离线时,提前计算好,生成百万、千万级的物料向量(如
E
m
b
i
t
e
m
Emb_{item}
Embitem),灌入Faiss 并建立好索引 2)在线时,独立生成用户向量(如
E
m
b
u
s
e
r
Emb_{user}
Embuser),在Faiss中利用近似最近邻(ANN)搜索算法快速搜索出与
E
m
b
u
s
e
r
Emb_{user}
Embuser接近的
E
m
b
i
t
e
m
Emb_{item}
Embitem
NCE Loss中,用
G
(
u
,
t
)
G(u, t)
G(u,t)表示该样本
(
u
,
t
)
(u, t)
(u,t)是正样本的Logit,公式如下:
G
(
u
,
t
)
=
u
⋅
t
−
l
o
g
Q
(
t
∣
u
)
G(u, t) = u\cdot t - logQ(t|u)
G(u,t)=u⋅t−logQ(t∣u)
这里的重点在于理解修正项-logQ(t|u)的作用:为了防止热门物料被过度惩罚。可以这样来理解,在负采样的时候,物料的热度越高,它被采样为负样本的概率也就越高。负样本主要由热门物料组成,实际上是对热门物料进行了过度打压,可能会导致推荐结果过于小众。为了补偿被过度打压的热门物料,要求
u
⋅
t
u\cdot t
u⋅t不能只是一般大,而必须在减去logQ(t|u)之后依然很大。
根据G(u, t)计算BCE Loss,得到NCE Loss(Noise Contrastive Estimation)
L
N
C
E
=
−
1
∣
B
∣
∑
(
u
i
,
t
i
)
∈
B
[
log
(
σ
(
G
(
u
i
,
t
i
)
)
)
+
∑
j
∈
S
i
log
(
1
−
σ
(
G
(
u
i
,
t
j
)
)
]
=
1
∣
B
∣
∑
(
u
i
,
t
i
)
∈
B
[
log
(
1
+
exp
(
−
G
(
u
i
,
t
i
)
)
)
+
∑
j
∈
S
i
log
(
1
+
exp
(
G
(
u
i
,
t
j
)
)
)
]
在实际操作中为了简化计算,可以忽略-logQ(t|u)修正项,得到NEG Loss(Negative Sampling Loss):
L
N
E
G
=
1
∣
B
∣
∑
(
u
i
,
t
i
)
∈
B
[
l
o
g
(
1
+
e
x
p
(
−
u
i
⋅
t
i
)
)
+
∑
j
∈
S
i
l
o
g
(
1
+
e
x
p
(
u
i
⋅
t
i
)
]
L_{NEG} = \frac{1}{|B|} \sum_{(u_i,t_i)\in B}[log(1+exp(-u_i\cdot t_i)) + \sum_{j\in S_i}log(1+exp(u_i\cdot t_i)]
LNEG=∣B∣1(ui,ti)∈B∑[log(1+exp(−ui⋅ti))+j∈Si∑log(1+exp(ui⋅ti)]
2.4.2、Sampled Softmax Loss
Sampled Softmax Loss中,以概率Q(t|u)采样一批负样本S,类似NCE Loss,可以得到:
G
(
u
,
t
)
=
u
⋅
t
−
l
o
g
Q
(
t
∣
u
)
G(u, t) = u\cdot t - logQ(t|u)
G(u,t)=u⋅t−logQ(t∣u)
与NCE Loss一样,存在修正项,防止热门物料被过度打压。并且修正只发生在训练阶段,预测阶段还是
u
⋅
t
u\cdot t
u⋅t
把G(u, t)带入Softmax Loss中,得到Sampled Softmax Loss:
L
S
a
m
p
l
e
d
S
o
f
t
m
a
x
=
−
1
∣
B
∣
∑
(
u
i
,
t
i
)
∈
B
l
o
g
e
x
p
(
G
(
u
i
,
t
i
)
)
e
x
p
(
G
(
u
i
,
t
i
)
)
+
∑
j
∈
S
i
e
x
p
(
G
(
u
i
,
t
j
)
)
L_{SampledSoftmax} = -\frac{1}{|B|} {\textstyle \sum_{(u_i,t_i)\in B}log\frac{exp(G(u_i,t_i))}{exp(G(u_i,t_i))+ {\textstyle \sum_{j\in S_i}exp(G(u_i, t_j))} } }
LSampledSoftmax=−∣B∣1∑(ui,ti)∈Blogexp(G(ui,ti))+∑j∈Siexp(G(ui,tj))exp(G(ui,ti))
S
i
S_i
Si是采样生成的负样本集合
2.4.3、Pairwise Loss
是Learning-To-Rank思想的一种实现,以U2I为例:样本为用户、交互过的正向物料、随机采样的负向物料的三元组
(
u
i
,
t
i
+
,
t
i
−
)
(u_i,t_{i+}, t_{i-})
(ui,ti+,ti−)
对于用户u,与正向物料的匹配程度要远高于负向物料的匹配度,因此使用Marginal Hinge Loss:
L
H
i
n
g
e
=
1
∣
B
∣
∑
(
u
i
,
t
i
+
,
t
i
−
)
m
a
x
(
0
,
m
−
u
i
⋅
i
+
+
u
i
⋅
t
i
−
)
L_{Hinge} = \frac{1}{|B|}\sum_{(u_i,t_{i+},t_{i-})}max(0, m-u_i\cdot_{i+}+u_i\cdot t_{i-})
LHinge=∣B∣1(ui,ti+,ti−)∑max(0,m−ui⋅i++ui⋅ti−)
以U2I为例,在一个Batch内,
(
u
i
,
t
j
)
(u_i, t_j)
(ui,tj)为正样本。
u
i
u_i
ui与除了
t
i
t_i
ti之外的其他正样本的物料组成负样本,即
(
u
i
,
t
j
)
,
∀
j
∈
B
−
i
(u_i, t_j), \forall j\in B-i
(ui,tj),∀j∈B−i