文档

PAI-REC推荐算法定制的最佳实践文档

更新时间:

阅读指引:

为方便用户快捷体验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";

2. 开通PAI-REC

为了体验试用推荐算法定制的产品,请先开通PAI-REC的产品(开通页面),选择含有推荐算法定制的高级版。也可以从试用产品中找到“推荐全链路深度定制开发平台”,用企业主账号点击“立即试用”再领用开通,领用成功可免费试用一个月。开通中遇到问题可联系钉钉群:37930014162。

服务初始化和权限设置需要主账号登录操作,具体参考文档:服务初始化

引擎配置选型:我们在本文档中选择了Hologres作为召回存储。您也可以选择BE作为召回引擎。

image.png

3. 创建场景

在配置推荐任务之前需要先创建一个推荐场景。推荐场景的基本概念、流量编码含义参考基本概念

创建推荐场景的页面如下:

image.png

image.png

4. 数据注册

为了后续在推荐方案定制功能中配置特征工程、召回、排序算法,需要先注册您同步到DataWorks_a项目中的三张表:

image.png

新增数据表,分别注册表rec_sln_demo_user_table_v1、rec_sln_demo_item_table_v1、rec_sln_demo_behavior_table_v1,其中MaxCompute项目选择您启用的项目空间。

请确保当前登录账号具备对MaxCompute该项目的操作权限(如无权限,请联系主账号前往MaxCompute对应的项目添加子账号权限)。然后,执行如下操作:

image.png

5. 创建方案和设置环境变量

我们在HomePage场景下,创建一个test_pai_rec的推荐方案。

image.png

方案下需要选择一系列的参数:

  • DataWorks的工作空间和业务流程作为部署代码的目标地址

  • 业务流程名称:指的是部署到DataWorks的数据开发IDE中左侧目录的业务流程名称。

  • slim_mode:在不使用一键部署时选择这个参数;选择true,会控制用于手动部署的DataWorks迁移助手zip包在30M以内;超出30M的部分,如:fg*.jar(*表示省略了其中的版本等信息)等需用户从OSS中手动下载上传到DataWorks中;选择false,则迁移助手zip包会包含fg*.jar包。

  • OSS Bucket:表示输出代码zip的路径,也是后面保存训练配置文件、checkpoint文件、模型导出的OSS Bucket路径。

  • 在线数据源:在“引擎配置”页面设置的引擎名称,用于存储在线特征数据。即前面设置的Hologres及其表名。

  • PAI-EAS资源组:表示部署模型的资源名称,不选择则默认使用PAI-EAS的公共资源组。

  • FeatureStore:我们已经上线了特征平台(PAI-FeatureStore),但是本最佳实践中暂时不用特征平台。

    • 如您想体验特征平台,可根据上述文档开通特征平台,并在特征平台下创建项目、用户和物品相关的实体。

image.png

点击保存并进入算法方案配置。

6. 方案配置

下面的方案配置较为全面,如果只是体验配置部署的过程,建议配置一个etrec u2i召回、一个全局热门召回、一个精排即可。

如果需要完整配置一个真实场景,建议配置的召回和精排如下:

  • 全局热门召回:日志数据中,全面热门数据的统计排名取top k。

  • 全局热门兜底召回:用Redis作为兜底,防止推荐接口下发数据为空。

  • 分组热门召回:按照城市、性别区间等指标来分类召回,这对提高热门物品的准确性有帮助。

  • etrec u2i召回:基于etrec协同过滤算法。

  • swing u2i召回:基于swing算法。

  • 冷启动召回:dropoutnet算法的冷启动召回

  • 精排:单目标可以选择MultiTower排序;多目标可选择DBMTL排序。

一般当召回比较全面之后再开启向量召回或者PDN召回等算法。向量召回需要配合向量召回引擎,其中Hologres、BE都支持向量召回。

6.1. 数据表配置

配置行为日志表、用户表、物品表,并设置相应的分区、事件、特征、时间戳等字段。

6.1.1. 行为日志表

参数说明:

  • 请求ID:日志中标记每次推荐请求的ID,一般是程序生成的UUID。

  • 行为事件:指日志中记录行为事件的字段。

  • 行为事件枚举值:表示我们需要的事件取值,一般包含曝光(expr、expose)、点击(click)、购买(buy)、点赞(praise)等。

  • 行为的值:某些行为如购买金额、停留时长值。

  • 类目化场景:如果选择是,则在不同场景下统计特征;一般选择否。

lQLPKH52ly1j9lfNBHjNBbiwUeXULD1fd_IFazKRodbiAA_1464_1144.png

在用户表特征中,类目特征和数值特征要根据用户特征的具体情况来填写。对于类目特征,后面会作为深度学习模型的ID特征;对于数值特征,后面会离散化分桶后作为深度学习模型的id特征。

用户tag特征:主要是针对用分隔符(示例中用“|”)区分的多值特征,如用户关注的用户id列表(follow_users)、用户喜欢的类目列表。

用户侧 kv 类特征:如 kv_cate_click_cnt(该用户在物品各类目下的点击数),其中key是cate,key_side是USER,格式为 'cate1:1\u001Dcate2:2'。其中\u001是Java字符串中的分隔符,表示控制字符ctrl_A。

在用户表和物品表中的字段配置与行为日志表中的配置类似。

image.png

image.png

6.1.2. 用户表

image.png

6.1.3. 物品表

image.png

6.2. 特征配置

这里特征配置影响向量召回模型、粗排模型、精排模型中的特征配置。而这些统计特征可以从用户特征、物品特征来看,例如用户在某个类目下、1天/7天/15天总共的点击次数、购买次数,物品是否是3天内新出现的物品;用户最近连续点击的50个物品构造的id序列(7天内)等等。其中透传特征字段是指不参与统计特征计算的特征。

p763982x.jpg

image

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种其占比权重越小。

image.png

i2i模型设置:指的是etrec的参数设置,参考协同过滤etrec。其中相关Item选取数目建议不要太多。

image.png

6.3.2. swing u2i 召回

swing是一种item相关性计算方法,基于User-Item-User原理衡量Item的相似性。

image.png

image.png

6.3.3. 向量召回

提供两种向量召回方式DSSMMIND ,具体介绍参考:

  • 召回目标名称:一般是否点击,设置为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

image.png

image.png

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,曝光越少,adj_factor对热度评分影响很大

  • exp(-item_publish_days/fresh_decay_denom):惩罚发布早的商品

    • item_publish_days:发布时间到当前的天数

image.png

6.3.5. 分组热门召回

即可设置按照城市、性别等属性来统计排行榜,能提供初步个性化的召回。

image.png

6.3.6. 冷启动召回

类似于DSSM的双塔召回模型,分为user塔和item塔。DropoutNet是一种既适用于头部用户和物品,也适用于中长尾的、甚至全新的用户和物品的召回模型。具体可参考

DropoutNet

image.png

image.png

6.3.7. 全局热门召回兜底

全局热门召回兜底和全局热门召回基本一致,主要是为了防止第一种召回引擎失败情况下能够召回足够多的候选集,因此放在Redis存储中。这个产出只有一行数据。

image.png

6.3.8. 协同度量学习i2i召回

协同度量学习i2i召回,又称Collaborative Metric Learning I2I 召回模型,基于session点击数据计算item与item的相似度。具体可参考:CoMetricLearningI2I

6.4. 排序配置

6.4.1. 精排

本平台提供多种排序模型,具体可参考排序模型。下面是按照多目标排序模型DBMTL来设置相关的排序参数。

image.png

点击 精排目标设置的新增,新增两个label

image.png

image.png

6.5. 生成脚本

根据需要完成召回、特征、精排(注意并不需要配置全部模块)等配置之后,可以点击“生成部署脚本”来完成代码的生成。几分钟后弹出生成完成的窗口,点击确定,跳转到部署页面。

image.png

image.png

如果此处报错,建议检查DataWorks对应的工作空间是否为aliyunserviceroleforpairec角色授予开发、运维、部署角色。

6.6. 前往部署

点击前往部署,跳转到部署预览页面

image.png

选择需要部署的文件,本案例选择全选(首次部署),点击开始部署,跳转回部署页面

image.png

显示脚本部署进行中

image.png

  • 部署成功

image.png

部署成功之后,可进入DataWorks找到部署好的代码。

image.png

  • 部署失败

如果显示部署失败,可点击查看日志,检查报错信息。

image.png

image.png

此处提供了两种部署形式,如上为通过PAI-REC服务代为发起部署操作的流程。

如您希望手动部署,生成脚本成功后,将生成一个OSS地址,此处存储了待部署的所有文件。

您可以前往DataWorks控制台,通过迁移助手功能手动部署。

截屏2024-02-01 16.33.42.png

至此,已完成从数据注册、特征工程到召回、排序模型定制的一套离线推荐方案。下一步即可补数据、调试模型,离线效果达到预期后,欢迎继续体验PAI-REC在线引擎、A/B Test等功能,完成推荐系统的搭建与调优。

  • 本页导读 (0)