introduction
给定一个query,推荐系统任务就是在数据库里找到相关的items,然后对召回的items根据确定的目标属性进行rank排序。
推荐系统的一个目标,就是同时达到memorization和generalization。
memorization可以被定义为去学习items和features之间的关系,同时探索在历史数据上他们之间的相互联系。局限性较强。
generalization(泛化性)可以被定义为这种联系的可信度,新特征是否能符合这种联系。比较有多样性。
推荐系统概览
用户会发起一个query,这个query通常包含着用户的信息(国家,语言),以及现在的上下文的信息(比如使用的设备,现在几点,现在是星期几)。然后系统进行一个retrieval召回一批候选池,因为全量的app数量级太大,不可能对其一个一个打分排序,所以先进行召回一批数据。之后在进行ranking排序,最后返回一些头部的结果,这些会转换为用户的点击或者购买。
wide的部分
特征方面除了单列输入的特征以外,还有将它们进行叉乘之后得到的组合特征(cross-product transformation),比如将性别和语言叉乘,就得到了,性别为男语言为英语,性别为女语言为英语等等结果。这一操作捕获了特征之间的关系,引入了非线性。
deep的部分
将这些输入特征转换为embedding的形式,维度通常在10-100之间,转换的过程一开始会被随机初始化。之后将特征送入mlp。
wide & deep 的联合训练
wide和deep分别的部分输出之后,会用一层网络weight他们的输出来得到最后的输出,最后使用logistics loss来进行优化。
不同于集成,联合训练有一些特点:
1. 集成的各个子模型之间是不知道对方的存在的,也就是独立存在的;而联合训练是一起训练的,彼此的输出相互影响,而且不需要每一部分(wide || deep)的输出那么准确,因为可以相互弥补。
2. 集成由于各个模型独立,需要把每个模型训练到很高的点,这就导致了每个模型参数会很大,而联合训练则没有这种弊端。
在优化方面,使用Follow- the-regularized-leader+L1正则化来优化wide的部分,使用adagrad优化器来优化deep的部分。
p是模型后面的输出,两个w是模型的weight,sigmoid funciton用来压缩模型输出值到概率值0-1的空间内。
系统实现
推荐系统pipeline包含三个部分:数据生成-》模型训练-》模型推断服务
数据生成
训练数据通过一段周期内的用户数据生成,标签是用户的反馈,比如下载app与否,如果没下载就是0,下载了就是1。对于一些词汇来说,会把它们映射到id的空间去,也就是根据范围来确定id的范围,然后会normalize特征到0-1的范围内。
模型训练
如果新的训练数据来了,就将重新训练,但是重新训练量太大比较麻烦,所以提出可以用之前的版本来做一个warm-starting的启动。