基于DNN的推荐算法引入背景
推荐系统的一大挑战是同时具备”记忆能力“和”泛化能力“。
”记忆能力“:学习那些经常同时出现的特征,发觉历史数据中存在的共现特性。
”泛化能力“:基于迁移相关性,探索之前几乎没出现过的新特征组合。
基于嵌入的模型(FM)对之前没出现过的特征具备二阶泛化能力,即为每个query和item特征学习一个低维稠密的嵌入向量。但FM很难有效学习低维表示,当query-item矩阵稀疏且高秩时,稠密嵌入会给所有item-query带来非零预测,可能过度泛化/给出完全不相关的推荐。
Wide&Deep
联合训练一个线性模型组件和一个深度神经网络组件得到Wide&Deep模型,该模型的Wide部分具备记忆能力,Deep部分具备泛化能力。
Wide部分:基础特征和交叉特征构成的线性模型
y
=
w
T
[
x
,
ϕ
(
x
)
]
+
b
y=\mathrm{w}^T [\mathrm{x},\phi(\mathrm{x})]+b
y=wT[x,ϕ(x)]+b
其中,基础特征
x
=
(
x
1
,
x
2
,
⋯
 
,
x
i
,
⋯
 
,
x
n
)
\displaystyle\mathrm{x}=(x_1,x_2,\cdots,x_i,\cdots,x_n)
x=(x1,x2,⋯,xi,⋯,xn),叉乘特征
ϕ
(
x
)
=
∏
i
=
1
d
x
i
c
k
i
,
c
k
i
∈
{
0
,
1
}
\displaystyle\phi(\mathrm{x})=\prod\limits_{i=1}^d x^{c_{ki}}_i,c_{ki}\in\{0,1\}
ϕ(x)=i=1∏dxicki,cki∈{0,1}
Deep部分:将一些sparse特征(e.g. ID类特征)转换成低维稠密向量,然后和一些原始dense特征一起作为网络的输入;激活函数是Relu的前馈神经网络
a
(
l
+
1
)
=
f
(
W
(
l
)
a
(
l
)
+
b
(
l
)
)
\mathrm{a}^{(l+1)}=f(\mathrm{W}^{(l)}\mathrm{a}^{(l)}+\mathrm{b}^{(l)})
a(l+1)=f(W(l)a(l)+b(l))
其中,
a
(
l
)
\mathrm{a}^{(l)}
a(l)第l层输入,
b
(
l
)
\mathrm{b}^{(l)}
b(l)第l层偏置,
W
(
l
)
\mathrm{W}^{(l)}
W(l)第l层权重,
f
f
f激活函数
Wide&Deep联合预测输出:联合训练的Wide部分只需要作一小部分的特征叉乘来弥补Deep部分的不足,不需要一个full-size 的wide 模型。在论文中,作者通过梯度的反向传播,使用 mini-batch stochastic optimization 训练参数,并对wide部分使用带L1正则的Follow- the-regularized-leader (FTRL) 算法,对deep部分使用 AdaGrad算法。
P
(
y
=
1
∣
x
)
=
s
i
g
m
o
i
d
(
w
W
i
d
e
T
[
x
,
ϕ
(
x
)
]
+
w
D
e
e
p
T
a
l
f
+
b
)
P(y=1|\mathrm{x})=sigmoid(\mathrm{w}^T_{Wide}[\mathrm{x},\phi(\mathrm{x})]+\mathrm{w}^T_{Deep}\mathrm{a}^{l_f} + b)
P(y=1∣x)=sigmoid(wWideT[x,ϕ(x)]+wDeepTalf+b)
其中,
a
l
f
\mathrm{a}^{l_f}
alf是NN最后一层激活值。
DeepFM
DeepFM采取Wide & Deep的框架,差异在于将Wide部分的LR替换为了FM,从而自动构造二阶特征叉乘,而非手工设计叉乘。FM算法负责提取一阶和二阶组合特征;DNN算法负责对输入一阶特征全连接提取高阶特征。FM和DNN共享相同输入和embedding向量,训练更高效。
左边就是刚才将的FM模型的神经网络表示,而右边的则为deep部分,为全连接的网络,用于挖掘高阶的交叉特征。整个模型共享embedding层,最后的结果就是把FM部分和DNN的部分做sigmoid:
Y
=
s
i
g
m
o
i
d
(
Y
F
M
+
Y
D
N
N
)
Y=sigmoid(Y_{FM}+Y_{DNN})
Y=sigmoid(YFM+YDNN)