本文为原创做品,首发《阿里技术》和《阿里巴巴机器学习》,已通过蚂蚁金服文章外发受权,并进行了脱敏处理python
本文做者为蚂蚁金服人工智能部认知计算组的基础算法团队。文章提出一整套创新算法与架构,经过对TensorFlow底层的弹性改造,解决了在线学习的弹性特征伸缩和稳定性问题,并以GroupLasso和特征在线频次过滤等自研算法优化了模型稀疏性。在支付宝核心推荐业务得到了uvctr的显著提高,并较大地提高了链路效率。 感谢认知服务团队负责人、国家千人计划褚崴老师对本项目的支持。算法
在线学习(Online learning)因为能捕捉用户的动态行为,实现模型快速自适应,进而成为提高推荐系统性能的重要工具。然而它对链路和模型的稳定性,训练系统的性能都提出了很高的要求。但在基于原生TensorFlow,设计Online推荐算法时,咱们发现三个核心问题:数组
更重要的是,在线学习如火如荼,当流式特征和数据都被打通后,能按需增删特征,实现参数弹性伸缩的新一代训练平台成为大势所趋。为了解决这些问题,从2017年末至今,蚂蚁金服人工智能部的同窗,充分考虑蚂蚁的业务场景和链路,对TensorFlow进行了弹性改造, 解决了以上三大痛点,简化并加速离线和在线学习任务。其核心能力以下:安全
在与业务线团队的共同努力下,目前已在支付宝首页的多个推荐场景全流量上线。其中某推荐位的个性化online learning桶最近一周相比线上多模型融合最优桶提高4.23% , 相比随机对照提高达34.67% 。 某个性化资讯推荐业务最近一周,相比DNN基准uv-ctr提高+0.77%,pv-ctr提高+4.78%,模型体积压缩90%,链路效率提高50%。网络
本文的结构以下:架构
背景:在原生TensorFlow中,咱们经过Variable来声明变量,若变量超过了单机承载的能力,可以使用partitioned_variables来将参数分配到不一样机器上。 但必须指定shape,声明后即不可改变,经过数组索引查找。机器学习
因为推荐系统中大量使用稀疏特征,实践中通常采起embedding_lookup_sparse一类的方法在一个巨大的Dense Variable中查找向量并求和,来代替矩阵乘法。开源Tensorflow限定了Variable使用前必须声明维度大小,这带来了两个问题:1)须要预先计算特征到维度范围内的int值的映射表,这一步操做一般在ODPS上完成。由于须要扫描全部出现的特征并编号,计算很是缓慢;2)在online learning场景下,为了容纳新出现的特征,须要预留一部分维度空间,并在线上不断修改映射表,超过预留空间则须要从新启动在线任务。ide
为了突破固定维度限制,实现特征的动态增长和删除,最朴素的优化想法是在TensorFlow底层实现模拟字典行为的Variable,并在此基础上从新实现Tensorflow上层API。由此咱们进行了优化,在server新增了基于HashMap的HashVariable,其内存结构以下:函数
在声明该变量时,只需增长一句,其余训练代码皆不需改动:工具
with tf_ps.placement_hint(vtype='hash'): self.W = tf.get_variable(self.name, shape=[2000000000,64], initializer=init) # 其中shape[1]表明embedding维度, shape[0]值可按特征规模估计,用于指导参数分配策略
每一个特征都经过hash函数映射到一个2的64次方大小的空间内。当须要计算该特征时,PS会按需惰性建立并返回之。但其上层行为与原生TF一致。因为去掉了featuremap转ID的过程,咱们内部形象地将其称为“去ID化”。在此之上咱们实现了Group Lasso FTRL,频次过滤和模型压缩等一系列算法。
备注:
弹性特征带来一个显著的优点:只要用足够强的 \(L_{1}\)稀疏性约束,在单机上就能调试任意大规模的特征训练,带来不少方便。
咱们的hashmap实现是KV化的,key是特征,value是vector的首地址,
通过这样的改造后,在离线批量学习上,带来了如下变化:
online learning上,能带来以下变化:
除了性能有明显的提高以外,其最大的优点是不需提早申请空间,训练能够无缝稳定运行。
弹性架构,主要目的就是特征优选,让模型自适应地选择最优特征,进而实现稀疏化,下降过拟合。
本节介绍特征优选的两个核心技术:
稀疏化是算法追求的重要模型特性,从简单的 \(L_{1}\)正则化和Truncated Gradient[9], 再到讨论累积梯度平均值的RDA(Regularized Dual Averaging)[10], 再到目前常见的 [FTRL][1][2] 。 然而它们都是针对广义线性模型优化问题提出的稀疏性优化算法,没有针对sparse DNN中的特征embedding层作特殊处理。把embedding参数向量当作普通参数进行稀疏化,并不能达到在线性模型中能达到的特征选择效果,进而没法有效地进行模型压缩。
例如:当包含新特征的样本进入时,一个特征对应的一组参数(如embedding size为7,则参数数量为7)被激活,FTRL断定特征中的部分参数无效时,也不能安全地将该特征删除。如图:
所以,在\(L_{1}\)和\(L_{2}\)正则的基础上,人们引入\(L_{21}\)正则(group lasso)和\(L_{12}\)正则(exclusive sparsity),分别表示以下:
\[ L_{1,2}= \sum_g ({\sum_i {|w_{g,i}^{(l)}|}})^2 \]
\[ L_{2,1}= \sum_g {\sqrt {\sum_i {w_{g,i}^{(l)}}^2}} \]
\(L_{21}\)早在2011年已经引入,它最初目的是解决一组高度关联特征(如男\女)应同时被保留或删除的问题,咱们创新地扩展到embedding的表示上,以解决相似的问题。
在\(L_{21}\)中,因为内层\(L_{2}\)正则将一个特征的全部参数施加相同的约束,能将整组参数清除或保留,由此决定embedding层中的某些特征对应的embedding向量是否彻底删除,提高模型泛化性。所以称为group lasso。
而\(L_{12}\)则正好相反,它迫使每组参数中的非0参数数量一致但值又尽量不一样,但使输出神经元互相竞争输入神经元,进而[使特征对目标更具区分性][7]。
对于DNN分类网络,底层表示要求有足够的泛化性和特征抽象能力,上层接近softmax层,须要更好的区分性。所以咱们一般在最底层的embedding层使用group lasso。即以下的优化目标:
\[ \vec{w_{r+1}}= argmax_{\vec{w}}\{(\sum_{t=1}^r\vec{g_t}-\sigma_t \vec{w_t})^T \vec{w}+ \frac{1}{\eta_r}||\vec{w}||_2^2 + \lambda_{1,2}||\vec{w}||_2^1\} \]
直接将\(L_{21}\)正则项惩罚加入loss,模型最终也能收敛,但并不能保证稀疏性。所以Group lasso优化器参考了FTRL,将梯度迭代分红两个半步,前半步按梯度降低,后半步微调实现稀疏性。经过调节 \(L_{1}\)正则项(即公式中的\(\lambda\)),能有效地控制模型稀疏性。
Group lasso是弹性计算改造后,模型性能提高和压缩的关键。值得指出:
讨论完特征动态删除的方法后,咱们再分析特征的准入策略。
在Google讨论FTRL的文章[1][2]中提到, 在高维数据中大部分特征都是很是稀疏的,在亿级别的样本中只出现几回。那么一个有趣的问题是,FTRL或Group FTRL优化器可否能删除(lasso)极低频特征?
在RDA的优化公式中,知足如下条件的特征会被置0:
\[ | g_{t}|= |\frac{t-1}{t} g_{t-1}+ \frac {1}{t}{\nabla}_w l(W,X^{(t)},y^{(t)})|<\lambda \]
若在t步以前,该特征只出现过几回,未出现的step的梯度为0,随着步数增大,知足上述条件变得愈来愈容易。由此RDA是能够直观处理极稀疏特征的。 但对于FTRL,要知足:
\[ \sum_{s=1}^t g^{(s)} -\sum_{s=1}^t \sigma^{(s)} w^{(s)} < \lambda \]
其中\(\sigma^{(s)}= \frac{1}{\eta^{s}}- \frac{1}{\eta^{s-1}}\), 不只和历史梯度有关,还与历史学习率和权重w有关。 所以FTRL虽然也能处理极稀疏特征,但并无RDA那么aggressive(此处还待详细地分析其下界,Group FTRL与此相似)。
因为FTRL在设计和推导时并未明确考虑极低频特征,虽然经过增大\(\lambda\),确实能去除大量极低频特征,但因为约束太强,致使部分有效特征也被lasso,在离线实验中被证实严重影响性能。其次,对这些巨量极低频特征,保存历史信息的工程代价是很高昂的(增长几倍的参数空间和存储需求),以下图:
所以咱们提出,可否在实时数据流上模拟离线频次过滤,为特征提供准入门槛,在不下降模型性能的基础上,尽可能去除极低频特征,进一步实现稀疏化?
注意: 因为默认的embedding_lookup_sparse对特征执行了unique操做(特征归一化以简化计算),所以在PS端是不可能获取真实特征和label频次的。须要Python端对placeholder统计后,上传给server端指定的Variable,优化器经过slot得到该Variable后做出联合决策。
最naive的思路是模拟离线频次过滤,对特征进行计数,只有达到必定阈值后再进入训练,但这样破坏了数据完整性:如总频次6,而阈值过滤为5,则该特征出现的前5次都被忽略了。为此咱们提出了两种优化方案:
基于泊松分布的特征频次估计
在离线shuffle后的特征知足均匀分布,但对在线数据流,特征进入训练系统可看作泊松过程,符合泊松分布:
\[P(N(t)=n)= \frac{{\lambda t }^n e^{-\lambda t}}{n!}\]
其中n为当前出现的次数,t为当前的步数,\(\lambda\)为单位时间发生率,是泊松分布的主要参数,T为训练总步数。\(\tilde{N}\)为特征最低门限(即最少在T时间内出现的次数)。
所以咱们能经过前t步的特征出现的次数n,将t时刻当作单位时间,则\(\lambda = \frac{n}{t}\)。 根据泊松分布,咱们能够算出剩余\(\frac{T-t}{t}\) 时间内事件发生大于等于\(\tilde{N}-n\)次的几率\(P_{\lambda i}(N(\frac{T-t}{t}) >=\tilde{N}-n)\) 。 每次该特征出现时,均可按该几率\(P_{\lambda i}\)作伯努利采样,特征在t步进入系统的几率用下式计算:
\[ P= \prod_{i=1}^{t-1}(1-P_{\lambda i})P_{\lambda t} \]
经过真实线上数据仿真,它能接近离线频次过滤的效果,其中\(\lambda\)是随每次特征进入时动态计算的。它的缺陷是:
动态调节 \(L_{1}\)正则方案
在经典的FTRL实现中,\(L_1\)正则对每一个特征都是一致的。这致使了2.2.1 中提到的问题:过大的 \(L_{1}\)虽然过滤了极低频特征,但也影响的了模型的性能。参考各种优化器(如Adam)对learning_rate的改进,咱们提出:经过 \(w_{i}\)特征频次影响 \(L_{1}\)正则系数,使得不一样频次的特征有不一样的lasso效果。
特征频次和基于MLE的参数估计的置信度相关,出现次数越低置信度越低。若是在纯频率统计基础上加入一个先验分布(正则项),当频率统计置信度越低的时候,越倾向于先验分布,相应的正则系数要更大。咱们通过多个实验,给出了如下的经验公式:
\[ L_1(w_i)= L_1(w_i)(1+ c* \frac {max(\tilde{N} -freq(w_i),0)} {\tilde{N}}) \]
其中c是惩罚倍数, \(\tilde{N}\)为特征最低门限,这二者皆为超参, \(freq(w_i)\)是当前特征出现的频次。
咱们在线上环境,使用了动态调节 \(L_{1}\)正则的方案 。在uvctr不降甚至有些微提高的基础上,模型特征数比不使用频次过滤减小75%,进而从实验证实了频次过滤对稀疏化的正向性。它的缺点也很明显:特征频次和正则系数之间的映射关系缺乏严谨证实。
频次过滤做为特征管理的一部分,目前还少有相关论文研究,亟待咱们继续探索。
在工程上,因为作了优化,如特征被优化器lasso后,只将其置0,并不会真正删除;在足够多步数后才删除。同时引入内存池,避免特征的反复建立和删除带来的没必要要的性能损失。 这就致使在训练结束后,模型依然存在大量0向量。导出时要进一步作模型压缩。
因为引入了HashPull和HashPush等非TF原生算子,须要将其裁剪后转换为原生TF的op。 咱们将这些步骤统称图裁剪(GraphCut), 它使得线上inference引擎,不须要作任何改动便可兼容弹性改造。因为有效特征大大减小,打分速度相比原引擎提高50%以上。
咱们将图裁剪看作TF-graph的静态优化问题,分为3个步骤:
咱们实现了完整简洁的图裁剪工具,在模型热导出时调用, 将模型从原先的8GB左右压缩到几百兆大小,同时保证模型打分一致。
online learning的稳定性很是重要。咱们将线上真实效果,与实时模型生成的效果,进行了严密的监控,一旦样本误差过多,就会触发报警。
因为需捕捉时变的数据变化,于是不能用固定的离线数据集评估模型结果。咱们使用阿里流式日志系统sls最新流入的数据做为评估样本,以滑动窗口先打分后再训练,既维持了不间断的训练,不浪费数据,同时尽量高频地获得最新模型效果。
咱们对以下核心指标作了监控:
线上与训练指标之间的对应关系以下表:
线上指标 | 训练指标 | 备注 |
---|---|---|
OnlineAUC | AUC | |
uvctr | User-AUC | 参考备注 |
正负样本比例 | 模型打分均值 | 只应用于二分类 |
经过http接口,每隔一段时间发送监控数据,出现异常会及时产生钉钉和邮件报警。下图是对9月20日到27号的监控,从第二张图表来看,模型能较好的适应当前数据流的打分分布。
User-AUC: 传统的AUC并不能彻底描述uvctr,由于模型极可能学到了不一样用户间的偏序关系,而非单个用户在不一样offer下的点击偏序关系。为此,咱们使用了User-AUC,它尽量地模拟了线上uvctr的计算过程,在真实实验中,监控系统的uvctr小时报表,与实时模型输出的User-AUC高度一致。
目前算法已经在支付宝首页的多个推荐位上线。推荐系统根据用户的历史点击,融合用户画像和兴趣,结合实时特征,预估用户CTR,进而提高系统总体点击率。
咱们以推荐位业务为例说明,其采用了经典的wide&deep的网络结构,其sparse部分包含百级别的group(见下段备注1)。 一天流入约百亿样本,label的join窗口为固定时长。因为负样本占大多数,上游链路对正负样本作了1:8的降采样(见下文备注2)。
训练任务采用蚂蚁统一训练平台构建,并使用工做流进行定时调度,离线和在线任务的其余参数所有一致。Batchsize为512,每200步(即20万样本)评估结果,定时将模型经过图裁剪导出到线上系统。当任务失败时,调度系统会自动拉起,从checkpoint恢复。
该推荐业务的online learning桶最近一周相比线上多模型融合最优桶提高4.23% , 相比随机对照提高达34.67% 。 另外一资讯推荐业务其最近一周,相比DNN基准uv-ctr提高+0.77%,pv-ctr提高+4.78%。实验效果相比有较大的提高。
备注1: group embedding是将类似emb特征分组,各自lookup求和后再concat,使得特征交叉在更高层进行。其设计是考虑到不一样group的特征差别很大(如user和item),不该直接对位求和。
备注2: inference打分仅作pointwise排序,采样虽改变数据分布但不改变偏序关系,所以并未在训练上作补偿。
弹性特征已经成为蚂蚁实时强化深度学习的核心要素。它只是第一步,在解决特征空间按需建立问题后,它会带来一个充满想象力的底层架构,众多技术都能在此基础上深挖: 在工程上,可继续从分钟级向秒级优化,进一步提高链路实时性并实现模型增量更新; 在算法上,咱们正在探索如样本重要性采样,自动特征学习,在线线性规划与DNN的结合,实现优化器联合决策等技术。
因为在线学习是个复杂的系统工程,咱们在开发和调优时遇到了大量的困难,涉及样本回流,训练平台,模型打分,线上评估等一系列问题,尤为是稳定性,但基本都一一克服。为了保证线上结果稳定可信,咱们在观察和优化两三个月后才发布这篇文章。
最后感谢各位同窗对本文的阅读,行文时间仓促,确定有考虑不妥和错误,若是有任何问题和建议,欢迎留言讨论。
[1]: McMahan, Brendan. "Follow-the-regularized-leader and mirror descent: Equivalence theorems and l1 regularization." Proceedings of the Fourteenth International Conference on Artificial Intelligence and Statistics. 2011. [2]: McMahan, H. Brendan, et al. "Ad click prediction: a view from the trenches." Proceedings of the 19th ACM SIGKDD international conference on Knowledge discovery and data mining. ACM, 2013. [3]: Yuan, Ming, and Yi Lin. "Model selection and estimation in regression with grouped variables." Journal of the Royal Statistical Society: Series B (Statistical Methodology) 68.1 (2006): 49-67. [4]: Andrew, Galen, and Jianfeng Gao. "Scalable training of L 1-regularized log-linear models." Proceedings of the 24th international conference on Machine learning. ACM, 2007. [5]: Scardapane, Simone, et al. "Group sparse regularization for deep neural networks." Neurocomputing 241 (2017): 81-89. [6]: Yang, Haiqin, et al. "Online learning for group lasso." Proceedings of the 27th International Conference on Machine Learning (ICML-10). 2010. [7]: Zhou, Yang, Rong Jin, and Steven Chu–Hong Hoi. "Exclusive lasso for multi-task feature selection." Proceedings of the Thirteenth International Conference on Artificial Intelligence and Statistics. 2010. [8]: Yoon, Jaehong, and Sung Ju Hwang. "Combined group and exclusive sparsity for deep neural networks." International Conference on Machine Learning. 2017. [9]: Langford, L. Li, and T. Zhang. Sparse online learning via truncated gradient.JMLR, 10, 2009. [10]: L. Xiao. Dual averaging method for regularized stochastic learning and online optimization. In NIPS, 2009