题记:除了人工设计交叉特征,你知道有哪些方法在模型层面自动学习交叉特征吗
该篇文章介绍的是阿里周国睿大佬的一篇新论文CAN: Revisiting Feature Co-Action For Click-Through Rate Prediction。他的上一篇论文你一定听说过,那就是著名的阿里深度兴趣网络DIN,这次周国睿大佬为我们提出了一种特征交互的新方法。
CAN中的「 Co-Action Unit 」可以看成是DIN网络中计算历史用户行为与target item 相似度的「Activation Unit 」的升级。不同的是DIN 「Activation Unit 」建模的是某历史行为与taget item 间的“相关度”,需要再乘上原历史行为才是一个新的特征表达。而「 Co-Action Unit 」直接生成了某历史行为与taget item的交叉表达,跳过了建模“相关度”这一步骤,减少了信息折损。
一. 背景
先明确Co-Action含义,Co-Action指特征之间的协同作用。例如在电商场景下,用户历史点击商品与预估商品的交叉就是一个很强的Co-Action特征。
如上图,如果A和B两个特征被挑中了,那么A和B的交叉特征作为一个新的特征加入模型,称这个模型叫“笛卡尔积”模型。实验发现这种“笛卡尔积”模型效果要比DCN、PNN、FM、DeepFM这种embedding交叉的方式要好。这说明了一个问题:一个特征的embedding无法同时承担单独特征本身和跟其他特征Co-Action 的两个功能。下面用公式来阐述这个问题。
对于CTR预估方法,如果不考虑特征Co-Action,则
u代表用户侧特征,m代表物品侧特征,E代表特征嵌入。
如果考虑特征Co-Action,则
其中F(ui,mj)i,j 代表用户特征ui 和物品特征mj 的交叉。
如果 F 和 E不相关,则相当于新增一个组合特征,此时这种组合特征是独立地学习的,记忆性最好,对co-action的建模很有效,实际上就是笛卡尔积方法。但是组合特征量很大,且大多是低频的,学习过程不稳定。
如果 F 等于 E,即,此时效果并不如笛卡尔积。建模不是很有效,因为Co-Action会受到E(ui)和E(mj)各自单独的学习过程的影响。
二. Motivation
笛卡尔积方式的参数量过大, 为O(N2*D), N为特征个数,D为embedding维度。
CAN提出以一种相对较少参数量来区分开原始特征表达和Co-Action表达的方法。CAN参数个数O(N*T), 其中T是Co-Action unit的参数维度,T<<N, D<T。
三. 网络结构
如下图中,作者挑出来一部分特征与target item 做Co-Action,这类特征一部分是用户行为序列特征,另一部分是如user age 这种非序列但和target强相关的特征。用来做Co-Action的特征的向量表达和DNN中的特征嵌入是独立的,正如图中画的Parameter lookup和Embedding Layer是分开来的。
3.1 Co-Action Unit
Co-Action Unit 是网络中最关键单元,他可以看成一个组合特征生成器,输入两个像组合的特征,输出组合之后的结果。
如上图,作者将要建模co-action效应的两个特征分为了两端。一端拓展了特征的向量维度数,并切分成多个slot向量。不同slot向量可以通过reshape的方式来充当MLP网络不同层参数的角色,另一端则通过手动构造高阶的特征来作为MLP的输入。二者通过多层的MLP来实现co-action效应的建模。
用MLP建模Pitem 和 Puser 交互的优势是什么呢?论文中并没有给出解释,参考博客[1]中的见解如下:
-
参数共享
物品侧特征和用户侧特征进行Co-Action的时候,物品侧特征是共享的。比如两条样本分别是哈啤&纸尿裤A 和 哈啤&纸尿裤B,则哈啤这个特征会被这两条样本同时更新。
只不过通过拓宽物品侧参数向量长度为T,加上MLP的门控机制,能够有效地保证这种共享不是过度泛化的,即:T维向量不同部分是相对比较独立的。当然,这种共享的程度是受到T的大小的影响,T太大就过度独立,T太小就过度共享。
-
DNN计算
MLP的主要作用实际上是体现在不同层之间的激活函数,激活函数可以认为充当着门控的角色。reshape操作本质上相当于是对向量空间做了切分,划分为不同的slot,每个slot映射到某层MLP的参数上,且不同slot之间是有信息协同、过滤、递进的关系,通过MLP前向传播矩阵乘法和激活函数来实现的,保证不同slot各司其职,低层的slot负责低level的信息,通过激活函数过滤了噪声后,传到高层的slot来负责高level信息的提取。在梯度反传的时候,不同slot通过激活函数门控机制会接收到不同层次的信息,来保证各自的参数有相对比较独立的更新。进一步,由于激活函数的存在,item A和不同的user特征如B或C做co-action时,B提供给A的梯度信息和C提供给A的梯度信息都会不太一样,保证了参数更新的独立性。
如果不以MLP的视角来看,相当于第一个item slot和user特征做个交互,提取出低阶的信息,激活函数过滤掉无用信息后,再和第二个负责高阶信息提取的item slot做个交互,以此类推。
-
避免用MLP做特征交叉时参数的影响
如果使用原生MLP做item和user 特征的交叉,除了各自的嵌入向量之后,还依赖MLP中的参数矩阵W。用共享的W,这样不同特征最终的表征向量会受到W的影响,其梯度又会反向作用W 的学习,进而又通过W影响其他特征的表征向量的学习过程。不同特征之间的梯度信息是耦合在一起的,无法保证稳定而独立的学习,影响了记忆性。
3.2 多重独立性
-
参数独立 「 必须使用」
每个特征都有两种嵌入向量,一种是用于表征DNN学习的,即文中的Euser ,一种是用于co-action建模的,即前文提到的Puser
-
组合独立 「 推荐使用」
前文我们提到,item(参数侧)的特征,会和多种user(输入侧)的特征做co-action建模,这样item是会被共享的,可能会影响学习的独立性。一种思路是,同一个item,对每个不同的user侧特征,用于建模其co-action的item侧特征参数都不一样;user侧同理。这种情况下,如果有N个user特征,M个item特征,那么item侧需要O(M✕N✕T)的参数量,user侧需要O(M✕N✕D)的参数量。这种方式的参数量和笛卡尔积是相同的,并没有降低参数量。那么其优势只剩下CAN Unit结构本身了.
-
阶数独立 「可选」
不同阶对应不同的MLPcan网络参数。
四. 总结
不管是DIN/DIEN还是CAN,其目的都是为了增强co-action特征的表达能力。DIN这类方法比较soft,而笛卡尔积又过于hard。CAN在二者之间做了个折中,通过网络参数化的方式能够增强co-action特征的表达能力,同时由于拓宽了co-action的参数空间、co-action的参数空间和表征学习的嵌入空间之间的独立性、激活函数门控机制等,就能够保证co-action参数不同的部分有相对比较稳定和独立的参数来维持对建模信息的学习记录,同时又能让不同的co-action间有一定的信息共享。
参考
[1]. http://xtf615.com/2021/01/10/can/
[2]. https://arxiv.org/abs/2011.05625