【王树森推荐系统】聚类召回
基本思想
- 如果用户喜欢一篇笔记,那么他会喜欢内容相似的笔记。比如说我喜欢买房的笔记,系统给我推买房的笔记我可能就会点进去
- 事先训练一个神经网络,基于笔记的类目和图文内容,把笔记映射到向量。向量的相似度就是笔记内容的相似度
- 对笔记向量做聚类,划分为 1000 个 cluster,记录每个 cluster 的中心方向(k-means聚类,用余弦相似度)
记录索引
- 一篇新笔记发布后,用神经网络把它映射到一个特征向量
- 从 1000 个向量(对应 1000 个cluster)中找到最相似的向量,作为新笔记的 cluster
- 索引:cluster → 笔记ID列表(按时间倒排)
线上召回
- 给定用户 ID,找到他的 last-n 交互的笔记列表,把这些笔记作为种子笔记
- 把每篇种子笔记映射到向量,寻找最相似的 cluster(知道用户对哪些 cluster 感兴趣)
- 从每个 cluster 的笔记列表中,取回最新的 m 篇笔记
- 最多取回 mn 篇新笔记
- 缺点和类目召回一样:只对刚刚发布的新笔记有效,有些笔记过了一两个小时后就不太可能被召回了
内容相似度模型
提取图文特征
- 用 CNN 提取图片的特征
- 用 BERT 提取文字的特征
- 把图片的特征和文字的特征拼接在一起水乳一个全连接层
- 全连接层输出笔记的特征向量
两篇笔记的内容相似度
- 两个神经网络的参数是相同的
- 模型中的 BERT 是预训练好的,可以直接用也可以做 fine-tune
- CNN 也是与训练好的,比如在 image-net 中预训练好的,也可以微调更新参数
- 全连接层是需要训练的
训练内容相似度模型
- 训练的方法和双塔模型类似
- 基本想法:鼓励 cos(a,b+)cos(a,b^+)cos(a,b+) 大于 cos(a,b−)cos(a,b^-)cos(a,b−)
正样本的选取
- 方法一:人工标注二元组的相似度:代价太大不划算
- 方法二:算法自动选正样本
- 筛选条件:经过这样的筛选,可以过滤到完全不相似的笔记
- 只用高曝光笔记作为二元组(因为有充足的用户交互信息,算法选的正样本比较准)
- 两片笔记有相同的二级类目,比如都是菜谱教程
- 用 ItemCF 的物品相似度选正样本
- 筛选条件:经过这样的筛选,可以过滤到完全不相似的笔记
负样本的选取
- 从全体笔记中选出满足条件的:
- 字数较多(神经网络提取的文本信息有效)
- 笔记质量高,避免图文无关