强化学习 Lesson2 学习笔记

news2024/9/20 7:54:20

Lesson2-1 MDP、Q表格

一、强化学习MDP四元组<S,A,P,R>

  • S:state 状态
  • A:action 动作
  • R:reward 奖励 r[st,at]
  • P:probability 状态转移概率 p[st+1,rt|st,at]

强化学习是一系列决策的过程,通过当前的环境状态和收到的奖励来决定下一次执行的动作

  • Model-based: P函数和R函数已知
  • Model-free:P函数和R函数未知

二、Q表格:状态动作价值

Q(st,at)装死action…
St0-90
St+1010
state…

​ 未来总收益引出:如果一辆车闯红灯,他扣一分。但是如果它运送病人,闯红灯扣一分,把病人送到病人加一百分,所以这时候就应该闯红灯。强化学习目光放长远一点决策。

​ 但是目光也不能太过长远,如股票,考虑太长远的反而不合理,所以需要引入衰减因子。

  • Reward 折扣因子γ,未来总收益计算需要从终点开始往前计算

    • Gt=Rt+1+γRt+22Rt+23Rt+2+…
  • 使用例子来说明强化学习更新Q表格

请添加图片描述

Q表格用来指导每一步动作。每走一步,会更新一次Q表格,用下一个状态的Q值去更新当前状态的Q值

  • 大佬讲解
    请添加图片描述

Lesson2-2-强化概念、TD更新、Sarsa引入

  • 强化概念:巴普洛夫的条件反射实验

在这里插入图片描述

解释:食物对小狗有一种无条件的刺激,而铃声是中性的,一开始并不会对小狗有刺激;而如果在每次喂食前先响一下铃,重复多次后,响铃对小狗来说也会产生一种刺激,会开始流口水,也就是说,声音会代表着有食物,对小狗来说也就有了价值

巴普洛夫实验强调的是中性的条件刺激在跟无条件刺激紧紧挨着的时候,经过反复多次,这种中性的条件刺激也能引起和无条件刺激一样的条件反应。

中性刺激和无条件刺激紧紧挨着,中性刺激也能引起无条件反应。

解释:假设人走在树林里,先看到树上有熊爪后看到熊,接着就看到熊发怒了,经过很多次之后,原来要见到熊才瑟瑟发抖的,后来只要见到树上有熊爪就会有晕眩和害怕的感觉。也就是说,在不断地训练之后,下一个状态的价值可以不断地强化、影响上一个状态的价值

请添加图片描述

斯坦福大学的在线实验:状态价值迭代

原文链接:https://cs.stanford.edu/people/karpathy/reinforcejs/gridworld_td.html

Temporal Difference 时序查分(单步更新)

Q(St,At) ⭠ Q(St,At)+α[Rt+1+γQ(St+1,At+1)-Q(St,At)]

  • 用下一个Q来更新当前Q

  • Target目标值 Rt+1+γQ(St+1,At+1)

  • 当前值 Q(St,At)

  • 软更新 用 Rt+1+γQ(St+1,At+1)-Q(St,At) 软更新Q(St,At)

  • 逼近 Q 理想中的值

请添加图片描述

  • Sarsa 算法

请添加图片描述

  • 代码的实现思路

    • 根据Q表格选动作
      • 带探索 sample()
      • 仅评估 predict()
    • 更新Q表格
      • Learn()

请添加图片描述

智能体每次跟环境交互一次以后,就可以从环境当中拿到一个状态和收益(智能体主要依据Q表格选动作),然后拿到这些值以后,就用来更新Q表格

Lesson 2-3 Sarsa算法介绍

请添加图片描述

  • 伪代码
obs = env.reset() # 重置环境, 重新开一局(即开始新的一个episode)
action = agent.sample(obs) # 根据 Q表格 选择一个动作

while True:
    next_obs, reward, done, _ = env.step(action) # 与环境进行一个交互
    next_action = agent.sample(next_obs) # 根据算法选择一个动作
    # 训练  Sarsa 算法
    agent.learn(obs, action, reward, next_obs, next_action, done) # 更新 Q表格 
    action = next_action
    obs = next_obs  # 存储上一个观察值
  • ε-greedy

请添加图片描述

有一定概率选择已有的最优动作也有一定的概率去将没有使用过的动作利用起来

  • 伪代码
# 根据输入观察值,采样输出的动作值,带探索
def sample(self, obs):
    if np.random.uniform(0, 1) < (1.0 - self.epsilon): #根据table的Q值选动作
        action = self.predict(obs)
    else:
        action = np.random.choice(self.act_n) #有一定概率随机探索选取一个动作
    return action

# 根据输入观察值,预测输出的动作值
def predict(self, obs):
    Q_list = self.Q[obs, :]
    maxQ = np.max(Q_list)
    action_list = np.where(Q_list == maxQ)[0]  # maxQ可能对应多个action ,所以随机选择一个
    action = np.random.choice(action_list)
    return action
  • Sarsa与环境交互代码,每个Step都更新learn一下

请添加图片描述

def run_episode(env, agent, render=False):
	total_steps= 0#记最每个episode走了多少step
	total_reward = 0
	
  obs = env.reset() # 重置环境,重新开一局(即开始新的一个episode)
	action = agent.sample(obs)# 根据算法选择一个动作

	while True:
		next_obs, reward, done, _ = env.step(action) # 与环境进行一次交互
		next_action = agent.sampte(next_obs) # 根据算法选择一个动作
		# 训练 Sarsa 算法
		agent.learn(obs, action, reward, next_obs, next_action, done)
		action = next_action
		obs = next_obs # 存储上一个观察值
		total_reward += reward
		total_steps += 1 #计算step数
		if render:
			env.render() #渲染新的一帧图片
		if done:
			break
	return total_reward, total_steps
  • Sarsa Agent ①根据Q表格选动作
class SarsaAgent(object):
  def __init__(self,obs_n,act_n,learning_rate=0.01,gamma=0.9,e_greed=0.1):
    self.act_n=act_n	# 动作维度,有几个动作可选
    self.lr=learning_rate	# 学习率
    self.gamma=gamma	# reward的衰减率
    self.epsilon=e_greed	#按一定的概率随机选动作
    self.Q=np.zeros((obs_n,act_n)) #Q表格
    
  # 根据输入观察值,采样输出的动作值,带探索
	def sample(self, obs):
  	  if np.random.uniform(0, 1) < (1.0 - self.epsilon): #根据table的Q值选动作
    	    action = self.predict(obs)
  	  else:
  	      action = np.random.choice(self.act_n) #有一定概率随机探索选取一个动作
 	   return action

	# 根据输入观察值,预测输出的动作值
	def predict(self, obs):
 	   Q_list = self.Q[obs, :]
  	 maxQ = np.max(Q_list)
 	   action_list = np.where(Q_list == maxQ)[0]  # maxQ可能对应多个action ,所以随机选择一个
  	 action = np.random.choice(action_list)
   	 return action
  • Sarsa Agent ②更新Q表格
# 学习方法,也就是更新Q-table的方法
def learn(self, obs, action, reward, next_obs, next_action, done):
    """ on-policy
        obs: 交互前的obs, s_t
        action: 本次交互选择的action, a_t
        reward: 本次动作获得的奖励r
        next_obs: 本次交互后的obs, s_t+1
        next_action: 根据当前Q表格, 针对next_obs会选择的动作, a_t+1
        done: episode是否结束
    """
    predict_Q = self.Q[obs, action]
    if done:
        target_Q = reward # 没有下一个状态了
    else:
        target_Q = reward + self.gamma * self.Q[next_obs, next_action] # Sarsa
    self.Q[obs, action] += self.lr * (target_Q - predict_Q) # 修正q

请添加图片描述

公式里的α就是学习率learning_rate,代码也是完全按照公式写的,另外,如果一个回合结束了,就没有下一个状态了,这一步代码要记得加上,否则可能无法收敛

  • main函数写法
import gym
from gridworld import CliffwalkingWapper
from agent import SarsaAgent
def main():
	env = gym.make("CliffWalking-v0") # 0 up, 1 right, 2 down, 3 left
	env = CliffwalkingWapper(env)
	agent = SarsaAgent(
	obs_n=env.observation_space.n,
	act_n=env.action_space.n,
	learning_rate=0.1,
	gamma=0.9,
	e_greed=0.1)
  
	is render = False
	for episode in range(500):
		ep_reward, ep_steps = run_episode(env, agent, is_render)
		print('Episode %s: steps = %s , reward
	%.1f' %(episode, ep_steps, ep_reward))
	# 每隔 20个 episode 渲染一下看看效果
	if episode % 20 == 0:
		is_render = True
	else:
		is_render = False
	# 训练结束,查看算法效果
	test_episode (env, agent)

def test_episode(env, agent):
	total_reward = 0
	obs = env.reset()
	while True:
		action = agent.predict(obs) # greedy
		next_obs, reward, done,= env.step(action)
		total_ reward + reward
		obs = next_ obs
		time. sleep(0.5)
		env. render()
		if done:
			print ('test reward = %.1f' %(total reward))
			break

Sarsa 会远离悬崖走,比较小心

Off-Policy

实际上有两种不同的策略,期望得到最佳的目标策略和大胆探索的行为策略

请添加图片描述

请添加图片描述

On-Policy

on-policy优化的实际上是它实际执行的策略,用下一步一定会执行的动作action来优化Q表格,所以on-policy其实只存在一种策略 ,用同一种策略去选取和优化

Q-learning vs Sarsa

请添加图片描述

Q-learning解析

Q-learning也是采用Q表格的方式存储Q值(状态动作价值),决策部分与Sarsa是一样的,采用ε-greedy方式增加探索。

Q-learning跟Sarsa不一样的地方是更新Q表格的方式。

Sarsa是on-policy的更新方式,先做出动作再更新。

Q-learning是off-policy的更新方式,更新learn()时无需获取下一步实际做出的动作next_action,并假设下一步动作是取最大Q值的动作。

Q-learning 默认使用的是下一个状态的Q最大动作

Q-learning Agent①根据Q表格选懂动作

class QLearningAgent(object):
	def __init__(self, obs_n, act_n, learning_ rate=0.01, gamma=0.9, e_greed=0.1):
	self.act_n = act_n	# 动作维度,有几个动作可选
	self.lr = learning_rate # 学习率
	self.gamma = gamma # reward的衰减率
	self.epsilon = e_greed # 按一定的概率选动作
	self.Q = np.zeros((obs_n, act_n))
  
  # 根据输入的观察值,采样输出的动作值,带探索
	def sample(self, obs):
		if np. random. uniform(0, 1) < (1.0 - self.epsilon): # 根据table 的Q值选动作
			action = self.predict (obs)
		else:
			action = np.random.choice(self.act_n) # 有一定概率随机探索选取一个动作
		return action
	
  # 根据输入观察值,预测输出的动作值
	def predict(self,	obs):
		Q_list = self.Q[obs, :]
		maxQ=np.max(Q_list)
		action_list = np.where(Q_list - maxQ)[0] # maxQ可能对应多个action
		action = np.random.choice(action_list)
		return action                  

Q-learning Agent ②更新Q表格

 # 学习方法,也就是更新Q-table的方法
    def learn(self, obs, action, reward, next_obs, done):
        """ off-policy
            obs: 交互前的obs, s_t
            action: 本次交互选择的action, a_t
            reward: 本次动作获得的奖励r
            next_obs: 本次交互后的obs, s_t+1
            done: episode是否结束
        """
        predict_Q = self.Q[obs, action]
        if done:
            target_Q = reward # 没有下一个状态了
        else:
            target_Q = reward + self.gamma * np.max(self.Q[next_obs, :]) # Q-learning
        self.Q[obs, action] += self.lr * (target_Q - predict_Q) # 修正q

运行展示

import gym
from gridworld import CliffwalkingWapper
from agent import QLearningAgent
def main():
	env = gym.make("CliffWalking-v0") # 0 up, 1 right, 2 down, 3 left
	env = CliffwalkingWapper(env)
	agent = QLearningAgent(
	obs_n=env.observation_space.n,
	act_n=env.action_space.n,
	learning_rate=0.1,
	gamma=0.9,
	e_greed=0.1)
  
	is render = False
	for episode in range(500):
		ep_reward, ep_steps = run_episode(env, agent, is_render)
		print('Episode %s: steps = %s , reward
	%.1f' %(episode, ep_steps, ep_reward))
	# 每隔 20个 episode 渲染一下看看效果
	if episode % 20 == 0:
		is_render = True
	else:
		is_render = False
	# 训练结束,查看算法效果
	test_episode (env, agent)

def test_episode(env, agent):
	total_reward = 0
	obs = env.reset()
	while True:
		action = agent.predict(obs) # greedy
		next_obs, reward, done,= env.step(action)
		total_ reward + reward
		obs = next_ obs
		time. sleep(0.5)
		env. render()
		if done:
			print ('test reward = %.1f' %(total reward))
			break

代码lesson2/q_learning

请添加图片描述

总结

请添加图片描述

课后作业

  • 使用Q-learning和Sarsa解决16宫格寻迹问题
    • 可以使用FrozenLakeWapper美化render界面
    • 注意is_slippery参数

[界面链接](#https://github.com/openai/gym/wiki/FrozenLake-v0
from gridworld import FrozenLake Wapper
env = gym.make(“FrozenLake-vO”, is_ slippery=False) # 0 left, 1 down, 2 right, 3 up
env = FrozenLake Wapper(env))

请添加图片描述

from gridworld import FrozenLakeWapper
env = gym.make("FrozenLake-v0",is_slippery=False)#0 left,1 down,2 right,3 up
env = FrozenLakeWapper(env)

gridworld.py 使用指南

# 环境1:FrozenLake,可以配置冰面是否是滑的
env = gym.make ("FrozenLake-v0", is_slippery=False) # 0 left, I down, 2 right, 3 up
env = FRozenLakeWapper(env)

# 环境2: CLiffWalking,悬崖环境
env = gym.make ("Cliffwalking-v0") # 0 up, 1 right, 2 down, 3 left
en = CliffwalkingWapper(env)

# 环境3:自定义格子世界,可以配置地固,S为出发点Start,F为平地Floor, H为洞Hole,G为出口目标Goal
gridmap = [
		'SFFF'
		'FHFF'
		'FFFF'
		'HFGF']
env = Gridworld(gridmap)

1.资料引用

原文链接:https://blog.csdn.net/zbp_12138/article/details/106837306

2.视频学习

原文链接:https://www.bilibili.com/video/BV1yv411i7xd?p=4&vd_source=4aa97afe0ec7d8f686f99d90d7c6f76e

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

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

相关文章

零售业迎来全新发展,这个技术少不了

零售业在创新方面比较频繁&#xff0c;创新是推动零售业发展的动力&#xff0c;这可以让零售业具有了外在的生命力和内在的动力。创新要求零售商从内部建立机制&#xff0c;以创新的心态经营管理。 现在&#xff0c;零售商陷入泥潭。其中一个原因是&#xff0c;他们失去了创新能…

Docker详解(一)

文章目录参考资料一、Docker基本概念二、Docker安装1. 卸载旧版本2. 使用 Docker 仓库进行安装设置仓库安装 Docker Engine-Community卸载 Docker安装Docker CE 环境三、Docker命令1. Docker容器运行流程2. 镜像命令docker images 查看所有本地主机上的镜像docker search 搜索镜…

后端自学两个小时前端,究竟能做出什么东西?

又来给大家更文了&#xff0c;今天是微服务网关实战的第六篇。 今天的内容比较偏前端一点&#xff0c;主要是给大家换换口味&#xff0c;毕竟学一个东西学久了就想学点新东西休息一点&#xff0c;俗称换换脑子。 其实早就想学学前端看了&#xff0c;不过碍于工作繁忙&#xf…

冒泡排序和数据结构和算法可视化网站(及其一点小优化)

目录 一、冒泡排序的原理 二、动图演示原理 三、代码实现&#xff1a; 四、优化后的冒泡排序 五、算法演示网站 一、冒泡排序的原理 冒泡排序就是两两交换&#xff0c;第一趟排序可以得到最大值&#xff0c;那么第二趟排序就不用再比较最大值了&#xff0c;同样是两两交换…

电商后台管理系统(基于SSM + Vue + Restful + jquery + axios)

1.项目架构 2.config配置 JdbcConfig public class JdbcConfig {Value("${jdbc.driver}")private String driver;Value("${jdbc.url}")private String url;Value("${jdbc.username}")private String username;Value("${jdbc.password}&qu…

Spring——五大类注解和方法注解详解

文章目录1.Spring的创建2.Spring对象的存储3.将 Bean 对象通过配置文件注册到 Spring 当中4.从 Spring 中将 bean 对象读取出来并使用4.1 先得到 Spring 上下文对象4.2 再通过上下文对象提供的方法获取需要使用的baen对象4.3 使用bean对象[可选步骤]4.4 获取 getBean 的更多方法…

易基因技术推介|m1A RNA甲基化测序(MeRIP-seq/m1A-seq)

N1-甲基腺苷&#xff08;N1-methyladenosine&#xff0c;m1A&#xff09;是一种普遍存在于真核生物tRNA、rRNA和mRNA且可逆的转录后RNA修饰。基于高通量测序技术最新研究揭示m1A RNA修饰在基因调控和生物过程中的关键作用&#xff1a;对RNA稳定性和翻译起始等过程有着重要调节作…

Mybatis+Spring+SpringMVC及SSM整合

文章目录一、Mybatis&#xff08;一&#xff09;Mybatis简介1、Mybatis历史2、Mybatis特性3、Mybatis下载4、和其它持久化层技术对比&#xff08;二&#xff09;搭建Mybatis1、MySQL不同版本的注意事项2、创建Maven工程1、引入依赖3、创建MyBatis的核心配置文件3.1、核心配置文…

WRF进阶:WRF中Noah-MP地面方案中雪反照率的计算

Noah-MP简介 Noah-MP是以Noah-LSM为基础发展的一种多层模型&#xff0c;相对于Noah-LSM&#xff0c;它对于下垫面的冠层、土壤、积雪有了更多的拓展。 Noah-MP允许3层雪&#xff0c;对于雪的模拟有了极大的提升&#xff0c;同时&#xff0c;Polar-WRF中对Noah LSM和Noah MP中海…

IIS 部署HTTP 转 HTTPS完整版

1,准备SSL证书&#xff0c;阿里云有1年免费证书 免费证书有 20个&#xff0c;每年用一个就行 审核通过后下载 下载文件包含证书文件和密码 2.安装重定向模块 如果IIS上默认有安装Web平台安装程序&#xff0c;我们可以使用平台自动安装URL Rewrite重写工具&#xff0c;也可以…

Tomcat日志分割

使用cronolog日志切分工具 RPM包下载方法&#xff1a;在 rpmfind.net 上搜索cronolog选择对应RPM包复制下载链接即可 下载安装 cronolog yum install https://rpmfind.net/linux/epel/7/x86_64/Packages/c/cronolog-1.6.2-14.el7.x86_64.rpm -y验证是否安装成功及安装位置 使…

《安卓逆向》Magisk的编译踩坑记录-安装方法-分享魔改后的Magisk过root检测方法

为什么: 1.体验下如何编译面具源码 2.魔改面具-绕过更深的root检测 1.ubuntu 虚拟机下载地址 http://mirrors.aliyun.com/ubuntu-releases/20.04/github:https://github.com/topjohnwu/Magisk 编译根据这篇文章做好前缀下代码工作 https://zhuanlan.zhihu.com/p/385255256编…

图片1920x1080分辨率怎么调 ?图片如何修改分辨率?

图片是我们日常生活中经常需要使用到的东西&#xff0c;但是在使用图片时我们会遇到需要调图片分辨率的情况&#xff0c;有很多小伙伴对于图片分辨率这个概念并不了解&#xff0c;今天就来为大家具体介绍一下图片1920x1080怎么调以及怎么给图片修改分辨率&#xff0c;下面一起来…

美食杰项目 -- 首页(一)

目录前言&#xff1a;具体实现思路&#xff1a;步骤&#xff1a;1. 展示美食杰项目首页效果2. 引入 element-ui3. 头部代码4. 首页内容总代码5. 轮播图代码6. 已发布菜品内容代码7. 加载图片页面代码总结&#xff1a;前言&#xff1a; 本文给大家讲解&#xff0c;美食杰项目中…

Windows右键菜单美化(适用版本:Win7-Win11) 奇怪的美化教程 #1

在我的上篇文章中&#xff0c;只有 0% 的人点了赞 咋一人没有啊&#xff01; 所以如果觉得做的还行的话可以给我点个赞、收个藏&#xff0c;这对我真的很重要&#xff01;QWQ 祖传前言 众所周知&#xff0c; Windows11 整了个新的右键菜单 (而原来的右键菜单变成了 显示更多…

基于微信小程序的桥牌计分系统设计与实现-计算机毕业设计源码+LW文档

小程序开发说明 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Mave…

m基于MATLAB的FM调制收音机仿真实现

目录 1.算法概述 2.仿真效果预览 3.核心MATLAB代码预览 4.完整MATLAB程序 1.算法概述 那么FM调制端的基本原理图如下所示&#xff1a; FM解调 FM解调的基本原理框图为&#xff1a; 在不考虑频偏的情况下&#xff0c;FM解调运算就相当于FM调制的逆运算&#xff0c;任务的第…

二叉树的性质的结点数与高度的计算题

二叉树是一种特殊的树形结构&#xff0c;每个结点最多只有两棵子树&#xff0c;即度最大为2&#xff0c;且二叉树左右子树不能颠倒。 主要常见分类有&#xff1a; 满二叉树&#xff1a; 除了叶子结点外&#xff0c;每个结点的度数都是2&#xff0c;若高度为h&#xff0c;则一…

Redis的5大数据类型

Redis的5大数据类型 这里说的数据类型是value的数据类型&#xff0c;key的类型都是字符串。 5种数据类型&#xff1a; redis字符串&#xff08;String&#xff09;redis列表&#xff08;List&#xff09;redis集合&#xff08;Set&#xff09;redis哈希表&#xff08;Hash&a…

PMP®|对如何做好项目管理的几点建议

PMP|对如何做好项目管理的几点建议 来自一位从事工程项目管理多年&#xff0c;也接触过软件开发项目的资深人士针对如何做好项目管理泛泛提些建议。 1、明确项目组自身定位。不同公司对项目管理的理解不同&#xff0c;项目制的执行方式不同&#xff0c;项目组在各公司的地位…