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

news2024/11/17 2:47:10

文章目录

  • 一、说明
  • 二、深度 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 *= -1

for point in edges: 
	print(point) 
	if point[1] == goal: 
		M[point] = 100
	else: 
		M[point] = 0

	if point[0] == goal: 
		M[point[::-1]] = 100
	else: 
		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.coloradmin.cn/o/1712600.html

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

相关文章

SAP实施方法论

SAP新实施方法论 RDS Activate

分布式拒绝服务解决方式

在网络安全领域中&#xff0c;分布式拒绝服务&#xff08;DDoS&#xff09;攻击始终占据着举足轻重的地位&#xff0c;其影响力不容忽视。随着网络技术的日新月异和网络环境的日益复杂化&#xff0c;DDoS攻击不仅变得愈发频繁&#xff0c;而且其破坏性和影响力也呈现出惊人的增…

二区5分纯生信|单细胞+非负矩阵+AlphaFold+机器学习组合

说在前面 学文不看刊 这篇分析总体来说工作量不算大&#xff0c;scRNA联合bulkRNA分析&#xff0c;多种机器学习组合预测模型&#xff0c;最后用了AlphaFold2预测蛋白及AutoDock分子对接 非常适合小白学习和模仿&#xff0c;其次在筛选出核心基因后可以再加几个外部数据集观…

【最优化方法】实验四 约束最优化方法的MATLAB实现

实验的目的和要求&#xff1a;通过本次实验使学生较为熟练使用MATLAB软件&#xff0c;并能利用该软件进行约束最优化方法的计算。 实验内容&#xff1a; &#xff11;、罚函数法的MATLAB实现 &#xff12;、可行方向法的MATLAB实现 学习建议&#xff1a; 本次实验就是要通…

抠像标签合并到原图,jpg 和 png合并,查看标签是否准确

抠像 原图 和 标签合并&#xff0c;查看抠像是否准确 合并后的图&#xff0c;是带有 羽化 效果的 import osimport cv2 import numpy as npdef apply_mask_with_feathering(original_image_path, mask_image_path):# 读取原图和mask图original_image cv2.imread(original_im…

一分钟教你学浪app视频怎么缓存

你是否在学浪app上苦苦寻找如何缓存视频的方法&#xff1f;你是否想快速、轻松地观看自己喜欢的视频内容&#xff1f;那么&#xff0c;让我们一起探索一分钟教你如何缓存学浪app视频的技巧吧&#xff01; 学浪下载工具我已经打包好了&#xff0c;有需要的自己下载一下 学浪下…

豆瓣内容抓取:使用R、httr和XML库的完整教程

概述 在数据分析和统计领域&#xff0c;R语言以其强大的数据处理能力和丰富的包库资源而闻名。它不仅提供了一个灵活的编程环境&#xff0c;还拥有专门用于数据抓取和处理的工具&#xff0c;如httr和XML库。这些工具使得从各种网站上抓取数据变得简单而高效。 豆瓣网站作为一个…

Excel 单元格式 “万” 和 “亿” 展示

先看结果 实现方法&#xff1a; 将单元格式 格式设置为 [>999999]0!.00,,"亿";[>999]0!.0,"万";0 我这里设置的是大于 999 和 99万 生效对应的万和 亿 如果想要达到1万 和达到 1亿 才生效可以设置为如下 [>1000000000]0!.00,,"亿"…

RUST 和 GO 如何管理它们的内存

100编程书屋_孔夫子旧书网 Go 中的内存管理 Go 中的内存不会在缓存键被驱逐时立即释放。 相反&#xff0c;垃圾收集器会经常运行以发现任何没有引用的内存并释放它。 换句话说&#xff0c;内存会一直挂起&#xff0c;直到垃圾收集器可以评估它是否真正不再使用&#xff0c;而…

AI架构设计6:vLLM

训练大型语言模型以及微调的教程比比皆是&#xff0c;但关于在生产环境中部署它们并监控其活动的资料相对稀缺。上个章节提到了未来云原生的AI是趋势&#xff0c;然而涉及到云原生会比较偏技术。而在此之前为了解决大模型部署量产的问题&#xff0c;社区也一直在探索&#xff0…

OLED曲面屏手机跌下神坛,曲面边缘老化迅速,泛黄严重

在过去国产手机都喜欢将曲面屏用到旗舰手机上&#xff0c;借此凸显旗舰手机的优越性和独特性&#xff0c;然而在实际使用中&#xff0c;曲面屏的弊端日益明显&#xff0c;如今笔者就遭遇了这个问题。 因手上刚购买的天玑6080、骁龙4G2新机存在卡顿问题&#xff0c;使用很不爽&a…

面向链接预测的知识图谱表示学习方法综述

源自&#xff1a;软件学报 作者&#xff1a;杜雪盈, 刘名威, 沈立炜, 彭鑫 注&#xff1a;若出现无法显示完全的情况&#xff0c;可搜索“人工智能技术与咨询”查看完整文章 摘 要 作为人工智能的重要基石, 知识图谱能够从互联网海量数据中抽取并表达先验知识, 极大程度解决…

【数据结构】冒泡排序、直接插入排序、希尔排序详解!

文章目录 1. 冒泡排序&#x1f34e;2. 直接插入排序&#x1f34e;3. 希尔排序&#xff08;缩小增量排序&#xff09;&#x1f34e; 1. 冒泡排序&#x1f34e; &#x1f427; 基本思想&#xff1a; 比较相邻的元素。如果第一个比第二个大&#xff0c;就交换他们两个。 大的数据…

【Python-基础】函数合集

def嵌套def 调用外部函数aa时&#xff0c;如果aa中没有调用内部函数bb&#xff0c;则bb函数不执行。 def aa():print("1")def bb():print("2")print("3")if __name__ "__main__":aa()未待完续…

LeetCode---链表

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

海博思创储能系统产品再获认可,获得杰出项目类别入围资格

近日&#xff0c;2024年欧洲智慧能源展览会大奖&#xff08;The smarter E AWARD 2024&#xff09;公布了入围名单&#xff0c;该奖项设有五个类别&#xff1a;光伏、储能、电动出行、智能综合能源和杰出项目奖&#xff0c;旨在表彰能源领域中的卓越创新成果。 在入围项目中&a…

基于STM32实现智能楼宇对讲系统

目录 引言环境准备智能楼宇对讲系统基础代码示例&#xff1a;实现智能楼宇对讲系统 音频输入和输出按键控制显示屏和用户界面网络通信应用场景&#xff1a;楼宇安防与智能家居问题解决方案与优化收尾与总结 1. 引言 本教程将详细介绍如何在STM32嵌入式系统中使用C语言实现智能…

菜鸟的JavaSE学习之旅7

这是一个目录 数组工具类Arrays数学工具类Math继承重写&#xff08;Override&#xff09;覆盖、覆写注意 构造方法super关键字用法this关键字super和this 抽象抽象方法和抽象类格式抽象方法和抽象类使用抽象方法和抽象类注意事项 数组工具类Arrays java.util.Arrays是一个与数…

手写promise、call、apply、debounce、throttle 等

1、promise 1.1 实现resolve和reject class MyPromise {// 构造方法constructor(executor) {// 初始化值this.initValue()// 初始化this指向this.initBind()try {// 执行传进来的函数executor(this.resolve, this.reject)} catch (e) {// 捕捉到错误直接执行rejectthis.rejec…

微调真的能让LLM学到新东西吗:引入新知识可能让模型产生更多的幻觉

大型语言模型(llm)是在巨大的文本语料库上训练的&#xff0c;在那里他们获得了大量的事实知识。这些知识嵌入到它们的参数中&#xff0c;然后可以在需要时使用。这些模型的知识在培训结束时被“具体化”。在预训练结束时&#xff0c;模型实际上停止学习。 对模型进行对齐或进行…