阅读指引:
为方便用户快捷体验PAI-Rec产品,本文提供了一份公开数据集,用户可按照文档说明按步骤体验PAI-Rec推荐算法定制的特征工程、召回、精排等关键功能的配置,生成代码并部署到DataWorks相应的业务流程中。
1. 克隆公开数据集
我们在可公开访问的项目pai_online_project中提前准备了推荐算法中常用的三张表:
用户表:pai_online_project.rec_sln_demo_user_table
物品表:pai_online_project.rec_sln_demo_item_table
行为表:pai_online_project.rec_sln_demo_behavior_table
本文后续的操作均基于上表操作。注意以上三个表是随机生成的模拟数据,没有真实业务含义,因此训练得到的AUC等指标很低。
首先,您需要从pai_online_project项目中将数据同步到您的DataWorks项目(假设叫DataWorks_a)下,在DataWorks的项目DataWorks_a中执行下面的代码,先创建表schema,再同步2023年1月1日到2023年2月16日之间的数据。
CREATE TABLE IF NOT EXISTS rec_sln_demo_user_table_v1(
user_id BIGINT COMMENT '用户唯一ID',
gender STRING COMMENT '性别',
age BIGINT COMMENT '年龄',
city STRING COMMENT '城市',
item_cnt BIGINT COMMENT '创作内容数',
follow_cnt BIGINT COMMENT '关注数',
follower_cnt BIGINT COMMENT '粉丝数',
register_time BIGINT COMMENT '注册时间',
tags STRING COMMENT '用户标签'
) PARTITIONED BY (ds STRING) STORED AS ALIORC;
INSERT OVERWRITE TABLE rec_sln_demo_user_table_v1 PARTITION(ds)
SELECT *
FROM pai_online_project.rec_sln_demo_user_table
WHERE ds > "20221231" and ds < "20230217";
CREATE TABLE IF NOT EXISTS rec_sln_demo_item_table_v1(
item_id BIGINT COMMENT '内容ID',
duration DOUBLE COMMENT '视频时长',
title STRING COMMENT '标题',
category STRING COMMENT '一级标签',
author BIGINT COMMENT '作者',
click_count BIGINT COMMENT '累计点击数',
praise_count BIGINT COMMENT '累计点赞数',
pub_time BIGINT COMMENT '发布时间'
) PARTITIONED BY (ds STRING) STORED AS ALIORC;
INSERT OVERWRITE TABLE rec_sln_demo_item_table_v1 PARTITION(ds)
SELECT *
FROM pai_online_project.rec_sln_demo_item_table
WHERE ds > "20221231" and ds < "20230217";
CREATE TABLE IF NOT EXISTS rec_sln_demo_behavior_table_v1(
request_id STRING COMMENT '埋点ID/请求ID',
user_id STRING COMMENT '用户唯一ID',
exp_id STRING COMMENT '实验ID',
page STRING COMMENT '页面',
net_type STRING COMMENT '网络型号',
event_time BIGINT COMMENT '行为时间',
item_id STRING COMMENT '内容ID',
event STRING COMMENT '行为类型',
playtime DOUBLE COMMENT '播放时长/阅读时长'
) PARTITIONED BY (ds STRING) STORED AS ALIORC;
INSERT OVERWRITE TABLE rec_sln_demo_behavior_table_v1 PARTITION(ds)
SELECT *
FROM pai_online_project.rec_sln_demo_behavior_table
WHERE ds > "20221231" and ds < "20230217";
为了后面能产出代码,并部署成功,请先在用户的DataWorks_a项目中,添加3个sql代码结点,设置调度依赖是工作空间根节点,设置完成之后再发布。三个代码结点名称是:
rec_sln_demo_user_table_v1
rec_sln_demo_item_table_v1
rec_sln_demo_behavior_table_v1
其中代码内容可以为空,或者“select 1;”。发布好3个结点之后,后面的代码才能顺利部署起来。
2. 开通PAI-Rec
为了体验试用推荐算法定制的产品,请先开通PAI-Rec的产品(开通页面),选择含有推荐算法定制的高级版。也可以从试用产品中找到“推荐全链路深度定制开发平台”,用企业主账号点击“立即试用”再领用开通,领用成功可免费试用一个月。开通中遇到问题可联系钉钉群:37930014162。
服务初始化和权限设置需要主账号登录操作,具体参考文档:服务初始化
引擎配置选型:我们在本文档中选择了Hologres作为召回存储。请注意:创建Hologres实例请参考购买Hologres的文档;已开通hologres实例,创建自定义用户和数据库请参考用户管理和创建数据库。然后在DataWorks中创建hologres数据源,参考创建Hologres数据源。
3. 创建场景
在配置推荐任务之前需要先创建一个推荐场景。推荐场景的基本概念、流量编码含义参考基本概念。
创建推荐场景的页面如下:
4. 数据注册
为了后续在推荐方案定制功能中配置特征工程、召回、排序算法,需要先注册您同步到DataWorks_a项目中的三张表:
新增数据表,分别注册表rec_sln_demo_user_table_v1、rec_sln_demo_item_table_v1、rec_sln_demo_behavior_table_v1,其中MaxCompute项目选择您启用的项目空间。
请确保当前登录账号具备对MaxCompute该项目的操作权限(如无权限,请联系主账号前往MaxCompute对应的项目添加子账号权限)。然后,执行如下操作:
5. 创建方案和设置环境变量
我们在HomePage场景下,创建一个 pairec_testdemo_v1 的推荐方案。
图5.1 创建推荐方案
在测试阶段使用共享集群 Hologres 的用户,均可根据本文引导体验 PAI-Rec 推荐算法定制的最佳实践。
方案下需要选择一系列的参数:
DataWorks的工作空间和业务流程作为部署代码的目标地址
业务流程名称:指的是部署到DataWorks的数据开发IDE中左侧目录的业务流程名称。
slim_mode:在不使用一键部署时选择这个参数;选择是,会控制用于手动部署的DataWorks迁移助手zip包在30M以内;超出30M的部分,如:fg*.jar(*表示省略了其中的版本等信息)等需用户从OSS中手动下载上传到DataWorks中;选择否,则迁移助手zip包会包含fg*.jar包。
OSS Bucket:表示输出代码zip的路径,也是后面保存训练配置文件、checkpoint文件、模型导出的OSS Bucket路径。
在线数据源:在“引擎配置”页面设置的引擎名称,用于存储在线特征数据。即前面设置的Hologres及其表名。
PAI-EAS资源组:表示部署模型的资源名称,不选择则默认使用PAI-EAS的公共资源组。
FeatureStore:我们已经上线了特征平台(PAI-FeatureStore),但是本最佳实践中暂时不用特征平台。
如您想体验特征平台,可根据上述文档开通特征平台,并在特征平台下创建项目、用户和物品相关的实体。
图5.2 环境配置详情
如图5.2对环境配置完成后,点击保存并进入算法方案配置。
6. 方案配置
下面的方案配置较为全面,如果只是体验配置部署的过程,因此在召回配置中只配置了全局热门召回与 eTao RECommender(eTREC) u2i召回,在排序配置中选择了精排。
如果您需要完整配置一个真实场景,建议配置的召回和精排如下:
全局热门召回:日志数据中,全面热门数据的统计排名取top k。
全局热门兜底召回:用Redis作为兜底,防止推荐接口下发数据为空。
分组热门召回:按照城市、性别区间等指标来分类召回,这对提高热门物品的准确性有帮助。
etrec u2i召回:基于etrec协同过滤算法。
swing u2i召回:基于Swing算法。
冷启动召回:dropoutnet算法的冷启动召回
精排:单目标可以选择MultiTower排序;多目标可选择DBMTL排序。
一般当召回比较全面之后再开启向量召回或者PDN召回等算法。向量召回需要配合向量召回引擎,其中Hologres支持向量召回。
6.1. 数据表配置
配置行为日志表、用户表、物品表,并设置相应的分区、事件、特征、时间戳等字段。
6.1.1. 行为日志表
在对行为日志表配置中,需要结合具体的数据情况,例如本文使用的行为日志表信息包含请求 ID、用户唯一标识、行为发生的页面、行为时间、行为类型等信息。如果行为日志表中有更多的数据信息,建议将信息以用户与物品分类后,配置到行为信息的用户侧或物品侧。这里是注册字段的各种类型,方便后面特征工程使用。
参数说明:
请求ID:日志中标记每次推荐请求的ID,一般是程序生成的UUID。
行为事件:指日志中记录行为事件的字段。
行为事件枚举值:表示我们需要的事件取值,一般包含曝光(expr、expose)、点击(click)、购买(buy)、点赞(praise)等。
行为的值:某些行为如购买金额、停留时长值,play_time可以用于回归目标的训练。
行为场景:表示日志发生的场景字段,如首页,搜索页,或者是商品详情页,在本文行为表中page字段为场景字段。
场景枚举值:如果填写了是指使用哪些场景的数据,在本文行为表中page字段的值只有两种为home、detail,在后面特征工程中可以分场景统计特征。
图6.1 行为日志表配置详情
在用户信息配置中,类目特征和数值特征要根据用户特征的具体情况来填写。对于类目特征,后面会作为深度学习模型的ID特征;对于数值特征,后面会离散化分桶后作为深度学习模型的ID特征。
用户tag特征:主要是针对用分隔符(示例中用“|”)区分的多值特征,如用户关注的用户ID列表(follow_users)、用户喜欢的类目列表。
用户侧kv类特征:如 kv_cate_click_cnt(该用户在物品各类目下的点击数),其中key是cate,key_side是USER,格式为 'cate1:1\x1dcate2:2'。其中\x1d是不可见的chr(29)字符。
完成对行为日志表的配置后,用户表和物品表中的字段配置与行为日志表中的配置类似。
6.1.2. 用户表
图6.2 用户表配置详情
6.1.3. 物品表
图6.3 物品表配置详情
6.2. 特征配置
以下将对用户、物品、行为侧的衍生特征进行具体配置。
6.2.1. 常用周期行为类型配置
图6.4 特征生成通用配置
为了避免生成过多的特征,一般配置统计时间周期不宜过多。配置参数“3”天,是为了统计用户和物品在最近3天的曝光、点击、点赞相关的特征;配置参数“15”天,是为获取用户或物品在半个月内的统计特征;具体可以根据业务情况设置参数,如果用户行为数量很少,可尝试设置“21”天。在重点关注行为的选择上,我们选择基础的expr(曝光)、click(点击),praise(点赞),建议添加次序为“曝光,点击,点赞”,此处下拉菜单显示的来源为数据表配置中的行为日志已经配置好的行为事件枚举值,如需增加可回到上一步。
如图6.4配置完成后,点击【生成特征】自动在用户和物品侧衍生出多种统计特征,接下来进行对衍生特征的二次编辑。以下提供了具体的特征配置参考,具体的参数含义说明请参考特征工程。
6.2.2. 用户侧——特征配置
基础属性特征
设置特征版本后,您可手动点击添加并选择分类,编辑计算逻辑。完成后右上角保存即可生效。
图6.5 基础属性特征配置详情
在自动生成的衍生特征的基础上,能够增加更多分类的自定义特征。对于行为偏好统计特征的参数具体解释,详情参见参数解释。
如上图6.5配置中,我们增加了对age字段的分段加工,将age字段根据填写的分割点进行分割,并转化为类目特征;特征组合表示多种类目字段的组合,可选择的关联字段仅属于当前表内的字段。我们将gender字段与对应的年龄群类目字段组合,构成一个新的衍生特征。
行为偏好特征
图6.6行为偏好特征配置详情
图6.6.1 Top 类目与数值组合特征计算
在行为偏好统计特征配置中,我们增加了Top类目与数值组合特征计算。其含义表示为在指定场景下的自定义周期内的不同行为下,根据计算逻辑包括总和、最大值等,计算用户在选定类目特征下对某个数值的偏好情况。对于行为偏好统计特征的参数具体解释详情参见参数解释。
在上文图6.6.1的配置之后,我们可以组合得到多个特征,我们选择其中3天、组合特征是category,click_cnt,计算逻辑是总和,截断数量是100的含义是指:统计每个用户在3天内,在每个category类目取值下的click_cnt次数汇总,如“体育”类目下点击3次,“音乐”类目下点击10次,最多统计100个类目。
序列特征
图6.7 序列特征配置详情
我们在序列特征中,配置了基于曝光事件的衍生序列特征,对于序列特征的参数具体解释详情参见参数解释。在上文图6.7的配置中计算了30天内的曝光事件对应的物品ID,以及每个物品的相关信息,本文选择查看category(商品类目)、praise_count(点赞计数)、click_count(点击计数)。
实时特征
图6.8实时序列配置详情
图6.8.1Top偏好属性类特征的行为计数配置详情
在图6.8的实时特征配置中,可选的统计类型与行为偏好特征配置中的含义相同,不同之处在于实时统计的周期是秒。我们分别统计了在自定义统计下的行为计数、转化率等数值,作为自定义的实时衍生特征。
聚合特征
图6.9聚合特征配置详情
在上图6.9的聚合特征配置中,我们在类目特征中选定好字段并作为聚合条件,在此聚合条件下统计对应的特征。可选的统计类型与行为偏好特征配置中的含义相同。我们给出了几个常用的衍生特征的计算逻辑,包括转化率、行为计数等。
6.2.3. 物品侧——特征配置
物品侧的衍生特征配置与用户侧类似,可参考上述内容进行添加。
图6.10物品侧特征配置
6.2.4. 行为侧——特征配置
图6.11行为侧特征配置
如图6.11设置统计在不同维度下的行为衍生特征,包含以天为单位与以周为单位的行为统计。完成上述所有特征配置后,进入下一步召回配置。
6.3. 召回配置
6.3.1. etrec u2i召回
etrec是基于item的协同过滤算法,参考协同过滤etrec。
参数介绍:
训练天数:指使用多少天的行为日志来训练,一般30天,可以根据日志量来增减。
召回数量:指最终离线产出的用户到物品的数量。
U2I Trigger:指用户有交互行为的物品,如果用户点击、收藏、购买的物品,一般不包含曝光物品。
行为时间窗口:指收集多少天内的行为数据,15即最近15天。
行为事件衰减系数:decay的参数
Trigger选取数目:指每个用户取多少个物品ID去与etrec产出的i2i数据做笛卡尔积。建议取值在10到50之间。如果Trigger的数目太大会造成召回的候选物品数量太多。
u2i行为权重:其中注意曝光事件要么不设置,要么设置为权重0。建议不设置曝光事件,即跳过用户曝光数据。
day_interval:使用多天的行为数据得到trigger_item。
decay_coeff:一般介于0-1之间,越大表示过去的行为距离今天衰减越厉害,在构造trigger_item种其占比权重越小。
i2i模型设置:指的是etrec的参数设置,参考协同过滤etrec。其中相关Item选取数目建议不要太多。
6.3.2. swing u2i召回
Swing是一种item相关性计算方法,基于User-Item-User原理衡量Item的相似性。
6.3.3. 向量召回
召回目标名称:一般是否点击,设置为is_click。
召回目标选取:
${behavior_table}表示行为表
${bizdate_start}是行为时间窗的开始日期
event是${behavior_table}表里面事件字段,需根据具体字段选择
is_click即目标名称
该部分在执行的时候可以参考如下代码:
select max(if(event='click',1,0)) is_click ,... from ${behavior_table} where between dt=${bizdate_start} and dt=${bizdate_end} group by req_id,user_id,item
其中维度计算的公式:其中count表示特征枚举值个数。当特征取值个数多的时,使用Log函数。
EMB_SQRT4_STEP8: (8 + Pow(count, 0.25)) / 8) * 8
EMB_SQRT4_STEP4: (4 + Pow(count, 0.25)) / 4) * 4
EMB_LN_STEP8: (8 + Log(count + 1)) / 8) * 8
EMB_LN_STEP4: (4 + Log(count + 1)) / 4) * 4
6.3.4. 全局热门召回
全局热门召回是按照点击事件统计得到热门的物品排行榜(top_n表示排行榜个数)。如果要修改热门的得分公式或者事件访问,可在生成代码部署到DataWorks中再修改。
打分公式:click_uv*click_uv/(expr+adj_factor)*exp(-item_publish_days/fresh_decay_denom)
click_uv:同样的ctr,点击越多,其越热门
click_uv/(expr+adj_factor):平滑后的ctr,其中click_uv表示点击用户数量,expr表示曝光数量。增加调节因子adj_factor一方面是为了防止分母为0,另一方面是当曝光数量很少的时候,ctr会接近于1,加上adj_factor之后,ctr会远离1从而使得ctr更加趋近于真实的ctr。
exp(-item_publish_days/fresh_decay_denom):惩罚发布早的商品
item_publish_days:发布时间到当前的天数
6.3.5. 分组热门召回
即可设置按照城市、性别等属性来统计排行榜,能提供初步个性化的召回。下面的例子中,使用性别和数值的分桶号组合作为分组。
6.3.6. 冷启动召回
类似于DSSM的双塔召回模型,分为user塔和item塔。DropoutNet是一种既适用于头部用户和物品,也适用于中长尾的、甚至全新的用户和物品的召回模型。具体可参考DropoutNet。
6.3.7. 全局热门召回兜底
全局热门召回兜底和全局热门召回基本一致,主要是为了防止全局热门召回引擎失败情况下能够召回足够多的候选集,因此放在Redis存储中。这个产出只有一行数据。
6.3.8. 协同度量学习i2i召回
协同度量学习i2i召回,又称Collaborative Metric Learning I2I召回模型,基于session点击数据计算item与item的相似度。具体可参考:CoMetricLearningI2I
6.4. 排序配置
6.4.1. 精排
本平台提供多种排序模型,具体可参考排序模型。下面是按照多目标排序模型DBMTL来设置相关的排序参数。
点击精排目标设置的新增,新增两个label
6.5. 生成脚本
根据需要完成召回、特征、精排(注意并不需要配置全部模块)等配置之后,可以点击“生成部署脚本”来完成代码的生成。几分钟后弹出生成完成的窗口,点击确定,跳转到部署页面。
如果此处报错,建议检查DataWorks对应的工作空间是否为aliyunserviceroleforpairec角色授予开发、运维、部署角色。
6.6. 前往部署
点击前往部署,跳转到部署预览页面
选择需要部署的文件,本案例选择全选(首次部署),点击开始部署,跳转回部署页面
显示脚本部署进行中
部署成功
部署成功之后,可进入DataWorks找到部署好的代码。
部署失败
如果显示部署失败,可点击查看日志,检查报错信息。
此处提供了两种部署形式,如上为通过PAI-Rec服务代为发起部署操作的流程。
如您希望手动部署,生成脚本成功后,将生成一个OSS地址,此处存储了待部署的所有文件。
您可以前往DataWorks控制台,通过迁移助手功能手动部署。
至此,已完成从数据注册、特征工程到召回、排序模型定制的一套离线推荐方案。下一步即可补数据、调试模型,离线效果达到预期后,欢迎继续体验PAI-Rec在线引擎、A/B Test等功能,完成推荐系统的搭建与调优。