【动手学强化学习】第 6 章 Dyna-Q 算法知识点总结

【动手学强化学习】第 6 章 Dyna-Q 算法知识点总结

  • 本章知识点
  • 基于模型的强化学习与无模型的强化学习方法简介
    • 无模型的强化学习方法
    • 基于模型的强化学习方法
  • 强化学习算法的评价指标
  • Dyna-Q算法
  • Dyna-Q 算法的具体流程
  • Dyna-Q 代码实践

本章知识点

基于模型的强化学习与无模型的强化学习方法简介

  • 在强化学习中,“模型”通常指与智能体交互的环境模型,即对环境的状态转移概率和奖励函数进行建模
  • 根据是否具有环境模型,强化学习算法分为两种:基于模型的强化学习(model-based reinforcement learning)和无模型的强化学习(model-free reinforcement learning)
    在这里插入图片描述

无模型的强化学习方法

  • 无模型的强化学习根据智能体与环境交互采样到的数据直接进行策略提升或者价值估计
  • 第 5 章讨论的两种时序差分算法,即 Sarsa 和 Q-learning 算法,便是两种无模型的强化学习方法
  • 《动手学强化学习》在后续章节中将要介绍的方法也大多是无模型的强化学习算法

基于模型的强化学习方法

  • 在基于模型的强化学习中,模型可以是事先知道的,也可以是根据智能体与环境交互采样到的数据学习得到的,然后用这个模型帮助策略提升或者价值估计
  • 第 4 章讨论的两种动态规划算法,即策略迭代和价值迭代,则是基于模型的强化学习方法,在这两种算法中环境模型是事先已知的
  • 本章即将介绍的 Dyna-Q 算法是非常基础的基于模型的强化学习算法,但其环境模型是通过采样数据估计得到的

强化学习算法的评价指标

  • 强化学习算法有两个重要的评价指标:期望回报,样本复杂度
  • 期望回报是指算法收敛后的策略在初始状态下的期望回报
  • 样本复杂度是指算法达到收敛结果需要在真实环境中采样的样本数量
  • 基于模型的强化学习算法由于具有一个环境模型,智能体可以额外和环境模型进行交互,对真实环境中样本的需求量往往就会减少,因此通常会比无模型的强化学习算法具有更低的样本复杂度。但是,环境模型可能并不准确,不能完全代替真实环境,因此基于模型的强化学习算法收敛后其策略的期望回报可能不如无模型的强化学习算法

【补充内容】:样本效率与样本复杂度的区别和关系

  • 样本复杂度(Sample Complexity):样本复杂度通常指的是学习一个任务所需的样本数量的上限。换句话说,这是一个理论上的度量,用来描述一个学习算法至少需要多少个样本才能达到一定的性能标准(例如,以一定的概率达到特定的准确度)。样本复杂度是一个理论上的界限,它通常与算法的收敛速度和所需的数据量有关。
  • 样本效率(Sample Efficiency):样本效率则是一个更实际的概念,它描述的是算法在实际应用中使用有限样本进行学习的能力。样本效率高的算法能够在较少的数据上快速学习并做出准确的预测或决策。样本效率通常与算法的泛化能力有关,即算法能够多好地将从训练数据中学到的知识应用到新的、未见过的数据上
  • 样本复杂度更多地关注理论上的最小样本数量,而样本效率则关注实际应用中算法使用样本的能力。两者都很重要,因为理论上的样本复杂度可以指导算法设计,而实际的样本效率则决定了算法在现实世界中的可行性和性能

Dyna-Q算法

  • Dyna-Q 算法是一个经典的基于模型的强化学习算法
  • Dyna-Q 使用一种叫做 Q-planning 的方法来基于模型生成一些模拟数据,然后用模拟数据和真实数据一起改进策略
  • Q-planning 每次选取一个曾经访问过的状态 s s s,采取一个曾经在该状态下执行过的动作 a a a,通过模型得到转移后的状态 s ′ s' s以及奖励 r r r,并根据这个模拟数据,用 Q-learning 的更新方式来更新动作价值函数

Dyna-Q 算法的具体流程

在这里插入图片描述

  • 在每次与环境进行交互执行一次 Q-learning 之后,Dyna-Q 会做 N N N次Q-planning
  • 其中 Q-planning 的次数 N N N是一个事先可以选择的超参数,当其为 0 时就是普通的 Q-learning
  • 注意:上述 Dyna-Q 算法是执行在一个离散并且确定的环境中,所以当看到一条经验数据 ( s , a , r , s ′ ) (s,a,r,s') (s,a,r,s)时,是与真实环境交互的得到哦,可以直接对模型做出更新, 即 M ( s , a ) ← r , s ′ M(s,a) \leftarrow r,s' M(s,a)r,s

Dyna-Q 代码实践

悬崖漫步环境代码

import matplotlib.pyplot as plt
import numpy as np
from tqdm import tqdm
import random
import timeclass CliffWalkingEnv:def __init__(self, ncol, nrow):self.nrow = nrowself.ncol = ncolself.x = 0  # 记录当前智能体位置的横坐标self.y = self.nrow - 1  # 记录当前智能体位置的纵坐标def step(self, action):  # 外部调用这个函数来改变当前位置# 4种动作, change[0]:上, change[1]:下, change[2]:左, change[3]:右。坐标系原点(0,0)# 定义在左上角change = [[0, -1], [0, 1], [-1, 0], [1, 0]]self.x = min(self.ncol - 1, max(0, self.x + change[action][0]))self.y = min(self.nrow - 1, max(0, self.y + change[action][1]))next_state = self.y * self.ncol + self.xreward = -1done = Falseif self.y == self.nrow - 1 and self.x > 0:  # 下一个位置在悬崖或者目标done = Trueif self.x != self.ncol - 1:reward = -100return next_state, reward, donedef reset(self):  # 回归初始状态,起点在左上角self.x = 0self.y = self.nrow - 1return self.y * self.ncol + self.x

在 Q-learning 的代码上进行简单修改,实现 Dyna-Q 的主要代码
最主要的修改是加入了环境模型model,用一个字典表示,每次在真实环境中收集到新的数据,就把它加入字典
根据字典的性质,若该数据本身存在于字典中,便不会再一次进行添加。在 Dyna-Q 的更新中,执行完 Q-learning 后,会立即执行 Q-planning

class DynaQ:""" Dyna-Q算法 """def __init__(self,ncol,nrow,epsilon,alpha,gamma,n_planning,n_action=4):self.Q_table = np.zeros([nrow * ncol, n_action])  # 初始化Q(s,a)表格self.n_action = n_action  # 动作个数self.alpha = alpha  # 学习率self.gamma = gamma  # 折扣因子self.epsilon = epsilon  # epsilon-贪婪策略中的参数self.n_planning = n_planning  #执行Q-planning的次数, 对应1次Q-learningself.model = dict()  # 环境模型def take_action(self, state):  # 选取下一步的操作if np.random.random() < self.epsilon:action = np.random.randint(self.n_action)else:action = np.argmax(self.Q_table[state])return actiondef q_learning(self, s0, a0, r, s1):td_error = r + self.gamma * self.Q_table[s1].max() - self.Q_table[s0, a0]self.Q_table[s0, a0] += self.alpha * td_errordef update(self, s0, a0, r, s1):self.q_learning(s0, a0, r, s1)self.model[(s0, a0)] = r, s1  # 将数据添加到模型中for _ in range(self.n_planning):  # Q-planning循环# 随机选择曾经遇到过的状态动作对(s, a), (r, s_) = random.choice(list(self.model.items()))self.q_learning(s, a, r, s_)

Dyna-Q 算法在悬崖漫步环境中的训练函数,它的输入参数是 Q-planning 的步数

def DynaQ_CliffWalking(n_planning):ncol = 12nrow = 4env = CliffWalkingEnv(ncol, nrow)epsilon = 0.01alpha = 0.1gamma = 0.9agent = DynaQ(ncol, nrow, epsilon, alpha, gamma, n_planning)num_episodes = 300  # 智能体在环境中运行多少条序列return_list = []  # 记录每一条序列的回报for i in range(10):  # 显示10个进度条# tqdm的进度条功能with tqdm(total=int(num_episodes / 10),desc='Iteration %d' % i) as pbar:for i_episode in range(int(num_episodes / 10)):  # 每个进度条的序列数episode_return = 0state = env.reset()done = Falsewhile not done:action = agent.take_action(state)next_state, reward, done = env.step(action)episode_return += reward  # 这里回报的计算不进行折扣因子衰减agent.update(state, action, reward, next_state)state = next_statereturn_list.append(episode_return)if (i_episode + 1) % 10 == 0:  # 每10条序列打印一下这10条序列的平均回报pbar.set_postfix({'episode':'%d' % (num_episodes / 10 * i + i_episode + 1),'return':'%.3f' % np.mean(return_list[-10:])})pbar.update(1)return return_list

结果可视化

np.random.seed(0)
random.seed(0)
n_planning_list = [0, 2, 20]
for n_planning in n_planning_list:print('Q-planning步数为:%d' % n_planning)time.sleep(0.5)return_list = DynaQ_CliffWalking(n_planning)episodes_list = list(range(len(return_list)))plt.plot(episodes_list,return_list,label=str(n_planning) + ' planning steps')
plt.legend()
plt.xlabel('Episodes')
plt.ylabel('Returns')
plt.title('Dyna-Q on {}'.format('Cliff Walking'))
plt.show()

在这里插入图片描述

  • 从上述结果中可以很容易地看出,随着 Q-planning 步数的增多,Dyna-Q 算法的收敛速度也随之变快
  • 当然,并不是在所有的环境中,都是 Q-planning 步数越大则算法收敛越快,这取决于环境是否是确定性的,以及环境模型的精度
  • 在上述悬崖漫步环境中,状态的转移是完全确定性的,构建的环境模型的精度是最高的,所以可以通过增加 Q-planning 步数来直接降低算法的样本复杂度
  • 基于模型的强化学习算法 Dyna-Q 在以上环境中获得了很好的效果,但这些环境比较简单,模型可以直接通过经验数据得到
  • 如果环境比较复杂,状态是连续的,或者状态转移是随机的而不是确定性的,如何学习一个比较准确的模型就变成非常重大的挑战,这直接影响到基于模型的强化学习算法能否应用于这些环境并获得比无模型的强化学习更好的效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/16120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++语言·list链表

其实现在在讲这些容器的时候&#xff0c;我们的重点已经不是它的接口都有什么&#xff0c;功能都是什么了&#xff0c;这些内容官网上都能查到&#xff0c;而且容器和容器之间接口的不同处很少&#xff0c;我在讲解的话也只是把官网上的东西截图下来复述一下。现在的重点其实都…

AtCoder Regular Contest 178 A~D

A.Good Permutation 2&#xff08;贪心&#xff09; 题意&#xff1a; 给你一个正整数 N N N和一个由 M M M个正整数 A ( A 1 , A 2 , … , A M ) A(A_{1},A_{2}, \dots,A_{M}) A(A1​,A2​,…,AM​)组成的序列。 在这里&#xff0c; A A A的所有元素都是介于 1 1 1和 N N …

网络编程-TCP

一、TCP的相关IP 1.1 SeverSocket 这是Socket类,对应到网卡,但是这个类只能给服务器使用. 1.2 Socket 对应到网卡,既可以给服务器使用,又可以给客户端使用. TCP是面向字节流的,传输的基本单位是字节. TCP是有连接的,和打电话一样,需要客户端拨号,服务器来听. 服务器的内核…

Stream流的使用

目录 一&#xff0c;Stream流 1.1 概述 1.2 Stream代码示例 二&#xff0c;Stream流的使用 2.1 数据准备 2.2 创建流对象 2.3 中间操作 filter map distinct sorted limit skip flatMap 2.4 终结操作 foreach count max&min collect 2.5 查找与匹配 a…

redis中String,Hash类型用法与场景使用

String 用法 1. 设置键值对 &#xff08;1&#xff09;设置键值对使用 set 命令设置 key 的值。 返回值&#xff1a;ok&#xff0c;如果 key 已经存在&#xff0c;set 命令会覆盖旧值。 &#xff08;2&#xff09;使用 setex 命令设置 key 的值并为其设置过期时间&#xff…

安全设计 | CISA:构建不可侵犯的代码,软件安全设计的未来之路

软件制造商在产品设计和开发过程中应采取安全设计原则和方法&#xff0c;以减少网络安全风险&#xff0c;并转变责任重心&#xff0c;使产品在设计时就内置安全特性&#xff0c;而不是依赖于后期的补丁和修复。为此CISA发布了《软件安全设计的原则和方法》&#xff0c;帮助软件…

兵器室管控系统|DW-306是一套成熟系统

概述 智慧兵器室管理系统&#xff08;DW-S306&#xff09;是依托互3D技术、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID智能仓库进行统一管理、分析的信息化、智能化、规范化的系统。 本解决方案利用现有内部网络&#xff0c;部署部队智能兵器室管理系统&#xff…

【Java】欸...?我学集合框架?真的假的?

【Java】欸…&#xff1f;我学集合框架&#xff1f;真的假的&#xff1f; Java集合框架 概述 Java集合框架主要由以下几个部分组成&#xff1a; 接口&#xff08;Interfaces&#xff09;&#xff1a;定义了集合的基本操作&#xff0c;如添加、删除、遍历等。实现&#xff0…

大语言模型的工程技巧(二)——混合精度训练

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型&#xff1a;从线性回归到通用人工智能》&#xff0c;欢迎有兴趣的读者多多支持。 混合精度训练的示例请参考如下链接&#xff1a;regression2chatgpt/ch11_llm/gpt2_lora_optimum.ipynb 本文将讨论如何利用混合…

Java语法篇-易错

文章目录 类型转换switch case类之间关系及UMLtry catch finally 类型转换 隐式类型转换&#xff0c;不同数值类型参与计算时&#xff0c;低精度会转化为高精度参与运算 byte,short,char参与整数运算时会转成int float,int 参与浮点数运算时会转成double 强制类型转换 高精…

数据结构 —— 栈 与 队列

1.栈 1.1栈的结构和概念 栈&#xff08;Stack&#xff09;是一种特殊的线性数据结构&#xff0c;它遵循后进先出&#xff08;LIFO&#xff0c;Last In First Out&#xff09;的原则。栈只允许在一端插入和删除数据&#xff0c;这一端被称为栈顶&#xff08;top&#xff09;&a…

c++引用和内联函数

一、引用 1.引用概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空 间&#xff0c;它和它引用的变量共用同一块内存空间。&#xff08;引用类型必须和引用实体是同种类型的&#xff09;&#xff0c;如&#x…

MySQL--联合索引应用细节应用规范

目录 一、索引覆盖 1.完全覆盖 2.部分覆盖 3.不覆盖索引-where条件不包含联合索引的最左则不覆盖 二、MySQL8.0在索引中的新特性 1.不可见索引 2.倒序索引 三、索引自优化--索引的索引 四、Change Buffer 五、优化器算法 1.查询优化器算法 2.设置算法 3.索引下推 …

2024年NGFW防火墙安全基准-防火墙安全功效竞争性评估实验室总结报告

Check Point 委托 Miercom 对 Check Point 下一代防火墙 (NGFW) 开展竞争性安全有效性测试&#xff0c; 选择的竞品分别来自 Cisco、Fortinet 和 Palo Alto Networks。对 Zscaler 的测试涉及他们的 SWG&#xff08;安全网关&#xff09;。测试内容包括验证防病毒、反恶意软件、…

SpringBoot+Vue开发记录(六)-- 后端配置mybatis

原型图什么的就先不管&#xff0c;后面再写。 本篇文章的主要内容就是springboot通过mybatis操作数据库实现增删改查。 重点是mybatis配置与相关文件数据&#xff0c;以后开新项目忘记了怎么配置的话可以再照着这个搞。 这算是最基础的部分了吧。 文章目录 一&#xff0c;配置…

基于STM32的自动宠物喂食器的Proteus仿真

文章目录 一、宠物喂食器1.题目要求2.思路2.1 OLED显示汉字2.2 DS1302模块2.3 液位传感器2.4 压力传感器和步进电机驱动 3.仿真图3.1 未仿真时3.2 开始仿真&#xff0c;OLED初始界面显示实时时间3.3 通过设置按键进入模式选择和喂食时间设置3.4 进入喂食时间设置3.5 设置好喂食…

计算机毕业设计Python+Spark+PyTroch游戏推荐系统 游戏可视化 游戏爬虫 神经网络混合CF推荐算法 协同过滤推荐算法 steam 大数据

毕业设计&#xff08;论文&#xff09; 基于SpringBoot的游戏防沉迷系统的设计与实现 摘 要 随着网络游戏市场的持续火爆,其最明显的负面影响----“网络游戏沉迷问题”已成为当前社会普遍关心的热点问题。根据2010年8月1日实施的《网络游戏管理暂行办法》&#xff0c;网络游…

图书管理系统——Java版

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaSE 顺序表的学习&#xff0c;点我 目录 图书管理系统菜单 基本框架&#xff1a; 书&#xff1a; 书架&#xff1a; 用户&#xff…

数字化转型必备:营销策划流程图,打造你的数字市场地图

制作营销策划流程图是一个系统化的过程&#xff0c;它可以帮助你清晰地规划和展示营销活动的各个阶段。 以下是制作营销策划流程图的步骤&#xff1a; 1.确定营销目标&#xff1a; 明确你的营销活动旨在实现的具体目标&#xff0c;比如提升品牌知名度、增加销售额、吸引新客…

Java进阶学习笔记25——Objects类

为啥比较两个对象是否相等&#xff0c;要用Objects的equals方法&#xff0c;而不是用对象自己的equals方法来解决呢&#xff1f; Objects&#xff1a; Objects类是一个工具类&#xff0c;提供了很多操作对象的静态方法供我们使用。 package cn.ensource.d14_objects;import ja…