- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
来源:
长尾问题是个老大难问题了.
在推荐中可以是用户/物料冷启动,在搜索中可以是中低频query、文档,在分类问题中可以是类别不均衡。长尾数据就像机器学习领域的一朵乌云,飘到哪哪里就阴暗一片。今天就介绍来自Google的一篇解决长尾物品推荐的论文.
真实推荐场景下,大部分物品都是长尾物品,即小部分物品占据了绝大部分的交互,大部分物品的交互次数很少。人们一直都致力解决这个问题,但往往不能在真实环境下部署,要么对整体的效果大打折扣。在这篇论文里,作者致力于维持整体效果、保成本的条件下提高长尾物品的推荐效果(是否需要专门评估在长尾物品上的推荐效果?)。为了达到这个目标,作者设计了Cross Decoupling Network (CDN).
CDN借鉴了计算机视觉里的一个想法 [1] (借鉴的这篇论文也是研究长尾问题的,感觉值得阅读一下),该方法的核心思想是两阶段的学习策略:第一阶段在长尾分布的数据集上学习物品表征,第二阶段在平衡的数据集上训练预测器(如分类器)。但是这种方法在推荐场景中,这种方法会导致严重的遗忘问题,即第一阶段学到的知识会在第二阶段遗忘。并且两阶段训练比联合训练的成本更高。而CDN则兼顾了解耦(decoupling)的思想,并克服了遗忘问题.
长尾问题的本质是什么呢?
先来抛个砖:个人认为长尾物品推荐效果不好的本质原因是否是因为物品的特征计算不准确,由于交互较少,按照正常的计算逻辑得到的结果是有偏(biased)的。感觉现在推荐里卷来卷去,如何去偏慢慢得到大家的重视了.
论文中,作者理论上分析(有点意思,具体分析可以参考论文,但是感觉有点牵强)得到长尾问题不利于整体效果的原因是因为对用户偏好的预测是有偏的,这个偏差又来自两部分(这里借鉴石塔西大佬的解释和观点 [2] ):
对于第一种偏差,要解决 模型对那些冷启友好特征不重视 的问题。对于冷启,单单增加一些对冷启友好的特征是没用的,因为 模型已经被老用户、老物料绑架 了。以物料冷启为例,模型看重的item id embedding这些最个性化的物料特征,但是恰恰是长尾物品没有学好的。 长尾物品希望模型多看重一些可扩展性好的特征,比如tag / category,但是模型却不看重 .
CDN从以下两个方面解决长尾问题:
CDN的整体结构如上图所示,左右两边分别对应物品侧和用户侧.
既然要通过划分记忆和繁华特征来解耦,那么怎么划分输入的特征呢?
记忆特征使模型能够记住数据集中出现频繁的模式,通常是满足以下性质的类别特征:
对于记忆特征的embedding,其一般只会被指定的物品更新(uniqueness),并且不同物品的记忆特征一般不同(independence)。因此,记忆特征一般只记住与物特定品相关的信息。物品ID就是一种很强的记忆特征(还有哪些记忆特征呢?).
泛化特征通常是那些能学习到用户偏好和物品之间关系的特征,这些特征通常是物品间共享的特征,如物品的类别、标签等.
作者采用基于频率的门控的MoE(Mixture of Expert)来解耦记忆和泛化.
对于一个训练样本 \((u, i)\) ,物品表征表示如下(方便起见,向量没有用黑体):
其中 \(E_k^{mm}(\cdot)\) 表示专注于记忆的第 \(k\) 个专家网络,输入为记忆特征 \(i_{mm}\) ; \(E_k^{gen}(\cdot)\) 表示专注于泛化的第 \(k\) 个专家网络,输入为泛化特征 \(i_{gen}\) 。注意,这些特征一般是把对应特征的嵌入拼接起来。 \(G(\cdot)\) 为门控函数(输出为向量), \(G(i)_{k}\) 表示门控输出的第 \(k\) 个元素,且 \(\sum_{k=1}^{n_1 + n_2} G(i) = 1\) 。简单的理解,就是门控的输出对记忆和泛化网络的输出进行 动态加权 。此处的动态加权即是关键,即根据物品的热度动态调整记忆和泛化的比例。作者建议用物品频率作为门控的输入,即 \(g(i) = softmax(W i_{freq})\) .
记忆和泛化解耦后,泛化的专家网络的更新将主要来自于长尾物品,而不会损害记忆专家网络从而导致整体性能的下降.
这一部分解耦的是用户的交互,提出了正则化的双边网络(Regularized Bilateral Branch Network):
这两个分支有一个共享的基座(User Tower),以及各自一个分支特定的网络。在训练阶段,对于 \((u_m, i_m) \in \Omega_m\) 和 \((u_r, i_r) \in \Omega_r\) 分别进入main和regularizer分支,不同分支计算出来的用户表示为:
其中 \(f(\cdot)\) 就是两个分支共享的基座, \(h_m(\cdot), h_r(\cdot)\) 分别是两个分支特有的。main和regularizer可以同时训练,但是在推理时只使用main分支.
最终物品和用户的表征通过一个 \(\gamma\) -adapter来融合,并控制训练过程中模型的注意力转移到长尾物品上。训练时的logit计算方式为:
其中 \(\alpha_t\) 就是 \(\gamma\) -adapter,它是训练轮数的函数:
其中 \(T\) 是总的训练轮数, \(t\) 是当前轮数, \(\gamma\) 是正则化率,对于越不平衡的数据集, \(\gamma\) 的取值一般越大。得到 \(s(i_m, i_r)\) 后,用户对物品的偏好通过以下方式计算:
损失函数为:
其中 \(\hat{d}(u_m, i_m), \hat{d}(u_r, i_r) \in \{0, 1\}\) 分别表示 \(\Omega_m, \Omega_r\) 中的用户偏好( 这里论文描述的不是很清楚 ).
吐槽以下:论文在训练数据构造和训练过程讲的都不是很清楚。比如同时训练main和regularizer,输入的样本分别是什么, \(u_m, u_r\) 是同一个用户吗, \(i_m, i_r\) 是用一个物品吗?还有就是 \(s(i_m, i_r)\) 计算结果是什么含义?
总体来说,这篇论文对长尾问题的认识还是很深的,也确实让人有所启发。特别关于特征解耦的那一部分,感觉以后可以实践一下。但是在后续的两个分支部分语焉不详,且缺乏相关的实现细节,或许是本人公里不够,一些细节错过了。还请路过的大佬指正.
Decoupling representation and classifier for long-tailed recognition, ICLR 2020. ↩︎ 。
https://zhuanlan.zhihu.com/p/651731184:似曾相识:谈Google CDN长尾物料推荐. ↩︎ 。
BBN: Bilateral-Branch Network with Cumulative Learning for Long-Tailed Visual Recognition, CVPR 2020. ↩︎ 。
最后此篇关于EmpoweringLong-tailItemRecommendationthroughCrossDecouplingNetwork(CDN)的文章就讲到这里了,如果你想了解更多关于EmpoweringLong-tailItemRecommendationthroughCrossDecouplingNetwork(CDN)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
Empowering Long-tail Item Recommendation through Cross Decoupling Network (CDN) 来源: KDD'20
我是一名优秀的程序员,十分优秀!