背景
数据、算法、算力是拉动人工智能前进的三驾马车。数据就是信息,有信息算法才能发挥作用。garbage in, garbage out,什么样的信息输入基本就决定了什么样的结果输出。在推荐系统中,数据的质量基本决定了推荐效果的上限,而数据质量主要由特征构建、数据清洗等过程决定。
特征构建
做特征,需要紧紧围绕目标去做特征,而不是为了做特征而做特征,不合适的特征后续的存储、维护、取舍都会非常让人头疼,特别是对于海量数据、大量离线特征、使用深度学习模型的场景下,如果没有非常方便的特征评估工具,那随意添加的一些不明不白的特征就很容易成为后续模型迭代的巨大包袱。
以信息流推荐场景为例,目标是希望推给用户的内容都是用户喜欢的。怎么去衡量用户是否喜欢呢?我们可以通过用户对推荐的某篇文章或视频的点击、点赞、评论、转发、收藏、浏览播放时长等数据来综合衡量用户对该文章或视频的喜欢程度;还可以通过用户打开APP的次数、用户返回APP的时间间隔、用户一次停留时长等来衡量用户对APP的满意程度,这从某种程度上也可以反应用户对推荐内容的满意程度。
知道了目标,确定了衡量目标的标准,接下来就可以围绕这些标准来做特征了。以点击为例,推荐给用户的文章用户是否愿意点击,肯定跟用户的固有属性、用户的历史行为、用户所处的环境、文章的内容和属性等因素相关。
用户的固有属性包括用户id,性别,年龄,地域,学历,职业,手机品牌型号操作系统,注册时间等
用户的历史行为包括最近阅读的文章、最近有效展示但未阅读的文章、最近的其它对文章的正负反馈行为如点赞、评论、转发、收藏、不喜欢等。
用户所处环境特征包括当前时间、推荐场景、网络类型、当前地域等
文章内容特征包括文章和标题的关键词、实体词、topic、tag、长短等
文章属性特征包括文章一二级分类、文章来源、文章被展示曝光点击点赞分享数量、浏览播放时长、文章热度时效性等
用户固有属性特征
用户的固有属性一般比较固定,检测到有变动的时候进行更新。同时,用户的性别、年龄、学历、职业这些信息属于敏感信息,一般很难获取,用户上传的时候也很可能是虚假信息,所以一般可以通过规则或者模型来辅助完善用户信息。比如男性用户可能对历史军事政治类的文章看的比较多,而女性用户对旅游娱乐美妆等类型文章看得比较多,通过对用户历史行为数据进行分析,可以得到用户的长短期用户画像。包括用户的长期兴趣关键词、短期兴趣关键词、用户一二级分类聚类、用户年龄性别分群。
用户历史行为特征
用户的历史行为特征主要通过分窗口的方式来构建。比如用户上一刷点击过和未点击过的文章,用户上次打开app阅读的文章,用户最近阅读的5篇文章,用户最近一周阅读的文章,用户一个月阅读的文章。这里的文章指各种文章特征,比如id、文章关键词、实体词、一二级分类,点击时长数等,可以根据时间窗口不同而选择不同的文章特征来构建不同的用户行为特征。比如用户最近一个月阅读过的文章的关键词、文章类型按频率排序后取前10,用户最近阅读的5篇文章的顺序id、关键词和类别,用户最近几次交互的时长、pv、主要文章类型等。可以按阅读频率排序、阅读时长排序后截断,也可以取阅读频率或时长最长的,或者标记是否阅读时长很短等等。
环境特征
环境特征一般即时获取,当前时间可以分工作日节假日、早中晚等,推荐场景包括主Feed推荐、相似推荐、当前刷次、翻页动作等、网络类型包括wifi、4G、5G等。
文章特征
文章特征包括文章的基本特征,NLP特征,统计特征,相关特征等等。文章基本特征包括文章的来源,作者等级,一二级分类,文章的时效性,是否热门等;NLP特征包括,文章和标题关键词、实体词,topic等;统计特征包括文章标题的长度,文章的展示点击评论等数量,文章时长,点击展示数据和时长可以计算累计数和平均数等,文章关键词实体词数量等;相关特征包括相关文章的特征,包括展示点击评论情况等。
特征交叉与业务特征
除了这些原始的用户、文章和环境特征,还可以结合业务理解构造一些交叉特征。比如用户关键词与文章关键词的交叉,用户关键词与文章的点展信息交叉,用户聚类与文章一二级分类的交叉,用户历史阅读与当前文章类型的交叉,性别地域手机型号与文章类型的交叉。除了两两交叉,还可以构造三个原始特征之间的交叉,比如性别年龄和文章类型的交叉,三个特征以上的交叉一般就没必要了。构造交叉特征的时候要权衡特征效果和特征大小,比如用户id与文章id交叉这种特征就不可构造(千百亿级别)。交叉的特征一般也需要有一定的解释性,比如性别年龄与文章类型交叉,因为相同性别或年龄的用户可能会阅读相似的文章类型;地域和文章的交叉,有些用户喜欢本地化的内容。
如果推荐的媒体类型比较多,可以分类别构建模型,也可以构建一些能够区分不同媒体类型的特征,比如媒体类型,媒体类型与用户阅读历史的交叉特征等。
为了区分新用户和老用户,可以构造用户注册时间(分段),用户(过去一周,过去一个月)活跃度(根据打开app次数,停留时长等分段)特征,以及他们与文章特征的交叉特征。
为了区分新老文章,可以引入文章的发布时间(分布到当前时间差并分段),文章的累计和最近(比如最近1天,一周)的展示点击阅读时长数量,以及他们与文章关键、文章类型、用户关键词等的交叉特征。
为了区分文章的质量,可以引入文章最近阅读时长,平均阅读时长,点击展示比,完播次数与完播率,点赞转发评论数量等特征。
为了区分用户的阅读习惯,可以引入用户不同时间段(比如早中晚,周日,周末)最近阅读的数量和时长,用户最近阅读的文章的质量等。
可以加入相似用户(通过聚类和检索)的最近阅读文章特征来增强对用户的探索能力;增加相似老文章最近的点展特征来提升新文章的推荐能力;也可以从用户的负反馈来构建特征,比如连续推但是不点击的文章类型,最近推的多却点的少的文章;还可以加入文章推荐后的展示位置及相对广告的位置特征来平衡selection bias;还可以考虑同一刷内前面文章的特征来优化后面文章的选择。
总之,我们可用从多样的维度,如点击、不点击、点赞、不喜欢、评论、转发、收藏、浏览播放时长、通过用户打开APP的次数、用户返回APP的时间间隔、用户一次停留时长等,来全面构建特征,充分挖掘用户可能的兴趣点,实现信息和人更好的匹配,但是特征也不是越多越好,在超大规模的工业应用场景下,特征在精而不在多,可靠、可复用、可解释的特征对于整个推荐系统的持续健康迭代的作用巨大的。
重要特征
用户长短期关键词和文章关键词,及他们的交叉(衡量用户画像与文章匹配情况)
用户最近阅读文章关键词、类别及与当前文章关键词、类别的交叉(衡量用户最近阅读偏好与文章匹配情况)
文章最近的点击展示时长量统计特征(衡量文章的质量与热度)
相似文章的点展时长量统计特征(文章冷启动)
相似用户的最近阅读文章类型、关键词特征(用户冷启动)
用户最近点赞分享评论文章类别、关键词(强正反馈)
用户负反馈及连续推而不点的文章标题、内容关键词(强负反馈)
推荐系统痛点
一是相似文章重复推荐的问题,除了在精排后面增加专门的去重和相似打散的逻辑,在特征上,可以通过加入已排序文章的特征来选择下一篇文章,这个策略借鉴了Listwise推荐模型的思想,可以一定程度上避免刷内重复问题,因为如果一刷内有重复的或者相似的文章,用户一般会选择前面的文章,后面的文章一般就不点开了,基于此我们做了Context-DNN模型,在离线和在线指标上都取得了比较好的收益。
二是推荐文章质量不高的问题,除了增加完播率模型和时长模型,做多目标融合,还增加了能够衡量文章质量的特征,比如分窗口(累积的,最近一周的,今天的)的文章展示、点击、点击率、时长、平均时长、完播率、互动(点赞,分享,收藏)统计量特征。
新用户和新文章冷启动
上面从特征的角度提出了一些解决方法,比如对于新用户,增加相似用户(根据用户基础信息聚类)的历史阅读信息特征,对于新文章,增加相似文章(根据文章关键词、文章类型等)的点击展示等统计量特征;
对于新用户,我们有针对新用户的召回,比如高质量文章召回,有专门针对新用户的模型,比如Mamal模型,比如对新用户样本加权。
对于新文章,有新文章保量处理逻辑。
特征服务器
特征服务器提供特征的实时更新与相关业务调用服务,主要保存有文章的静态特征、动态特征以及用户的静态特征和动态特征。
文章静态特征包括关键词、实体词、一二级类目、文章来源、作者等级、媒体类型等变化不频繁的特征
文章动态特征包括文章的展示、阅读、有效阅读、有效曝光、阅读时长、图集阅读翻页、阅读完成率、评论、评论点赞、分享、收藏、喜欢、阅读进度、不喜欢、手动取消点赞、评论滑动、社区打赏/小视频打赏行为等实时更新的特征
用户静态特征包括可以使用的用户基础信息特征等
用户动态特征包括用户最近阅读文章列表及对文章的动作等实时更新的特征
推荐特征与模型
做机器学习的应该都听说过,特征和数据决定机器学习算法的上限,而模型、算法的选择和优化只是不断地逼近这个上线。从收益的角度来看,做特征、清洗数据的收益一般前期大于模型,且初期收益很大,后期小于模型,但此时想要取得收益本来就已经比较艰难了。做特征和数据清洗的工作比较需要想象力,因为需要不断地思考到底哪些特征有用,也比较考验耐力,因为需要不断排除掉到底哪些特征没用。DNN等复杂模型的出现一定程度上减轻了特征工程的复杂性,但是,如果想要DNN跑的好,特征工程能力还是不能少。一个好的算法工程师,肯定对业务逻辑、特征构建、数据清洗、模型训练、工程上线等全流程环节都有较好理解。
由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:
(1)点击页面最上方"AINLP",进入公众号主页。
(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。
感谢支持,比心。
推荐阅读
征稿启示| 200元稿费+5000DBC(价值20个小时GPU算力)
完结撒花!李宏毅老师深度学习与人类语言处理课程视频及课件(附下载)
模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法
文本自动摘要任务的“不完全”心得总结番外篇——submodular函数优化
斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用
关于AINLP
AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。
阅读至此了,分享、点赞、在看三选一吧🙏