初探强化学习(11)Dyna类型的强化学习

article/2025/8/22 19:13:43

为什么研究Dyna类型的强化学习呢?
主要是因为这个类型的强化学习是融合了model-based和model free两个类型的强化学习。
主要参考的博客是这个。说实话,我也是时隔三天后,第三次看了这个博客才彻底明白的。至于为什么名师,是因为我中间分析了一下周莫凡的代码,同时我把这个博客最后的部分给看了,之前两次看这个博客之所以没看懂,第一是没有看代码,脑袋里没有具体的实现形式,第二个就是没仔细看文章。
下面为了方便自己以后能随时过来看文章,我决定把他的博客直接搬到我这里。

Dyna

由于不可能精确和完美的拟合真正环境,纯基于模型的强化学习效果往往很差。那有没有什么办法可以在一定程度上避免这一点呢?
那就把基于模型 + 不基于模型的强化学习结合起来吧!也就是Dyna算法框架了。

它既在模型中学习,也在交互中学习。即Dyna框架在每个迭代轮中,会先和环境交互,并更新价值函数、策略函数,接着进行n次模型的模拟预测,同样更新价值函数、策略函数。这样同时利用上了和环境交互的经历以及模型的预测。

根据描述,就需要有两个相互独立的模型,一个根据状态 s s s和动作 a a a得到下一个状态 s ’ s’ s策略函数),另一个根据当前状态 s s s和动作 a a a预测环境的奖励 r r r价值函数)。其中

  • s s s, a a a 学习 r r r 的预测过程是一个回归问题(regression problem)。
  • s s s, a a a 学习 s ’ s’ s 的选择过程是一个密度估计问题(density estimation problem)。

Dyna-Q

先看Dyna算法步骤:
在这里插入图片描述
具体解析步骤:

  • 先初始化状态 s s s和其任意动作 a a a所对应的状态价值 Q ( s , a ) Q(s,a) Q(s,a)
  • 初始化尝试要理解得到的模型 M o d e l ( s , a ) Model(s,a) Model(s,a)
    上 面 两 步 就 是 第 一 行 的 初 始 化 上面两步就是第一行的初始化
  • a)对于每一轮迭代,直接使用当前状态 S S S,
  • b)使用 ϵ-贪婪策略获取动作A, A < − e − g r e d d y ( S , Q ) A<-e-greddy(S,Q) A<egreddy(S,Q)
  • c)执行动作 A A A,得到新状态 S ’ S’ S和奖励 R R R
  • d)然后用Q-Learning更新价值函数 Q ( S , A ) Q(S,A) Q(S,A) Q ( S , A ) = Q ( S , A ) + α [ R + γ m a x a Q ( S ′ , a ) − Q ( S , A ) ] Q(S,A)=Q(S,A)+α[R+γmaxaQ(S′,a)−Q(S,A)] Q(S,A)=Q(S,A)+α[R+γmaxaQ(S,a)Q(S,A)]
  • e)用 R , S ’ R,S’ RS更新模型 M o d e l ( s , a ) Model(s,a) Model(sa)----
  • (与真实环境交互完毕后,进行n次模拟)
    • 每次模拟都随机选择一个之前出现过的状态 S S S, 并在此基础上随机选择一个动作 A A A
    • 基于模型 M o d e l ( S , A ) Model(S,A) Model(S,A)得到$S′ 和 和 R$
    • 再使用Q-Learning更新价值函数: Q ( S , A ) = Q ( S , A ) + α [ R + γ m a x a Q ( S ′ , a ) − Q ( S , A ) ] Q(S,A)=Q(S,A)+α[R+γmaxaQ(S′,a)−Q(S,A)] Q(S,A)=Q(S,A)+α[R+γmaxaQ(S,a)Q(S,A)]
    def learn(self):self.steps_per_episode = []for ep in range(self.episodes):while not self.maze.end:action_index = self.choose_action()self.state_actions.append((self.state, action_index))nxtState, reward = self.maze.step(action_index)# update Q-valueself.Q_values[self.state][action_index] += self.lr * (reward + np.max(list(self.Q_values[nxtState].values())) - self.Q_values[self.state][action])# update modelif self.state not in self.model.keys():self.model[self.state] = {}self.model[self.state][action_index] = (reward, nxtState)self.state = nxtState# loop n times to randomly update Q-valuefor _ in range(self.steps):# randomly choose an staterand_idx = np.random.choice(range(len(self.model.keys())))_state = list(self.model)[rand_idx]# randomly choose an actionrand_idx = np.random.choice(range(len(self.model[_state].keys())))_action = list(self.model[_state])[rand_idx]_reward, _nxtState = self.model[_state][_action]self.Q_values[_state][_action] += self.lr * (_reward + np.max(list(self.Q_values[_nxtState].values())) - self.Q_values[_state][_action])# end of gameif ep % 10 == 0:print("episode", ep)self.steps_per_episode.append(len(self.state_actions))self.reset()

下面开始我的搬运工作,一字不差的搬运

在前面我们讨论了基于价值的强化学习(Value Based RL)和基于策略的强化学习模型(Policy Based RL),本篇我们讨论最后一种强化学习流派,基于模型的强化学习(Model Based RL),以及基于模型的强化学习算法框架Dyna。
本篇主要参考了UCL强化学习课程的第8讲和Dyna-2的论文。

1 基于模型的强化学习简介

基于价值的强化学习模型和基于策略的强化学习模型都不是基于模型的,它们从价值函数,策略函数中直接去学习,不用学习环境的状态转移概率模型,即在状态 s s s下采取动作 a a a,转到下一个状态 s ′ s′ s的概率 P s s ′ a P^{a}_{ss′} Pssa
而基于模型的强化学习则会尝试从环境的模型去学习,一般是下面两个相互独立的模型:一个是状态转移概率预测模型P,输入当前状态 s s s和动作 a a a,预测下一个状态 s ′ s′ s。另一个是奖励预测模型R,输入当前状态 s s s和动作 a a a,预测环境的奖励 r r r。即模型可以描述为下面两个式子:
------------------------------------------ S t + 1 ∼ P ( S t + 1 ∣ S t , A t ) S_{t+1}\sim P(S_{t+1}|S_{t},A_{t}) St+1P(St+1St,At)
------------------------------------------ R t + 1 ∼ R ( R t + 1 ∣ R t , A t ) R_{t+1}\sim R(R_{t+1}|R_{t},A_{t}) Rt+1R(Rt+1Rt,At)
如果模型 P P P, R R R可以准确的描述真正的环境的转移模型,那么我们就可以基于模型来预测,当有一个新的状态 S S S和动作 A A A到来时,我们可以直接基于模型预测得到新的状态和动作奖励,不需要和环境交互。当然如果我们的模型不好,那么基于模型预测的新状态和动作奖励可能错的离谱。

从上面的描述我们可以看出基于模型的强化学习和不基于模型的强化学习的主要区别:即基于模型的强化学习是从模型中学习,而不基于模型的强化学习是通过环境交互的经历去学习。
下面这张图描述了基于模型的强化学习的思路:
在这里插入图片描述

2. 基于模型的强化学习算法训练流程

这里我们看看基于模型的强化学习算法训练流程,其流程和我们监督学习算法是非常类似的。
假设训练数据是若干组这样的经历:
S 1 , A 1 , R 2 , S 2 , A 2 , R 2 , . . . , S T S_1,A_1,R_2,S_2,A_2,R_2,...,S_T S1,A1,R2,S2,A2,R2,...,ST
对于每组经历,我们可以将其转化为 T − 1 T−1 T1组训练样本,即:
S 1 , A 1 → S 2 ; S 1 , A 1 → R 2 S_1,A_1→S_2;S_1,A_1→R_2 S1,A1S2S1,A1R2
S 2 , A 2 → S 3 ; S 2 , A 2 → R 3 S_2,A_2→S_3;S_2,A_2→R_3 S2,A2S3S2,A2R3

S T − 1 , A T − 1 → S T , S T − 1 , A T − 1 → R T S_{T−1},A_{T−1}→S_T,S_{T-1},A_{T−1}→R_T ST1,AT1ST,ST1,AT1RT
右边的训练样本一起组成了一个分类模型或密度估计模型,输入状态和动作,输出下一个状态。 右边的训练样本一起组成了一个回归模型训练集,输入状态和动作,输出动作奖励值。
Note:基于模型的强化学习在这边可以体现出来。搭建模型的方式有两种:

  1. 第一种是使用表格的形式将这些数据保存下来,以后使用这些模型致谢一查表的方式提取数据。
  2. 第二种方式是使用监督学习的方式训练一个对应的神经网络,然后使用神经网络预测这些模型。

至此我们的强化学习求解过程和传统的监督学习算法没有太多区别了,可以使用传统的监督学习算法来求解这两个模型。

当然还可以更简单,即通过对训练样本进行查表法进行统计,直接得到 P ( S t + 1 ∣ S t , A t ) P(S_{t+1}|S_t,A_t) P(St+1St,At)的概率和 R ( R t + 1 ∣ S t , A t ) R(R_{t+1}|S_t,A_t) R(Rt+1St,At)的平均值,这样就可以直接预测。比使用模型更简单。

此外,还有其他的方法可以用来得到 P ( S t + 1 ∣ S t , A t ) P(S_{t+1}|S_t,A_t) P(St+1St,At) R ( R t + 1 ∣ S t , A t ) R(R_{t+1}|S_t,A_t) R(Rt+1St,At),这个我们后面再讲。

虽然基于模型的强化学习思路很清晰,而且还有不要和环境持续交互优化的优点,但是用于实际产品还是有很多差距的。主要是我们的模型绝大多数时候不能准确的描述真正的环境的转化模型,那么使用基于模型的强化学习算法得到的解大多数时候也不是很实用。那么是不是基于模型的强化学习就不能用了呢?也不是,我们可以将基于模型的强化学习和不基于模型的强化学习集合起来,取长补短,这样做最常见的就是Dyna算法框架

3. Dyna算法框架

Dyna算法框架并不是一个具体的强化学习算法,而是一类算法框架的总称Dyna将基于模型的强化学习和不基于模型的强化学习集合起来,既从模型中学习,也从和环境交互的经历去学习,从而更新价值函数和(或)策略函数。如果用和第一节类似的图,可以表示如下图,和第一节的图相比,多了一个“Direct RL“的箭头,这正是不基于模型的强化学习的思路。
在这里插入图片描述
Dyna算法框架和不同的具体的不基于模型的强化学习一起,可以得到具体的不同算法。如果我们使用基于价值函数的Q-Learning,那么我们就得到了Dyna-Q算法。我们基于Dyna-Q来看看Dyna算法框架的一般流程.

4. Dyna-Q算法流程

这里我们给出基于价值函数的Dyna-Q算法的概要流程。假设模型使用的是查表法。

  1. 初始化任意一个状态 s s s,和任意一个动作 a a a对应的状态价值 Q ( s , a ) Q(s,a) Q(s,a), 初始化奖励模型 R ( s , a ) R(s,a) R(s,a)和状态模型 P ( s , a ) P(s,a) P(s,a)
  2. for i=1 to 最大迭代次数T:
    . a) S ← current state
    . b) A ← ϵ − g r e e d y ( S , Q ) ϵ−greedy(S,Q) ϵgreedy(S,Q)
    . c) 执行动作A,得到新状态 S ′ S^′ S和奖励R
    . d) 使用Q-Learning更新价值函数:(公式在下一行)
    Q ( S , A ) = Q ( S , A ) + α [ R + γ m a x a Q ( S ′ , a ) − Q ( S , A ) Q(S,A)=Q(S,A)+α[R+γmax_{a}Q(S^′,a)−Q(S,A) Q(S,A)=Q(S,A)+α[R+γmaxaQ(S,a)Q(S,A)
    . e) 使用 S , A , S ′ S,A,S^′ S,A,S更新状态模型 P ( s , a ) P(s,a) P(s,a),使用 S , A , R S,A,R S,A,R更新奖励模型 R ( s , a ) R(s,a) R(s,a)
    . f) for j=1 to 最大次数n:
         i) 随机选择一个之前出现过的状态S, 在状态S上出现过的动作中随机选择一个动作A
        ii) 基于模型 P ( S , A ) P(S,A) P(S,A)得到 S ′ S^′ S, 基于模型R(S,A)得到R
        iii) 使用Q-Learning更新价值函数:(公式在下一行)
         Q ( S , A ) = Q ( S , A ) + α [ R + γ m a x a Q ( S ′ , a ) − Q ( S , A ) ] Q(S,A)=Q(S,A)+α[R+γmax_{a}Q(S^′,a)−Q(S,A)] Q(S,A)=Q(S,A)+α[R+γmaxaQ(S,a)Q(S,A)]

从上面的流程可以看出,Dyna框架在每个迭代轮中,会先和环境交互,并更新价值函数和(或)策略函数,接着进行n次模型的预测,同样更新价值函数和(或)策略函数。这样同时利用上了和环境交互的经历以及模型的预测。

5. Dyna-2算法框架

在Dyna算法框架的基础上后来又发展出了Dyna-2算法框架。和Dyna相比,Dyna-2将和和环境交互的经历以及模型的预测这两部分使用进行了分离。还是以Q函数为例,Dyna-2将记忆分为永久性记忆(permanent memory)和瞬时记忆(transient memory), 其中永久性记忆利用实际的经验来更新,瞬时记忆利用模型模拟经验来更新。
永久性记忆的Q函数定义为:
Q ( S , A ) = ϕ ( S , A ) T θ Q(S,A)=ϕ(S,A)^Tθ Q(S,A)=ϕ(S,A)Tθ
瞬时记忆的Q函数定义为:
Q ′ ( S , A ) = ϕ ˉ ( S , A ) T θ ˉ Q^′(S,A)=\bar{ϕ}(S,A)^T\bar{θ} Q(S,A)=ϕˉ(S,A)Tθˉ
组合起来后记忆的Q函数定义为:
Q ˉ ( S , A ) = ϕ ( S , A ) T θ + ϕ ˉ ( S , A ) T θ ˉ \bar{Q}(S,A)=ϕ(S,A)^Tθ+\bar{ϕ}(S,A)^T\bar{θ} Qˉ(S,A)=ϕ(S,A)Tθ+ϕˉ(S,A)Tθˉ
Dyna-2的基本思想是在选择实际的执行动作前,智能体先执行一遍从当前状态开始的基于模型的模拟,该模拟将仿真完整的轨迹,以便评估当前的动作值函数。智能体会根据模拟得到的动作值函数加上实际经验得到的值函数共同选择实际要执行的动作。价值函数的更新方式类似于SARSA(λ).

Dyna-2是将环境交互的经历以及模型的预测进行了分离。即不是像Dyna一样交互完了就拿来模模拟,而是对于Q函数将被分为永久性记忆 Q ( S , A ) Q(S,A) Q(S,A)和瞬时记忆 Q ′ ( S , A ) Q^{'}(S,A) Q(S,A)。其中永久性记忆利用与实际环境的交互经验来更新瞬时记忆利用与模型的模拟交互来更新。然后两者结合起来共同 对作用起选择。

以下是Dyna-2的算法流程:

6. 基于模型的强化学习总结

基于模型的强化学习一般不单独使用,而是和不基于模型的强化学习结合起来,因此使用Dyna算法框架是常用的做法对于模型部分,我们可以用查表法和监督学习法等方法,预测或者采样得到模拟的经历。而对于非模型部分,使用前面的Q-Learning系列的价值函数近似,或者基于Actor-Critic的策略函数的近似都是可以的。

除了Dyna算法框架,我们还可以使用基于模拟的搜索(simulation-based search)来结合基于模型的强化学习和不基于模型的强化学习,并求解问题。这部分我们在后面再讨论。


http://chatgpt.dhexx.cn/article/iEaTi7RK.shtml

相关文章

强化学习笔记:强化学习的约束

1 所需的样本数量过大 深度强化学习一个严重的问题在于需要巨大的样本量。举个例子&#xff0c;玩Atari游戏 图 19.17 中纵轴是算法的分数与 人类分数的比值&#xff0c; 100% 表示达到人类玩家的水准。 图中横轴是收集到的游戏帧数&#xff0c;即样本数量。 Rainbow DQN 需…

强化学习的模型

文章目录 前言一、强化学习是什么&#xff1f;二、基本模型1.基本框架2.学习过程 三.马尔科夫决策过程&#xff08;Markov Decision Process. MDP&#xff09;1.马尔科夫性质2.MDP的基本组成部分3.MDP的基本流程 四、基于模型和免模型的强化学习1.模型2.基于模型的强化学习&…

深度强化学习调研

深度强化学习&#xff08;DRL&#xff09; &#xff08;一&#xff09;强化学习 强化学习&#xff08;Reinforcement Learning&#xff0c;简称RL&#xff09;是机器学习领域的一个研究热点&#xff0c;当前已经广泛应用于工业制造、仿真模拟、机器人控制、优化与调度、游戏博…

强化学习总结

强化学习 一、强化学习概述 1.强化学习简介 强化学习最早可以追溯到早期控制论以及统计、心理学、神经科学、计算机科学等学科的一些研究。在最近的五到十年中&#xff0c;强化学习在机器学习和人工智能研究者中得到了大量的关注&#xff0c;它描绘了一种在不进行具体指导的情…

强化学习介绍

文章目录 1 什么是强化学习&#xff1f;2 强化学习的特征与特点3 强化学习的要素与框架3.1 Policy3.2 Reward3.3 Value3.4 model3.5 Return(cumulative future reward) 回报|未来累积回报3.6 Discounted return 折扣回报 4 强化学习流程5 例子 马里奥 &#xff08;一定要看&…

强化学习(Q-learning)

强化学习RF简介 强化学习是机器学习中的一种重要类型&#xff0c;一个其中特工通过 执行操作并查看查询查询结果来学习如何在环境中表现行为。 机器学习算法可以分为3种&#xff1a;有监督学习&#xff08;Supervised Learning&#xff09;、无监督学习&#xff08;Unsupervi…

强化学习简介

强化学习简介 强化学习(Reinforcement Learning&#xff0c;RL)是机器学习中的一个领域&#xff0c;是学习做什么&#xff08;即如何把当前的情景映射成动作&#xff09;才能使得数值化的收益最大化,学习者不会被告知应该采取什么动作&#xff0c;而是必须自己通过尝试去发现哪…

强化学习(一):简介——什么是强化学习?

本文将介绍强化学习的基本含义&#xff0c;了解什么是强化学习、强化学习的概念与基本框架以及强化学习中常见的问题类型。 什么是强化学习&#xff1f; 强化学习&#xff08;Reinforcement Learning, RL&#xff09;&#xff0c;又称再励学习、评价学习或增强学习&#xff0c…

机器学习算法(三十):强化学习(Reinforcement Learning)

目录 1 简介 1.1 什么是强化学习 1.2 强化学习的主要特点 1.3 强化学习的组成部分 2 强化学习训练过程 3 强化学习算法归类 3.1 Value Based 3.2 Policy Based 3.3 Actor-Critic 3.4 其他分类 4 EE&#xff08;Explore & Exploit&#xff09;探索与利用 5 强化…

强化学习入门这一篇就够了!!!万字长文

强化学习 强化学习入门这一篇就够了万字长文带你明明白白学习强化学习... 强化学习入门这一篇就够了 强化学习前言一、概率统计知识回顾1.1 随机变量和观测值1.2 概率密度函数1.3 期望1.4 随机抽样 二、强化学习的专业术语2.1 State and action2.2 policy-策略2.3 reward2.4 状…

关于gensim的一些使用记录

NLP神器 Gensim是一款开源的第三方Python工具包&#xff0c;用于从原始的非结构化的文本中&#xff0c;无监督地学习到文本隐层的主题向量表达。 支持包括TF-IDF&#xff0c;潜在语义分析&#xff08;Latent Semantic Analysis&#xff0c;LSA&#xff09;&#xff0c;潜狄利克…

gensim官方文档实践笔记

中文文档比机翻还颠三倒四, 所以还是自己记录一下, 顺便加一些注解. 目录 文档document 语料库Corpus 语料库作用 语料库预处理 词汇编号 向量Vector 方法1: 特征向量(vector of features) 方法2: doc2bow 模型Model 语料库和向量空间 字符串转向量 语料库流Corpu…

gensim安装

输入以下命令即可&#xff1a; pip install gensim -i http://pypi.douban.com/simple --trusted-host pypi.douban.com以下是过程&#xff1a; 尝试1&#xff1a;直接在anaconda3上面搜索出来安装 速度太慢&#xff0c;失败 尝试2&#xff1a;更换pip源&#xff0c;如下所示…

Gensim:一款进行文本主题识别的 Python 工具库

从大量文本中自动提取人们谈论的主题(主题识别)是自然语言处理的基本应用之一。大型文本示例包括社交媒体订阅、消费者对酒店、电影和其他业务的评价、用户评论、新闻和客户发来的邮件。 在本中&#xff0c;将使用LDA 从 20Newsgroup 数据集 中提取主题的实战案例。欢迎深入探…

gensim 快速入门 Word2Vec

文章目录 gensim的核心概念Word2Vec简介Word2Vec初试探将单词可视化 训练自己的Word2Vec模型 gensim的核心概念 Document: 文档。可以是一个一句话&#xff0c;或者一段话Corpus: 文档的集合Vector: 文档向量。将文档通过数学向量表示。Model: 模型。将文档转换为向量的模型。…

vue获得焦点事件处理函数中控制其失去焦点,但是失去焦点后该获得焦点事件一直被触发

当input获取焦点的时候需要判断另一个操作是否已完成&#xff0c;否则需要引导用户先去执行另一个操作&#xff0c;是则允许输入。 另一个操作跟当前操作是在同一个页面上&#xff0c;无法通过“下一步”进行控制。 解决思路是&#xff1a; 当input获取焦点的时候&#xff0…

div失去焦点事件onblur()无效

初学js事件&#xff0c;想做一个点击时变红&#xff0c;取消聚焦时变白的div&#xff0c;于是我这样写代码&#xff1a; <div style"width: 100px;height: 50px;border: 1px solid;"></div> <script>let div document.getElementsByTagName(&quo…

input失去焦点事件和点击事件冲突的解决思路

首先说一下应用场景 el-input框为禁用状态时&#xff0c;点击取消禁用&#xff0c;并显示后方两个按钮&#xff0c; 点击绿色按钮保存input框当前值&#xff0c;失去焦点或点击红色框时恢复改变前的值 思路就是不在input上的失去焦点方法&#xff0c;而是手动调用失去焦点方法…

input中blur失去焦点事件与点击事件冲突

场景&#xff1a; 当在输入框里输入手机号的时候&#xff0c;输入框高亮&#xff0c;并且关闭按钮显示&#xff0c;input失焦时关闭按钮隐藏 现象&#xff1a; 遇到的问题是&#xff0c;当我们点击关闭按钮清空input框数据时&#xff0c;发现只是关闭按钮隐藏了&#xff0c…

div失去焦点事件onblur()不触发解决方法

需求&#xff1a; 做一个弹出框组件&#xff0c;文字点击时会在文字下方弹出一个框&#xff0c;在vue3中监听div元素的blur事件发现事件并不会在div失去焦点时触发 解决方法 bug原因&#xff1a;在vue中div默认不触发事件,除非将元素添加tabindex"-1"属性才会触发…