Hexo

凡事预则立,不预则废


  • Home

  • Tags

  • Archives

  • Navigation

  • Search

RL——HER技术

Hindsight Experience Replay,简称HER,一种用于解决奖励稀疏问题的方法

  • 参考链接:
    • 原始论文:Hindsight Experience Replay,NIPS 2017,OpenAI
    • 论文解读:Hindsight Experience Replay,Kenvnn’s Blog,论文的许多笔记参考自该博客

Background

  • 在机器人领域,要想使强化学习训练它完美执行某任务,往往需要设计合理的奖励函数,但是设计这样的奖励函数工程师不仅需要懂得强化学习的领域知识,也需要懂得机器人、运动学等领域的知识。而且,有这些知识也未必能设计出很好的奖励函数供智能体进行学习
  • 因此,如果可以从简单的奖励函数(如二分奖励)学习到可完成任务的模型,那就不需要费心设计复杂的奖励函数了

HER 技术思路

  • 奖励函数的设计往往需要很强的先验知识,且往往比较难,特别在稀疏奖励和二分奖励场景中
    • 系数奖励:完成目标的episode太少或者完成目标的步数太长,导致负奖励的样本数过多
    • 二分奖励:完成目标时,奖励为A值,完不成目标时,奖励为B值
  • 一句话说:通过在经验池中引入“Hindsight”(事后聪明)来解决稀疏奖励和二分奖励中的问题
    • Hindsight的理解:hind表示“后面的”,sight则表示“看见;视力;视野等”,综合起来表示“事后聪明;事后的领悟”。与Foresight表示“先见之明”对比来看,翻译Hindsight为“后见之明”可能更为合适
  • 可以用于所有Off-policy方法中

A motivating example

  • 一个来自HER论文中的例子:bit-flipping environment
    • 状态空间 \(\mathcal{S}=\left \{ 0,1 \right \}^{n}\),维度为n
    • 动作空间 \(\mathcal{A}=\left \{ 0,1,\cdots,n-1 \right \}\),动作空间大小也为n
    • 规则:对于每个episode,给定目标状态 \(s_{g}\),从任意初始状态 \(s_{0}\) (如 \(n=5,s_{0}=10101\) )每一步从动作空间中选取一个动作 \(a\),翻转 \(s_{0}\) 第 \(a\) 个位置的值,如 \(a=1\Rightarrow s_{1}=11101\),直到回合结束或者翻转后的状态与 \(s_{g}\) 相同
    • 奖励函数: \(r_{g}(s,a)=-\left [ s \neq g \right ]\),即达到目标状态则为0,未达到目标状态则为-1。( \(s \neq g \Rightarrow true \doteq 1,s = g \Rightarrow false \doteq 0\) )
    • 注:后续将目标状态 \(s_{g}\) 简化为 \(g\)
  • 数组长度越长,反馈越稀疏,当 \(n>40\) 时,几乎没有除了-1以外的奖励,标准的强化学习算法很难求解该问题。即使使用一些探索技术也不行,因为这个问题完全不是缺乏探索,而是状态太多,探索不完,导致奖励极其稀疏,算法根本不知道需要优化的目标在哪里

解决方法

reward shaping

  • 将reward设计成某些变量的函数,如 \(r_{g}(s,a)=-\left || s-g \right ||^{2}\),将训练的算法逐步引导至奖励函数增大的决策空间
    • 该方案在这种场景中可以使用,但是不通用,无法应用到其他更加复杂的现实问题中

任务分解

  • 将目标分解成多个粒度更小的,更容易解决的任务,使用类似层次强化学习(Hierarchical reinforcement learning)的方法去解决
  • 这个文章中没有提到,一些书籍会提到

HER的做法

  • HER的主要思想就是:

    • 通过修改目标简化问题,从而让奖励变得稠密。具体地,假定序列为 \(s_{0},s_{1},s_{2}, \cdots ,s_{T}\),目标为 \(g\),如果将目标状态 \(g\) 修改为 \(s_{T}\),即 \(g=s_{T}\),那么这样看来智能体就可以获得奖励了
    • 利用这个思想对经验池进行扩充即可,可以将稀疏奖励问题给转化成非稀疏奖励,使得奖励变得稠密
  • HER具体做法:

    • 将经验池中的状态 \(s\) 改为 \(s||g\),也就是tf.concat(s,g)
    • 训练算法的输入也是 \(s||g\),也就是需要在当前状态后边连结上每个episode的目标状态,每个episode的目标状态可能不同
    • HER对经验池进行了扩充,不仅存入实际采样得到的transition/experience, \(\left ( s_{t}||g,a_{t},r_{t},s_{t+1}||g \right )\),也要在回合结束时重新设置目标状态,得到相应的奖励值(在二分奖励问题中,只有在 \(s=g\) 时奖励才需要更改),存入“事后”(当初如果这样就好啦!)的经验 \(\left ( s_{t}||g’,a_{t},r_{t}’,s_{t+1}||g’ \right )\),详见伪代码,这个事后经验究竟存入多少份、多少种,由超参数 \(k\) 控制,下文讲解
    • HER更适合解决多目标问题,多目标的意思为,目标点非固定,每个episode的目标状态可以不相同。详见实验部分
  • HER的几种扩展方式:

    • 未来模式——future:在一个序列 \(s_{0},s_{1},s_{2},\cdots,s_{T}\) 中,如果遍历到状态 \(s_{2}\),则在 \(s_{3},\cdots,s_{T}\) 之间随机抽取 \(k\) 个状态作为目标状态 \(g’\),并依此向经验池中存入 \(\left ( s_{2}||g’,a_{2},r_{2}’,s_{3}||g’ \right )\),特点:一个episode的后续部分
    • 回合模式——episode:在一个序列 \(s_{0},s_{1},s_{2},…,s_{T}\) 中,如果遍历到状态 \(s_{2}\),则在整个序列中随机抽取 \(k\) 个状态作为目标状态 \(g’\),并依此向经验池中存入 \(\left ( s_{2}||g’,a_{2},r_{2}’,s_{3}||g’ \right )\),特点:一个episode
    • 随机模式——random:在一个序列 \(s_{0},s_{1},s_{2},…,s_{T}\) 中,如果遍历到状态 \(s_{2}\),则在多个序列 \(\tau_{0},\tau_{1},\tau_{2},\cdots\) 中随机抽取 \(k\) 个状态作为目标状态 \(g’\),并依此向经验池中存入 \(\left ( s_{2}||g’,a_{2},r_{2}’,s_{3}||g’ \right )\),特点:多个episode
    • 最终模式——final:在一个序列 \(s_{0},s_{1},s_{2},\cdots,s_{T}\) 中,如果遍历到状态 \(s_{2}\),则之间令 \(g’=s_{T}\),并向经验池中存入 \(\left ( s_{2}||g’,a_{2},r_{2}’,s_{3}||g’ \right )\),特点:一个episode的最后一个状态,如果设置k,则存入k个相同的经验
    • 注:上面的 \(s_{T}\) 不一定是当前episode的最终目标值,因为此时我们拟合的本意已经变成了“任意给定一个起始状态 \(s_0\) 和目标状态 \(s_i\),找到一个动作来实现将动作从 \(s_0\) 变化到 \(s_i\) ”
  • 伪代码及其解析

    • \(r(s,a,g)\) 表示奖励不仅仅与当前状态和动作有关,还与最终的目标状态有关
    • 伪代码中没有提到超参数 \(k\),其实在循环条件 \(\textbf{for} \ g’ \in G \ \textbf{do}\) 中循环执行了 \(k\) 次
    • \(||\) 操作为连结操作,简言之,将两个长度为5的向量合并成一个长度为10的向量
    • \(G:=\mathbb{S}(\textbf{current episode})\) 即为上文提到的四种扩展模式:future、episode、random、final
    • 奖励函数 \(r(s,a,g)=-\left [ f_{g}(s)=0 \right ]\) 即为前文提到的 \(r_{g}(s,a)=-\left [ s \neq g \right ]\),即完成为0,未完成为-1,具体奖励函数可以根据我们的使用环境设计
    • \(a_{t} \leftarrow \pi_{b}(s_{t}||g)\) 表示神经网络的输入为当前状态与目标状态的连结
  • HER的优点

    • 可解决稀疏奖励、二分奖励问题
    • 可适用于所有的Off-Policy算法
    • 提升了数据采样效率

如何选择 HER 的模式?

  • 实验结果:
    • 效果:future>final>episode>random>no HER
    • 稳定性:final(好)=no-HER(差)>future>episode>random

超参数的设置

  • \(k\) 值不能太大,太大了会导致数据集中真实样本减少,出现问题

其他理解

  • 问题:HER从 \(s_{2}\) 扩展成 \(s_{2}||g’\) 的过程中,相当于增加了MDP的数量(虽然MDP可能变得更短了),是否会导致MDP数量太多,模型难以收敛呢?

RL——MCTS

  • 参考文献:
    • Survey参考:A Survey of Monte Carlo Tree Search Methods, 2012

整体说明

  • 蒙特卡洛树搜索(Monte Carlo Tree Search, MCTS)是一种基于随机模拟的强化学习决策方法 ,尤其在复杂决策问题(如围棋、游戏等)中表现出色。它通过智能地平衡探索(Exploration)和利用(Exploitation) ,逐步构建搜索树并优化策略
  • MCTS决策方法常用于围棋(AlphaGo)、即时战略游戏、扑克等场景中,目前在LLM领域也有所应用
  • 优势 :适用于高维、稀疏奖励问题;无需预先知识,仅依赖模拟;可并行化,扩展性强
  • 局限 :初期模拟可能低效(依赖随机探索);需大量模拟才能收敛

MCTS 的核心思想

  • MCTS通过反复模拟(Simulation)从当前状态出发的可能路径,逐步构建一棵非对称的搜索树
  • MCTS树的节点代表游戏状态 ,边代表动作
  • MCTS的核心优势在于:
    • 无需完整模型 :仅需模拟环境(如游戏规则)即可
    • 适应大规模状态空间 :通过选择性扩展树,避免穷举
    • 异步更新 :模拟结果反向传播,动态优化策略

MCTS 每次迭代的四个阶段

  • MCTS过程概览(图片来源于 A Survey of Monte Carlo Tree Search Methods, 2012)

第一步:选择(Selection)

  • 目标 :从根节点(当前状态)出发,递归选择子节点,直到到达一个可扩展的状态节点(即存在未尝试的动作的状态节点),返回这个被选择的节点
  • 策略 :使用树策略(如UCT算法或PUCT算法)平衡探索与利用
  • UCT(Upper Confidence Bound applied to Trees)算法 :
    $$
    \textit{UCT}(s, a) = Q(s, a) + c \sqrt{\frac{\ln N(s)}{N(s, a)} }
    $$
    • \(Q(s, a)\):动作\(a\)的平均回报
    • \(N(s)\):状态\(s\)的访问次数,\(N(s, a)\):动作\(a\)的访问次数(注:如果分母不会为0,此时所有节点都是完整探索过的,不存在为0的情况)
    • \(c\):探索系数(通常设为\(\sqrt{2}\)),当\(c=\sqrt{2}\)时,UCT的累计遗憾(Regret)有对数上界
    • 探索时选择动作为: \(a^* = \arg\max_a \textit{UCT}(s, a)\)
  • PUCT(Predictor UCT)算法 :
    $$
    \textit{PUCT}(s, a) = Q(s, a) + c_\textit{puct}\cdot P(s,a)\cdot \frac{\sqrt{N(s)}}{1+N(s, a)}
    $$
    • \(P(s,a)\):即 \(\pi(a|s)\),是先验策略网络(Policy Network)给出的先验概率(表示动作 \(a\) 的初始偏好)
    • \(c_\text{puct}\):探索系数(控制先验权重,AlphaZero中常设为1~2)
    • \(1+N(s,a)\):(不用为了避免除0操作而增加1吧,毕竟此时所有节点都是完整探索过的,不存在为0的情况)
    • 探索时选择动作为:探索时选择 \(a^* = \arg\max_a \textit{PUCT}(s, a)\)
    • 基本思想:采样次数 \(N(s, a)\) 少时,按照策略 \(\pi(a|s)\) 为主探索;采样次数 \(N(s, a)\) 多时,按照价值 \(Q(s, a)\) 为主探索
    • PUCT被使用到了AlphaZero和MuZero中
      • 注:MuZero是由DeepMind开发的一种通用强化学习模型,它能够在不知道环境规则的情况下,通过自我学习和规划,掌握多种复杂游戏和任务,MuZero采用模型预测控制(Model-Based RL) ,并结合了MCTS

第二步:扩展(Expansion)

  • 前提条件 :第一步完成后,我们选择到了一个未完全展开的节点(即存在未尝试的动作的节点)时,扩展该节点
  • 节点扩展 :添加一个新子节点(随机执行一个未尝试的动作,将环境反馈的新状态作为新子节点)

第三步:模拟(Simulation)

  • 在一些资料中,这一步也称为评估,相当与对一个动作的价值评估
  • 模拟 :从新节点开始,按照随机策略(或其他基于简单策略)Rollout 模拟至终止状态(如游戏结束),最终获得本次模拟的奖励(如胜利/失败)

第四步:回溯(Backpropagation)

  • 回溯 :将模拟结果(奖励)反向传播到路径上的所有节点
    • 更新访问次数 \(N(s)\) 和 \(N(s, a)\)
    • 更新动作价值 \(Q(s, a)\)(如累加奖励的平均值)

MCTS的终止与决策

  • 终止条件 :达到预设时间、计算资源或迭代次数
  • 最终决策 :选择根节点下访问次数最多或价值最高的动作(如AlphaGo选择访问次数最多的动作)
    • 问题:为什么是访问次数最多而不是价值最高的动作作为决策?

一些理解与讨论

  • 棋局中,对手策略如何模拟?
    • AlphaGo中,使用策略网络 \(\pi(a|s)\) 来模拟对手策略
  • 为什么MCTS第三步中使用随机策略模拟采样?
    • 传统的MCTS确实是按照随机采样的,但从直观上看,使用当前策略来模拟采样决策是否才是符合预期的;
    • AlphaGo的做法:
      • 实际上是使用策略网络来模拟决策的
      • 为了加快速度,AlphaGo还训练了一个较小的策略网络专门用来在MCTS的第三步中模拟决策
      • 为了提升稳定性,AlphaGo的价值评估结合了价值网络的输出和MCTS模拟奖励结果 \(V(s_{t+1}) = \frac{1}{2}(reward + V_\theta(s_{t+1}))\)
    • 在LLM等场景中,随机采样是毫无意义的,也需要基于LLM来采样决策
  • 为什么AlphaGo决策时选择访问最多的动作而不是价值最高的动作?
    • 理解:实际上访问最多的动作往往也是价值最高的动作,即使不是价值最高的,也不会太差,且价值最高的动作可能是因为波动带来的,访问最多的动作更置信
    • 节点被访问的次数越多,说明MCTS对其进行了更充分的探索,其Q值的置信度越高。选择高访问次数的动作,相当于选择被反复验证过的最优策略,避免因偶然性导致的风险

附录:MCTS在围棋中的流程

  • 第一步-选择 :从当前棋盘状态出发,递归选择UCT值最高的落子点
  • 第二步-扩展 :当遇到一个未尝试的合法落子时,扩展新节点
  • 第三步-模拟 :随机落子至终局,判断胜负
  • 第四步-回溯 :若胜利,路径上所有节点的胜利次数+1
  • 决策 :经过数万次迭代后,选择根节点下胜率最高的落子
1…152153154…352
San Ye

San Ye

Stay Hungry. Stay Foolish.

704 posts
53 tags
© 2026 San Ye
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4