您当前的位置:首页 > 电脑百科 > 程序开发 > 算法

从零搭建推荐系统—算法篇

时间:2021-04-27 10:49:50  来源:今日头条  作者:大数据推荐杂谈

推荐系统自诞生之日起就是为解决海量物料如何高效分发给海量用户,一套高效的算法流程就是推荐系统的核心。如今火热的各类机器学习、深度学习、强化学习等都可以在推荐系统中大显身手,推荐也是AI在工业界最广泛的落地场景之一。推荐算法在推荐系统中的位置如图1所示,主要是通过离线或在线拿到特征及样本数据训练模型,将训练好的模型同步给召回或排序的预测服务,推荐引擎实时调用预测结果供召回及排序使用。

从零搭建推荐系统—算法篇

 

推荐算法在推荐系统中地位

如果更宽泛意义上,推荐内容的质量、类别、理解等都可通过各自AI算法计算,节省大量人工成本,通过NLP、音频、视频、图像理解等领域内的先进算法,丰富物料的正排信息进入资源池,如物料质量、物料类别、关键词提取,图像视频理解、音频转文本、物料属性的embedding向量等等。

从零搭建推荐系统—算法篇

 

各领域算法对用户与物料信息的丰富

推荐效果主要以提升ctr为目标,但转化率、完播率、停留时长等均可作为辅助指标,可以说只要能够抽象出问题并描述出要最优化的损失函数,有较丰富的特征及样本,那就一定能够用算法来解决问题。这里我们先以精排阶段的算法为例说明如何构建起完整的排序算法通路。

特征库/服务

算法需要数据,数据需要特征,特征是模型训练数据中最重要的部分,各类算法的本质也是根据现有样本分布拟合出一个最接近真实情况的概率分布函数,需要拟合的参数就是各个特征,通过这个函数即可获取特定用户或物料的特征下用户对物料的感兴趣程度(点击的概率),因此特征工程也是推荐算法工程师的必备技能,人工智能圈广为人知的调侃“人工智能靠人工”,在推荐领域的重要体现就在于通过分析数据来获取重要特征。

推荐系统连接的是人与物,特别是独特业务场景下的人与物,那么一定也会有独特的物料属性特征与用户行为特征,针对深入理解业务的基础上构造好的特征,那推荐算法出来的结果也就成功了一半以上。从人和物的角度,特征也分为物料特征、用户特征及上下文特征,上下文也可算作用户特征的一种。用户特征一般通过明确记录或统计挖掘得到,如用户的地理位置、访问时段、使用设备、性别年龄(可能通过填写资料获取)一般在访问时即可拿到;挖掘特征通过历史用户的操作行为,统计用户的画像偏好。物料特征一般是物料自身属性及其统计数据,例如类别、关键词、主题等固有属性,以及历史一段时间窗口内的效果统计如曝光、点击、点赞、转发等。从直观含义看可分为类别特征和数值型特征,对不同特征也要多种特征工程处理方式,这里推荐一份slide讲解特征工程,很香!原始出处要翻墙,为方便大家直接搬运了。

特征工程是一项实践性很强的工作,基本的技术方法就那么几种,但真正用来调好模型的特征工程方法一般网上也很少,原因之一就在于是跟自己公司具体业务挂钩的,不具有普遍性,即使放出来也只适用于自己公司业务,无法放之四海而皆准,可以看下各大厂主要产品线的推荐系统特征工程是如何做的。

这里用户特征,包括上下文特征,可以根据用户离线的行为日志统计,类似用户画像,假设此时用户属性类别、各维度偏好、对各行为的统计量等都已用特征工程处理完毕并结构化存入hive表,同理对物料在资源池获取属性类别特征,通过客户端日志获取物料各维度统计类信息,保存至hive表,再通过一个定时任务将hive内的特征数据整合,这样将离线计算的用户及物料维度特征保存至hive表,同时更新至redis供线上实时获取。

从零搭建推荐系统—算法篇

 

特征构建

有了特征就能方便地构建出模型训练样本数据,这时要针对推荐效果指标来构建样本,对于ctr指标来说一般是分类问题,使用用户对物料是否点击作为label,对于视频类播放时长指标一般可作为回归问题,用户对物料的播放时长作为样本y值,这里以ctr作为评价指标,正样本为用户点击物料,负样本为用户曝光未点击物料。

训练数据

说到算法并无太多神秘之处,如果了解基础的机器学习原理,各类算法只是针对大量样本数据的一个拟合过程,拟合出一个接近真实数据分布的概率分布函数,即所谓的“规律”,大量的样本正是这条规律的基础,算法只是用数学的方式来求解。通过用户行为日志可获取全量用户曝光点击物料信息,通过用户及物料特征库抽取特征,从而构建出样本矩阵,通过离线计算保存到样本文件。

接下来需要对整个样本集做处理,否则会引入大量噪声,不能让模型很好的拟合出样本分布。

非真实用户访问样本

例如爬虫、机器人等大量非真实用户的频繁访问,带来大量高曝光未点击行为,会严重影响样本数据分布,一段时间窗口有大量相同用户id频繁访问远超正常访问量的均值等,刷次数方差较大的数据需要去除

极少行为用户样本

这类用户样本虽然是真实行为,但极少的行为并不能为其在模型中找到属于该类用户的“规律”,或者说引入这些数据后,模型会开始学习这类用户的数据分布,对整体分布的拟合带来噪声,易引起模型过拟合。通常对这类用户可以看做类似新用户,通过用户冷启动的手段为其探索兴趣补充推荐。

特征缺失值及异常值等处理

这里参考特征工程处理方法,针对方差较大的少量异常值做抛弃或均值处理,缺失值用均值或中值代替等

正负样本处理

机器学习中正负样本的选取也直接关系着训练出的模型效果,在推荐系统中不同公司也有针对自家业务采取的样本划分方法。

  • 一次请求会产生N条推荐结果,但大部分手机端通常用户只能看到其中的m条,m<N,通过客户端埋点计算出用户真实可见曝光的物料,在这批物料中选取点击与未点击样本直观上一次曝光中可能有点击或无点击
  • 早期yutube推荐中,会对所有用户选取相同数量训练样本,可以同时避免低活跃用户和高活跃用户对整体模型的影响,使训练的模型更符合绝大多数用户行为
  • 对于有曝光无点击行为的用户,其曝光未点击的负样本可随机选取,这样可以学到这类用户“不感兴趣”的部分
  • 样本在通过定时任务整合时需要做shuffle打散,避免同类用户样本数据扎堆引起数据分布偏差,在训练模型时,也通过batch训练方式中每个batch的样本也进行shuffle打散

总之正负样本处理还是要根据深入理解业务和用户行为基础上进行调整,可以让模型学习到更适合的效果。

生成样本数据后,将样本随机分成训练集与测试集,一般为七三开或八二开,丢给模型来训练了

模型训练

首次搭建排序模型可以先用基础模型如LR或GBDT跑出一个baseline快速上线,后续逐步迭代为复杂模型。推荐算法模型一般经历了由简入繁的过程,数据量不断增大,模型不断复杂,大规模数据集下深度学习模型已经逐渐成为主流,但这也是行业头部公司所独享,只有他们才有足够的数据和算力来支撑庞大复杂的模型,绝大多数公司在中等数据集下,仍然使用主流的线性模型,通过分析用户行为及数据,构建特征工程及样本数据优化,得来的效果要比深度学习模型更好。

从零搭建推荐系统—算法篇

 

模型训练过程根据使用的框架不同,大体流程可以统一成下面的伪代码

# 从文件读入训练集与测试集 
train_data = read(TRAIN_DATA_FILE) 
test_data = read(TEST_DATA_FILE) 
# 对数据处理并生成样本与特征数据结构 
y_train, x_train = preprocess(train_data) 
y_test, x_test = preprocess(test_data) 
# 实例化模型,传入参数 
# 对经典模型各主流框架中只需传入参数,若需对模型结构调整需要自己实现模型结构 
model = SomeModel(y_train, x_train, y_test, x_test, batchsize, optimizer, learning_rate, other_param...) 
# 开始训练 
model.fit() 
# 评估模型效果 
model.evaluate() 

通过优化训练数据、优化模型超参等方法训练得到AUC指标较好的模型,可提供给线上应用。模型训练可根据数据量和计算复杂度离线按天或小时定时训练更新。

线上预测

通常线上使用预测服务的形式实时提供模型推断功能,这时需要通过推荐引擎接口将待排序候选集的物料id、用户id以及请求上下文信息传给预测服务。预测服务中也分为特征抽取、物料打分排序、模型同步校验等模块。通过传入的物料id及用户id,可以从特征库中在线抽取特征,结合上下文特征得到所有候选集的特征信息,进而通过模型中各特征权重,计算每个物料的打分。这个过程中注意被抽取的特征id要同训练好模型中的特征权重id保持一致,同时各物料特征抽取和打分过程可以通过并行化方式提升系统性能。训练好的模型由离线训练流程定时同步到线上预测服务机器,注意同步时需要同时把模型的checksum一并同步并在服务端进行校验,当同步失败时仍使用缓存的上次同步模型进行预测,避免数据不一致。候选集物料被打分后进行整体排序,结果返回给推荐引擎。

从零搭建推荐系统—算法篇

 

预测服务

到此通过算法模型给出个性化排序的流程就打通了。关于模型打分步骤对于基于DNN的模型TensorFlow有专门tf.server用于部署生产环境的模型预测服务,TensorFlow也有为服务端语言golang/JAVA/C++等专门适配

对于传统机器学习模型LR、GBDT等,可以将模型特征id及权重直接序列化为文件,在排序服务端定时加载解析,打分预测时直接使用特征id及其权重值运算即可。

番外

推荐系统算法侧主流程架构大体就是这样,已经可以跑通一个基本模型并应用于线上观察效果。后续算法侧的迭代优化,一方面可以跟进业界前沿的模型方法,一方面通过分析用户行为与业务数据来尝试在特征和样本数据层面做优化,而后者可能才是产生更直接收益的法宝,毕竟不是所有公司都能有google阿里家那种量级的用户数据,复杂模型应用起来因为过拟合的问题甚至带来负向效果。反过来说大厂在模型上的创新也是基于不断分析累积用户行为的经验得来,比如yutube关于视频推荐的论文:
https://zhuanlan.zhihu.com/p/82584437

也是分析用户点击一个视频不一定是很喜欢,而可能和正好排在前面有关,从而设计模型结构将排序位置特征引入模型,通过多目标学习将这种实际样本“有偏”的影响消除。



Tags:推荐系统   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
2021 年,字节跳动旗下产品总 MAU 已超过 19 亿。在以抖音、今日头条、西瓜视频等为代表的产品业务背景下,强大的推荐系统显得尤为重要。Flink 提供了非常强大的 SQL 模块和有状态计算模块。目前在字节推荐场景,实时简单...【详细内容】
2021-10-25  Tags: 推荐系统  点击:(29)  评论:(0)  加入收藏
今天,要和大家推荐一个Go 编写的开源推荐系统&mdash;&mdash;Gorse。 Gorse 旨在成为一个通用的开源推荐系统,可以快速引入各种在线服务。通过将商品、用户和交互数据导入 Gors...【详细内容】
2021-08-02  Tags: 推荐系统  点击:(104)  评论:(0)  加入收藏
Hello,大家好,欢迎来到“自由技艺”的知识小馆,今天我们来聊一聊推荐算法。在广告、电商、信息流分发等业务场景中,推荐算法发挥着至关重要的作用,好的推荐算法能够把用户牢牢抓...【详细内容】
2021-06-08  Tags: 推荐系统  点击:(135)  评论:(0)  加入收藏
推荐系统自诞生之日起就是为解决海量物料如何高效分发给海量用户,一套高效的算法流程就是推荐系统的核心。如今火热的各类机器学习、深度学习、强化学习等都可以在推荐系统中...【详细内容】
2021-04-27  Tags: 推荐系统  点击:(250)  评论:(0)  加入收藏
推荐系统是一种信息过滤技术,通过从用户行为中挖掘用户兴趣偏好,为用户提供个性化的信息,减少用户的找寻时间,降低用户的决策成本,让用户更加被动地消费信息。推荐系统是随着互...【详细内容】
2021-04-09  Tags: 推荐系统  点击:(319)  评论:(0)  加入收藏
有幸参与了几个业务推荐系统搭建的全流程,本文将从实际经验出发,为大家解构如何从从零搭建推荐系统,希望跟大家能够相互交流,如有错误之处烦请指正。...【详细内容】
2020-09-30  Tags: 推荐系统  点击:(67)  评论:(0)  加入收藏
电影推荐系统 demo 界面推荐系统[1](Recommender System,RS)能够根据用户的偏好主动为用户推荐商品或项目。它通过用户的历史数据来发掘用户兴趣偏好,从而将用户可能感兴趣的物...【详细内容】
2020-09-18  Tags: 推荐系统  点击:(127)  评论:(0)  加入收藏
推荐系统介绍自从1992年施乐的科学家为了解决信息负载的问题,第一次提出协同过滤算法,个性化推荐已经经过了二十几年的发展。1998年,林登和他的同事申请了“item-to-item”协同...【详细内容】
2020-09-15  Tags: 推荐系统  点击:(177)  评论:(0)  加入收藏
在数字化革命和AI赋能的大背景下,推荐场景逻辑越来越复杂,推荐细分场景越来越丰富,对业务迭代和效果优化的效率有了更高的要求。推荐系统业务和技术在传统架构支撑下自然堆砌,变...【详细内容】
2020-09-07  Tags: 推荐系统  点击:(85)  评论:(0)  加入收藏
用户画像往往是大型网站的重要模块,基于用户画像不仅可以实现个性化推荐,还可以实现用户分群、精准推送、精准营销以及用户行为预测、商业化转化分析等,为商业决策提供数据支持...【详细内容】
2020-09-02  Tags: 推荐系统  点击:(121)  评论:(0)  加入收藏
▌简易百科推荐
前言Kafka 中有很多延时操作,比如对于耗时的网络请求(比如 Produce 是等待 ISR 副本复制成功)会被封装成 DelayOperation 进行延迟处理操作,防止阻塞 Kafka请求处理线程。Kafka...【详细内容】
2021-12-27  Java技术那些事    Tags:时间轮   点击:(1)  评论:(0)  加入收藏
博雯 发自 凹非寺量子位 报道 | 公众号 QbitAI在炼丹过程中,为了减少训练所需资源,MLer有时会将大型复杂的大模型“蒸馏”为较小的模型,同时还要保证与压缩前相当的结果。这就...【详细内容】
2021-12-24  量子位    Tags:蒸馏法   点击:(9)  评论:(0)  加入收藏
分稀疏重建和稠密重建两类:稀疏重建:使用RGB相机SLAMOrb-slam,Orb-slam2,orb-slam3:工程地址在: http://webdiis.unizar.es/~raulmur/orbslam/ DSO(Direct Sparse Odometry)因为...【详细内容】
2021-12-23  老师明明可以靠颜值    Tags:算法   点击:(7)  评论:(0)  加入收藏
1. 基本概念希尔排序又叫递减增量排序算法,它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的;希尔排序是一种不稳定的排序算法...【详细内容】
2021-12-22  青石野草    Tags:希尔排序   点击:(6)  评论:(0)  加入收藏
ROP是一种技巧,我们对execve函数进行拼凑来进行system /bin/sh。栈迁移的特征是溢出0x10个字符,在本次getshell中,还碰到了如何利用printf函数来进行canary的泄露。ROP+栈迁移...【详细内容】
2021-12-15  星云博创    Tags:栈迁移   点击:(19)  评论:(0)  加入收藏
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15    晓掌柜丶韶华  Tags:排序算法   点击:(16)  评论:(0)  加入收藏
在了解golang的map之前,我们需要了解哈希这个概念。哈希表,又称散列表(Hash table),是根据键(key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算出一个键值的函数,将...【详细内容】
2021-12-07  一棵梧桐木    Tags:哈希表   点击:(13)  评论:(0)  加入收藏
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯&middot;奈特称,一般的雪花大约由10^19个水分子...【详细内容】
2021-11-17  小心程序猿QAQ    Tags:雪花算法   点击:(24)  评论:(0)  加入收藏
导读:在大数据时代,对复杂数据结构中的各数据项进行有效的排序和查找的能力非常重要,因为很多现代算法都需要用到它。在为数据恰当选择排序和查找策略时,需要根据数据的规模和类型进行判断。尽管不同策略最终得到的结果完...【详细内容】
2021-11-04  华章科技    Tags:排序算法   点击:(37)  评论:(0)  加入收藏
这是我在网上找的资源的一个总结,会先给出一个我看了觉得还行的关于算法的讲解,再配上实现的代码: Original author: Bill_Hoo Original Address: http://blog.sina.com.cn/s/bl...【详细内容】
2021-11-04  有AI野心的电工和码农    Tags: KMP算法   点击:(36)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条