推荐算法中各种深度学习模型层出不穷,但是万变不离其宗,我们从最原始的矩阵分解模型MF谈起
矩阵分解模型
MF模型是求解方程
U
I
T
=
Z
UI^T=Z
UIT=Z,
Z是label矩阵,格式如下:
[
1
0
x
⋯
0
0
x
1
⋯
x
⋮
⋮
⋮
⋱
⋮
x
0
1
⋯
1
]
\begin{bmatrix} 1&0&\text{x}&\cdots&0\\ 0&\text{x}&1&\cdots&\text{x}\\ \vdots&\vdots&\vdots&\ddots&\vdots\\ \text{x}&0&1&\cdots&1\\ \end{bmatrix}
⎣⎢⎢⎢⎡10⋮x0x⋮0x1⋮1⋯⋯⋱⋯0x⋮1⎦⎥⎥⎥⎤,其中
z
i
j
=
{
1
,
u
s
e
r
i
点
击
了
i
t
e
m
j
0
,
u
s
e
r
i
看
过
i
t
e
m
j
但
没
有
点
击
x
,
u
s
e
r
i
未
看
过
i
t
e
m
j
,
表
示
未
知
值
z_{ij}=\begin{cases} 1,\, user_i点击了item_j\\ 0,\, user_i看过item_j但没有点击\\ \text{x},\,user_i未看过item_j,表示未知值\\ \end{cases}
zij=⎩⎪⎨⎪⎧1,useri点击了itemj0,useri看过itemj但没有点击x,useri未看过itemj,表示未知值
设user个数为n,item个数为m,向量大小为k,
U矩阵如下:
[
U
1
1
U
1
2
U
1
3
⋯
U
1
k
U
2
1
U
2
2
U
2
3
⋯
U
2
k
⋮
⋮
⋮
⋱
⋮
U
n
1
U
n
2
U
n
3
⋯
U
n
k
]
\begin{bmatrix} U_1^1&U_1^2&U_1^3&\cdots&U_1^k\\ U_2^1&U_2^2&U_2^3&\cdots&U_2^k\\ \vdots&\vdots&\vdots&\ddots&\vdots\\ U_n^1&U_n^2&U_n^3&\cdots&U_n^k\\ \end{bmatrix}
⎣⎢⎢⎢⎡U11U21⋮Un1U12U22⋮Un2U13U23⋮Un3⋯⋯⋱⋯U1kU2k⋮Unk⎦⎥⎥⎥⎤
其中每行为一个user的向量, U i U_i Ui表示第i个用户的向量,每行的值如[0.2083438 0.6450492 0.30716872 … 0.5020966 -0.24310756]
I矩阵如下:
[
I
1
1
I
1
2
I
1
3
⋯
I
1
k
I
2
1
I
2
2
I
2
3
⋯
I
2
k
⋮
⋮
⋮
⋱
⋮
I
m
1
I
m
2
I
m
3
⋯
I
m
k
]
\begin{bmatrix} I_1^1&I_1^2&I_1^3&\cdots&I_1^k\\ I_2^1&I_2^2&I_2^3&\cdots&I_2^k\\ \vdots&\vdots&\vdots&\ddots&\vdots\\ I_m^1&I_m^2&I_m^3&\cdots&I_m^k\\ \end{bmatrix}
⎣⎢⎢⎢⎡I11I21⋮Im1I12I22⋮Im2I13I23⋮Im3⋯⋯⋱⋯I1kI2k⋮Imk⎦⎥⎥⎥⎤
其中每行为一个item的向量, I i I_i Ii表示第i个item的向量
求解方程如下:
[
U
1
1
U
1
2
U
1
3
⋯
U
1
k
U
2
1
U
2
2
U
2
3
⋯
U
2
k
⋮
⋮
⋮
⋱
⋮
U
n
1
U
n
2
U
n
3
⋯
U
n
k
]
×
[
I
1
1
I
2
1
I
3
1
⋯
I
m
1
I
1
2
I
2
1
I
3
2
⋯
I
m
2
⋮
⋮
⋮
⋱
⋮
I
1
k
I
2
k
I
3
k
⋯
I
m
k
]
=
[
1
0
x
⋯
0
0
x
1
⋯
x
⋮
⋮
⋮
⋱
⋮
x
0
1
⋯
1
]
\begin{bmatrix} U_1^1&U_1^2&U_1^3&\cdots&U_1^k\\ U_2^1&U_2^2&U_2^3&\cdots&U_2^k\\ \vdots&\vdots&\vdots&\ddots&\vdots\\ U_n^1&U_n^2&U_n^3&\cdots&U_n^k\\ \end{bmatrix} \times \begin{bmatrix} I_1^1&I_2^1&I_3^1&\cdots&I_m^1\\ I_1^2&I_2^1&I_3^2&\cdots&I_m^2\\ \vdots&\vdots&\vdots&\ddots&\vdots\\ I_1^k&I_2^k&I_3^k&\cdots&I_m^k\\ \end{bmatrix} = \begin{bmatrix} 1&0&\text{x}&\cdots&0\\ 0&\text{x}&1&\cdots&\text{x}\\ \vdots&\vdots&\vdots&\ddots&\vdots\\ \text{x}&0&1&\cdots&1\\ \end{bmatrix}
⎣⎢⎢⎢⎡U11U21⋮Un1U12U22⋮Un2U13U23⋮Un3⋯⋯⋱⋯U1kU2k⋮Unk⎦⎥⎥⎥⎤×⎣⎢⎢⎢⎡I11I12⋮I1kI21I21⋮I2kI31I32⋮I3k⋯⋯⋱⋯Im1Im2⋮Imk⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡10⋮x0x⋮0x1⋮1⋯⋯⋱⋯0x⋮1⎦⎥⎥⎥⎤
最后是要求解U、I中的向量值,使
U
I
T
UI^T
UIT的积能够最大化拟合label矩阵Z中的已知值,然后通过求解出来的U、I值计算Z中的未知值,预测用户对未看过item的偏好。
用神经网络模型的术语,U、I分别代表user、item的embedding向量,Z为label
神经网络模型训练过程就是使user、item的embedding内积与label的交叉熵最小化,是不是有种似曾相识的感觉,其网络模型如下图:
在youtubednn和各种双塔模型中,网络最后一层都是类似的作用,其实就是为了拟合
U
I
T
=
Z
UI^T=Z
UIT=Z
矩阵分解改进
在MF模型中,有多少个用户就有多少行user embedding向量,他们之间是互不相关的,一般推荐系统的用户量都是百万至千万的量级,这导致用户侧的向量个数特别大。我们知道,在方程求解中,自变量个数越多,求解越难。为了减少用户变量的个数,我们可以考虑用用户的一些基本特征来表示用户,最简单的如年龄、性别。年龄个数最大不会超过200,性别个数不会超过3,他们之间的组合个数最大也就600,比起原来动辄百万的量级大大减少了。这其实就是youtubednn的最简化版本了。其网络模型如下图:
其中mlp层是在age和gender中添加非线性组合更好的表示用户
YoutubeDnn模型
上面对用户的建模有点过于简单了,相同性别和年龄的人并一定会有相同的兴趣,难道你和你的同学都喜欢看相同的内容吗。所以我们要加入更多的特征来刻画用户。比较重要的特征有用户最近看过的item 列表,想想相同年龄和性别的人,如果最近又看过相同的内容,是不是这两个人有相同兴趣的概率大大增加了。但是一个用户看过的item列表是多个,怎么把多个item的特征加入到用户向量里呢,简单的直接取列表里item embedding的平均值就行了,其中的item embedding与I中是共享的,并没有增加整个方程的自变量个数,却大大增加了用户的区分度,是不是比较巧妙,其实这就是youtubednn原型了。其网络模型如下图:
从上面的讨论中,我们也可以得到一些选取特征的方法,选取的特征一定要对业务目标有区分度,选取的特征太少不具备区分度,太多会使求解方程变难,也就是模型难拟合。比如做国内业务的场景,用户国籍这种特征就没必要加进来。
DSSM模型
聪明的读者看到这里一定会想到既然用户侧可以用各种特征来表示用户,item侧是不是也可以这样呢。对的,item侧也可用比如tag标签、title、作者等特征来表示item,这其实就是各种双塔模型如dssm了。其网络模型如下图: