阅读论文:Wide & Deep Learning for Recommender Systems
背景
推荐系统中需要兼顾模型的Memorization和Generalization,文章研究了Wide&Deep的模型来解决上述问题。
Memorization
文中给Memorization的定义如下,个人理解是Memorization实现对训练数据的记忆,因此表现为在训练数据上提高模型的准确率,降低模型bias。
Memorization can be loosely defined as learning the frequent co-occurrence of items or features and exploiting the correlation available in the historical data.
实现Memorization的模型就是线性模型,常输入的特征是原始特征和叉乘特征(cross-product feature)。原始特征定义为:;叉乘特征定义为:,其中表示叉乘变换是否考虑第维特征,如果考虑则,否则,表示第维特征(这里特征应该都是01表示)。交叉特征AND(gender=female, language=en)=1当且仅当gender=female和language=en成立。
使用线性模型时,模型解释性强,实现高效,但是具有以下问题
- 需要人工设计特征
- 无法捕捉未出现的交叉特征对,当没有这些数据时,在训练后无法对新特征值对有较好的预测结果
Generalization
文中给出的Generalization定义如下,个人认为是降低模型的variance。
Generalization, on the other hand, is based on transitivity of correlation and explores new feature combinations that have never or rarely occurred in the past.
可以通过深度神经网络实现Generalization,首先将高维的稀疏特征转化为低维稠密的特征(通过上述变换,可以捕捉特征之间的相关性,学习的embedding具有一定的语义信息)。
查询项矩阵是稀疏且高阶的(例如用户具有特定的偏好或小范围的吸引力)时,很难学习查询和项的有效低维表示。在这种情况下,大多数查询和项之间应该是没有相关性的,但是embedding导致计算的相似度不为0,出现不是很相关的推荐。
Memorization根据历史行为数据,产生的推荐通常和用户已有行为的物品直接相关的物品。而Generalization会学习新的特征组合,提高推荐物品的多样性。 论文作者结合两者的优点,提出了一个新的学习算法——Wide & Deep Learning,其中Wide & Deep分别对应Memorization & Generalization。
模型
模型的结果如下图所示,其中Wide Models即为线性模型,Deep Models首先通过全连接层将稀疏特征转化为embedding,然后通过多层神经网络输出为一个值。将Wide Models和Deep Models的值进行线性加权得到最终输出,可以表示为:,其中为交叉特征,为隐藏层的最后一层,为偏置。
在文章实验中,具体模型如下所示,其中连续的特征直接输入到神经网络中,稀疏特征先转化为embedding,然后一起进行concat,Wide Models的输入为交叉特征(在参考资料2中,设置为和搜索排序任务强相关的特征)。
实验
文中通过联合训练来训练模型,在其中讨论到了联合训练和ensemble的区别如下
- ensemble需要多模型单独进行训练,训练时模型不知道其他模型的表现结果,联合训练对模型参数一起进行优化
- ensemble的结果依赖单个模型结果的好坏,输入为特征、全部交叉特征,因此单个模型需要较多的参数,联合训练中wide部分只需要考虑部分交叉特征,因此模型相对较小
作者通过梯度的反向传播,使用mini-batch stochastic optimization训练参数,对Wide部分使用带L1正则的Follow- the-regularized-leader (FTRL) 算法,对Deep部分使用AdaGrad算法(这里为什么优化算法不同)。
实验具体配置如下:
- 训练样本约5000亿
- Categorical 特征(sparse)会有一个过滤阈值,即至少在训练集中出现m次才会被加入
- Continuous 特征(dense)通过CDF( cumulative distribution function)被归一化到 [0,1] 之间
- Categorical 特征映射到32维embeddings,和原始Continuous特征共1200维作为NN输入
- Wide部分只用了一组特征叉乘,即被推荐的app叉乘用户下载的app
- 线上模型更新时,通过热启动重训练,即使用上次的embeddings和模型参数初始化,加速模型训练
实验结果如下所示,相对于单独的Wide模型和Deep模型,Wide & Deep在线上和线下的结果都更为出色,在线上提升更为明显,作者给出的解释是:离线的数据和标签是较为固定的,在线会存在新的数据和标签,需要从新的用户响应中学习,因此Deep & Wide效果更好(个人觉得这边比较指标不同,但看提升比例感觉不太严谨)。
讨论
模型提出出发点十分清晰,模型效果也得到即很好的验证。个人困惑有:Wide部分输入特征是不是选择一定得是和任务强相关的特征或叉乘特征?除了lr模型外,有没有别的模型可以实现Wide的功能?