推荐系统公平性:解决强化学习中的长期公平性
1 论文创新点
这篇博客我们介绍论文《Towards Long-term Fairness in Recommendation》[1]。因为该论文用到了强化学习(Reinforcement Learning),而强化学习不像之前的生成对抗网络(GAN)一样简洁明了,涉及的数学知识非常多,导致我总共花了将近四天时间才将其理解透彻。
该论文有三个要点:
- 其一是视角独到,在基于强化学习的推荐系统框架上建模,可以保证长期的公平性,而不是像大多数论文一样只保证短期的公平性;
- 其二是将公平性约束做为强化学习中著名的置信域优化算法的一个约束项来处理,简洁明了;
- 其三是公平性约束是线性的,对于模型的参数优化能求得解析解,这样可以大大降低算法的时间复杂度。
2 强化学习背景知识储备
首先,我们基于强化学习的经典著作《Reinforcement learning: An introduction》[2]来对强化学习中的许多基本概念有个初步认知。毕竟将强化学习的背景搞清楚后,整片文章理解起来的速度就会大大加快,毕竟该文章本质上就是在强化学习的策略优化算法(论文采用的的是经典的置信域优化算法)的基础上加一个公平性约束而已。
强化学习的关键思想是马尔可夫决策过程(Markov Decision Processes, MDPs)。一个MDP可以用一个元组M=(S,A,P,R,μ,γ)M=(S,A,P,R,μ,γ)来表示,这SS表示nn个状态ss的集合。AA表示mm个动作aa的集合,P:S×A×S→[0,1]P:S×A×S→[0,1]表示状态转移函数。对于在经过动作atat后,由状态stst转移为状态st+1st+1的概率我们可以表示为P(st+1|st,at)P(st+1|st,at)。R:S×A×S→RR:S×A×S→R。我们将做出动作atat后,由状态stst转移到状态st+1st+1而触发的奖励记作r(st,at,st+1)r(st,at,st+1),μ:S→[0,1]μ:S→[0,1]是一个初始状态分布。γ∈[0,1)γ∈[0,1)是折扣因子。一个固定的策略π:S→P(A)π:S→P(A)是一个从状态到动作概率分布的映射,π(a|s)π(a|s)表示在状态ss下选择动作aa的概率,我们将所有策略的集合记作∏∏。在强化学习中,我们目标是学习一个策略ππ,它能够最大化无穷时间步的折扣总回报J(π)J(π)
这里ττ表示一个轨迹(trajectory),例如τ=(s0,a0,s1,a1,...)τ=(s0,a0,s1,a1,...),且τ∼πτ∼π是一个简略记法,表示轨迹的分布依靠于π:s0∼μ,at∼π(⋅|st),st+1∼P(⋅|st,at)π:s0∼μ,at∼π(⋅|st),st+1∼P(⋅|st,at),使R(τ)R(τ)表示从当前tt时刻到回合结束的折扣回报(累计折扣奖励)。
我们将动作价值函数表示为Qπ(s,a)=Eτ∼π[R(τ)|s0=s,a0=a]Qπ(s,a)=Eτ∼π[R(τ)|s0=s,a0=a],状态价值函数表示为Vπ(s)=Eat∼π(⋅|st)[Qπ(s,a)]=Eτ∼π[R(τ)|s0=s]Vπ(s)=Eat∼π(⋅|st)[Qπ(s,a)]=Eτ∼π[R(τ)|s0=s],优势函数表示为Aπ(s,a)=Qπ(s,a)−Vπ(s)Aπ(s,a)=Qπ(s,a)−Vπ(s)。
3 论文方法介绍
而本篇论文采用了在MDP之上改造的受限马尔可夫决策过程(Constrained Markov Decision Process, CMDP)。CMDP在MDP的基础上添加了一些约束,这些约束限制了MDP所允许的策略。具体而言,MDP被一些辅助的代价函数C1,...,CmC1,...,Cm约束,相应的限制为d1,...,dmd1,...,dm,这意味着在代价函数上的折扣总代价需要以didi为上界。类似于传统MDP中的奖励,每个函数Ci:S×A×S→RCi:S×A×S→R将状态转换元组(即(st,at,st+1)(st,at,st+1))映射到代价。论文中用JCi(π)JCi(π)表示策略ππ关于代价函数CiCi的折扣总代价:
一个CMDP的策略集合是∏C={π∈∏:∀i,JCi(π)⩽di}∏C={π∈∏:∀i,JCi(π)⩽di},且强化学习在CMDP中的一个任务是找到π∗=argmaxπ∈∏CJ(π)π∗=argmaxπ∈∏CJ(π),这里J(π)J(π)是一个按照等式(1)(1)定义折扣总回报。接着用VπCi,QπCiVπCi,QπCi和AπCiAπCi来类比地替代Vπ,Qπ,AπVπ,Qπ,Aπ,其中分别用代价函数CiCi替代原本的奖励函数RR。
而对于优化策略,论文中采用类似于置信域优化方法的 “受限策略优化”(Constrained Policy Optimization, CPO) 。CPO中的策略迭代形式如下:
这里∏θ⊂∏∏θ⊂∏是一个参数为θθ的参数化策略的集合(比如有着固定架构的神经网络)。dπkdπk 是一个在策略πkπk下的状态分布。¯DKL¯¯¯¯¯DKL表示平均KL散度,这里δ>0δ>0是步长(置信域半径)。集合{πθ∈∏θ:DKL(π||πk)⩽δ}{πθ∈∏θ:DKL(π||πk)⩽δ}被称为置信域。特别地,对于只有一个线性约束的问题,只存在一个解析解。这里将式子(3)(3)中的目标函数的梯度表示为gg,约束的梯度表示为bb,KL散度的Hessian矩阵表示为HH,并定义c=JC(πk)−dc=JC(πk)−d,则对式(3)(3)的近似为
就这样,论文通过迭代算法对策略的参数θθ进行优化。
接下来论文阐述了CMDP在实际推荐中运用的具体细节。在每个时间步(t1,t2,t3,t4,t5)(t1,t2,t3,t4,t5),用户向推荐系统发送请求,推荐智能体GG会将当前用户的特征表示和候选物品II做为输入,并生成推荐物品列表L∈IKL∈IK,这里 K⩾1K⩾1。用户uu收到了推荐的物品清单LL后会以点击物品的方式给出他(或者她)的反馈BB。因此,状态ss可以用户的特征来表示(比如用户最近的点击历史),动作aa用LL中的物品表示奖励馈rr是在目前状态采取动作aa的即时反馈(比如用户是否点击LL中的物品)。代价cc是即时代价(比如推荐的物品是否来自敏感群组)。这样,可以将强化学习中的各元素和推荐系统中的元素联系起来:
∙状态S∙状态S: 状态stst是用户最近和推荐系统的正交互历史HtHt的表示,以及他(或她)的人口结构信息(如果存在的话)。
∙动作A∙动作A: 动作at={a1t,...,aKt}at={a1t,...,aKt}是一个推荐列表,包括在tt时刻和状态stst下给用户uu推荐KK个物品的推荐列表。
∙奖励R∙奖励R: 给定基于动作atat和用户状态stst的推荐,用户会提供他(或者她)的反馈,比如点击、跳过或购买等,推荐系统会依据用户的反馈接收到即时奖励R(st,at)R(st,at)。
∙代价C∙代价C: 给定基于动作atat的推荐,环境给出了基于特定问题的代价函数值(比如推荐列表中来自敏感群组的物品数量),并将该即时代价C(st,at)C(st,at)发给推荐系统。
∙折扣率γr和γc∙折扣率γr和γc: γr∈[0,1]γr∈[0,1]是一个用于权衡长期奖励值的因子,γc∈[0,1]γc∈[0,1]是另一个权衡长期代价值的因子。
论文中算法的目的是学习最优策略,以最大化在一定的公平性约束下的累计奖励。论文将奖励函数和代价函数定义如下:
这里at={a1t,⋯,aKt}at={a1t,⋯,aKt}代表了包括了KK个物品ID的推荐列表,这些物品由当前策略在时间点tt处选择。在论文中代价函数的表示方式如式(6)(6)所示,表示在时间tt,暴露给用户的敏感群组物品总数。根据论文中的描述,有
使C⩽α′KC⩽α′K这个约束在每一轮迭代的时候得到满足,就能得到折扣后的总代价
这里TT是推荐系统轨迹的长度,等式(8)(8)是优化问题的群组公平性约束,论文中将不公平性约束的上界dd表示如下
就这样,一旦定义好用于推荐的CMDP及特定的奖励函数(如式(5)(5)所示),代价函数(如式(6)(6)所示)和约束上界dd,就可以将它们都带入等式(4)(4)建立公平性限制的策略优化框架。值得注意的是论文中的模型仅仅只包括线性公平性约束。因此,正如之前提到的,求解式(4)(4)能得出解析解(如果问题是可解的)。具体求解框架的细节我们将在下文叙述。
4 论文算法实现细节
接下来我们来看论文算法的实现细节以及该论文的实验结果。以下分模型算法细节实现、数据集、模型评估准则、论文实验结果四个部分来展开叙述。
模型算法细节实现
由论文描述可知,论文算法最核心的部分就是以下带约束优化问题的求解:
该问题被论文作者称为约束策略优化问题。论文中提到该问题具体的求解算法可参考另一篇论文《Constrained policy optimization》[4]。我查阅了另一篇论文,该论文中详细地论证了形如以下问题的求解方法:
这里g,b,x∈Rn,c,δ∈R,δ>0,H∈Sn,且H≻0g,b,x∈Rn,c,δ∈R,δ>0,H∈Sn,且H≻0。
该问题是线性目标函数+线性与二次约束的最优化问题,是一个典型的凸优化问题。当至少有一个严格的可行解时,强对偶性得到满足(根据Slater's条件理论)。论文利用强对偶性来求得该问题的解析解。以下是具体推导。先定义拉格朗日函数:
根据拉格朗日对偶性,原始问题的对偶问题是极大极小问题:
先求minxL(x,λ,ν)minxL(x,λ,ν),令∇xL(x,λ,ν)=0∇xL(x,λ,ν)=0,解得
将x∗x∗带入拉格朗日函数,则问题进一步转化为
将该式进行变量替换,令q=gTH−1g,r=gTH−1b,s=bTH−1bq=gTH−1g,r=gTH−1b,s=bTH−1b,可进一步化简为
又由∂L(λ,ν)∂ν=−12λ(2r+2νs)+c∂L(λ,ν)∂ν=−12λ(2r+2νs)+c,由R+R+上的单变量凸二次函数优化理论可以得到
进一步,可将问题转化为
注意,这里Λa={λ|λc−r>0,λ⩾0},Λb={λ|λc−r⩽0,λ⩾0}。
于是,综上所述,当至少有一个可行解时,最优解x∗满足
这里λ∗和ν∗定义如下
这里 q=gTH−1g,r=gTH−1b且s=bTH−1b。
接下来是编程细节部分。首先需要先计算q,r, s的值。而这需要高效地计算H−1g,H−1b,而对Hessian矩阵求逆的时间复杂度是很高的,这可以通过求解方程组Hx1=g,Hx2=b来实现。但Hessian矩阵很可能是稀疏的,这进一步加大了求解难度,因此论文采用共轭梯度法来完成方程组的求解,具体实现代码如下:
def cg_solver(Avp_fun, b, device, max_iter=10):
device = device
x = torch.zeros_like(b).to(device)
r = b.clone()
p = b.clone()
for i in range(max_iter):
Avp = Avp_fun(p, retain_graph=True)
alpha = torch.matmul(r, r) / torch.matmul(p, Avp)
x += alpha * p
if i == max_iter - 1:
return x
r_new = r - alpha * Avp
beta = torch.matmul(r_new, r_new) / torch.matmul(r, r
r = r_new
p = r + beta * p
注意,这里按照共轭梯度法求解方程Ax=b时,中途有一个步骤需要计算A和搜索方向向量p的乘积Ap,这里论文代码采用了专用的函数实现,且将该函数定义为一个函数闭包(这里用到了Python的语言特性,可以参见我的博客《Python:闭包和保存自由变量》,在这里闭包内层定义的变量对外界完全隔离,具体实现如下:
def get_Hvp_fun(functional_output, inputs, damping_coef=0.0):
inputs = list(inputs)
grad_f = flat_grad(functional_output, inputs, create_graph=True)
def Hvp_fun(v, retain_graph=True):
gvp = torch.matmul(grad_f, v)
Hvp = flat_grad(gvp, inputs, retain_graph=retain_graph)
Hvp += damping_coef * v
return Hvp
return Hvp_fun
这样高效地计算出了H−1g和H−1b,从而得到q,r,s的值。又由原始论文的定义,可知c=JC(πk)−d。于是,算法所需要的基础变量q, r, s, c已经得到,若问题是可解的,即如果c2/s−δ>0且c>0时,可以使用上面推导的解析公式(20)来计算对偶变量λ∗和ν∗,然后依照解析公式(19)计算出x∗。其中计算对偶变量λ∗和ν∗的函数实现如下:
def calc_dual_vars(self, q, r, s, c):
if c < 0.0 and c ** 2 / s - 2 * self.max_kl > 0.0:
lam = torch.sqrt(q / (2 * self.max_kl))
nu = 0.0
return lam, nu
A = q - r ** 2 / s
B = 2 * self.max_kl - c ** 2 / s
lam_mid = r / c
# lam_a*
lam_a = torch.sqrt(A / B)
# lam_b*
lam_b = torch.sqrt(q / (2 * self.max_kl))
f_mid = -0.5 * (q / lam_mid + 2 * lam_mid * self.max_kl)
f_a = -torch.sqrt(A * B) - r * c / s
f_b = -torch.sqrt(2 * q * self.max_kl)
if lam_mid > 0:
if c < 0:
if lam_a > lam_mid:
lam_a = lam_mid
f_a = f_mid
if lam_b < lam_mid:
lam_b = lam_mid
f_b = f_mid
else:
if lam_a < lam_mid:
lam_a = lam_mid
f_a = f_mid
if lam_b > lam_mid:
lam_b = lam_mid
f_b = f_mid
else:
if c < 0:
lam = lam_b
else:
lam = lam_a
# lam*
lam = lam_a if f_a >= f_b else lam_b
# v*
nu = max(0.0, (lam * c - r) / s)
return lam, nu
至此,我们已经介绍了论文算法的核心部分,即策略函数π的参数θ如何做到服从约束地更新(尽管我们还没有完整介绍其训练算法的实现)。
接下来我们描述更完整的框架,即强化学习的模型的策略函数π究竟怎样训练。论文中完整的训练算法采用演员-评委模式,其示意图如下图所示:

其中,演员中的策略函数πθ、状态价值函数Vπω(st)、
代价函数Vπϕ(st)都由神经网络实现。其中策略函数、状态价值函数和代价函数的参数分别为θ,ω,ϕ。
论文构建状态价值函数评委Vω(st)来近似真实的状态价值函数Vπw(st),然后被用于优化演员。评委网络按照时间差分学习来优化,其中需要最小化均方误差(MSE):
这里yt=rt+γrVw(st+1)。此外,为了提高准确率,我们针对约束策略优化引入了单独的代价函数评委Vϕ(s),并按照与式(21)相似的方式更新:
这里yt=ct+γcVϕ(st+1)。这样,训练部分的核心算法就可以描述如下面算法所示:

注意,其中的经验回放(replay) 数据集存储了总共T个时间步的轨迹,这里从中采样可以得到状态转换五元组(st,at,rt,ct,st+1)。注意这里的经验回放数据集需要先对数据进行一遍处理才能得到。
这样,论文的主体算法流程已描述完毕,接下来我们看论文的实验部分。该论文还是和在上一篇论文中一样,采用Movielens-1M数据集中的用户交易数据(包括用户id,物品id, 用户评分,时间戳)来测试该论文提出的FCPO模型。
数据集
论文先按照时间戳的顺序对用户交易数据排序,然后将数据按照4:1的比例划分为训练集和测试集,其中将训练集中每个用户被推送的最后一个物品另外划分为验证集。Movielens-1M数据集的一些基础统计量如下表所示。论文基于人气(比如根据物品的曝光次数)将数据划分为G0和G1两个群组。具体地,曝光次数位居前20%的物品属于受欢迎的群组G0,后80%的物品属于长尾群组G1。
用户数 | 物品数 | 动作数/用户数 | 动作数/物品数 | 动作数 | 密度 |
---|---|---|---|---|---|
6040 | 3706 | 166 | 270 | 1000209 | 4.468 |
此外,对于该基于强化学习的推荐系统,每个用户在训练时的初始状态是在训练集中最先点击的5个物品,在测试时的初始状态是在训练集中最后点击的5个物品。出于简便,论文在这里测试时让RL智能体每次向用户推荐一个物品,不过实际上该算法的推荐列表长度可调整。
模型评估准则
论文采用一些常见的准则,比如召回率、F1-Score等来评估该推荐系统的表现。除了基于模型精准程度的准则,同时也增设了两个公平性的度量:对于物品曝光给特定用户,度量基尼系数;对于物品曝光给特定群组,度量流行比率。基尼系数度量频率分布(比如物品的曝光次数)之间的不公平程度,这可以被视为个体层面的公平性度量。给定来自各物品曝光记录M=[g1,g2,...,g|I|],基尼系数可以按照式(23)来计算:
这里ˉg代表所有物品曝光次数的平均值。流行比率指的是在推荐列表中流行物品的比例,可以被看做是人气层面的公平性度量。
这两个公平性的度量相比原始推荐系统都更加公平。
测试结果
接下来展示的是论文在Movielens-1M上的测试结果,测试结果如下表所示。这里FCPO-1,FCPO-2和FCPO-3对应的公平性约束的参数分别为α′=1,α′=0.8且α′=0.4,且假定推荐列表的长度K=5。
方法 | 召回率(%)↑ | F1(%) ↑ | 基尼系数(%) ↓ | 关注度排名(%) ↑ |
---|---|---|---|---|
FCPO-1 | 2.033 | 2.668 | 99.81 | 99.28 |
FCPO-2 | 1.520 | 2.015 | 99.47 | 99.28 |
FCPO-3 | 0.998 | 1.449 | 99.47 | 99.28 |
参考
- [1] Ge Y, Liu S, Gao R, et al. Towards Long-term Fairness in Recommendation[C]//Proceedings of the 14th ACM International Conference on Web Search and Data Mining. 2021: 445-453.
- [2] Sutton R S, Barto A G. Reinforcement learning: An introduction[M]. MIT press, 2018.
- [3] Singh A, Joachims T. Fairness of exposure in rankings[C]//Proceedings of the 24th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining. 2018: 2219-2228.
- [4] Achiam J, Held D, Tamar A, et al. Constrained policy optimization[C]//International Conference on Machine Learning. PMLR, 2017: 22-31.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~