冷启系列
近期在实际业务中通过对POSO应用和改进,取得了显著的效果。前一篇《 用户冷启POSO论文详读 》详细介绍了POSO方法, 包括其原理的推导过程,和不同模型的结合。 本文将接着上一篇,继续分享POSO的实际应用过程,包括: (1) 遇到的一些问题,(2) 对应的改进,(3) 效果的分析,(4) 其它一些思考。
目录
- 3 实际应用
- 3.1 实现细节
- 3.1.1 gate激活函数
- 3.1.2 输出期望
- 3.2 gate优化
- 3.2.1 gate网络
- 3.2.2 field-wise or bit-wise
- 3.2.3 gate输入
- 3.2.3.1 特征均衡性
- 3.2.3.2 特征多维度
- 3.2.4 gate作用模块
- 3.2.4.1 task模块
- 3.2.4.2 attention模块
- 3.2.5 gate梯度
- 3.2.6 gate和MMoE的区别
- 3.3 冷启和非冷启用户效果对比
- 3.4 attention中的query
3 实际应用
我在工作中应用POSO的一些尝试和思考,大多是论文中没有提及的,也是大多数论文的风格,很少提到在实际应用中的一些落地经验和思考。
3.1 实现细节
POSO的代码实现很简单,只需要把对应gate的输出和模型已有输出按位相乘即可。
3.1.1 gate激活函数
POSO中gate的输出层的激活函数使用sigmoid。不同于一般gate输出会使用softmax,这种情况往往是输出维度少且需要归一化,如MMoE中task的对expert的gate。POSO中维度多,使用softmax容易导致权重集中到某些维度,这在《多目标模型结构-MMoE和实际应用思考》分析过,也容易造成每个维度的权重小,模型难学的问题。Sigmoid函数输出在0-1之间,和权重输出的要求相符,且各个维度独立,不受其他维度影响。
3.1.2 输出期望
模型中使用POSO的每层的输出,由gate输出和原有输出按位相乘,由于gate输出是经过sigmoid函数得到,其期望为0.5,因此层输出的期望也会相应缩小一倍,为了保持输出期望和原有保持一致,在按位乘后, 再乘以2,以解决期望缩放的问题 。
3.2 gate优化
POSO的核心在于gate的使用,实现不同,带来的效果存在很大的差异。我在具体应用过程中,对于gate做了一些优化尝试,有些有效果,有些没有明显效果。
3.2.1 gate网络
实际应用过程中,gate的网络学习的效果好坏,对整个模型效果有非常关键的作用。大多数论文在应用gate时,网络非常简单,一般是使用一层线性变化,然后接softmax或sigmoid输出。这时候gate的非线性能力弱,如果模型需要学习复杂的函数,这时候线性能力往往不够, 需要加强gate的非线性,以提高gate网络的能力,减小模型学习难度 。
在POSO应用过程中,gate仅使用一层线性变换,带来的效果微弱,不显著。 通过使用一层非线性变换,增加gate网络的非线性,模型带来的线上效果显著提升。
3.2.2 field-wise or bit-wise
POSO中的个性化gate可以作用于任何层,对于field-wise还是bit-wise的探索,仅限于embedding到第一层dense层这部分。
除去embedding层之外的其它层,实际含义已经消失,不存在field的概念,均使用bit-wise按位相乘,而embedding层输入给第一层dense层,embedding存在field的概念,在输入到dense层之前,是按field-wise对其相乘,还是bit-wise对其相乘,其中涉及到field信息和模型容量两个方面对模型的影响。
使用field-wise相乘,可以保留embedding的field信息,需要的参数量少,因此模型容量小,而使用bit-wise相乘,需要的参数量大,模型容量增加,两者对模型的影响来自不同方面。实验结果表明, 使用field-wise效果更好,虽然相比bit-wise的模型容量减小,但其底层保留的field信息量,可以弥补模型容量带来的损失。
3.2.3 gate输入
根据论文的思路,gate的输入是用户个性化编码相关的特征,其核心在于 需要体现用户的差异性 。
3.2.3.1 特征均衡性
对于非均衡分布的特征,最直观的想法则是类似是否新用户、用户活跃度之类的特征。
- 用户活跃度
我最初使用用户活跃度特征,没有明显效果,这里的问题可能和用户活跃度特征与用户真实活跃情况之间的gap,也就是用户活跃度的特征表达准确性的问题,而对于这类没有标准答案的特征,其准确性也很难评判,要修正特征计算也没有标准,因此换一种思路,利用uid特征。
- uid
使用uid特征时,我最初担心冷启用户的uid特征没学好,将其作为gate输入,模型不好学,但实验证明,我的担心是多余的,这里我的分析是, uid没学好也是一种信息,模型可以顺利捕捉到这种信息。 gate输入使用uid的效果很明显,带来了显著的线上提升。
- uid+用户基础信息
在应用POSO时,我还没有体会到非均衡特征的重要性,因此在gate输入为uid取得效果之后,想进一步在gate输入中加入用户基础信息,以增加模型结构对用户的个性化响应,但效果不仅没有加强,反而削弱了。
这里就体现出gate输入中,特征在总体样本中非均衡分布的重要性。
这是从宏观层面讲,而从模型具体运作角度分析,我对gate经过sigmoid在embedding层的输出做了分析,发现加入用户基础信息后, 多个维度的输出均趋向饱和,相当于这些维度已经学不出区分度。 根据此,再对gate输入的uid和基础信息的norm做分析,发现基础信息的norm是uid的norm的几个数量级,因此采用了两种思路缓解gate输出饱和的问题。
一种思路是对基础信息, 在gate输入中新学embedding,不和主网络共享 。另一种思路是 对gate输入使用Layer normlization ,两种方法对gate输出的饱和度均有所缓解,但离线训练auc始终没有gate仅使用uid高,因此就没有进行线上对比,有兴趣的朋友可以上线试一试。
在gate中使用用户基础信息,预期是想让模型学到不同基础画像用户群的个性化响应,但从实际效果看,加上均衡分布的特征后,会减弱非均衡特征所表征的个性化信息编码能力,从而导致效果变差。
3.2.3.2 特征多维度
在gate输入为非均衡特征的思路下,其不仅仅局限于用户侧,对作者侧也是可行的。用户有冷启问题,作者也有冷启问题,而且作者冷启对于内容消费场景的生态,是非常重要的。
在这种思路下,对gate的输入新增作者id,实际没有带来收益。而其他同事在另一个数据量大很多的场景,取得了相应的收益。
在gate输入中新增作者id,相当于增加了模型的学习维度,只有uid时只需要学对于用户的个性化响应,而增加作者id时,既需要学用户侧,也需要学作者侧,假设用户数量为M,作者数量为N,则 模型需要学的个性化响应数量级从M增加到M*N,模型学习难度增加 。
另一个场景取得效果, 和该场景数据量有关 ,数据量决定了模型的天花板。在我这个场景下,当前的数据量可能还无法支撑模型学习多维度的个性化响应,之后数据量增加到一定阶段,可以尝试。
除了数据量层面,在gate层面也可以做对应的调整,可以加强gate网络的能力,多引入一层非线性操作,这种思路也需要线上验证。
3.2.4 gate作用模块
gate可以作用于多层和多个模块,在实际使用过程中,可根据具体需要而定。
3.2.4.1 task模块
我在实际应用时,基础模型为share-bottom的多目标结构,仅针对于share bottom层做了POSO操作,而task层没有。
这种实现进行了实验对比, 在task层也加上POSO操作后,提升非常微弱,相比于新增的参数量,收益非常小, 聊胜于无,因此最终并未在task层作用。这和论文中提到的, POSO希望通过原始特征而非二手加工后的特征来加强个性化, 是吻合的。特征到task层时,经过了多层的提取,得到的是更高级的表征,其作用效果不如在底层粗糙特征时。
3.2.4.2 attention模块
attention模块也可使用POSO,我这里没有进行尝试,依据我对自己业务的仅有经验,在attention部分使用POSO,收益会非常微弱,因此就没有投入精力进行,有兴趣的朋友可以试一试。
3.2.5 gate梯度
快手在实现的时候,对gate的输入stop了梯度,相当于让模型在学习过程中,让gate适应主网络。
根据MMoE的经验,不stop梯度,天花板更高,但面临网络学习过程不稳定的问题。在POSO里,不stop梯度对模型学习难度的增加,会比MMoE更大,很大概率会出现,因为模型更难学而比stop梯度的时候,效果更差。有兴趣的朋友可以试一试。
3.2.6 gate和MMoE的区别
MMoE中也有gate,虽然两者都是学权重,但有本质差异。
MMoE的gate是学task对expert的权重,本质是学不同task的样本的重要性,是一个预期稳定的分布,因此 同一个task的不同样本,其gate分布越稳定,某种程度表示模型收敛得越好 。
POSO的gate是学网络参数对用户的响应,本质是学网络的个性化,是一个预期需要体现差异性的分布,因此 不同样本,其gate分布差异越大,某种程度表示模型学得越好 。
3.3 冷启和非冷启用户效果对比
POSO的使用,不仅对冷启用户有效果,对非冷启用户也有效果,论文中也提到了这点。这得益于模型本身的设计,其效果是模型结构对用户的个性化响应,因此不管用户是冷启还是非冷启,利用POSO都可以使模型结构产生个性化的响应。
两者效果对比,之所以冷启用户效果明显,是因为 冷启用户效果提升的空间大 ,而非冷启用户的空间小,类似于从90分到100分和从20分到60分的难度差异。
3.4 attention的query
快手使用的attention是multi-head的形式,其输入是用户行为历史除外的所有特征。我在POSO相关工作中并未对attention的query调整,而是在另一个工作中,在attention的query中加入用户基础信息特征,线上有相应的收益,但因为一些其他的原因,并未上线。
在attention的query中加入用户的一些相关特征,为什么会有效果?
这里主要和用户兴趣表征有关系。对单个用户单次推荐而言,query中不管增加user的什么信息都不影响其结果,因为对这个用户而言,query是确定的,不存在差异;但对多个用户或者用户的多次请求而言,则有差异了,因为用户的兴趣表征发生了变化。
通过在query中增加一些用户侧的信息,可以 利用基础信息的泛化,补充一些用户兴趣 ,尤其在历史行为序列长度短的情况下,用户的历史有限,表达出的兴趣也有限,而 通过具有相同特征的用户的兴趣补充,可以捕捉到由于长度限制而没有表达出来的用户兴趣。
下一篇将继续分享多目标主题之loss方向。
Reference
POSO: Personalized Cold Start Modules for Large-scale Recommender Systems https://arxiv.org/abs/2108.04690.
交流群:点击“联系作者”--备注“研究方向-公司或学校”
欢迎|论文宣传|合作交流
往期推荐
[NIPS'22「牛津+剑桥」利用迁移学习在异构空间中估计干预效果
2022-10-30
[ICLR'23 LightGCL: 简单而有效的图对比学习推荐系统
2022-10-30
[深度点击率预估模型的过拟合现象剖析
2022-10-22
[「阿里」SCI:基于子空间学习的个体干预效果(ITE)估计方法
2022-10-15
长按关注,更多精彩