1 根据访问用户id从后台数据库调出其在最近一段时间内(一般2周)的所有淘宝网访问购买点击记录;
2 首先根据一个弱的算法从所有的商品总集中筛选出一个范围相对较小的商品集合,这个弱的算法也叫做匹配算法;
3 根据一个性能较好的分类模型对范围较小的商品集合中的商品按照用户点击率的大小进行排序,并提取较高点击率的商品推荐给用户,这个强的算法也叫做排序算法;
4 记录用户的点击行为,作为以后的训练标注数据。
第一篇是2017年6月阿里公开的论文《Deep Interest Network for Click-Through Rate Prediction》,即深度信念网络,这个网络使用了深度学习的网络架构结合了attention机制,提高了CTR预测的效果,该算法主要应用在CTR流程中的排序阶段。首先这个模型的提出,是因为他发现了在电商广告推荐的场景下给用户推荐定向广告有两个因素是有着关键意义的:1 Diversity ,指的是一个特定的用户会多多类商品有兴趣,也就是说用户的兴趣是多样性的;2 Local activation,指的是用户的某一次购买行为,只和他历史记录中的部分数据产生关联,比方说用户在一周前买了泳镜和手表,那么他一周后如果买了泳帽这个商品,其实是和他之前买的泳镜相关联的,和手表其实没多大关系。也就是说,用户的每一个历史行为和当前推荐给他的商品贡献程度是不一样的。下面先给出整个系统的模型架构图:
左边的Base model是阿里淘宝定向广告推荐系统在2017年之前使用的后台模型,整个特征分成两个部分:user和ad(指的就是商品)。需要注意的是因为使用了深度学习的架构,所以在特征提取层并没有做特征的交互工作,同时在第一层所有的one-hot的高维稀疏特征统一使用Embedding的方式变成了低维稠密的特征。同时根据阿里电商的业务特点,由于user feature中描述行为方面的特征维度和该用户在一段时间内的行为记录数是有关的,所以每一个用户的user feature维度是不太一样的,为了使它们的维度保持一致,Base使了sum pooling的方式,即直接相加,这就给后续的改进留下了很大的改进空间,很显然对于某一用户推荐某一商品,过去一段时间内并不是每一条记录都是同等重要的。就像上面的举的那个例子,如果系统给当前用户推荐泳帽很可能是因为他曾经买了一个泳镜,这个曾经购买泳镜的记录是十分关键的。从图中看出这个attention是通过一个叫做Activation Unit的单元算出来的,这个单元如右边的小图所示,(其中的FC其实就是full connection layer的缩写,即全连接网络)。其实整个网络的结构并不是很复杂,但是训练大量的工业级数据,这篇paper还是采用了两个技巧:
1 Data Dependent的激活函数-Dice
现在在深度学习领域,一般使用ReLU或者PReLu激活函数(PRelU和Relu不同的仅仅是当输入x小于等于0的时候,激活函数输出不再直接是0,而是一个系数α∗xα∗x,这个系数αα会非常小,是这个乘积结果接近0)。但是这些激活函数会拖慢模型的收敛速度,为了加快模型的收敛速度,阿里妈妈团队提出了一种Data Dependent的激活函数称之为”Dice”,如下所示:
据该paper说这种方式的激活函数取得的效果更好。
2 自适应正则化技巧
一般在深度学习中常见的正则化技巧有L1、L2和Dropout。而这篇paper提出的这个所谓的自适应正则化技巧本质就是在模型进行反向传播训练的时候用来控制不同参数的更新速度。因为阿里妈妈团队面对的是真实的工业级数据,所以数据中存在着大量的噪声,特别是特征的稀疏问题,很显然实战场景中的特征往往具有“长尾分布”的特性,即大量的特征出现的次数很少,少量的特征出现的次数很大。一种最简单的方式就是人为的去掉那些出现次数过少的特征,但是这种方式会使模型丢失部分信息,而且非常依赖认为选定的频率阈值。那么该paper提出的一种更新方式如下所示:
第二篇是2018年2月阿里妈妈公开的论文《Learning Tree-based Deep Model for Recommender Systems》,这篇论文提出了一个基于树模型的算法框架,可以方便模型很快的找出给特定用户推荐的Top k 商品,该算法应用在CTR预估流程中的匹配阶段。在这里需要着重说明一下的是,这部分的匹配算法一直是业界的一个关键的,业界之前2代使用的匹配方式是:1 基于统计的启发式规则方法(采用Item-based协同过滤的思想,给用户推荐在其历史上有过行为记录的相似item,这种方法推荐的结果降低了用户的惊喜度,因为都是有过交互的相似商品,所以对于用户本质兴趣的挖掘还是存在不足);2 基于内积模型的向量检索方法 ,这类方法将用户和item映射成向量,通过向量之间的内积来计算它们之间的相似度,然而高阶深度学习大部分都不可划成内积形式,比如CTR预估里用户和商品特征交叉非常有用,大部分不可用内积表示。而在现有深度学习中内积模型的表达能力被证明是有限的,故这种方法也存在不足。
从论文中可以看出来,其提出了一个基于树的通用架构,树中的每一个叶子节点都对应一个商品,在商品和用户进行计算CTR概率的时候可以使用任意的深度学习模型,这也方便该架构模型被扩展到其他的领域中去。这篇论文。从技术层面上来讲他的这个树模型还是受启发于神经网络语言模型的层次softmax操作,但是他在论文里明确说了这个模型和那个层次softmax树有着本质上的不同。如果是一课层次的softmax树操作的话,那么模型的优化函数将如下所示:
这种方式存在着两个最大的问题:
1 就是如果要找出Top k的商品,还是需要遍历整个商品集合;
2 就是这个损失函数的设计使模型更多的对最优解和次优解进行区分,因为对于属于neighbor的两个叶子节点来说,它们其实应该是非常相似的,它们很可能同时被推荐,但是这样损失函数指导下训练出的模型就缺乏一个大局观,而陷入了局部的调优之中。
根据这些情况,作者设计了一种基于树模型,整棵树的每一个叶子节点代表一个商品,非叶子节点对应一个抽象概念(为了方便说明,这篇文章提到的树都是二叉树)。那么整棵树模型的优化函数如下所示:
也就是说一个节点对应的商品或者抽象概念是否会被一个用户u点击的概率是该节点的子节点最大的那个节点所对应的概率。这样我们在训练构造正负样本的时候就和上面提到的层次softmax有所不同,当用户u点击一个商品的时候,从根节点一直到该叶子节点中一路的所有中间经过节点都是正样本,那么负样本就使用随机采样的方式从每一层中随机的抽取,这样同一层的正负样本就构成了一个pairwise进行模型的训练,每一层的模型参数都是共享的。其实这个树模型就是对商品之间从属关系的一种建模方式,整个模型的结构如下:
树只是对商品属性的建模,左边还有用户的一些行为属性,由于是一段时间之内的行为属性,因此采用了Time windows的方式将这些行为记录进行分片。每一个用户的属性借助商品信息使用Attention机制进行求和,从而得出每一个用户的Embedding表征形式。其实整个框架还是比较简单清晰的,但是中间还有一个问题需要我们注意,就是这棵树的构造方法,因为到目前为止我们的假设都是在这课树已经建造好了基础之上进行的。因为正如作者所说的,对于这些海量的商品信息不像做NLP中的词语信息,具有一定的先验知识,对于商品属性的标注是不切实际的。其实最终的解决方案很巧妙,类似于LightRNN的Bootstrap方法(这里以二叉树的构造为例):
1 首先随机给所有的商品类别(category)进行随机排序,然后对属于同一类别的item进行随机排序,按照这个随机的顺序,进行节点的分裂操作(尽量保证左右子树中的item个数大致相当,因为目标是生成一颗尽可能的完全二叉树)
2 根据这棵树,进行算法的训练。这样每一个叶子节点对应的item都会有一个对应的向量。然后从根节点开始,使用k-means聚类算法,每次把所有的item聚类成两个cluster,同时聚类的时候尽量保证左右两个子树样本的平衡性,然后一直扩展成一颗新的树。
3 重新按照新的树进行模型的训练,一直重复2操作到规定的循环次数。
最后当我们得到最终的树结构和最终的神经网络参数之后,当一个用户访问网站的时候,如何推荐Top k商品呢??文章给出算法的流程:
输入数据:用户u以及该用户的特征,推荐树模型,需要的k,训练好的神经网络模型
流程:
1:结果集 A=∅∅,候选集合Q={根节点}
2:循环操作
2.1:删除集合Q中的叶子节点,将这些叶子节点插入结果集A中;
2.2:对剩余Q中的非叶子节点按照输入的模型参数和用户u的特征,计算其被用户点击的概率;
2.3:对Q中节点的点击概率进行排序,取Top k作为新的集合I;
2.4:Q={I集合中的所有节点的子节点}
循环结束的条件是Q集合变成空集
3:计算A中所有节点的点击率,并进行排序,最后返回Top k的item。
最后作者通过对比实验发现,该提出的模型能够显著提高预测准确率,特别是对于那些历史上无交互的商品推荐(针对用户u,将item推荐结果list中的历史上曾经有过交互记录的商品全部删除的)。这就说明了模型不仅仅是简简单单的去记忆一个用户的历史行为,而是实实在在的挖掘出了用户本质的兴趣特征。