解读参考:https://blog.youkuaiyun.com/Dby_freedom/article/details/86502623
代码:https://github.com/FitzFan/Deep-Cross-Net
传统的CTR预估模型需要大量的特征工程,耗时耗力;引入 DNN 之后,依靠神经网络强大的学习能力,可以一定程度上实现自动学习特征组合。但是 DNN 的缺点在于隐式的学习特征组合带来的不可解释性,以及低效率的学习(并不是所有的特征组合都是有用的)。
DCN在学习特定阶数组合特征的时候效率非常高,而且同样不需要特征工程,引入的额外的复杂度也是微乎其微的.
最开始 FM 使用隐向量的内积来建模组合特征;FFM 在此基础上引入 field 的概念,针对不同的 field 上使用不同隐向量。但是,这两者都是针对低阶的特征组合进行建模的。随着 DNN 解决输入高维高稀疏的问题,可以对高维组合特征进行建模
在 很多比赛中,大部分的获胜方案都是使用的人工特征工程,构造低阶的组合特征,这些特征意义明确且高效。而 DNN 学习到的特征都是高度非线性的高阶组合特征,含义非常难以解释。那么是否能设计一种 DNN 的特定网络结构来改善 DNN,使得其学习起来更加高效?DCN 就是其中一个探索。
3. DCN特点
DCN 特点如下:
使用 cross network,在每一层都应用 feature crossing。高效的学习了 bounded degree 组合特征。不需要人工特征工程。
网络结构简单且高效。多项式复杂度由 layer depth 决定。
相比于 DNN,DCN 的 logloss 更低,而且参数的数量将近少了一个数量级。
交叉网络的核心思想是以有效的方式应用显式特征交叉。交叉网络由交叉层组成
代码
def cross_layer2(x0, x, name):
with tf.variable_scope(name):
input_dim = x0.get_shape().as_list()[1]
w = tf.get_variable("weight", [input_dim], initializer=tf.truncated_normal_initializer(stddev=0.01))
b = tf.get_variable("bias", [input_dim], initializer=tf.truncated_normal_initializer(stddev=0.01))
xb = tf.tensordot(tf.reshape(x, [-1, 1, input_dim]), w, 1)
return x0 * xb + b + x
def build_cross_layers(x0, num_layers):
x = x0
for i in range(num_layers):
x = cross_layer2(x0, x, 'cross_{}'.format(i))
return x