当前位置:网站首页>【冷启动】快手《POSO: Personalized Cold Start Modules for Large-scale Recommender Systems》
【冷启动】快手《POSO: Personalized Cold Start Modules for Large-scale Recommender Systems》
2022-08-08 04:10:00 【chad_lee】
《POSO: Personalized Cold Start Modules for Large-scale Recommender Systems》
快手针对冷启动的工作,已经落地。文章的思路非常好。
分析问题
任何ML模型的常用方法都是监督学习,不管是复杂还是简单的模型,本质是用模型去拟合数据的分布。但是如果有一类用户的数据在训练集中出现的很少,就很难学习出他们的分布,就是冷启动问题。先分析问题
行为数据稀疏
冷启动问题的特点是:1、新用户行为稀疏,训练数据少。2、新用户耐心差,对推荐结果敏感,模型试错机会少,因此数据更加稀疏。
已有的解决方案可以分为两类:1、元学习(先让模型到这些分布的附近);2、利用其他特征生成id embedding,从而缓解冷启用户历史数据稀少的问题。
样本分布差异大、不均衡
虽然缓解了数据稀疏的问题,但是依然存在样本分布极度不均衡的问题。显然,冷启用户的特征分布和全量用户的特征分布差别很大,但是冷启动用户样本一般占全量样本5%以下,因此模型主要受正常用户的影响。

图a是新用户和普通用户的行为差异,每一项普通用户的值都被调整到0,新用户耐心差,观看时间少,点赞率偏高(新鲜)。
直观的做法是加入一个指引特征(new_user),用该给模型指引这个样本是否是冷启动样本,从而让模型自动学习到样本之间的偏差,但是有没有效果呢?

对于同一个样本,分别mask新用户特征,然后将mask前后模型每个task最后一层的hidden states取出来 做差,可视化。可以看出new user特征几乎没有什么指引性,不会影响模型参数的分布。指引性强的是country这种特征。
这是因为new user样本稀疏导致的样本分布极度不均衡(长尾特征),因此模型不会去关注到这个特征。
POSO设计思路
之前已经提过,直观朴素的解决方法是用单独的模型学习这类分布,强迫模型关注到这个特征,POSO的核心思想也类似,即对每个用户学习对应的模型,不受其他用户样本的影响,做到完全基于用户自己的个性化。基于此思路,进行简化和近似等价,在基础的单个模型中引入个性化模块,使模型对每个用户在模型结构层面进行个性化响应,实现模型结构的个性化。
POSO的设计思路:
基础设计思路
POSO设计的出发点是对每个用户学习其模型:
y u = f u ( x u ) y^{u}=f^{u}\left(x^{u}\right) yu=fu(xu)
其中u表示用户,x为输入,y为输出, fu 则表示了这个用户对应的模型。这是一个完美的个性化推荐模型,但由于推荐场景用户量庞大,因此在落地层面不可行。
用户分群表征
沿着模型最初设计思路,对用户分群,每个用户群学习其对应模型,则可解决上述问题。单个用户可以看成是不同用户群的组合,比如一个用户可以看成是活跃用户和非活跃用户的组合(soft的人群划分策略):
y u = ∑ i = 1 N w i f ( i ) ( x ) w i = [ g ( x p c ) ] i \begin{gathered} y^{u}=\sum_{i=1}^{N} w_{i} f^{(i)}(x) \\ w_{i}=\left[g\left(x^{p c}\right)\right]_{i} \end{gathered} yu=i=1∑Nwif(i)(x)wi=[g(xpc)]i
其中N表示用户群数量, wi 表示第i个用户群对应模型对用户u的权重, wi 通过gate网络计算得到, s p c s^{pc} spc 表示用户的个性化编码特征(Personalization Code),如用户群属性、是否新用户之类的特征,这类特征在全局样本中分布不均衡。
当前模型利用
通过用户分群的方法,虽然实际落地可行,但依然需要学习N个模型,参数量随着用户群数量线性增长,因此利用gate对模型数量简化,仅使用当前模型即可。既然需要不同用户群模型,那就以当前模型为基础,通过加权得到某个用户群的模型,再进行加权得到某个用户的模型,两次加权可以通过一个gate网络合并。这种简化方式减少了模型数量,而且无需重新训练模型,直接在原有模型上改造。
经过gate简化后,当前模型的某一层的输出可以表示为:
x ^ = C ∑ i = 1 N [ g ( x p c ) ] i f ( i ) ( x ) (1) \hat{x}=C \sum_{i=1}^{N}\left[g\left(x^{p c}\right)\right]_{i} f^{(i)}(x) \tag{1} x^=Ci=1∑N[g(xpc)]if(i)(x)(1)
其中f表示业务当前所使用的模型, x 和 x ^ \hat{x} x^ 分别表示模型某层的输入和输出,C为修正因子,引入C的原因是gate g ( ) g() g() 的求和没有归一化的约束,输出期望存在缩放偏移。
POSO实践
从POSO的朴素设计思路出发,经过一系列的简化和近似操作,可以通过在全连接层点乘的方式,实现了模型结构的个性化。这种方式使得模型在使用POSO思路时结构简单清洗,且各种模型结构均适用,也适用于模型中单个或多个模块,包括但不限于简单的全连接结构、multi-head attention结构、MMoE结构。
base model

POSO+MLP
全连接结构使用POSO时,公式1化简为全连接的每层输出和gate的输出按位相乘
POSO+MHA

Multi-head Attention用POSO时,化简方法:
x ^ = C ⋅ softmax ( Q ⋅ ( G k ( x p c ) ⊙ K ) ⊤ d h ) ∑ i = 1 N [ g ( x p c ) ] i V ( i ) \hat{\mathrm{x}}=C \cdot \operatorname{softmax}\left(\frac{Q \cdot\left(G^{k}\left(\mathrm{x}^{\mathrm{pc}}\right) \odot K\right)^{\top}}{\sqrt{d^{h}}}\right) \sum_{i=1}^{N}\left[g\left(\mathrm{x}^{\mathrm{pc}}\right)\right]_{i} V^{(i)} x^=C⋅softmax(dhQ⋅(Gk(xpc)⊙K)⊤)i=1∑N[g(xpc)]iV(i)
原因是Query本身是高度个性化的了(包含用户特征);对Value,由于直接决定了输出的质量,需要保持公式1的方法,保留个性化不做化简;对于Key,采用折中的方法。
POSO+MMOE

直接吧MMOE带入POSO的公式:
x ^ t = C ∑ i = 1 N [ g ( x p c ) ] i ( ∑ j N e [ g t ( x ) ] j e ( j ) ( x ) ) \hat{x}^{t}=C \sum_{i=1}^{N}\left[g\left(x^{p c}\right)\right]_{i}\left(\sum_{j}^{N^{e}}\left[g^{t}(x)\right]_{j} e^{(j)}(x)\right) x^t=Ci=1∑N[g(xpc)]i(j∑Ne[gt(x)]je(j)(x))
i、j、t 分别代表personalized gates, experts and tasks。由于新老用户的gate是乘在后面的求和整体上的,这个式子相当于每个expert对新老用户是无感知的,并不区分新老用户。
首先松弛一下这个规则,让专家感知新老用户,这样 g i g_i gi可以进入后面的求和,但是要带上下标:
x ^ t = C ∑ i = 1 N ∑ j = 1 N e [ g ( x p c ) ] i j [ g t ( x ) ] i j e ( i j ) ( x ) \hat{\mathrm{x}}^{t}=C \sum_{i=1}^{N} \sum_{j=1}^{N^{e}}\left[g\left(\mathrm{x}^{\mathrm{pc}}\right)\right]_{i j}\left[g^{t}(\mathrm{x})\right]_{i j} e^{(i j)}(\mathrm{x}) x^t=Ci=1∑Nj=1∑Ne[g(xpc)]ij[gt(x)]ije(ij)(x)
为了计算效率,又可以进一步化简为上图所示的计算方法。
边栏推荐
- 小程序优化实践
- Qt 日志模块的个性化使用
- 2022/08/06 Study Notes (day24) Collection
- [opencv] Introduction to opencv development kit
- After being unemployed for 6 months at home, I bought a house with full payment through outsourcing: the industries you look down on are often very profitable
- 以0为底或以1为底对图片迭代次数的影响
- L3-005 Litter box distribution
- Building a High-Performance Platform on AWS Using Presto and Alluxio to Support Real-Time Gaming Services
- An egg - Nodemailer - qq email verification code development configuration
- 失业在家的6个月,我通过外包全款买了房:你看不起的行业,往往很赚钱
猜你喜欢

A line of code counts the number of occurrences of the specified string in the text

After being unemployed for 6 months at home, I bought a house with full payment through outsourcing: the industries you look down on are often very profitable

08 获取器 withAttr、多连缀、whereRaw、事务、数据集《ThinkPHP6 入门到电商实战》

awk语法-03-awk表达式(if语句、while循环、for循环)、awk中执行shell命令
![MySQL from entry to entry [20W word collection]](/img/da/1a40e831aa541001773bb76fd369f4.png)
MySQL from entry to entry [20W word collection]

XDR technology

Optional中orElse和orElseGet的区别

vulnhub-DC-5 target drone penetration record

Young freshmen who yearn for open source | The guide to avoiding pits from open source to employment is here!

The live broadcast of agricultural products continues to heat up, Economic Daily: Don’t forget quality when rushing
随机推荐
L3-006 迎风一刀斩
第4周 一步步搭建多层神经网络以及应用(1 & 2)
面向6G的通信感知一体化架构与关键技术
Mini Program Optimization Practice
08 获取器 withAttr、多连缀、whereRaw、事务、数据集《ThinkPHP6 入门到电商实战》
y90.第六章 微服务、服务网格及Envoy实战 -- 服务网格基础(一)
Building a High-Performance Platform on AWS Using Presto and Alluxio to Support Real-Time Gaming Services
保姆级教程!Golang微服务简洁架构实战
MindFusion.WPF Pack 2022.R1
C# "Original CSharp" 4th Chapter It is common for people to change in time, but it is difficult to know the succession of humanities
easypoi自定义模板导出
MySQL从入门到入土【20W字收藏篇】
New retail project and offline warehouse core interview,, 220807,,
内修昇思MindSpore AI框架,外重行业汇聚,华为大模型的不平凡之路
【保研面试】英文问题
32. 你知道Redis的字符串是怎么实现的吗?
中国科学院金属研究所科研课题获华为技术认证,助力材料学发展新范式!
初出茅庐的小李第115篇博客项目笔记之国产GD32F103RCT6基础工程创建
06 tp6 的数据更新(改)及删除 《ThinkPHP6 入门到电商实战》
leetcode: 455. 分发饼干