DEEP CROSSING
1.模型主要解决的问题
(1)特征分为两类,数值特征和离散特征,离散特征如one-hot编码数据类型过于稀疏,不利于直接输入神经网络进行训练。
(2)如何解决特征自动交叉组合的问题,让神经网络自动进行深度特征交叉。
2.模型主要结构
(1)Embedding层:这层的作用是将稀疏特征转化为稠密向量。解决了问题(1)。这里我们使用经典的全连接结构作为主体。推荐系统中还有很多,下面的博客有列举出推荐系统中流行的Embedding方法。https://blog.csdn.net/abcdefg90876/article/details/106464384
(2)Stacking层:把不同的Embedding特征与数值特征进行拼接。
(3)MLP层:使用了多层残差网络进行具体实现。解决了问题(2),实现了特征工程的自动化。
(4)Scoring层:常用逻辑回归模型。该层用交叉熵作为损失函数。
3.残差网络介绍
随着网络深度增加,会出现一种退化问题,也就是当网络变得越来越深的时候,训练的准确率会趋于平缓,但是训练误差会变大,这明显不是过拟合造成的,因为过拟合是指网络的训练误差会不断变小,但是测试误差会变大。为了解决这种退化现象,ResNet被提出。我们不再用多个堆叠的层直接拟合期望的特征映射,而是显式的用它们拟合一个残差映射。假设期望的特征映射为H(x),那么堆叠的非线性层拟合的是另一个映射,也就是F(x)=H(x)-x。假设最优化残差映射比最优化期望的映射更容易,也就是F(x)=H(x)-x比F(x)=H(x)更容易优化,则极端情况下,期望的映射要拟合的是恒等映射,此时残差网络的任务是拟合F(x)=0,普通网络要拟合的是F(x)=x,明显前者更容易优化。下面是残差神经网络单元的代码。
class Residual_Units(Layer):
"""
Residual Units
"""
def __init__(self, hidden_unit, dim_stack):
"""
:param hidden_unit: the dimension of cross layer unit
:param dim_stack: the dimension of inputs unit
"""
super(Residual_Units, self).__init__()
self.layer1 = Dense(units=hidden_unit, activation='relu')
self.layer2 = Dense(units=dim_stack)
self.relu = ReLU()
def call(self, inputs):
x = inputs
x = self.layer1(x)
x = self.layer2(x)
outputs = self.relu(x + i)