作者丨辛俊波
单位丨腾讯
研究方向丨CTR预估,推荐系统
前言
深度学习凭借其强大的表达能力和灵活的网络结构在 NLP、图像、语音等众多领域取得了重大突破。在广告领域,预测用户点击率(Click Through Rate,简称 CTR)领域近年也有大量关于深度学习方面的研究,仅这两年就出现了不少于二十多种方法。
本文就近几年 CTR 预估领域中学术界的经典方法进行探究,并比较各自之间模型设计的初衷和各自优缺点。通过十种不同 CTR 深度模型的比较,不同的模型本质上都可以由基础的底层组件组成。
本文中出现的变量定义:
n: 特征个数,所有特征 one-hot 后连接起来的整体规模大小
f: 特征 field 个数,表示特征类别有多少个
k: embedding 层维度,在 FM 中是隐向量维度
H1: 深度网络中第一个隐层节点个数,第二层 H2,以此类推
深度学习模型
1. Factorization-machine (FM)
FM 模型可以看成是线性部分的 LR,还有非线性的特征组合 xixj 交叉而成,表示如下:
其中 vi 是第 i 维特征的隐向量,长度 k<<n,包含 k 个描述特征的因子。参数个数为 k*n。所有包含 xi 的非零组合特征都可以用来训练 vi,缓解数据稀疏问题。
▲ 图1:FM模型结构
图 1 是从神经网络的角度表示 FM, 可以看成底层为特征维度为 n 的离散输入,经过 embedding 层后,对 embedding 层线性部分(LR)和非线性部分(特征交叉部分)累加后输出。
FM 等价于 FM + embedding,待学习的参数如下:
LR 部分:1+n
embedding 部分:n*k
FM 下文中将作为各种网络模型的基础组件。
2. Deep Neural Network (DNN)
▲ 图2:DNN模型结构
图 2 是经典的 DNN 网络, 结构上看就是传统的多层感知机(MultiLayer Perceptron,简称 MLP)。
在 MLP 网络中,输入是原始的特征 n 维特征空间,假设第一层隐层节点数为 H1,第二层为 H2,以此类推。在第一层网络中,需要学习的参数就是 n*H1。
对于大多数 CTR 模型来说,特征体系都极其庞大而且稀疏,典型的特征数量级 n 从百万级到千万级到亿级甚至更高,这么大规模的 n 作为网络输入在 CTR 预估的工业界场景中是不可接受的。
下面要讲到的大多数深度学习 CTR 网络结构,都围绕着如何将 DNN 的高维离散输入,通过 embedding 层变成低维稠密的输入工作来展开。
DNN 待学习参数:
n*H1+H1*H2+H2*H3+H3*o
o 为输出层大小,在 CTR 预估中为 1。
DNN(后文称 MLP)也将作为下文各种模型的基础组件之一。
3. Factorization-machine supported Neural Networks (FNN)
在上述的 DNN 中,网络的原始输入是全部原始特征,维度为 n,通常都是百万级以上。然而特征维度 n 虽然空间巨大,但如果归属到每个特征所属的 field(维度为 f),通常 f 维度会小很多。
如果有办法将每个特征用其所属的 field 来表示,原始输入将大大减少不少。Factorisation-machine Supported Neural Networks,简称 FNN 就是基于这种思想提出来的。
▲ 图3:FNN模型结构
FNN 假设每个 field 有且只有一个值为 1,其他均为 0。x 为原始输入的特征,它是大规模离散稀疏的。它可以分成 n 个 field,每一个 field 中,只有一个值为 1,其余都为 0(即 one hot)。
field i 的输入可以表示成 x[start_i: end_i],Wi 为field i 的 embedding 矩阵。z为 embedding 后的向量,是一个 k 维的向量,它由一次项 wi ,二次项 vi=(vi1,vi2,…vik) 组成,其中 k 是 FM 中二次项的向量的维度。而后面的 l1,l2 则为神经网络的全连接层的表示。
除此之外,FNN 还具有以下几个特点:
FM 参数需要预训练
FM 部分的 embedding 需要预先进行训练,所以 FNN 不是一个 end-to-end 模型。在其他论文中,有试过不用 FM 初始化 embedding,而用随机初始化的方法,要么收敛速度很慢,要么无法收敛。有兴趣的同学可以实验验证下。
无法拟合低阶特征
FM 得到的 embedding 向量直接 concat 连接之后作为 MLP 的输入去学习高阶特征表达,最终的 DNN 输出作为 CTR 预估值。因此,FNN 对低阶信息的表达比较有限。
每个 field 只有一个非零值的强假设
FNN 假设每个 fileld 只有一个值为非零值,如果是稠密原始输入,则 FNN 失去意义。对于一个 fileld 有几个非零值的情况,例如用户标签可能有多个,一般可以做 average/sum/max 等处理。
本质上讲&