强化学习笔记——4策略迭代、值迭代、TD算法

news/2025/2/1 6:59:06 标签: 算法, RL, SARSA, Q-Learning

基于策略迭代的贝尔曼方程和基于值迭代的贝尔曼方程,关系还是不太理解

首先梳理一下:
通过贝尔曼方程将强化学习转化为值迭代和策略迭代两种问题
求解上述两种贝尔曼方程有三种方法:DP(有模型),MC(无模型),TD(DP和MC结合)
这三种只是方法,既可以用于求值迭代也可以用于求解策略迭代

在这里插入图片描述
在这里插入图片描述

我总结就是:值迭代方法通过求最优价值函数,可以间接得到最优策略
策略迭代是:初始化一个随机策略,然后按照当前策略迭代价值函数
再进行策略改进,二者交替直到策略基本不发生变化。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上述就是贝尔曼最优公式的过程,求解最优的策略
详细见
V(s)求解举例

直接看值迭代伪代码:

  1. 遍历每个状态S,对每个状态S遍历所有动作A
  2. 计算Q值
  3. 对于每个状态S选择Q值最大的那个动作作为更新的策略,最大Q值作为新的V(s)

在这里插入图片描述

策略迭代:分两步policy Evalution策略评估(就是求值函数),policy improvement(策略更新)

  1. 策略评估中,如何通过求解贝尔曼方程得到值函数?
  2. 策略更新中,为什么新策略Πk+1就比原策略Πk好?
  3. 为什么策略迭代可以找到最优策略?
  4. 值迭代和策略迭代直接什么关系?

policy Evalution本身也是个迭代要循环
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Q4:策略迭代用到了值迭代的结果,是基于值收敛的。
伪代码:

  1. 进入PolicyEvaluation,目的求解收敛的VΠk。对于每个状态S迭代。
  2. 计算每个状态S下每个动作A的Q值,选择最大的作为策略Πk+1
  3. 不断重复(一个1,2步骤表示一回合 )

在这里插入图片描述

对比两个伪代码发现:值迭代的值函数计算不强调某策略(Vk),因为它遍历所有状态的所有动作策略,然后计算Q值选最优动作为策略
策略迭代:计算值函数强调是某一策略(VΠk),在某一个具体策略下求出值函数,然后再遍历所有状态的所有动作,然后计算Q值选最优动作为更新的策略

=======================================================================

上述两方法,不可避免要求Q值。
蒙特卡洛方法,通过无模型方法求解Q值
从一个s,a出发走很多个回合计算回报平局值,即为Q(s,a)
有些改进 蒙特卡洛方法不用走很多个回合计算回报平局值,只一个回合得到回报,然后作为Q

在这里插入图片描述

TD算法: 无模型求解贝尔曼方程
包含一系列:TD0,SARSA,Qlearning,DQN
的都是求解贝尔曼公式:但有的求解基于值函数刻画的贝尔曼公式,有的求解基于动作价值函数刻画的贝尔曼公式
它结合了动态规划(DP)和蒙特卡洛方法(MC)的优点
在这里插入图片描述
基于表格的TD算法总结:
在这里插入图片描述
TD算法只是相当于做策略评估,不负责policy improvement

实现SARSA和Qlearning算法
import numpy as np
from collections import defaultdict

class QLearning:
    def __init__(self, env, alpha=0.1, gamma=0.99, epsilon=0.1):
        self.env = env
        self.alpha = alpha  # 学习率
        self.gamma = gamma  # 折扣因子
        self.epsilon = epsilon  # 探索率
        
        # 初始化Q表
        self.Q = defaultdict(lambda: np.zeros(len(env.action_space))) #用于创建一个长度为 len(env.action_space) 的全零数组。
        
    def choose_action(self, state):
        if np.random.rand() < self.epsilon:
            # 随机选择动作索引
            action_idx = np.random.choice(len(self.env.action_space))
            return self.env.action_space[action_idx]  # 探索
        else:
            # 选择Q值最大的动作
            action_idx = np.argmax(self.Q[state])
            return self.env.action_space[action_idx]  # 利用
        
    def learn(self, state, action, reward, next_state, done):
        # 将状态转换为可哈希的键

        next_state_key = next_state
        current_q = self.Q[state][self.env.action_space.index(action)]
        max_next_q = np.max(self.Q[next_state_key])
        
        # Q-learning更新公式
        new_q = current_q + self.alpha * (reward + self.gamma * max_next_q - current_q)
        self.Q[state][self.env.action_space.index(action)] = new_q

class SARSA:
    def __init__(self, env, alpha=0.1, gamma=0.99, epsilon=0.1):
        self.env = env
        self.alpha = alpha  # 学习率
        self.gamma = gamma  # 折扣因子
        self.epsilon = epsilon  # 探索率
        
        # 初始化Q表
        self.Q = defaultdict(lambda: np.zeros(len(env.action_space)))
        
    def choose_action(self, state):
        
        if np.random.rand() < self.epsilon: #以概率 ϵ 随机选择动作
            # 随机选择动作索引
            action_idx = np.random.choice(len(self.env.action_space))
            return self.env.action_space[action_idx]  # 探索
        else:
            # 选择Q值最大的动作
            action_idx = np.argmax(self.Q[state])
            return self.env.action_space[action_idx]  # action_idx动作索引,返回具体动作(0, 1), (1, 0), (0, -1), (-1, 0), (0, 0)
            
    def learn(self, state, action, reward, next_state, next_action, done):
            
        next_state_key = next_state
        current_q = self.Q[state][self.env.action_space.index(action)]
        next_q = self.Q[next_state_key][self.env.action_space.index(next_action)]
         # SARSA更新公式
        new_q = current_q + self.alpha * (reward + self.gamma * next_q - current_q) #一步TD更新
        
        # 更新Q表
        self.Q[state][self.env.action_space.index(action)] = new_q

上述使用Q表每次记录下来Q值,下次(s,a)可以直接读取Q值

还有一种方法是用函数、神经网络计算Q值,输入(s,a)输出Q,然后梯度下降优化函数的参数,使得Q值计算更准确。


http://www.niftyadmin.cn/n/5839105.html

相关文章

DeepSeek 遭 DDoS 攻击背后:DDoS 攻击的 “千层套路” 与安全防御 “金钟罩”

当算力博弈升级为网络战争&#xff1a;拆解DDoS攻击背后的技术攻防战——从DeepSeek遇袭看全球网络安全新趋势 在数字化浪潮席卷全球的当下&#xff0c;网络已然成为人类社会运转的关键基础设施&#xff0c;深刻融入经济、生活、政务等各个领域。从金融交易的实时清算&#xf…

具身智能体空间感知基础!ROBOSPATIAL:评测并增强2D和3D视觉语言模型空间理解水平

作者&#xff1a;Chan Hee Song, Valts Blukis,Jonathan Tremblay, Stephen Tyree, Yu Su, Stan Birchfield 单位&#xff1a;俄亥俄州立大学&#xff0c;NVIDIA 论文标题&#xff1a;ROBOSPATIAL: Teaching Spatial Understanding to 2D and 3D Vision-Language Models for …

Web 视频播放前前后后那些事

所有这些网站实际上仍然使用video标签。但是&#xff0c;它们不只是在src属性中设置视频文件&#xff0c;而是使用功能更强大的Web API&#xff08;Media Source Extensions&#xff09;。 Media Source Extensions “Media Source Extensions”&#xff08;通常简称为“ MSE…

WPS怎么使用latex公式?

1、下载并安装mathtype https://blog.csdn.net/weixin_43135178/article/details/125143654?sharetypeblogdetail&sharerId125143654&sharereferPC&sharesourceweixin_43135178&spm1011.2480.3001.8118 2、将mathtype嵌入在WPS MathType面板嵌入器,免费工具…

玄机靶场--第二章 日志分析-apache日志分析

文章目录 第二章 日志分析-apache日志分析1、提交当天访问次数最多的IP&#xff0c;即黑客IP&#xff1a;2、黑客使用的浏览器指纹是什么&#xff0c;提交指纹的md5&#xff1a;3、查看包含index.php页面被访问的次数&#xff0c;提交次数&#xff1a;4、查看黑客IP访问了多少次…

ESP32-S3模组上跑通esp32-camera(39)

接前一篇文章:ESP32-S3模组上跑通esp32-camera(38) 一、OV5640初始化 2. 相机初始化及图像传感器配置 上一回继续对reset函数的后一段代码进行解析。为了便于理解和回顾,再次贴出reset函数源码,在components\esp32-camera\sensors\ov5640.c中,如下: static int reset…

TDengine:no taos in java.library.path

在Windows&#xff0c;IDEA SpringBoot项目连接开发环境服务器上TDengine报错&#xff1a;TDengine:no taos in java.library.path 解决方法 1、先在本地上安装一个TD的Windows客户端&#xff0c;注意安装的客户端版本一定要和服务端TD版本完全一致。客户端各个历史版本下载链接…

机器学习笔记——特征工程

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本笔记介绍机器学习中常见的特征工程方法、正则化方法和简要介绍强化学习。 文章目录 特征工程&#xff08;Fzeature Engineering&#xff09;1. 特征提取&#xff…