共计 1347 个字符,预计需要花费 4 分钟才能阅读完成。
前言
前段时间短暂的参加了一些冷启排序方面的一些工作,期间主要工作应该就是实现poso这篇论文了。这篇文章出自快手,原文的路径 POSO: Personalized Cold Start Modules for Large-scale Recommender Systems
但是今天这篇文章不是对论文的解读,主要是聊下在实践过程遇到的一些问题。这篇论文作者也在知乎上写了一篇文章,因为不少人会去咨询作者,索性就开了个帖子统一回复,真的挺好的,希望有类似的分享更多一点,毕竟论文和实践之间的GAP还是蛮大的。
要是没有看过作者的文章建议先看下作者的文章,推荐系统难题挑战(7):POSO,从模型角度解决用户冷启动问题已经解释的比较清楚了,如果能解决你的问题,下面这些基本上可看可不看。
分化特征和模块改造
Part1:分化特征的选择
这里重点把 uid 拿出来说,我自己在实践的时候也看到网上不少的资料里会提到使用 uid 的方案,并且论文里也有这样的测试。如果使用 uid 的话,记得拷贝一份出来然后需要做stop gradient 处理,这个在论文里应该是没有提到的。当然到这里也可以从上面知乎的那篇文章里得到。
我的第一版实验上线是基于 uid 的,上线后波动还是比较大,效果整体还是微负状态,后来咨询作者后,作者表示 uid 不一定能cover住,首先它不是明确的区分新老用户的关键特征,也就是说指向性不强,你也不太清楚它会学成啥样。
作者实验场景使用的是vv数,类比我现在的场景也找到类似的特征,至少这一点上还是能够很清晰的区分新老用户,新用户肯定vv数较低,毋庸置疑。
所以最终的结论就是:选择指向性强的特征,能够明确的区分新老用户。
Part2:分化特征处理
上一part说到分化特征比如vv数这样的,vv数本身是一个数值特征,该怎么喂入模型?
一般深度模型都是id类特征是一等公民,所以常见的类似vv特征都会做分桶处理,然后查embedding做不断的调整。
但是这次真的不一样,你的输入就是一个数值特征不需要做embedding变换。
这里所说的不要做变换是指不需要进行embedding处理,但是vv本身需要一些简单的处理,作者在他的知乎文章里补充了高斯有界化处理,那接么下来我们就说下这个高斯有界化处理注意事项。
- 高斯函数是一个 0 均值,至于为什么是 0 均值,可以这么理解。我们的vv数都是大于等于0的,我们只要关注高斯右半边即可。
- 方差如何选择?这个是一个超参,根据你自己的业务实际的情况调整。这里需要说明的是,方差越大倾向于老用户,方差越小倾向于新用户,所以最佳数值交给AB测试吧!
好像漏了为什么要做高斯有界化处理?这样处理之后数值会相对平滑一点,相比于直接拍下脑袋说大于150vv就是老用户而言显得更好一点。
Part3:模块改造
文章中主要提到MLP MHA MMOE三个大模块,至于其他模块要不要改造?咨询作者后表示也不是所有的模块都要改造。
我在做的模型有wide这样的记忆模块,这种记忆功能没有必要经过poso改造。所以在实践中哪些要改,哪些不改看实际需求。
总结
提到三个part关于分化特征和模块改造的一些实践
论文本身看起来很简单,但是细究还是有很多小的细节需要去注意,在没向作者咨询一些问题之后感觉一下子明晰很多,这个时候感觉到互联网分享的意义