Product-based Neural Networks

目录

一、背景:

二、PNN(Product-based Neural Networks )

motivation

PNN网络结构

IPNN

OPNN网络结构图

PNN*

三、EXPERIMENTS

四、相关部分                 

五、参考


一、背景:

基于DNN的ctr预估存在特征维度爆炸及极度稀疏,且未考虑特征之间的交互性。理解深度神经网络——DNN(Deep Neural Networks) | 码农家园

上一版本ctr预估使用的是DNN模型:Deep Neural Network(DNN)

下图为DNN网络结构, 其本质就是传统的多层感知机(MultiLayer Perceptron,简称MLP)。在MLP网络中,输入是原始的特征n维特征空间,假设第一层隐层节点数为H1,第二层为H2,以此类推。在第一层网络中,需要学习的参数就是n*H1。对于大多数CTR模型来说,特征体系都极其庞大而且稀疏,典型的特征数量级n从百万级到千万级到亿级甚至更高,这么大规模的n作为网络输入在ctr预估的工业界场景中是不可接受的。DNN待学习参数: n*H1+H1*H2+H2*H3+H3*o(o为输出层大小,在ctr预估中为1)

                        

                                                                                         DNN模型结构

存在的问题:

  1. DNN的输入往往是dense real vector, 但是对于类别型特征通常需要one-hot,得到的结果是高维且稀疏的。目前ltr使用的特征有七十二维,存在的问题是非常稀疏,0值较多。  解决方案:对特征进行Embedding,通过加入Embedding Layer将输入映射到低维度的Embedding空间中。  
  2. 通常,NN层之间都使用“add operation” ,通过激活函数来引入非线性。实际应用场景中“product”相比“add”能更好得捕捉特征间的交互属性,(eg:相关性高且是重要公司与相关性高和重要公司,画图表示交集和并集的关系)。DNN直接把Embedding之后的特征或者原始特征输入到神经网络中进行计算对特征的交叉组合不充分,没有考虑特征之间的相互性关系。

二、PNN(Product-based Neural Networks )

motivation

  1. 通过Embedding解决高维稀疏问题
  2. “product”相比“add”能更好得捕捉特征间的dependence,在DNN结构中引入product layer更好地学习不同Field特征间的相关性

PNN网络结构

Embedding + Product + MLP

  1. Embedding Layer:最开始的输入太稀疏维度太高,没法直接放到DNN中去学习,所以比较通用的做法就是通过Embedding到一个低维的稠密的实数向量中,作为原始特征的在Embedding空间中的表示。Embedding Layer跟DeepFM中相同,将每一个field的特征转换成同样长度的向量。

  2. Product Layer:然后PNN利用Product Layer来学习filed之间的交互特征,这也就引入了非线性的组合特征。可以采用内积、外积、内积+外积的形式。
  3. Full-connect Layer:最后利用全连接层充分的学习高阶组合特征,并得到最终CTR预测概率。

                         

(1)Input: 一个Field就是一个类别型特征。注意:上图中的Input是one-hot之后的,而且只给出了类别型特征。所以每个Field都是一个向量,向量的大小就是类别型特征one-hot之后的维度,即不同Field的维度是不同的。

(2)Embedding Layer: Embedding是Field-wisely Connected,就是一个Field只与一个embedding关联,Field之间网络的权重毫无关系(看箭头)。而且只有权重,没有bias。一个Field经过嵌入后,得到一个Feature,也就是对应的Embedding Vector嵌入向量。其维度一般是预先设定好的定值,论文中采用的是10。也就说是不同Feature的维度都是一样的。

(3)Product Layer: Product Layer分为两部分,一部分叫做z,一部分叫做p。我们说下结论:

  • 先看zz中每个圈都是一个向量,向量大小为Embedding Vector大小,向量个数 = Field个数 = Embedding向量的个数。
  • 再看p,Product Layer中如果是内积(IPNN),p中每个圈都是一个值;如果是外积(OPNN),p中每个圆圈都是一个二维矩阵。

IPNN

OPNN网络结构图

                       

         

针对OPNN产生的每一个二维矩阵,我们都通过另外一个矩阵W,大小为M*M。这两个矩阵对应位置相乘,再相加,就得到了最终的结果。也就是说,最终外积产生的二维矩阵,通过和另外一个需要学习的参数矩阵,对应位置相乘,再相加,得到了一个标量,一个实数值。

PNN*

如果Product Layer同时使用内积+外积,把内积和外积的结果拼接起来,就得到PNN*。


三、EXPERIMENTS

使用Criteo和iPinYou的数据集,并用SGD算法比较了7种模型:LR、FM、FNN、CCPM、IPNN、OPNN、PNN(拼接内积和外积层),正则化部分(L2和Dropout);

从图中看出,好像tanh在某些方面要优于relu,但作者采用的是relu,relu的作用: 1、稀疏的激活函数(负数会被丢失);2、有效的梯度传播(缓解梯度消失和梯度爆炸);3、有效的计算(仅有加法、乘法、比较操作);


四、相关部分                 

Factorization-machine(FM)

FM主要是为了解决数据稀疏的情况下,特征组合问题。FM模型可以看成是线性部分的LR,还有非线性的特征组合xixj交叉而成,表示如下:

                     

其中vi是第i维特征的隐向量,长度k<<n,包含k个描述特征的因子。参数个数为k*n。所有包含xi的非零组合特征都可以用来训练vi,缓解数据稀疏问题。图1是从神经网络的角度表示FM, 可以看成底层为特征维度为n的离散输入,经过embedding层后,对embedding层线性部分(LR)和非线性部分(特征交叉部分)累加后输出。

                          

                                                                                           FM模型结构


五、参考

  1. 作者源代码:https://github.com/Atomu2014/product-nets
  2. 论文:https://arxiv.org/pdf/1611.00144.pdf
  3. 跟作者讨论过:计算广告CTR预估系列(八)--PNN模型理论与实践_李宁宁-CSDN博客
  4. 完整的代码:https://github.com/gutouyu/ML_CIA
  5. 深度学习在CTR预估中的应用_心之所向-CSDN博客_深度学习ctr
  6. 推荐系统(二):PNN源论文整理和思考_anshuai_aw1的博客-CSDN博客
  7. 【DNN】PNN(Product-based Neural Networks )_凝眸伏笔的博客-CSDN博客
  8. 计算广告之CTR预测--PNN模型 - debugger.wiki - debugger.wiki
  9. 推荐系统-FM(Factorization Machine)模型 - 简书

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Non-local Neural Networks (NLNet) 是一个用于图像和视频处理的深度学习模型,它在处理长距离的空间关系时表现出色。下面是一个使用 TensorFlow 2 实现的 NLNet 模型的示例代码: ```python import tensorflow as tf from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, Add, Input, Lambda, Concatenate from tensorflow.keras.models import Model from tensorflow.keras.regularizers import l2 def non_local_block(x, compression=2, mode='embedded_gaussian', reg=l2(0.)): ''' Non-local block with optional compression and different modes: - 'dot_product': dot product similarity (original paper) - 'embedded_gaussian': embedded Gaussian similarity (default) - 'concatenation': concatenation-based similarity (not recommended) ''' # Get input shape and channels input_shape = tf.shape(x) channels = input_shape[-1] # Define theta, phi, and g theta = Conv2D(channels // compression, 1, use_bias=False, kernel_regularizer=reg)(x) phi = Conv2D(channels // compression, 1, use_bias=False, kernel_regularizer=reg)(x) g = Conv2D(channels // compression, 1, use_bias=False, kernel_regularizer=reg)(x) # Reshape theta and phi to (N, H*W, C') theta = Lambda(lambda x: tf.reshape(x, (input_shape[0], -1, channels // compression)))(theta) phi = Lambda(lambda x: tf.reshape(x, (input_shape[0], -1, channels // compression)))(phi) # Compute similarity between theta and phi if mode == 'dot_product': similarity = Lambda(lambda x: tf.matmul(x[0], x[1], transpose_b=True))([theta, phi]) elif mode == 'embedded_gaussian': theta = Lambda(lambda x: tf.expand_dims(x, 2))(theta) phi = Lambda(lambda x: tf.expand_dims(x, 1))(phi) theta_phi = Add()([theta, phi]) f = Conv2D(1, 1, use_bias=False, kernel_regularizer=reg)(theta_phi) f = Activation('softmax')(f) similarity = Lambda(lambda x: tf.matmul(x[0], x[1]))([f, g]) elif mode == 'concatenation': theta_phi = Concatenate(axis=-1)([theta, phi]) h = Conv2D(channels // compression, 1, use_bias=False, kernel_regularizer=reg)(theta_phi) similarity = Lambda(lambda x: tf.matmul(x[0], x[1], transpose_b=True))([h, g]) # Reshape similarity to (N, H, W, C') similarity = Lambda(lambda x: tf.reshape(x, (input_shape[0], input_shape[1], input_shape[2], channels // compression)))(similarity) # Compute output y = Conv2D(channels, 1, use_bias=False, kernel_regularizer=reg)(similarity) y = Add()([y, x]) y = BatchNormalization()(y) y = Activation('relu')(y) return y def build_nlnet(input_shape, num_classes, num_blocks=5, compression=2, mode='embedded_gaussian', reg=l2(0.)): ''' Build NLNet model with optional number of blocks, compression, and mode. ''' # Define input inputs = Input(shape=input_shape) # Initial convolution x = Conv2D(64, 3, padding='same', use_bias=False, kernel_regularizer=reg)(inputs) x = BatchNormalization()(x) x = Activation('relu')(x) # Non-local blocks for i in range(num_blocks): x = non_local_block(x, compression=compression, mode=mode, reg=reg) # Final convolution and pooling x = Conv2D(128, 1, use_bias=False, kernel_regularizer=reg)(x) x = BatchNormalization()(x) x = Activation('relu')(x) x = Conv2D(num_classes, 1, use_bias=False, kernel_regularizer=reg)(x) x = BatchNormalization()(x) x = Activation('softmax')(x) x = Lambda(lambda x: tf.reduce_mean(x, axis=(1, 2)))(x) # Define model model = Model(inputs=inputs, outputs=x) return model ``` 此代码实现了一个用于图像分类的 NLNet 模型,其中包含多个非局部块。该模型使用可配置的压缩因子和模式,并支持 L2 正则化。要使用此代码,请调用 `build_nlnet()` 函数并传递输入形状、类别数以及其他可选参数。例如: ```python input_shape = (224, 224, 3) num_classes = 1000 model = build_nlnet(input_shape, num_classes, num_blocks=5, compression=2, mode='embedded_gaussian', reg=l2(0.0001)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值