今天开始了推荐系统的第一个模型DeepCrossing的学习,这是一个微软发布于2016年的深度学习模型,它将数值型变量和类别型变量作为输入,具体地,论文地址在此:https://www.kdd.org/kdd2016/papers/files/adf0975-shanA.pdf
DeepCrossing的网络结构

(1)最底层是目标相关的特征,包含数值型特征和类别型特征,数值型特征可以直接进入stacking层,而类别型特征(如city_id, user_id等等)可以通过embedding层进行特征抽取,之后再和数值型特征一起进入stacking层。
(2)stacking层,是embedding层和数值型变量的联合,一般可以采取直接向量打平后concat在一起。
(3)多层残差单元层,是多个残差单元的联合。残差单元,这个好像是ResNet的想法,又称为残差模块(residual block)。单个残差模块的示意图如下:
左右两边是两种利用同样两层卷积网络来做拟合的方式,左边是用输入x来拟合最终的输出H(x);而右边是用输入x来拟合F(x)+x,其中x就是输入本身,因而,等同于,网络去学习到的就是F(x),通过下面的例子,看到经过两层卷积网络之后,我们算最终目标的delta值,左边的delta=3.3%,看似已经很完美拟合了,而右边用残差视角,得到的对应的delta=100%,说明进一步优化的空间较大。

而多层的残差模块的联合,其本身就是特征自动做交叉的过程,我以为这就是deep crossing的精妙之处。
(4)scoring层,就是为了最终的目标,往往是一个sigmoid函数,输出最终的目标打分。
最终的代码如下:

参考资料:
1. DeepCrossing论文
2. ResidualBlock知乎博客
3. datawhale学习资料