Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >WWW2021 微信的多目标推荐任务PAPERec

WWW2021 微信的多目标推荐任务PAPERec

作者头像
Houye
发布于 2021-04-22 03:30:33
发布于 2021-04-22 03:30:33
2.7K0
举报
文章被收录于专栏:图与推荐图与推荐

本文基于WWW-2021论文《Personalized Approximate Pareto-Efficient Recommendation》。

导语

真实推荐系统往往会同时关注多种目标,例如点击率、时长、多样性等。多目标优化推荐(multi-objective recommendation (MOR))被广泛研究以解决这类问题。帕累托最优(Pareto efficiency或Pareto Optimality)代表了一种多目标优化任务中的理想状态。在帕累托最优下,多目标中的任何一个目标都不可能在不损害其他目标的前提下进行优化。帕累托优化的标量法(scalarization methods)将模型的多目标损失加权成一个整体损失函数,通过模型更新时同步调整权值实现帕累托优化,目前已运用于多目标推荐中。然而,这些工作往往对所有用户使用同一套目标权值(objective weights),没有考虑到用户对于目标的个性化偏好。

为了实现多目标推荐系统中用户的目标级别的个性化,我们提出了一个新的Personalized Approximate Pareto-Efficient Recommendation (PAPERec)框架,基于Pareto-oriented reinforcement learning模块生成用户的个性化objective weights,帮助模型近似地逼近帕累托最优。我们在微信看一看系统上部署了PAPERec模型,在离线和线上实验的多个目标上均取得最优结果。

一、模型背景与简介

真实世界的推荐系统往往需要同时关注多个目标(例如点击率、时长、多样性、用户留存等),以获得更好的用户口碑和体验。在不同的推荐场景下,系统对于不同目标的关注度也不尽相同。对于新闻推荐系统,时新性往往是系统关注重点,而对于视频推荐系统,用户观看时长又是另一种重要的指标。多目标优化推荐(multi-objective recommendation (MOR))主要着眼于解决推荐系统多目标优化的问题。不同的目标之间往往互有冲突,如何同时优化所有目标成为多目标推荐系统的主要挑战。

近期,帕累托最优(Pareto efficiency)的概率被引入多目标推荐系统中,并取得了良好结果。帕累托最优代表了一种多目标优化任务中的理想状态。在帕累托最优下,多目标中的任何一个目标都不可能在不损害其他目标的前提下进行优化。在帕累托优化模型中,一个经典的方法是基于scalarization method的Multiple gradient descent algorithm (MGDA)模型[1]。scalarization通过一种线性加权的方式,将模型的多目标损失联合成一个整体损失函数。而MGDA算法使用KKT条件进行多目标优化,提出了Pareto stationary point并证明它是Pareto efficiency的必要条件,然后通过调整objective weights优化Pareto stationary point中的最小化问题,保证模型梯度下降方向是朝着帕累托最优的方向。但是,目前绝大多数推荐中的帕累托多目标优化算法使用的是一套所有用户共用的objective weights,忽略了用户对于不同目标的不同偏好度。如下图所示,用户A更加关注视频的时长指标,而用户B更加关注碎片化阅读的点击指标,我们想要在帕累托优化中考虑用户的目标级别的个性化需求,提供更加优质的个性化推荐结果。

图1:用户的目标级别的个性化偏好示例

因此,我们提出了一种个性化近似帕累托最优的多目标推荐框架Personalized Approximate Pareto-Efficient Recommendation (PAPERec)。PAPERec在优化中近似逼近帕累托最优,基于Pareto-oriented reinforcement learning模块生成用户的个性化objective weights,保证了不同用户拥有不同的目标权值。我们基于MGDA中证明的Pareto stationary point相关结论,直接使用其最小化问题——多目标梯度导数加权和的二范数——作为Pareto-oriented RL的reward,用以迭代更新生成objective weights的相关参数。我们将PAPERec部署在微信看一看推荐系统的list-wise推荐模块,在离线和线上实验的多个目标上均取得最优结果。这篇工作的贡献点主要有以下三点:

1、我们提出一种新的个性化近似帕累托最优的多目标推荐框架PAPERec。据我们所知,这是第一个考虑目标权值个性化的帕累托最优推荐模型;

2、我们设计了一种Pareto-oriented RL模块,在真实list-wise推荐系统中通过控制个性化objective weights近似逼近帕累托最优;

3、模型通过大量离线和线上实验,证明了PAPERec的有效性。目前PAPERec正部署于微信看一看系统,服务着海量用户。

二、背景知识

在介绍PAPERec模型之前,我们先简单回顾一下Pareto efficiency相关的经典定义(更多细节请参考[1][2]):

我们基于图2给出一个帕累托优化的直观定义。我们可以说在CTR和Dwell time两个目标下,A dominates C, B dominates C,但是A和B之间没有dominate的关系。这种情况下,帕累托最优希望模型能够从C点开始优化,寻找到帕累托平面上的点(A或者B),使得空间中没有其它situation能够dominate现在的situation。

图2:帕累托最优示例图

在帕累托最优中,scalarization是一个常见的方法。它通过一种线性加权的方式,将模型的多目标损失联合成一个整体损失,具体如下:

需要注意这里的objective weight并不是个性化的。Scalarization方法能够根据weight的变化,使得模型朝向帕累托平面进行优化。MGDA算法提出了Pareto stationary point的概念,并证明它是Pareto efficiency的必要条件(证明详情请参考[1])。寻找Pareto stationary point即可转化为下列优化问题:

MGDA算法证明了:(1)当这个最小化问题的解是0时,这种situation就达到了Pareto stationary point;或者(2)这个最小化问题的解得到的objective weights给出了一个能够同时优化所有目标的帕累托优化方向(详细证明请参考论文[1][2])。我们需要利用这一点,构建PAPERec的核心个性化objective weights的模块,实现个性化近似帕累托算法。

三、具体模型

不失一般性,我们将PAPERec部署在微信看一看list-wise RL推荐模型上(模型结构和AAAI-2021论文[5]类似),同时关注点击率(CTR)和时长(Dwell time, DT)两个目标。为了实现个性化objective weights,我们基于scalarization设置模型的损失函数如下:

需要注意的是,我们在这里设置了个性化的objective weights,由一个Pareto-oriented RL模块控制生成不同user-item pair的objective weights。

具体地,PAPERec包括了两个单目标模型(single-objective model),分别优化CTR和DT,以及一个Pareto-oriented RL模块生成两者的objective weights。整体算法的伪代码如下:在每个batch下,

(1)single-objective models模块计算各个单目标的loss;

(2)基于当前各个单目标的loss,计算Pareto-oriented RL的loss,并以此更新Pareto-oriented RL;

(3)基于更新后的Pareto-oriented RL,计算新的objective weights;

(4)基于新的objective weights更新所有single-objective models。

PAPERec通过这种迭代式地更新,使得模型近似逼近帕累托最优。

Pareto-oriented RL模块是PAPERec的核心模块,负责生成个性化的objective weights。在Pareto-oriented RL模块中,我们设置state,action,reward如下:

其中,state表示当前list的状态(包括list中已经推荐的item的属性和objective weights),action表示产生不同的objective weights这个动作。我们直接基于Pareto stationary point的最小化问题设置了如下reward:

Pareto-oriented RL的优化目标通过reward,转化为最小化list内的多目标梯度导数加权和的二范数。在训练中,如果reward=0时,当前状态为帕累托最优;在其它情况下,objective weights会朝向reward最大(即二范数最小)的方向改变,慢慢接近最小化二范数的解——而这种最小化问题的解被证明是一个符合帕累托优化、能同时提升所有目标的方向。综上所述,在Pareto-oriented RL的reward的指导下,模型能够在理想状态下基于个性化的objective weights,近似朝向帕累托最优的方向优化。

我们在PAPERec中使用了DDPG进行RL的训练。模型使用Transformer和list-wise GRU等对特征交互和序列特征进行建模,具体的模型结构如下:

图3:Pareto-oriented RL模型结构

我们使用了相同结构的feature encoder建立CTR导向和DT导向的单目标模型,整体的loss function融合了RL和单目标模型两个部分:

四、实验结果

我们在微信看一看真实系统上部署了PAPERec模型,并且进行了离线和线上多个实验,其中离线实验的CTR和DT结果如下:

图4:离线实验CTR和DT多目标预测结果

通过下图能够更加清楚看到不同模型之间是否存在domination的关系,可以看到PAPERec取得了最好的DT结果,并且综合结果最佳。

图5:不同模型的多目标结果二维图

最后,我们还在objective-level personalization上进行了定量的研究。我们发现,Top 10% CTR weight的user(可以看做是模型认为这些user更关注CTR)拥有更高的CTR值。在item维度,Top 10% DT weight的item(可以看做是模型认为这些item更加关注时长)拥有更高的DT per click值。另外,我们也探索了item的不同类别对个性化objective weights的影响。我们发现video类别的item在top 10% DT weight中比top 10% CTR weight中更多,这说明video类的item被模型认为时长比点击率更重要(这也符合我们的直觉)——而article和news类别的item则刚刚相反。这一系列定量实验证明了我们的PAPERec模型能够良好地抓住objective-level personalization信息。

五、总结

本文针对多目标推荐任务,提出了一种个性化近似帕累托最优算法PAPERec。模型能够产生个性化的objective weights,并基于Pareto-oriented RL定制的reward函数,通过指导objective weights的变化,引导所有单目标模型的优化,使得模型能够近似朝着帕累托最优的方向优化。现在,PAPERec模型已经部署于微信看一看的线上系统,服务海量用户的个性化推荐需求。目前我们初步探索了基于帕累托最优的多目标推荐系统。我们认为基于帕累托最优的多目标推荐系统同时具有很强的学术研究和工业实用价值,值得进一步探索。

*论文作者是来自腾讯微信的ruobingxie, yanleiliu, modriczhang, rysanwang, xiafengxia, goshawklin

参考文献

[1] Désidéri J A. Multiple-gradient descent algorithm (MGDA) for multiobjective optimization[J]. Comptes Rendus Mathematique, 2012, 350(5-6): 313-318.

[2] Sener O, Koltun V. Multi-task learning as multi-objective optimization[C]. NeurIPS, 2018.

[3] Lin X, Chen H, Pei C, et al. A pareto-efficient algorithm for multiple objective optimization in e-commerce recommendation[C]//Proceedings of the 13th ACM Conference on Recommender Systems. 2019: 20-28.

[4] Xie R, Ling C, Wang Y, et al. Deep Feedback Network for Recommendation[C]. Proceedings of IJCAI-PRICAI, 2020.

[5] Ruobing Xie*, Shaoliang Zhang*, Rui Wang, Feng Xia and Leyu Lin. Hierarchical Reinforcement Learning for Integrated Recommendation[C]. AAAI, 2021.

[6] Guo, Huifeng, et al. "DeepFM: a factorization-machine based neural network for CTR prediction." Proceedings of IJCAI, 2017.

[7] Song, Weiping, et al. "Autoint: Automatic feature interaction learning via self-attentive neural networks." Proceedings of the 28th ACM International Conference on Information and Knowledge Management. 2019.

[8] Ribeiro M T, Ziviani N, Moura E S D, et al. Multiobjective pareto-efficient approaches for recommender systems[J]. ACM Transactions on Intelligent Systems and Technology (TIST), 2014, 5(4): 1-20.

[9] Cheng W, Shen Y, Huang L. Adaptive factorization network: Learning adaptive-order feature interactions[C]//Proceedings of the AAAI Conference on Artificial Intelligence. 2020, 34(04): 3609-3616.

[10] Xiao L, Min Z, Yongfeng Z, et al. Fairness-aware group recommendation with pareto-efficiency[C]//Proceedings of the Eleventh ACM Conference on Recommender Systems. 2017: 107-115.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 图神经网络与推荐系统 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python深浅拷贝
对于字符串str、整数型int、布尔值bool三种不可变的对象类型,深浅拷贝是一样的,直接在内存中直接开辟空间进行存储。
皮大大
2021/03/02
3830
搞定面试之图解Python深拷贝浅拷贝
「引用」:在 Python 程序中,每个对象都会在内存中申请开辟一块空间来保存该对象,该对象在内存中所在位置的地址被称为引用,使用变量名进行指代。
吾非同
2021/01/06
4200
Python基础 | 深浅拷贝问题、递归函数练习
在实际工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题。为了防止数据被修改,就需要在传递一个副本,即使副本被修改,也不会影响原数据的使用。为了生成这个副本,就产生了拷贝。下面先了解一下几个概念:对象、可变类型、引用
叶庭云
2021/12/07
4930
Python基础 | 深浅拷贝问题、递归函数练习
python学习笔记:深浅拷贝的使用和原理
在理解深浅拷贝之前,我们先熟悉下变量对象和数据类型 1.变量和对象 变量-引用-对象(可变对象,不可变对象) 在python中一切都是对象,比如[1,2],'hello world',123,{'k1
用户1679793
2018/04/28
7290
python学习笔记:深浅拷贝的使用和原理
python基础之深浅copy
首先在了解python中的深浅拷贝之前,我们先花一点时间来了解一下python内存中变量的存储情况。对于python而言,变量的存储采用了引用语义的方式,存储的只是一个变量值所在的内存地址,而不是这个变量的本身。
天钧
2019/07/26
3840
一、python学习笔记-基本数据类型-深浅拷贝(一)
"""定义 在Python中对象的赋值其实就是对象的引用。当创建一个对象,把它赋值给另一个变量的时候,python并没有拷贝这个对象,只是拷贝了这个对象的引用而已。 浅拷贝:拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。也就是,把对象复制一遍,但是该对象中引用的其他对象我不复制(快捷方式) 深拷贝:外围和内部元素都进行了拷贝对象本身,而不是引用。也就是,把对象复制一遍,并且该对象中引用的其他对象我也复制。(复制) """ """术语解释 1、变量:是一个系统表的元素,拥有指向对象的连接空间
堕落飞鸟
2022/01/12
2660
​深度解析Python的赋值、浅拷贝、深拷贝
拷贝 就是把原数据复制一份,在复制的数据上随意改动不会影响到其原数据。也就是这里讲的深拷贝。
忆想不到的晖
2021/04/04
5K0
python高级-深浅拷贝(16)
一、浅拷贝 浅拷贝是对一个对象的顶层拷贝,通俗地讲就是:拷贝了引用,并没有拷贝内容。 a = [1,2,3] print(id(a)) b=a print(b) print(id(b)) a.append(4) print(a) print(b) 运行结果为: 1965053928072 [1, 2, 3] 1965053928072 [1, 2, 3, 4] [1, 2, 3, 4] 二、深拷贝 深拷贝是对于一个对象所有层次的拷贝,重新开辟内存地址。 import copy a = [1,2,3] pr
Se7eN_HOU
2019/09/11
3140
Python | Python学习之深浅拷贝
== 是 python 标准操作符中的比较操作符,用来比较判断两个对象的 value(值) 是否相等 。
咸鱼学Python
2019/10/09
4410
Python | Python学习之深浅拷贝
元组、字典、集合的内置方法,散列表、深浅拷贝学习笔记
元组的使用方法(与列表类似):索引取值、索引切片、for循环、成员运算、index获取元素索引、count计数
GH
2022/05/10
3190
元组、字典、集合的内置方法,散列表、深浅拷贝学习笔记
Python深浅拷贝
深浅拷贝分为两部分,一部分是数字和字符串另一部分是列表、元组、字典等其他数据类型。
py3study
2020/01/15
4020
day06(深浅拷贝,元组,字典,集合)
1,今日内容: 1.深浅拷贝:**** 2.元组 - 元组可以存放可变类型 *** 3.字典:***** -- 增删改查 -- 常用方法 4.集合:** -- 集合运算 5.数据类型的相互转化 ******** 6.内存管理 ***** 二,深浅拷贝 ## 拷贝:对值进行复制的过程 # 1,值拷贝:应用场景最多 ls = [1, 'abc', [10]] ls1 = ls # ls1直接将ls中存放的地址拿过来 # ls内部的值发生任何变化,ls1都会随之变化 #2,浅拷贝
py3study
2020/01/16
3750
深拷贝和浅拷贝原来是这样?
为了让读者更好的理解深浅拷贝,在讲深浅拷贝之前要引入基本数据类型 , 引用数据类型 和 数据储存(栈和堆)这几个概念,如果已经理解,可直接跳过这一part。
IT人一直在路上
2019/09/16
4140
由问题入手,步步爬出Python中赋值与拷贝的坑
1、问题的引出 之前遇到了一个求数组中出现次数最多的k个元素的题,我们参照如下的思路进行求解,首先利用一个dict记录所有元素出现的次数,key:value中的key表示元素,value表示元素出现的次数,随后根据元素出现的次数将元素放入对应的桶中,桶是一个二维数组,桶中第一个元素保存出现次数为0的元素,桶中第二个元素保存出现次数为1的元素,依次类推。最后从后往前遍历桶,取出出现次数最多的k个元素即可。 按照这样的思路,我写了如下的代码: class Solution(object): def to
石晓文
2018/04/11
9240
由问题入手,步步爬出Python中赋值与拷贝的坑
JS复习之深浅拷贝
  想掌握JS的深浅拷贝,首先来回顾一下JS的数据类型,JS中数据类型分为基本数据类型和引用数据类型。
huofo
2022/03/18
3980
JS复习之深浅拷贝
js数组的拷贝赋值复制-你真的懂?
在看react-native性能优化的时候,看到如何避免shouldComponentUpdate的异常数据时,脑内一阵风暴,从而牵连出一连串的问题,于是有了这一篇关于js数组的复制(深浅拷贝)与赋值等为何能产生异常数据的文章。 有什么问题欢迎指正 现在进入正题: 首先异常数据的产生在于我们在复制赋值时,会有或没有改变到本身的值。 一、push与concat push的定义是:像数组末尾添加一个或更多元素,并返回新的长度。该方法会改变数组的长度。 concat的定义是:连接两个或更多的数组,并返回结果,该方
IT架构圈
2018/05/31
4.9K0
python学习笔记:第7天 深浅拷贝
join方法是把一个列表中的数据进行拼接,拼接成字符串(与split方法相反,split方法是把一个字符串切割成列表)
py3study
2020/01/20
4160
学习Python一年,这次终于弄懂了浅拷贝和深拷贝
话说,网上已经有很多关于Python浅拷贝和深拷贝的文章了,不过好多文章看起来还是决定似懂非懂,所以决定用自己的理解来写出这样一篇文章。
宇宙之一粟
2020/10/26
6980
学习Python一年,这次终于弄懂了浅拷贝和深拷贝
Python|赋值、浅拷贝与深拷贝
在python中一个变量可以说是内存中一个对象的‘标签’或者‘引用’。假设现在有一个变量a。
算法与编程之美
2019/07/17
7120
Python基础三
不可变的数据类型公用,可变的数据类型重新开辟一个空间,对源数据进行修改,深拷贝的内容不进行改变
changxin7
2019/09/10
1.4K0
相关推荐
Python深浅拷贝
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档