【深度 Q 学习-01】 Q学习概念和python实现

文章目录

  • 一、说明
  • 二、深度 Q 学习概念
  • 三、python实现
  • 四、结论

关键词:Deep Q-Networks

一、说明

在强化学习 (RL) 中,Q 学习是一种基础算法,它通过学习策略来最大化累积奖励,从而帮助智能体导航其环境。它通过更新操作值函数来实现这一点,该函数根据收到的奖励和未来的估计来估计在给定状态下采取特定操作的预期效用。

二、深度 Q 学习概念

Q-Learning是先决条件,因为 Q-Learning 的过程为工作代理创建了一个精确的矩阵,它可以“参考”该矩阵以在长期内最大化其奖励。虽然这种方法本身并没有错,但它只适用于非常小的环境,并且当环境中的状态和动作数量增加时,它很快就会失去可行性。上述问题的解决方案来自于认识到矩阵中的值仅具有相对重要性,即这些值仅相对于其他值具有重要性。因此,这种想法将我们引向了深度 Q-Learning,它使用深度神经网络来近似这些值。只要保留相对重要性,这种值的近似值就不会造成伤害。深度 Q-Learning 的基本工作步骤是将初始状态输入神经网络,并返回所有可能动作的 Q 值作为输出。Q-Learning 和深度 Q-Learning 之间的区别可以说明如下:
在这里插入图片描述
在这里插入图片描述
伪代码:
在这里插入图片描述
观察方程target = R(s,a,s’) + 中的项 \gamma max_{a’}Q_{k}(s’,a’) 是变量项。因此,在此过程中,神经网络的目标是可变的,这与其他典型的深度学习过程不同,在这些过程中目标是固定的。通过使用两个神经网络而不是一个神经网络可以解决此问题。一个神经网络用于调整网络参数,另一个神经网络用于计算目标,其架构与第一个网络相同,但参数已冻结。在主网络中进行 x 次迭代后,参数将复制到目标网络。

在这里插入图片描述

深度 Q 学习是一种强化学习算法,它使用深度神经网络来近似 Q 函数,该函数用于确定在给定状态下采取的最佳行动。Q 函数表示在特定状态下采取特定行动并遵循特定策略的预期累积奖励。在 Q 学习中,Q 函数会随着代理与环境的交互而迭代更新。深度 Q 学习用于各种应用,例如游戏、机器人技术和自动驾驶汽车。

深度 Q 学习是 Q 学习的一种变体,它使用深度神经网络来表示 Q 函数,而不是简单的值表。这使得算法能够处理具有大量状态和动作的环境,以及从图像或传感器数据等高维输入中学习。

实施深度 Q 学习的关键挑战之一是 Q 函数通常是非线性的,并且可能具有许多局部最小值。这会使神经网络难以收敛到正确的 Q 函数。为了解决这个问题,已经提出了几种技术,例如经验回放和目标网络。

经验回放是一种技术,其中代理将其经验的子集(状态、动作、奖励、下一个状态)存储在内存缓冲区中,并从该缓冲区中采样以更新 Q 函数。这有助于消除数据的相关性并使学习过程更加稳定。另一方面,目标网络用于稳定 Q 函数更新。在这种技术中,使用单独的网络来计算目标 Q 值,然后将其用于更新 Q 函数网络。

深度 Q 学习已应用于各种问题,包括游戏、机器人技术和自动驾驶汽车。例如,它已用于训练能够玩 Atari 和围棋等游戏的代理,以及控制机器人执行抓取和导航等任务。

三、python实现

强化学习是一种机器学习范例,其中学习算法不是根据预设数据进行训练,而是基于反馈系统。这些算法被誉为机器学习的未来,因为它们消除了收集和清理数据的成本。

在本文中,我们将演示如何实现称为 Q-Learning 技术的基本强化学习算法。在此演示中,我们尝试使用 Q-Learning 技术教会机器人到达目的地。

  • 第1步:导入所需的库
import numpy as np 
import pylab as pl 
import networkx as nx 
  • 第 2 步:定义和可视化图表
edges = [(0, 1), (1, 5), (5, 6), (5, 4), (1, 2),  (1, 3), (9, 10), (2, 4), (0, 6), (6, 7), (8, 9), (7, 8), (1, 7), (3, 9)] goal = 10
G = nx.Graph() 
G.add_edges_from(edges) 
pos = nx.spring_layout(G) 
nx.draw_networkx_nodes(G, pos) 
nx.draw_networkx_edges(G, pos) 
nx.draw_networkx_labels(G, pos) 
pl.show() 

在这里插入图片描述
注意:上图在代码复制时可能看起来不一样,因为 python 中的 networkx 库根据给定的边生成随机图。

  • 第 3 步:定义机器人的奖励系统
MATRIX_SIZE = 11
M = np.matrix(np.ones(shape =(MATRIX_SIZE, MATRIX_SIZE))) 
M *= -1for point in edges: print(point) if point[1] == goal: M[point] = 100else: M[point] = 0if point[0] == goal: M[point[::-1]] = 100else: M[point[::-1]]= 0# reverse of point M[goal, goal]= 100
print(M) 
# add goal point round trip 

在这里插入图片描述

  • 步骤 4:定义训练中使用的一些实用函数
Q = np.matrix(np.zeros([MATRIX_SIZE, MATRIX_SIZE])) gamma = 0.75
# learning parameter 
initial_state = 1# Determines the available actions for a given state 
def available_actions(state): current_state_row = M[state, ] available_action = np.where(current_state_row >= 0)[1] return available_action available_action = available_actions(initial_state) # Chooses one of the available actions at random 
def sample_next_action(available_actions_range): next_action = int(np.random.choice(available_action, 1)) return next_action action = sample_next_action(available_action) def update(current_state, action, gamma): max_index = np.where(Q[action, ] == np.max(Q[action, ]))[1] 
if max_index.shape[0] > 1: max_index = int(np.random.choice(max_index, size = 1)) 
else: max_index = int(max_index) 
max_value = Q[action, max_index] 
Q[current_state, action] = M[current_state, action] + gamma * max_value 
if (np.max(Q) > 0): return(np.sum(Q / np.max(Q)*100)) 
else: return (0) 
# Updates the Q-Matrix according to the path chosen update(initial_state, action, gamma) 
  • 第 5 步:使用 Q 矩阵训练和评估机器人
scores = [] 
for i in range(1000): current_state = np.random.randint(0, int(Q.shape[0])) available_action = available_actions(current_state) action = sample_next_action(available_action) score = update(current_state, action, gamma) scores.append(score) # print("Trained Q matrix:") 
# print(Q / np.max(Q)*100) 
# You can uncomment the above two lines to view the trained Q matrix # Testing 
current_state = 0
steps = [current_state] while current_state != 10: next_step_index = np.where(Q[current_state, ] == np.max(Q[current_state, ]))[1] if next_step_index.shape[0] > 1: next_step_index = int(np.random.choice(next_step_index, size = 1)) else: next_step_index = int(next_step_index) steps.append(next_step_index) current_state = next_step_index print("Most efficient path:") 
print(steps) pl.plot(scores) 
pl.xlabel('No of iterations') 
pl.ylabel('Reward gained') 
pl.show() 

在这里插入图片描述
在这里插入图片描述
现在,让我们将该机器人带到更现实的环境中。让我们想象一下,机器人是一名侦探,正在试图找出一个大型贩毒团伙的位置。他自然得出结论,毒贩不会在已知警方经常出没的地点出售其产品,而且出售地点靠近贩毒地点。此外,卖家会在销售产品的地方留下痕迹,这可以帮助侦探找到所需的位置。我们希望训练我们的机器人使用这些环境线索找到位置。

  • 第 6 步:使用环境线索定义和可视化新图
# Defining the locations of the police and the drug traces 
police = [2, 4, 5] 
drug_traces = [3, 8, 9] G = nx.Graph() 
G.add_edges_from(edges) 
mapping = {0:'0 - Detective', 1:'1', 2:'2 - Police', 3:'3 - Drug traces', 4:'4 - Police', 5:'5 - Police', 6:'6', 7:'7', 8:'Drug traces', 9:'9 - Drug traces', 10:'10 - Drug racket location'} H = nx.relabel_nodes(G, mapping) 
pos = nx.spring_layout(H) 
nx.draw_networkx_nodes(H, pos, node_size =[200, 200, 200, 200, 200, 200, 200, 200]) 
nx.draw_networkx_edges(H, pos) 
nx.draw_networkx_labels(H, pos) 
pl.show() 

在这里插入图片描述
注意:上图可能看起来与之前的图有点不同,但实际上它们是相同的图。这是由于 networkx 库随机放置节点造成的。

  • 步骤 7:为训练过程定义一些实用函数
Q = np.matrix(np.zeros([MATRIX_SIZE, MATRIX_SIZE])) 
env_police = np.matrix(np.zeros([MATRIX_SIZE, MATRIX_SIZE])) 
env_drugs = np.matrix(np.zeros([MATRIX_SIZE, MATRIX_SIZE])) 
initial_state = 1# Same as above 
def available_actions(state): current_state_row = M[state, ] av_action = np.where(current_state_row >= 0)[1] return av_action # Same as above 
def sample_next_action(available_actions_range): next_action = int(np.random.choice(available_action, 1)) return next_action # Exploring the environment 
def collect_environmental_data(action): found = [] if action in police: found.append('p') if action in drug_traces: found.append('d') return (found) available_action = available_actions(initial_state) 
action = sample_next_action(available_action) def update(current_state, action, gamma): 
max_index = np.where(Q[action, ] == np.max(Q[action, ]))[1] 
if max_index.shape[0] > 1: max_index = int(np.random.choice(max_index, size = 1)) 
else: max_index = int(max_index) 
max_value = Q[action, max_index] 
Q[current_state, action] = M[current_state, action] + gamma * max_value 
environment = collect_environmental_data(action) 
if 'p' in environment: env_police[current_state, action] += 1
if 'd' in environment: env_drugs[current_state, action] += 1
if (np.max(Q) > 0): return(np.sum(Q / np.max(Q)*100)) 
else: return (0) 
# Same as above 
update(initial_state, action, gamma) def available_actions_with_env_help(state): current_state_row = M[state, ] av_action = np.where(current_state_row >= 0)[1] # if there are multiple routes, dis-favor anything negative env_pos_row = env_matrix_snap[state, av_action] if (np.sum(env_pos_row < 0)): # can we remove the negative directions from av_act? temp_av_action = av_action[np.array(env_pos_row)[0]>= 0] if len(temp_av_action) > 0: av_action = temp_av_action return av_action 
# Determines the available actions according to the environment 
  • 步骤 8:可视化环境矩阵
scores = [] 
for i in range(1000): current_state = np.random.randint(0, int(Q.shape[0])) available_action = available_actions(current_state) action = sample_next_action(available_action) score = update(current_state, action, gamma) # print environmental matrices 
print('Police Found') 
print(env_police) 
print('') 
print('Drug traces Found') 
print(env_drugs) 

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

  • 第 9 步:训练和评估模型
scores = [] 
for i in range(1000): current_state = np.random.randint(0, int(Q.shape[0])) available_action = available_actions_with_env_help(current_state) action = sample_next_action(available_action) score = update(current_state, action, gamma) scores.append(score) pl.plot(scores) 
pl.xlabel('Number of iterations') 
pl.ylabel('Reward gained') 
pl.show() 

在这里插入图片描述
上面的例子是一个非常基本的例子,许多实际例子(例如自动驾驶汽车)都涉及博弈论的概念。

四、结论

然而,传统的Q学习也有其挑战。随着状态空间的增长,它在可伸缩性方面苦苦挣扎,并且在具有连续状态和操作空间的环境中效率较低。这就是 Deep Q 网络 (DQN) 的用武之地。DQN 使用神经网络来逼近 Q 值,使代理能够有效地处理更大、更复杂的环境。

在后本文中,我们将深入探讨 Deep Q Networks。我们将探讨 DQN 如何克服传统 Q 学习的局限性,并讨论构成 DQN 的关键组件

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

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

相关文章

气膜建筑的运营成本解析:高效节能的运作模式—轻空间

气膜建筑以其独特的优势和广泛的应用吸引了大量关注。然而&#xff0c;许多人对其持续吹气的运营成本产生了疑问。实际上&#xff0c;气膜建筑通过智能控制系统和高效的风机管理&#xff0c;大大降低了运营成本。本文将以2000平方米的气膜建筑为例&#xff0c;详细解析其运行成…

Vue3 - 实现一个雨水滴落的动画效果

在 Vue 3 中实现一个雨水滴落的动画效果,可以使用 HTML5 的 <canvas> 元素和 JavaScript 来绘制和控制动画。 以下是一个实现雨水滴落效果的示例: 创建一个 Vue 3 项目 首先,确保你已经创建了一个 Vue 3 项目。如果还没有,可以使用 Vue CLI 来创建: vue create r…

2024年社会发展、人文艺术与文化国际会议(ICSDHAC 2024)

2024年社会发展、人文艺术与文化国际会议&#xff08;ICSDHAC 2024&#xff09; 会议简介 2024年国际社会发展、人文、艺术和文化会议&#xff08;ICSDHAC 2024&#xff09;将在广州举行。会议旨在为从事社会发展、人文、艺术和文化研究的专家学者提供一个平台&#xff0c;分…

字符串操作:写一个方法,实现字符串的反转,如:输入abc,输出cba

import java.util.Scanner; public class Test_A15 {public static void main(String[] args){String strA"";System.out.println("请输入一串字符串:");Scanner scannernew Scanner(System.in);strAscanner.next();Test_A15 T15new Test_A15();String re…

leetCode.86. 分隔链表

leetCode.86. 分隔链表 题目思路&#xff1a; 代码 class Solution { public:ListNode* partition(ListNode* head, int x) {auto lh new ListNode(-1), rh new ListNode(-1);auto lt lh, rt rh;for(auto p head; p; p p->next ) {if(p->val < x) {lt lt->…

Midjourney保姆级教程(五):Midjourney图生图

Midjourney生成图片的方式除了使用文字描述生成图片外&#xff0c;还有“图生图”的方式&#xff0c;可以让生成的图片更接近参考的图片。 今天我们来聊聊“图生图”的方式。 一、模仿获取propmt 很多时候&#xff0c;我们不知道画什么内容的图片&#xff0c;大家可以关注内…

SRS视频服务器应用研究

1.SRS尝试从源码编译启动 1.1.安装ubuntu 下载镜像文件 使用VMWare安装&#xff0c;过程中出现蓝屏&#xff0c;后将VM的软件版本从15.5升级到17&#xff0c;就正常了。 1.2.更新ubuntu依赖

第二十四章多栏布局解决方案(什么是自适应?/)

什么是自适应? 指能使网页自适应显示在不同大小终端设备上新网页设计方式及技术.简单的来说自适应就是让同一个页面自动适应不同大小的设备&#xff0c;从而解决为不同设备提供不同版本的页面问题。 1&#xff0e;两列自适应 两列自适应布局是指左侧固定宽度&#xff0c;右…

低代码开发与人工智能技术在商品推荐系统中的应用

引言 低代码开发和人工智能技术的背景和重要性 随着数字化转型的深入&#xff0c;企业在信息技术领域面临着前所未有的挑战和机遇。快速变化的市场需求、日益复杂的技术环境以及高度竞争的商业环境&#xff0c;迫使企业不断寻求高效的开发和运营解决方案。低代码开发平台应运而…

【java-数据结构19-队列的模拟实现】

上篇文章&#xff0c;小编已经带大家一起认识了队列&#xff0c;并且对队列的方法进行调用测试&#xff0c;下面我们将模拟实现一个队列&#xff0c;话不多说&#xff0c;上正文~ 1.队列的模拟实现 队列的实现方法和链表的实现方式一模一样&#xff0c;这里我们首选双链表&…

VirtualBox虚拟机与bhyve虚拟机冲突问题解决@FreeBSD

问题 在安装完bhyve虚拟系统的主机上启动VirtualBox虚拟机的时候&#xff0c;报错&#xff1a;不能为虚拟电脑 debian 打开一个新任务. VirtualBox cant operate in VMX root mode. Please close all other virtualization programs. (VERR_VMX_IN_VMX_ROOT_MODE). 返回 代码…

项目成功的关键要素:进度管理

在项目管理中&#xff0c;进度管理是决定项目成败的关键因素之一。它关乎项目能否在预定的时间范围内高效、准确地完成既定目标。 一、进度管理的重要性 1、时间控制&#xff1a;项目的成功往往与时间的把握息息相关。进度管理能够确保项目在既定的时间框架内有序进行&#x…

uni-app学习完结

昨天空余一天&#xff0c;并未写记录&#xff0c;是昨天属于项目完结&#xff0c;这里把最后的打包上线等这里说下。 打包成微信小程序 打包成微信小程序&#xff0c;这需要再微信公众平台里面&#xff0c;进行登陆和设置。这里说下&#xff0c;注册的后&#xff0c;选择需要…

LeetCode---链表

203. 移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 代码示例1&#xff1a;(直接使用原来的链表来进行移除节点操作) //时间复杂度: O(n) //空间复杂度: O(1) class Solu…

数据通信基本概念汇总

1. 数据通信基础 网关: 提供协议转换&#xff0c;路由选择&#xff0c;数据交换的网络设备 报文: 网络中所传递的一个数据单元。 数据载荷: 最终要传递的信息 封装: 给数据载荷添加头部和尾部的过程(形成新的报文) 解封装: 给数据载荷去掉头部和尾部的过程(获取数据载荷) 终端设…

C语言中的位段

位段是通过结构体实现的&#xff0c;可以在一定程度上减小空间浪费&#xff0c;位段的声明和结构体类似&#xff0c;有以下几个不同&#xff1a; ①位段的成员必须是整形&#xff08;int,char,short等&#xff09;。 ②成员后边有冒号和数字&#xff0c;表示该成员占几个bit位…

LeetCode---栈与队列

232. 用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int pee…

Mac快速搭建前端环境创建前端项目【Vue】

Mac快速搭建前端环境&创建前端项目 官网&#xff1a; vue&#xff1a;https://cn.vuejs.org/vue-router&#xff1a;https://www.axios-http.cn/pinia&#xff1a;https://pinia.vuejs.org/zh/getting-started.htmlaxios&#xff1a;https://www.axios-http.cn/ant-design&…

Advanced Installer 问题集锦

1、界面在主题中显示的图标&#xff0c;如logo、发布者名称、产品名称就算在设计界面时删除&#xff0c;但是下次打开工程依然存在 解决办法&#xff1a;“可见”属性设置为禁用 2、在不关闭软件的情况下&#xff0c;使用"文件->打开"来切换项目&#xff0c;再次…

学习笔记——数据通信基础——数据通信网络(基本概念)

数据通信网络基本概念 网络通信&#xff1a;是指终端设备之间通过计算机网络进行的通信。 数据通信网络(Data Communication Network)&#xff1a;由 路由器、交换机、防火墙、无线控制器、无线接入点&#xff0c;以及个人电脑、网络打印机&#xff0c;服务器等设备构成的通信…