复杂环境决策中的强化学习入门
强化学习是一种强大的机器学习方法,用于在复杂环境中进行决策。它涉及一系列学习算法,包括动态规划、蒙特卡罗方法、时间差分学习等。下面将详细介绍这些算法及其应用。
1. 动态规划
动态规划是解决强化学习问题的一种方法,但它基于一些假设:
- 对环境动态有完全的了解,即所有的转移概率 $p(s’,r’|s, a)$ 都是已知的。
- 智能体的状态具有马尔可夫性质,即下一个动作和奖励仅取决于当前状态和当前时间步的动作选择。
动态规划有两个主要目标:
1.
获得真实的状态价值函数 $v_{\pi}(s)$
:这也被称为预测任务,通过策略评估来完成。
2.
找到最优值函数 $v_{*}(s)$
:通过广义策略迭代来实现。
策略评估
基于贝尔曼方程,当环境动态已知时,我们可以使用动态规划计算任意策略 $\pi$ 的价值函数。计算时采用迭代的方法,从 $v^{\langle 0\rangle}(s)$ 开始,每个状态初始化为零值。在每次迭代 $i + 1$ 时,根据贝尔曼方程更新每个状态的值,公式如下:
$v^{\langle i+1\rangle}(s) = \sum_{\pi(a|s)} \sum_{s’\in\hat{S},r\in\hat{R}} p(s’, r|s, a)[r+ \gamma v^{\langle i\rangle}(s’)]$
随着迭代次数趋于无穷,$v^{\langle i\rangle}(s)$ 会收敛到真实的状态价值函数 $v_{\pi}(s)$。而且,由于我们已经准确知道环境动态,所以不需要与环境进行交互,就可以轻松估计价值函数。
策略改进
计算出价值函数 $v_{\pi}(s)$ 后,我们可以利用它来改进现有策略 $\pi$。目标是找到一个新的策略 $\pi’$,使得对于每个状态 $s$,遵循 $\pi’$ 所获得的值高于或至少等于当前策略 $\pi$。具体步骤如下:
1. 计算每个状态 $s$ 和动作 $a$ 的动作价值函数 $q_{\pi}(s, a)$。
2. 遍历所有状态,对于每个状态 $s$,比较选择动作 $a$ 后下一个状态 $s’$ 的值。
3. 如果当前策略建议的动作(即 $\arg \max_{a} \pi(a|s)$)与动作价值函数建议的动作(即 $\arg \max_{a} q_{\pi}(s, a)$)不同,则更新策略,使动作概率与给出最高动作价值的动作相匹配。这就是策略改进算法。
策略迭代
使用策略改进算法,如果当前策略不是最优的,策略改进将严格产生一个更好的策略。因此,通过迭代执行策略评估和策略改进,我们可以保证找到最优策略。
价值迭代
将策略评估和策略改进两个任务合并为一个步骤可以更高效。以下方程基于最大化下一个状态值和其即时奖励的加权和($r+ \gamma v^{\langle i\rangle}(s’)$)的动作来更新迭代 $i + 1$ 的价值函数:
$v^{\langle i+1\rangle}(s) = \max_{a} \sum_{s’,r} p(s’, r|s, a)[r+ \gamma v^{\langle i\rangle}(s’)]$
在这种情况下,$v^{\langle i+1\rangle}(s)$ 的更新值通过从所有可能的动作中选择最佳动作来最大化,而在策略评估中,更新值使用所有动作的加权和。
2. 蒙特卡罗强化学习
动态规划假设环境动态完全已知,但在大多数情况下并非如此。蒙特卡罗方法则假设我们对环境动态一无所知,智能体通过与环境交互来学习。
状态价值函数估计
蒙特卡罗方法通过生成模拟情节来解决问题。在生成一组情节后,对于每个状态 $s$,考虑所有经过该状态的情节来计算其值。使用查找表 $V(S_t= s) \approx v_{\pi}(s)$ 来获取对应的值。蒙特卡罗更新基于从第一次访问状态 $s$ 开始在该情节中获得的总回报,这种算法称为首次访问蒙特卡罗价值预测。
动作价值函数估计
当环境动态未知时,无法像动态规划那样从状态价值函数轻松推断动作价值函数。我们可以扩展首次访问蒙特卡罗状态价值预测算法,计算每个状态 - 动作对的估计回报。但可能会出现某些动作从未被选择的问题,导致探索不足。解决方法有:
-
探索性开始
:假设每个状态 - 动作对在情节开始时都有非零概率。
-
$\epsilon$-贪心策略
:让非最优动作有小概率($\epsilon$)被选择。
寻找最优策略
蒙特卡罗控制是改进策略的优化过程。类似于动态规划中的策略迭代方法,我们可以反复交替进行策略评估和策略改进,直到达到最优策略。从随机策略 $\pi_0$ 开始,过程如下:
$\pi_0 \xrightarrow{Eval.} q_{\pi_0} \xrightarrow{Improve} \pi_1 \xrightarrow{Eval.} q_{\pi_1} \xrightarrow{Improve} \pi_2 \cdots \xrightarrow{Eval.} q_{
} \xrightarrow{Improve} \pi_{
}$
策略改进
给定动作价值函数 $q(s, a)$,我们可以生成贪心(确定性)策略:
$\pi(s) \triangleq\arg \max_{a} q(s, a)$
为了避免探索不足的问题,采用 $\epsilon$-贪心策略,所有非最优动作在状态 $s$ 有最小的 $\frac{\epsilon}{|A(s)|}$ 概率被选择,而最优动作有 $1 - \frac{(|A(s)| -1) \times \epsilon}{|A(s)|}$ 的概率被选择。
3. 时间差分学习
时间差分学习是蒙特卡罗方法的改进或扩展,它也基于经验学习,不需要了解环境动态和转移概率。与蒙特卡罗方法的主要区别在于,蒙特卡罗方法需要等到情节结束才能计算总回报,而时间差分学习可以在情节结束前利用已学习的属性更新估计值,这称为自举。
时间差分学习也有两个任务:
-
估计价值函数(价值预测)
-
改进策略(控制任务)
TD 预测
回顾蒙特卡罗的价值预测,在每个情节结束时,我们可以估计每个时间步 $t$ 的回报 $G_t$,并更新访问状态的估计值:
$V(S_t) = V(S_t) + \alpha(G_t - V(S_t))$
在时间差分学习中,我们用新的目标回报 $G_{t:t+1}$ 代替实际回报 $G_{t:T}$,更新公式如下:
$V(S_t) = V(S_t) + \alpha[G_{t:t+1} - V(S_t)]$
其中,目标回报 $G_{t:t+1} \triangleq R_{t+1} + \gamma V(S_{t+1}) = r+ \gamma V(S_{t+1})$,使用观察到的奖励 $R_{t+1} = r$ 和下一个即时步骤的估计值。这也被称为 TD(0)。
TD(0) 算法可以推广到所谓的 $n$ 步 TD 算法,它结合了更多未来步骤的加权和。$n$ 步 TD 的更新规则如下:
$V(S_t) = V(S_t) + \alpha[G_{t:t+n} - V(S_t)]$
$G_{t:t+n}$ 的定义为:
$G_{t:t+n}\triangleq\begin{cases} R_{t+1} + \gamma R_{t+2} + \cdots\gamma^{n-1}R_{t+n}+ \gamma^{n}V(S_{t+n}) & \text{if } t+ n< T \ G_{t:T} & \text{otherwise} \end{cases}$
TD 控制
TD 控制有两种算法:
-
基于策略的 TD 控制(SARSA)
:为简单起见,考虑一步 TD 算法(TD(0))。将状态价值函数的预测公式扩展到描述动作价值函数,使用查找表 $Q(S_t,A_t)$ 表示每个状态 - 动作对的动作价值函数,更新公式如下:
$Q(S_t, A_t) = Q(S_t,A_t) + \alpha[R_{t+1} + \gamma Q(S_{t+1},A_{t+1}) - Q(S_t, A_t)]$
这个算法通常被称为 SARSA,指的是更新公式中使用的五元组 $(S_t,A_t,R_{t+1},S_{t+1}, A_{t+1})$。
-
离策略 TD 控制(Q 学习)
:与 SARSA 不同,Q 学习在更新动作价值函数时,不使用智能体实际采取的动作 $A_{t+1}$ 的值,而是找到即使当前策略未选择的最佳动作。更新 Q 值的公式如下:
$Q(S_t,A_t) = Q(S_t, A_t) + \alpha[R_{t+1} + \gamma \max_{a} Q(S_{t+1}, a) - Q(S_t,A_t)]$
4. 实现第一个强化学习算法
我们将使用 OpenAI Gym 工具包实现 Q 学习算法来解决网格世界问题。
引入 OpenAI Gym 工具包
OpenAI Gym 是一个专门用于促进强化学习模型开发的工具包,它带有几个预定义的环境,如 CartPole 和 MountainCar,还提供了开发新环境的统一框架。可以使用以下命令安装 gym 库:
pip install gym
使用 OpenAI Gym 中的现有环境
以 CartPole-v1 环境为例,该环境中有一个连接在可水平移动的小车上的杆子,目标是让强化学习智能体学习如何移动小车来稳定杆子,防止其向两侧倾倒。
以下是一些操作示例:
import gym
env = gym.make('CartPole-v1')
print(env.observation_space) # Box(4,)
print(env.action_space) # Discrete(2)
state = env.reset()
print(state) # 初始状态
next_state, reward, done, info = env.step(action=0)
print(next_state, reward, done, info)
next_state, reward, done, info = env.step(action=1)
print(next_state, reward, done, info)
这个环境的观察空间是四维空间,对应小车的位置、速度、杆子的角度和杆子尖端的速度;动作空间是离散的,有两个选择:向左或向右推动小车。每次调用
env.step()
会返回一个包含四个元素的元组:新状态的数组、奖励、是否完成情节的标志和其他信息。
总结
本文介绍了强化学习中的多种算法,包括动态规划、蒙特卡罗方法、时间差分学习及其分支(SARSA 和 Q 学习),并展示了如何使用 OpenAI Gym 工具包实现 Q 学习算法。这些算法各有优缺点,适用于不同的场景。例如,动态规划虽然基于理想假设,但有助于理解强化学习的基本概念;蒙特卡罗方法和时间差分学习则更适用于实际应用,尤其是在环境动态未知的情况下。
以下是这些算法的对比表格:
| 算法 | 环境动态要求 | 学习方式 | 特点 |
| ---- | ---- | ---- | ---- |
| 动态规划 | 完全已知 | 不与环境交互 | 理论基础,有助于理解概念 |
| 蒙特卡罗方法 | 未知 | 模拟经验 | 通过生成情节学习 |
| 时间差分学习 | 未知 | 经验学习 | 可提前更新估计值 |
mermaid 格式流程图展示强化学习算法的推进过程:
graph LR
A[动态规划] --> B[蒙特卡罗方法]
B --> C[时间差分学习]
C --> C1[SARSA]
C --> C2[Q 学习]
通过这些算法和工具,我们可以在复杂环境中为智能体找到最优策略,实现高效的决策。
复杂环境决策中的强化学习入门
5. Q 学习算法解决网格世界问题的深入分析
在前面我们已经了解了如何引入 OpenAI Gym 工具包以及使用其中的 CartPole 环境,接下来我们将更深入地探讨如何使用 Q 学习算法解决网格世界问题。
网格世界问题概述
网格世界是一个经典的强化学习环境,智能体在一个二维网格中移动,目标是从起始位置到达目标位置,同时避免进入陷阱。在这个环境中,智能体的状态可以用其在网格中的坐标表示,动作通常包括上下左右移动。
Q 学习算法实现步骤
以下是使用 Q 学习算法解决网格世界问题的详细步骤:
- 初始化 Q 表 :Q 表是一个二维数组,用于存储每个状态 - 动作对的 Q 值。初始时,Q 表中的所有值都可以设为 0。
import numpy as np
# 假设网格世界的状态数为 num_states,动作数为 num_actions
num_states = 16 # 示例值,根据实际情况修改
num_actions = 4 # 上下左右四个动作
Q_table = np.zeros((num_states, num_actions))
- 设置超参数 :包括学习率 $\alpha$、折扣因子 $\gamma$ 和探索率 $\epsilon$。
alpha = 0.1 # 学习率
gamma = 0.9 # 折扣因子
epsilon = 0.1 # 探索率
- 循环训练 :进行多个回合的训练,每个回合中智能体在环境中执行动作并更新 Q 表。
import gym
# 创建网格世界环境
env = gym.make('FrozenLake-v0') # 示例环境,可根据实际情况修改
num_episodes = 1000 # 训练回合数
for episode in range(num_episodes):
state = env.reset() # 重置环境,获取初始状态
done = False
while not done:
# 选择动作
if np.random.uniform(0, 1) < epsilon:
action = env.action_space.sample() # 探索:随机选择动作
else:
action = np.argmax(Q_table[state, :]) # 利用:选择 Q 值最大的动作
# 执行动作,获取下一个状态、奖励和是否完成标志
next_state, reward, done, _ = env.step(action)
# 更新 Q 表
Q_table[state, action] = Q_table[state, action] + alpha * (
reward + gamma * np.max(Q_table[next_state, :]) - Q_table[state, action]
)
state = next_state # 更新状态
- 测试智能体 :训练完成后,使用训练好的 Q 表让智能体在环境中执行动作,观察其表现。
state = env.reset()
done = False
total_reward = 0
while not done:
action = np.argmax(Q_table[state, :])
next_state, reward, done, _ = env.step(action)
total_reward += reward
state = next_state
print(f"测试总奖励: {total_reward}")
对 Q 学习算法的优化思考
在实际应用中,Q 学习算法可能存在一些问题,例如收敛速度慢、探索不足等。以下是一些优化方法:
- 动态调整探索率 $\epsilon$ :在训练初期,为了让智能体充分探索环境,$\epsilon$ 可以设置得较大;随着训练的进行,逐渐减小 $\epsilon$,让智能体更多地利用已学习到的知识。
epsilon = 1.0
epsilon_decay = 0.995
epsilon_min = 0.01
for episode in range(num_episodes):
if epsilon > epsilon_min:
epsilon *= epsilon_decay
# 其他训练代码...
- 使用经验回放 :将智能体的经验(状态、动作、奖励、下一个状态)存储在一个经验池中,每次更新 Q 表时,从经验池中随机采样一批经验进行学习,这样可以提高数据的利用率,加快收敛速度。
6. 强化学习算法的应用场景分析
强化学习算法在许多领域都有广泛的应用,以下是一些常见的应用场景:
- 游戏领域 :如 Atari 游戏、围棋等。在这些游戏中,智能体通过与环境交互不断学习,最终达到或超越人类玩家的水平。例如,AlphaGo 就是利用强化学习算法在围棋领域取得了巨大的成功。
- 机器人控制 :机器人需要在复杂的环境中完成各种任务,如抓取物品、导航等。强化学习可以让机器人通过不断尝试和学习,找到最优的控制策略。
- 自动驾驶 :自动驾驶汽车需要在道路上做出实时的决策,如加速、减速、转弯等。强化学习可以根据不同的路况和交通规则,为自动驾驶汽车找到安全、高效的驾驶策略。
- 资源管理 :在云计算、能源管理等领域,需要对资源进行合理的分配和调度。强化学习可以根据不同的需求和资源状态,优化资源分配策略,提高资源利用率。
7. 强化学习算法的未来发展趋势
随着技术的不断发展,强化学习算法也在不断演进和创新。以下是一些未来的发展趋势:
- 结合深度学习 :深度学习可以处理复杂的感知任务,如图像识别、语音识别等。将深度学习与强化学习相结合,可以让智能体更好地理解环境,提高决策的准确性。例如,深度 Q 网络(DQN)就是将卷积神经网络与 Q 学习算法相结合,在 Atari 游戏中取得了很好的效果。
- 多智能体强化学习 :在现实世界中,往往存在多个智能体相互协作或竞争的情况。多智能体强化学习可以研究多个智能体之间的交互和合作,为解决复杂的多智能体系统问题提供方法。
- 无模型强化学习的发展 :目前的强化学习算法大多需要对环境进行建模,但在一些复杂的环境中,建模是非常困难的。无模型强化学习可以直接从环境中学习,不需要对环境进行显式的建模,因此具有更广泛的应用前景。
总结与展望
本文全面介绍了强化学习中的多种算法,从理论基础的动态规划,到适用于实际应用的蒙特卡罗方法和时间差分学习,再到具体的 Q 学习算法实现。通过详细的代码示例和实际应用场景分析,我们可以看到强化学习在复杂环境决策中的强大能力。
以下是对各算法特点和应用场景的再次总结表格:
| 算法 | 环境动态要求 | 学习方式 | 特点 | 应用场景 |
| ---- | ---- | ---- | ---- | ---- |
| 动态规划 | 完全已知 | 不与环境交互 | 理论基础,有助于理解概念 | 理论研究,简单环境模拟 |
| 蒙特卡罗方法 | 未知 | 模拟经验 | 通过生成情节学习 | 游戏、简单机器人控制 |
| 时间差分学习 | 未知 | 经验学习 | 可提前更新估计值 | 复杂环境决策,如自动驾驶 |
| Q 学习 | 未知 | 经验学习 | 离策略算法,可找到最优策略 | 网格世界、游戏等 |
mermaid 格式流程图展示强化学习算法在实际应用中的流程:
graph LR
A[定义环境] --> B[选择算法]
B --> C[初始化参数]
C --> D[训练智能体]
D --> E[测试智能体]
E --> F[优化算法]
F --> D
未来,强化学习算法将在更多领域得到应用,同时也将不断与其他技术相结合,如深度学习、多智能体系统等,为解决更复杂的问题提供强大的工具。我们可以期待强化学习在人工智能领域发挥越来越重要的作用。
超级会员免费看
3317

被折叠的 条评论
为什么被折叠?



