PaperReading:Reinforcement Learning
paperreading
本文字数:6.2k 字 | 阅读时长 ≈ 25 min

PaperReading:Reinforcement Learning

paperreading
本文字数:6.2k 字 | 阅读时长 ≈ 25 min

基本概念

在讲解强化学习算法之前,需要先了解一些基本概念,方便我们后续算法的理解

1. 蒙特卡洛算法

蒙特卡罗(Monte Carlo Method)算法,其核心思想是利用随机变量的统计特性,通过大量随机试验对问题的解进行近似。其实说白了就是通过大量实验来拟合真实的期望

$$
\text{期望} , \mathbb{E}[f(X)] = \int f(x) p(x) dx \approx \frac{1}{N} \sum_{i=1}^N f(x_i)
$$

$f(x)$ 是目标函数,$p(x)$ 是概率密度函数,$x_i \sim p(x)$ 是从 $p(x)$ 中采样得到的样本,$N$ 是采样次数,$N \to \infty$,估计值收敛于真实值

2. 状态价值函数和动作值函数

强化学习关注的是智能体 (agent) 与环境 (environment) 的交互。智能体在不同状态 $s$ 下采取动作 $a$,从环境获得奖励 $r$,目标是最大化累计奖励。

状态价值函数

$$
V_\pi(s) = \mathbb{E}_\pi [\sum_{t=0}^{\infty} \gamma^t r_t | s_0 = s]
$$

$\pi$ 是策略,$\gamma$ 是折扣因子,$r_t$ 是 $t$ 时刻奖励,$\sum_{t=0}^{\infty} \gamma^t r_t$ 表示从当前时刻开始,一直到未来无限远的累计奖励,每一步奖励按 $\gamma^t$ 衰减。下面用蒙特卡洛策略来对其进行评估

$$
V_\pi(s) \approx \frac{1}{N(s)} \sum_{i=1}^{N(s)} G_i
$$
其中,$G_i = \sum_{t=0}^{T_i} \gamma^t r_t$:第 $i$ 条轨迹上从状态 s 开始的折扣回报,下面会讲

动作值函数

$$
Q_\pi(s, a) \approx \frac{1}{N(s, a)} \sum_{i=1}^{N(s,a)} G_i
$$

举个例子来理解 $V$ 和 $Q$ 的区别,假如你在一个迷宫(状态 $s$),你有两个选择,若策略是 $\pi(\text{左})=0.7$,$\pi(\text{右})=0.3$,则:$V_\pi(s) = 0.7 \times 10 + 0.3 \times 5 = 8.5$。而我们选择向左走,则 $Q_\pi(s, \text{左}) = 10$,否则向右走 $Q_\pi(s, \text{右}) = 5$,因此可以将 $V$ 和 $Q$ 理解为:

3. 折扣回报

在上面公式中我们看到了 $G$ 这个变量,他是折扣回报(discounted return)是强化学习的核心概念之一,我们希望智能体最大化从当前开始未来能获得的总奖励(回报)。由于未来的奖励可能越来越不确定或对当前决策的影响越来越小,因此我们用一个折扣因子 $\gamma(0 ≤ \gamma ≤ 1)$让未来的奖励“打折”,即:
$$
G_t = \sum_{k=0}^{\infty} \gamma^k r_{t+k} = r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + \gamma^3 r_{t+3} + \cdots
$$

$G_t$表示从时刻 t 开始的折扣回报,$r_t$ 是 $t$ 时刻获得的即时奖励,$\gamma$ 为折扣因子(通常接近于 1,如 0.99)。为什么要折扣?

✅ 避免未来奖励对当前决策的影响无限放大(确保总回报有界)
✅ 模拟人类和实际系统的行为——未来收益的不确定性更大,应当权衡短期与长期收益
✅ 在无限回合问题中,保证总收益不发散

举个例子来简单计算回报:你有一个机器人,它在走迷宫,每到达一步都给奖励:
第 0 步(当前步):$r_0 = 1$,第 1 步:$r_1 = 2$,第 2 步:$r_2 = 3$,第 3 步:$r_3 = 4$,折扣因子:$\gamma = 0.9$,计算折扣回报
$$
\begin{align*}
G_0 &= 1 + 0.9 \cdot 2 + 0.9^2 \cdot 3 + 0.9^3 \cdot 4 \\
&= 1 + 1.8 + 0.81 \cdot 3 + 0.729 \cdot 4 \\
&= 1 + 1.8 + 2.43 + 2.916 \\
&= 8.146
\end{align*}
$$

不同 $\gamma$ 的影响

$\gamma$ $G_0$ 计算结果 解释
1.0 10 所有奖励同等重要
0.9 8.146 未来奖励影响被折扣
0.5 1 + 1 + 0.75 + 0.5 = 3.25 未来奖励几乎无影响
0.0 1 只看当前奖励

OK,现在我们对强化学习的基本概念有了一个大致的了解,但是上面概念可能还是有一点云里雾里,下面我做了一个表格方便进一步了解

符号 含义 数学表达 通俗理解 举例
r 即时奖励 $r_t$ 当下这一步的奖励 当前格子给的奖励
G 折扣回报 $G_t = \sum_{k=0}^{\infty} \gamma^k r_{t+k}$ 从 t 步起未来折扣累计奖励 某次实际走一条路径(episode)的回报总和
V 状态价值函数 $V_\pi(s) = \mathbb{E}_\pi [G_0 | s_0=s]$ 当前状态未来平均回报 当前在某位置,平均未来收益
Q 动作价值函数 $Q_\pi(s,a) = \mathbb{E}_\pi [G_0 | s_0=s, a_0=a]$ 当前状态采取某动作未来平均回报 当前选左走或右走的平均未来收益

4. 重要性采样

这个我还不太明白,回头想起来在解释。。

重要性采样(Importance Sampling)通过改变采样分布降低方差,提高效率。

$$
\mathbb{E}_p[f(X)] = \mathbb{E}_q \left[ f(X) \frac{p(X)}{q(X)} \right]
$$

1. Policy Gradient

1.1 什么是 Policy Gradient?

Policy Gradient(策略梯度) 是强化学习(Reinforcement Learning)中直接对策略函数进行优化的一类方法。其目标是:直接最大化策略参数 $\theta$ 下,agent 的期望总回报:

$$
J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta} [R(\tau)]
$$

注意:这里的 $R(\tau)$ 和 $G_t$ 的区别是:$R(\tau)$ 是从头到尾的一次完整 episode 的总奖励。$G_t$ 是从某个中间时刻往后的总奖励。当 $t=0$ 时,二者等价。

1.2 策略梯度的基本思想

Policy Gradient 则通过直接建模策略 $\pi_\theta(a|s)$ 来优化策略,通常用策略网络(也就是一个神经网络)来输出动作,这个动作与环境进行交互并输出 reward 来衡量当前动作的好坏,最后我们根据得到的 reward 来优化策略网络。

我们希望优化一个策略 $\pi_\theta(a_t | s_t)$,使得在这个策略下,执行一条轨迹(一个完整 episode)后获得的总奖励最大:

$$
J(\theta) = \mathbb{E}_{\pi_\theta} [\sum_t r_t]
$$

我们希望求 $J(\theta)$ 对策略参数的梯度,以便进行优化。由于 $J(\theta)$ 是一个期望,直接求梯度不方便。于是我们借助 score function trick(也叫 log-derivative trick),有:

$$
\nabla_\theta \mathbb{E}_{x \sim p_\theta(x)}[f(x)] = \mathbb{E}_{x \sim p_\theta(x)} [f(x) \nabla_\theta \log p_\theta(x)]
$$

将这个技巧应用于 $J(\theta)$,可以推导出:

$$
\nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta} \left[ \sum_t \nabla_\theta \log \pi_\theta(a_t | s_t) \cdot R_t \right]
$$

其中:

1.3 标准策略梯度算法

知道这个整体的大致流程之后,我们看一下一个完整的 REINFORCE 算法训练过程,这个算法的核心思想是:增加能够带来高回报的动作被选择的概率,降低导致低回报的动作被选择的概率

算法流程

  1. 初始化策略网络参数 $\theta$。它的作用是输入一个状态 $s$,输出一个动作 $a$ 的概率分布。
  2. 循环训练:重复这个过程直到 episode 结束(比如到达终止状态,或者最大步数):

算法总结

算法通过蒙特卡洛方法估计策略梯度,并沿该方向更新参数以期获得更高回报。优缺点如下

为解决这些问题,后续发展出了 Actor-Critic、PPO 等方法,引入基线、价值函数等技巧以降低方差、提高效率。但理解 REINFORCE 是掌握高级算法的基础。

举个具体例子加深理解

回合制游戏策略梯度完整计算小游戏

首先我们采样一条轨迹 $\tau$,假设有 3 个时间步,状态 $s_t$、动作 $a_t$、奖励 $r_t$,如下,然后接下来,我们计算每个时间步的梯度 $\nabla_\theta \log \pi_\theta(a_t | s_t)$,假设策略网络输出的概率如下表所示:

$t$ 状态 $s_t$ 动作 $a_t$ 奖励 $r_t$ 回报 $R_t$(假设不折扣$\gamma=1$) 策略概率$p_t$ $\log \pi_\theta(a_t|s_t)$
0 起点 向右 (1) 0 $r_0 + r_1 + r_2 = 0 + 0 + 1 = 1$ 0.5 -0.693
1 前进一步 向右 (1) 0 $r_1 + r_2 = 0 + 1 = 1$ 0.6 -0.511
2 接近终点 向右 (1) 1 $r_2 = 1$ 0.7 -0.357

计算累计 loss:$L = -\sum_t \log \pi_\theta(a_t|s_t) R_t$,逐步代入结果如下
$$
\begin{align*}
\text{loss}
&= -\big( (-0.693) \cdot 1 + (-0.511) \cdot 1 + (-0.357) \cdot 1 \big) \\
&= -\big( -0.693 - 0.511 - 0.357 \big) \\
&= -(-1.561) \\
&= 1.561
\end{align*}
$$

代码形式写出来

# 假设策略网络输出的概率
p0, p1, p2 = 0.5, 0.6, 0.7

# 计算 log 概率
log_p0 = torch.log(torch.tensor(p0))  # ≈ -0.693
log_p1 = torch.log(torch.tensor(p1))  # ≈ -0.511
log_p2 = torch.log(torch.tensor(p2))  # ≈ -0.357

# 回报
R0, R1, R2 = 1.0, 1.0, 1.0

# loss
loss = -(log_p0 * R0 + log_p1 * R1 + log_p2 * R2)
print(loss.item())  # ≈ 1.561

# 反向传播
loss.backward()
optimizer.step()

为什么这个 loss 会鼓励动作概率更高?从 $\nabla_\theta L = - \sum_t R_t \nabla_\theta \log \pi_\theta(a_t|s_t)$ 公式可以看出

2. PPO

2.1 什么是 PPO?

PPO(Proximal Policy Optimization) 是一种改进的策略梯度方法,它在策略更新时引入了约束,以避免策略在一次更新中发生过大的变化,从而提高训练的稳定性和收敛速度。

PPO 的目标是最大化以下目标函数:

$$
L^{CLIP}(\theta) = \mathbb{E}_t [min(r_t(\theta) \hat{A_t}, ~~~ clip(r_t(\theta), 1 - \epsilon, 1 + \epsilon) \hat{A_t})]
$$

其中:

PPO 的基本思想是:在鼓励提高优势动作概率的同时,如果更新幅度过大则进行裁剪,保证策略变化在一个合理范围内。

2.2 PPO 的训练流程

PPO 的训练大致分为两大步:初始化和主程序循环

初始化:

  1. 初始化策略网络参数 $\theta$ (Policy)。
  2. 初始化价值网络参数 $\phi$ (Value)(策略和价值网络通常共享一部分底层网络,但有各自的输出头)
  3. 设定超参数,如学习率 $\alpha$、折扣因子 $\gamma$、GAE 参数 $\lambda$、裁剪系数 $\epsilon$ 等。

主训练循环 (for iteration = 1, 2, 3, … do):

  1. 数据收集:使用旧策略 $\pi_{\theta_{\text{old}}}$ 与环境交互。在一个或多个并行环境中,重复下面过程,直到收集到预设数量时间步(例如 N=2048)。
    • 根据 $\pi_{\theta_{\text{old}}}(a_t|s_t)$ 采样动作 $a_t$。执行动作,记录奖励 $r_t$、新状态 $s_{t+1}$、完成标志 $d_t$。存储 $(s_t, a_t, r_t, s_{t+1}, d_t)$ 及 $\log\pi_{\theta_{\text{old}}}(a_t|s_t)$。
  2. 计算优势值和目标回报:计算每步的优势值 $\hat{A_t}$ (通常使用 GAE,平衡偏差与方差),同时计算价值目标,即价值函数 $R_t = \hat{A_t} + V(s_t)$,作为价值网络的学习目标。
  3. 策略与价值函数优化:对同一批数据进行多轮(K 轮)优化:for epoch = 1, 2, ..., K do
    • 随机打乱批数据。将大批数据划分成多个 mini-batch。
    • 对每个 mini-batch:
      • 计算概率比 $r_t(\theta)$:$r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)} = \exp(\log\pi_\theta(a_t|s_t) - \log\pi_{\theta_{\text{old}}}(a_t|s_t))$
      • 策略损失:$L^{CLIP}(\theta) = \mathbb{E}_t [\min(r_t(\theta)\hat{A_t}, ~~~ \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\hat{A_t})]$
      • 价值函数损失:$L^{VF}(\phi) = \mathbb{E}_t [( V_\phi(s_t) - R_t)^2]$
      • 熵奖励:$S[\pi_\theta]({s}_{t}) = \mathbb{E}_t[H(\pi_\theta(\cdot|s_t))]$
      • 总损失:$L(\theta, \phi) = -L^{CLIP}(\theta) + c_1 L^{VF}(\phi) - c_2 S[\pi_\theta](s_t)$
      • 梯度更新
        • 计算损失对 $\theta, \phi$ 的梯度。使用优化器(如 Adam)更新参数。
  4. 更新旧策略参数:将当前策略参数 $\theta$ 复制给旧策略参数 $\theta_{\text{old}}$,为下一轮数据收集做准备。

PPO 的核心在于通过剪切目标函数,在鼓励策略改进的同时,限制了每次更新的幅度。这使得 PPO 能够安全地重复利用旧数据进行多次训练,显著提高了训练的稳定性和样本效率。

2.3 简单代码实现

以下是 PPO 的核心代码片段(PyTorch):

# 计算概率比
probs = policy_net(states)
m = torch.distributions.Categorical(probs)
new_log_probs = m.log_prob(actions)
ratio = (new_log_probs - old_log_probs).exp()

# 裁剪目标
clip_adv = torch.clamp(ratio, 1 - epsilon, 1 + epsilon) * advantages
loss = -torch.min(ratio * advantages, clip_adv).mean()

# 更新策略
optimizer.zero_grad()
loss.backward()
optimizer.step()

在看了上面内容之后,我们对 PPO 有了一个大致的了解,但是看了 PPO 的整个流程以后,还是云里雾里的,特别是我们直接给出了 PPO 的目标函数 $L^{CLIP}(\theta)$,但是为什么要这样设计?接下来我们会详细讲解 PPO 的优化目标以及为什么要引入 Critic 网络。

2.4 PPO 优化目标

PPO 解决的问题:策略梯度的不稳定性。传统的策略梯度方法(如 REINFORCE)通过沿着预期回报的估计梯度方向更新策略参数 ($\theta$)。基本的策略梯度目标可以写成:

$$
L^{PG}(\theta) = \mathbb{E}_t [\log \pi_\theta(a_t | s_t) \hat{A_t}]
$$

其中,$a_t$ 是在状态 $s_t$ 下采取的动作,$\hat{A_t}$ 是优势函数估计,衡量该动作比平均水平好多少。其中在策略梯度中,我们直接使用采样的回报来估计优势函数。

如果一个动作的优势为正 ($\hat{A_t} > 0$),我们希望增加其概率 $\pi_\theta(a_t | s_t)$。反之,如果优势为负 ($\hat{A_t} < 0$),我们希望降低其概率。直接优化这个目标函数时,如果学习率过大或者梯度更新步数过多,会导致不稳定。PPO 的灵感来源于信任区域策略优化 (TRPO)。TRPO 通过对新策略 $\pi_\theta$ 相对于旧策略 $\pi_{\theta_{\text{old}}}$ 的偏差施加一个硬性约束来解决不稳定性问题。这个约束通常使用新旧策略之间的 Kullback-Leibler (KL) 散度来定义,即 $D_{KL}(\pi_{\theta_{\text{old}}} || \pi_\theta) \le \delta$。TRPO 的目标函数是:

$$
\text{最大化} \mathbb{E}_t [\frac{\pi_\theta(a_t | s_t)}{\pi_{\theta_{\text{old}}}(a_t | s_t)} \hat{A_t}] ~~~ \text{受限于} D_{KL}(\pi_{\theta_{\text{old}}} || \pi_\theta) \le \delta
$$

尽管 TRPO 很有效,但它的计算复杂度很高,因为它需要解决一个带约束的优化问题,通常涉及二阶优化方法。PPO 通过剪切代理目标函数来减轻 TRPO 存在的问题,其目标是在保留 TRPO 稳定性的优势的同时,使用更简单的、一阶的优化方法(如 Adam)。PPO 引入了一个剪切代理目标函数,间接地惩罚过大的策略变化。如下

$$
L^{CLIP}(\theta) = \mathbb{E}_t [min(r_t(\theta) \hat{A_t}, ~~~clip(r_t(\theta), 1 - \epsilon, 1 + \epsilon) \hat{A_t})]
$$

它利用优势函数 $\hat{A}_t$ 指导策略更新,通过 clip 函数防止更新幅度过大。min 内两个项含义如下:

2.5 为什么要引入一个 critic 网络

为什么引入 Critic?

引入 Critic 网络是为了让 Actor 收敛更快、更稳定。如果不引入 Critic,方法退化为纯策略梯度:直接使用整个回合的总回报 $G_t$ 评估动作好坏。这会带来两个主要问题:

  1. 高方差

    • $G_t$ 受未来所有随机性的影响(策略采样、环境随机性),噪声大。
    • 一个动作即便在 $s_t$ 下不好,也可能因后续奖励高而被误判为好动作,反之亦然。
    • 导致策略梯度估计波动大,收敛慢,需要大量数据。
  2. 缺乏相对比较

    • 只知道动作带来的回报是高是低,不知道相对平均水平好多少。
    • 比如所有动作回报都正,一个 +10 回报的动作可能其实很差,但依然会被提升概率。
    • 学习方向不精确,效率低。

Critic 像一个裁判,它学习价值函数 $V(s)$,用来评估状态的好坏,从而计算优势函数:
$$
A(s_t, a_t) = Q(s_t, a_t) - V(s_t)
$$

在实践中,优势函数常用 TD-error 近似:
$$
\hat{A_t} \approx r_t + \gamma V(s_{t+1}) - V(s_t)
$$

有了 Critic 后:

无 Critic (纯策略梯度) 有 Critic (Actor-Critic)
评估信号 总回报 $G_t$ 优势函数 $\hat{A_t}$
方差 低(减去了状态价值基线)
稳定性 波动大,收敛慢 更稳定,收敛快
数据效率 低(需完整回合) 高(可单步更新)

2.6 PPO 的优势函数与 GAE

在 PPO 中,我们引入 Critic 网络来估计价值函数,并通过 优势函数 $\hat{A_t}$ 指导策略更新。优势函数的定义和作用如下:

优势函数的意义

GAE:优势估计的关键技术,直接估计 $Q^\pi(s, a)$ 或 $V^\pi(s)$ 存在挑战

实际中,我们用神经网络近似 $V(s)$,并用 TD 误差(时序差分误差)估计优势:

$$
\delta_t = r_t + \gamma V(s_{t+1}) - V(s_t)
$$

这种单步 TD 误差计算简单,但偏差大(只考虑一步未来)。而用回合总回报减去 $V(s)$(蒙特卡洛方法),虽然无偏,但方差高,更新不稳定。

Generalized Advantage Estimation (GAE) 在低方差(TD 误差)和低偏差(蒙特卡洛估计)间找到平衡点。其公式为:

$$
\hat{A_t}^{\text{GAE}(\gamma,\lambda)} = \sum_{l=0}^{\infty} (\gamma \lambda)^l \delta_{t+l}
$$

其中:
$$
\delta_{t+l} = r_{t+l} + \gamma V(s_{t+l+1}) - V(s_{t+l})
$$

GAE 的性质:

GAE 的作用

最后贴一个表格,帮助我们更好地理解 PPO 中的函数和符号

函数 (Function) 符号 (Notation) 在 PPO 中的处理方式
状态价值函数 $V^\pi(s)$ 由 Critic 网络直接预测和估计,网络输出 $V_\phi(s)$ 是其近似值。
优势函数 $A^\pi(s, a)$ 由 GAE (广义优势估计) 计算,通过 Critic 的 $V_\phi(s)$ 和奖励计算稳定的优势估计 $\hat{A_t}$。
状态-动作价值函数 $Q^\pi(s, a)$ 通常不直接预测或计算,其作用通过 $V$ 和 GAE 的优势估计间接体现,无需单独建模。

2.7 PPO 的核心概念汇总

类别 概念名称 (英文) 符号 / 记法 核心作用与解释
基础概念 状态 (State) $s_t$ 环境在时间步 $t$ 的完整描述,是策略和价值网络的输入。
动作 (Action) $a_t$ 智能体在状态 $s_t$ 下选择的动作。
奖励 (Reward) $R_{t+1}$ 执行动作后环境返回的标量信号,用于反馈该动作的好坏。
轨迹 / Rollout $\tau = (s_0, a_0, R_1, s_1, a_1, R_2, \dots)$ 智能体与环境交互生成的状态、动作、奖励序列。
策略 (Policy) $\pi(a|s)$ 状态到动作的概率分布映射,是 PPO 优化的对象。
回报 (Return) $G_t = \sum_{k=0}^{\infty} \gamma^k R_{t+k+1}$ 从 $t$ 开始未来的折扣奖励总和,不直接用于 PPO 更新因方差大。
网络组件 Actor (演员) $\pi_\theta(a|s)$ 策略网络,输入状态 $s$,输出动作概率分布,负责决策。
Critic (评论家) $V_\phi(s)$ 价值网络,评估状态的期望回报,用于降低方差。
旧策略 (Old Policy) $\pi_{\theta_{\text{old}}}(a|s)$ 数据收集时的策略,计算概率比时作为基准。
核心计算 状态价值函数 $V(s)$ 状态 $s$ 的期望回报,由 Critic 估计。
优势函数 $A(s,a) = Q(s,a) - V(s)$ 衡量动作 $a$ 相对于状态 $s$ 平均水平的优劣。
广义优势估计 (GAE) $\hat{A}_t^{GAE} = \sum_{l=0}^{\infty} (\gamma \lambda)^l \delta_{t+l}$ 稳定优势估计方法,通过 $\lambda$ 平衡偏差和方差。
TD 误差 $\delta_t = R_{t+1} + \gamma V(s_{t+1}) - V(s_t)$ 单步优势近似,是 GAE 的基础。
价值目标 $V_{\text{target},t} = \hat{A_t} + V(s_t)$ 用于训练 Critic 的监督目标,比回报更稳定。
PPO 目标函数 概率比率 $r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)}$ 衡量策略更新幅度。
裁剪目标 $L^{CLIP}(\theta)$ PPO 核心,通过 clip 限制 $r_t(\theta)$ 范围,保证更新稳定。
价值函数损失 $L^{VF}(\phi)$ Critic 均方误差损失。
熵奖励 $S[\pi_\theta]$ 策略分布熵,鼓励探索。
总损失 $L(\theta, \phi) = -L^{CLIP} + c_1 L^{VF} - c_2 S$ PPO 最终优化目标。
关键超参数 折扣因子 $\gamma$ (0,1) 控制未来奖励权重,通常取 0.99。
GAE 参数 $\lambda$ [0,1] 平衡 GAE 偏差和方差,通常取 0.95。
裁剪系数 $\epsilon$ 控制概率比范围,通常取 0.1 或 0.2。
优化轮数 $K$ 每批数据重复优化次数,通常取 3-15。
小批量大小 $M$ mini-batch 大小,如 64、128、256。
学习率 $\alpha$ 参数更新步长。
损失系数 $c_1, c_2$ 控制价值损失和熵奖励在总损失中的权重。
May 06, 2025
Apr 06, 2025
ufw