参考链接:
- 如上图所示,PPNet 的左侧是目前常见的 DNN 网络结构,由稀疏特征(sparse features)、嵌入层(embedding layer)、多神经网络层(neural layer)组成。
- 右侧是 PPNet 特有的模块,包括 Gate NN 和只给 Gate NN 作为输入的 id 特征。其中 uid,pid,aid 分别表示 user id,photo id,author id。左侧的所有特征的 embedding 会同这 3 个 id 特征的 embedding 拼接到一起作为所有 Gate NN 的输入。
- 需要注意的是,左侧所有特征的 embedding 并不接受 Gate NN 的反传梯度,这样操作的目的是减少 Gate NN 对现有特征 embedding 收敛产生的影响。Gate NN 的数量同左侧神经网络的层数一致,其输出同每一层神经网络的输入做 element-wise product 来做用户的个性化偏置。Gate NN 是一个 2 层神经网络,其中第二层网络的激活函数是 2 * sigmoid,目的是约束其输出的每一项在 [0, 2] 范围内,并且默认值为 1。当 Gate NN 输出是默认值时,PPNet 同左侧部分网络是等价的。
- 经实验对比,通过 Gate NN 为神经网络层输入增加个性化偏置项,可以显著提升模型的目标预估能力。PPNet 通过 Gate NN 来支持 DNN 网络参数的个性化能力,来提升目标的预估能力,理论上来讲,可以用到所有基于 DNN 模型的预估场景,如个性化推荐,广告,基于 DNN 的强化学习场景等。
前面提到,左侧所有特征Embedding不接受GateNN的反向梯度传播。在TensorFlow2.x中,如何阻止呢?通过函数tf.stop_gradient()
函数即可。用法如下:
x = tensorflow.Variable(1, dtype=tensorflow.float32)
with tensorflow.GradientTape() as tape:
y = x * x
z = y + x
显然,由于
z
=
x
2
+
x
z = x^2 +x
z=x2+x,所以
z
′
=
2
x
+
1
z'=2x+1
z′=2x+1 。加上tf.stop_gradient()
后:
with tensorflow.GradientTape() as tape:
y = tensorflow.stop_gradient(x * x)
z = y + x
此时, z ′ = 1 z'=1 z′=1。
- 参考链接:https://www.zhihu.com/question/486168076
- TensorFlow API:https://tensorflow.google.cn/api_docs/python/tf/stop_gradient?hl=en