Stanford斯坦福 CS 224R: 深度强化学习 (6)

CS 224R 离线强化学习:第二部分

课程介绍请看第一节内容

课程回顾

离线强化学习、数据约束和保守性

离线强化学习旨在利用离线数据,重复使用离线数据是有益的。其关键挑战是由于 π β \pi_\beta πβ π θ \pi_\theta πθ 之间的偏移导致对Q值的高估。

有两种方法来约束数据:

  1. 通过显式建模 π β \pi_\beta πβ 来约束数据
    • 直观,但在实践中通常过于保守
  2. 通过惩罚Q值来隐式约束数据
    • 简单,实践中效果良好,但需要调整 α \alpha α 参数

轨迹拼接允许离线强化学习方法改进模仿学习的效果。

为什么要使用离线强化学习而不是模仿学习?

离线数据可能并不是最优的。离线强化学习可以利用奖励信息来超越行为策略的表现。好的离线强化学习方法可以拼接良好的行为。(回顾:模仿方法无法超越专家。)

离线强化学习方法可以学习从 s 1 s_1 s1 s 9 s_9 s9 的策略。

再探模仿学习在离线强化学习中的应用

加权模仿学习

如果我们有奖励标签:是否只模仿好的轨迹?

过滤行为克隆(Filtered Behavior Cloning):

  1. 按回报对轨迹排序
  2. 过滤数据集以包含前 k % k\% k% 的数据
  3. 模仿过滤后的数据集:

r ( τ ) = ∑ ( s t , a t ) ∈ τ r ( s t , a t ) D ~ : { τ ∣ r ( τ ) > η } max ⁡ π ∑ ( s , a ) ∈ D ~ log ⁡ π ( a ∣ s ) \begin{aligned} r(\tau) &= \sum_{(s_t,a_t)\in\tau} r(s_t, a_t) \\ \tilde{D} &: \{\tau \mid r(\tau) > \eta\} \\ \max_\pi &\sum_{(s,a)\in \tilde{D}} \log \pi(a \mid s) \end{aligned} r(τ)D~πmax=(st,at)τr(st,at):{τr(τ)>η}(s,a)D~logπ(as)

这是一种非常原始的利用奖励信息的方法,因此是一个很好的测试基准。

更好的加权模仿学习方法是什么?我们能否根据动作的优劣来加权每个转移?

如何衡量一个动作的优劣?回想一下优势函数 A A A

θ ← arg ⁡ max ⁡ θ E s , a ∼ D [ log ⁡ π θ ( a ∣ s ) exp ⁡ ( A ( s , a ) ) ] \theta \leftarrow \arg\max_\theta \mathbb{E}_{s,a\sim D} [\log \pi_\theta(a \mid s)\exp(A(s, a))] θargθmaxEs,aD[logπθ(as)exp(A(s,a))]

关键问题:如何估计优势函数?

优势加权回归(Advantage-Weighted Regression, AWR)

AWR算法如下:

  1. 拟合价值函数:

V ^ π β ( s ) ← arg ⁡ min ⁡ V E ( s , a ) ∼ D [ ( R s , a − V ( s ) ) 2 ] \hat{V}_{\pi_\beta}(s) \leftarrow \arg\min_V \mathbb{E}_{(s,a)\sim D} \left[ \left(R_{s,a} - V(s)\right)^2 \right] V^πβ(s)argVminE(s,a)D[(Rs,aV(s))2]

  1. 训练策略:

π ^ ← arg ⁡ max ⁡ π E s , a ∼ D [ log ⁡ π ( a ∣ s ) exp ⁡ ( 1 α ( R s , a − V ^ π β ( s ) ) ) ] \hat{\pi} \leftarrow \arg\max_\pi \mathbb{E}_{s,a\sim D} \left[ \log \pi(a \mid s)\exp \left(\frac{1}{\alpha} \left(R_{s,a} - \hat{V}_{\pi_\beta}(s)\right)\right) \right] π^argπmaxEs,aD[logπ(as)exp(α1(Rs,aV^πβ(s)))]

其中 α \alpha α 是超参数。

优点:

  • 避免查询或训练任何分布外(OOD)的动作
  • 简单

缺点:

  • 蒙特卡洛估计有噪声
  • 假设策略弱于 A ^ π β \hat{A}_{\pi_\beta} A^πβ

参考文献:

  • Peng, Kumar, Zhang, Levine. Advantage-Weighted Regression. ArXiv’19.

是否可以使用时间差分(TD)更新而不是蒙特卡洛来估计优势函数?

  1. 估计Q函数:

min ⁡ Q E ( s , a , s ′ ) ∼ D [ ( Q ( s , a ) − ( r + γ E a ′ ∼ π ( ⋅ ∣ s ) [ Q ( s ′ , a ′ ) ] ) ) 2 ] \min_Q \mathbb{E}_{(s,a,s')\sim D} \left[ \left(Q(s, a) - \left(r + \gamma\mathbb{E}_{a'\sim\pi(\cdot|s)}[Q(s', a')]\right)\right)^2 \right] QminE(s,a,s)D[(Q(s,a)(r+γEaπ(s)[Q(s,a)]))2]

  1. 估计优势函数:

A ^ π ( s , a ) = Q ^ π ( s , a ) − E a ˉ ∼ π ( ⋅ ∣ s ) [ Q ^ π ( s , a ˉ ) ] \hat{A}_\pi(s, a) = \hat{Q}_\pi(s, a) - \mathbb{E}_{\bar{a}\sim\pi(\cdot|s)}[\hat{Q}_\pi(s, \bar{a})] A^π(s,a)=Q^π(s,a)Eaˉπ(s)[Q^π(s,aˉ)]

这被称为"优势加权行动者-评论家"(Advantage Weighted Actor Critic)。

  1. 像之前一样更新策略:

π ^ ← arg ⁡ max ⁡ π E s , a ∼ D [ log ⁡ π ( a ∣ s ) exp ⁡ ( 1 α A ^ π ( s , a ) ) ] \hat{\pi} \leftarrow \arg\max_\pi \mathbb{E}_{s,a\sim D} \left[ \log \pi(a \mid s)\exp \left(\frac{1}{\alpha}\hat{A}_\pi(s, a)\right) \right] π^argπmaxEs,aD[logπ(as)exp(α1A^π(s,a))]

可能出现的问题:

  • 可能会查询OOD动作
  • 策略仍然只在数据中的动作上训练

参考文献:

  • Nair, Gupta, Dalal, Levine. AWAC. ArXiv’20.
  • Wang et al. Critic Regularized Regression. NeurIPS’20.
隐式Q学习(Implicit Q-Learning, IQL)

我们想使用TD更新来估计优势函数,而不查询OOD动作。

SARSA更新:

Q ^ π β ← arg ⁡ min ⁡ Q E ( s , a , s ′ , a ′ ) ∼ D [ ( Q ( s , a ) − ( r + γ Q ( s ′ , a ′ ) ) ) 2 ] \hat{Q}_{\pi_\beta} \leftarrow \arg\min_Q \mathbb{E}_{(s,a,s',a')\sim D} \left[ \left(Q(s, a) - \left(r + \gamma Q(s', a')\right)\right)^2 \right] Q^πβargQminE(s,a,s,a)D[(Q(s,a)(r+γQ(s,a)))2]

这给出了 V π β ( s ′ ) V_{\pi_\beta}(s') Vπβ(s) 的样本。

我们能否估计一个比 π β \pi_\beta πβ 更好的策略的Q函数?

IQL算法如下:

  1. 用expectile损失拟合Q函数:

Q ^ ( s , a ) ← arg ⁡ min ⁡ Q E ( s , a , s ′ ) ∼ D [ ( Q ( s , a ) − ( r + γ V ^ ( s ′ ) ) ) 2 ] \hat{Q}(s, a) \leftarrow \arg\min_Q \mathbb{E}_{(s,a,s')\sim D} \left[ \left(Q(s, a) - \left(r + \gamma \hat{V}(s')\right)\right)^2 \right] Q^(s,a)argQminE(s,a,s)D[(Q(s,a)(r+γV^(s)))2]

  1. 用expectile损失拟合V函数:

V ^ ( s ) ← arg ⁡ min ⁡ V E ( s , a ) ∼ D [ ℓ τ 2 ( V ( s ) − Q ^ ( s , a ) ) ] \hat{V}(s) \leftarrow \arg\min_V \mathbb{E}_{(s,a)\sim D} \left[ \ell_\tau^2 \left(V(s) - \hat{Q}(s, a)\right) \right] V^(s)argVminE(s,a)D[τ2(V(s)Q^(s,a))]

其中 ℓ τ 2 \ell_\tau^2 τ2 是assymetric MSE损失, τ < 0.5 \tau < 0.5 τ<0.5

  1. 用AWR提取策略:

π ^ ← arg ⁡ max ⁡ π E s , a ∼ D [ log ⁡ π ( a ∣ s ) exp ⁡ ( 1 α ( Q ^ ( s , a ) − V ^ ( s ) ) ) ] \hat{\pi} \leftarrow \arg\max_\pi \mathbb{E}_{s,a\sim D} \left[ \log \pi(a \mid s)\exp \left(\frac{1}{\alpha} \left(\hat{Q}(s, a) - \hat{V}(s)\right)\right) \right] π^argπmaxEs,aD[logπ(as)exp(α1(Q^(s,a)V^(s)))]

优点:

  • 无需查询OOD动作
  • 解耦行动者和评论家训练,计算速度快
  • 策略(仍然)只在数据中的动作上训练

参考文献:

  • Kostrikov, Nair, Levine. Implicit Q-Learning. ICLR’22.

条件模仿学习

回顾过滤行为克隆(Filtered Behavior Cloning):如果我们有奖励标签,是否只模仿好的轨迹?

对于某些数据集,过滤的行为克隆实际上可以很好地工作。但如果我们觉得丢弃数据不好怎么办?

回报条件策略(Return-Conditioned Policies)

也称为:倒置强化学习(Upside-Down RL)、奖励条件策略(Reward-Conditioned Policies)、决策变换器(Decision Transformers)。

  1. 模仿整个数据集:

max ⁡ π ∑ ( s , a ) ∈ D log ⁡ π ( a ∣ s , R s , a ) \max_\pi \sum_{(s,a)\in D} \log \pi(a \mid s, R_{s,a}) πmax(s,a)Dlogπ(as,Rs,a)

将策略以经验回报为条件。

优点:

  • 在测试时传入高回报
  • 可以使用序列模型

缺点:

  • 策略将学会模仿好的和差的行为(以及介于两者之间的所有行为)

问题:这种方法可以进行数据拼接吗?
问题:什么时候序列模型会有帮助?

参考文献:

  • Kumar et al. Reward-Conditioned Policies. ArXiv’19.
  • Srivastava et al. Upside-Down RL. ArXiv’19.
  • Chen*, Lu* et al. Decision Transformer. ArXiv’21.

离线评估和超参数调整

使用离线数据集 D D D 训练策略 π θ \pi_\theta πθ。策略 π θ \pi_\theta πθ 有多好?

真实目标:

max ⁡ θ ∑ t E s t ∼ d π θ ( ⋅ ) , a t ∼ π θ ( ⋅ ∣ s t ) [ r ( s t , a t ) ] \max_\theta \sum_t \mathbb{E}_{s_t\sim d_{\pi_\theta}(\cdot),a_t\sim\pi_\theta(\cdot|s_t)} [r(s_t, a_t)] θmaxtEstdπθ(),atπθ(st)[r(st,at)]

这被称为"离线策略评估"(Offline Policy Evaluation)。

策略 π θ 1 \pi_{\theta_1} πθ1 是否比策略 π θ 2 \pi_{\theta_2} πθ2 更好?

遗憾的是,没有通用、可靠的离线评估方法。这对模仿学习也是如此。

策略:

  1. 在真实世界中执行策略
    • 准确,但可能代价高昂、有风险
    • 不再是纯粹的离线(考虑使用在线数据)
  2. 在高保真模拟器或模型中评估
    • 可能足以比较策略
    • 开发模拟器很困难
  3. 有时可以使用启发式方法
    • 容易且便宜
    • 不可靠,不通用

例如,对CQL使用启发式方法进行早停:观察Q值平均峰值下降之前的情况。

参考文献:

  • Kumar*, Singh*, Tian, Finn, Levine. A Workflow for Offline Model-Free Robotic Reinforcement Learning. CoRL’21.

应用案例

案例1:在LinkedIn上优化发送通知给用户的策略

目标:最大化每周活跃用户(WAU)和点击率(CTR),同时最小化通知量。

参考文献:

  • Prabhakar, Yuan, Yang, Sun, Muralidharan. Multi-Objective Optimization of Notifications Using Offline RL. ArXiv’22.

案例2:Annie Chen, Alex Nam, Suraj Nair开发了一种可扩展收集机器人数据的算法。

参考文献:

  • Chen*, Nam*, Nair*, Finn. Batch Exploration with Examples for Scalable Robotic RL, ICRA/RA-L’21.

Rafael Rafailov重用相同的数据集,用新的离线强化学习方法训练策略:

  1. 将200张图像标记为抽屉打开或关闭
  2. 训练分类器(用于奖励信号)
  3. 用LOMPO(COMBO的前身)进行离线强化学习

参考文献:

  • Rafailov*, Yu*, Rajeswaran, Finn. Offline RL from Images with Latent Space Models, L4DC’21.

使用LOMPO,成功率为76%;不使用LOMPO,成功率较低。

使用哪种离线强化学习算法?

如果你只想进行离线训练:

  • 过滤行为克隆:很好的第一种利用离线数据的方法
  • 保守Q学习:只有一个超参数
  • 隐式Q学习:可以拼接数据,并显式约束到数据支持

如果你想进行离线预训练+在线微调:

  • 隐式Q学习:似乎表现最好

如果你有一个好的动力学模型训练方法:

  • COMBO:与CQL类似,但受益于学习到的模型

注意:这仍然是一个活跃的研究领域!

课程提醒

  • 家庭作业2今晚截止
  • 家庭作业3今天发布
  • 项目提案反馈即将发布
  • Dilip和Ansh的两个Office Hour从线下改为线上线下混合

本节课的关键学习目标:

  • 两种离线强化学习方法(以及它们何时有效和无效)
  • 调整离线强化学习方法的重要考虑因素

这些内容将在家庭作业3中涉及!

优势加权回归(Advantage-Weighted Regression, AWR)

AWR算法的示例代码如下:

import numpy as np# 拟合价值函数
def fit_value_function(data):states, actions, rewards = data# 最小化平方损失def loss(V):return np.mean((rewards - V[states])**2)# 随机初始化价值函数V = np.random.rand(num_states)# 使用梯度下降优化for _ in range(num_iterations):V -= learning_rate * grad(loss)(V)return V# 训练AWR策略
def train_awr_policy(data, value_function, alpha):states, actions, rewards = data# 计算优势advantages = rewards - value_function[states]# 最大化加权对数似然def loss(policy_params):log_probs = policy.log_prob(policy_params, states, actions)return -np.mean(log_probs * np.exp(advantages / alpha))# 随机初始化策略参数policy_params = np.random.rand(num_policy_params)# 使用梯度下降优化for _ in range(num_iterations):policy_params -= learning_rate * grad(loss)(policy_params)return policy_params

在这个示例中,我们首先从离线数据中拟合一个价值函数,使用平方损失和梯度下降。然后,我们计算每个状态-动作对的优势,并使用这些优势来加权策略的对数似然损失。最后,我们再次使用梯度下降来优化策略参数。

alpha是一个重要的超参数,控制着策略对优势的敏感度。alpha越小,策略就越倾向于选择具有高优势的动作。

AWR的一个优点是它避免了对任何分布外(OOD)动作进行查询或训练。这是因为在训练过程中,策略只在数据集中观察到的状态-动作对上进行更新。然而,AWR使用蒙特卡洛估计来计算优势,这可能会引入较高的方差。此外,AWR隐含地假设学习到的策略不会比数据收集策略好太多。

隐式Q学习(Implicit Q-Learning, IQL)

为了解决AWR的一些局限性,我们可以使用隐式Q学习(IQL)算法。IQL使用时序差分(TD)学习来估计Q值,避免了蒙特卡洛估计的高方差问题。此外,IQL使用一个特殊的非对称损失函数来拟合状态值函数,允许学习到的策略超越数据收集策略。

IQL算法的示例代码如下:

import numpy as np# 拟合Q函数
def fit_q_function(data):states, actions, rewards, next_states = data# 最小化TD误差def loss(Q):targets = rewards + gamma * np.max(Q[next_states], axis=1)return np.mean((Q[states, actions] - targets)**2)# 随机初始化Q函数Q = np.random.rand(num_states, num_actions)# 使用梯度下降优化for _ in range(num_iterations):Q -= learning_rate * grad(loss)(Q)return Q# 拟合状态值函数
def fit_value_function(data, q_function, tau):states, actions, _ = data# 最小化非对称MSE损失def loss(V):q_values = q_function[states, actions]return np.mean(np.where(V[states] > q_values,tau * (V[states] - q_values)**2,(1 - tau) * (V[states] - q_values)**2))# 随机初始化状态值函数V = np.random.rand(num_states)# 使用梯度下降优化for _ in range(num_iterations):V -= learning_rate * grad(loss)(V)return V# 训练IQL策略
def train_iql_policy(data, q_function, value_function, alpha):states, actions, _ = data# 计算优势advantages = q_function[states, actions] - value_function[states]# 最大化加权对数似然def loss(policy_params):log_probs = policy.log_prob(policy_params, states, actions)return -np.mean(log_probs * np.exp(advantages / alpha))# 随机初始化策略参数policy_params = np.random.rand(num_policy_params)# 使用梯度下降优化  for _ in range(num_iterations):policy_params -= learning_rate * grad(loss)(policy_params)return policy_params

IQL首先从离线数据中拟合一个Q函数,使用标准的TD损失。然后,它使用一个特殊的非对称MSE损失来拟合状态值函数。这个损失函数对于高估值(即V(s) > Q(s,a))给予更大的惩罚,从而鼓励学习一个下限值函数。tau是控制这个非对称性的超参数,通常设置为一个较小的值(例如0.1)。

在拟合完值函数后,IQL像AWR一样计算优势并训练一个策略来最大化加权对数似然。因为IQL使用一个下限值函数,所学习到的策略可以安全地超越数据收集策略,而不会出现过度乐观估计的问题。

IQL的一个主要优点是它完全避免了对OOD动作的查询和训练。策略训练只使用数据集中观察到的状态-动作对。此外,通过使用TD学习和非对称值损失,IQL可以更有效地利用离线数据,并学习出更好的策略。

总结

AWR和IQL都是有前景的离线强化学习算法,可以从固定的离线数据集中学习策略,而无需与环境进行交互。它们通过对数据中的动作进行加权来约束学习到的策略,使其更接近数据收集策略。

AWR使用蒙特卡洛优势估计和标准对数似然目标,而IQL使用TD学习、非对称值损失和加权对数似然。IQL通常在性能上优于AWR,因为它避免了蒙特卡洛估计的高方差问题,并允许学习到的策略超越数据收集策略。

在实践中,离线RL算法通常很难调整和评估。超参数(如AWR中的alpha和IQL中的tau)可以显著影响性能,需要仔细调整。离线策略评估也是一个开放的研究问题,没有一个通用的可靠方法。常见的策略包括在实际环境中执行策略(昂贵且有风险)、在准确的模拟器中评估策略(需要大量工程)或使用启发式方法(不可靠)。

尽管存在这些挑战,离线RL在许多现实世界的应用中都很有前景,如医疗保健、教育、机器人等领域,在这些领域获得在线交互数据通常是困难的、昂贵的或有风险的。随着更多算法的发展和基准测试的进行,离线RL有望在未来得到更广泛的应用。

Offline learning 具体案例

案例:使用离线强化学习优化LinkedIn的通知发送策略

问题描述:
LinkedIn希望优化其通知发送策略,以最大化用户参与度和满意度。具体来说,他们希望学习一个策略,在给定用户状态的情况下,决定是否向该用户发送特定类型的通知。然而,在实际系统中进行在线探索和学习可能会损害用户体验并带来业务风险。因此,LinkedIn决定使用离线强化学习方法,利用历史用户交互日志作为离线数据集来学习最优策略。

解决方案:
LinkedIn的研究团队采用了多目标优势加权回归(MO-AWR)算法来解决这个问题。MO-AWR是对标准AWR算法的扩展,可以处理多个可能冲突的目标(如最大化用户参与度和最小化通知数量)。

算法流程如下:

  1. 从历史用户交互日志中构建离线数据集,其中每个数据点包括用户状态特征、通知发送决策和相应的奖励(如用户参与度指标)。

  2. 对于每个目标,使用离线数据拟合一个Q函数,估计在给定状态下采取特定动作的期望累积奖励。这里使用了时序差分(TD)学习来更新Q函数。

  3. 使用拟合的Q函数计算每个状态-动作对的多目标优势值。优势值衡量了一个动作相对于平均策略的好坏程度。

  4. 训练一个策略网络来最大化加权的多目标优势值之和。权重参数控制不同目标之间的权衡。

  5. 评估学习到的策略在离线数据上的性能,并使用启发式方法进行超参数调优(如调整目标权重)。

  6. 将学习到的策略部署到实际系统中,并持续监控其在线性能。如果需要,可以使用新收集的数据重新训练策略。

示例代码:
以下是使用PyTorch实现MO-AWR算法的简化示例代码:

import torch
import torch.nn as nn
import torch.optim as optimclass QNetwork(nn.Module):# Q函数网络def __init__(self, state_dim, action_dim):super(QNetwork, self).__init__()self.fc1 = nn.Linear(state_dim, 128)self.fc2 = nn.Linear(128, 128)self.fc3 = nn.Linear(128, action_dim)def forward(self, state):x = torch.relu(self.fc1(state))x = torch.relu(self.fc2(x))q_values = self.fc3(x)return q_valuesclass PolicyNetwork(nn.Module):# 策略网络def __init__(self, state_dim, action_dim):super(PolicyNetwork, self).__init__()self.fc1 = nn.Linear(state_dim, 128)self.fc2 = nn.Linear(128, 128)self.fc3 = nn.Linear(128, action_dim)def forward(self, state):x = torch.relu(self.fc1(state))x = torch.relu(self.fc2(x))action_probs = torch.softmax(self.fc3(x), dim=-1)return action_probsdef train_moawr(offline_dataset, num_objectives, weights, num_iterations):state_dim = offline_dataset[0][0].shape[0]  # 状态维度action_dim = len(offline_dataset[0][1])  # 动作维度# 初始化Q函数和策略网络q_networks = [QNetwork(state_dim, action_dim) for _ in range(num_objectives)]policy_network = PolicyNetwork(state_dim, action_dim)# 定义优化器q_optimizers = [optim.Adam(q_net.parameters(), lr=1e-3) for q_net in q_networks] policy_optimizer = optim.Adam(policy_network.parameters(), lr=1e-3)# 训练循环for i in range(num_iterations):# 从离线数据集中采样一个批次的数据batch_states, batch_actions, batch_rewards = sample_batch(offline_dataset)# 计算Q值和优势值q_values_list = [q_net(batch_states) for q_net in q_networks]advantages_list = [q_values[range(len(batch_actions)), batch_actions] - torch.mean(q_values, dim=1) for q_values in q_values_list]# 计算加权的多目标优势值weighted_advantages = torch.sum(torch.stack([adv * w for adv, w in zip(advantages_list, weights)]), dim=0)# 更新Q函数for j in range(num_objectives):q_targets = batch_rewards[:, j] + gamma * torch.max(q_networks[j](batch_next_states), dim=1)[0]q_loss = nn.MSELoss()(q_values_list[j][range(len(batch_actions)), batch_actions], q_targets)q_optimizers[j].zero_grad()q_loss.backward()q_optimizers[j].step()# 更新策略网络policy_log_probs = torch.log(policy_network(batch_states)[range(len(batch_actions)), batch_actions])policy_loss = -torch.mean(policy_log_probs * torch.exp(weighted_advantages / alpha))policy_optimizer.zero_grad()policy_loss.backward()policy_optimizer.step()

在这个示例中,我们首先定义了Q函数网络和策略网络的架构。然后,我们实现了MO-AWR算法的训练循环。在每个迭代中,我们从离线数据集中采样一个批次的数据,计算每个目标的Q值和优势值,并根据给定的权重计算加权的多目标优势值。接下来,我们使用TD误差更新每个目标的Q函数,并使用加权优势值更新策略网络以最大化加权对数似然。

通过调整目标权重,我们可以控制学习到的策略在不同目标之间的权衡。例如,如果我们希望更重视用户参与度而不是最小化通知数量,我们可以为参与度目标分配更高的权重。

这个案例展示了如何使用离线强化学习来优化LinkedIn的通知发送策略。通过利用历史用户交互数据并应用MO-AWR算法,LinkedIn能够学习到一个在多个目标之间权衡的最优策略,而无需在实际系统中进行探索。这种离线学习方法减少了在线试错的风险,提高了策略更新的效率和安全性。同时,通过持续监控和重训练,离线学习到的策略也可以适应用户行为的变化和系统的演进。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/841751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS 7.9部署宝塔面板超详细

CentOS7 部署宝塔面板 Linux的宝塔面板搭建起来非常轻松&#xff0c;也可以用一句话来形容&#xff0c;如果喝水一样简单&#xff0c;只需一条命令剩下的交给时间&#xff0c;几分钟就能部署好&#xff0c;然后就可以直接进行登录&#xff0c;直接可以安装LNMP、LAMP平台&…

【2024】LeetCode HOT 100——动态规划

目录 1. 爬楼梯1.1 C++实现1.2 Python实现1.3 时空分析2. 杨辉三角2.1 C++实现2.2 Python实现2.3 时空分析3. 打家劫舍3.1 C++实现3.2 Python实现3.3 时空分析4. 完全平方数4.1 C++实现4.2 Python实现<

海外仓储管理系统:提升效率,标准化海外仓管理,科技赋能业务

海外仓作为跨境物流的关键一环&#xff0c;完全可以说海外仓的效率直接决定了后续物流的整体运作效率。 对于海外仓而言&#xff0c;一套高效&#xff0c;易用的海外仓储系统&#xff0c;无疑将成为提升企业竞争力的重要工具&#xff0c;帮助海外仓实现从野蛮生长到标准化管理…

2024.05.26 第 399 场周赛

Leetcode 第 399 场周赛 优质数对的总数 I Leetcode 优质数对的总数 I 给你两个整数数组 nums1 和 nums2&#xff0c;长度分别为 n 和 m。同时给你一个正整数 k。 如果 nums1[i] 可以被 nums2[j] * k 整除&#xff0c;则称数对 (i, j) 为 优质数对&#xff08;0 < i < n…

MT3040 矩形覆盖

代码&#xff1a; #include <bits/stdc.h> using namespace std; typedef long long ll; const int N 3e5 10; int n, ans, d, w; stack<int> s; // 单调栈 // 如果楼高度类似121&#xff08;凸&#xff0c;两边相等&#xff0c;中间比两边的大&#xff09;&…

微服务:Nacos简介以及安装部署

一、前言 Nacos&#xff08;全称Dynamic Naming and Configuration Service&#xff09;是一个由阿里巴巴集团开发并开源的分布式服务发现和配置管理平台。它是构建以“服务”为中心的现代应用架构&#xff08;如微服务范式、云原生范式&#xff09;的服务基础设施。 Nacos架构…

设计模式深度解析:分布式与中心化,IT界两大巨头“华山论剑”

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL应用》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 ✨IT界的两大巨头交锋✨ &#x1f44b; 在IT界的广阔天地中&#xff0c;有两座…

微火问答:全域外卖和本地生活服务是同个项目吗?

当前&#xff0c;本地生活赛道火爆程度不断升级&#xff0c;作为其主要板块之一的团购外卖也持续迸发出新的活力。而全域运营的出现无疑是给团购外卖这把正在熊熊燃烧的烈火&#xff0c;又添了一把新柴&#xff01; 所谓全域运营&#xff0c;简单来说&#xff0c;就是指所有领…

数据安全不容小觑:.hmallox勒索病毒的防范与应对

一、引言 随着网络技术的飞速发展&#xff0c;网络安全问题日益凸显&#xff0c;其中勒索病毒作为一种极具破坏性的网络攻击手段&#xff0c;已在全球范围内造成了巨大的经济损失和社会影响。在众多勒索病毒中&#xff0c;.hmallox勒索病毒以其狡猾的传播方式和强大的加密能力…

重载大于号运算符,比较复数大小

本题目要求编写代码的功能为&#xff1a; 输入两个复数&#xff08;变量名自拟&#xff09;&#xff0c;比较复数模的大小&#xff0c;复数实部与虚部都是整数 要求输入时输入4个整数&#xff0c;分别代表复数1的实部、虚部&#xff0c;复数2的实部虚部 输入格式: 在同一行中输…

CSRF 攻击详解

什么是csrf攻击&#xff1f; CSRF攻击&#xff08;Cross-Site Request Forgery&#xff0c;跨站请求伪造&#xff09;是一种常见的网络攻击方式&#xff0c;它利用网站对用户浏览器的信任&#xff0c;诱使用户在不知情的情况下发送恶意请求。这类攻击通常发生在用户已经通过身…

linux 常用命令:find grep ps netstat sudo df du rm

rm 命令 删除 -r 是递归参数&#xff08;recursive&#xff09;&#xff0c;用于删除目录及其内容。如果不加这个参数&#xff0c;rm 命令无法删除非空目录。-f 是强制参数&#xff08;force&#xff09;&#xff0c;用于强制删除文件或目录&#xff0c;不会进行任何确认提示…

g-h Filter 详细讲解

g-h 过滤器 g-h 滤波器百科介绍。 之前的翻译大家&#xff0c;我看都没什么阅读量&#xff0c;可能大家都不是很想看&#xff08;估计也是我英文太水&#xff09;。那么这篇博客我就先暂停直接翻译原文&#xff0c;而是直接说一下自己的理解。 本文章背后的书的详细介绍可以…

企业客户信息反馈|基于SprinBoot+vue的企业客户信息反馈平台(源码+数据库+文档)

企业客户信息反馈平台 目录 基于SprinBootvue的企业客户信息反馈平台 一、前言 二、系统设计 三、系统功能设计 1平台功能模块 2后台登录 5.2.1管理员功能 5.2.2客户功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&am…

vscode远程连接Ubuntu mysql服务器

注意&#xff1a;刚开始使用root用户死活连接不上&#xff0c;可能就是root用户没有权限的问题&#xff0c;可以尝试创建一个新的数据库用户&#xff0c;授予权限进行连接 ubuntu安装mysql 创建新用户 执行&#xff1a;sudo apt-get install mysql-server安装服务器(yum) 执…

Aya 23 是 Cohere For AI 推出的一款最先进的新型多语言开放重量模型

相信一些对LLM关注较高的同学们&#xff0c;应该对这家加拿大的Cohere不会太陌生。毕竟此前&#xff0c;它就开源过 Aya 101 和 Command R 这两款大模型。 Cohere 的非营利性研究实验室 Cohere for AI 发布了 Aya 23&#xff0c;这是其多语言大型语言模型 &#xff08;llm&…

[SWPUCTF 2021 新生赛]pop

常见的魔术方法 魔术方法__construct() 类的构造函数&#xff0c;在对象实例化时调用 __destruct() 类的析构函数&#xff0c;在对象被销毁时被调用 __call() 在对象中调用一个不可访问的对象时被调用&#xff0c;比如一个对象被调用时&#xff0c;里面没有程序想调用的属性 …

ML307R OpenCPU 数据保存文件系统fs使用

一、函数介绍 二、实现数据保存 三、代码下载地址 一、函数介绍 以下是cm_fs.h里面的函数介绍 /*** brief 文件指针定位** param [in] fd 文件描述符* param [in] offset 指针偏移量* param [in] base 偏移起始点&#xff0c;CM_FS_SEEK_SET&#xff1a;文件开头 CM_FS…

Leetcode260

260. 只出现一次的数字 III - 力扣&#xff08;LeetCode&#xff09; class Solution {public int[] singleNumber(int[] nums) {//通过异或操作,使得最终结果为两个只出现一次的元素的异或值int filterResult 0;for(int num:nums){filterResult^num;}//计算首个1(从右侧开始)…

视频号小店怎么进入优选联盟?入驻优选联盟都有什么条件?

大家好&#xff0c;我是电商花花。 视频号小店想要出单、爆单&#xff0c;不管在流量上还是销量都离不开达人带货&#xff0c;因为目前视频号小店上基本上就没有自然流量&#xff0c;想出单只能做达人带货。 而视频号小店想要找达人带货&#xff0c;必须是企业店铺&#xff0…