强化学习笔记

本文探讨了在不确定环境中智能体学习的挑战,如模型误差导致的次优策略。规划过程中的“试探”和“开发”是两个关键概念,前者用于发现环境变化,后者追求当前模型的最优解。预演算法和蒙特卡洛树搜索(MCTS)是两种解决策略,通过模拟和回溯更新来平衡探索和开发。MCTS通过不断模拟和聚焦于高价值路径来优化决策,其核心步骤包括选择、扩展、模拟和回溯。这些方法在动态环境中帮助智能体逐步改进策略,尽管存在权衡,但能有效应对未知和变化的环境。

在随机环境中只有数量有限的样本会被观察到,或者模型通过泛化能力较差的函数来近似的,又或者仅仅因为环境发生改变且新的动态特性尚未被观察到,模型都可能不正确,从而导致规划过程中得到次优的策略。某些情况下,规划计算出的次优策略会使我们很快发现并修正模型错误。这种情况往往比较“乐观”,模型就会倾向于预测出比真实可能情况更大的收益或更好的状态转移,规划得出的策略会尝试开发这些机会,这样智能体就很快发现这些机会根本不存在,于是感知到模型的错误,继而修正错误。

阐述探索和开发之间的矛盾

在“规划”语境中,“试探”意味着尝试那些改变模型的动作,而“开发”则意味着以当前模型的最优方式来执行动作。我们希望智能体通过试探发现环境的变化,但又不希望试探太多使得平均性能大大降低。可能并不存在既完美又实用的解决方案,但简单的启发式方法常常很有效。

优先遍历算法:

在确定性环境下的优先级遍历算法:

对所有的状态s\in Sa\in A(s),初始化Q(s,a)Model(s,a),并初始化PQueue为空

无限循环:

(a)S\leftarrow当前(非终止)状态

(b)A\leftarrowpolicy(S,Q)

(c)采取动作A;观察产生的收益R,以及状态S’

(d)Model(S,A)\leftarrow R,S'

  (e)  P\leftarrow \left |R+\gamma max_{a} Q(S',a)-Q(S,A)\right |

  (f)  如果P>\theta,那么将S,A以优先级P插入PQueue中

(g)循环n次,同时PQueue非空:

           S,A\leftarrow first(PQueue)

           R,S'\leftarrow Model(S,A)

          Q(S,A)\leftarrow Q(S,A)+\alpha [R+\gamma max_{a}Q(S',a)-Q(S,A)]

          对所有的预测可以达到S的\bar{S}\bar{A}进行循环:

                   \bar{R}\leftarrow对于\bar{S}\bar{A},S预测的收益

                   P\leftarrow \left | \bar{R}+\gamma max_{a}Q(S,a)-Q(\bar{S},\bar{A}) \right |

                  如果P>\theta,那么将\bar{S}\bar{A}以优先级P插入PQueue中

启发式搜索:

状态空间规划方法就是决策时规划,统称为启发式搜索。在启发式搜索中,对于遇到的每个状态,我们建立一个树结构,该结构包括了后面各种可能的延续,将近似价值函数应用于叶子节点,然后以根状态向当前状态回溯更新,回溯更新在当前状态的状态动作节点处停止,计算这些节点的更新值后,选择其中最好的值作为当前的动作,舍弃所有更新值。贪心策略和UCB动作选择方法与启发式搜索并没有什么不同。可以将启发式搜索视为单步贪心策略的某种扩展。启发式搜索中算力聚焦的最明显方式:关注当前状态。

可以以聚焦于当前状态及其可能的后继状态来改变更新的算力分配。极端情况下,我们可以使用启发式搜索的方法来构建搜索树,然后从下到上执行单步回溯更新。如果以这种方式对回溯更新进行排序并使用表格型表示,那么我们将得到与深度优先的启发式搜索完全相同的回溯更新方式。

预演算法(rollout):

rollout算法是一种基于蒙特卡洛控制的决策时规划算法,这里的蒙特卡洛控制应用于以当前环境状态为起点的采样模拟轨迹。rollout算法通过平均许多起始于每一个可能的动作并遵循给定的策略的模拟轨迹的回报来估计动作价值。当动作价值的估计被认为足够准确时,对应最高估计值的动作(或多个动作中的一个)会被执行,之后这个过程再从得到的后继状态继续进行。但是预演(rollout)算法的目标不是估计一个最优动作价值函数,或对于给定策略的完整的动作价值函数。相反,它们仅仅对每一个当前状态以及一个给定的被称为预演策略的策略做出动作价值的蒙特卡洛估计。预演算法只是即时地利用这些动作价值的估计值,之后就丢弃了。预演算法的目的是为了改进预演策略的性能,而不是找到最优的策略。基础预演策略越好,价值估计越准确,预演算法得到的策略就越可能更好。但是好的预演策略需要花更多的时间,可以通过一些方法缓解,由于蒙特卡洛实验之间是相互独立的,因此可以在多个独立的处理器上并行的进行多次实验。另一个办法是在尚未完成时就截断模拟轨迹,利用预存的评估函数来更正截断的回报值。还有一种可行方法是监控蒙特卡洛模拟过程并对不太可能是最优的,或者最优值很接近的动作进行剪枝。

蒙特卡洛搜索树:

MCTS的核心思想是从当前状态出发的多个模拟轨迹不断地聚焦和选择,这是通过扩展模拟轨迹中获得较高评估值的初始片段来实现的,而这些评估值则是根据更早的模拟样本计算的。MCTS不需要保存近似价值函数或每次动作选择的策略。不过在很多实现中还是会保存选中的动作价值,在下一次的执行中很可能会有用。在计算过程中,我们只维护部分的蒙特卡洛估计值,这些估计值对应于会在几步内到达的“状态-动作”二元组所形成的子集,这就形成了一颗以当前状态为根节点的树。MCTS会增量式的逐步增加节点来进行树扩展,这些节点代表了从模拟轨迹的结果上看前景更为光明的状态。任何模拟轨迹都会沿着这棵树运行,最后从某个叶子节点离开。在树的外部利用预演策略选择动作,在树的内部,对于内部状态至少对部分动作有价值估计,所以我们可以用一个知晓这些信息的策略来选取,这个策略称为树策略,它能够平衡试探和开发,树策略有贪心策略或UCB选择规则来选择动作。

基本版的MCTS的每次循环包括下面四个步骤(流程如下图所示):

1、选择。从根节点开始,使用基于树边缘的动作价值的树策略遍历这棵树来挑选一个叶子节点

2、扩展。在某些循环中,针对选定的叶子节点找到采取非试探性动作可以达到的节点,将一个或多个这样的节点加为该叶子节点的子节点,以此来实现树的扩展。

3、模拟。从选定的节点,或其中一个它新增的子节点(如果存在)出发,根据预演策略选择动作进行整个轨迹模拟,动作首先由树策略选取,而到了树外则由预演策略选取。

4、回溯。模拟整个轨迹得到的回报值向上回传,对此次循环中,树策略所遍历的树边缘上的动作价值进行更新或初始化。预演策略在树外部访问到的状态和动作的任何值都不会 被保存下来。

 图蒙特卡洛树搜索,当环境转移到一个新的状态树,MCTS会在动作被选择前执行尽可能多次迭代,逐渐构建一个以根为当前状态的树,每一次迭代又包括四步:选择,扩展,模拟,回溯。

深度强化学习是机器学习的一个分支,它结合了深度学习的感知能力与强化学习的决策机制。在深度强化学习中,智能体通过与环境交互来学习策略,以最大化累积奖励。这种方法特别适用于处理具有高维状态空间的问题,如游戏控制、机器人导航等[^3]。 ### Q-Learning Q-Learning 是一种模型无关的强化学习算法,用于解决马尔可夫决策过程(MDP)中的问题。该算法的目标是在不知道环境动态的情况下找到一个最优动作策略。Q-Learning 使用一个称为 Q 表的二维数组来存储每个状态-动作对的价值。更新规则基于 Bellman 方程,并引入了学习率和折扣因子来调整新信息的重要性以及未来奖励的重要性[^1]。 #### 学习率 (Learning Rate) 学习率决定了新获得的信息能够改变已有估计的程度。较高的学习率意味着新的信息将更快地覆盖旧的估计值,而较低的学习率则会让系统更倾向于保留历史经验。 #### 折扣因子 (Discount Factor) 折扣因子用来衡量未来的奖励相对于当前奖励的重要性。如果折扣因子接近 1,则表明未来的奖励几乎与即时奖励一样重要;反之,如果折扣因子较小,则更重视眼前的奖励。 ### DQN 算法 DQN(Deep Q-Network)算法是将深度神经网络应用于 Q-Learning 的一种方法。由于传统的 Q-Learning 在面对大规模或连续的状态空间时表现不佳,因为此时无法维护一个完整的 Q 表。DQN 则利用神经网络来近似 Q 函数,从而解决了这个问题。此外,DQN 还引入了经验回放机制和固定目标网络两种技术来提高训练的稳定性和效率[^3]。 #### 经验回放 (Experience Replay) 经验回放机制允许智能体从过去的经历中随机抽样进行学习,这有助于打破数据间的相关性,减少更新的相关性,使得训练更加平稳。 #### 目标网络 (Target Network) 目标网络是一个结构相同但更新频率较低的神经网络,它用来计算目标 Q 值。这样做的目的是为了保持目标值的稳定性,避免由于频繁更新导致的训练不稳定。 ### 实现示例 下面是一个简化的 Q-Learning 算法实现的例子,用于解决二维迷宫寻路问题: ```python # 初始化Q表 q_table = np.zeros([num_states, num_actions]) # Q-learning algorithm for episode in range(total_episodes): state = env.reset() done = False while not done: # 选择动作 action = choose_action(state, q_table) # 执行动作并观察下一个状态和奖励 next_state, reward, done, _ = env.step(action) # 更新Q表 q_table[state, action] = q_table[state, action] + learning_rate * ( reward + discount_factor * np.max(q_table[next_state, :]) - q_table[state, action] ) state = next_state ``` 这个简单的例子展示了如何使用 Q-Learning 来解决一个小规模的强化学习问题。对于更为复杂的应用场景,可能需要采用像 DQN 这样的深度强化学习方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序小K

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值