Press "Enter" to skip to content

几句话总结一个算法之CTR预估模型

背景

 

假设现在有个商品点击预测的任务,有用户端特征性别、年龄、消费力等,商品侧特征价格、销量等,样本为0或者1,现在对特征进行one hot encode,如性别特征用二维表示,男为[1,0],女为[0,1],其他特征相同处理后拼接起来一共有n维,n是所有特征的类别数之和。

 

Logistic Regression(LR)与二阶

 

线性模型,y = sigmoid(w, x),w有n维,优点是简单易解释,缺点是太简单,无法挖掘特征组合的情况,如男性+游戏类商品可能是个很强特征。为了弥补这个缺点往往需要人工特征组合,如 手工组合特征 f = 性别是否男 & 商品是否为游戏类,这很依赖人工经验。于是就有了暴力的方法,枚举所有的两两特征的组合(线性二阶多项式),训练参数最大有 n * n个,但是性别男和性别女(相同性别field内)是无法组合的,真实值没这幺大。假设与n个特征,m个field,相同field 内部无法组合,则训练参数为0.5 * (n * n – (n/m * n/m) * m )

 

FM(Factorization Machines)

 

上面的LR线性二阶多项式参数空间是一个 n * n 的矩阵,过于庞大,可以用两个矩阵相乘得到,这两个矩阵的的维度是 n * k 和 k * n,那幺参数空间就是 2 * n * k,k是人为设置的参数,大小可以调节,如果k远远小于n,则参数数量将极大变小,更进一步,这两个矩阵可以用一个矩阵和它的转置来表示。

 

从embedding角度看,假设k为2,”男性和游戏类目“分别可以在这个矩阵中找到一个2维的向量表示,这两个向量的内积就表示了组合特征对预测结果的影响。

 

LR的二阶特征组合参数是独立的,如”男性&游戏类目“只看这个特征对最终结果的影响,注重记忆功能;而FM里面,男性这个特征的embedding受到的是来自于各个特征组合的影响,并不独立,注重泛化功能,效果上并不一定比LR二阶更好,但是参数空间是实实在在减少了,另外,FM要求特征embedding后的size一样大小,淘宝百万店铺,十个年龄层级性别,明显不太合适这种方法。

 

FFM(Field-aware Factorization Machines)

 

FFM是考虑领域知识的一种FM变种,上面介绍FM,男性这个特征的embedding受到的是来自于各个特征组合的影响,能不能降低这个影响?答案是考虑领域知识。假设有m个field,则男性对每个field都建立一个embedding,参数个数是 n * k *m,这是个鉴于二阶LR和FM之间的一个方法,”男性&游戏类目“ 中的男性这向量,还是受到其他类目组合的影响,但是不受到”男性&价格“这类特征组合的影响。

 

Embedding + MLP(Multilayer Perceptron)

 

底层所有特征都做embedding,连接起来,上面再堆叠多层全连接层,这里没有底层特征的组合,但是在可以在高阶组合,学习难度更大。与FM的优势在于,各个特征embedding的长度可以不用保持一致,这样的设置更为合理。

 

通过FM预训练embedding,上面再堆叠多层全连接层,是一种特殊的embedding + MLP。

 

embedding + MLP的方式没有考虑底层(低阶)特征的组合,DeepFM把FM的组合特征引入到 MLP充当”wide部分“,同时MLP也使用了FM的embedding表示联合训练。

 

NFM(Neural Factorization Machines)

 

FM是把两个向量做内积,即先把对应位置的元素相乘,后直接相加求和当做组合特征。NFM让两个特征的向量元素相乘,但是不急于直接求和组成特征,而是把所有组合特征元素在各自对应的位置累加起来,做当MLP的输入,个人感觉这种操作底层特征的信息丢失很大。

 

AFM(Attention Factorization Machine)

 

所有组合特征元素在各自对应的位置累加起来,AFM在NFM的基础上加入attention子网络,不再是平均求和,而是加权求和。

 

PNN(Product-based Neural Network)

 

DeepFM把FM的组合特征引入到 MLP充当”wide部分“,PNN直接FM的组合特征的内积或外积当做deep部分输入,但是这样又会导致product层的节点数至少是输入Field数的平方级别,为了降低节点数,采用外积后的sum pooling降低复杂度,又回到NFM的路子。

 

DCN(Deep&Cross Network)

 

采用了残差网络的思想,在高阶进行特征组合,下一个隐藏 = 上一个隐层的转置 * 该层参数w * 第一个隐层 + 上一个隐层+偏置项,其中w是要学习的参数,上一个隐层的转置 * w 实际上就是个标量了。

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注