其他
深度|万字长文:如何从 0 到 1 构建个性化推荐?
导语
本篇共7000+文字,以58招聘为例,图文并茂,理论和实践相结合,系统详细地阐述了“如何从 0 到 1 构建个性化推荐?”这一课题,建议技术、产品、运营同学认真阅读,定会受益匪浅。
+58585858个推荐!
招聘业务介绍 个性化推荐实践 心得分享与规划
招聘业务介绍
基于求职偏好搜索职位并点击查看详情。 投递有意向职位,或通过平台在线微聊工具、电话与招聘方做进一步沟通。 双方达成共识后,进行面试与入职。
App 首页招聘大类页:主要包括职位专区聚合、职位 Feed 流。 类目推荐: 用户点击某个类目后,进行相关职位推荐。 相似推荐: 用户点击某个具体职位后,在下方展现相似职位。
海量数据计算:大多数公司都存在,此处不做详细说明。 冷启动问题: 58同城服务于多业务,包括招聘、房产、黄页、二手等,求职者进入招聘板块使用招聘功能,由于当前不强制用户填写简历,导致无简历用户冷启动问题。 稀疏性&实时性:58招聘的一部分群体为蓝领用户,他们在平台产生的行为是短时间的、连续的以及稀疏的,可能活跃两天找到工作后就不再活跃。其次,有些用户回到平台,求职意愿可能会发生变化,一部分可能想找别的工作(如之前是服务员,现在想找快递),另一部分可能是因为传统职业存在职位进阶的过程,这些都需要系统思考。 资源分配问题:第一,如何有效识别(企业,求职者)的真实意图,进而合理分配资源产生有效连接,针对不良意图进行差异化对待。第二,招聘对于 C 端和 B 端都是有限的资源,招聘方招聘职位有限,求职者与招聘方交互有限,很大程度上不同于淘宝推荐,因为后者的商品是无限供应的。
招聘个性化推荐实现
暴露联系方式 内容不成句 高薪诱惑 在平台很“活跃”
传统的关键词+正则识别方法,如针对"微信"、"QQ"这类联系方式的相关关键词等。 针对变形联系方式,基于拼音+滑动窗口进行识别。 采用命名实体 NER 识别进行挖掘,如 BiLSTM+CRF。 采用相关分类算法进行识别,如 fastText,CNN。
举一反三:问题用户识别是典型的对抗场景,策略构建时需要更多思考对抗能力的刻画,将一些强对抗能力的特征加入到模型中(如文字变形、文字转拼音)。 刚柔并济:差异化惩处不同问题类型的用户。对平台其他用户伤害巨大的群体,结合法律手段严厉惩处;处于问题边界的,则主要通过较柔和的方式处理(如内容展示降权),减少剧烈对抗现象的产生。
第一阶段:基于平台已有的部分结构化实体词,以及不少半结构化组织的职位描述基础,我们采用 bootstrap 方法,快速迭代进行挖掘,并结合半人工标注,为深度学习构建更完整的样本数据集。 第二阶段:将第一阶段的内容作为 input,核心采用 BiLSTM+CRF 构建实体识别深度网络,有两个优化点取得了较好效果。第一个是输入层基于字到词的优化,构建招聘领域的专有词库。第二个是采用训练样本增强技术,将相近实体词和同类实体词进行替换扩大样本集,并将模型识别的结果有选择的放回训练集重新进行迭代训练,减弱对标注数据集的依赖。目前命名实体识别仍在不断优化,识别准确率平均达到0.75+,部分准确率可达到0.9+。
基于统计规则:通过窗口形式,近实时对用户画像进行计算更新,计算时加入时间衰减因子、行为权重因子及标签置信度权重。深刻理解业务场景,进行合理数学设计是关键。如信息列表页的点击数据,在使用时要差异化处理列表页直接展示的显性标签及隐藏在详情页的兴趣标签,避免人为引入噪音。 基于传统分类预测:采用分类算法,应用到用户属性填充、异常用户/行为识别及用户分类多个方面。并非所有的求职用户都会留下较详尽的简历,我们借助历史的招聘简历与用户行为组织样本,可有效预测性别、年龄段、期望工作岗位等用户信息,优化简历缺失或不完善的冷启动问题。同时,针对用户行为的聚焦情况,通过模型能够有效识别出一些异常数据、识别求职目的明确型及发散型两类求职用户,进而剔除掉部分噪音数据提高样本精度,对不同用户定制差异化策略,提升推荐整体刻画能力。 基于行为序列预测:借助统计规则及传统分类,基本建设出一个可用画像,但对用户多个行为之间的信息捕获有限。我们将用户搜索浏览、简历投递、在线沟通等行为组织成行为事件序列,采用 LSTM、GRU、Attention 等训练模型预测用户兴趣,当前还在探索评估阶段。
协同过滤虽然取得了不错的业务收益,但其依赖于用户与物品的行为矩阵,对于行为稀疏的场景天然表达有限。而恰好,58招聘业务的流量构成中,有一部分是三四五线城市,城市越下沉数据稀疏的情况也越凸显。针对这类问题,我们希望进一步挖掘行为数据的信息,很自然的想到基于深度学习的向量化 Embedding 召回。我们核心参考了 Youtube 的 DNN 召回思想,基于业务现状做了调整优化。 职位向量化:我们将求职者对职位的行为序列看作一系列上下文,利用 word2vector 思想进行向量化表达。Input 部分,包括职位特征、职位所属的企业特征和求职者反馈特征。Output 构建,业务漏斗越深的行为选择的窗口越大,并基于用户平均的行为长度作为窗口设定的参考值。针对无历史用户行为的新职位,使用职位的文本结构化信息,通过历史训练所得的标签向量表达经过 average-pooling 作为初始向量,解决冷启动。 用户向量化:构建一个多分类 NN 网络,Embedding 层将用户发生行为的职位向量化直接迁移过来使用,输入用户的简历及画像信息进行向量训练。最上层理想情况是一个极限分类,以用户真实发生行为的数据作为正样本,未发生行为的数据作为负样本,构建损失函数进行最优化训练。58招聘场景有千万级别的职位,极限分类需要巨大的计算消耗,当前资源无法满足。因此在负样本选择上,我们使用降采样机制,随机从求职者关注的城市及岗位下未发生行为的职位中按一定比例抽取负样本。线上会实时的采集用户行为,以窗口形式对用户向量进行更新。 线上服务:借鉴 Facebook 的 FAISS 实现,线上用户发起请求时,通过求职者的向量表达,去获取与其最相似的 TopN 职位,返回给推荐系统。
样本处理:围绕减少样本噪音,我们开展了多个优化。去除异常用户及异常数据,包括非招聘意图的用户数据、误点击数据;增加真实曝光及停留时长埋点,去除用户下拉信息流过程中非真正看见的数据,将停留时长作为样本置信权重加入到模型训练中;基于求职者维度进行采样,去除对同一职位多次正负样本的矛盾可能。 特征工程:关注及监测特征显隐性的变化,尤其是信息列表展示样式的产品调整,需及时进行特征调整及模型迭代。58招聘业务的特殊性,实时类特征很重要,需要关注特征一致性方面的保障机制,避免发生特征穿越现象或线上线下特征不一致问题。 模型:重视模型认知,并不是简单的关注离线 AUC 或者线上转化率 AB 对比,在特征表达上多些分析,迭代过程中重视前后模型的特征比较,能够有效提高模型实验迭代的有效性。
招聘关系到个人生计及国家民生,是件极为严肃的事情,内容质量是基础保障。但连接预估模型无法有效刻画质量问题,存在一些职位连接效率很不错但属于问题职位,因此推荐系统需要增加质量相关的因子。 转化率高不等同于双边匹配。线上招聘,无法很好追踪到面试及入职环节,求职者与招聘方形成的双边连接,可能是出于其他原因(如对自己或对方的错误判断)。因此,系统需要考虑匹配方面的控制。 资源浪费问题,对于绝大部分用户,求职及招聘都是周期性行为,一个已经招满人的职位可能依然在线上展示。系统还需要增加职位活跃度或周期方面的刻画,减少相应的资源浪费。
心得分享及规划
多任务学习、强化学习等的全面探索落地。
集公司内外资源,丰富招聘数据源,提高用户画像的覆盖率,更好的支持千人千面。
END
上次推送活动奖品发给谁了?
就是那位留言“50元京东卡非我莫属”的同学!!!
今天再做个活动,奖励升级吧!
转发至朋友圈并点击“在看”并留言且留言点赞数需≥66的第一名(截止至11/16日14:00)即可获得100元京东购物卡怎么样?
妥,落实吧!