推荐系统模型学习
1. FM
针对海量稀疏特征需要进行交叉学习的特点,学习隐向量,用0.5*(和的平方-平方的和)计算结果,优化算法是梯度下降算法
1.1 优点
- FM模型可以在非常稀疏的情况下进行参数估计
- FM模型是线性时间复杂度的
- FM是线性模型的升级版,是深度模型的基础
- FM模型是一个通用的模型,其训练数据的特征取值可以是任意实数。
- FMs可以模拟MF、SVD++、PITF或FPMC模型。
- 使用优化矩阵的优化技巧达到线性时间复杂度
1.2 缺点
只能实现特征的二阶交叉组合
1.3 备注
DeepCTR没有实现这个算法
2. FFM
增加field,细粒度划分
以下这些深度模型的输入都是embedding
3. WDL
左边是wide,是记忆化特征,是全连接(dense)+embedding,右边是Deep,是泛化性特征,是所有embedding特征经过Deep
3.1 优点:
- 大量复用原有的特征
- 两个模型的loss共同作用,但是单个模型只需要专注于自己,这样单个模型的复杂度和性能都可以得到控制,整体模型的效果可以提升。
- 实现低阶特征和高阶特征的共同作用,扩展特征作用,但dense embedding 的方法还是可以得到对所有 user-item pair 的非零预测,因此导致 over-generalize并推荐不怎么相关的物品。此时Memorization就展示了优势,它可以“记住”这些特殊的特征组合。
- 应该也把算力考虑进去,NN的性能无法保证
3.2 缺点:
深度模型难调参,层数无法升高
使用技巧
参考链接:https://zhuanlan.zhihu.com/p/53361519
原作者使用时:wide使用被推荐app*用户下载的app,NN部分使用大量spare embedding
训练样本约5000亿
Categorical 特征(sparse)会有一个过滤阈值,即至少在训练集中出现m次才会被加入
Continuous 特征(dense)通过CDF被归一化到 [0,1] 之间
Categorical 特征映射到32维embeddings,和原始Continuous特征共1200维作为NN输入
Wide部分只用了一组特征叉乘,即被推荐的app ☓ 用户下载的app
线上模型更新时,通过“热启动”重训练,即使用上次的embeddings和模型参数初始化
Wide部分设置很有意思,作者为什么这么做呢?结合业务思考,在Google Play商店的app下载中,不断有新的app推出,并且有很多“非常冷门、小众”的app,而现在的智能手机user几乎全部会安装一系列必要的app。
联想前面对Memorization和Generalization的介绍,此时的Deep部分无法很好的为这些app学到有效的embeddding,而这时Wide可以发挥了它“记忆”的优势,作者在这里选择了“记忆”user下载的app与被推荐的app之间的相关性,有点类似“装个这个app后还可能会装什么”。对于Wide来说,它现在的任务是弥补Deep的缺陷,其他大部分的活就交给Deep了,所以这时的Wide相比单独Wide也显得非常“轻量级”,这也是Join相对于Ensemble的优势。
4. DeepFM
左边是FM,右边是Deep
DeepFM和WDL的区别是
WDL:LR+Deep,其中LR部分针对sparse是embedding加法,针对连续值是Dense
DeepFM:LR+FM+Deep,LR部分同上,FM部分输入是Deep的输入
Deep的Embedding做法是sparse+sequence的embedding+dense数值
5. FNN
FNN中的F是FM,以FM作为底层的输入,其实本质也是embedding,但是FM的embedding
5.1 优点
引入DNN对特征进行更高阶组合,减少特征工程,能在一定程度上增强FM的学习能力。这种尝试为后续深度推荐模型的发展提供了新的思路(相比模型效果而言,个人感觉这种融合思路意义更大)。
5.2 缺点
上层是DNN,底层是FM,有点类似DeepFM模型,但是没有DeepFM模型的细粒度特征
两阶段训练模式,在应用过程中不方便,且模型能力受限于FM表征能力的上限。
FNN专注于高阶组合特征,但是却没有将低阶特征纳入模型
FM中进行特征组合,使用的是隐向量点积。将FM得到的隐向量移植到DNN中接入全连接层,全连接本质是将输入向量的所有元素进行加权求和,且不会对特征Field进行区分。
5.3 备注
DeepCTR框架中FNN的输出结果是由线性+Deep两份组成,但是原文没有线性部分!
6. PNN
为了交叉特征更充分,所以用特征乘积表示特征的交叉组合
用Embedding做内积和外积,积的形式也是余弦相似度的表现,所以可以用积的形式。
备注:实现的时候是线性+内积+外积作为输入数据进入Deep,然后得到结果
7. DCN
层级结构分为数据输入层、embedding、cross+deep、conbine和输出层
数据输入层:sprase和dense数据
embedding层:sparse进行embedding,dense进行数据归一化,两者拼接成一个vector作为后续两部分的输入
cross:$f(x_{l+1})=x_l*x_l*W+x_l$,在原先的基础上加上x_l, 所以形式很像残差。通常是1-6层,这里x*x就是自动叉乘。
deep:和其他模块都差不多,2-5层
conbine:两个模块的结果加权得到结果
输出层:经过sigmoid或者softmax
采用logistic loss作为损失函数,进行联合训练。学习率为0.0001-0.001
优点:
1. 自动特征交叉;
2. 有限高阶,阶数是由层数决定的。
3. 参数共享:不同叉乘项对应的权重不同,但并非每个叉乘组合对应独立的权重(指数数量级), 通过参数共享,Cross有效降低了参数量。此外,参数共享还使得模型有更强的泛化性和鲁棒性。例如,如果独立训练权重,当训练集中 [公式]这个叉乘特征没有出现 ,对应权重肯定是零,而参数共享则不会,类似地,数据集中的一些噪声可以由大部分正常样本来纠正权重参数的学习
4. cross的结构和RNN类似,下一层依赖上一层的结果
缺点:
1. 有一些公司实现之后没有提升效果
QA:
1. cross和deep两部分训练有什么技巧?
没有找到相关资料!
2. 为什么是逻辑斯蒂函数作为损失函数?
本质是交叉熵,最大似然估计,如果是多类的话,就是softmax
备注:
实现的时候是每一层的结果*x0+bias+xl,使用先算后面的技巧!
8. xDeepFM
参考的文章 https://www.jianshu.com/p/b4128bc79df0
bit-wise VS vector-wise
假设隐向量的维度为3维,如果两个特征(对应的向量分别为(a1,b1,c1)和(a2,b2,c2)的话)在进行交互时,交互的形式类似于f(w1 * a1 * a2,w2 * b1 * b2 ,w3 * c1 * c2)的话,此时我们认为特征交互是发生在元素级(bit-wise)上。如果特征交互形式类似于 f(w * (a1 * a2 ,b1 * b2,c1 * c2))的话,那么我们认为特征交互是发生在特征向量级(vector-wise)。
explicitly VS implicitly
显式的特征交互和隐式的特征交互。以两个特征为例xi和xj,在经过一系列变换后,我们可以表示成 wij * (xi * xj)的形式,就可以认为是显式特征交互,否则的话,是隐式的特征交互。
xDeepFM模型不仅能同时以显式和隐式的方式自动学习高阶的特征交互,使特征交互发生在向量级,还兼具记忆与泛化的学习能力。
xDeepFM模型是DCN的升级版
xDeepFM主要分为三个结构:LR+Deep+CIN
其中CIN结构类似DCN的cross部分,每一层隐向量矩阵*输入向量矩阵,得到三维的矩阵,一个embedding对应的向量进行加权求和,得到一维的向量。
终学习出的特征交互的阶数是由网络的层数决定的,每一层隐层都通过一个池化操作连接到输出层,从而保证了输出单元可以见到不同阶数的特征交互模式。同时不难看出,CIN的结构与循环神经网络RNN是很类似的,即每一层的状态是由前一层隐层的值与一个额外的输入数据计算所得。不同的是,CIN中不同层的参数是不一样的,而在RNN中是相同的;RNN中每次额外的输入数据是不一样的,而CIN中额外的输入数据是固定的,始终是X0。
备注:
实现和DCN非常接近,注意区别!
位级别的乘法和向量级别的乘法的区别:
xDeepFM计算的时候是输入向量和隐藏层每一行每一行的相乘。
DNN是在位级别上的计算