推荐系统精排:看阿里妈妈再试线性模型_机器学习

文 | 水哥

saying

1.科学总是要求我们有深度,但在实际业务中这却是一条悖论:越有深度的事情往往投入产出比不够高
2.当我有一个方法A,还有一个方法B。且B的某种简单形式就是A的时候,我就会很快乐,因为这时候B获取提升是很自然的
3.MoE有点像火影里的影分身之术,看着人很多,但是里面混的,弱的也很多。实际发挥作用的可能就旁边那两个帮着搓丸子的

在早期的LR中,稀疏性确实是一个很重要的要求。上一讲里面也谈了几个工业界中怎么做到这点的方法。但是现在这类问题已经不怎么提了。原因包括以下几点:

  1. 算力的提升,现在的系统不要说几千,几万个特征,几千维的DNN也能扛的下来。那么稀疏不稀疏就不那么重要了。其实大家可能也知道,当下的推荐系统中,每一个特征都会有对应的一段稠密的embedding来表示,这个容量其实是远远超出当年的稀疏解的。
  2. 对模型性能的追求,FTRL的文章提到过,虽然稀疏是很重要,但是稀疏比较重的时候,还是会伤害性能(上一讲没有提的一个trick是,训练的时候允许更多的非0解,但是serving的时候用更少的非0解)。
  3. 卷不动了,前人的工作已经把数学方面的内容挖掘的差不多了。但是挖来挖去都是在怎么求解一个稀疏解的问题上,LR这个模型这么简单,难道我们就不能关注点别的方面?比如模型结构什么的?

在这一讲中我们要介绍的就是另一个路线:模型结构。这一讲要介绍的文章是Piece-wise Linear Models(PLM[1])。这是一篇阿里妈妈的早期文章,熟悉这个领域的同学可能知道,阿里妈妈在推荐方面发表了很多论文,也是现在国内的一个大“IP”,这一篇可能是现在这一切的开始。这里要说明一下,虽然这篇文章放在arXiv上是2017年,但是这个工作应该很早就展开了。

通过苟一步到达非线性

我们回过头来重新思考LR,它的瓶颈是稀疏性吗?可能不是,它的瓶颈是能表达的映射太简单,当我们使用这个模型的时候其实是默认所有一元的或者多元的特征之间是加权和的关系,但这一点是有可能不成立的。很尴尬,一个东西的瓶颈是这个东西自己。那么最直接的想法就是,我需要引入一些非线性,这种非线性应该是什么形式?

由于时代原因,我们不能剧透深度神经网络这些技术,当时的背景都是在LR的基础上来做的。PLM这篇文章的非线性怎么来的?是来自于线性的一个加权和:

其中是每一个区域下的模型,而的作用是给这些不同区域下的模型做一个融合,一共有个独立的区域,也即这么多独立的子模型。最后的g使用来保证加完了的结果还在[0,1]之间,符合点击率的定义。

为什么这么做了以后就是非线性的(要注意这里所讨论的线性非线性指的是分类面,不是模型的函数是不是线性的)?数学上考虑起来比较麻烦,我们用文章中举的例子来表示:


推荐系统精排:看阿里妈妈再试线性模型_人工智能_02

左边的图表示的是训练数据,红色的属于一种类别,蓝色是另一种类别。如果用中间的单个的LR模型来做,只能画一条直线作为分界面。但是数据分布又长得比较扭曲,怎么画这条直线,都画不出什么好结果。如果用上面的PLM模型,理想情况下是怎样的呢?我们可以令m=4,四个模型分别只在四个象限内才有响应,他们的分界面就是蓝色四边形的四条边。这样就提供了一个非线性的分类面。

上面的公式给出的是一个概括性的形式,在实际业务中,文章对和都有具体的选择: 就是原来的LR模型,是softmax的不同项。由于这样乘起来已经满足归一化了,就不需要了。也就是:

这个模型有几个优点,第一,大体上还是延续了LR的形式。在业务上,之前关于LR的一切经验和积累都还可以保留下来(实在不行,我就让其他几个softmax的输出都极低,就留下一个LR,不就是baseline嘛),这个形式包含了原来LR的形式。像这种情况下涨点是很常见的,大不了我就沿着原先的LR一点点往前苟,很容易找到一个点能拿点收益。第二,这个模型对并行化是比较友好的,每一个都可以放在一个机器上,很直观。

MoE的理想与现实

看了上面的形式,其实大家也能反应上来,这个模型其实可以看做是MoE(Mixture of Experts)的一种形式。这里也提前介绍一下MoE好了,假设我有一个layer用来表示,我会复制份,上一层的输入是的话,也会从产出归一化的门控(称为gating network):

其中是激活函数,是expert的索引。根据门控网络把所有expert的输出综合起来就是MoE的输出:

所以MoE就是搞一堆模块,然后让他们的输出结果做一个融合,最后得到一个更加综合的解。

MoE的行为和多模型融合其实比较像,就是我一个打不过我就搞一个影分身一堆分身上来打。很多比赛里面大家都会做多模型融合,就是一样的训练集我训练若干个模型,预测的时候把他们结果加起来或者搞个投票,往往会得到更好的结果。

有一个区别是,多模型融合一般来说真的就是一堆模型,每一个模型都能保证发挥一些作用。而现在典型的MoE[2]则是多个layer,融合的权重也是来自网络自己产出的。这可能是有问题的。根据我们前面提到过的“模型懒惰原则”,很难控制多个expert的行为。有没有可能门控网络就输出一个比较大的值,剩下的都很接近0,那这样不就是和只用一个模块差不多了吗?或者大家权重都差不多,但是没有一个是真正强的。

根据我个人的经验(去查看门控网络的输出),这种情况是很有可能发生的。MoE的方法里面提到了一些操作来尽量避免这些现象,比如取topK之类的。这些操作其实也是有概率能避免,有概率不能避免的。另外,本来MoE至少在数学形式上是promising的,加入了后面这些操作会让方法变丑。。。在实践中使用MoE还是需要考虑挺多因素。PLM的论文没提到,想必还是趟了不少坑的。像上面那张图还是画饼的成分多一些,实际上做出来很难到这么理想。

线性的rethink

PLM对于一个线性模型做出了改进,是一个很有意思的claim。但是大家不要认为工业界之前的LR模型就是100%纯线性憨憨模型。假如我只有user id,item id这样的特征,那确实是线性的。但是实际上是可以开发很多交叉特征的,比如user id x item id。当我把所有特征都放在一个空间中的时候,模型确实是线性的。但是当我在原始特征(就是只有一阶特征)的视角下看,这个空间就不是线性了。

这个和早期CV中的图片分类是很像的。图像经过Bag-of-Words等方法的处理之后会得到一段特征。此时后面接的往往是一个线性分类器(SVM)。你从最后的特征来看,当然是线性分类器。但是你从原始图像的角度看,非线性早已经有了。

一点小尾巴——我这浓眉大眼的也需要稀疏解

在PLM这篇工作中,作者也希望保持稀疏性,对于L1正则化,需要包含每一个子模型的每一个参数:,和前面一样,是子模型的索引,而 是特征的索引,就是模型参数了。但是作者对参数提出了另一个要求:希望非零参数在不同模型上的选择是一致的。也就是说,如果某个特征决定是0了,那在所有子模型中都应该是0.作者把这个正则项定义为“L2,1”正则化:。这里是先把所有子模型中的同一种特征放一起的,外面这层实际上还是相当于一个L1正则化,假设外面这层决定了谁是0,那里面这个特征在所有机器上就都会是0. 这就起到特征选择的作用。这个地方个人理解还是为了省空间。如果是纯粹为了效果,一般的经验还是不同的模型用不同的特征后,融合起来更好。

那接下来我们来推导一下加入这两个正则化后的解是什么:

。。。

还是算了嗷,一方面是因为推导在原论文的附录里面已经给出了(不喜欢推导的同学希望不要ptsd)。另一方面要注意的最重要的一点是,这个问题已经不是凸的了。所以其实再费劲半天推导也大可不必。像现在的优化器都是针对非凸问题的,连DNN都可解,如果真的要使用PLM的方法直接用就行了。


推荐系统精排:看阿里妈妈再试线性模型_java_03

 

推荐系统精排:看阿里妈妈再试线性模型_java_04

[1] Learning Piece-wise Linear Models from Large Scale Data for Ad Click Prediction,arXiv,2017 https://arxiv.org/pdf/1704.05194.pdf

[2] Outrageously large neural networks: The sparsely-gated mixture-of-experts layer https://arxiv.org/abs/1701.06538