强化学习笔记(二)多臂老虎机(一)

多臂老虎机

强化学习使用对所采取动作的评价进行训练,而不是通过给出正确动作为指导。这导致其需要主动探索、显式搜索良好行为。

  • 评价性反馈:表明所采取动作的好坏,但不说明是否为最优或最差动作。
  • 指导性反馈:直接给出正确动作,与实际采取的动作无关。

强化学习使用评价性反馈(evaluative feedback),而非指导性反馈。评价性反馈完全依赖于所采取的动作(不同的动作会有不用的反馈),而指导性反馈则与所采取的动作无关(不同的动作会有相同的反馈)。这部分中只研究强化学习的评价性特征,在一个简化场景中进行,该场景为非关联性问题,不涉及在多种情境下学习如何行动。

在这里插入图片描述

[!NOTE]

想象你面前有多个老虎机(比如10台),每台机器拉下拉杆后会以某种未知概率给你不同金额的奖励。你的目标是在有限次数的拉杆操作中,最大化总奖励

但问题是:你不知道每台机器的真实收益分布 —— 有些机器可能回报高,有些可能回报低。

k臂老虎机问题可以定义为面临 k 个不同动作(或选项)的重复选择;每次选择一个动作后,获得一个数值奖励;奖励来自依赖于所选动作的平稳概率分布,你的目标是在有限时间步(如1000步)内,最大化累计奖励的期望值。当前的“老虎机问题”特指此简单非关联性情形,不涉及状态变化。

动作价值

每个动作 a 有一个真实价值 $ q_*(a) $,定义为选择该动作时的期望奖励
q∗(a)≐E[Rt∣At=a] q_*(a) \doteq \mathbb{E}[R_t \mid A_t = a] q(a)E[RtAt=a]

  • $ A_t $:时间步 $ t $ 选择的动作
  • $ R_t $:时间步 $ t $ 获得的奖励

当前动作价值的真实价值未知,需进行估计。用 $ Q_t(a) $ 表示在时间步 $ t $ 时对动作 a价值估计。当前的目标是使 $ Q_t(a) $ 尽可能接近 $ q_*(a) $。

贪婪动作、探索与价值

当前时间步估计价值最高的动作被称为贪婪动作。由此我们可以引出利用和探索的定义。利用是选择贪婪动作,以最大化当前步的期望奖励。探索是选择非贪婪动作,以改进其价值估计。探索短期收益低,但可能发现更优动作,长期收益更高。探索与利用之间存在冲突,何时探索或利用,取决于估计值的精度、不确定性大小、剩余时间步数。

动作价值方法

动作价值方法指用于估计动作价值基于估计进行动作选择的一类方法。动作的价值的真实值是选择这个动作时的期望收益

估计价值

样本平均法通过计算实际收益的平均值来估计动作的价值:
Qt(a)≐在 t 前选择 a 所获奖励之和在 t 前选择 a 的次数=∑i=1t−1Ri⋅1Ai=a∑i=1t−11Ai=a Q_t(a) \doteq \frac{\text{在 } t \text{ 前选择 } a \text{ 所获奖励之和}}{\text{在 } t \text{ 前选择 } a \text{ 的次数}} = \frac{\sum_{i=1}^{t-1} R_i \cdot \mathbb{1}_{A_i=a}}{\sum_{i=1}^{t-1} \mathbb{1}_{A_i=a}} Qt(a) t 前选择 a 的次数 t 前选择 a 所获奖励之和=i=1t11Ai=ai=1t1Ri1Ai=a

  • 其中 1predicate\mathbb{1}_{predicate}1predicate 表示一个随机变量,当 predicate 为真时取值为1,否则为0。
  • 若分母为0,定义 $ Q_t(a) $ 为默认值(如0)。
  • 根据大数定律,当选择次数趋于无穷时,$ Q_t(a) \to q_*(a) $。

贪婪动作选择

贪婪动作选择指的是选择当前估计价值最高的动作:
At≐argmax⁡a Qt(a) A_t \doteq \underset{a}{\operatorname{argmax}}\ Q_t(a) Ataargmax Qt(a)
若有多个最大值,任意选择(如随机)。其始终利用当前知识,最大化即时奖励。存在不探索,可能错过更优动作的缺点。

对贪心策略的优化

一种优化方法是大多数时间选择贪婪动作;以小概率 $ \varepsilon $​,随机均匀选择所有动作(包括贪婪动作),与估计值无关,从而实现探索与利用的平衡。这个方法的优点是,随着步数趋于无穷,每个动作都会被无限次采样,从而确保所有 Qt(a)Q_t(a)Qt(a) 收敛到 q∗(a)q_*(a)q(a)。这意味着选择最优动作的概率将收敛到大于 1−ε1 - \varepsilon1ε 的值,即接近确定。然而,这些只是渐近性保证,对于方法在实际中的有效性说明有限。

练习2.1

在 ε-贪婪动作选择中,在有两个动作及 ε = 0.5 的情况下,贪婪动作被选择的概率是多少?

在 ε-贪婪策略中:

  • 以概率 1 - ε,选择当前估计价值最高的动作(即贪婪动作)利用
  • 以概率 ε从所有 k 个动作中均匀随机选择一个动作探索

注意:在“探索”阶段,即使选中了当前的贪婪动作,那也是随机选中的,不是因为它是贪婪动作

  • 动作数量:k = 2
  • ε = 0.5

贪婪动作可以在两种情况下被选中:

  1. 利用阶段(概率 = 1 - ε = 0.5) → 一定选择贪婪动作
    → 贡献概率:0.5 × 1 = 0.5

  2. 探索阶段(概率 = ε = 0.5) → 随机均匀选择两个动作中的一个
    → 贪婪动作被随机选中的概率 = 1/2
    → 贡献概率:**0.5 × (1/2) = 0.2

P(选择贪婪动作)=0.5+0.25=0.75 P(\text{选择贪婪动作}) = 0.5 + 0.25 = \boxed{0.75} P(选择贪婪动作)=0.5+0.25=0.75

在 ε = 0.5 且有两个动作的情况下,贪婪动作被选择的概率是 0.75

实验一

为评估贪婪方法与 ε\varepsilonε-贪婪方法的性能,将使用 样本平均法 估计动作价值,并在 2000 个随机生成的 10 臂老虎机问题 上,每个问题运行 1000 步,最后报告:

  1. 平均奖励随时间步的变化曲线
  2. 最优动作选择比例随时间步的变化曲线

其中

  • 每个动作的真实价值 $ q_*(a) $ 从均值为0、方差为1的正态分布中随机生成;
  • 每次选择动作后,实际奖励 $ R_t $ 从均值为 $ q_*(A_t) $、方差为1的正态分布中采样。
    在这里插入图片描述
    图2.1: 十个动作中每个动作的真实值 q∗(a)q_*(a)q(a) 是根据均值为0、方差为1的正态分布选取的,随后实际奖励根据均值为 q∗(a)q_*(a)q(a)、方差为1的正态分布选取,如灰色分布所示。

import numpy as np
import matplotlib.pyplot as plt

k = 10                  # 臂的数量
n_steps = 1000          # 每个任务的时间步数
n_problems = 2000       # 任务数量
epsilons = [0.0, 0.01, 0.1]  # 不同的 epsilon 值

# rewards、optimal_actions 是典,键是eps,值是形状为 (2000, 1000)的NumPy数组。
rewards = {eps: np.zeros((n_problems, n_steps)) for eps in epsilons}
optimal_actions = {eps: np.zeros((n_problems, n_steps)) for eps in epsilons}

# 主循环 进行两千次实验
for problem_idx in range(n_problems):
    # 生成当前问题的真实动作价值 q*(a) ~ N(0, 1)
    true_q = np.random.randn(k)
    best_action = np.argmax(true_q)  # 最优动作

    # 对每个 epsilon 策略进行实验
    for eps in epsilons:
        # 初始化估计值 Q(a) 和选择次数 N(a)
        Q = np.zeros(k)
        N = np.zeros(k)

        for t in range(n_steps):
            # ε-贪婪动作选择
            if np.random.rand() < eps:
                action = np.random.randint(k)  # 探索:随机选动作
            else:
                action = np.argmax(Q)          # 利用:选当前最优

            # 记录是否选择了最优动作
            optimal_actions[eps][problem_idx, t] = 1 if action == best_action else 0

            # 生成奖励 R ~ N(q*(a), 1)
            reward = np.random.randn() + true_q[action]
            rewards[eps][problem_idx, t] = reward

            # 增量更新 Q(a)
            N[action] += 1
            Q[action] += (reward - Q[action]) / N[action]

# 计算平均结果
avg_rewards = {eps: np.mean(rewards[eps], axis=0) for eps in epsilons}
avg_optimal = {eps: np.mean(optimal_actions[eps], axis=0) for eps in epsilons}

# 绘图
plt.figure(figsize=(12, 8))

# 上图:平均奖励
plt.subplot(2, 1, 1)
for eps in epsilons:
    label = f"ε = {eps}" if eps > 0 else "Greedy (ε = 0)"
    plt.plot(avg_rewards[eps], label=label)
plt.title("10-Armed Testbed: Average Reward over Time")
plt.xlabel("Time Step")
plt.ylabel("Average Reward")
plt.legend()
plt.grid(True)

# 下图:最优动作选择比例
plt.subplot(2, 1, 2)
for eps in epsilons:
    label = f"ε = {eps}" if eps > 0 else "Greedy (ε = 0)"
    plt.plot(avg_optimal[eps], label=label)
plt.title("10-Armed Testbed: % Optimal Action over Time")
plt.xlabel("Time Step")
plt.ylabel("% Optimal Action")
plt.legend()
plt.grid(True)

plt.tight_layout()
plt.savefig("10_arm_testbed_results.png", dpi=300)
plt.show()

在这里插入图片描述

图2.2:比较了贪婪方法与两种ε\varepsilonε-贪婪方法(ε=0.01\varepsilon = 0.01ε=0.01ε=0.1\varepsilon = 0.1ε=0.1)在10臂测试平台上的表现。所有方法均使用样本平均法来估计动作价值。上图显示了期望奖励随经验增长的情况。贪婪方法在最开始略微提升更快,但随后趋于平稳,且稳定在较低水平。其每步平均奖励仅为约1,而该测试平台上的最优可能值约为1.55。贪婪方法在长期表现较差,因为它常常陷入执行次优动作的情况。

主要结果:

  • 贪婪方法

    • 初期提升较快,但很快陷入局部最优;
    • 在约三分之二的任务中未能识别最优动作;
    • 长期平均每步奖励约为1(远低于最优值约1.55);
    • 因缺乏探索,常被次优动作“锁定”。
  • ε\varepsilonε-贪婪方法

    • 通过持续探索,能更可靠地发现最优动作;
    • ε=0.1\varepsilon = 0.1ε=0.1:探索频繁,更快找到最优动作,但最多仅以91%的概率选择最优动作;
    • ε=0.01\varepsilon = 0.01ε=0.01:探索较少,初期进展慢,但长期性能优于 ε=0.1\varepsilon = 0.1ε=0.1
    • 可通过随时间降低 ε\varepsilonε 来兼顾探索与利用。

关键结论:

  • ε\varepsilonε-贪婪方法在长期表现上显著优于纯贪婪方法;
  • 探索的重要性取决于任务特性:
    • 奖励噪声越大(方差高),越需要探索;
    • 即使在确定性环境中,若任务非平稳(动作价值随时间变化),探索仍必不可少;
  • 在强化学习中,由于策略演化导致决策任务动态变化,探索与利用的平衡是必要且普遍的要求

练习 2.2

题目:
考虑一个 k = 4 的多臂赌博机问题,记作动作 1、2、3、4。
算法使用 ε-贪婪动作选择,基于采样平均的动作价值估计,初始估计 $ Q_1(a) = 0, \forall a $。
假设动作及收益的最初顺序是:
$ A_1 = 1, R_1 = -1 $
$ A_2 = 2, R_2 = 1 $
$ A_3 = 2, R_3 = -2 $
$ A_4 = 2, R_4 = 2 $
$ A_5 = 3, R_5 = 0 $

问:在哪些时刻中,肯定发生了随机探索(即 ε 情形)?在哪些时刻中,可能发生

  • 初始时,所有 $ Q_1(a) = 0 $,所以第 1 步时所有动作价值相等 → 任意动作都是“贪婪动作”
  • ε-贪婪策略:以概率 $ 1 - \varepsilon $ 选择当前估计最优动作(若有多个,可任选其一);以概率 $ \varepsilon $ 随机选动作。
  • 关键:只有当所选动作不是当前估计最优动作时,才“肯定”是探索
    如果所选动作是当前最优动作,则可能是利用(大概率),也可能是探索时“碰巧”选中了最优动作(小概率)。

我们用采样平均法更新 $ Q_t(a) $:

时间步 t=1:

  • 选 $ A_1 = 1 $,得 $ R_1 = -1 $
  • 所有 Q 初始为 0 → 任意动作都是贪婪动作 → 选动作 1 可以是利用(任意选一个最优),也可以是探索
  • 结论:可能发生了探索(不能肯定)

更新后:

  • $ Q_2(1) = -1 $,其余仍为 0

时间步 t=2:

  • 当前估计:
    • Q(1) = -1
    • Q(2)=Q(3)=Q(4)=0 → 最优动作是 {2,3,4}(任选其一)
  • 实际选 $ A_2 = 2 $ → 是当前最优动作之一
  • 结论:可能是利用(选了最优),也可能是探索时碰巧选中 → 不能肯定发生了探索

更新后:

  • $ Q_3(2) = 1 $(第一次选动作 2,直接赋值)
  • Q(1) = -1,Q(3)=Q(4)=0

时间步 t=3:

  • 当前估计:
    • Q(1) = -1
    • Q(2) = 1 ← 最优!
    • Q(3)=Q(4)=0
  • 实际选 $ A_3 = 2 $ → 是当前唯一最优动作
  • 所以:如果是利用,一定选 2;如果是探索,有 1/4 概率选 2
  • 结论:不能肯定发生了探索(可能是利用,也可能是探索碰巧)

更新后(动作 2 第二次被选):

  • $ Q_4(2) = \frac{1 + (-2)}{2} = -0.5 $

时间步 t=4:

  • 当前估计:
    • Q(1) = -1
    • Q(2) = -0.5
    • Q(3)=Q(4)=0 → 最优动作是 {3,4}
  • 实际选 $ A_4 = 2 $ → 不是最优动作
  • 关键点:只有探索阶段才会选择非贪婪动作
  • 结论:肯定发生了探索(ε情形)

更新后:

  • 动作 2 第三次被选:$ Q_5(2) = \frac{1 + (-2) + 2}{3} = \frac{1}{3} ≈ 0.333 $

时间步 t=5:

  • 当前估计:
    • Q(1) = -1
    • Q(2) ≈ 0.333
    • Q(3)=Q(4)=0 → 最优动作是 {2}(唯一最大)
  • 实际选 $ A_5 = 3 $ → 不是最优动作
  • 结论:肯定发生了探索

肯定发生了探索(ε情形)的时刻:
t = 4 和 t = 5

可能发生了探索的时刻:
t = 1, 2, 3

增量实现

在强化学习中,动作价值方法通过估计每个动作的期望奖励来指导决策。最直接的方式是将动作价值 $ Q(a) $ 估计为该动作所获得奖励的样本平均值。但若每次更新都重新计算所有历史奖励的平均值,会导致:内存消耗随时间增长每步计算量逐渐增加因此引入增量更新

设某动作被选择 $ n-1 $ 次后,其价值估计为:

Qn=R1+R2+⋯+Rn−1n−1 Q_n = \frac{R_1 + R_2 + \cdots + R_{n-1}}{n-1} Qn=n1R1+R2++Rn1

当第 $ n $ 次选择该动作并获得奖励 $ R_n $ 后,新的估计应为:

Qn+1=1n∑i=1nRi Q_{n+1} = \frac{1}{n} \sum_{i=1}^{n} R_i Qn+1=n1i=1nRi

将其改写为仅依赖旧估计 $ Q_n $ 和新奖励 $ R_n $ 的形式:

Qn+1=1n(Rn+∑i=1n−1Ri)=1n(Rn+(n−1)⋅1n−1∑i=1n−1Ri)=1n(Rn+(n−1)Qn)=1n(Rn+nQn−Qn)=Qn+1n(Rn−Qn) \begin{align*} Q_{n+1} &= \frac{1}{n} \left( R_n + \sum_{i=1}^{n-1} R_i \right) \\ &= \frac{1}{n} \left( R_n + (n-1) \cdot \frac{1}{n-1} \sum_{i=1}^{n-1} R_i \right) \\ &= \frac{1}{n} \left( R_n + (n-1) Q_n \right) \\ &= \frac{1}{n} \left( R_n + n Q_n - Q_n \right) \\ &= Q_n + \frac{1}{n} (R_n - Q_n) \end{align*} Qn+1=n1(Rn+i=1n1Ri)=n1(Rn+(n1)n11i=1n1Ri)=n1(Rn+(n1)Qn)=n1(Rn+nQnQn)=Q

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值