精华内容
下载资源
问答
  • 显式 用户行为
    千次阅读
    2020-07-06 12:46:39

    导读:今天分享一下Google在KDD 2020的一篇关于多目标优化的工作,在MMoE[2]多任务框架基础上引入LSTM显式建模用户行为序列提升多任务学习效果,推荐一读。

    论文:Multitask Mixture of Sequential Experts for User Activity Streams

    地址:https://research.google/pubs/pub49274/

    摘要

    工业级大规模推荐系统应用中经常需要同时优化多个目标,譬如用户满意度与参与度,因此多任务学习应运而生。然而,当前推荐系统中大多数的多任务学习模型架构只考虑了非序列化的特征输入(譬如query与context),没有特别考虑用户行为序列的建模。显式地针对用户行为序列的建模会帮助多任务模型引入时序依赖,从而更准确的预测用户将来的行为。另外,用户行为序列可能会包含多种异构的数据源,譬如搜索日志、浏览日志等,由于不同类型的数据稀疏性等方面的特性会有较大区别,因此在一起建模学习时也需要谨慎处理。

    本文主要研究了如何在多任务学习场景中针对用户行为序列进行建模,提出了一套新颖的模型框架MoSE(Mixture of Sequential Experts)。在当前最新的MMoE多任务学习框架中使用LSTM针对用户行为序列进行显式建模。同时,本文也通过离线实验以及GMail的线上实验证明了本文的有效性。

    背景

    多任务学习在多个任务之间紧密关联时是有明显效果的。首先,它允许知识和数据在多个相关任务之间的迁移共享从而提升效果;其次,多任务学习通过引入推导偏差可以扮演正则项的角色,因此辅助任务可以用来提升主任务的泛化能力。

    本文研究了多任务学习中针对用户行为序列数据进行建模的挑战

    • 数据稀疏性。用户行为可能是高度稀疏的,譬如购买行为相对于浏览行为来说就非常稀疏;

    • 数据异构性。用户行为数据包含了多种来源或者类型的数据,譬如用户画像包含了性别信息,同时用户日志则包含了点击信息等;从这样的异构数据中学习共享的表示会由于内在的冲突从而比较困难;

    • 复杂的多目标。多个目标之间时序上的联系,譬如点击和购买目标之间,可能会因为用户复杂的内在意图而变得更加复杂;

    因此,本文提出了MoSE模型结构用来解决上述的挑战,主要是由当前MMoE多任务学习模型和LSTM的创新性结合。本文通过丰富的离线实验和GMail的实际线上实验验证了MoSE模型的有效性。

    场景介绍

    如下图所示,当用户在GMail搜索框搜索的时候,搜索结果中除了邮件外,如果Google Drive中有匹配的文件结果也会显示出来。尤其是GMail搜索开启了实时搜索功能,GMail的超大规模的搜索请求量对Google Drive来说是一个很重的负担。也许对某些用户来说,在GMail搜索结果查看Google Drive的结果并不是那么的实用;但是对另外一些用户来说却非常实用。

    因此,我们需要机器学习的模型来学习是否针对特定的用户打开展示Drive搜索结果的功能。在实际场景中,我们按天来更新用户的这个特性开关。而且我们需要在G家的数据上针对这两个任务进行建模和预测:

    • Drive搜索结果点击的数量;

    • 用户使用GMail搜索的按键次数;

    前者任务是为了判断用户是否需要真实需要Drive搜索结果的特性;后者任务则是对请求搜索Drive文件资源消耗的大致估计。最终是否打开Drive搜索结果特性的开关,则是这两个任务之间的平衡。这两个任务针对用户行为序列的建模有不少的挑战:

    1. 需要的变量是高度稀疏的。譬如Drive搜索结果点击数量;

    2. 除了GMail的行为记录,我们需要同时使用Drive的行为记录;

    3. 这两个任务的目标是错综复杂的。标准的非序列多任务模型很难处理好上面的一些问题。

    模型架构

    多任务学习框架在用户行为序列场景下有着特定的挑战:首先用户行为数据是稀疏而且异构的;其次多个目标之间的时序联系是复杂的。因此,我们认为需要有特定的模块来针对不同方面的复杂数据进行建模

    如下图所示,MoSE框架主要由以下的模块构成:

    • 共享底层的LSTM模块在接入序列输入数据;

    • 序列专家层,不同的专家网络用于建模每个任务的不同方面;

    • Gating网络,用于为不同的任务选择不同序列专家网络的输出;

    • Task塔网络;

    其中,我们应用LSTM进行多对多的序列学习如下图所示,也就是上图MoSE结构中的共享底层LSTM模块。

    实验结果

    本文的实验同时在合成数据集以及G家数据集上进行了充足的实验,实验结果由于引入了用户行为序列的建模当然比当前的多种多任务学习baseline要更好。下图是在GMail场景数据集上的训练结果,可以看到MoSE的离线训练指标在多个任务上都表现更好。

    正如之前场景介绍所述,针对特定的用户最终是否打开Drive搜索结果特性的开关,更多是这两个任务之间的平衡。本文也研究了在不同的平衡点,对于Drive搜索结果点击量效果的影响如下图所示。

    参考

    1. Multitask Mixture of Sequential Experts for User Activity Streams

    2. Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts

    更多相关内容
  • 针对在多用户、多Web站点的网络访问环境下存在的数据采集...实验结果表明,该方法可以有效地采集浏览行为数据并清除大量的附带请求,抽取出能够反映用户显式点击的页面基请求,为用户浏览行为建模提供准确的数据源。
  • 电商用户行为分析——sql实战项目

    千次阅读 2022-03-09 17:18:14
    4.1.1uv/pv,uv,pv 4.1.2复购率和跳失率 4.2用户消费行为转化分析 4.2.1总体行为漏斗分析 4.2.2独立访客行为漏斗分析 4.3 时间维度分析用户行为及用户量 4.3.1 用户行为时间维度分析 4.3.2 用户量时间维度分析 4.4...

    目录

    一、项目背景

     二、项目目标

    2.1分析目的

    2.2分析思路

    三、数据读取与清洗

    3.1数据来源

    3.2数据集介绍

    3.3数据清洗

    3.3.1检查是否存在重复值

    3.3.2缺失值处理

    3.3.3一致化处理

    3.3.4异常值处理

    四、数据分析

    4.1整体概况

    4.1.1uv/pv,uv,pv

    4.1.2复购率和跳失率

    4.2用户消费行为转化分析

    4.2.1总体行为漏斗分析

    4.2.2独立访客行为漏斗分析

    4.3 时间维度分析用户行为及用户量

    4.3.1 用户行为时间维度分析

    4.3.2 用户量时间维度分析

    4.4从商品维度分析用户行为

    4.4.1商品排行榜分析

    4.4.2商品四象限划分图

    4.4基于RFM模型的用户价值分析

    4.4.2 F维度分析

    4.4.3用户分层

    4.4.4 RFM模型分析结果

    五、结论

    5.1用户消费行为的转化分析

    5.2时间维度的用户行为分析

    5.3商品维度分析用户行为

    5.4基于RFM模型用户价值分析


    一、项目背景

    UserBehavior是阿里巴巴提供的一个淘宝用户行为数据集,数据集包含了2017年11月25日-2017年12月3日之间,有行为的约一百万随机用户的所有行为(行为包括点击、购买、加购、喜欢),用以进行隐式反馈推荐问题的研究。

    推荐系统中用户对物品的反馈分为显式和隐式反馈,显式反馈 (如评分、评级) 或单一的隐式反馈 (如浏览、点击、加入购物车)。 隐式反馈推荐是推荐系统通过对内容和用户行为的分析,建立适当的模型,帮助用户从海量的数据中找到自己感兴趣的内容。推荐系统中用户的行为反馈包括显式反馈和隐式反馈,隐式反馈信息在推荐系统算法中被广泛应用。隐式反馈体现着用户的兴趣爱好,对隐式反馈信息的挖掘有助于提高推荐系统的效果,以更好地设计推荐系统

     二、项目目标

    2.1分析目的

    为客户提供更精准的隐式反馈推荐。

    从用户角度:提高用户忠诚度,帮助用户快速找到商品;

    从网站角度:提高网站交叉销售能力,提高成交转化率。

    2.2分析思路

    主要从以下五个维度进行分析和建议

    整体行为数据分析:PV,UV,平均访客量,复购率和跳失率

    用户消费行为分析:从总体行为(PV)和独立访客行为(UV)两方面进行从商品的点击、收藏、加购、购买各环节转化率分析,提出改善转化率的意见

    时间维度分析:用户在哪些时间、时段活跃,包括用户行为时段分析和用户量(UV,交易用户数)时段分析

    商品角度分析——用户对哪些产品感兴趣,查询浏览量top20以及销量top20商品,进行浏览量和销量相关性分析

    三、数据读取与清洗

    3.1数据来源

    阿里巴巴天池:数据集-阿里云天池

    3.2数据集介绍

    本数据集包含了2017年11月25日至2017年12月3日之间,有行为的约一百万随机用户的所有行为(行为包括点击、购买、加购、喜欢)。数据集的每一行表示一条用户行为,由用户ID、商品ID、商品类目ID、行为类型和时间戳组成,并以逗号分隔。关于数据集中每一列的详细描述如下:

    列名称说明
    用户ID整数类型,序列化后的用户ID
    商品ID整数类型,序列化后的商品ID
    商品类目ID整数类型,序列化后的商品所属类目ID
    行为类型字符串,枚举类型,包括(‘pv’, ‘buy’, ‘cart’, ‘fav’)
    时间戳行为发生的时间戳

    四种用户类型包括:

    行为类型说明
    pv商品详情页pv,等价于点击
    buy商品购买
    cart将商品加入购物车
    fav收藏商品

    3.3数据清洗

    将数据导入MySql,保留前100w条数据

    3.3.1检查是否存在重复值

    #检查是否存在重复值
    SELECT * FROM userbehavior 
    GROUP BY User_ID, Item_ID, Cate_ID, Behav_type, Timestamp
    HAVING COUNT(*)>1;
    

    不存在重复值

    3.3.2缺失值处理

    #缺失值处理
    SELECT 
    COUNT(User_ID),
    COUNT(Item_ID),
    COUNT(Cate_ID),
    COUNT(Behav_type),
    COUNT(Timestamp)
    FROM userbehavior;

    查询各列行数,都为1000000行,不存在缺失值

    3.3.3一致化处理

    将时间戳Timestamp列转化为三列,分别为时间,日期,小时 

    #添加新列Date,根据Timestamp返回日期
    ALTER TABLE userbehavior ADD COLUMN Date char(10) NULL;
    UPDATE userbehavior
    SET Date = FROM_UNIXTIME(`Timestamp`,'%y-%m-%d');
    
    
    #添加新列Date_time,根据Timestamp返回日期时间
    ALTER TABLE userbehavior ADD COLUMN Date_time TIMESTAMP(0)  NULL;
    UPDATE userbehavior
    SET Date_time = FROM_UNIXTIME(`Timestamp`);
    #添加新列Time,根据Timestamp列返回时间
    ALTER TABLE userbehavior ADD COLUMN Time char(10) null;
    update userbehavior
    set Time = SUBSTRING(Date_time FROM 12 FOR 2);

    添加后表格

    3.3.4异常值处理

    由于项目背景是要通过对2017年11月25日至2017年12月3日之间的淘宝用户行为数据集进行隐式反馈推荐问题的研究,所以要对这个时间段外的数据进行删除处理。

    
    #检查时间始末
    SELECT MAX(Date_time),MIN(Date_time) FROM userbehavior

     删去该异常值

    DELETE FROM userbehavior where Date >'2017-12-03' or Date <'2017-11-25';

    四、数据分析

    数据集情况概览

    SELECT count(DISTINCT User_ID) as 用户数,
    count(DISTINCT Item_ID) as 商品数量,
    count(DISTINCT Cate_ID) as 商品类目数量,
    count(Behav_type) as 行为数量
    FROM userbehavior;

    4.1整体概况

    4.1.1uv/pv,uv,pv

    #整体数据
    SELECT COUNT(DISTINCT user_id) AS 独立访客数,
    	SUM(CASE WHEN `Behav_type` = 'pv' THEN 1 ELSE 0 END) AS '点击',
    	SUM(CASE WHEN `Behav_type` = 'buy' THEN 1 ELSE 0 END) AS '购买',
    	SUM(CASE WHEN `Behav_type` = 'cart' THEN 1 ELSE 0 END) AS '加购',
    	SUM(CASE WHEN `Behav_type` = 'fav' THEN 1 ELSE 0 END) AS '收藏',
    	ROUND(
    		SUM(CASE WHEN `Behav_type` = 'pv' THEN 1 ELSE 0 
    			END)/COUNT(DISTINCT user_id)) AS '人均浏览次数'
    FROM userbehavior;

    可以得到页面点击数(PV)为895636

    独立访客数(UV)为9739

    人均浏览次数(PV/UV)为92次

    4.1.2复购率和跳失率

    复购率定义:消费两次及以上的用户在总消费用户中占比
    跳失率定义:仅仅访问了单个页面的用户占全部访问用户的百分比,或者指从首页离开网站的用户占所有访问用户的百分比。

    首先创建视图,以user_id分组,得到用户行为数据

    
    create view 用户行为数据 AS
    select User_ID,COUNT(Behav_type) as '用户行为数',
    sum(case when Behav_type ='pv' then 1 else 0 end ) as '点击',
    sum(case when Behav_type ='fav' then 1 else 0 end) as '收藏',
    sum(case when Behav_type ='cart' then 1 else 0 end) as '加购',
    sum(case when Behav_type ='buy' then 1 else 0 end) as '购买'
    from userbehavior
    GROUP BY User_ID
    ORDER BY 用户行为数 DESC;

     计算复购率

    复购率=购买2次及以上用户数/总购买用户数

    -- 复购用户、复购率
    SELECT
    sum(case when 购买>1 then 1 else 0 end ) as 复购次数,
    sum(case when 购买>0 then 1 else 0 end ) as 购买次数,
    CONCAT(ROUND(sum(case when 购买>1 then 1 else 0 end)*100/ sum(case when 购买>0 then 1 else 0 end),2),'%') as 复购率
    from 用户行为数据;

     计算跳失率

    跳失率=只有点击行为的用户/总用户数

    (即该用户行为数=点击数)

    select
    * from 用户行为数据
    where '用户行为数'='点击'

    得到复购率=66.21%, 跳失率为0

    可以看出淘宝用户忠诚度较高。可进一步培养用户忠诚度,鼓励更高频次的消费。

    4.2用户消费行为转化分析

    漏斗分析是一套流程式数据分析,它能够科学反映用户行为状态以及从起点到终点各阶段用户转化率情况的重要分析模型。是一种针对产品时间轴上流程上的数据分析方法,这与数据的横向对比存在本质逻辑的不同。漏斗分析希望通过观察每个流程节点上的转化与流失的人数得到出现问题或可以改进的流程节点。

    4.2.1总体行为漏斗分析

    一般电商用户行为路径图

    由于本案例收藏与加购为存在明显先后顺序,故将两个行为合并

    SELECT Behav_type, count(*) count FROM userbehavior
    GROUP BY Behav_type;
    

     用户在点击详情页后,加购或收藏的比例在用户浏览详情页后,在9.3%左右,最后购买的比例在2.3%左右,说明用户在浏览详情页以后大量流失。

    4.2.2独立访客行为漏斗分析

    下面对独立访客(UV)进行同样的分析

    SELECT SUM(CASE WHEN 点击 > 0 THEN 1 ELSE 0 END)AS 点击用户数,
    	SUM(CASE WHEN 收藏 > 0 THEN 1 ELSE 0 END)AS 收藏用户数,
    	SUM(CASE WHEN 加购 > 0 THEN 1 ELSE 0 END)AS 加购用户数,
    	SUM(CASE WHEN 购买 > 0 THEN 1 ELSE 0 END)AS 购买用户数
    FROM 用户行为数据;

     

     

    可以看出,在浏览详情页后,有75%左右用户进行加购,40%进行收藏,最终支付订单人数(付费用户)为68.47%,用户的购买转化率还是很不错的,说明app符合大部分用户的需求

    与总体流量行为对比,独立访客将用户去重,发现购买转化率大大提高。说明各用户的点击量较多,推测是在购买前,用户会对于不同店铺、不同价位、不同款式商品进行对比,最终进行加购/收藏步骤。

    所以为提高PV到购买的转化率,可以用户的日常行为为依据,优化推荐机制和筛选功能,使得推荐商品更精准,尽量减少用户获取需要商品的成本,增加PV的购买转化率。


     

    4.3 时间维度分析用户行为及用户量

    4.3.1 用户行为时间维度分析

    4.3.11用户行为变化趋势(天)

    SELECT date,
    	COUNT(DISTINCT user_id) 用户数,
    	SUM(CASE WHEN Behav_type = 'pv' THEN 1 ELSE 0 END)  点击,
    	SUM(CASE WHEN Behav_type = 'cart' THEN 1 ELSE 0 END) 加购,
    	SUM(CASE WHEN Behav_type = 'fav' THEN 1 ELSE 0 END) 收藏,
    	SUM(CASE WHEN Behav_type = 'buy' THEN 1 ELSE 0 END) 购买
    FROM userbehavior
    GROUP BY date;

    得到用户每日各行为

    由用户行为趋势可以看出,11.25-12.1日内各行为波动较小,在12.1-12.2时用户数、加购、点击行为有小幅明显增加,收藏和购买保持较小波动。排除周末原因导致数据上升(11.25-26也为周末)

    考虑12月初双十二预热活动开始,各渠道宣传使得点击及访客数增加,各种预售活动开始使得加购行为数量出现上升。

    4.3.12用户各时段行为变化(时)

    select Time,COUNT(distinct user_id) as '用户数',
    sum(case when Behav_type ='pv' then 1 else 0 end ) as '点击',
    sum(case when Behav_type ='fav' then 1 else 0 end) as '收藏',
    sum(case when Behav_type ='cart' then 1 else 0 end) as '加购',
    sum(case when Behav_type ='buy' then 1 else 0 end) as '购买'
    from userbehavior
    GROUP BY Time
    ORDER BY Time;

     

     从整体趋势看,各项指标在23点到次日5点时会大幅度降低,早上五点达到最低谷;5点至中午11点大幅度上升,11点至19点各项平稳,之后又逐步小幅上升,在22点达到一天峰值。

    该行为变化符合人群作息规律,且与学生及上班族的行为活动时间相符合。

    从峰值来看,可以加大19-23这一时段的商品及活动宣传力度,制定适当运营策略,提高购买转化率。
     

    4.3.2 用户量时间维度分析

    对购买数进行去重,得到buyer

    select date, 
    count(distinct user_id) as buyer
     from userbehavior
     where behav_type='buy'
     GROUP BY date
    ORDER BY date

    计算dau,与uv和buyer对比 

    4.4从商品维度分析用户行为

    关于“受欢迎”的产品,有的人理解是点击量高,有的人理解是销量高;
    但有的点击量高的产品可能是因为被页面或广告等吸引而来,或者只是感兴趣,用户并不一定会购买;而销量高的产品有可能是用户真正需要的,搜索和点击购买的目标也比较明确。
    需要探究点击量与销量之间的相关关系。

    4.4.1商品排行榜分析

    4.4.11商品销量排行榜

    查询销量前十的商品编号及其销量

    create view 销量前十 as
    SELECT item_id,COUNT(behav_type)  销量
    FROM userbehavior
    WHERE behav_type = 'buy'
    GROUP BY item_id
    ORDER BY 销量 DESC
    LIMIT 10

    可以看出销量最多的商品才17件,且销量前十的商品中有一半没有超过10件,可以看出淘宝主要是依靠商品多样性来满足用户需求,并不存在爆款商品。今后也可继续增加商品类目,打造多元化商品。

    4.4.12商品浏览排行榜

     查询浏览量前十的商品

    create view 浏览前十 as
    SELECT item_id,COUNT(behav_type) AS 浏览量
    FROM userbehavior
    WHERE behav_type = 'pv'
    GROUP BY item_id
    ORDER BY 浏览量 DESC
    LIMIT 10;

     接下来查询浏览量和销量排行前十的商品有无重合部分

    
    select s.item_id, 销量, 浏览量
    from 销量前十 s left join 浏览前十 l
    on s.item_id=l.item_id

    并无重合部分,可看出销量高并不意味着浏览量高。

    4.4.2商品四象限划分图

    为进一步探究销量与浏览量关系,查询浏览量排行 前300的商品的销量

    CREATE TABLE 浏览量前300
    SELECT item_id,COUNT(behav_type)  浏览量
    FROM userbehavior
    WHERE behav_type = 'pv'
    GROUP BY item_id
    ORDER BY COUNT(behav_type) DESC
    LIMIT 300;
    
    select * from 浏览量前300
    
    SELECT item_id,COUNT(behav_type)  购买量
    FROM userbehavior
    WHERE behav_type = 'buy'
    AND item_id IN(
    	SELECT item_id FROM `浏览量前300`)
    GROUP BY item_id
    ORDER BY COUNT(behav_type) DESC

    选定刻度为80,3 

    处于第Ⅰ象限的商品:此类商品的浏览量与销量都处于较高的水平,属于比较受用户欢迎的商品
    优化方法:提高此类商品的曝光量,平台加大推荐力度,从而提高浏览量,进而提升销量。

    处于第Ⅱ象限的商品:此类商品的销量高,但是浏览量低,说明该类商品
    ①属于垂直领域,有特定受众会直接进行性购买,用户的购买目标明确
    ②商品本身转化率应该较高,但是曝光量过少,商家宣传力度小,用户接触到该类商品的渠道较少
    优化方法:分析商品特征与用户画像,收集该类商品的个性化信息和用户特征,分析该商品是否属于垂直刚需商品,是否存在特定的消费群体。
    ①若存在,商家可以针对该类用户推测出特定活动,做到精准推送,或建立该类商品受众的专属社群,提供用户交流平台,进一步增加用户粘性。
    ②若不存在,则商家应该加大宣传力度,多做宣传,增加商品权重,设置高频率搜索关键词,设计亮眼的宣传图等,增加用户的浏览量,销量也会随之提升。

    处于第Ⅲ象限的商品:浏览量和销量都比较低,说明用户对商品不感兴趣,需要考虑流量入口和商品本身两方面的问题
    优化方法:①流量问题:是否对商品的宣传力度过小,用户没有渠道点进来此类商品?可以尝试提高商品的曝光量
    ②若提高商品曝光量后商品的销量还是比较低迷,就需要考虑商品本身是否是用户真正需要的,效果不好的商品也可以直接优化掉

    处于第Ⅳ象限的商品:商品浏览量高,但是销量低,说明商品整体的转化率很低,也可以从一下几方面分析问题所在
    ①目标人群送达:可能是商品本身的宣传非常有吸引力,但是指向性不够明确,导致很多非目标用户点击商品,但是没有进行购买
    ②商品定价:商品定价过高,同类可替代的高性价比商品太多,用户就会转向其他同类商品
    ③商品详情页、客服及评论区:用户无法从详情页和客服得到需要的的商品详细信息,或者商品评论有比较扎眼的差评,导致用户退出购买
    ④购买流程:可能是优惠券使用方式复杂,商品凑单购买流程复杂,让用户放弃购买。

    4.4基于RFM模型的用户价值分析

    RFM模型通过一个客户的近期购买行为(R)、购买的总体频率(F)以及花了多少钱(M)3项指标来描述该客户的价值状况。

    R(Recency):客户最近一次交易时间的间隔。R值越大,表示客户交易发生的日期越久,反之则表示客户交易发生的日期越近。

    F(Frequency):客户在最近一段时间内交易的次数。F值越大,表示客户交易越频繁,反之则表示客户交易不够活跃。

    M(Monetary):客户在最近一段时间内交易的金额。M值越大,表示客户价值越高,反之则表示客户价值越低。

    本次分析数据集不含金额,因此仅从R、F两个维度进行分析

    4.4.1 R维度分析

    由于整个数据集区间为9天,设定
    0~1天设置为4
    2~3天设置为3
    4~6天设置为2

    7~9天设置为1

    CREATE VIEW R_v AS
    SELECT user_id, MIN(时间间隔) AS R
    FROM
    	(SELECT user_id, DATEDIFF('2017-12-03',DATE) AS '时间间隔'
    	FROM userbehavior
    	WHERE behav_type = 'buy') a 
    GROUP BY user_id;
    
    #计算分值分布情况
    SELECT a.value_r, COUNT(a.value_r) amount
    FROM(
    SELECT user_id,R,
    	CASE WHEN R BETWEEN 0 AND 1 THEN 4
    	WHEN R BETWEEN 2 AND 3 THEN 3
    	when R between 4 and 6 then 2
        else 1 END AS value_r
    FROM R_v) AS a
    GROUP BY value_r
    order by value_r;
    

     

     可以看出r值为4、3用户较多,总计占比70%,即70%用户会在0-3天内进行再次消费,用户粘性较好。

    4.4.2 F维度分析

    查询用户的消费频率

    #查询消费频率
    CREATE VIEW F值 AS
    SELECT user_id, COUNT(behav_type) AS F
    FROM userbehavior
    WHERE behav_type='buy' 
    GROUP BY user_id
    ORDER BY COUNT(behav_type) DESC;
    
    #查询频率极值
    select max(F), MIN(F) from
    (SELECT user_id, COUNT(behav_type) AS F
    FROM userbehavior
    WHERE behav_type='buy' 
    GROUP BY user_id
    ORDER BY COUNT(behav_type) DESC)

    由于差距较大,可将区间分为 1-5 1分,6-12 2分,13-23 3分,24-35  4分,36-50  5分,>50  6分

    SELECT a.value_f,COUNT(a.value_f) amount
    FROM(
    SELECT user_id,f,
    	CASE WHEN f BETWEEN 1 AND 5 THEN 1
    	WHEN f BETWEEN 6 AND 12 THEN 2
    	WHEN f BETWEEN 13 AND 23 THEN 3
    	WHEN f BETWEEN 24 AND 35 THEN 4
    	WHEN f BETWEEN 36 AND 50 THEN 5
    	ELSE 6 END AS value_f
    FROM F值) AS a
    GROUP BY value_f
    ORDER BY value_f;
    

     

    在统计区间内 ,购买低于12次的人数仅占14%,用户活跃度很高。

    4.4.3用户分层

    进行R和F综合评分

    
    
    #R分值
    CREATE VIEW R分值 AS
    SELECT user_id,
    	CASE WHEN R BETWEEN 0 AND 1 THEN 4
    	WHEN R BETWEEN 2 AND 3 THEN 3
    	when R between 4 and 6 then 2
        else 1 END AS value_r
    FROM R_v;
    
    #F分值
    CREATE VIEW F分值 AS
    SELECT user_id,
    	CASE WHEN f BETWEEN 1 AND 5 THEN 1
    	WHEN f BETWEEN 6 AND 12 THEN 2
    	WHEN f BETWEEN 13 AND 23 THEN 3
    	WHEN f BETWEEN 24 AND 35 THEN 4
    	WHEN f BETWEEN 36 AND 50 THEN 5
    	ELSE 6 END AS value_f
    FROM F值;
    
    CREATE VIEW RF综合评分 AS 
    SELECT a.user_id, a.value_r, b.value_f, a.value_r+b.value_f AS value_RF
    FROM r分值 a 
    JOIN f分值 b ON a.user_id=b.user_id;
    
    select*from RF综合评分
    

     得到各用户综合评分

    查询RF得分极值

    select max(value_RF), min(value_RF) FROM RF综合评分

     

    划分各用户层级

    2 ~ 3分:易流失用户
    4 ~ 5分:挽留用户
    6 ~ 8分:发展用户
    9~ 10分:忠诚用户
    然后统计各层级用户数量

    SELECT a.用户分层,COUNT(a.用户分层) as 人数
    FROM(
    	SELECT 
    		CASE 
    		WHEN value_rf BETWEEN 2 AND 3 THEN '易流失用户'
    		WHEN value_rf BETWEEN 4 AND 5 THEN '挽留用户'
    		WHEN value_rf BETWEEN 6 AND 8 THEN '发展用户'
    		WHEN value_rf BETWEEN 9 AND 10 THEN '忠诚用户' END AS 用户分层
    	FROM RF综合评分)AS a
    GROUP BY 用户分层;

    挽留用户占比61.02%

    易流失用户占比30.27%

    发展用户占比8.62%

    忠诚用户占比0.07%

    4.4.4 RFM模型分析结果

    在四个分类中,挽留用户的占比最高,达到60%,这部分用户待挖掘的潜在价值很大,应该对这部分用户进行定时促活,如优惠发放、上新消息送达、提供更精准的商品推荐等,主要目的是留住用户,并提升消费品率,提高其转化率;
    易流失用户占比30%也比较高,可能是产品体验不佳,用户流失至竞品app。从用户角度可以对该部分用户进行问卷调研找到流失原因,及时进行新活动心有会推送,对用户进行召回;从竞品角度可以对其进行调查,找到其吸引顾客的原因。
    发展用户占比较低,可以对这部分用户进行定期推送,发送优惠消息邮件通知,来增加消费频次
    忠诚用户的占比不到0.1%,这部分用户的价值极高,需要制定专属的运营策略来进行维护,如专属优惠、专属客服等,保证其较高的用户粘性。

    此次用户分层效果分析整体效果不佳,可能有下面两个原因
    1、区间划分不合理,可以先看一下各个分数的用户人数并结合实际的业务场景进行区分;
    2、两个维度划分的段数不同,且差异较大,相当于给两个部分赋予了不同的权重。

    五、结论

    5.1用户消费行为的转化分析

    1.根据跳失率和复购率来看,淘宝APP中的商品对用户具有足够的吸引力,用户粘性很大,重点为维系老用户的忠诚度。

    可建立老客户社群,重点维系老客户和平台联系,适时发放优惠券等方法提高用户参与度,并进行老用户调研,提高产品使用感。

    2.从漏斗模型可以看出用户从点击到购买的转化率还是比较高的,可以通过引导用户收藏并加购来提高用户从收藏/加购到购买的转化率。但是PV点击到购买的转化率极低,故可以针对点击到购买的行为转化进行提升。建议有:

    优化电商平台的搜索匹配度和推荐策略,提高筛选精确度,并对搜索和筛选的结果排序的优先级进行优化,减少用户获得满意商品的成本;

    提供同类产品比较的功能,让用户不需要多次返回搜索结果进行点击查看,方便用户确定心仪产品,增加点击到后续行为的转化;

    优化收藏到购买的操作过程,增加用户收藏并加购的频率,以提高购买转化率。

    5.2时间维度的用户行为分析

    可以看出用户的活跃时间高峰期主要在20-22点,此时使用人数最多,活动最容易触达用户,所以可以将营销活动安排在这个时间段内,来进行引流并转化。

    在研究的9天内共有两个周末,第一个周末用户活跃度并没有明显变化,而第二个周末推测是因为有双十二的预热,导致用户点击和加购出现明显增加。故可以扩大研究时间范围对推测进行验证,若推测正确,则可以通过在周末推出营销活动来挖掘用户周末购物的欲望。

    5.3商品维度分析用户行为

    商品的浏览量和销量排名呈现显著差异,提高浏览量能否使 销量并不会随之增加存疑,需要进一步验证

    根据四象限划分图,应重点提升第二象限及第三象限的商品,针对第二象限的商品应提高其曝光率,找出它的用户画像,尽量做到精准推送或建立专属社群,提供用户交流平台,提升用户粘性及转化率;第三象限应尝试提升商品的流量,分析销量是否会随之提升。
    通过分析发现,商品的销量主要靠的是“长尾效应”而非某款爆款商品,但是这是站在APP的角度来看,对于B端商家来说,也可以打造爆款商品来减少商品种类繁多的运营及库存成本。
    针对销量排行榜前面的商品可以增加其曝光率推荐率,在用户搜索时进行优先展现

    5.4基于RFM模型用户价值分析

    通过RFM模型对客户群进行划分,可以对不同的用户群体采用不同的管理策略,达到对不同的客户群进行精准营销的目的:

    对于重要价值用户,需要重点关注并保持, 应该提高满意度,增加留存;

    对于重要发展客户和重要保持用户,可以适当给点折扣或捆绑销售来增加用户的购买频率;

    对于重要挽留客户,需要关注他们的购物习性做精准化营销,以唤醒他们的购买意愿


     

    展开全文
  • 用户行为序列推荐模型

    千次阅读 2019-12-20 17:14:22
    导读:今天我们谈谈用户行为序列上的推荐模型。首先我们对序列推荐问题做一个定义和描述,然后主要讲述可以用在序列推荐任务中的 NN 模型,最后给出一点个人看法以及文中相关的参考文献供参阅。 用户行为大多数情况...

    导读:今天我们谈谈用户行为序列上的推荐模型。首先我们对序列推荐问题做一个定义和描述,然后主要讲述可以用在序列推荐任务中的 NN 模型,最后给出一点个人看法以及文中相关的参考文献供参阅。

    用户行为大多数情况下都是存在时间上的先后关系的,在某一个时刻向用户推荐哪些物品一般是根据当前时刻之前用户的行为来做决策的,我们可以将序列推荐问题看做是在时间维度去学习一个模型策略来根据用户过去的行为历史来预测用户将来感兴趣的物品。

    相对基于序列的推荐模型则是非序列化的推荐模型,如经典的矩阵分解模型和图模型,如图1。这两种模型主要考虑通过节点之间的邻接关系进行建模,时序通常是作为其中一个的隐式特征或者约束加入模型中来进行学习的。而在序列模型中,时间先后顺序是作为一个显式的强制约束加入模型中的 ( t 时刻根据之前的行为进行学习,然后 t+1 时刻根据之前的行为进行学习 ),因此序列模型中可以防止 future information leakage,对于 next items recommendation 的任务是比较适合的模型。

    图1 序列推荐模型与非序列推荐模型

    序列模型在我们的日常生活当中也存在着不少应用场景。比如金融交易中的股票涨跌预测以及自然语言处理中的语言模型。可以把一个用户在过去一段时间内发生过行为的物品集合 S 定义为:

    其中item表示物品信息,如物品 ID 以及相关属性,action 表示用户行为信息,如行为类型:浏览 ( impression ),点击 ( click ),购买 ( buy ) 等,timestamp 表示行为发生的时间。context 为事件的上下文信息。将 S 中的元素根据 timestamp 从前到后排序后得到用户的有序行为序列S'= 

    接下来我们主要讨论的序列推荐则可以看做是在序列 S' 上学习的一个预测模型 P:

    相对于矩阵分解和图推荐,在序列上学习推荐模型最重要的一点是用户某个时刻的行为只受该时刻之前的行为影响,不受用户之后的行为影响,如图2,t4 时刻我们预测用户行为物品,预测的输入只包括:

    不包括 t5 时刻的行为。

    图2 用户序列行为的相互影响

    ——数据准备——

    在开始模型训练之前,我们需要准备训练和测试数据。序列推荐模型的输入是用户的行为序列数据,在多数情况下对训练数据进行预处理对模型性能有一定帮助。我们可以先对数据中的序列信息进行一个简单统计,进行可视化显示以帮助我们对数据有一个总体认识,下表给出一些可以进行统计的数据范例:

    针对以上的统计量,我们可以进行以下的数据过滤和处理工作:

    ❶ 无效用户过滤,如 robot ,网站爬虫等。这些用户的行为条目数通常远大于正常用户的行为数,可以结合用户行为数目的直方图,通过一些基于统计的异常点检测算法 ( 如检测,MAD-基于绝对离差中位数,基于密度的检测方法等 ) 找到这些用户并过滤掉;

    ❷ 热门用户和热门物品的处理,可以对热门用户和物品对应的数据进行降采样,或者是进行降权,以减少热门度对推荐结果的影响;长序列可以根据时间进行切分,减少长序列对模型收敛性的影响。

    接着我们需要把预处理后的数据分成训练集和测试集。如论文[14]中提到的,随机的将数据集分成训练和测试集合对于 next-item 的推荐会造成 future information leakage,一个可行方式是在用户的行为序列上选取一个时间点作为训练和测试集的分割点,用户之前的行为加入训练集,之后的行为放入测试集,如果我们只关注非重复物品的推荐,那么同一用户的行为物品需要在训练和测试集之间进行去重。

    数据准备好以后,下面开始模型工作。首先我们需要明确模型需要完成什么任务,是召回还是排序,并且针对具体任务定义模型的优化指标。如果是召回,可以采用 precision_recall,F 值,如果是排序,可以采用 AUC,NDCG,MAP。在序列上做召回相当于在某个时刻去预测整个物品空间集合内用户对各个物品发生行为反馈的概率,即一个多分类的问题,ground truth label 是该时刻用户实际发生反馈的物品。在召回的物品集合中,接下来可以进行一个更为精细的排序,输入是更为精细的用户行为特征信息以及相对较小的候选物品集合, ground truth label 是用户对候选物品的反馈行为,然后在这个小的集合内对每一个物品进行打分,作为用户对物品发生反馈的概率。具体构建召回和排序的流程和框架,读者可以参看论文[14]。

    ——MLP——

    下面即谈下可以在序列推荐中使用的模型。首先第一个模型是 Multi-layer Perceptron ( 多层感知机 ),也是模型结构相对简单但在工业界运用比较广泛的深度模型。MLP 模型是包含多个全连接隐藏层的前向反馈模型, 输入是之前用户的最近 N 次行为的数据,输出是一个固定长度的向量来表示用户的历史行为信息。如将图2中的序列展开后生成的模型输入为:[([e1], e2)),([e1, e2], e3),([e1,e2,e3], e4),([e1, e2, e3, e4], e5)],每个 tuple 的第一个元素是前 N 个时刻的行为信息,第二个元素为当前时刻的行为信息。模型先对输入的这 N 个时刻的行为信息进行 embedding,然后通过 pooling 将这 N 个 embedding 进行聚合,生成低维度的向量,最后经过一层或者多层的全连接层生成输出向量。

    图3 recall & ranking via MLP

    图3中右边部分,输出向量送给 softmax 层产生物品全集中每个物品的概率,t 时刻的物品 ID 作为 groud truth,loss 使用 sofmax cross entropy loss ( 如果物品的数目特别多,一般考虑做 sampled softmax )。物品向量即对应 softmax 权重矩阵中的列向量,然后可以用第三方平台 ( 如 fuss ) 建立向量索引。线上服务时用户的历史行为序列的模型向量作为 key, 通过 nearest neighbor search 完成召回。

    上图左边部分对应在候选集合中进行排序。类比[18]中的 DSSM 结构,模型产生的输出向量与目标物品 embedding 之间的相关性作为目标物品的排序分数,其中计算相关性可以采用以下方法:

    图4 combine embedding for prediction score

    其中 history embedding ( 历史行为向量 ) 表示为 H, target embedding ( 预测物品向量 ) 表示为 T,图4中的几个计算方式可以简单表示为:

    • cosine similarity: 

    • inner product: 

    • bi-linear product: 

    • fully-connected layer: 

    在实际排序过程中,除了事件中的物品 ID 可以作为特征之外,物品本身的属性以及事件上下文也可以用到模型中。可以如图5,把这些特征通过 embedding 层之后进行聚合,拼接成一个长向量,然后输入到多层全连接网络。

    图5 combine input embedding via concatenation

    也可以每个特征在序列维度单独进行 embedding 和 pooling ( 各个特征的 pooling 方式可以不一样 ),然后在输入全连接层之前进行聚合。

    图6 concatenate pooling output

    图6中的几个模块可以单独说一下:

    ❶ Embedding 层

    embedding 层的作用是:将序列中的事件信息映射为一个浮点数向量。每个事件的信息包括物品特征信息以及上下文信息,其中物品的特征包括离散型特征 ( 物品的 ID 编号,物品的类别,物品的标签等 ) 和连续型特征 ( 物品的历史热度等 ),其中物品的 ID 和类别是每个物品唯一标识,属于 univalent 离散特征,而每个物品包含的标签不止一个,为 multivalent 离散特征。

    离散特征的向量化可以采用两种方式:1. embedding lookup;2. onehot。embedding lookup 通过 ID 在一个大小为 M x d 的矩阵中查找到该特征编号所对应的行,作为特征的向量,其中 M 是该离散特征的取值个数,d 是特征向量的维度。onehot 则是定义一个0-1向量,其中向量长度是特征所有取值的个数,而特征的具体值对应向量中的下标,该下标对应的 one-hot 元素值为1,其他位置下标的值为0。如果是 multivalent 特征,则将各个特征取值对应的向量进行相加,得到特征的向量。

    图7 embedding lookup and onehot

    连续型的数值特征可以直接使用,使用前一般会做归一化,使得特征归一到(0,1)之间。物品的文字描述和图片等属于高维特征,通常需要先降维到一个低维度的向量再使用。文字描述一般可以经过分词去停用词等预处理过程,然后将每个词映射为词向量。词向量可使用预训练的词向量模型 ( 如 word2vec,glove ),也可以使用随机初始化的词向量。词向量的序列然后经过 LSTM 等语言序列模型后,生成整个物品的文字描述向量。图片的原始数据通过预处理后经过一个预训练的模型 ( 如 vgg,inception ),取其某一层的输出作为图片向量 ( 如 vgg 的 fc6 )。实际中发现预训练模型的最后几层输出维度比较高但是数据比较稀疏,可以加一个全连接层将高维的稀疏向量映射为一个低维向量,作为最终输出的图片向量。

    图8 产生图片和文字向量

    除了物品特征信息之外,我们也可以引入事件上下文信息对用户的时序行为进行建模,主要包括事件发生时间,地点以及事件行为类型。上下文信息的建模方式同离散特征建模方式类似,通常上下文信息取值范围不会太大,可以直接使用 one_hot 编码。上下文信息中事件的时间是比较重要的信息:如前提到的,序列推荐相对于自然语言中的序列模型虽然没有非常强的先后依赖关系,但是对于刻画用户的长期行为和短期行为以及用户行为随时间的变化趋势,时间上下文还是非常重要的。我们通常不直接使用时间戳的绝对值,而是对时间进行分桶,如我们可以在事件发生的时间与目标预测的时间之间取一个相对间隔:,其中 是当前目标预测时间戳,是事件的时间戳,是时间间隔单位,然后对这个间隔进行分桶。分桶方式可以根据自身需求进行设计,如论文[19]中提到了一种以2的幂次方来进行分桶的方式:

    时间间隔映射到上述范围的结果作为分桶结果:

    得到上下文向量后,如何与物品的特征向量进行整合?简单的方式是直接与特征向量进行拼接,参见论文[14]。另外一种方法是建立上下文与物品特征的 low-rank relationship:将上下文向量分别映射到物品各个特征的向量空间内,然后与物品的特征向量进行求和 ( + ),参见论文[12];或者进行点乘 ( * ),参见论文[16]。

    图9 上下文向量与特征向量结合

    我们为什么要将上下文信息映射到各个物品特征的向量空间内,而不是统一使用一个向量呢?因为每个特征受上下文的影响程度不同,如有些特征受时间的影响比较大,如价格,而有些特征对时间没有那么敏感,比如物品的 ID 和文字描述等。将统一的上下文信息进行细粒度的划分,能够更好的刻画用户的兴趣的变化趋势。

    ❷ Pooling 层

    通过 embedding 层得到序列向量后,pooling 层将序列向量聚合为定长的向量,一方面后继全连接层的输入需要固定长度的向量,另一方面通过 pooling 层我们可以获取到用户历史行为序列的全局信息。pooling 层通常采用的方式有 sum pooling 或者是 average pooling。sum pooling 将序列中每个元素的向量进行累加,average pooling 则是将 sum pooling 得到的向量进行平均。简单定义如下:

    k 表示向量的第 k 维,d 为向量维度。

    ❸ FC 层

    FC 层相对比较简单:pooling 层的输出向量经过多个全连接层,最终输出用户对候选物品的兴趣的预估:P(y|x1,x2,...xn)。全连接层的输出维度一般是逐渐变小,一方面起到降维的作用,并且通过全连接去学习不同特征之间的高阶关联关系,全连接层采用非线性激活函数将所有特征向量单元之间的关联进行非线性化抽象,从而提升模型的描述能力。

    ❹ 注意力机制

    上述 MLP 模型对物品序列的建模是独立于预测的候选物品的,我们最终形成用户行为序列向量的时候是一碗水端平的去考虑历史行为影响的。这样如论文[4]中提到的,我们没有考虑到用户兴趣存在多样性,其不同类型的历史行为对用户当前的决策影响程度也是不一样的,比如当前用户要买书,那么在用户的历史购买行为中,我们应该去多关注该用户之前都买什么样的书,而该用户在其他方面的购买记录就相对显得没有那么重要。因此一个很自然的想法是给用户的不同历史行为赋予不同权重。图10对上述的 MLP 模型进行了一定修改,在各个特征的 pooling 层中引入注意力机制,从过去的序列向量平均变成序列向量的加权求和,序列向量的权重由候选物品与行为物品之间的相关度决定。

    图10 attention pooling

    上图为 attention 的示例和公式, 计算预测物品与历史序列物品之间的相关度, 经过 softmax 归一化后生成序列中每个物品对应的注意力权重 ats,序列中物品向量进行带权重的求和得到整个序列的向量 ct。

    注意力分数的计算除了 multiplicative 和 additive 两种计算方式外,在论文[4]中采用了基于浅层网络的方式,其中  和  通过  计算出候选物品与历史物品的组合向量,生成的组合向量与原始向量进行拼接,先经过一个非线性激活函数的全连接层进行降维,最终经过一个线性层输出注意力分数,这样通过向量组合和浅层网络生成注意力分数,可以尽量减少物品之间交互信息的损失。具体公式读者可以参见源论文[4]。

    图11 attention score from fully-connected layers

    ——CNN——

    从上面 MLP 模型我们可以看到,用户历史序列的向量是通过全局 pooling 的方式得到的,相当于对用户的历史行为做了一个全局描述。但是在用户的历史行为中会存在着一些局部的连续行为模式,比如用户在过去几天内连续买过婴儿用品,那么在推荐中我们可以根据这个信息向用户推荐一些跟育儿相关的商品。在全局的 pooling 层我们有可能会丢失这些局部行为信息,因此可以建立模型来对用户行为中的局部行为模式进行建模,而局部信息建模的一个理想候选模型则是卷积神经网络 ( Convolution Neural Network )。

    论文[5]讲述了如何通过卷积神经网络对用户行为序列进行建模,其建模思想同论文[6]通过卷积神经网络对句子序列进行建模完成句子分类的工作,即 TextCNN。图12给出 TextCNN 如何通过提取句子序列信息完成句子分类:

    图12 TextCNN 示意图

    图中输入句子分词后的序列是 "wait fro the video and do n't rent it",建模步骤从左至右:第一步先将每个词映射为词向量,生成一个 n x k 的二维矩阵,其中 n 是句子的长度,k 是词向量的维度;第二步在 x k 的矩阵上进行卷积。卷积核 [卷积高度,卷积宽度,输入维度,输出维度 ] 中卷积高度是一个超参数,由调用方指定每次卷积要覆盖的连续词的个数,卷积宽度需要跟词向量的维度一致,这是因为每一个向量代表一个词,在抽取特征的过程中,词做为文本的最小粒度,应该保证其信息的完整性。输入维度为1,输出维度由调用者指定。一般情况下,我们会使用多个卷积核,如上图中的红色和黄色部分,分别对应卷积高度等于2和卷积高度等于3的卷积核。多个卷积核在不同的局部范围内运用相邻连续词的上下文进行建模,从而从不同的粒度去刻画句子序列的信息 ( 一般情况下,卷积高度我们一般取2或者3,对应 bi-gram 和 tri-gram )。每个卷积核的输出通过池化层进行降维,通常使用最大值池化 ( max-pooling ),最后各个池化层的输出拼接在一起,送到全连接 softmax 层。

    所以用卷积神经网络对句子序列的建模主要包括:1. 卷积;2. 池化;3. 拼接;4. 全连接。同样的方法也可以运用在用户的行为序列建模中。我们可以复用 MLP 的模型结构,只是在 pooling 层对输入的行为序列使用卷积和池化,其模型结构如图13:

    图13 Convolution on user sequence

    以下伪代码是对上图过程做一个简单描述:

    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    pooling_outputs = []for kernel_size in kernels:     #使用一维卷积,相当于[kernel_size, input_emb_size, 1, output_dimension]二维卷积     conv_out = tf.layers.conv1d(input_emb, kernel_size, output_dimension, strides=1, padding=’VALID’)     #在序列长度维度进行最大值池化     #pool_out的shape变为[batch_size, output_dimension]     pool_out = tf.reduce_max(conv_out, -2)     pooling_outputs.append(pool_out)#所有池化生成的向量进行拼接return tf.concat(pooling_outputs, -1)

    CNN 和 MLP 也可以结合在一起使用,在 pooling 层采用全局的 pooling 提取用户行为序列的全局信息,同时通过卷积提取序列的局部信息,然后将两者拼接在一起作为全连接层的输入,论文[5]中提到的结合 horizontal convolution 和 vertical convolution 的方法即是采用了这种结合全局和局部信息的思想。

    以上的 CNN 序列建模的一个特点是采用多个高度的卷积核来提取序列不同局部范围内的信息,每个高度的卷积只做一层,所以我们可以看做是 wide convolution。在其他领域中,我们也会采用多层的卷积神经网络来对输入的数据信息进行逐层的抽象。那么在序列推荐中,我们也可以使用同样的 deep convolution 来对历史序列信息进行处理,在后面我们会谈及相关的模型。

    ——RNN——

    相对于 MLP 和 CNN 模型进行用户序列建模,循环神经网络 ( RNN ) 也许是相对更为直观的序列网络模型,可以直接去刻画用户兴趣随着时间的演化过程。循环网络可以扩展到更长的序列,相对于前馈神经网络,我们可以在不同的时间步上共享模型参数,同时循环神经网络也可用于在线实时更新。

    利用循环神经网络对用户序列建模可以参见图14:

    图14 RNN序列建模

    其中 R 是展开的循环神经网络单元,可以是普通的 RNN 单元,也可以是 LSTM,GRU 等 advanced 的网络单元。x[1],x[2],... ,x[t] 是用户行为序列每个时间步上用户产生行为物品的 embedding,作为循环神经网络单元的输入,h[1],h[2],... ,h[t] 是每个时间步上循环神经网络单元的输出状态。在时间 t 用户对物品发生行为的概率为:

    其中 h[t-1] 是上一时间步循环神经网络单元的输出状态,x[t] 是时间 t 用户行为的上下文信息,y 是时间 t 的 label 信息 ( 召回:第 t 个时间步用户发生行为物品的 ID;排序:第 t 个时间步用户对各个候选物品的行为的 label ),注意:我们在时间 t 进行预测时,不能将时间 t 的 label 信息 y 用到了模型训练中。

    将循环神经网络运用到用户行为序列建模的一个工作来自论文[7]:将 GRU 模型 ( Gated Recurrent Unit ) 运用到用户会话上下文推荐当中。Youtube 也上线了 RNN 模型[18]并且在模型中融合了推荐的上下文信息来完成视频推荐。图15摘自论文[7],描述序列中每个时间步如何应用 GRU 来预测用户对物品发生行为的概率:

    图15 GRU 建模单元

    序列中第 N 个时间步输入用户行为物品的 ID,ID 通过 embedding 层映射为向量,并进行归一化。embedding 之后经过一个或者多个 GRU 单元最后接一个 softmax 层获取每个物品的预估概率。为了防止梯度消失的问题,采用了残差网络结构,将上一个 GRU 单元的输出与 embedding 层的输出进行相加,作为下一个 GRU 单元的输入。

    论文[7]对建模过程中一些具体的问题进行了讨论,如如何构建批次训练数据,如何构造训练损失函数等,感兴趣读者可以仔细阅读该论文。

    上面基于 GRU 的序列推荐模型是基于物品的 ID 构建模型输入的,如果我们也希望将物品的特征信息以及上下文信息运用到模型中呢?论文[8]谈到了如何在模型中将物品的特征信息与 ID 信息结合在一起使用,如图16:

    图16 combine feature with ID in GRU

    将上图的几种融合方式进行分解:

    第一种也是最直接的方法是在输入端进行融合:将物品的 ID 向量和特征向量拼接为一个输入向量给到一个 GRU 单元:

    图17 combine feature with ID in GRU inputs

    第二种方法是在输出端进行融合:ID 向量和特征向量分别接不同的 GRU,然后将各个 GRU 的输出向量拼接在一起作为最终输出。相比于第一种方法, 这种方法对各个端的特征独立进行建模,在输出端进行拼接后通过后继的全连接层可以隐式加入特征之间的交互。

    图18 combine feature with ID in GRU outputs

    第三种方法中,ID 向量和特征向量还是分别接不同的 GRU 单元,其相对于第二种方法的不同点在于显式考虑了物品 ID 和特征之间的交互。其建立交互的方式是将 ID 对应的 GRU 单元的输出状态与特征向量对应的 GRU 单元的输出状态进行点乘,作为特征部分的 GRU 的状态输出:feature_states = feature_states * id_states。可以理解为在模型中加入 ID 特征与物品特征的 low-rank relationship,从而提高模型的表达能力与泛化性。

    图19 combine feature with ID via dot_product in GRU

    第四种方法,ID 端和特征端的 GRU 输出状态通过一个共享的权重矩阵映射到一个输出状态向量:W * id_states + W * feature_states,相当于 ID 和特征各自的 GRU 输出状态通过带权重的求和方式进行融合,相比于前面三种方法各端的 GRU 输出是拼接在一起输入给后继模型的,各个 GRU 的输出向量不共享参数的,而第四种模型将在各端的模型输出之间共享权重矩阵,这样做的好处是减少模型的参数量,降低过拟合的风险。

    图20 combine feature with ID via shared weight matrix in GRU

    除了 item 信息之外,训练数据中的上下文信息如何集成到 RNN 模型中呢?论文[18]中提供了一种基于 dot product 的方式将上下文信息分别用在了 RNN 单元的输入和输出中,通过 dot product 去 model 用户行为的上下文信息和行为物品信息之间的 low-rank relationship,如下图:

    图21 integrate context into GRU

    图中模型需要预测 τ 步用户会观看哪部视频,采用的是 softmax 分类的方式完成 candidate generation。循环神经网络单元使用的是 GRU,可以看到,用到的特征包括两种:

    1. 第 τ-1 步用户观看视频的物品 feature 和上下文 feature c<τ-1>,两者做 dot product 作为 GRU 层的输入

    2. 第 τ 步的上下文信息 c<τ>,与GRU的输出状态进行点积,作为softmax的输入。文中使用到的上下文信息包括时间,设备,访问页面。上下文信息具体加入的公式是:

    ——Temporal CNN——

    RNN 结构用于序列建模的优点是结构简单,训练和预测的资源占用小,缺点是随着序列变长容易出现梯度消失的问题,同时 RNN 的训练不容易实现并行。前面我们谈了如何在时间序列上运用 CNN 进行输入序列建模,CNN 结构通过矩阵运算的并行性容易实现模型训练的并行化,同时相对不容易出现序列变长后的梯度消失问题。因此我们希望能够像 RNN 一样在整个时间序列上通过 CNN 进行建模,这样便产生了 TCN ( TemporalCNN ) [17]。TCN 采用多层的一维卷积架构在序列长度的维度进行卷积,通过 zero padding 保证每一层的长度相同。TCN 架构结合了 casual convolution ( 因果卷积 ),residual connection ( 残差连接 ) 以及 dilated convolution ( 空洞卷积 ),其特点包括:

    1. 采用因果卷积,保证训练过程中未来的信息不会泄露到过去时间的建模中;

    2. 将任意长度的序列如同 RNN 那样映射为相同长度的输出序列。

    首先我们看看什么是因果卷积,如下图所示,在事件序列中每个时间步 t 的状态输出仅与前一层的 t 时刻以及 t 时刻之前的状态进行卷积:

    图22 TCN causual convolution

    在具体实现因果卷积时,我们可以采用在序列的开头进行补齐的方法保证输出序列的长度与输入序列保持一致,每层输入补齐的长度是:

    如下图所示:

    图23 TCN padding

    代码实现示例:

    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    def conv_with_padding(input_sequence, kernel_size, dilation_rate, output_filters):     padding_size = (kernel_size - 1) * dilation_rate     #在序列的左边补齐     padded_sequence = tf.pad(input_sequence, [[0,0], [padding_size,0], [0,0]])     conv_output = tf.layers.conv1d(padded_sequence, filters=output_filters,                                                       kernel_size=kernel_size, activation=None,                                                       padding=’VALID’, strides=1,                                                       dilated_rate=dilation_rate)     return conv_output

    通过多层的因果卷积网络叠加,高层的感受野的大小与网络层数呈线性关系增加。但是为了捕捉更长的历史信息,我们可以在卷积网络中加入 dilated convolution ( 空洞卷积 )。空洞卷积通过有间隔的采样,通过较少的参数实现随着层数增加而指数级增大的感受野 ( receptive field )。相比原来的正常卷积,dilated convolution 多了一个 hyper-parameter 称之为 dilation rate ,对应 kernel 的采样间隔数量,即传统卷积核相邻之间插入 dilation rate-1 个空洞数。当 rate=1 时,相当于传统的卷积核。

    当 dilation rate = d,kernel size = k 时,位置 i 的实际卷积窗口为:

    其窗口覆盖的范围大小为。空洞卷积的具体计算公式如下:

    其中 g 是卷积函数, 表示只对过去时间的状态进行卷积。

    图24 TCN residual connection

    随着网络层次的加深,多层卷积结构中也可能存在梯度消失的问题,所以在 TCN 中在层与层之间引入了残差 ( residual connection )。如上图所示,一个残差结构块中包括了两个卷积结构,每个卷积结构采用因果卷积和空洞卷积,卷积后的输出进行归一化和非线性化。第二个卷积的输出维度与输入向量的维度有可能不同,因此加入了一个1x1的卷积将输入和输出的维度保持一致。

    后来出现的 Trellis Network[11] 同 TCN 一样属于一种基于一维卷积的特殊时序网络,同样具有因果卷积 ( casual convolution ), 残差结构 ( residual connection ) 的特性,其相对 TCN 的不同点在于:

    1. 所有层之间实现权值共享;

    2. 整个网络的输入序列作为每层输入的一部分。

    从下图 ( 摘自论文[14] ) 可以看到 Trellis Network 的基本结构 ( 图(a) ) 以及如何将基本结构扩展到整个序列 ( 图(b) )。

    图25 Trellis Network Architecture

    TrellisNet 与 RNN 和 CNN 具有紧密的联系,因此 Trellis Network 上也可以运用 CNN 和 RNN 的某些建模技巧,例如:CNN 的大卷积核,空洞卷积,RNN 的 gated unit。关于其详细描述与证明请参见论文[11]。

    ——Self-Attention——

    以上的 RNN 和 TCN 模型在建立序列模型时没有显式的去考虑各个时刻行为之间的相互关系,而各个时刻事件之间的相关性在预测任务中也是比较重要的信息,为了捕获序列中历史事件之间的相互关系,可以使用自注意力机制[12]。文中提出的 Transformer 结构在模型的 Encoder 端通过注意力机制显式计算句子序列中每个单词与其他单词之间的关联,利用层层叠加的自注意力层对每一个词得到其上下文信息的表征。Decoder 端也采用类似的机制,通过 attend 之前 Decode 端的输出以及 Encoder 端的输出产生下一步输出的文字。下图是 Transformer 中的基本 encoder-decoder 的结构:

    图26 Transformer 结构

    那么类似的,在用户行为序列中我们也可以运用上自注意力机制。在模型训练阶段,通过多层的自注意力模块学习序列中各个时刻事件的相互关系,最终输出序列中每个时刻的状态向量。在预测阶段,可以只用序列中最后一个位置的状态向量去表示整个序列的历史信息,如下图所示:

    图27 基于自注意力机制的序列模型示意

    我们对模型中的几个主要部分进行讲解:

    ❶ Position Embedding

    输入序列中的每个物品经过 input embedding layer 生成每个物品的特征向量,为了在自注意力模型中体现序列中事件发生的先后时序关系,通过 positional embedding 将序列中事件的先后顺序映射到向量空间,然后叠加到物品向量中。位置向量的生成方式可以像 transformer 一样用句中每个词在句子中的位置去做 embedding,或者通过正弦和余弦函数让网络能够理解相对位置关系 ( 对于正弦和余弦函数,pos + k 位置的 PE 可以表示成 pos 位置 PE 的一个线性变化 )。如果序列中每个事件都记录了发生的时间,那么我们可以使用事件发生的时间来做 positional embedding ( 先将事件的时间戳进行分桶,然后去做 embedding )。

    ❷ Self-attention Blocks

    假设输入序列经过 embedding 后的向量是 X,X 的维度分别是 [B, L, H],其中 B 表示批处理的大小,L 是序列的长度,H 是隐层大小。输入序列向量经过一个或者多个自注意力模块,最终输出一个跟输入序列长度一样的输出序列:[B, L, H]。通过多个自注意力模块的叠加,逐渐让网络学习到序列中的各个事件之间更复杂的关系,迭代地构建输入序列的整体信息。

    每个自注意力模块如上图所示可以分成两个部分:

    ① Multi-Head Attention

    Multi-Head Attention 中学习事件之间的相互关系。多头 ( Multi-Head ) 类似 CNN 中不同 size 的 kernel,每个 head 对应一个特定的状态子空间,head 之间参数不共享。设置独立的 head 有两个好处:第一个好处是可训练参数更多,各个 head 专注于不同方面的信息,模型更具扩展性;另一个好处是特定 head 捕获输入之间的特定关系,为 Attention 赋予了多个表示子空间,极大提升模型表现能力,这是传统序列模型所不具备的。在实际计算中,我们先在隐层向量维度 ( H ) 切分出 head,然后在各个 head 空间内做 Attention。如下图,我们需要计算第2个事件 attention 后的向量,可以按照图示步骤来完成:

    图28 时刻2的 attention 示意

    上图的核心可以用以下公式来概括:

    其中 Q, K, V 分别是输入 X 分别做线性映射得到的向量,对应 Attention 中的 query, key, value。除以  是因为在 Q,K 的维度比较大的时候,容易进入 softmax 饱和区,进行缩放可以保持梯度的稳定性。

    另外需要注意的是,q2 只与当前以及之前位置即 k1, v1 和 k2, v2 进行 attention。在实际实现中我们可以在  后加上一个 mask 矩阵 M,M 矩阵是一个下三角矩阵,维度是 [B, L,  L],M[b, i, j] 表示序列 b 中第 i 个位置是否能够与第 j 个位置进行 attention:

    M[b, i, j] = 0,表示 i 可以与 j 做 attention,M[b, i, j] = -inf ( 一个很大的负数,eg . -1e9 ),表示 i 不能与 j 做 attention。设置一个很大的负数, + M 经过 softmax 后不能做 attention 的位置则变为0。

    每个 head 输出的 embedding 通过 concat 生成 Multi-Head Attention 的输出。

    ② Position-wise Feed Forward

    Multi-Head Attention 的输出作为 Position-wise Feed-Forward Network 的输入。

    每个 FFN 包括两个全连接层,第一个全连接层运用 ReLu 的激活函数,第二个全连接层是一个线性映射。

    图29 Position-wise Feed Forward

    公式:

    在该公式中, 在每个位置是共享的,各个位置的向量之间不相互作用。在 Multi-Head Attention 中各个 head 内部主要进行线性变换,head 和 head 之间相互独立。在 FFN 层通过非线性全连接网络在 head 信息中引入非线性性,并将各个 head 之间的信息进行关联, 类似于在 Deepfm 中通过 MLP 进行高维度的特征组合。

    ③ LayerNorm & Residual Connection

    在 Multi-Head Attention 和 FFN 的输出中都加入了残差连接和 Layer Normalization。残差连接中将模块的输入加到模型的输出中,以防止随着模块层数加深出现的梯度消失问题。LN 对序列中每个位置的输出状态向量进行标准化,使得输出数据的整体分布更加稳定。自注意力模型中没有使用 Batch Normalzation,因为 BN 受到 batch size,sequence length 等因素的影响,并不适合序列模型。LN 和残差连接使用公式如下:

    ❸ Train

    经过多层自注意力模块后,得到序列的输出向量 O:[B, L, H]。假设输入序列向量为 E:[B, L, H],我们使用点积  计算 O 与 E 的相关度:

    R[b][t] 表示第 b 个序列中第 t 个时间步行为物品 ( positive item ) 的向量与 t 时刻之前位置的输出向量的相关度 ( 取 t-1 时刻来代表t时刻之前位置的信息 ),相当于是将 O 右移了一位,以保证我们用每个时刻之前的信息来预测在该时刻与行为物品的相关度,如图27中我们使用步骤1,2,3的输出状态去预测步骤2,3,4。在t时刻我们可以随机 sample  negative items 然后采用 pairwise rank loss,增大 postivie item 的相关度并减小 negative item 的相关度。

    ❹ Prediction

    预测时,我们取序列的最后一个元素的输出向量 V,待预测的目标物品的向量为 W,使用点积 计算 V 与 W 的相关度:

    predict_score =

    自注意力模型本小节开始已经谈了其优点,能够在长序列上比较好的去建立各个时间之间的相关性,不过模型本身比较复杂,每层计算复杂度比较高,而且模型在数据量较小情况下不容易收敛,效果不一定比 GRU 这类简单模型好,因此在实际应用中需要对数据和工程做比较多的调整和优化。

    ——强化学习——

    这一节我们换个角度去看序列推荐问题。如果我们将用户的行为序列看做是一个顺序的决策过程,那么我们可以用马尔科夫决策过程 ( MDP ) 来表示用户的行为序列。马尔科夫决策过程包含以下几个方面:

    ❶ 状态空间 S

    在t时刻用户的状态 St 定义为用户在 t 时间之前的历史行为,如用户在 t 之前点击过的 N 个物品。马尔科夫决策过程中每个状态具有马尔科夫性,即

    因此序列中用户在各个时刻的状态可以只根据前一时刻的状态得到。

    ❷ 动作空间 A

    动作定义为可以给用户推荐的候选物品空间。agent 的一次推荐相当于在候选物品空间内选择一个或者多个物品返回给用户。

    ❸ 奖励 R

    agent 推荐物品给用户之后,根据用户对推荐列表的反馈 ( 忽略或者点击 ) 来得到 ( 状态-行为 ) 的即时奖励 reward: 

     中 t+1 表示奖励具有延迟性,即在一个时刻发生行为,在下一个时刻收到环境的反馈。

    ❹ 转移概率 P

    用户在 t 时刻的状态为用户最近点击的 N 个物品,定义为 。我们定义

    为用户在 t 时刻对物品 a 产生行为反馈后从状态  转移到状态  的概率。agent 为用户推荐了 K 个物品, 如果用户忽略了推荐的全部物品,那么下一个时刻的状态  和当前的状态保持一致。如果用户点击了其中一个推荐的物品,那么下一个时刻的状态  是在当前状态  的基础上,加入该点击的推荐物品并且将原来的 N 个物品中点击时间最久远的那个物品去掉 ( 可以理解为一个先进先出的队列 )。

    ❺ 折扣因子 

    实际情况下我们希望最大化的是长期回报而不仅是即时奖励。因此t时刻的回报为从该时间起的一个总折扣奖励,即

    折扣因子一般取0到1之间的一个数。

    ❻ 策略

    有了状态和行为,我们会用策略 ( policy ) 来形式化的刻画用户的决策过程。策略描述了用户在某个状态 s 下采取某个行为 a 的概率:

    可以理解为用户在某个时间点的状态 s 下对候选物品 a 产生行为的概率。

    ❼ 值函数

    用值函数来刻画行为的回报。值函数分为两种,一种定义为从一个状态 s 开始的回报期望值:

    它衡量的是从某个状态开始所能得到的累计回报的期望值。另外一种定义为从一个状态 s 开始,采取某个行为 a 后的回报期望值

    对应用户在某个具体状态下采取某个具体行为的累计回报的期望值。至于如何求解  和 ,读者可以参阅相关的强化学习的资料。

    回到序列推荐问题上来,我们的目标是找到一个最优的决策过程 ( policy ) 以最大化整个序列的期望回报:

    求解这个问题我们可以采用的方法包括:value-based 和 policy-based 方法。在实际应用中,由于物品空间一般比较大,采用 value-based 方法计算开销比较大,模型不易收敛,更多情况下会采用 policy-based 方法,如 policy gradient。Policy gradient 中每次策略采取某个动作的概率通过模型 θ 计算:

    目标是求解模型 θ 使得整个行为序列的回报最大化:

     θ 求导:

    其中关键点是求 

    其中  和  跟 θ 无关,那么

     

    其中  对应模型的输出, 对应行为的回报期望。关于 policy gradient 的详细推导请参见[20]。

    接下来需要定义的则是模型 θ 以及奖励 r。t 时刻的奖励 r 是从该时刻开始到将来某个时刻的回报的期望值。在实际应用中,比较直接的是采用 t 时刻的即时回报,如用户是否发生点击行为来作为奖励r,同时可以考虑 t 时刻之后一段时间内用户的反馈行为,如用户的停留时长等。模型 θ 对 t 时刻的用户序列状态进行建模,输出该时刻的用户状态向量。论文[16]中 θ 采用的是 RNN 来对用户行为序列进行建模,如下图所示:

    图30 RNN cell for policy gradient 

    其中 s(t) 是第 t 步的输入状态,来自于第 t-1 步 RNN 单元的输出状态,同时在 t 步用户对推荐物品 a 产生行为,其中 a 对应的 embedding 是 u(a, t),包括 t 时刻物品的 embedding 和 t 时刻的上下文 embedding。将 s(t) 和 u(a, t) 输入第 t 步 RNN 单元的 update gate 和 input gate,产生输出状态 s(t+1):

    根据用户的当前状态采用 sampled softmax 产生候选推荐物品,也就是策略  的输出:

    v(a) 是候选物品的向量,上面这个公式即 youtube DNN 做召回的思想:在实际使用中,用 RNN 的输出状态做 k-nearest neighbor search, 得到一个相对较小的候选集合,然后再在这个候选集合中计算每一个候选物品的概率。

    文[15]中采用的是 off-policy 的 RL ( 相对于 on-policy,off-policy 从不同分布的反馈数据中学习 ),需要考虑 bias correction。关于具体如何对 data bias 进行 correction,可以参看论文。

    ——总结——

    综上所述,把对以上几个模型的一点个人认识归纳如下表,仅供参考:

    至于在具体选型时候,应该选哪个模型用到产品上,个人觉得可以参考以下两个建议:

    1. 找适合业务需求的:根据自身的业务目标,当前的数据量,数据中信息丰富程度,工程架构上的支持,训练成本,上线成本等来折中考虑。

    2. 先选简单的,简单的模型大部分情况下都 work 的比较好。

    读者可以比较工业界和学术界发表的论文即可看出,工业界使用的模型大部分情况下都更简单易扩展,更多注重数据和工程实践。因此在选型时候,可以多参考现有的工业界的成果,快速搭建 baseline 系统,然后再逐渐改进。

    ——参考文献——

    [1] Deep Learning based Recommender System: A Survey and New Perspectives

    [2] Deep learning sequential recommendation systems

    [3] Image Matters: Visually modeling user behaviors using Advanced Model Server

    [4] Deep Interest Network for Click-Through Rate Prediction

    [5] Convolutional Sequence Embedding Recommendation Model

    [6] Convolutional Neural Networks for Sentence Classification

    [7] Session-based recommendations with recurrent neural networks

    [8] Parallel Recurrent Neural Network Architectures for Feature-rich Session-based Recommendations

    [9] Hierarchical question-image co-attention for visual question answering

    [10] An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling

    [11] Trellis Networks for Sequence Modeling

    [12] Attention Is All You Need

    [13] Layer Normalization

    [14] Deep Neural Networks for YouTube Recommendations

    [15] Top-K Off-Policy Correction for a REINFORCE Recommender System

    [16] Latent Cross: Making Use of Context in Recurrent Recommender Systems

    [17] Convolutional sequence modeling revisited

    [18] Learning Deep Structured Semantic Models for Web Search using Clickthrough Data

    [19] ATRank: An Attention-Based User Behavior Modeling Framework for Recommendation

    [20] A blog summarizing policy gradient: 

    https://lilianweng.github.io/lil-log/2018/04/08/policy-gradient-algorithms.html

    [21] Reinforcement Learning for Slate-based Recommender Systems: A Tractable Decomposition and Practical Methodology

    展开全文
  • 近日,在中国北京举办 CIKM 2019 AnalytiCup 中,由来自浙江大学、中央财经大学、阿里巴巴等机构组成的团队 WWG 摘得「用户行为预测」赛道的桂冠。 CIKM 是中国计算机学会(CCF)推荐的数据库/数据挖掘/内容检索...

    近日,在中国北京举办 CIKM 2019 AnalytiCup 中,由来自浙江大学、中央财经大学、阿里巴巴等机构组成的团队 WWG 摘得「用户行为预测」赛道的桂冠。

    CIKM 是中国计算机学会(CCF)推荐的数据库/数据挖掘/内容检索领域的 B 类会议。 CIKM AnalytiCup 挑战赛是会议同期举行的国际数据挖掘比赛,今年由 CIKM、阿里妈妈、阿里巴巴算法大学、阿里云天池共同承办,挑战赛分为两个赛道,用户兴趣高效检索(Efficient User Interests Retrieval)和用户行为多样性预测(Predicting User Behavior Diversities in A Dynamic Interactive Environment)。

    现雷锋网 AI 开发者将 WWG 团队冠军方案整理如下,希望能给开发者们一些经验与启发。

    CIKM 2019 挑战杯「用户行为预测」冠军方案:层次GNN模型在推荐中的应用

     

    冠军团队

    本次冠军团队WWG成员分别来自浙江大学,中央财经大学,阿里巴巴等机构;两位学生孟宪令和焦宇航在阿里巴巴搜索推荐事业部的商业赋能算法团队实习期间,参与了该比赛;比赛过程中,团队负责人李朝博士,以及两位师兄潘旭明和邹朋成在算法的创新和思路上给予了一定的辅导。

    阿里巴巴搜索推荐事业部的商业赋能团队,致力于通过对电商平台的海量用户和商品的精准理解,从需求侧驱动供给侧的新商业赋能,给平台的消费者和卖家都提供更好的服务。

    赛题简介和分析

    基本问题

    根据历史用户-商品交互行为、用户属性和商品属性,对给定用户进行未来点击预测,选出该用户未来三天最可能点击的商品 top50;其中,在复赛中需特别注意一点,即用户历史点击商品并不在未来可能出现的点击商品可选池中。

    评估指标 Recall@50

    CIKM 2019 挑战杯「用户行为预测」冠军方案:层次GNN模型在推荐中的应用

    其中为用户在未来三天内的实际点击商品集合,为用户在未来三天内的预测点击商品集合,此处需要注意,预测点击商品集合的数量需满足,即返回商品数量严格约束为 50 个。

    简要分析

    仅仅看题目描述我们可以发现,这个题目本质上是一个召回预估问题。更具体的,这个问题应该以 u-i 对为输入,经过一定模型的判断,最终给出一个 u-i 对对应的分数,再根据每个 user 对应的 u-i 对分数从大到小的排序,取出 top50 的 item 作为最终得到预测点击商品集合。

    同时,考虑到规模问题,对于千万级别的独立 user 和 item,直接去做全集的 u-i 对预测显然既不现实又不经济,因此我们在结题初期就确定了「初筛-精排」两阶段求解框架,如图 1 所示:

    CIKM 2019 挑战杯「用户行为预测」冠军方案:层次GNN模型在推荐中的应用

    图 1 「初筛-精排」两阶段求解框架

    然而,这个题目的标题为用户行为预测,在赛题官方的描述里也多次提到 Graph 的概念。从这一角度思考,这个问题可以描述为 u-i 二部图的 link prediction 问题,虽然从模型的角度来看可能和刚刚说到的类似,但这一特点似乎在暗示图结构信息在这一比赛当中的重要性。

    因此,我们决定从两个角度对此问题进行分析和求解:传统的基于静态属性信息的统计特征工程,以及基于 u-i 二部图的结构特征工程。

    解题思路

    统计特征的提取在我们的工作中相对简略,因此在本节中,我们着重介绍我们对图结构特征的思考和使用。

    算法动机

    为了可以预测用户未来的点击行为,我们需要对用户和商品进行更为精准的刻画和表达,由于本次赛题的主视角是用户视角(用户会点哪些商品),所以我们认为,解决 u-i 对预测问题的核心思想是:如何更好的表达用户的偏好。即什么样的商品用户会点击,历史的交互行为所传达出来的哪些信息对未来点击的预测是有效的。

    通过对用户的行为进行思考和分析,我们发现用户的偏好存在如下两类的关系:

    • 如果一名用户点击了某个商品,那么该用户对该商品所在类目的商品具有一定程度的偏好,如:iPhone,Mate 30->MI MIX Alpha(智能手机类目);

    • 如果一名用户点击了某个商品,那么该用户对该商品所在主题的商品具有一定程度的偏好,如:沙滩裤,太阳眼镜->防晒霜(沙滩旅行主题)。

    层次关系

    更深入的,我们发现这两类关系存在相对明晰的层次关系,如:

    • 基于类目的层次偏好:iPhone,Mate 30->MI MIX Alpha(智能手机)->Canon EOS 相机(电子产品);

    • 基于用户兴趣主题的层次偏好:沙滩裤,太阳眼镜->防晒霜(沙滩旅行)->运动鞋(户外旅行)。这里的沙滩旅行和户外旅行都是用户兴趣层面的表达。

    这两类偏好关系广泛存在与用户的历史行为中,具体如图 2 所示;因此,如何合理捕捉这两类层次特征,是我们接下来算法的重点。

    CIKM 2019 挑战杯「用户行为预测」冠军方案:层次GNN模型在推荐中的应用

    图 2 层次偏好特征表达示意图

    解决方案

    在接下来的算法中,我们将基于类目的层次偏好称为显式层次偏好,将基于用户兴趣主题的层次偏好称为隐式层次偏好。我们的解决方案一共包含以下四部分:

    CIKM 2019 挑战杯「用户行为预测」冠军方案:层次GNN模型在推荐中的应用

    图 3 解决方案大纲

    数据预处理

    由于数据集本身是存在不同日期,不同交互行为(点击,购买,加购,收藏)的,我们首先通过引入时间衰减因子和行为衰减因子两个超参数,对原始数据集进行处理,并构建完成 user-item 二部图(如图 4)。

    与此同时,也根据 user 特征数据集和 item 特征数据集构建一系列统计特征,以及 user 和 item 的属性特征。

    CIKM 2019 挑战杯「用户行为预测」冠军方案:层次GNN模型在推荐中的应用

    图 4 user-item 二部图

    显式层次特征提取

    显式层次特征主要基于 item-cate-cate1 的层次关系,通过将历史行为与 item 特征进行匹配,可以分别构建出 user-item,user-cate,user-cate1 三张二部图,对三个层次分别实现协同过滤算法,从而得出 user 对不同 item,不同 cate 以及不同 cate1 的相似性得分。我们可以看到显性的层次特征是只有 item 维度的。

    CIKM 2019 挑战杯「用户行为预测」冠军方案:层次GNN模型在推荐中的应用

    图 5 显性层次特征提取

    隐式层次特征提取

    隐式层次特征的提取相对困难,因为兴趣主题并不像类目一样,每个商品并没有被标定一个显式的兴趣主题。为了比较好的解决这一问题,我们提出 Hierarchical Graph Neural Network(HGNN)算法,对图结构进行表达。

    具体的,我们对原始的 u-i 二部图做 GraphSAGE 算法,以具有边的 user,item 的向量表达相似(余弦相似度)为目标(注意,这里严格意义上应该区分两个向量空间,在比赛中我们为了提高效率将两个向量空间的维度设定成了相同的 16 维,因此可以实现余弦相似度的计算),做无监督的 Graph Embedding 训练。待网络稳定后,我们可以得到每个 user 和 item 的向量表达。这一向量即为该 user/item 的一级隐式特征。

    为了表达出层次特性,我们根据 user/item 的一级隐式特征,分别在 user 和 item 的向量空间中做聚类(比赛中采用 K-means 聚类),以聚类簇的平均特征向量作为簇节点的向量,以簇间原始节点关联关系的统计作为簇与簇之间的关联(边)。这样,我们便通过聚类操作,将原始 u-i 二部图粗化,变为了一个以主题用户簇和主题商品簇为节点,节点数量更少的粗化图。对粗化图做和原始 u-i 二部图相同基于 GraphSAGE 的 Graph Embedding 操作,我们便可以得到粗化隐式特征,原始节点的二级隐式特征即为其所属簇的粗化隐式特征。

    对于每个 user/item,将其一级隐式特征和二级隐式特征级联,即得到该节点的隐式层次特征。在实际计算 u-i 对相似度时,将层次隐式特征分级比较即可得到这一部分的相似分。我们可以看到隐性层次特征是既有 user 维度,也有 item 维度的。

    CIKM 2019 挑战杯「用户行为预测」冠军方案:层次GNN模型在推荐中的应用

    图 5 隐性层次特征提取

    排序模型

    在 Candidate Generation 阶段(初筛阶段),我们采用计算效率相对较高的显式层次特征(即采用协同过滤分)对所有商品进行初筛,对每个 user,保留其最有可能点击的 2000 个商品进行 Ranking 阶段的精排。需要注意的是,在初赛中历史商品也可能在未来曝光并被点击,所以历史商品无需特殊处理。而复赛阶段由于历史商品不会在未来曝光,所以复赛阶段在初筛阶段的结尾要对历史出现过的商品做筛除,以避免无效精排。

    Ranking 阶段基本上每个 user 要处理 2000 个左右的商品,因此我们的预测模型选择了相对简单高效的 LR 模型,将前置工作中得到的显式层次特征,隐式层次特征和统计特征进行不同阶的特征交叉后引入 LR 模型后,将 LR 模型的输出作为排序分数, 取分数 top50 作为最终的预测结果进行输出。

    这里交叉特征的引入本质是一个 kernel 函数的思想, 辅助提高了 LR 模型的非线性能力,我们先后采用了显性层次特征和隐性层次特征之间 2 阶的特征交叉以及 3 阶特征交叉; 分别对最后的模型效果有一定提升。

    CIKM 2019 挑战杯「用户行为预测」冠军方案:层次GNN模型在推荐中的应用

    图 6 排序模型图

    成果展示

    以下是我们算法迭代过程中的一些重要节点:

    • version1 基于协同过滤+统计特征

    • version2 基于显性层次特征+统计特征

    • version3 基于显性/隐形层次特征+统计特征

    • version4 基于二阶结构特征交叉+统计特征

    • version5 基于三阶结构特征交叉+统计特征

    CIKM 2019 挑战杯「用户行为预测」冠军方案:层次GNN模型在推荐中的应用

    图 7 重要节点示意图

    可以发现,通过引入层次结构特征,尤其是隐式层次结构特征的提取,我们对这一问题进行了较好的求解,从结论上可以看出,结构特征确实对整个预测准确度带来了较大的性能提升,后续对结构特征信息做了特征交叉之后,性能也有了进一步的提高。

    总结及未来计划

    本次比赛我们尝试了 Hierarchical GNN 模型来获取用户和商品的隐性层次特征,获得了非常不错的效果,由于比赛时间非常有限,我们的排序模型使用了 LR, 以便于快速迭代并调整相应参数,使用了 point-wise 的训练方式。

    如果还有足够的时间,我们还会尝试更多的排序模型,比如 xgboost, deepFM, wide&deep 等,并对模型做相应的融合,再采样 pair-wise 的训练方式,相信还会进一步提升模型效果。

    CIKM 2019 挑战杯「用户行为预测」冠军方案:层次GNN模型在推荐中的应用

    图 8 冠军获奖合影

    更多信息请参考大赛官网:

    https://tianchi.aliyun.com/markets/tianchi/cikm19_en_copy?spm=a2c22.265802.1380778.2.4cdb2b2cFZlc5l&wh_ttid=pc 

    展开全文
  • 这些函数称为特殊成员函数,它们使 C++ 中的简单用户定义类型的行为如同 C 中的结构。也就是说,可以创建、复制和销毁它们而无需任何额外编码工作。C++11 会将移动语义引入语言中,并将移动构造函数和移动
  • 方法利用ABAQUS用户自定义材料程序VUMAT接口,开发用于显式动力分析的梁单元混凝土单轴本构模型,并编制相应的计算程序,对低周往复加载下的钢筋混凝土柱进行数值模拟计算.结果数值模拟结果能够较好地反映轴力对钢筋混...
  • 隐式/显式反馈

    万次阅读 2017-08-24 16:01:57
    推荐系统中用户对物品的反馈分为显式和隐式反馈,’式‘字容易写错,特意将字体加粗… 显式反馈 (如评分、评级) 或单一的隐式反馈 (如浏览、点击、加入购物车) 隐式反馈 (implicit feedback): CTR (Wangchong) ...
  • 主要利用情境感知、用户行为等多维因素建立一种M-C-W用户兴趣模型,提出结合用户显式和隐式兴趣度的计算,挖掘出用户显式兴趣和隐式兴趣的关联性,实现多维动态情境兴趣的结合。通过多角度综合计算用户的兴趣度,...
  • 基于用户行为分析建立用户偏好模型 2013-09-08 18:23 2736 转载:http://zisong.me/post/ji-zhu/ji-yu-yong-hu-xing-wei-fen-xi-jian-li-yong-hu-pian-hao-mo-xing 我们经常将个性化推荐的思想简单地...
  • 一个原因是要区分外部和内部实现,另一个原因是要用其他信息丰富传入的数据或在将数据发送给用户之前过滤掉数据的某些方面。 有几种方法可以实现对象之间的转换: 幼稚的方法 将转换器代码显式添加到该对象: ...
  • 实现基于用户的协同过滤(UserCF)算法,以TopN的推荐方式,分别在显式和隐式反馈数据集中进行评估和比较。 实验采用Grouplens团队提供的公开数据集Movielens-latest-small,包括671个用户对9...
  • 显式禁用每个文件的严格模式declare(strict_types=0); 在脚本的顶部。 可以使用扩展语法declare(strict_types = 0 + 'DEFAULT');设置默认模式declare(strict_types = 0 + 'DEFAULT'); ,由于类型强制,这使其与不...
  • C++类型转换:隐式转换和显式转换

    千次阅读 2020-12-30 20:07:09
    所谓隐式转换,是指不需要用户干预,编译器私下进行的类型转换行为。 例如: short a=2000; int b; b=a; 在这里,a在没有任何显示操作符的干预下,由short类型转换为int类型。这就是标准转换,标准转换将影响...
  • 这是帮助用户入门进行强化学习的指南。 它将涵盖以下主题: :play_button: 机器学习的简介和类型 :play_button: 了解强化学习 :play_button: 学习过程如何运作 :play_button: 强化学习的概念(奖励最大化,探索与...
  • 对象具有状态和行为,变量用来表明对象的状态,方法表明对象所具有的行为。Java 对象的生命周期包括创建、使用和清除,本文详细介绍对象的创建,在 Java 语言中创建对象分显式创建与隐含创建两种情况。 显式创建对象...
  • flex已经越来越成为前端不可避免的话题。曾经为了搞清flex的原理偶然画了一张图。但后来发现只是冰山一角。...似乎有很多人认为在 Flex 布局中这样显式设置即可“一劳永逸”。 但事实是什么?事实是我们都知道
  • 用户画像之概述

    千次阅读 2022-01-18 21:44:06
    2.4.3.问题三:行为动机乱归因 2.4.4.问题四:多目标混合不清 2.4.5.问题五:结果缺少检验 3.应用场景 3.1.精准营销 3.2.数据化运营 3.3. 推荐系统 3.4. 广告投放 3.5. 产品布局 3.6. 行业报告 3.7.场景间...
  • 提出了一种灵活适应不同业务的个性化推荐系统设计方案,采集并分析用户的所有显式行为和隐式行为,结合用户行为配置文件和熵值法分析用户对物品的兴趣度,并引入时间遗忘函数,解决用户兴趣漂移问题,然后基于协同...
  • 推荐系统中的用户偏好

    万次阅读 2017-05-31 17:22:03
    如何根据已有的用户行为和信息,准确地对用户偏好进行预测是一个很重要的问题。用户偏好模型如图所示,我们可以利用用户的行为信息对其偏好进行建模。可以把这些信息分为显式(explicit)行为和隐式(implict)行为。...
  • 显式转换 (288P) 使用关键字 checked 和 unchecked 来设置“ 溢出检测上下文” (291P) checked 和 unchecked 运算符(291P) checked 和 unchecked 语句 (292P) 显式数字转换 (292P) 整数类型到整数类型 ...
  • 1 用户大多具有懒惰性,不愿意对物品进行评级:例如大部分人对购买的物品不愿意给出评价,这体现了一种用户懒惰行为 2 用户可能撒谎或者只给出部分信息:如果某人克服了懒惰性,真的对物品进行评分,该用户也可能...
  • 论文也是探索性质,指出PeterRec这种基于item level的训练方式容易破坏用户表征,或者是一种次优的表征,既然是用户表征就应该基于user level,对用户行为直接做比较学习,论文尝试了常见的显式数据提升方式和隐式的...
  • 本文分享的论文是微信在IJCAI-20发表的《Deep Feedback Network for Recommendation》 ...长用户行为序列建模探索:MIMN 2020-06-14 推荐系统遇上深度学习(八十四)-[阿里]抽取用户多维度兴趣的DHAN网络介绍 2020-06-06
  • 基于用户的协同过滤推荐的基本原理是,根据所有用户对物品或者信息的偏好,发现与当前用户口味和偏好相似的“邻居”用户群。基于邻居的历史偏好信息,为当前用户进行推荐。 即:归类相似用户ABC,推荐用户BC的物品给...
  • 以 Android 12 为目标平台的应用,且包含使用 intent 过滤器的 activity、服务或广播接收器,必须为这些应用组件显式声明 android:exported 属性。 如果 activity、服务或广播接收器使用 intent 过滤器,并且未显式...
  • 嘿,记得给“机器学习与推荐算法”添加星标推荐系统中大多方法仅基于单类行为数据建模,而忽略了真实应用场景中的复杂交互关系。本文提出对用户行为交互关系,以及基于知识信息的商品间复杂关联关系进...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 109,195
精华内容 43,678
热门标签
关键字:

显式 用户行为