PNN网络(Product-based Neural Network)

PNN网络(Product-based Neural Network)

1. 概述

PNN(Product-based Neural Network)是在2016年提出的用于计算CTR问题的深度神经网络模型,PNN的网络结构对传统的FNN(Feedforward Neural Network)网络结构做了一些优化,使得其能够更适合处理CTR问题。在PNN网络模型中,主要的优化点为:

  1. 通过Embedding层处理离散特征。Embedding层现在已经成为DNN模型处理CTR问题的标配;
  2. 增加Product层,在Product Layer中,通过显式构造特征交叉,在不同的特征域之间进行特征组合,在实际的实施过程中,会有不同的product计算方法,在参考文献[1]中,提到了两种不同的product计算方法,分别为inner producr和outer product。

2. 算法原理

2.1. PNN的网络结构

PNN的网络结构如下图所示:

www.zeeklog.com  - PNN网络(Product-based Neural Network)

从网络结构上看,整个网络分成四层,第一层为特征Embedding层,第二层为Product层(PNN最为核心的部分), 第三层与第四层是传统的全连接网络层,最后模型的输出层。其网络结构与传统的DNN网络结构基本一致,不同的就是比传统DNN网络结构增加了Product层,与传统DNN的网络结构对比如下图所示:

www.zeeklog.com  - PNN网络(Product-based Neural Network)

2.2. PNN网络的计算过程

从上到下最上层上PNN的输出层,PNN网络的输出为

y ^ = σ ( W 3 l 2 + b 3 ) \hat{y}=\sigma \left (\mathbf{W}_3\mathbf{l}_2+b_3\right ) y^​=σ(W3​l2​+b3​)

其中, W 3 ∈ R 1 × D 2 \mathbf{W}_3\in \mathbb{R}^{1\times D_2} W3​∈R1×D2​和 b 3 ∈ R b_3\in \mathbb{R} b3​∈R是L2层到输出层的参数, l 2 ∈ R D 2 \mathbf{l}_2\in \mathbb{R}^{D_2} l2​∈RD2​是L2层的输出, D 2 D_2 D2​为隐层L2层输出向量的维度, σ \sigma σ为输出层的激活函数,且是CTR计算中通常使用的激活函数,此处便不在赘述。L2层的输出 l 2 \mathbf{l}_2 l2​为:

l 2 = r e l u ( W 2 l 1 + b 2 ) \mathbf{l}_2=relu\left ( \mathbf{W}_2\mathbf{l}_1+\mathbf{b}_2 \right ) l2​=relu(W2​l1​+b2​)

其中, W 2 ∈ R D 2 × D 1 \mathbf{W}_2\in \mathbb{R}^{D_2\times D_1} W2​∈RD2​×D1​和 b 2 ∈ R D 2 \mathbf{b}_2\in \mathbb{R}^{D_2} b2​∈RD2​为L1层到L2层的参数, l 1 ∈ R D 1 \mathbf{l}_1\in \mathbb{R}^{D_1} l1​∈RD1​是L1层的输出, D 1 D_1 D1​为隐层L1层输出向量的维度, r e l u relu relu为L2层的激活函数。L1层的输出 l 1 \mathbf{l}_1 l1​为:

l 1 = r e l u ( l z + l p + b 1 ) \mathbf{l}_1=relu\left ( \mathbf{l}_z+\mathbf{l}_p+\mathbf{b}_1 \right ) l1​=relu(lz​+lp​+b1​)

其中, b 1 ∈ R D 1 \mathbf{b}_1\in \mathbb{R}^{D_1} b1​∈RD1​为Product层到L1层的参数。 l z ∈ R D 1 \mathbf{l}_z\in \mathbb{R}^{D_1} lz​∈RD1​为Product的线形部分, l p ∈ R D 1 \mathbf{l}_p\in \mathbb{R}^{D_1} lp​∈RD1​ 为Product的特征交叉部分。 l z \mathbf{l}_z lz​和 l p \mathbf{l}_p lp​分别为:

l z = ( l z 1 , l z 2 , ⋯ , l z n , ⋯ , l z D 1 ) , l z n = W z n ⊙ z \mathbf{l}_z=\left ( l_z^1,l_z^2,\cdots ,l_z^n,\cdots ,l_z^{D_1} \right ),\; l_z^n=\mathbf{W}_z^n\odot \mathbf{z} lz​=(lz1​,lz2​,⋯,lzn​,⋯,lzD1​​),lzn​=Wzn​⊙z

l p = ( l p 1 , l p 2 , ⋯ , l p n , ⋯ , l p D 1 ) , l p n = W p n ⊙ p \mathbf{l}_p=\left ( l_p^1,l_p^2,\cdots ,l_p^n,\cdots ,l_p^{D_1} \right ),\; l_p^n=\mathbf{W}_p^n\odot \mathbf{p} lp​=(lp1​,lp2​,⋯,lpn​,⋯,lpD1​​),lpn​=Wpn​⊙p

其中, W z n \mathbf{W}_z^n Wzn​和 W p n \mathbf{W}_p^n Wpn​是Embedding层到Product层的参数, z \mathbf{z} z为线型特征部分, p \mathbf{p} p为交叉特征部分,且 z \mathbf{z} z为:

z = ( z 1 , z 2 , ⋯ , z N ) = △ ( f 1 , f 2 , ⋯ , f N ) \mathbf{z}=\left ( \mathbf{z}_1,\mathbf{z}_2,\cdots ,\mathbf{z}_N \right )\overset{\underset{\triangle }{}}{=}\left ( \mathbf{f}_1,\mathbf{f}_2,\cdots ,\mathbf{f}_N\right ) z=(z1​,z2​,⋯,zN​)=△​(f1​,f2​,⋯,fN​)

其中, f i ∈ R M \mathbf{f}_i\in \mathbb{R}^M fi​∈RM为第 i i i个Embedding特征。交叉特征 p \mathbf{p} p为:

p = { p i , j } , i = 1 ⋯ N , j = 1 ⋯ N \mathbf{p}=\left\{\mathbf{p}_{i,j} \right\}, i=1\cdots N,j=1\cdots N p={pi,j​},i=1⋯N,j=1⋯N

其中, p i , j = g ( f i , f j ) \mathbf{p}_{i,j}=g\left ( \mathbf{f}_i,\mathbf{f}_j \right ) pi,j​=g(fi​,fj​), g g g表示不同的特征交叉函数。Embedding特征 f i \mathbf{f}_i fi​为:

f i = W 0 i x i [ s t a r t i : e n d i ] \mathbf{f}_i=\mathbf{W}_0^i\: \mathbf{x}_i\left [ start_{i} : end_{i} \right ] fi​=W0i​xi​[starti​:endi​]

而对于Product层的函数 g g g,在参考文献[1]中提到了两种方法,分别为Inner Product和Outer Product。

2.2.1. Inner Product

在Inner Product中,函数 g g g为:

g ( f i , f j ) = < f i , f j > g\left ( \mathbf{f}_i,\mathbf{f}_j \right )=\left<\mathbf{f}_i,\mathbf{f}_j \right> g(fi​,fj​)=⟨fi​,fj​⟩

其中, < f i , f j > \left<\mathbf{f}_i,\mathbf{f}_j \right> ⟨fi​,fj​⟩表示的是向量 f i \mathbf{f}_i fi​和向量 f j \mathbf{f}_j fj​的内积。基于Inner Product的PNN模型又可以称为IPNN(Inner Product-based Neural Network)。此时 l z n l_z^n lzn​和 l p n l_p^n lpn​分别为:

l z n = W z n ⊙ z = ∑ i = 1 N ( W z ) i z i = ∑ i = 1 N ( W z ) i f i l_z^n=\mathbf{W}_z^n\odot \mathbf{z}=\sum_{i=1}^{N}\left ( \mathbf{W}_z \right )_{i}\mathbf{z}_i=\sum_{i=1}^{N}\left ( \mathbf{W}_z \right )_{i}\mathbf{f}_i lzn​=Wzn​⊙z=i=1∑N​(Wz​)i​zi​=i=1∑N​(Wz​)i​fi​

l p n = W p n ⊙ p = ∑ i = 1 N ∑ j = 1 N ( W p n ) i , j p i , j = ∑ i = 1 N ∑ j = 1 N ( W p n ) i , j < f i , f j > l_p^n=\mathbf{W}_p^n\odot \mathbf{p}=\sum_{i=1}^{N}\sum_{j=1}^{N}\left ( \mathbf{W}_p^n \right )_{i,j}\mathbf{p}_{i,j}=\sum_{i=1}^{N}\sum_{j=1}^{N}\left ( \mathbf{W}_p^n \right )_{i,j}\left<\mathbf{f}_i,\mathbf{f}_j \right> lpn​=Wpn​⊙p=i=1∑N​j=1∑N​(Wpn​)i,j​pi,j​=i=1∑N​j=1∑N​(Wpn​)i,j​⟨fi​,fj​⟩

如何去分析Product层的计算复杂度?已知, f i ∈ R M \mathbf{f}_i\in \mathbb{R}^M fi​∈RM,特征的个数为 N N N,因此, l z n l_z^n lzn​的时间复杂度为 O ( N M ) O\left ( NM \right ) O(NM), l p n l_p^n lpn​的时间复杂度 O ( N 2 M ) O\left ( N^2M \right ) O(N2M),由 l p n l_p^n lpn​到 l p \mathbf{l}_p lp​的时间复杂度为 O ( N 2 D 1 ) O\left ( N^2D_1 \right ) O(N2D1​)。因此,线型部分 l z \mathbf{l}_z lz​的时间复杂度为 O ( D 1 N M ) O\left ( D_1NM \right ) O(D1​NM),交叉部分 l p \mathbf{l}_p lp​的时间复杂度为 O ( N 2 ( M + D 1 ) ) O\left ( N^2\left ( M+D_1 \right ) \right ) O(N2(M+D1​))。

受FM算法中参数矩阵分解的启发,参考文献[1]中提出使用矩阵分解的方式来降低时间复杂度。其中要注意 p i , j \mathbf{p}_{i,j} pi,j​, W p n \mathbf{W}_p^n Wpn​都是对称矩阵,所以可以使用一阶矩阵分解。假设 W p n = θ n θ n T \mathbf{W}_p^n=\mathbf{\theta }^n\mathbf{\theta }^{nT} Wpn​=θnθnT,其中 θ n ∈ R N \mathbf{\theta }^n\in \mathbb{R}^N θn∈RN。 l p n l_p^n lpn​可以表示为:

l p n = W p n ⊙ p = ∑ i = 1 N ∑ j = 1 N ( W p n ) i , j < f i , f j > = ∑ i = 1 N ∑ j = 1 N θ i n θ j n < f i , f j > = ∑ i = 1 N ∑ j = 1 N < θ i n f i , θ j n f j > = < ∑ i = 1 N θ i n f i , ∑ j = 1 N θ j n f j > = ∥ ∑ i = 1 N δ i n ∥ 2 \begin{aligned} l_p^n&=\mathbf{W}_p^n\odot \mathbf{p}=\sum_{i=1}^{N}\sum_{j=1}^{N}\left ( \mathbf{W}_p^n \right )_{i,j}\left<\mathbf{f}_i,\mathbf{f}_j \right> \\ &=\sum_{i=1}^{N}\sum_{j=1}^{N}\theta _i^n\theta _j^n\left<\mathbf{f}_i,\mathbf{f}_j \right> \\ &=\sum_{i=1}^{N}\sum_{j=1}^{N}\left<\theta _i^n\mathbf{f}_i,\theta _j^n\mathbf{f}_j \right> \\ &=\left<\sum_{i=1}^{N}\theta _i^n\mathbf{f}_i,\sum_{j=1}^{N}\theta _j^n\mathbf{f}_j \right> \\ &= \left\| \sum_{i=1}^{N}\delta _i^n\right\|^2 \end{aligned} lpn​​=Wpn​⊙p=i=1∑N​j=1∑N​(Wpn​)i,j​⟨fi​,fj​⟩=i=1∑N​j=1∑N​θin​θjn​⟨fi​,fj​⟩=i=1∑N​j=1∑N​⟨θin​fi​,θjn​fj​⟩=⟨i=1∑N​θin​fi​,j=1∑N​θjn​fj​⟩=∥∥∥∥∥​i=1∑N​δin​∥∥∥∥∥​2​

其中, δ i n = θ i n f i \delta _i^n=\theta _i^n\mathbf{f}_i δin​=θin​fi​,则 l p \mathbf{l}_p lp​为:

l p = ( ∥ ∑ i = 1 N δ i 1 ∥ 2 , ⋯ , ∥ ∑ i = 1 N δ i n ∥ 2 , ⋯ , ∥ ∑ i = 1 N δ i D 1 ∥ 2 ) \mathbf{l}_p=\left ( \left\| \sum_{i=1}^{N}\delta _i^1\right\|^2,\cdots ,\left\| \sum_{i=1}^{N}\delta _i^n\right\|^2,\cdots ,\left\| \sum_{i=1}^{N}\delta _i^{D_1}\right\|^2 \right ) lp​=⎝⎛​∥∥∥∥∥​i=1∑N​δi1​∥∥∥∥∥​2,⋯,∥∥∥∥∥​i=1∑N​δin​∥∥∥∥∥​2,⋯,∥∥∥∥∥​i=1∑N​δiD1​​∥∥∥∥∥​2⎠⎞​

时间复杂度为 O ( D 1 N M ) O\left ( D_1NM \right ) O(D1​NM)。

2.2.2. Outer Product

在Outer Product中,函数 g g g为:

g ( f i , f j ) = f i f j T g\left ( \mathbf{f}_i,\mathbf{f}_j \right )=\mathbf{f}_i\mathbf{f}_j^T g(fi​,fj​)=fi​fjT​

此时,由于 f i ∈ R M \mathbf{f}_i\in \mathbb{R}^M fi​∈RM,因此 p i , j ∈ R M × M \mathbf{p}_{i,j}\in \mathbb{R}^{M\times M} pi,j​∈RM×M是一个方阵。基于Outer Product的PNN模型又可以称为OPNN(Outer Product-based Neural Network)。此时 l p n l_p^n lpn​为:

l p n = W p n ⊙ p = ∑ i = 1 N ∑ j = 1 N ( W p n ) i , j p i , j = ∑ i = 1 N ∑ j = 1 N ( W p n ) i , j f i f j T l_p^n=\mathbf{W}_p^n\odot \mathbf{p}=\sum_{i=1}^{N}\sum_{j=1}^{N}\left ( \mathbf{W}_p^n \right )_{i,j}p_{i,j}=\sum_{i=1}^{N}\sum_{j=1}^{N}\left ( \mathbf{W}_p^n \right )_{i,j}\mathbf{f}_i\mathbf{f}_j^T lpn​=Wpn​⊙p=i=1∑N​j=1∑N​(Wpn​)i,j​pi,j​=i=1∑N​j=1∑N​(Wpn​)i,j​fi​fjT​

对于Outer Product,此时的 p i , j \mathbf{p}_{i,j} pi,j​为 M × M M \times M M×M的矩阵,而 p \mathbf{p} p是 N × N × M × M N \times N \times M \times M N×N×M×M的矩阵,因此 p \mathbf{p} p的计算时间复杂度为 O ( M 2 N 2 ) O\left ( M^2N^2 \right ) O(M2N2), l p \mathbf{l}_p lp​的计算时间复杂度为 O ( D 1 M 2 N 2 ) O\left ( D_1M^2N^2 \right ) O(D1​M2N2)。参考文献[1]使用了叠加(superposition)的思想,重新定义了 p \mathbf{p} p矩阵:

p = ∑ i = 1 N ∑ j = 1 N f i f j T = f ∑ ( f ∑ ) T , f ∑ = ∑ i = 1 N f i \mathbf{p}=\sum_{i=1}^{N}\sum_{j=1}^{N}\mathbf{f}_i\mathbf{f}_j^T=\mathbf{f}_{\sum }\left ( \mathbf{f}_{\sum } \right )^T,\; \mathbf{f}_{\sum }=\sum_{i=1}^{N}\mathbf{f}_i p=i=1∑N​j=1∑N​fi​fjT​=f∑​(f∑​)T,f∑​=i=1∑N​fi​

此时,  p ∈ R M × M \mathbf{p}\in \mathbb{R}^{M\times M} p∈RM×M,通过上述分析,最终 l p \mathbf{l}_p lp​的计算时间复杂度为 O ( D 1 M ( M + N ) ) O\left ( D_1M\left ( M+N \right ) \right ) O(D1​M(M+N))。

3. 总结

PNN网络结构在传统的DNN中增加了Product层,从而实现了特征的交叉,在具体的实现过程中,提出了两种Product的计算,分别为Inner Product和Outer Product。在具体的数据中,两种Product的表现并不一致,需要根据具体的数据选择合适的Product计算方法,相比较传统的DNN,从实验结果来看,效果上PNN得到了较大提升。

参考文献

[1] Qu Y , Han C , Kan R , et al. Product-Based Neural Networks for User Response Prediction[C]// 2016 IEEE 16th International Conference on Data Mining (ICDM). IEEE, 2016.

Read more

60个“特征工程”计算函数(Python代码)

60个“特征工程”计算函数(Python代码)

转自:coggle数据科学 近期一些朋友询问我关于如何做特征工程的问题,有没有什么适合初学者的有效操作。 特征工程的问题往往需要具体问题具体分析,当然也有一些暴力的策略,可以在竞赛初赛前期可以带来较大提升,而很多竞赛往往依赖这些信息就可以拿到非常好的效果,剩余的则需要结合业务逻辑以及很多其他的技巧,此处我们将平时用得最多的聚合操作罗列在下方。 最近刚好看到一篇文章汇总了非常多的聚合函数,就摘录在下方,供许多初入竞赛的朋友参考。 聚合特征汇总 pandas自带的聚合函数 * 其它重要聚合函数 其它重要聚合函数&分类分别如下。 def median(x):     return np.median(x) def variation_coefficient(x):     mean = np.mean(x)     if mean != 0:         return np.std(x) / mean     else:         return np.nan def variance(x):     return

By Ne0inhk
90w,确实可以封神了!

90w,确实可以封神了!

要说24年一定最热的技术,还得是AIGC! 前段时间阿里旗下的开源项目,登上GitHub热榜! AI大热,如今ChatGPT的优异表现,必然会出现各种细分场景应用的工具软件,和大量岗位项目! 山雨欲来风满楼,强人工智能的出现,所有科技公司已经开始巨量扩招此领域的人才。算法的岗位,近三个月已经增长68%!这件事在HR届也是相当震撼的。 目前各行各业都不景气的市场,人工智能岗位却一直保持常青!甚至同属AI边缘岗都比其他岗薪资高40%! 与此同时,AI算法岗上岸也不简单,竞争激烈,好公司核心岗位不用说,谁都想去。 所以事实就是,想要上岸,门槛也逐渐变高,项目经历、实习经历都很重要,越早明白这个道理就越能提前建立起自己的优势。 但我在b站逛知识区的时候,经常看到有些同学,因为一些客观原因导致无法参加实习,这种情况下,如果你想提升背景,增加项目经历的话,可以试试这个《CV/NLP 算法工程师培养计划》。 目前已经有上千位同学通过该计划拿到offer了,最新一期学员就业薪资最高能拿到78K!年薪94w! 优势就是有BAT大厂讲师带领,手把手带做AI真实企业项目(包含CV、NLP等

By Ne0inhk
再见nohup!试试这个神器,Python Supervisor!

再见nohup!试试这个神器,Python Supervisor!

👇我的小册 45章教程:() ,原价299,限时特价2杯咖啡,满100人涨10元。 作者丨Ais137 https://juejin.cn/post/7354406980784373798 1. 概述 Supervisor 是一个 C/S 架构的进程监控与管理工具,本文主要介绍其基本用法和部分高级特性,用于解决部署持久化进程的稳定性问题。 2. 问题场景 在实际的工作中,往往会有部署持久化进程的需求,比如接口服务进程,又或者是消费者进程等。这类进程通常是作为后台进程持久化运行的。 一般的部署方法是通过 nohup cmd & 命令来部署。但是这种方式有个弊端是在某些情况下无法保证目标进程的稳定性运行,有的时候 nohup 运行的后台任务会因为未知原因中断,从而导致服务或者消费中断,进而影响项目的正常运行。 为了解决上述问题,通过引入 Supervisor 来部署持久化进程,提高系统运行的稳定性。 3. Supervisor 简介 Supervisor is a client/

By Ne0inhk
第一本给程序员看的AI Agent图书上市了!

第一本给程序员看的AI Agent图书上市了!

AI Agent火爆到什么程度? OpenAI创始人奥特曼预测,未来各行各业,每一个人都可以拥有一个AI Agent;比尔·盖茨在2023年层预言:AI Agent将彻底改变人机交互方式,并颠覆整个软件行业;吴恩达教授在AI Ascent 2024演讲中高赞:AI Agent是一个令人兴奋的趋势,所有从事AI开发的人都应该关注。而国内的各科技巨头也纷纷布局AI Agent平台,如:钉钉的AI PaaS、百度智能云千帆大模型平台等等。 Agent 是未来最重要的智能化工具。对于程序员来说,是时候将目光转向大模型的应用开发了,率先抢占AI的下一个风口AI Agent。 小异带来一本新书《大模型应用开发 动手做 AI Agent》,这本书由《GPT图解》的作者黄佳老师创作,从0到1手把手教你做AI Agent。现在下单享受5折特惠! ▼点击下方,即可5折起购书 有这样一本秘籍在手,程序员们这下放心了吧,让我们先来揭开 Agent 的神秘面纱。 AI Agent 面面观

By Ne0inhk