前言
工作上将DSSM baseline模型引入组内推荐系统,这里总结下,方便后续回顾。
原理
原理较为简单,这里不再赘述,主要原理见下图:
损失函数
原始损失函数
首先query
Q
Q
Q和doc
D
D
D之间的相似度为,其中
y
Q
y_Q
yQ和
y
D
y_D
yD为query和doc的embedding:
R
(
Q
,
D
)
=
c
o
s
(
y
Q
,
y
D
)
=
y
Q
T
y
D
T
∣
∣
y
Q
∣
∣
∣
y
D
∣
∣
R(Q,D)=cos(y_Q, y_D)=\frac{y^T_Q y^T_D}{||y_Q|||y_D||}
R(Q,D)=cos(yQ,yD)=∣∣yQ∣∣∣yD∣∣yQTyDT
对于给定的
Q
Q
Q,正样本
D
+
D^+
D+的预测点击率为:
P
(
D
+
∣
Q
)
=
e
x
p
(
γ
R
(
Q
,
D
+
)
)
∑
D
′
∈
D
s
e
x
p
(
γ
R
(
Q
,
D
′
)
)
P(D^+|Q)=\frac{exp(\gamma R(Q,D^+))}{\sum_{D'\in D_s}exp(\gamma R(Q,D'))}
P(D+∣Q)=∑D′∈Dsexp(γR(Q,D′))exp(γR(Q,D+))
其中
D
s
=
{
D
+
,
D
1
−
,
D
2
−
,
.
.
.
,
D
N
−
}
D_s=\{D^+, D^-_1, D^-_2, ..., D^-_N\}
Ds={D+,D1−,D2−,...,DN−},其中
N
N
N是为正样本匹配的负样本数量,
γ
\gamma
γ为softmax的平滑因子,损失函数为累积概率,如下所示:
L
=
−
l
o
g
∏
(
Q
,
D
+
)
P
(
D
+
,
∣
Q
)
=
−
∑
(
Q
,
D
+
)
l
o
g
P
(
D
+
,
Q
)
L = -log \prod_{(Q, D^+)}P(D^+,|Q)=-\sum_{(Q,D^+)}logP(D^+,Q)
L=−log(Q,D+)∏P(D+,∣Q)=−(Q,D+)∑logP(D+,Q)
而上述损失函数中其中一项具体展开可得:
可以看出,DSSM的损失函数类似于多个pairwise loss融合在一起的结果,比pairwise loss引入更多环境信息。
工程中损失函数
推荐系统中的DSSM双塔模型比较简单,即user和item各一个塔,而其损失函数是pointwise loss,即对每个样本进行损失计算,而非上述需要为正样本搭配一系列的负样本然后进行损失计算,而具体采用的是交叉熵损失计算,如下公式:
L
=
−
∑
u
,
i
[
y
u
,
i
l
o
g
p
(
u
,
i
)
+
(
1
−
y
u
,
i
)
l
o
g
(
1
−
p
(
u
,
i
)
)
]
L = -\sum_{u,i}[y_{u,i}log p(u,i)+(1-y_{u,i})log (1-p(u,i))]
L=−u,i∑[yu,ilogp(u,i)+(1−yu,i)log(1−p(u,i))]
其中
u
u
u和
i
i
i代表的是user和item,
p
(
u
,
i
)
p(u,i)
p(u,i)代表的是user和item pair对属于正样本的概率,
y
u
,
i
y_{u,i}
yu,i代表的是user和item pair对的标签。
DSSM召回模型
样本构造
正样本:用户点击过的item
负样本:随机一批用户没有看过的资源+负反馈资源
训练过程
特征构造
User侧特征:用户播放历史、用户固有特征等
Item侧特征:Item的固有特征、全局统计特征等
损失函数构造
构造好User/Item侧特征并完成两侧塔计算后,得到user_embedding x i x_i xi和item_embedding y j y_j yj,计算向量内积:
s ( x i , y j ) = ⟨ x i , y j ⟩ s(x_i, y_j) = \left \langle x_i, y_j \right \rangle s(xi,yj)=⟨xi,yj⟩
计算softmax得到归一化概率值,其中 M M M为item的总量,其具体含义为一个正样本在一堆负样本中用户点击正样本的概率。
p ( y i ∣ x i ; θ ) = e s ( x i , y i ) ∑ j e s ( x i , y j ) p(y_i|x_i;\theta)=\frac{e^{s(x_i, y_i)}}{\sum_{j}e^{s(x_i, y_j)}} p(yi∣xi;θ)=∑jes(xi,yj)es(xi,yi)
根据上文可知负样本的选择原则为在用户没看过的全局资源中选择一部分,这样就造成一些高热资源被选中的概率很高,因而需要打压这部分资源对整体结果造成的影响,因而从向量内积层面更改公式得到如下公式,其中 p j p_j pj代表的是样本在全局分布的概率。
s c ( x i , y j ) = ⟨ x i , y j ⟩ − l o g ( p j ) s^c(x_i, y_j) = \left \langle x_i, y_j \right \rangle - log(p_j) sc(xi,yj)=⟨xi,yj⟩−log(pj)
向量内积经过修正之后softmax归一化概率中的每一项为如下公式,从这一层面看出修正后的公式考虑到了资源在全局分布的概率。
e s c ( x i , y j ) = e s ( x i , y j ) p j e^{s^c(x_i, y_j)}=\frac{e^{s(x_i, y_j) }}{p_j} esc(xi,yj)=pjes(xi,yj)
修正后的最终概率值为:
p c ( y i ∣ x i ; θ ) = e s c ( x i , y i ) ∑ j e s c ( x i , y j ) p^c(y_i|x_i;\theta)=\frac{e^{s^c(x_i, y_i)}}{\sum_{j}e^{s^c(x_i, y_j)}} pc(yi∣xi;θ)=∑jesc(xi,yj)esc(xi,yi)
如下为损失函数的公式,其中 B B B代表的是batch_size, r i r_i ri代表的是该点击样本的重要性,比如这个用户看了这个item时长越长 r i r_i ri越大。经过有限次迭代,模型训练完成。
L = − 1 B ∑ r i l o g ( p c ( y i ∣ x i ; θ ) ) L = -\frac{1}{B}\sum r_i log(p^c(y_i|x_i;\theta)) L=−B1∑rilog(pc(yi∣xi;θ))
整体流程如下所示:
线上数据
模型训练完成后,将所有User和Item的raw特征经过模型的inference得到对应的user_embedding和item_embedding,并通过ann计算得到每个User相似资源列表,并将这份数据推送至线上。
线上逻辑
根据userid直接获取线上数据中的相似资源列表,直接推荐。