论文笔记:Wide & Deep Learning for Recommender Systems

引言

传统的基于LR的推荐系统一般会将类别型特征做one-hot编码得到二元特征。例如一共只有3种app,则原来的一个特征"安装的APP=0/1/2"转成了3个特征:“安装的APP是app0=True/False”、 “安装的APP是app1=True/False”、 “安装的APP是app2=True/False”。

另外,为了提高非线性,让模型具有记忆(Memorization)特定的模式(例如同时下载了app0和app1的人往往会下载app2)的能力,往往需要基于经验来设计一些组合特征,设一共有 d d d 个原始特征,则第 k k k 个组合特征可以表示为:

论文笔记:Wide & Deep Learning for Recommender Systems

c k i c_{ki} cki 用于选中对应的原始特征,连乘是为了实现AND逻辑,即仅当所有选中的原始特征都为1时,该组合特征才为1,否则为0.

上述模型的缺陷在于非常依赖经验来设计组合特征,而且泛化性能不足:对于在训练阶段没有出现过的原始特征组合,模型无法学习该组合特征对应的权重(例如之前从来没有人同时下载过app0和app2,那它们的组合特征的取值在训练数据中就全是0,LR模型无法学习对应的权重)

相对于LR,基于Embedding的模型,例如FM(Factorization Machines,分解机)或者 DNN,对于训练数据中未出现的特征组合也具有良好的泛化能力。

考虑上述几点,本文提出了 Wide&Deep 模型。

模型结构

论文笔记:Wide & Deep Learning for Recommender Systems

上图是Wide&Deep模型的逻辑结构,但是没有模型细节,下图更加清晰地展示了模型结构,包括输入的处理,以及DNN的设计。注意,与上图不同,下图的Wide是右侧部分。

论文笔记:Wide & Deep Learning for Recommender Systems

使用公式来表达更加精确:

DNN一侧的计算( f f f 为Relu函数 ):

论文笔记:Wide & Deep Learning for Recommender Systems

将原始特征 x x x、转换后特征 ϕ ( x ) \phi(x) ϕ(x),以及Deep一侧最后一层的输出 a ( l f ) a^{(l_f)} a(lf) 拼接到一起作为一个LR的输入,将该LR的输出作为预测的下载概率,与标签计算二元交叉熵

论文笔记:Wide & Deep Learning for Recommender Systems

数据的生成与处理

标签生成

对于曝光给用户的APP,如果用户点击了,就作为正样本,标签为1,如果曝光后用户没有点击,作为负样本(个人认为相当于显式反馈的用户-物品数据)。

连续特征处理

从图来看,连续特征先进行归一化,化为0到1的值,再与类别型特征(Categorical Features)的embedding拼接到一起。但是从论文的描述来看,做法是“累积分布归一化”,实际上是做特征的等频分箱。

论文笔记:Wide & Deep Learning for Recommender Systems

模型训练与部署

Wide一侧使用FTRL优化器+L1正则,Deep一侧使用AdaGrad优化器。为了提高系统在客户端侧的响应速度,将一个batch进一步细分,使用多线程来优化,结果如下:

论文笔记:Wide & Deep Learning for Recommender Systems

PS:文中没有详细介绍多线程在此处的具体用法,我不太理解,同一个batch的计算本来就是并行的,切分多个更加细的batch再用多线程,会有区别么?具体体现在上面地方的开销减小了