分布式RL:C51、QR-DQN

一句话概述

分布式强化学习(Distributional RL)不再只学习Q值的期望(标量),而是学习整个回报分布(概率分布)。C51(Categorical DQN)将回报分布离散化为51个"原子",学习每个原子上的概率质量;QR-DQN(Quantile Regression DQN)学习分布的"分位数",更灵活地表示分布形状。分布式RL显著提升了DQN的性能,是Rainbow的重要组成部分。

💡 核心要点:①传统RL只学Q值的期望E[Z],分布式RL学习整个回报分布Z(s,a);②C51将回报值域离散化为N个固定位置(原子),输出每个原子的概率;③QR-DQN用分位数回归(Quantile Regression)学习分布的N个分位数位置;④学习分布比学习期望携带更多信息,能更好地处理随机性和风险。

教学与演示

一、为什么要学分布——从期望到分布

是什么(定义):传统Q-learning只学习Q(s,a) = E[Z(s,a)],即回报Z的期望值。分布式RL学习整个回报分布Z(s,a)——一个概率分布,而不仅仅是它的期望。这就像天气预报从"明天平均温度25°C"升级为"明天温度的概率分布:20%概率20°C,50%概率25°C,30%概率30°C"。

大白话 传统DQN只告诉你"这个动作平均能得多少分",分布式RL告诉你"这个动作得分可能是5分(概率30%)、10分(概率50%)、15分(概率20%)"。后者信息量更大——不仅知道平均值,还知道风险(方差)和分布形状。

为什么(原理):回报分布包含了比期望更多的信息:风险(方差)、偏度(skewness)、多模态(多个可能的回报模式)。在风险敏感场景中,知道分布比只知道期望重要得多——同样的期望回报,方差小的策略更安全。分布式RL通过保留分布信息,让智能体做出更"明智"的决策。

怎么做(实现)

import numpy as np

# ==================== 期望 vs 分布 ====================
# 两个动作,期望回报相同但分布不同
action_A_returns = np.array([10.0, 10.0, 10.0, 10.0, 10.0])  # 稳定10分
action_B_returns = np.array([0.0, 5.0, 10.0, 15.0, 20.0])    # 波动大,但均值也是10

print("=== 期望 vs 分布 ===")
print(f"动作A回报: {action_A_returns}, 期望={np.mean(action_A_returns):.1f}, 方差={np.var(action_A_returns):.1f}")
print(f"动作B回报: {action_B_returns}, 期望={np.mean(action_B_returns):.1f}, 方差={np.var(action_B_returns):.1f}")
print(f"\n期望相同(都是10),但分布完全不同!")
print(f"传统DQN: 两个动作的Q值相同,无法区分")
print(f"分布式RL: 能区分——动作A更稳定,动作B更有风险")
print(f"\n在风险敏感场景中,这个区别至关重要:")
print(f"  风险厌恶: 选择动作A(稳定10分)")
print(f"  风险偏好: 选择动作B(有机会拿20分)")
回报分布 vs 期望\(Z^{\pi}(s, a) = \sum_{k=0}^{\infty} \gamma^k R_{t+k+1}, \quad Q^{\pi}(s, a) = \mathbb{E}[Z^{\pi}(s, a)]\)

什么用(应用):分布式RL在Atari游戏上显著优于传统DQN。在金融交易中,知道收益分布比只知道期望收益更重要(风险控制);在自动驾驶中,知道碰撞概率的分布比只知道期望安全距离更重要。

哪些坑(缺点):学习分布比学习期望需要更多参数(N倍),计算量更大;分布表示方式(离散化位置、分位数数量)需要精心设计;分布学习的理论分析更复杂。

二、C51——离散化回报分布

是什么(定义):C51(Categorical DQN)将回报值域[V_min, V_max]离散化为N个固定位置(原子,atoms)z_i = V_min + i·Δz,网络输出每个原子上的概率质量p_i(s,a)。Q值通过加权平均得到:Q(s,a) = Σ_i z_i·p_i(s,a)。C51是第一个成功的分布式RL算法。

大白话 C51就像"把成绩分成51个等级"——从0分到100分,每隔2分一个等级。网络不直接输出分数,而是输出"得02分的概率30%,得24分的概率50%..."。最终分数是所有等级的概率加权平均。

为什么(原理):C51使用交叉熵损失来学习分布,而不是MSE。TD目标分布需要经过"投影"操作——将r+γz_i映射到最近的原子位置上。投影操作引入了"分布贝尔曼算子",保持了分布的信息。C51证明——学习分布(即使离散化)比学习期望更好。

怎么做(实现)

import numpy as np

# ==================== C51概念演示 ====================
class C51Network:
    """C51网络的概念演示"""
    def __init__(self, n_atoms=51, v_min=-10, v_max=10):
        self.n_atoms = n_atoms
        self.v_min = v_min
        self.v_max = v_max
        # 原子(支撑点)位置
        self.atoms = np.linspace(v_min, v_max, n_atoms)
        self.delta_z = (v_max - v_min) / (n_atoms - 1)

    def forward(self, state):
        """概念:输出每个原子的概率(softmax后)"""
        # 实际中:神经网络输出logits,然后softmax
        logits = np.random.randn(self.n_atoms)  # 模拟
        probs = np.exp(logits) / np.exp(logits).sum()  # softmax
        return probs  # shape: (n_atoms,)

    def compute_Q(self, probs):
        """从分布计算Q值:Q = Σ z_i * p_i"""
        return np.sum(self.atoms * probs)

    def project_distribution(self, next_probs, reward, gamma):
        """投影操作:将TD目标分布投影到原子上"""
        # TD目标原子位置:r + γ * z_i
        tz = reward + gamma * self.atoms
        # 裁剪到[v_min, v_max]
        tz = np.clip(tz, self.v_min, self.v_max)
        # 投影到最近的两个原子上(双线性插值)
        projected = np.zeros(self.n_atoms)
        for i, tz_i in enumerate(tz):
            b = (tz_i - self.v_min) / self.delta_z
            l = int(np.floor(b))  # 下原子索引
            u = int(np.ceil(b))   # 上原子索引
            if 0 <= l < self.n_atoms and 0 <= u < self.n_atoms:
                if l == u:
                    projected[l] += next_probs[i]
                else:
                    projected[l] += next_probs[i] * (u - b)
                    projected[u] += next_probs[i] * (b - l)
        return projected

# 演示
np.random.seed(42)
c51 = C51Network(n_atoms=51, v_min=-10, v_max=10)
probs = c51.forward(None)
Q = c51.compute_Q(probs)

print("=== C51概念演示 ===")
print(f"原子数量: {c51.n_atoms}")
print(f"值域: [{c51.v_min}, {c51.v_max}]")
print(f"原子间隔: {c51.delta_z:.2f}")
print(f"前5个原子位置: {[f'{a:.1f}' for a in c51.atoms[:5]]}")
print(f"计算Q值: {Q:.2f}")
print(f"\nC51核心思想:")
print(f"  1. 将回报值域离散化为51个固定原子")
print(f"  2. 网络输出每个原子上的概率")
print(f"  3. Q = Σ z_i * p_i(加权平均)")
print(f"  4. 损失函数:交叉熵(分布vs投影分布)")
C51 分布表示\(Z(s, a) = \sum_{i=1}^{N} p_i(s, a) \cdot \delta_{z_i}, \quad z_i = V_{\min} + i \cdot \Delta z\)

什么用(应用):C51是Rainbow中的重要组成部分,在Atari游戏上贡献了显著的性能提升。它的离散化思想也启发了后续的分布式RL算法。C51特别适合奖励分布有明确上下界的场景。

哪些坑(缺点):V_min和V_max需要预先设定(如果实际回报超出范围会被截断);51个原子可能不够精细(对于大范围奖励);投影操作引入了额外的近似误差;原子数量N是固定超参数,N越大计算量越大。

三、QR-DQN——分位数回归

是什么(定义):QR-DQN(Quantile Regression DQN)使用分位数回归来学习回报分布。不同于C51固定原子位置、学习概率,QR-DQN固定概率(N个均匀分位数τ_i = i/N),学习每个分位数对应的值θ_i(s,a)。分布表示为:Z(s,a) = (1/N) Σ_i δ_{θ_i(s,a)}。

大白话 C51是"固定分数等级,猜每个等级的概率",QR-DQN是"固定概率(如中位数、75%分位、90%分位),猜每个概率对应的分数"。C51问"得80分的概率是多少?",QR-DQN问"有50%概率超过多少分?"。

为什么(原理):分位数回归(Quantile Regression)是一种统计方法,学习给定概率τ下的分位数。分位数损失(Huber quantile loss)的不对称性(对低估和高估施加不同惩罚)使得网络可以学习不同的分位数。QR-DQN比C51更灵活——不需要预设V_min/V_max,原子位置可以自适应调整。

怎么做(实现)

import numpy as np

# ==================== QR-DQN概念演示 ====================
class QRDQN:
    """QR-DQN的概念演示"""
    def __init__(self, n_quantiles=200):
        self.n_quantiles = n_quantiles
        # 分位数位置:τ_i = (i + 0.5) / N, i = 0, ..., N-1
        self.tau = (np.arange(n_quantiles) + 0.5) / n_quantiles

    def quantile_huber_loss(self, td_error, tau, kappa=1.0):
        """分位数Huber损失"""
        # Huber损失:对小于kappa的误差用MSE,大于kappa的用MAE
        huber = np.where(np.abs(td_error) <= kappa,
                         0.5 * td_error**2,
                         kappa * (np.abs(td_error) - 0.5 * kappa))
        # 分位数权重:低估和高估的惩罚不同
        quantile_weight = np.abs(tau - (td_error < 0).astype(float))
        return quantile_weight * huber

    def forward(self, state):
        """概念:输出N个分位数值"""
        # 实际中:神经网络输出N个分位数
        theta = np.random.randn(self.n_quantiles) * 2 + 5  # 模拟
        return np.sort(theta)  # 确保有序

    def compute_Q(self, theta):
        """从分位数计算Q值:Q = (1/N) * Σ θ_i"""
        return np.mean(theta)

# 演示
np.random.seed(42)
qr_dqn = QRDQN(n_quantiles=200)
theta = qr_dqn.forward(None)
Q = qr_dqn.compute_Q(theta)

print("=== QR-DQN概念演示 ===")
print(f"分位数数量: {qr_dqn.n_quantiles}")
print(f"前5个分位数τ: {[f'{t:.3f}' for t in qr_dqn.tau[:5]]}")
print(f"\n分位数θ值(前10个): {[f'{t:.1f}' for t in theta[:10]]}")
print(f"计算Q值: {Q:.2f}")
print(f"\n10%分位数(θ_20): {theta[20]:.1f}(有10%概率回报≤此值)")
print(f"50%分位数(θ_100): {theta[100]:.1f}(中位数)")
print(f"90%分位数(θ_180): {theta[180]:.1f}(有90%概率回报≤此值)")
print(f"\nQR-DQN核心思想:")
print(f"  1. 固定N个分位数位置τ_i")
print(f"  2. 网络学习每个分位数对应的值θ_i")
print(f"  3. Q = (1/N) Σ θ_i(均值)")
print(f"  4. 使用分位数Huber损失训练")
QR-DQN 分位数表示\(Z(s, a) = \frac{1}{N} \sum_{i=1}^{N} \delta_{\theta_i(s, a)}, \quad \tau_i = \frac{i - 0.5}{N}\)

什么用(应用):QR-DQN在Atari游戏上优于C51,且不需要预设V_min/V_max。它的分位数表示可以自然地处理任意范围的回报,适合回报分布未知的场景。QR-DQN也是Rainbow的组成部分之一。

哪些坑(缺点):分位数数量N通常较大(200),计算量比C51更大;分位数损失需要排序操作(θ_i必须单调递增),实现较复杂;在分布式RL中,QR-DQN的训练通常比C51更慢但最终性能更好。

四、C51 vs QR-DQN对比

是什么(定义):C51和QR-DQN代表了分布式RL的两种范式:C51固定位置学概率,QR-DQN固定概率学位置。两者各有优劣,在Rainbow中通常使用C51。

大白话 C51是"固定刻度,猜概率",QR-DQN是"固定概率,猜分数"。C51像预先画好刻度尺,QR-DQN像自适应调整刻度。C51实现简单,QR-DQN更灵活。

怎么做(实现)

import numpy as np

print("=" * 60)
print("C51 vs QR-DQN 对比")
print("=" * 60)

comparison = {
    "维度": ["C51", "QR-DQN"],
    "固定什么": ["原子位置 z_i", "分位数概率 τ_i"],
    "学习什么": ["每个原子的概率 p_i", "每个分位数的值 θ_i"],
    "参数数量": ["N(通常51)", "N(通常200)"],
    "需要预设值域": ["是(V_min, V_max)", "否"],
    "损失函数": ["交叉熵", "分位数Huber损失"],
    "分布表示": ["Σ p_i · δ_{z_i}", "(1/N) Σ δ_{θ_i}"],
    "Q值计算": ["Σ z_i · p_i", "(1/N) Σ θ_i"],
    "灵活性": ["较低(固定原子)", "较高(自适应位置)"],
    "计算复杂度": ["较低", "较高"],
    "Rainbow中使用": ["是(C51)", "否(通常用C51)"],
}

for key in comparison:
    print(f"\n{key}:")
    for i, val in enumerate(comparison[key]):
        print(f"  {['C51','QR-DQN'][i]}: {val}")

print(f"\n选择建议:")
print(f"  奖励范围已知 → C51(简单高效)")
print(f"  奖励范围未知 → QR-DQN(不需要预设)")
print(f"  追求最佳性能 → QR-DQN(通常更优)")
print(f"  集成到Rainbow → C51(标准选择)")

什么用(应用):理解两者的区别有助于在分布式RL中做出正确选择。在大多数实际应用中,C51足够好且更容易实现;在对性能要求极高的场景中,QR-DQN值得尝试。

哪些坑(缺点):分布式RL的整体计算量大于标准DQN(N倍参数);在简单任务中,分布式RL的增益可能不明显;超参数(N的大小、损失函数参数)需要调优。

五、分布式RL的贝尔曼方程

是什么(定义):分布式RL有自己的贝尔曼方程——分布贝尔曼方程(Distributional Bellman Equation):Z(s,a) = D R + γ·Z(s', a*),其中=D表示分布层面的相等。分布贝尔曼算子是γ-收缩的,保证了分布价值迭代的收敛性。

大白话 分布式RL的贝尔曼方程说:回报分布等于"即时奖励的分布 + 折扣的未来回报分布"。这个方程在分布层面成立,而不仅仅是期望层面。这意味着我们可以通过迭代来学习整个分布,而不仅仅是期望。

为什么(原理):分布贝尔曼算子的收缩性质(在Wasserstein距离下)保证了分布式RL的收敛性。这是分布式RL理论的基础。有趣的是,C51使用的交叉熵损失在Wasserstein距离下并不最小化,但它最小化的是Cramér距离——这解释了为什么C51在实践中有效。

怎么做(实现)

import numpy as np

# ==================== 分布贝尔曼方程演示 ====================
# 模拟一个简单的两状态、两动作环境
# 状态0:选择动作0有50%概率+1、50%概率-1,选择动作1必定+0.5
# 状态1:终止状态

# 状态0,动作0的回报分布(真实值)
action0_samples = np.random.choice([1, -1], size=10000, p=[0.5, 0.5])
action1_samples = np.ones(10000) * 0.5

print("=== 分布贝尔曼方程演示 ===")
print("状态0,动作0:回报分布 Z(0,0)")
print(f"  期望: {np.mean(action0_samples):.2f}")
print(f"  方差: {np.var(action0_samples):.2f}")
print(f"  分布: 50%概率+1, 50%概率-1")

print("\n状态0,动作1:回报分布 Z(0,1)")
print(f"  期望: {np.mean(action1_samples):.2f}")
print(f"  方差: {np.var(action1_samples):.2f}")
print(f"  分布: 100%概率+0.5")

print(f"\n传统DQN: Q(0,0)=0.0, Q(0,1)=0.5 → 选择动作1")
print(f"分布式RL: 动作0期望也是0.0,但分布更宽(有风险)")
print(f"  风险厌恶者: 选动作1(稳定0.5)")
print(f"  风险偏好者: 选动作0(有机会拿1.0)")
print(f"\n分布贝尔曼方程: Z(s,a) = R + γ·Z(s',a*)")
print(f"  在分布层面成立,不仅期望层面")
print(f"  这是分布式RL的理论基础")
分布贝尔曼方程\(Z(s, a) \stackrel{D}{=} R(s, a) + \gamma Z(S', A'), \quad A' = \arg\max_{a'} \mathbb{E}[Z(S', a')]\)

什么用(应用):理解分布贝尔曼方程有助于理解分布式RL的工作原理。在实现分布式RL算法时,分布贝尔曼方程的投影操作是关键。

哪些坑(缺点):分布贝尔曼方程的收敛性只在Wasserstein距离下严格成立,C51的交叉熵损失最小化的是Cramér距离;投影操作引入了额外的近似;分布贝尔曼算子的实现比期望贝尔曼算子复杂得多。

六、实战:分布式RL与标准DQN对比

是什么(定义):在网格世界上对比标准DQN和分布式DQN(C51风格)的学习效果。

怎么做(实现)

import numpy as np

n_states = 9; n_actions = 4
actions = [(-1, 0), (1, 0), (0, -1), (0, 1)]

def step(state, action):
    row, col = state // 3, state % 3
    dr, dc = actions[action]
    nr = max(0, min(2, row + dr))
    nc = max(0, min(2, col + dc))
    next_state = nr * 3 + nc
    if next_state == 8:   r = 10.0
    elif next_state == 7: r = -5.0
    else:                 r = -0.1
    return next_state, r, next_state in [7, 8]

def to_vec(s): v = np.zeros(n_states); v[s] = 1.0; return v

# 标准DQN vs 分布式DQN概念对比
print("=== 分布式RL vs 标准DQN ===")
print()
print("标准DQN输出: Q(s,a) = 标量(1个值)")
print("  例如: Q(0, 右) = 5.2")
print()
print("分布式DQN输出: 分布(N个值)")
print("  C51: 51个概率值 p_i,每个对应一个固定原子")
print("  QR-DQN: 200个分位数值 θ_i")
print()
print("分布式RL的优势:")
print("  1. 信息更丰富:知道风险(方差)而不仅是期望")
print("  2. 性能更好:在Atari游戏上显著优于标准DQN")
print("  3. 更稳定:分布学习提供了更强的学习信号")
print("  4. 风险感知:可以训练风险敏感的智能体")
print()
print("分布式RL的代价:")
print("  1. 参数更多:N倍(51或200倍)")
print("  2. 计算更慢:分布损失计算更复杂")
print("  3. 实现更复杂:投影操作/分位数损失")
print("  4. 超参数更多:N, V_min, V_max等")
print()
print("在Rainbow中:")
print("  C51+Double+Dueling+PER+Noisy+Multi-step = Rainbow")
print("  C51的分布学习贡献了约10-15%的性能提升")
print("  分布式RL是Rainbow的核心组件之一")

什么用(应用):分布式RL是当前DQN系列算法的最高水平。在需要风险感知的场景(金融、自动驾驶、医疗)中,分布式RL的优势尤为明显。

哪些坑(缺点):分布式RL的计算开销较大;在简单任务中收益不明显;分布表示的选择(C51 vs QR-DQN)需要根据任务决定。

概念关系图谱

概念上位概念核心思想关键公式/方法特点
分布式RL基于价值学习回报分布而非期望Z(s,a)分布信息更丰富
C51分布式RL固定原子学概率p_i(s,a), z_i固定简单高效
QR-DQN分布式RL固定分位数学值θ_i(s,a), τ_i固定灵活自适应
分布贝尔曼方程理论基础分布层面的递归关系Z=D R+γZ'收敛保证
Wasserstein距离分布度量衡量分布之间距离W_p(μ,ν)理论工具
分位数回归统计方法学习分布的分位数ρ_τ(δ)QR-DQN核心
投影操作C51必需将TD目标映射到原子双线性插值C51关键步骤

重点答疑

Q1: 分布式RL和传统RL的核心区别是什么?

传统RL:学习Q(s,a) = E[Z(s,a)],一个标量。 分布式RL:学习Z(s,a)的整个概率分布,一个概率分布。

这就像天气预报从"平均温度"升级为"温度分布"——分布式RL知道更多信息(方差、偏度、多模态),能做出更明智的决策。

解答:传统RL = 只知道平均值;分布式RL = 知道整个分布。分布包含风险信息,让决策更聪明。

Q2: C51和QR-DQN哪个更好?

QR-DQN在Atari游戏上的最终性能通常优于C51,但C51计算更简单。Rainbow中使用C51(因为与其他组件配合更好)。选择建议:简单任务→C51;追求极致性能→QR-DQN;集成到Rainbow→C51。

解答:QR-DQN性能更好,C51实现更简单。两者都是优秀的分布式RL算法。

Q3: 分布式RL的N(原子数/分位数)应该取多少?

C51:N=51是标准值,得名于此。更大的N(如101)可能带来微小提升但计算量倍增。 QR-DQN:N=200是常见值,比C51的51更多,因为分位数需要更多"样本"来准确表示分布。

解答:C51用51,QR-DQN用200。N越大分布表示越精细,但计算量也越大。

Q4: 分布式RL如何帮助处理稀疏奖励?

分布式RL本身不直接解决稀疏奖励问题,但它通过以下方式帮助:(1) 学习分布可以提供更强的学习信号(不仅仅是标量TD误差);(2) 分布的"形状"包含了关于奖励何时到来的信息;(3) 在Rainbow中,分布式RL与PER、Multi-step learning等组合,共同应对稀疏奖励。

解答:分布式RL的学习信号更丰富,但稀疏奖励还需要其他技巧(如PER、好奇心驱动)配合。

Q5: 为什么Rainbow选择C51而不是QR-DQN?

Rainbow论文选择的C51是因为:(1) C51在计算上更简单,更容易与其他组件(Double、Dueling、PER等)集成;(2) 当时(2017年)C51已经验证了分布式RL的有效性,QR-DQN(2017年底)出现较晚;(3) 实际性能差异不大,C51的简单性使其成为更好的工程选择。

解答:C51更简单、更早出现,且与其他组件配合良好。QR-DQN是后来的改进,但Rainbow的基准用了C51。

章节单词汇总

英文音标中文
distributional RL/ˌdɪstrɪˈbjuːʃənl ɑːr el/分布式强化学习
categorical/ˌkætəˈɡɔːrɪkl/分类的
quantile/ˈkwɑːntaɪl/分位数
atom/ˈætəm/原子
Wasserstein distance/ˈvɑːsərʃtaɪn ˈdɪstəns/Wasserstein距离
Huber loss/ˈhjuːbər lɔːs/Huber损失
quantile regression/ˈkwɑːntaɪl rɪˈɡreʃn/分位数回归
projection/prəˈdʒekʃn/投影
skewness/ˈskjuːnəs/偏度
multimodal/ˌmʌltiˈmoʊdl/多模态的
risk-sensitive/rɪsk ˈsensətɪv/风险敏感的
support/səˈpɔːrt/支撑集

面试练习

Q1 [单选] 分布式RL与传统RL的核心区别是什么?

  • A. 使用更深的神经网络
  • B. 学习回报的整个概率分布,而非仅学习期望
  • C. 使用多个智能体
  • D. 使用分布式计算
解答:分布式RL(Distributional RL)学习回报分布Z(s,a),而非仅学习期望Q(s,a)=E[Z]。注意"分布式RL"不是"分布式计算"的意思。

Q2 [单选] C51算法得名的原因是什么?

  • A. 使用51层神经网络
  • B. 将回报分布离散化为51个原子
  • C. 需要51个GPU
  • D. 有51个超参数
解答:C51(Categorical DQN)将回报值域离散化为51个固定原子(atoms),因此得名C51。

Q3 [多选] 以下关于C51和QR-DQN的说法,哪些是正确的?

  • A. C51固定原子位置,学习每个位置的概率
  • B. QR-DQN固定分位数概率,学习每个分位数的值
  • C. C51不需要预设值域范围
  • D. QR-DQN使用分位数Huber损失
解答:A正确,C51固定z_i,学习p_i。B正确,QR-DQN固定τ_i,学习θ_i。C错误,C51需要预设V_min和V_max。D正确,QR-DQN使用分位数Huber损失。

Q4 [单选] 在C51中,如何从分布计算Q值?

  • A. Q = max_i z_i
  • B. Q = Σ_i z_i · p_i
  • C. Q = min_i z_i
  • D. Q = median_i z_i
解答:Q值是分布的期望:Q = Σ_i z_i·p_i(s,a)。这是所有原子位置的概率加权平均。

Q5 [多选] 分布式RL相比传统RL的优势包括哪些?

  • A. 知道回报的方差(风险)
  • B. 在Atari游戏上性能更好
  • C. 计算量更小
  • D. 可以训练风险敏感的智能体
解答:A正确,分布包含方差信息。B正确,分布式RL在Atari上显著优于传统DQN。C错误,分布式RL计算量更大(N倍参数)。D正确,有了分布就可以根据风险偏好做决策。

Q6 [单选] QR-DQN中,分位数τ_i = 0.5对应的θ_i是什么?

  • A. 最小值
  • B. 中位数
  • C. 最大值
  • D. 平均值
解答:τ_i=0.5对应的是中位数(50%分位数),即有50%概率回报≤θ_i,50%概率≥θ_i。

Q7 [单选] 分布贝尔曼方程的收敛性在什么距离下保证?

  • A. 欧氏距离
  • B. 曼哈顿距离
  • C. Wasserstein距离
  • D. 余弦距离
解答:分布贝尔曼算子T^D在Wasserstein距离下是γ-收缩的,保证了分布式值迭代的收敛性。C51最小化的是Cramér距离。

Q8 [多选] 以下哪些是分布式RL算法的组成部分(Rainbow中)?

  • A. C51(分类分布学习)
  • B. TRPO
  • C. Double DQN
  • D. Prioritized Experience Replay
解答:A、C、D都是Rainbow的组成部分。Rainbow = C51 + Double DQN + Dueling DQN + PER + Multi-step + Noisy Nets。B(TRPO)是基于策略的方法,不属于DQN系列。

Q9 [单选] 在C51中,投影操作的作用是什么?

  • A. 增加网络深度
  • B. 将TD目标分布映射到固定的原子上
  • C. 减少网络参数量
  • D. 加速训练
解答:投影操作将r+γz_i映射到最近的原子位置上,因为TD目标值可能不在预设的原子位置上。这是C51实现分布贝尔曼方程的关键步骤。

Q10 [多选] 以下哪些是分布式RL的潜在缺点?

  • A. 参数数量是标准DQN的N倍
  • B. 计算复杂度更高
  • C. 无法学习Q值
  • D. 需要额外的超参数(如N, V_min, V_max)
解答:A正确,分布式RL需要N个输出而非1个。B正确,分布损失计算更复杂。C错误,分布式RL仍然可以计算Q值(分布的期望)。D正确,C51需要V_min/V_max/N,QR-DQN需要N。