推荐系统公平性:解决强化学习中的长期公平性
1 论文创新点
这篇博客我们介绍论文《Towards Long-term Fairness in Recommendation》[1]。因为该论文用到了强化学习(Reinforcement Learning),而强化学习不像之前的生成对抗网络(GAN)一样简洁明了,涉及的数学知识非常多,导致我总共花了将近四天时间才将其理解透彻。
该论文有三个要点:
- 其一是视角独到,在基于强化学习的推荐系统框架上建模,可以保证长期的公平性,而不是像大多数论文一样只保证短期的公平性;
- 其二是将公平性约束做为强化学习中著名的置信域优化算法的一个约束项来处理,简洁明了;
- 其三是公平性约束是线性的,对于模型的参数优化能求得解析解,这样可以大大降低算法的时间复杂度。
2 强化学习背景知识储备
首先,我们基于强化学习的经典著作《Reinforcement learning: An introduction》[2]来对强化学习中的许多基本概念有个初步认知。毕竟将强化学习的背景搞清楚后,整片文章理解起来的速度就会大大加快,毕竟该文章本质上就是在强化学习的策略优化算法(论文采用的的是经典的置信域优化算法)的基础上加一个公平性约束而已。
强化学习的关键思想是马尔可夫决策过程(Markov Decision Processes, MDPs)。一个MDP可以用一个元组\(M=(\mathcal{S}, \mathcal{A},\mathcal{P}, \mathcal{R}, \mu , \gamma )\)来表示,这\(\mathcal{S}\)表示\(n\)个状态\(s\)的集合。\(A\)表示\(m\)个动作\(a\)的集合,\(\mathcal{P}: \mathcal{S}\times \mathcal{A} \times \mathcal{S} \to [0,1]\)表示状态转移函数。对于在经过动作\(a_{t}\)后,由状态\(s_{t}\)转移为状态\(s_{t+1}\)的概率我们可以表示为\(P(s_{t+1}|s_{t}, a_{t})\)。\(\mathcal{R}:\mathcal{S} \times \mathcal{A} \times \mathcal{S} \to \mathbb{R}\)。我们将做出动作\(a_{t}\)后,由状态\(s_{t}\)转移到状态\(s_{t+1}\)而触发的奖励记作\(r(s_{t}, a_{t}, s_{t+1})\),\(\mu: \mathcal{S} \to [0, 1]\)是一个初始状态分布。\(\gamma \in [0, 1)\)是折扣因子。一个固定的策略\(\pi: \mathcal{S} \to \mathcal{P}(\mathcal{A})\)是一个从状态到动作概率分布的映射,\(\pi(a|s)\)表示在状态\(s\)下选择动作\(a\)的概率,我们将所有策略的集合记作\(\prod\)。在强化学习中,我们目标是学习一个策略\(\pi\),它能够最大化无穷时间步的折扣总回报\(J(\pi)\)
这里\(\tau\)表示一个轨迹(trajectory),例如\(\tau=(s_{0}, a_{0}, s_{1}, a_{1}, ...)\),且\(\tau \sim \pi\)是一个简略记法,表示轨迹的分布依靠于\(\pi:s_{0} \sim \mu , a_{t} \sim \pi(\cdot |s_{t}), s_{t+1} \sim P(\cdot | s_{t}, a_{t})\),使\(R(\tau)\)表示从当前\(t\)时刻到回合结束的折扣回报(累计折扣奖励)。
我们将动作价值函数表示为\(Q^{\pi}(s, a)=\mathop{\mathbb{E}}_{\tau \sim \pi}[R(\tau)|s_{0}=s, a_{0}=a]\),状态价值函数表示为\(V_{\pi}(s)= \mathop{\mathbb{E}}_{a_{t}\sim \pi(\cdot|s_{t})}[Q^{\pi}(s, a)] = \mathop{\mathbb{E}}_{\tau \sim \pi}[R(\tau)|s_{0}=s]\),优势函数表示为\(A^{\pi}(s, a)=Q^{\pi}(s, a)-V^{\pi}(s)\)。
3 论文方法介绍
而本篇论文采用了在MDP之上改造的受限马尔可夫决策过程(Constrained Markov Decision Process, CMDP)。CMDP在MDP的基础上添加了一些约束,这些约束限制了MDP所允许的策略。具体而言,MDP被一些辅助的代价函数\(C_{1}, ..., C_{m}\)约束,相应的限制为\(\textbf{d}_{1},..., \textbf{d}_{m}\),这意味着在代价函数上的折扣总代价需要以\(\textbf{d}_{i}\)为上界。类似于传统MDP中的奖励,每个函数\(C_{i}: \mathcal{S} \times \mathcal{A} \times \mathcal{S} \to R\)将状态转换元组(即\((s_{t}, a_{t}, s_{t+1})\))映射到代价。论文中用\(J_{C_{i}}(\pi)\)表示策略\(\pi\)关于代价函数\(C_{i}\)的折扣总代价:
一个CMDP的策略集合是\(\prod_{C} = \{\pi \in \prod: \forall i, J_{C_{i}}(\pi) \leqslant \textbf{d}_{i}\}\),且强化学习在CMDP中的一个任务是找到\(\pi^{*} = \arg\max_{\pi \in \prod_{C}}J(\pi)\),这里\(J(\pi)\)是一个按照等式\((1)\)定义折扣总回报。接着用\(V_{C_{i}}^{\pi}, Q_{C_{i}}^{\pi}\)和\(A_{C_{i}}^{\pi}\)来类比地替代\(V_{\pi}, Q_{\pi}, A_{\pi}\),其中分别用代价函数\(C_{i}\)替代原本的奖励函数\(R\)。
而对于优化策略,论文中采用类似于置信域优化方法的 “受限策略优化”(Constrained Policy Optimization, CPO) 。CPO中的策略迭代形式如下:
这里\(\prod_{\theta} \subset \prod\)是一个参数为\(\theta\)的参数化策略的集合(比如有着固定架构的神经网络)。\(d^{\pi_{k}}\) 是一个在策略\(\pi_{k}\)下的状态分布。\(\overline{D}_{KL}\)表示平均KL散度,这里\(\delta>0\)是步长(置信域半径)。集合\(\{\pi_{\theta} \in \prod_{\theta}: D_{KL}(\pi || \pi_{k}) \leqslant \delta\}\)被称为置信域。特别地,对于只有一个线性约束的问题,只存在一个解析解。这里将式子\((3)\)中的目标函数的梯度表示为\(g\),约束的梯度表示为\(b\),KL散度的Hessian矩阵表示为\(H\),并定义\(c=J_{C}(\pi_{k})-d\),则对式\((3)\)的近似为
就这样,论文通过迭代算法对策略的参数\(\theta\)进行优化。
接下来论文阐述了CMDP在实际推荐中运用的具体细节。在每个时间步\((t_{1}, t_{2}, t_{3}, t_{4}, t_{5})\),用户向推荐系统发送请求,推荐智能体\(G\)会将当前用户的特征表示和候选物品\(\mathcal{I}\)做为输入,并生成推荐物品列表\(L \in \mathcal{I}^{K}\),这里 \(K \geqslant 1\)。用户\(u\)收到了推荐的物品清单\(L\)后会以点击物品的方式给出他(或者她)的反馈\(B\)。因此,状态\(s\)可以用户的特征来表示(比如用户最近的点击历史),动作\(a\)用\(L\)中的物品表示奖励馈\(r\)是在目前状态采取动作\(a\)的即时反馈(比如用户是否点击\(L\)中的物品)。代价\(c\)是即时代价(比如推荐的物品是否来自敏感群组)。这样,可以将强化学习中的各元素和推荐系统中的元素联系起来:
\(\bullet \quad 状态 \mathcal{S}\): 状态\(s_{t}\)是用户最近和推荐系统的正交互历史\(H_{t}\)的表示,以及他(或她)的人口结构信息(如果存在的话)。
\(\bullet \quad 动作 \mathcal{A}\): 动作\(a_{t}=\{a_{t}^{1}, ..., a_{t}^{K}\}\)是一个推荐列表,包括在\(t\)时刻和状态\(s_{t}\)下给用户\(u\)推荐\(K\)个物品的推荐列表。
\(\bullet \quad 奖励 \mathcal{R}\): 给定基于动作\(a_{t}\)和用户状态\(s_{t}\)的推荐,用户会提供他(或者她)的反馈,比如点击、跳过或购买等,推荐系统会依据用户的反馈接收到即时奖励\(R(s_{t}, a_{t})\)。
\(\bullet \quad 代价 \mathcal{C}\): 给定基于动作\(a_{t}\)的推荐,环境给出了基于特定问题的代价函数值(比如推荐列表中来自敏感群组的物品数量),并将该即时代价\(C(s_{t}, a_{t})\)发给推荐系统。
\(\bullet \quad 折扣率 \gamma_{r} 和 \gamma_{c}\): \(\gamma_{r} \in [0, 1]\)是一个用于权衡长期奖励值的因子,\(\gamma_{c} \in [0, 1]\)是另一个权衡长期代价值的因子。
论文中算法的目的是学习最优策略,以最大化在一定的公平性约束下的累计奖励。论文将奖励函数和代价函数定义如下:
这里\(a_{t} = \{a_{t}^{1},\cdots , a_{t}^{K}\}\)代表了包括了\(K\)个物品ID的推荐列表,这些物品由当前策略在时间点\(t\)处选择。在论文中代价函数的表示方式如式\((6)\)所示,表示在时间\(t\),暴露给用户的敏感群组物品总数。根据论文中的描述,有
使\(C\leqslant \alpha^{'}K\)这个约束在每一轮迭代的时候得到满足,就能得到折扣后的总代价
这里\(T\)是推荐系统轨迹的长度,等式\((8)\)是优化问题的群组公平性约束,论文中将不公平性约束的上界\(d\)表示如下
就这样,一旦定义好用于推荐的CMDP及特定的奖励函数(如式\((5)\)所示),代价函数(如式\((6)\)所示)和约束上界\(d\),就可以将它们都带入等式\((4)\)建立公平性限制的策略优化框架。值得注意的是论文中的模型仅仅只包括线性公平性约束。因此,正如之前提到的,求解式\((4)\)能得出解析解(如果问题是可解的)。具体求解框架的细节我们将在下文叙述。
4 论文算法实现细节
接下来我们来看论文算法的实现细节以及该论文的实验结果。以下分模型算法细节实现、数据集、模型评估准则、论文实验结果四个部分来展开叙述。
模型算法细节实现
由论文描述可知,论文算法最核心的部分就是以下带约束优化问题的求解:
该问题被论文作者称为约束策略优化问题。论文中提到该问题具体的求解算法可参考另一篇论文《Constrained policy optimization》[4]。我查阅了另一篇论文,该论文中详细地论证了形如以下问题的求解方法:
这里\(g, b, x \in \mathbb{R}^{n}, c, \delta \in \mathbb{R}, \delta > 0, H \in \mathbb{S}^{n}, \text{且} H \succ 0\)。
该问题是线性目标函数+线性与二次约束的最优化问题,是一个典型的凸优化问题。当至少有一个严格的可行解时,强对偶性得到满足(根据Slater's条件理论)。论文利用强对偶性来求得该问题的解析解。以下是具体推导。先定义拉格朗日函数:
根据拉格朗日对偶性,原始问题的对偶问题是极大极小问题:
先求\(\underset{x}{\min}L(x, \lambda, \nu)\),令\(\nabla_{x}L(x, \lambda, \nu)=0\),解得
将\(x^*\)带入拉格朗日函数,则问题进一步转化为
将该式进行变量替换,令\(q=g^T H^{-1} g, r = g^TH^{-1}b, s=b^TH^{-1} b\),可进一步化简为
又由\(\frac{\partial L(\lambda, \nu)}{\partial \nu} = - \frac{1}{2\lambda}(2r+2\nu s) + c\),由\(\mathbb{R}_{+}\)上的单变量凸二次函数优化理论可以得到
进一步,可将问题转化为
注意,这里\(\Lambda_{a} = \{\lambda | \lambda c - r > 0, \lambda \geqslant 0\}\),\(\Lambda_{b} = \{\lambda | \lambda c - r \leqslant 0, \lambda \geqslant 0\}\)。
于是,综上所述,当至少有一个可行解时,最优解\(x^{*}\)满足
这里\(\lambda^*\)和\(\nu^*\)定义如下
这里 \(q=g^TH^{-1}g, r=g^TH^{-1}b\)且\(s=b^TH^{-1}b\)。
接下来是编程细节部分。首先需要先计算\(q\),\(r\), \(s\)的值。而这需要高效地计算\(H^{-1}g, H^{-1}b\),而对Hessian矩阵求逆的时间复杂度是很高的,这可以通过求解方程组\(Hx_{1}=g,Hx_{2}=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^{-1}g\)和\(H^{-1}b\),从而得到\(q,r,s\)的值。又由原始论文的定义,可知\(c=J_{C}(\pi_{k})-d\)。于是,算法所需要的基础变量\(q\), \(r\), \(s\), \(c\)已经得到,若问题是可解的,即如果\(c^2/s-\delta >0\)且\(c>0\)时,可以使用上面推导的解析公式\((20)\)来计算对偶变量\(\lambda^*\)和\(\nu^*\),然后依照解析公式\((19)\)计算出\(x^*\)。其中计算对偶变量\(\lambda^*\)和\(\nu^*\)的函数实现如下:
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
至此,我们已经介绍了论文算法的核心部分,即策略函数\(\pi\)的参数\(\theta\)如何做到服从约束地更新(尽管我们还没有完整介绍其训练算法的实现)。
接下来我们描述更完整的框架,即强化学习的模型的策略函数\(\pi\)究竟怎样训练。论文中完整的训练算法采用演员-评委模式,其示意图如下图所示:
![演员-评委训练方法示意图](https://images.cnblogs.com/cnblogs_com/blogs/538207/galleries/2040807/o_211201070825_o_211005103657%E5%9B%BE%E7%89%873.png)
其中,演员中的策略函数\(\pi_{\theta}\)、状态价值函数\(V_{\omega}^{\pi}(s_{t})\)、
代价函数\(V_{\phi}^{\pi}(s_{t})\)都由神经网络实现。其中策略函数、状态价值函数和代价函数的参数分别为\(\theta\),\(\omega\),\(\phi\)。
论文构建状态价值函数评委\(V_{\omega}(s_t)\)来近似真实的状态价值函数\(V_{w}^{\pi}(s_{t})\),然后被用于优化演员。评委网络按照时间差分学习来优化,其中需要最小化均方误差(MSE):
这里\(y_{t} = r_{t} + \gamma_{r}V_{w}(s_{t+1})\)。此外,为了提高准确率,我们针对约束策略优化引入了单独的代价函数评委\(V_{\phi}(s)\),并按照与式\((21)\)相似的方式更新:
这里\(y_{t} = c_{t} + \gamma_{c}V_{\phi}(s_{t+1})\)。这样,训练部分的核心算法就可以描述如下面算法所示:
![fcpo算法伪代码](https://images.cnblogs.com/cnblogs_com/blogs/538207/galleries/2040807/o_211201071413_o_211007075901%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F%E5%85%AC%E5%B9%B3%E6%80%A75%E4%BC%AA%E4%BB%A3%E7%A0%81.png)
注意,其中的经验回放(replay) 数据集存储了总共\(T\)个时间步的轨迹,这里从中采样可以得到状态转换五元组\((s_{t}, a_{t}, r_{t}, c_{t}, s_{t+1})\)。注意这里的经验回放数据集需要先对数据进行一遍处理才能得到。
这样,论文的主体算法流程已描述完毕,接下来我们看论文的实验部分。该论文还是和在上一篇论文中一样,采用Movielens-1M数据集中的用户交易数据(包括用户id,物品id, 用户评分,时间戳)来测试该论文提出的FCPO模型。
数据集
论文先按照时间戳的顺序对用户交易数据排序,然后将数据按照4:1的比例划分为训练集和测试集,其中将训练集中每个用户被推送的最后一个物品另外划分为验证集。Movielens-1M数据集的一些基础统计量如下表所示。论文基于人气(比如根据物品的曝光次数)将数据划分为\(G_{0}\)和\(G_{1}\)两个群组。具体地,曝光次数位居前20%的物品属于受欢迎的群组\(G_{0}\),后80%的物品属于长尾群组\(G_{1}\)。
用户数 | 物品数 | 动作数/用户数 | 动作数/物品数 | 动作数 | 密度 |
---|---|---|---|---|---|
6040 | 3706 | 166 | 270 | 1000209 | 4.468 |
此外,对于该基于强化学习的推荐系统,每个用户在训练时的初始状态是在训练集中最先点击的5个物品,在测试时的初始状态是在训练集中最后点击的5个物品。出于简便,论文在这里测试时让RL智能体每次向用户推荐一个物品,不过实际上该算法的推荐列表长度可调整。
模型评估准则
论文采用一些常见的准则,比如召回率、F1-Score等来评估该推荐系统的表现。除了基于模型精准程度的准则,同时也增设了两个公平性的度量:对于物品曝光给特定用户,度量基尼系数;对于物品曝光给特定群组,度量流行比率。基尼系数度量频率分布(比如物品的曝光次数)之间的不公平程度,这可以被视为个体层面的公平性度量。给定来自各物品曝光记录\(\mathcal{M}=[g_{1}, g_{2}, ..., g_{|\mathcal{I}|}]\),基尼系数可以按照式\((23)\)来计算:
这里\(\bar{g}\)代表所有物品曝光次数的平均值。流行比率指的是在推荐列表中流行物品的比例,可以被看做是人气层面的公平性度量。
这两个公平性的度量相比原始推荐系统都更加公平。
测试结果
接下来展示的是论文在Movielens-1M上的测试结果,测试结果如下表所示。这里FCPO-1,FCPO-2和FCPO-3对应的公平性约束的参数分别为\(\alpha^{'}=1, \alpha^{'}=0.8\)且\(\alpha^{'}=0.4\),且假定推荐列表的长度K=5。
方法 | 召回率(%)\(\uparrow\) | F1(%) \(\uparrow\) | 基尼系数(%) \(\downarrow\) | 关注度排名(%) \(\uparrow\) |
---|---|---|---|---|
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.