原文: (今日头条、抖音推荐算法原理全文详解) https://mp.weixin.qq.com/s/e0KgNOn3vIKn-nc1l-XBqw
1、系统概览
1.1)推荐系统
推荐系统就是拟合一个用户对内容满意度的函数,这个函数需要输入三个维度的变量:
- 内容特征:提取不同内容类型的特征做好推荐。
- 用户特征:兴趣标签,职业、年龄、性别等。
- 环境特征:在工作场合、通勤、旅游等不同的场景,信息偏好有所偏移。
1.2)推荐系统的目标
- 可量化目标:点击率、阅读时间、点赞、评论、转发包括点赞
- 无法直接衡量的目标
- 广告&特型内容频控
- 低俗内容打压&频控
- 标题党,低质,恶心内容打压
- 重要新闻置顶&强插&加权
- 低级别账号内容降权
1.3)典型推荐算法
- 协同过滤模型
- 监督学习算法Logistic Regression模型
- 基于深度学习的模型
- Factorization Machine
- GBDT
注:需要非常灵活的算法实验平台,可以支持多种算法组合,包括模型结构调整。
1.4)推荐特征
- 第一类是相关性特征
评估内容的属性和与用户是否匹配.显性的匹配
包括关键词匹配、分类匹配、来源匹配、主题匹配等.隐性匹配
从用户向量与内容向量的距离可以得出,如FM模型。
- 第二类是环境特征
包括地理位置、时间。这些既是bias特征,也能以此构建一些匹配特征。
- 第三类是热度特征
包括全局热度、分类热度,主题热度,以及关键词热度等。内容热度信息在大的推荐系统特别在用户冷启动的时候非常有效。
- 第四类是协同特征
它可以在部分程度上帮助解决所谓算法越推越窄的问题。通过用户行为分析不同用户间相似性,比如点击相似、兴趣分类相似、主题相似、兴趣词相似,甚至向量相似,从而扩展模型的探索能力。
1.5)模型训练
- 线上服务器记录实时特征
- 导入到Kafka文件队列中
- 客户端回传推荐的label构造训练样本
- 根据最新样本进行在线训练更新模型参数
- 线上模型得到更新
1.6)召回策略
- 为什么需要召回策略?
- 内容量非常大,加上小视频内容有千万级别,推荐系统不可能所有内容全部由模型预估。
- 召回策略,每次推荐时从海量内容中筛选出千级别的内容库
- 召回策略最重要的要求是性能要极致,一般超时不能超过50毫秒
- 召回策略的方案
- 离线维护一个倒排。key可以是分类,topic,实体,来源等。
- 排序考虑热度、新鲜度、动作等
- 线上召回可以迅速从倒排中根据用户兴趣标签对内容做截断,高效的从很大的内容库中筛选比较靠谱的一小部分内容
1.7)推荐系统的数据依赖
- 推荐模型的特征抽取需要用户侧和内容侧的各种标签。
- 召回侧需要获取用户侧和内容侧的各种标签。
- 内容分析和用户标签挖掘是搭建推荐系统的基石。
2、内容分析
2.1 文本分析
- 推荐系统的应用
- 用户兴趣建模(user profile): 如:给喜欢阅读”互联网”文章打上“互联网”标签。
- 帮助内容推荐: “魅族”的内容推荐给关心“魅族”的用户
- 生成频道内容: “德甲”的内容进“德甲频道”
- 今日头条抽取的文本特征
- 语义标签类特征
- 显式语义特征: 为文章打上语义标签。这部分标签是由人定义的特征,每个标签有明确的意义,标签体系是预定义的。
- 隐式语义特征:主要是topic特征和关键词特征,其中topic特征是对于词概率分布的描述,无明确意义;而关键词特征会基于一些统一特征描述,无明确集合。
- 文本相似度特征: 用户反馈最大的问题之一就是为什么总推荐重复的内容。这个问题的难点在于,每个人对重复的定义不一样。
- 质量相关特征: 判断内容是否低俗,色情,是否是软文,鸡汤?
- 语义标签类特征
2.2 头条语义标签的 特征 & 使用场景
- 分类:user profile; 过滤频道内容; 推荐召回; 推荐特征
- 概念:过滤频道内容; 标签搜索;推荐召回(Like)
- 实体:过滤频道内容;标签搜索;推荐召回(Like)
2.3 标签分层
- 每个层级粒度不一样,要求也有区别
- 分类体系要求覆盖全,希望任何一篇文章,总能找到合适的分类,精确性要求不高
- 实体体系不要求覆盖全,只要覆盖每个领域人们的人物、机构,作品,产品即可
- 概念体系负责表达比较精确,但是有属于抽象概念的语义,也不要求覆盖全
分类的目标是覆盖全面,希望每篇内容每段视频都有分类;而实体体系要求精准,相同名字或内容要能明确区分究竟指代哪一个人或物,但不用覆盖很全。
概念体系则负责解决比较精确又属于抽象概念的语义。
2.4 为什么要语义标签
优点:
- 隐式语义特征已经可以很好的帮助推荐
- 语义标签做好的难度和资源投入远大于隐式语义特征
缺点: - 频道,兴趣表达等重要产品功能需要有一个有明确定义,容易理解的文本标签体系。
- 语义标签的效果是检查一个公司NLP技术水平的试金石
语义标签的效果是检查一个公司NLP技术水平的试金石。
- 元分类器类型: SVM、CNN、RNN
2.2 图片分析
2.3 视频分析
3、用户标签
3.1 兴趣特征
- 感兴趣的类别和主题
- 感兴趣的关键词
- 感兴趣的来源
- 基于感兴趣额的用户聚类
- 各种垂直兴趣特征(车型,体育球队,股票等)
3.2 身份特征
- 性别
性别信息通过用户第三方社交账号登录得到
- 年龄
年龄信息通常由模型预测,通过机型、阅读时间分布等预估。
- 常驻点
常驻地点来自用户授权访问位置信息,在位置信息的基础上通过传统聚类的方法拿到常驻点。
常驻点结合其他信息,可以推测用户的工作地点、出差地点、旅游地点。
3.3 行为特征
- 晚上才看电视
- 打开手机时间
3.4 对浏览内容标签进行数据处理策略
- 过滤噪声。通过停留时间短的点击,过滤标题党。
- 热点惩罚。对用户在一些热门文章(如前段时间PG One的新闻)上的动作做降权处理。理论上,传播范围较大的内容,置信度会下降。
- 时间衰减。用户兴趣会发生偏移,因此策略更偏向新的用户行为。因此,随着用户动作的增加,老的特征权重会随时间衰减,新动作贡献的特征权重会更大。
- 惩罚展现。如果一篇推荐给用户的文章没有被点击,相关特征(类别,关键词,来源)权重会被惩罚。当然同时,也要考虑全局背景,是不是相关内容推送比较多,以及相关的关闭和dislike信号等。
3.5 用户标签挖掘
第一版: 用户标签批量计算框架
- Scribe收集原始日志
- 导入Kafka文件队列
- 导入Hadoop集群
- MapReduce Job批量计算
- 写入高性能分布式存储系统
- 线上读取高性能分布式存储系统
第二版: 用户标签流式计算框架
- Scribe收集原始日志
- 导入Kafka文件队列
- 导入Storm集群
- 从高性能存储系统读取base
- 基于动作bath更新用户模型
- 线上直接读取高性能存储系统
流式计算和批量计算混合使用
大部分user profile采用流式计算
- 各个粒度的兴趣标签
- 垂直领域profile
对时效性不敏感的user profile采用Batch计算
- 性别,年龄
- 常驻地点
4、评估更新
一个事情没法评估就没法优化
4.1 对推荐系统产生影响的因数
- 候选内容集合的变化
- 召回模块的改进和增加
- 推荐特征的增加
- 推荐系统架构的改进
- 算法参数的优化
- 规则策略的改变
4.2 评估系统要求
- 完备的评估系统
- 强大的实验平台
- 易用的实验分析工具
4.3 推荐系统评估需要注意的问题
- 兼顾短期指标与长期指标
- 要兼顾用户指标和生态指标
- 注意协同效应的影响,有时候需要彻底的统计隔离
4.4 强大实验平台的优点
- 同时在线的实验多: 每天数百个
- 高效管理和分配实验流量
- 降低实验,分析成本,提高算法迭代效率
4.5 人工抽样评估分析
- 线上实验平台只能通过指标变化推测用户体验
- 数据指标和用户体验存在差异
- 重大改进需要人工评估二次确认
- 头条利用内部和外包团队进行例行的人工抽样评估
5 内容安全
5.1 头条内容安全机制
5.2 分享内容识别技术
- 鉴黄模型
- 谩骂模型
- 低俗模型
1 | 注重召回率,准确率甚至可以牺牲一些。谩骂模型的样本库同样超过百万,召回率高达95%+,准确率80%+。如果用户经常出言不讳或者不当的评论,我们有一些惩罚机制。 |
5.3 泛低质内容识别技术
1 | 像假新闻、黑稿、题文不符、标题党、内容质量低等等,这部分内容由机器理解是非常难的,需要大量反馈信息,包括其他样本信息比对 |
- 低质模型是通过对评论做情感分析,结合用户其它的负反馈信息(举报、不感兴趣、踩)等信息,来解决很多语义上的低质问题,诸如题文不符、有头无尾、拼凑编造、黒稿谣言等
- 目前低质模型的准确率为70%,召回率为60%,结合人工复审召回率能做到95%