当前位置: 首页 > news >正文

#Datawhale组队学习#7月-强化学习Task2

在前面的Task1部分,我们已经学习了第一章绪论,第二章马尔可夫决策过程,第三章动态规划,具体的链接:#Datawhale组队学习#7月-强化学习Task1-CSDN博客

我们继续Task2的学习,本次的任务是第四章免模型预测,第五章免模型控制。

第四章免模型预测

概念:有模型(model based)与免模型(model free),预测(prediction)与控制(control)。

4.1有模型与免模型

状态转移概率是已知的,这种情况下使用的算法称之为有模型算法,例如动态规划算法。

环境是未知的,这种情况下的算法就称之为免模型算法,目前很多经典的强化学习算法都是免模型的。

具体说来,有模型强化学习尝试先学习一个环境模型,它可以是环境的动态或奖励,即前面所讲的状态转移概率和奖励函数。它的优点很明显,即可以在不与真实环境交互的情况下进行学习,但缺点是,这种模型往往是不完美的,或者是复杂到难以学习和计算。

而免模型则直接学习在特定状态下执行特定动作的价值或优化策略。它直接从与环境的交互中学习,不需要建立任何预测环境动态的模型。其优点是不需要学习可能是较为复杂的环境模型,更加简单直接,但是缺点是在学习过程中需要与真实环境进行大量的交互。

4.2 预测与控制

预测的主要目的是估计或计算环境中的某种期望值,比如状态价值函数 或动作价值函数 。而控制的目标则是找到一个最优策略,该策略可以最大化期望的回报。换句话说,你不仅想知道按照某种策略你的预期得分是多少,还想知道如何选择动作以最大化这个得分。控制问题通常涉及两个相互交替的步骤:策略评估(使用当前策略估计值函数)和策略改进(基于当前的值函数更新策略)。在实际应用中,预测和控制问题经常交织在一起。

4.3 蒙特卡洛估计

蒙特卡洛估计方法在强化学习中是免模型预测价值函数的方式之一,本质是一种统计模拟方法。

而蒙特卡洛基于这样的想法:比如我们有一袋豆子,把豆子均匀地在一定范围内朝这个图形上撒,撒到足够多的数量时数一下这个图形中有多少颗豆子,这个豆子的数目就是图形的面积。当豆子越小撒的越多的时候,结果就越精确。此时我们借助计算机程序可以生成大量均匀分布坐标点,然后统计出图形内的点数,通过它们占总点数的比例和坐标点生成范围的面积就可以求出图形面积。

蒙特卡洛方法的思路是我们可以采样大量的轨迹,对于每个轨迹计算对应状态的回报然后取平均近似,称之为经验平均回报。根据大数定律,只要采样的轨迹数量足够多,计算出的经验平均回报就能趋近于实际的状态价值函数。当然,蒙特卡洛方法有一定的局限性,即只适用于有终止状态的马尔可夫决策过程。

蒙特卡洛方法主要分成两种算法,一种是首次访问蒙特卡洛方法,另外一种是每次访问蒙特卡洛方法。

4.4 时序差分估计

 时序差分估计方法是一种基于经验的动态规划方法,它结合了蒙特卡洛和动态规划的思想。最简单的时序差分一般称为单步时序差分。

TD学习的核心价值在于它平衡了理论严谨性与工程实用性,是现代强化学习算法的基石。掌握TD方法将为后续学习Q-learning、SARSA和深度强化学习奠定坚实基础。

4.5 时序差分和蒙特卡洛的比较

  • 时序差分方法可以在线学习,每走一步就可以更新,效率高。蒙特卡洛方法必须等游戏结束时才可以学习。
  • 时序差分方法可以从不完整序列上进行学习。蒙特卡洛方法只能从完整的序列上进行学习。
  • 时序差分方法可以在连续的环境下(没有终止)进行学习。蒙特卡洛方法只能在有终止的情况下学习。
  • 时序差分方法利用了马尔可夫性质,在马尔可夫环境下有更高的学习效率。蒙特卡洛方法没有假设环境具有马尔可夫性质,利用采样的价值来估计某个状态的价值,在不是马尔可夫的环境下更加有效。

4.6 n 步时序差分

n步时序差分是强化学习中连接TD(0)与蒙特卡洛方法的关键桥梁,通过调整步长参数n实现偏差-方差的精准平衡。

n步时序差分通过可控的偏差-方差权衡,在TD学习与蒙特卡洛方法之间建立了连续的算法谱系。掌握这一方法将使您能够根据具体问题特性,精准选择最适合的预测机制。

我们会发现当n趋近于无穷大时,就变成了蒙特卡洛方法,因此可以通过调整自举的步数,来实现蒙特卡洛方法和时序差分方法之间的权衡。

习题

1.有模型与免模型算法的区别?举一些相关的算法?

有模型算法需要预先知道环境动力学模型(包括状态转移概率和奖励函数),典型代表是动态规划方法,如值迭代和策略迭代。这类算法先在模型上进行规划,再根据规划结果制定策略,适合环境可精确建模的场景,比如棋类游戏中的蒙特卡洛树搜索(MCTS)。免模型算法则完全不依赖环境模型,直接通过与环境交互来学习策略或价值函数,包括Q-Learning、SARSA等基于值函数的方法,以及PPO、SAC等策略梯度算法。这类方法在机器人控制等复杂物理场景中更实用,因为精确建模这类环境通常非常困难。

2.举例说明预测与控制的区别与联系。

预测问题是评估给定策略的价值函数,比如计算随机策略在悬崖漫步环境中的状态价值。控制问题则是寻找最优策略,比如通过Q-Learning在悬崖漫步中学习避开悬崖的最短路径。两者紧密关联——控制过程通常包含预测环节,比如策略迭代算法交替进行策略评估(预测)和策略改进(控制)。预测为控制提供评估基础,而控制通过优化策略推动预测更精准,这种闭环关系构成了大多数强化学习算法的核心框架。

3.蒙特卡洛方法和时序差分方法的优劣势。

蒙特卡洛方法通过完整轨迹的回报均值来估计价值函数,具有无偏性但方差较高,适合回合制任务和需要精确价值估计的场景。时序差分方法利用单步奖励和后续状态估计进行在线更新,虽然因自举引入偏差,但方差低且数据效率高,特别适合长序列任务和实时控制。两者在偏差-方差权衡上形成互补,现代算法如TD(λ)通过λ参数灵活调整二者的混合比例,而n-step TD则通过选择中间步数实现平衡,比如Rainbow DQN采用n=3在Atari游戏中取得显著效果提升。

第五章免模型控制

在未知环境模型(无状态转移概率 P和奖励函数 R)的条件下,通过交互数据直接优化策略。

5.1 Q-learning 算法

为了解决控制问题,我们只需要直接预测动作价值函数,然后在决策时选择动作价值即 Q 值最大对应的动作即可。这样一来,策略和动作价值函数同时达到最优,相应的状态价值函数也是最优的,这就是Q-learning 算法的思路。

本质:一种异策略(off-policy)的时序差分(TD)控制算法,直接从交互经验中学习最优动作价值函数 Q∗(s,a),无需环境模型(状态转移概率 P 和奖励函数 R)。

Q表结构: 适用于离散状态/动作空间,以表格存储每个 (s,a)(s,a) 的价值估计。 初始化:通常全零或小随机值(避免初始偏差)。

算法流程:

初始化Q表(维度:状态数 × 动作数)

对每个回合(episode):

初始化状态 s。

重复直到终止:

选择动作:用 ϵ-贪婪策略从 s 选择 a(探索-利用权衡)。

执行动作:执行 a,观测奖励 r 和下一状态 s′。

更新Q值

状态转移:s←s′。

5.2 Sarsa 算法

本质:同策略(on-policy)的时序差分控制算法,学习当前策略 π 的动作价值函数 Qπ(s,a)。其名称源于更新依赖的五元组:State-Action-Reward-State-Action (st,at,rt+1,st+1,at+1)。

更新时使用 实际执行的动作 at+1(而非最优动作),体现当前策略的探索特性。

与Q-learning的深度对比

维度SarsaQ-learning
策略类型同策略(on-policy)异策略(off-policy)
更新目标Q(st+1,at+1)max⁡a′Q(st+1,a′)
动作选择两次 ϵ-贪婪一次 ϵ-贪婪 + 一次 max⁡
风险偏好保守(规避探索中的高风险动作)激进(追求理论最优路径)
数据效率需实时交互生成 at+1​可重用历史数据(经验回放兼容)

5.3 同策略与异策略

策略评估和策略改进过程是基于相同的策略完成的,这就是同策略算法。相应地,像Q-learning算法这样从其他策略中获取样本然后利用它们来更新目标策略,我们称作异策略算法

也就是说,异策略算法基本上是从经验池或者历史数据中进行学习的。这两类算法有着不同的优缺点,同策略相对来说更加稳定,但是效率较低,如同我们实战中展示的那样。而异策略通常来说更加高效,但是需要让获取样本的策略和更新的策略具备一定的分布匹配条件,以避免偏差。

5.4 实战:Q-learning 算法

对于实战来说最重要的一点就是写好伪代码

环境设定:OpenAI Gym 的 CliffWalking-v0(悬崖行走环境)

  • 状态空间:4×12网格(共48个状态)

  • 动作空间:4个离散动作(上=0,右=1,下=2,左=3)

  • 奖励机制

    • 每步默认奖励 = -1(鼓励最短路径)

    • 踏入悬崖区域:奖励 = -100,重置到起点

    • 终点奖励 = 0

import numpy as np
import gym# 环境初始化
env = gym.make('CliffWalking-v0')
n_states = env.observation_space.n  # 48
n_actions = env.action_space.n      # 4# 超参数配置
alpha = 0.5      # 学习率(高值加速初期学习)
gamma = 1.0      # 折扣因子(鼓励长期回报)
epsilon = 0.1    # 探索率(10%随机动作)
episodes = 1000  # 训练回合数# Q表初始化(48×4矩阵)
Q = np.zeros((n_states, n_actions))# 训练循环
for episode in range(episodes):state = env.reset()done = Falsewhile not done:# 1. ε-贪婪动作选择if np.random.random() < epsilon:action = env.action_space.sample()  # 随机探索else:action = np.argmax(Q[state, :])     # 利用Q表# 2. 执行动作,获取环境反馈next_state, reward, done, _ = env.step(action)# 3. Q-learning核心更新# 计算TD目标:r + γ * max_{a'} Q(s',a')td_target = reward + gamma * np.max(Q[next_state, :])# 更新当前Q值:Q(s,a) ← Q(s,a) + α[td_target - Q(s,a)]Q[state, action] += alpha * (td_target - Q[state, action])# 4. 状态转移state = next_state# 测试训练结果(关闭探索)
state = env.reset()
done = False
path = []
while not done:action = np.argmax(Q[state, :])  # 纯贪心策略state, _, done, _ = env.step(action)path.append(state)env.render()  # 可视化路径

习题


1.什么是Q值的过估计?有什么缓解的方法吗?

Q值的过估计指Q-learning类算法因max操作导致动作价值函数系统性高于真实值的现象。根本原因是最大化偏差:max会放大Q表中的正向估计误差,形成自增强循环(高估值通过贝尔曼方程传播)。

缓解方法主要有两种:

  • Double Q-learning:使用两个独立Q表解耦动作选择与价值评估。例如用Q₁选动作(a* = argmax Q₁(s',a)),用Q₂估值(Q₁(s,a) += α[r + γQ₂(s',a*) - Q₁(s,a)]),打破自增强循环。

  • 目标网络(如DQN):维护滞后更新的目标网络计算TD目标(r + γ max Q_target(s',a')),减少与当前Q值的相关性。

过估计在异策略算法中显著,同策略方法(如Sarsa)因无max操作天然规避此问题。

2.on-policy和off-policy之间的区别是什么?

区别在于行为策略(生成数据的策略)与目标策略(待优化的策略)是否相同:

  • 同策略(如Sarsa):二者相同。例如均用ε-贪婪策略,学习包含探索噪声的次优策略,适合安全敏感场景(如机器人控制),但数据效率低。

  • 异策略(如Q-learning):二者可不同。行为策略(如ε-贪婪)探索环境,目标策略(如贪心策略)独立优化,直接学习最优策略且支持历史数据重用(如经验回放),但需处理策略差异。

核心差异体现在数据效率(异策略可重用数据)和风险偏好(同策略保守,异策略激进)。

3.为什么需要探索策略?

探索策略的核心目的是避免局部最优满足收敛条件

  • 理论需求:为收敛到最优策略,需无限次访问所有状态-动作对。若仅用贪心策略(纯利用),部分区域永不探索,导致策略次优。

  • 探索-利用困境

    • 利用(选当前最优动作)可快速获得奖励,但可能错过长期更优解(如悬崖行走中绕行路径)。

    • 探索(尝试新动作)能发现潜在高回报区域,但牺牲短期收益。

常用方法包括ε-贪婪(小概率随机动作)、玻尔兹曼探索(按Q值概率采样)或乐观初始化(高初始Q值鼓励探索)。深度强化学习中,即使采用经验回放,主动探索仍是避免次优解的关键。

好了,本次就到这里,码字不易,动动你的小手,点赞收藏关注吧。

 

http://www.xdnf.cn/news/1151929.html

相关文章:

  • 板子 5.29--7.19
  • Git仓库使用
  • Python关于numpy的基础知识
  • 若依部署项目到服务器
  • 深入排查:编译环境(JDK)与运行环境(JRE/JDK)不一致时的常见 Java 错误及解决方案
  • 【Linux】如何理解 “一切皆文件”
  • 黑马点评系列问题之p70postman报错“服务器异常”
  • LeetCode中等题--167.两数之和II-输入有序数组
  • Java File 类详解:从基础操作到实战应用,掌握文件与目录处理全貌
  • 我用Cursor,1周上线了一个虚拟资料流量主小程序技术选型
  • Node.js:EventEmitter、Buffer
  • PCB 混合介质叠层:材料特性匹配与性能提升的技术解析
  • 如何解决 ‘NoneType‘ object has no attribute ‘get‘问题
  • 【取消分仓-分布式锁】
  • OpenCV特征点提取算法orb、surf、sift对比
  • 【数据类型与变量】
  • 学习C++、QT---29(QT库中QT事件的介绍和用了几个案例来对事件怎么使用的讲解)
  • UniApp 优化实践:使用常量统一管理本地存储 Key,提升可维护性
  • 7.19 换根dp | vpp |滑窗
  • 网络包从客户端发出到服务端接收的过程
  • 关于prometheus的一些简单的理解和总结
  • 1Panel中的OpenResty使用alias
  • 【Java源码阅读系列56】深度解读Java Constructor 类源码
  • SSH 密钥
  • C++ :vector的模拟
  • Oracle RU19.28补丁发布,一键升级稳
  • Python爬虫实战:研究psd-tools库相关技术
  • web前端渡一大师课 02 浏览器渲染原理
  • RESTful API设计与实现指南
  • 锂电池充电芯片