news 2026/7/9 21:29:30

深度强化学习:表格Q-network

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深度强化学习:表格Q-network

一、价值迭代的问题

在FrozenLake环境中,交叉熵方法改为价值迭代后,模型收敛速度加快。价值迭代时对所有状态进行循环,并对每个状态用Bellman方程更新价值。该过程中,对于同一方法中Q值(动作价值)变化似乎相同,但要估算并存储每个状态和动作的价值,所以这个过程的问题如下:

1、环境状态的数量及迭代能力

(1)状态和动作迭代加耗CPU;

(2)真正优质的状态转移动态的估计所需要的样本数量。假设一个环境,有十亿个状态(约为31600*31600的FrozenLake),每个状态计算近似价值,需要在状态之间均匀分布数千亿转移

(3)枚举所有可能状态,但其中99.9%的状态为无用状态。例如Atari平台的状态空间,屏幕分辨率210*160像素,每个像素128种颜色,每一帧210*160=33600个像素,总状态数128^33600,

比10^70802略多。如果枚举Atari的所有可能状态,那么即使是超级计算机也要数十亿亿年。99.9%的时间在做无用功,因为大多数组合即使在很长的游戏过程中都不会出现,因此永远不会有这些状态的样本。

2、限制为离散动作空间

Q(s,a)和V(s)的近似指都假设动作是互斥的离散集,对于动作可以是连续变量(例如方向盘的角度、执行器上的力或者加热器的温度)的连续控制问题并不一定正确。

二、表格Q-learning

不需要遍历状态空间中的所有状态,只关心从环境中获得的状态更新状态价值。对于有明确状态价值映射的情况,具体步骤如下:

(1)从空表开始,将状态映射到动作价值。

(2)通过与环境交互,获得(s,a,r,)(状态、动作、奖励和新状态)。在此步骤中,要确定所需采取的动作,并且没有单一的正确方法来做出此决定,需要应用探索与利用的方法。

(3)使用Bellman近似更新Q(s,a)值:

(4)从步骤2开始重复。

终止条件是更新的某个阈值,或可以执行测试片段以估计策略的预期奖励。

更新Q值,采用学习率平衡新、旧Q值:

三、代码与分析

1、代码

Agent类包含四个方法:

  • sample_env在动作空间中随机选取动作
  • best_value_and_action接收环境中的状态,并通过表格查找在当前状态下可以获得的最大价值和最大价值对应的动作
  • value_update函数进行价值更新
  • play_episode使用提供的测试表运行一个片段,每个动作由Q值决定
#!/usr/bin/env python3 import gym import collections from tensorboardX import SummaryWriter ENV_NAME = "FrozenLake-v0" GAMMA = 0.9 ALPHA = 0.2 TEST_EPISODES = 20 class Agent: def __init__(self): """ 初始化环境、状态、价值表 """ self.env = gym.make(ENV_NAME) self.state = self.env.reset() self.values = collections.defaultdict(float) def sample_env(self): """ 在动作空间中随机选取动作 :return:旧状态,所采取动作、所获得奖励、新状态组成的元组 """ action = self.env.action_space.sample() old_state = self.state new_state, reward, is_done, _ = self.env.step(action) self.state = self.env.reset() if is_done else new_state return old_state, action, reward, new_state def best_value_and_action(self, state): """ 接收环境中的状态,并通过表格查找在当前状态下可以获得 最大价值和最大价值对应的动作 :param state: 环境中状态 :return: 表格查找,获取当前状态下可以获得的 最大价值和最大价值对应的动作 """ best_value, best_action = None, None for action in range(self.env.action_space.n): action_value = self.values[(state, action)] if best_value is None or best_value < action_value: best_value = action_value best_action = action return best_value, best_action def value_update(self, s, a, r, next_s): """ 计算状态s和动作a的价值的新近似值 :param s: 当前状态 :param a: 当前动作 :param r: 当前奖励 :param next_s: 下一个状态 :return: 前进一步,更新价值表 """ best_v, _ = self.best_value_and_action(next_s) new_v = r + GAMMA * best_v # Bellman近似 old_v = self.values[(s, a)] self.values[(s, a)] = old_v * (1-ALPHA) + new_v * ALPHA #使用学习率的值混合平均 def play_episode(self, env): """ 使用提供的测试表运行一个片段,每个动作由Q值决定 该方法用于评估当前策略,以检查学习进度 注意此方法不会改变价值表,只是用它查找要采取的最佳动作 :param env:测试环境 :return:总奖励 """ total_reward = 0.0 state = env.reset() while True: _, action = self.best_value_and_action(state) new_state, reward, is_done, _ = env.step(action) total_reward += reward if is_done: break state = new_state return total_reward if __name__ == "__main__": test_env = gym.make(ENV_NAME) agent = Agent() writer = SummaryWriter(comment="-q-learning") iter_no = 0 best_reward = 0.0 while True: iter_no += 1 s, a, r, next_s = agent.sample_env() agent.value_update(s, a, r, next_s) reward = 0.0 for _ in range(TEST_EPISODES): reward += agent.play_episode(test_env) reward /= TEST_EPISODES writer.add_scalar("reward", reward, iter_no) if reward > best_reward: print("Best reward updated %.3f -> %.3f" % ( best_reward, 9)) best_reward = reward if reward > 0.80: print("Solved in %d iterations!" % iter_no) break writer.close()

2、结果显示


四、总结

与价值迭代方法相比,此版本迭代次数更多,原因是不再使用测试中获得的经验数据,在测试过程中不触及Q值表更新。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/9 8:20:47

Arbess从基础到实践(12) - 集成GitLab实现C++项目自动化部署

Arbess 是一款开源免费的 CICD 工具&#xff0c;支持免费私有化部署&#xff0c;一键部署零配置。本文将详细介绍如何安装Arbess、GitLab&#xff0c;创建流水线实现 C 项目自动化构建并主机部署。 1、GitLab 安装与配置 本章节将介绍如何使用CentOS9搭建Gitlab服务器&#x…

作者头像 李华
网站建设 2026/7/10 2:14:58

Flutter状态管理终极指南:5种主流方案深度对比

一、为什么90%的Flutter开发者都搞不定状态管理&#xff1f; 在开发Flutter应用时&#xff0c;你是否遇到过这些问题&#xff1a; &#x1f92f; 状态分散&#xff1a;数据在多个页面间传递像"击鼓传花"&#x1f41e; 性能瓶颈&#xff1a;一个状态更新导致整个页面…

作者头像 李华
网站建设 2026/7/8 3:03:06

芸光讲师:AI 搜索 GEO 增长领路人,抢先机系统核心创始人

当企业还在为 “GEO 优化没流量、内容不被 AI 推荐、投入回报不可控” 焦虑时&#xff0c;芸光以 13 年企业服务沉淀 AI 搜索全周期实战经验&#xff0c;成为打破行业痛点的核心领路人。他不仅是南京芯芸信息科技创始人、抢先机 AI 系统核心研发者&#xff0c;更是国内 AI 搜索…

作者头像 李华
网站建设 2026/7/9 13:39:39

20个大厂js面试题

以下是20个涵盖不同难度和知识点的JavaScript大厂面试题&#xff0c;包含核心概念、异步、框架、性能等方向&#xff1a; 一、基础与核心概念 解释JavaScript中的事件循环&#xff08;Event Loop&#xff09;机制&#xff0c;并说明宏任务与微任务的区别。什么是闭包&#xff…

作者头像 李华
网站建设 2026/7/7 20:03:41

水闸安全自动化监测系统主要应用场景

水闸安全自动化监测系统是集现代传感技术、数据通信技术、计算机技术和信息处理技术于一体的综合性安全监测平台。该系统通过在水闸关键部位布设各类传感器&#xff0c;实现对水闸运行状态参数的实时、连续、自动采集&#xff0c;并通过数据传输网络将监测数据发送至中心数据库…

作者头像 李华
网站建设 2026/7/10 5:20:08

transformer模型详解进阶篇:Qwen3-32B注意力机制剖析

Qwen3-32B注意力机制深度解析&#xff1a;从长上下文到高效推理的工程实践 在大模型落地进入深水区的今天&#xff0c;一个核心问题愈发凸显&#xff1a;如何在有限算力下实现接近顶级闭源模型的语言理解与生成能力&#xff1f;尤其当企业面对真实业务场景——比如分析整本法律…

作者头像 李华