从PyTorch官方的一篇教程说开去(4 - Q-table来源及解决问题实例)

偷个懒,代码来自比很久之前看的书,当时还在用gym,我做了微调以升级到gymnasium当前版本,确保可以正常演示。如果小伙伴或者原作者看到了麻烦提一下,我好备注一下出处。

您的进步和反馈是我最大的动力,小伙伴来个三连呗!共勉。

Bug Brain 可能是最古早的神经网络游戏

不知道大家和人工智能的缘分起点在哪里呢?

犹记得当年的控制与系统课,教授带着口音,讲的兴趣盎然,我却听得云里雾里,主要是不知道传递函数这玩意除了算弹簧摆还能干点啥(还没学模电)。恰好隔壁寝室的兄弟好钻研,顺手推荐了这个小游戏给我,于是在略显简陋的面板上摆弄“神经元”做一些小任务,玩得津津有味。当时神经网络这些也是前沿,但实在不算是什么显学,也就一笑而过。如今故友多年未见,虽彼此过的也都还好,总有一些瞬间会让人颇为想念。这里也分享给大家 - 

Bug Brain Home Page

深度学习,乃至目前的LLM,核心都是(矩阵化了的)神经元。这样一个一个毫不出奇的彼此连结着的存着简单数字的小格子,却能一起完成很多本来需要人工操作的项目,这本身就是一件颇为神异的事情!

本例的情景是,当机器面对着下面这个对人类来说颇为简单的小游戏,它那脑子里都有点啥呢?

答案是,一堆格子(本例是16行4列),如下图 - 

看,这就是AI的大脑!

呃,怎么把图形和格子对应起来呢?我们先把图形转换成一个表格 - 

每个状态(方块)允许四种可能的操作:左移、右移、上移、下移。"0"代表不可能的移动(比如你在左上角,你就不可能向左移动或者向上移动!)现在有4x16=64个格子,当我们设计某种算法,让格子里面的分数,代表对应格子对应走法的最大奖励,我们就获得了这样一个Q-table。通过训练,我们可以确保整个Q-table足够好的匹配当前地图。

话不多说,上代码(详细注释) - 以下是创建并训练合适的Q-table:

import numpy as np
import gymnasium as gym
import randomenv = gym.make("FrozenLake-v1")action_size = env.action_space.n
state_size = env.observation_space.nqtable = np.zeros((state_size, action_size))total_episodes = 20000       # Total episodes
learning_rate = 0.7          # Learning rate
max_steps = 99               # Max steps per episode
gamma = 0.95                 # Discounting rateepsilon = 1.0                 # Exploration rate
max_epsilon = 1.0             # Exploration probability at start
min_epsilon = 0.01            # Minimum exploration probability 
decay_rate = 0.005            # Exponential decay rate for exploration probrewards = []for episode in range(total_episodes):# Reset the environmentstate = env.reset()[0]step = 0done = Falsetotal_rewards = 0for step in range(max_steps):# 3. Choose an action a in the current world state (s)exp_exp_tradeoff = random.uniform(0, 1)if exp_exp_tradeoff > epsilon:action = np.argmax(qtable[state,:])else:action = env.action_space.sample()            new_state, reward, done, info , _ = env.step(action)qtable[state, action] = qtable[state, action] + learning_rate * (reward + gamma * np.max(qtable[new_state, :]) - qtable[state, action])total_rewards += reward       state = new_stateif done == True: breakepsilon = min_epsilon + (max_epsilon - min_epsilon)*np.exp(-decay_rate*episode) rewards.append(total_rewards)print ("Score over time: " +  str(sum(rewards)/total_episodes))
print(qtable)

接下来是用训练好的Q-table来指导程序自行玩通关游戏 - 

env = gym.make("FrozenLake-v1",render_mode="human")
num_eval_episodes=10for episode in range(num_eval_episodes):state = env.reset()[0]step = 0done = Falseprint("****************************************************")print("EPISODE ", episode)for step in range(max_steps):action = np.argmax(qtable[state,:])new_state, reward, done, info, _ = env.step(action)if done:env.render()if new_state == 15:print("We reached our Goal 🏆")else:print("We fell into a hole ☠️")print("Number of steps", step)breakstate = new_state
env.close()

因为脑容量很小,所以训练只需几秒完成,效果还不错,2000次的训练可以确保60%以上的通关率,20000次的训练就超过80% 。小伙伴可以自行尝试哈。

代码还有值得提高的空间 - 

 - 直接render,整个训练过程过于冗长。理想的做法是训练过程不看,演示过程才看;

 - 对于关心的胜率等等问题需要直接提供统计数字;

 - 如果需要改成其他游戏,因为env不同,可能会报错,应输出足够的调试信息;

太晚了,这些比较琐碎也比较重要的小事情,我们下一篇来做哈。

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

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

相关文章

外贸客户类型,到底怎么区分?

更多外贸干货及开发客户的方法,尽在微信【千千外贸干货】 在问外贸主要客户是谁?是不是觉得得一个个联系国外的商店啊?别急,今天就让我这个有12年外贸经验的老司机来给你们深度解析一下,外贸最主流的5大客户类型&#…

语音识别 语音识别项目相关笔记内容

语音识别 语音识别项目相关笔记内容 语音识别应用范畴语音识别框架语音基本操作使用scipy.io.wavfile读取wav音频文件获取采样率、长度、通道数使用numpy读取pcm格式音频文件读取wav音频文件,并绘制图像读取双声道的wav音频文件,分别绘制不同声道的波形图读取一个采样率为16k…

【Docker】Docker Desktop - WSL update failed

问题描述 Windows上安装完成docker desktop之后,第一次启动失败,提示:WSL update failed 解决方案 打开Windows PowerShell 手动执行: wsl --set-default-version 2 wsl --update

使用 vue-element-plus-admin 框架遇到的问题记录

项目打包遇到的问题: 打包语句:pnpm run build:pro 报错信息: Error: [vite]: Rollup failed to resolve import "E:/workplace_gitee/xxx/node_modules/.pnpm/element-plus2.5.5_vue3.4.15/node_modules/element-plus/es/components…

Matlab-FPGA 小数转换为定点二进制小数脚本和转coe文件格式脚本

Matlab-FPGA 小数转换为定点二进制小数脚本: % 更新于2023年6月17日,修改旋转因子文件,不修改fpga %首先明确我们的二维FFT的数组维数,此为1024*8的二维矩阵,1024行,8列 column 1024; row 8; nk[]; Ncolumn*row; fo…

【精品资料】数据安全治理解决方案(27页PPT)

引言:数据安全治理解决方案是一个综合性的体系,旨在通过策略、技术、流程和人力的有机结合,全面提升组织的数据安全防护能力,保障数据资产的安全与合规。 方案介绍:数据安全治理解决方案是组织为确保其数据资产的安全性…

Spark内核的设计原理

导读: 本期是DataFun深入浅出Apache Spark第一期的分享,主讲老师耿嘉安开场介绍了自己的从业经历,当前就职的数新网络与Spark相关的两款产品赛博数智引擎CyberEngine和赛博数据智能平台CyberData。 本次分享题目为《Spark内核的设计原理》&…

智能化一体闸门:助力行业发展

随着科技的飞速发展,智能化技术已经渗透到各个行业和领域,其中水利行业也不例外。智能化一体闸门以其高效、智能、便捷的特点,正助力着行业发展。 一、智能化一体闸门的定义与特点 智能化一体闸门,是集成了先进传感技术、自动控制…

Transformer之Swin-Transformer结构解读

写在最前面之如何只用nn.Linear实现nn.Conv2d的功能 很多人说,Swin-Transformer就是另一种Convolution,但是解释得真就是一坨shit,这里我郑重解释一下,这是为什么? 首先,Convolution是什么? Co…

java网络编程TCP和UDP协议

一、TCP 1、服务器端 package udpTest;import javax.management.MBeanRegistrationException; import java.io.*; import java.net.ServerSocket; import java.net.Socket;public class TCPService {public static void main(String[] args) {try {byte[] bufnew byte[512];Se…

什么是离线语音识别芯片?与在线语音识别的区别

离线语音识别芯片是一种不需要联网和其他外部设备支持,‌上电即可使用的语音识别系统。‌它的应用场合相对单一,‌主要适用于智能家电、‌语音遥控器、‌智能玩具等,‌以及车载声控和一部分智能家居。‌离线语音识别芯片的特点包括小词汇量、…

Python文件写入读取,文件复制以及一维,二维,多维数据存储

基础解释 在 Python 中,文件操作的模式除了 w (只写)、 a (追加写)、 r (只读)外,还有以下几种常见模式:- r :可读可写。该文件必须已存在,写操…

生成 HTTPS 证书并配置到 Nginx 的完整步骤

步骤 1: 安装 acme.sh 如果你还没有安装 acme.sh,可以通过以下命令进行安装: curl https://get.acme.sh | sh步骤 2: 生成 HTTPS 证书 使用 acme.sh 生成 forum.selectious.fun 的证书。你可以使用 standalone 模式,这意味着 acme.sh 会在…

视觉SLAM--回环检测

文章目录 创建字典相似度计算增加字典规模 回环检测的意义:可以使 后端位姿图得到一个 全局一致估计。 视觉SLAM的主流做法: 基于外观的回环检测方法,仅 根据两幅图像的相似性确定回环检测关系。这种方法,摆脱了累计误差&…

分类损失函数 (一) torch.nn.CrossEntropyLoss()

1、交叉熵 是一种用于衡量两个概率分布之间的距离或相似性的度量方法。机器学习中,交叉熵常用于损失函数,用于评估模型的预测结果和实际标签的差异。公式: y:真是标签的概率分布,y:模型预测的概率分布 …

数据库中的内、外、左、右连接

常用的数据库连表形式: 内连接 :inner join 外连接 :outer join 左外连接 :left outer join 左连接 :left join 右外连接 right outer join 右连接: right join 全连接 full join 、union 一、内连接 内…

企业私有云的部署都有哪些方式?

如今常见的企业私有云的部署方式有自建私有云、托管私有云、虚拟私有云、混合云、容器化私有云、本地数据中心部署等。如今,企业私有云的部署呈多样化趋势,以用来满足各个企业的具体需求。以下是RAK部落小编为大家汇总的企业私有云常见的部署方式&#x…

LeetCode 58.最后一个单词的长度 C++

LeetCode 58.最后一个单词的长度 C 思路🤔: 先解决当最后字符为空格的情况,如果最后字符为空格下标就往后移动,直到不为空格才停止,然后用rfind查询空格找到的就是最后一个单词的起始位置,最后相减就是单词…

flowable执行监听器动态指定审批人在退回时产生的bug

场景: 退回产生的bug,有一个结点,本身是通过执行监听器判断上一个结点的审批人来得到这个结点的审批人。之前是通过直接的获取最新task来拿到,但是在退回场景下,最新task为退回结点,故产生错误。 解决&…

C++ 正则库与HTTP请求

正则表达式的概念和语法 用于描述和匹配字符串的工具,通过特定的语法规则,灵活的定义复杂字符串匹配条件 常用语法总结 基本字符匹配 a:匹配字符aabc:匹配字符串abc 元字符(特殊含义的字符) .:匹…