工业界常用推荐算法的升级之路

本文将介绍常见推荐算法的升级之路,覆盖多数工业界中常用的各类模型。

线性模型

逻辑回归LR

简介

逻辑回归算法是一种监督学习分类算法,对特征进行线性加权求和,通过Sigmoid变换将结果映射到0-1。

模型结构

假设n个特征为线性关系

下面,选取一个函数将结果映射为0到1,由于阶跃函数性质不好,不可导求解过于复杂,选取Sigmoid函数

因此,求得预测值为y的概率表达式

建立n次预测值为y的似然估计函数

对应极大对数似然估计函数为

最后,损失函数表征预测值与真实值之间的差异程度,极大似然估计函数刻画的是预测值尽可能逼近y,损失函数可以取为最大似然估计函数的相反数,其次除以m这一因子并不改变最终求导极值结果,通过除以m可以得到平均损失值,避免样本数量对于损失值的影响。

结构风险函数 = 经验风险项  +  正则项  其中损失函数为经验风险项的重要组成部分

采取随机梯度下降更新模型,梯度如下

迭代公式如下

优点

  • 实现简单,可解释性强、计算速度快、存储量小;
  • 融入L0、L1、L2正则项,解决过拟合手段丰富,适用于高维稀疏特征;
  • 扩展性强,适用于Online Learning模型增量更新;

缺点

  • 特征工程较复杂,依赖人工构造特征;
  • 难以学习特征之间相互关系,数据必须线性可分;
  • 特征空间较大时,性能较差;

参考文献

https://blog.csdn.net/yz930618/article/details/104363705

非线性模型FM、FFM

简介

因子分解机模型为了解决数据稀疏的情况下,特征组合的问题。

模型结构

为了表述特征间的相关性,采用多项式模型。在线性模型的基础上,加入两两特征的组合项。

数据稀疏性普遍存在的实际应用场景中,两两特征同时不为0的数据较少,导致二阶特征系数的训练变的十分困难。

为了克服模型无法在稀疏数据场景下学习二阶特征系数,针对样本的第i维特征分量,引入辅助隐向量

其中k为超参数,表示每个特征对应一个k维隐向量,则wij可表示为

因此,将FM模型公式改为

此时,模型复杂度为O(n2),下面通过矩阵分解优化计算复杂度。

首先,每个特征x对应的隐向量组成的矩阵如下

FM模型的二阶特征系数组成的方阵W如下

此时,矩阵W的非对角元素即为FM的二阶特征系数,利用这点可以对二阶项系数展开

(第一个等式含义:由于W为对称矩阵,而二阶项系数为W的非对角线元素,因此二阶项系数等于W的所有元素之和减去对角线元素之和再除以2)

则FM模型公式如下,使得模型复杂度降低到了线性级别

下面,构建损失函数

其中,对于回归问题,损失函数可以取最小平方误差函数,对于分类问题,损失函数可以取logit逻辑函数。

采取梯度下降更新模型,偏导公式为

其中

对于FM模型而言,优化的参数为:

则FM模型方程对各个参数的偏导数为:

FM算法步骤如下

优点

  • 对一阶和二阶特征的都具有较好的学习能力;
  • 训练和预测的时间复杂度是线性的;
  • 隐向量常用于DNN的embedding vector;

缺点

  • 由于高阶特征具有较高复杂度,仅学习到二阶特征;
  • 特征与不同类型特征只用同一隐向量表示;
  • 在实际预测任务中,特征往往包含多种id,如果不同id组合时采用不同的隐向量,那么这就是 FFM(Field Factorization Machine) ;

参考文献

https://www.jianshu.com/p/8d792422e582

https://www.cnblogs.com/wkang/p/9588360.html

树模型GBDT、XGboost、LightGbm

简介

GBDT是一种基于集成思想的决策树模型,属于boosting类算法,本质是基于残差学习。

模型结构

GBDT 算法可以看成是由 K 棵树组成的加法模型

img

由于GBDT是加法模型,每一步只学习一个基函数,逐步逼近优化目标函数

img

在第 t 步,目标函数可以写为

img

假设损失函数为平方损失,则目标函数为

img

使用平方损失函数时,GBDT 算法的每一步在生成决策树时只需要拟合前面的模型的残差。

泰勒公式如下,使用泰勒公式对目标函数二阶展开

img

则等式1转化为

img

假设损失函数为平方损失函数,把对应的一阶导数和二阶导数代入等式(4) 即得等式(2),并去除常数项

img

一颗生成好的决策树,假设其叶子节点个数为T,决策树的复杂度可以由正则项定义

img

即决策树模型的复杂度由生成树的叶子节点数量和叶子节点对应的值向量的 L2 范数决定。

定义以下为公式为所有被划分到叶子节点的训练样本的集合

img

等式(5) 可以根据树的叶子节点重新组织为 T 个独立的二次函数的和:

img

定义以下等式

img

则等式(6) 可写为

img

由于一元二次函数最小值处,一阶导数等于 0

img

此时,目标函数的值为

img

GBDT树构建过程

理想情况下, 枚举所有可能的树结构,并用等式8计算每个树结构对应的分数Obj,分数越小说明对应的树结构越好,选取Obj最小的树为最佳的树结构,可用等式7计算每个叶子节点的预测值。

然而,树结构数量是无穷的,不可能枚举所有树结构。通常情况下,采取贪心策略生成决策树的每个节点。大致步骤如下

  1. 从深度为0的树开始,对每个叶节点枚举所有的可用特征;
  2. 计算每个特征的收益,针对离散型特征,依次将每个取值作为分割点计算gini系数。针对连续型特征,将特征值升序排列,并线性扫描的方式,依次将相邻两个特征取值的均值作为分割点,将数据分割为两部分,以此当做离散情况计算gini系数;
  3. 选取gini系数值最小,即收益最大的特征作为分裂特征,并用该特征的最佳分裂点作为分裂位置,把该节点生长出左右两个新的叶节点,并为每个新节点关联对应的样本集;
  4. 回到第 1 步,递归执行到满足特定条件为止,即满足树的最大深度、样本条数为1、样本条数不为1但是标签值y均相同;

Xgboost Vs GBDT

https://blog.csdn.net/yz930618/article/details/104361315

Xgboost Vs LightGbm

LightGBM主要在计算速度上有突破,快与XGB10倍以上。此外,XGBoost使用基于预排序的算法,难以优化。LightGBM使用基于直方图的算法,将连续特征离散化,来提升速度,减少内存使用。

Xgboost主要参数

XGBoost 的设置有三种参数:一般参数,提升参数和学习参数。

一般参数

  • booster:选择提升器,默认是 gbtree,gbtree基于树结构,gblinear基于线性模型;
  • silent:是否打印信息,默认是 0 不打印;
  • nthread:线程数,默认为最大可用线程数;
  • num_pbuffer:缓冲区大小,默认为训练实例的数量;
  • num_feature:特征纬度,默认为特征的最高纬度;

提升参数

  • eta:学习率,范围 [0, 1],默认为 0.3。该参数越小,计算速度越慢;该参数越大,有可能无法收敛;
  • gamma:控制叶子个数的参数,范围 [0, +∞),默认为 0。该参数越大,越不容易过拟合;
  • max_depth:每颗树的最大深度,范围 [0, +∞),默认为 6。该参数越大,越容易过拟合;
  • min_child_weight:每个叶子里面的最小权重和,范围 [0, +∞),默认为 1。该参数越大,越不容易过拟合;
  • subsample:样本采样比率,范围 (0, 1],默认为 1。如果取 0.5 代表随机用 50% 的样本集用来训练;
  • colsample_bytree:列采样比率,范围 (0, 1],默认为 1。对每棵树的生成用的特征进行列采样,类似于随机森林的列采样;
  • lambda:L2 正则化参数,范围 [0, +∞),默认为 1。该参数越大,越不容易过拟合;
  • alpha:L1 正则化参数,范围 [0, +∞),默认为 0。该参数越大,越不容易过拟合;
  • scale_pos_weight:控制正反类的平衡参数,范围 [0, +∞),默认为 1。该参数通常设为“反类的总和/正类的总和”;

学习参数

  • objective:损失函数,默认为 linear。其他常见类型有:reg:logistic – 二分类、binary:logistic – 二分类概率、multi:softmax – 多分类、multi:softprob – 多分类概率、rank:pairwise – 排序;
  • base_score:预测分数,默认为 0.5。最初每个样例的预测分数;
  • eval_metric:评估指标。该指标用在验证集上,比如回归任务默认的是 rmse;分类任务默认为 error;排序任务默认为 map。其他常见类型有:rmse、mae、logloss、error、merror、mlogloss、auc、map;
  • seed:随机种子,默认为 0,用于产生可复现的结果

优点

  • GBDT 它的非线性变换比较多,表达能力强,而且不需要做复杂的特征工程和特征变换;
  • 在相对少的调参时间情况下,预测的准备率也可以比较高;
  • 可以灵活处理各种类型的数据,包括连续值和离散值;

缺点

  • GBDT Boost 是一个串行过程,不好并行化,而且计算复杂度高,同时不太适合高维稀疏特征;
  • 容易过拟合,泛化能力较差;

参考文献

https://www.cnblogs.com/qcloud1001/p/10216863.html

宽深模型Wide&Deep

简介

Wide&Deep为一种融合浅层(wide)模型和深层(deep)模型进行联合训练的框架,综合利用浅层模型的记忆能力和深层模型的泛化能力,实现单模型对推荐系统准确性和扩展性的兼顾。

模型结构

wide部分是广义线性模型,深度部分是神经网络DNN,模型结构如下

在这里插入图片描述

宽度部分

wide部分就是LR,LR的输入特征包括了原始特征和交叉特征。交叉特征定义如下:

例如,交叉特征AND(gender=femain,language=en)为1,当且仅当(gender=female)和(language=en)都为1.

深度部分

Deep部分就是一个MLP,隐藏层的激活函数使用了ReLUs,MLP的输入包括了连续的特征和 embedding特征,对于每个field embedding特征采样随机初始化的方式。

联合训练

联合训练有别于集成训练,集成中训练阶段多个模型是独立分开训练的,并不知道彼此的存在,在预测阶段预测值综合了多个模型的预测值。相反,联合训练阶段则同时训练多个模型,共同优化参数。

通过将Wide模块和Deep模块的对数加权输出作为预测值,然后送入逻辑损失函数中,用于联合训练。模型的联合训练通过反向传播将输出值的误差梯度通过最小批随机梯度同时传送给Wide和Deep模块。

在实验中使用FTRL算法优化wide部分的参数,AdaGrad算法优化深度部分的参数。

在二分类任务中,模型的预测值为:

优点

  • 利用浅层模型的记忆能力和深层模型的泛化能力;

缺点

  • 不能同时提取低阶或者高阶的组合特征;
  • wide part十分依赖人工特征工程;
  • 为了增加泛化能力,需要对连续特征离散化

参考文献

https://www.jianshu.com/p/dbaf2d9d8c94

深度模型DeepFM、XDeepFM

简介

在不同的推荐场景中,低阶组合特征或者高阶组合特征可能都会对最终的CTR产生影响;

因子分解机FM通过对于每一维特征的隐变量内积来提取特征组合,由于计算复杂度过高,FM只计算到二阶特征;

对于高阶的特征组合来说,通过多层的神经网络DNN可解决。

模型结构

wide_deep_deep_fm

DeepFM包含两部分,左边的FM部分和右边的DNN部分。每一个Field表示一个原始特征经过One-Hot之后的特征,且其中只有一个原始为1,FM和DNN共享相同的输入。

由于原始输入数据经过One-Hot变换后成为高维稀疏数据,为了缓解参数爆炸,引入了Embedding层,将输入向量压缩到低维稠密向量。Embedding层结构如下:

在这里插入图片描述

Embedding层有以下两点特性:

  • 输入数据的每个特征经过embedding之后,都变成k维(lantent vector的维度),embedding后的特征维度是 m(原始特征数)× k;
  • Dense Embedding层最开始是随机初始化的,将FM训练得到的隐向量V作为输入层到Dense Embedding层之间的权重向量,并同时输入到FM部分和Deep部分,由两者共同训练,使之成为一种端到端的模型;

共享Embedding层有以下两种好处:

  • 能够从原始信息之中同时学习低维交叉信息和高维交叉信息;
  • 不需要类似于Wide&Deep模型中的特征工程;

对于FM层,主要的工作是通过特征间交叉得到低阶特征,以二阶特征为主。值得注意的是,FM算法的特征交叉不是直接拿原始特征相互交叉计算,而是交叉特征因子分解后的结果,这样更能挖掘出特征深层的信息。

对于DNN层,推荐设置

  • 对于hidden layer使用三层200-200-200的结构设计;
  • 使用relu函数作为激活函数;
  • 增加dropout防止过拟合;

对于当前模型,所有的参数共同参与训练。DeepFM的预测结果可以写为:

优点

  • DeepFM同时对低阶特征组合和高阶特征组合建模,从而能够学习到各阶特征之间的组合关系;
  • DeepFM是一个端到端的模型,不需要任何人工特征工程,可以高效的进行训练,不仅共享输入,也共享嵌入式向量;
  • FM得到的隐变量作为嵌入层网络的权重,FM模型作为整个模型的一部分与DNN模型一起参与训练,故不需要预训练过程;

缺点

  • 有些特征不适合进行特征交叉,如position bias就不适合进行特征交叉,应该将其直接放到最后一个隐层才更有意义;
  • 在使用DeepFM时,要注意结合业务场景,将特殊的特征排除在FM的作用域之外;

此外,由于DeepFM模型学习出的是隐式的交互特征,其形式是未知的、不可控的,同时特征交互发生在元素级而不是特征向量之间,这一点违背了因子分解机的初衷。

因此,微软亚洲研究院提出了一种极深因子分解机模型xDeepFM,集成的CIN和DNN两个模块能够帮助模型同时以显式和隐式的方式学习高阶的特征交互,而集成的线性模块和深度神经模块也让模型兼具记忆与泛化的学习能力。

xDeepFM结构如下

参考文献

https://www.zybuluo.com/JeemyJohn/note/1197954

https://www.jianshu.com/p/b4128bc79df0

深度兴趣网络DIN、DIEN、DSIN

简介

传统基于DNN的CTR预估模型对用户的历史行为是同等对待的,一般离当前时间越近的行为,越能反应用户目前的兴趣。因此,DIN利用attention机制对用户历史行为进行了不同的加权处理,针对不同的广告,用户历史行为的权重不一致。

模型结构

DIN认为用户的兴趣不是一个点,而是一个多峰的函数。一个峰就表示一个兴趣,峰值的大小表示兴趣强度。那么针对不同的广告,用户历史行为与该广告的权重是不同的。假设用户有ABC三个历史行为,对于广告D,那么ABC的权重可能是0.8、0.1、0.1;对于广告E,那么ABC的权重可能是0.3、0.6、0.1。

DIN模型结构如下

Attention公式如下

V_{u}=f(V_{a})=\sum_{i=1}^{N}w_{i}*V_{i}=\sum_{i=1}^{N}g(V_{i},V_{a})*V_{i}

其中,假设用户的兴趣的Embedding是V_{u},候选广告的Embedding是V_{a},用户兴趣和候选的广告的相关性可以写作F(U,A)=V_{a}*V_{u}。如果没有Local activation机制的话,那么同一个用户对于不同的广告,V_{u}都是相同的。

Evaluate Metric

单纯地用AUC评估,会带有用户偏差,若是将用户信息考虑进来则会更稳定更可信,比如有些人自然点击概率就低。GAUC(Generation Of AUC),实际是计算每个用户的auc,然后加权平均,最后得到group auc。

Dice Activation

DIN提出了一种数据动态自适应激活函数Dice,认为分割点不是固定为0的,而是随着数据不同而动态变化的。根据数据分布灵活调整阶跃变化点,具有BN的优点(解决Internal Covariate Shift),但是计算复杂度变高。

Internal Covariate Shift主要会有两个方面的影响:

  • 上层网络需要不断的调整参数来适应输入数据分布的变化,导致学习速度的降低;
  • 网络的训练过程不易收敛,容易形成梯度消失;

自适应正则

常见推荐场景中,数据多为高维稀疏特征,通常会加入L1、L2、Dropout等防止过拟合。由于用户数据符合长尾定律(long-tail law),也就是说很多的feature id只出现了几次,而一小部分feature id出现很多次。

简单处理办法:直接去掉出现次数比较少的feature id,导致模型更加容易过拟合,同时阈值的设定作为一个新的超参数,需要做大量实验。因此DIN设计了一种自适应正则的方法,如下

自适应正则的好处在于:

  • 针对feature id出现的频率,自适应的调整其正则化的强度;
  • 对于出现频率高的,给与较小的正则化强度;
  • 对于出现频率低的,给予较大的正则化强度;

优点

  • 从丰富的历史行为中捕捉与当前商品相关性高的用户行为;
  • 解决过拟合手段丰富;

缺点

  • 未考虑时间因素,兴趣具有衰减趋势;
  • 通过用户的显式的行为来表达用户隐含的兴趣,这一准确性无法得到保证。

此外,DIEN和DISN都是DIN的衍生模型,区别如下

  • DIN引入attention机制,捕获候选商品和用户浏览过的商品之间的关系;
  • DIEN在DIN基础上引入序列概念,将用户历史行为序列纳入到网络内;
  • DSIN将行为序列划分为session,更符合RNN概念;

DIEN模型的主要贡献点在于:

  1. 模型关注电商系统中兴趣演化的过程,并提出了新的网络结果来建模兴趣进化的过程,这个模型能够更精确的表达用户兴趣,同时带来更高的CTR预估准确率;
  2. 设计了兴趣抽取层,并通过计算一个辅助loss,来提升兴趣表达的准确性;
  3. 设计了兴趣进化层,来更加准确的表达用户兴趣的动态变化性;

DSIN模型的主要贡献点在于:

  1. 将用户的连续行为自然地划分为会话,然后利用带有偏置编码的self attention网络对每个会话进行建模;
  2. 应用BI-LSTM捕捉用户不同历史会话兴趣的交互和演变;
  3. 设计了一个局部的活动单元,将它们与目标项聚合起来,形成行为序列的最终表示形式;

参考文献

https://blog.csdn.net/yz930618/article/details/85003101

https://zhuanlan.zhihu.com/p/57672079

发布了126 篇原创文章 · 获赞 219 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/yz930618/article/details/104674771
今日推荐