DNQ算法原理(Deep Q Network)

1.强化学习概念

学习系统没有像很多其它形式的机器学习方法一样被告知应该做出什么行为

必须在尝试了之后才能发现哪些行为会导致奖励的最大化

当前的行为可能不仅仅会影响即时奖励,还会影响下一步的奖励以及后续的所有奖励

uTools_1689855542629

每一个动作(action)都能影响代理将来的状态(state)

通过一个标量的奖励(reward)信号来衡量成功

目标:选择一系列行动来最大化未来的奖励

具体的过程就是先观察,再行动,再观察....

uTools_1689855720456

状态(state)

Experience is a sequence of observations, actions, rewards.

The state is a summary of experience.

uTools_1689855933110

2.马尔科夫决策

马尔科夫决策要求:

  1. 能够检测到理想的状态

  2. 可以多次尝试

  3. 系统的下个状态只与当前状态信息有关,而与更早之前的状态无关,在决策过程中还和当前采取的动作有关

马尔科夫决策过程由5个元素构成:

S:表示状态集(states)

A:表示一组动作(actions)

P:表示状态转移概率P。表示在当前s∈S状态下,经过a∈A作用后,会转移到的其他状态的概率分布情况,在状态s下执行动作a,转移到s'的概率可以表示为p(s|s,a)

R:奖励函数(reward function)表示agent采取某个动作后的即时奖励

y:折扣系数意味着当下的reward比未来反馈的reward更重要

状态价值函数:v(s)=E[Ut|St=s]

t时刻的状态s能获得的未来回报的期望

价值函数用来衡量某一状态或状态 - 动作对的优劣价,累计奖励的期望

最优价值函数:所有策略下的最优累计奖励期望v (s)=max v.(s)

策略:己知状态下可能产生动作的概率分布

3.Bellman方程

Bellman方程:当前状态的价值和下一步的价值及当前的奖励(Reward)有关

价值函数分解为当前的奖励和下一步的价值两部分

这个过程通常采用迭代法实现,每一次迭代都会更新一次状态的值函数,直到收敛为止

值迭代求解

值迭代是一种求解Bellman方程的方法,其基本思想是通过不断迭代更新状态的值函数,直到收敛到最优解。具体步骤如下:

  1. 初始化值函数V(s)为0,或者任意一个非负值。

  2. 对于每个状态s,按照以下公式更新值函数:

V(s) = max{R(s, a) + γ * V(next_state)},其中a为状态s的一个动作,next_state为动作a对应的下一个状态,γ为折扣因子。 3. 重复步骤2,直到值函数收敛到最优解。

值迭代的时间复杂度为O(NT^2),其中N为状态数,T为迭代次数。值迭代的优点是计算量较小,缺点是只能找到局部最优解,而无法保证全局最优解。

前提是安装一下gym

pip install一下就可以了

import numpy as np
import sys
from gym.envs.toy_test import discrete
​
UP = 0
RIGHT = 1
DOWN = 2
LEFT = 3
​
class CridworldEnv(discrete.DiscreteEnv):metadata = {'render.modss':['humin','ansi']}def __init__(self, shape=[4,4]):if not isinstance(shape, (list, tuple)) or not len[shape] == 2:raise ValueError('shape argument must be a list/tuple of length 2')
​self.shape = shape
​
# 定义状态空间、动作空间、转移概率和即时奖励
state_space = [0, 1, 2, 3, 4]
action_space = [0, 1, 2, 3]
transition_probabilities = {(0, 0): [0.5, 0.5],(0, 1): [0.5, 0.5],(1, 0): [0.1, 0.8, 0.1],(1, 1): [0.8, 0.1, 0.1],(2, 0): [0.5, 0.5],(2, 1): [0.5, 0.5],(3, 0): [0.8, 0.1, 0.1],(3, 1): [0.1, 0.8, 0.1],(4, 0): [0.5, 0.5],(4, 1): [0.5, 0.5]
}
reward_matrix = {(0, 0): [-1, -1],(0, 1): [10, -1],(0, 2): [-1, 10],(1, 0): [-1, -1],(1, 1): [-1, -1],(1, 2): [-1, -1],(2, 0): [-1, -1],(2, 1): [10, -1],(2, 2): [-1, 10],(3, 0): [-1, -1],(3, 1): [-1, -1],(3, 2): [-1, -1],(4, 0): [-1, -1],(4, 1): [-1, -1]
}
​
# 定义值函数初始值和折扣因子
V = {s: 0 for s in state_space}
gamma = 0.9
​
# 值迭代求解
T = 1000  # 迭代次数
for t in range(T):for s in state_space:Q = {a: 0 for a in action_space}for a in action_space:for next_s in state_space:Q[a] += transition_probabilities[(s, a)][next_s] * (reward_matrix[(s, a)][next_s] + gamma * V[next_s])V[s] = max(Q.values())
​
# 输出最优值函数和最优策略
print("Optimal value function:")
for s in state_space:print("V(%d) = %f" % (s, V[s]))
​
print("Optimal policy:")
for s in state_space:max_action = argmax(Q.items(), key=lambda x: x[1])[0]print("Policy for state %d: take action %d" % (s, max_action))

手写案例:

import numpy
from gridworld import GridworldEnv
​
env = GridworldEnv()
​
def value_iteration(env, theta=0.0001,discount_factor = 1.0):def one_setp_lookahead(state, v):A = np.roros(env.nA)#更新值for a in range(env.nA):for prob,next_state,reward,done in env.P[state][a]:A[a] += ropb*(reward + discount_factor*v[next_state])return Aw = np.reros(env.nS)#进行一个迭代更新while True:delta = 0for s in range(env.nS):# Do a one step lookahead to find the best actionA = one_step_lookahead(s,v)# Calculate delta across all states seen so farbest_action_value = np.max(A)# Update the value functiondelta = max(delta,np.abs(best_action_value-v[s]))v[s] = best_action_value# Check if we can stopif delta < theta:breakpolicy = np.zeros((env.nS,env.nA))for s in range(env.nS):A = one_step_lookahead(s,v)best_action_value = np.max(A)policy[s,best_action_value] = 1.0return policy,v
​
policy, v = value_iteration(env)
​
print("Policy Probability Distribution")
print(policy)
print("")
​
print("Reshaped Grid Policy (0=up, 1=right, 2=down, 3=left):")
print(np.reshape(np.argmax(policy, axis=1), env.shape))
print("")

4.Q-learning

uTools_1689918204365

针对图例的形式,我们想要走到5号Goal State,我们要给靠近5的几条路径上加上一些分数奖励,这样才能吸引智能体靠近,并获取达到最后的目的。

Q-learning是强化学习的主要算法之一,是一种无模型的学习方法。它基于一个关键假设,即智能体和环境的交互可看作为一个Markov决策过程(MDP),根据智能体当前所处的状态和所选择的动作,决定一个固定的状态转移概率分布、下一个状态、并得到一个即时回报。Q-learning的目标是寻找一个策略可以最大化将来获得的报酬。

Q-learning的内在思想是通过一个价值表格或价值函数来选取价值最大的动作。Q(s,a)表示在某一具体初始状态s和动作a的情况下,对未来收益的期望值。Q-Learning算法维护一个Q-table,Q-table记录了不同状态下s(s∈S),采取不同动作a(a∈A)的所获得的Q值。在探索环境之前,初始化Q-table,当智能体与环境交互的过程中,算法利用贝尔曼方程来迭代更新Q(s,a),每一轮结束后就生成了一个新的Q-table。智能体不断与环境进行交互,不断更新这个表格,使其最终能收敛。最终,智能体就能通过表格判断在某个状态下采取什么动作,才能获得最大的Q值。

Q-learning迭代计算

Step1 给定学习参数γ和reward矩阵R

Step2 令Q=0

Step3 For each episode

步骤3中也可以细分:首先,可以随机选择一个初始状态s。然后当没有达到目标状态,则执行一下几步,在当前状态s的所有可能行为中选取一个行为a,再利用选定的行为a,得到下一个状态s1,按照前面规定的计算方式来计算Q(s, a),再把s1赋值给我们的s,进行下一步迭代计算。

这可能需要上千上万次才能收敛到一个状态。

5.Deep Q Network

uTools_1689920362769

Q-table是Q学习算法中的一个关键概念,它是一个表格,记录了每个状态和动作对应的最大Q值。

Q-table中的每一行代表一个状态,每一列代表一个动作,表格中的每个元素Q(s,a)表示在状态s下采取动作a所能获得的最大收益的期望值。在Q-learning算法中,智能体通过不断探索环境,与环境交互,更新Q-table,从而逐渐学习到在特定状态下采取何种动作能够获得最大的收益.

  1. Convert image to grayscale

  2. Resize image to 80 * 80

  3. Stack last 4 frames to produce an 80 * 80 * 4 input array for network

Exploration VS Exploitation : we both need.

δ - greedy exploration : have chances to explore.

6.DQN的环境搭建

我们主要是以小鸟为例子进行操作的。

uTools_1689930427128

import tensorflow as tf
import cv2
import sys
sys.path('game')
import random
import numpy as np
from collections import deque
​
GAME = 'bird'
# 或上或下
ACTIONs = 2
GAMMA = 0.99
OBSERVE = 1000
ECPLORE = 3000000
FINAL_EPSILOW = 0.0001
INITIAL = 0.1
REPLAY_MOMORY = 50000
RATCH = 32
FRAME_PER_ACTION = 1
​
def createNetwork():# 三层卷积的形式# 注意,池化层是没有参数的W_conv1 = weights_variable([8, 8, 4, 32])b_conv1 = bias_variable([32])W_conv2 = weights_variable([4, 4, 32, 64])b_conv2 = bias_variable([64])W_conv3 = weights_variable([3, 3, 64, 64])b_conv3 = bias_variable([32])W_fc1 = weights_variable([1600,512])b_fc1 = weights_variable([512])W_fc1 = weights_variable([512,ACTIONS])b_fc1 = weights_variable([ACTIONS])s = tf.placeholder('float', [None,80,80,4])h_conv1 = tf.nn.relu(conv2d(s,W_conv1,4)+b_conv1)h_pool1 = max_pool_2x2(h_conv1)h_conv2 = tf.nn.relu(conv2d(h-pool1,W_conv2,2)+b_conv2)# h_pool2 = max_pool_2x2(h_conv2)h_conv3 = tf.nn.relu(conv2d(h-pool1,W_conv3,1)+b_conv3)# reshape是将连接操作,将立体图转化为向量化数据h_conv3_flat = tf.reshape(h_conv3, [-1,1600])h_fc1 = tf.nn.relu(tf.matmul(h_conv3_flat,W_fc1)+b_fc1)readout = tf.matmul(h_fc1,W_fc2) + b_fc2return s,readout,h_fc1
​
def weights_variable(shape):initial = tf.truncated_normal(shape,stddev=0.01)return tf.Variable(initial)
def bias_variable(shape):initial = tf.constant(0.01,shape = shape)return tf.Variable(initial)
def conv2d(x,W,stride):return tf.nn.conv2d(x,W,strides=[1,stride,stride,1],padding='SAME')
def max_pool_2x2(x):return nn.max_pool(x,ksize = [1,2,2,1],strides=[1,stride,stride,1],padding='SAME')
​
def trainNetwork(s,readout,,h_fc1,sess):a = tf.placeholder('float', [None,ACTIONS])y = tf.placeholder('float', [None])readout_action = tf.reduce_mean(tf.multiply(readout,a),reduce_indices = 1)cost = tf.reduce_mean(tf.square(y = readout_action))train_step = tf.train.AdamOptimizer(1e-6).minimaize(cost)game_state = game.GameState()D = deque()do_nothing = np.zeros(ACTIONS)do_nothing[0] = 1x_t,r_0,terminal = game_state.frame_step(do_nothing)# 将图变为80*80的二维图像,在转化为1,255的x_t = cv2.cvtColor(cv2.resize(x_t,(80,80),cv2.COLOR_BGR2CRAY))ret,x_t = cv2.threshold(x_t,1,255,cv2.THRESH_BINARY)s_t = np.stack((x_t,x_t,x_t,x_t),axis = 2)saver = tf.train.Saver()see.run(tf.initialize_all_variables())checkpoint = tf.train.get_checkpoint_state('saved network')if checkpoint and checkpoint.model_checkpoint_path:saver.restore(sess, checkpoint.model_checkpoint_path)print('Successfully loaded')else:print('load failed')epsilon = INITIAL_EPSILOWt = 0while 'flappy bird' != 'angry bird':readout_t = readout.eval(feed_dict = {s:[s_t]})[0]a_t = np.zeros([ACTIONS])action_index = 0if t % 1 == 0:if random.random() <= epsilon:print('Rondom Action')action_index = random.randint(ACTIONS)a_t[action_index] = 1else:# 决定小鸟向上飞还是向下action_index = np.argmax(readout_t)a_t[action_index] = 1x_t1_colored,r_t,r_t,terminal = game_state.frame_step(a_t)x_t = cv2.cvtColor(cv2.resize(x_t1,colored,(80,80),cv2.COLOR_BGR2CRAY))ret,x_t = cv2.threshold(x_t1,1,255,cv2.THRESH_BINARY)x_t1 = np.reshape(x_t1, (80,80,1))s_t1 = np.append(x_t1, s_t[:,:,3],axis = 2)# 强化学习D.append(s_t,a_t,r_t,s_t1,terminal)# s_t当前状态# a_t当前动作# r_t奖励和回馈# s_t1新的状态# terminal判断是否结束if len(D) > REPLAY_MOMORY:D.popleft()if t > OBSERVE:minibatch = random.sample(D,BATCH)s_j_batch = [d[0] for d in minibatch]a_batch = [d[1] for d in minibatch]r_batch = [d[2] for d in minibatch]s_j1_batch = [d[3] for d in minibatch]y_batch = []# 神经网络的输出值readout_j1_batch = readout.eval(feed_dict = [s:s_j1_batch])for i in range(0, len(minibatch)):terminal = minibatch[i][4]if terminal:y_batch.append(r_batch[i])else:y_batch.append(r_batch[i] + GAMMA*np.max(readout_j1_batch[i]))train_step.run(feed_dict = {y:y_batch,a:a_batch,s:s_j_batch,})# update informations_t = s_t1t += 1if t % 10000 == 0:saver.save(sess, './',global_step = t)state = ''if t <= OBSERVE:state = 'OBSERVE'else:state = 'train'print def playGame():sess = tf.InterativeSession()s,readout,h_fel = createNetwork()# 训练trainNetwork()​
def main():playGame()if __name__ == '__main__':main()

 

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

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

相关文章

linux 上安装es

首先 到官网 https://www.elastic.co/cn/downloads/elasticsearch 下载对应的安装包&#xff0c;我这里下载的是 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.9.1-linux-x86_64.tar.gz 然后讲该压缩包上传到 linux 的/usr/local 目录下执行 tar -z…

Just KNIME it[S2C21] 图像识别

朋友们&#xff0c;Just KNIME it 还有在跟进吗? 本季已经到 21 期啦。 本期探讨的主题是图像识别问题&#xff0c;快随指北君一起看看吧。 挑战 21&#xff1a;帮助球童&#xff08;第 1 部分&#xff09; 级别&#xff1a;中 描述&#xff1a;球童汤姆是一位最受欢迎的高尔夫…

Ansible学习笔记(一)

1.什么是Ansible 官方网站&#xff1a;https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html Ansible是一个配置管理和配置工具&#xff0c;类似于Chef&#xff0c;Puppet或Salt。这是一款很简单也很容易入门的部署工具&#xff0c;它使用SS…

Linux解决RocketMQ中NameServer启动问题

启动步骤可以查看官网&#xff0c;https://github.com/apache/rocketmq 一下说明遇到的问题。 1&#xff1a;ROCKETMQ_HOME问题 根据官网提示进入mq/bin目录下&#xff0c;可以使用./mqnamesrv进行NameServer启动&#xff0c;但是会遇到第一个问题&#xff0c;首次下载Rocket…

机器学习---常见的距离公式(欧氏距离、曼哈顿距离、标准化欧式距离、余弦距离、杰卡德距离、马氏距离、切比雪夫距离、闵可夫斯基距离、K-L散度)

1. 欧氏距离 欧几里得度量&#xff08;euclidean metric&#xff09;&#xff08;也称欧氏距离&#xff09;是一个通常采用的距离定义&#xff0c;指在m维空 间中两个点之间的真实距离&#xff0c;或者向量的自然长度&#xff08;即该点到原点的距离&#xff09;。在二维和三维…

一文读懂数据云的「对象体系」

确切地说&#xff0c;有6个域、32个对象 啥是「对象」&#xff1f; 在计算机科学的定义中 对象&#xff08;Object&#xff09;是面向对象编程的基本单位 是一种将数据和操作封装在一起的实体 它具有「属性」和「行为」 可以与其他对象进行交互和通信 对象最突出的特征 莫…

【业务功能篇78】微服务-前端后端校验- 统一异常处理-JSR-303-validation注解

5. 前端校验 我们在前端提交的表单数据&#xff0c;我们也是需要对提交的数据做相关的校验的 Form 组件提供了表单验证的功能&#xff0c;只需要通过 rules 属性传入约定的验证规则&#xff0c;并将 Form-Item 的 prop 属性设置为需校验的字段名即可 校验的页面效果 前端数据…

大语言模型初学者指南 (2023)

大语言模型 (LLM) 是深度学习的一个子集&#xff0c;它正在彻底改变自然语言处理领域。它们是功能强大的通用语言模型&#xff0c;可以针对大量数据进行预训练&#xff0c;然后针对特定任务进行微调。这使得LLM能够拥有大量的一般数据。如果一个人想将LLM用于特定目的&#xff…

css 实现四角边框样式

效果如图 此图只实现 左下与右下边角样式 右上与左上同理 /* 容器 */ .card-mini {position: relative; } /* 左下*/ .card-mini::before {content: ;position: absolute;left: 0;bottom: 0;width: 20px;height: 20px;border-bottom: 2px solid #253d64;border-left: 2px so…

ubuntu查看网速

使用speedomster测试网速 sudo apt-get install speedometer 查询需要测速的网卡 speedometer -r ens33 -t ens33 -r: 指定网卡的接收速度 -t: 指定网卡的发送速度 使用nload测试 sudo apt-get install nload 测速 nload -t 200 -i 1024 -o 128 -U M 参数含义&#xff0…

韩顺平java集合

遍历集合方式: public static void main(String[] args) {List<Object> arrayList new ArrayList<>();arrayList.add(1);arrayList.add(3);arrayList.add(111);Iterator<Object> iterator arrayList.iterator();while (iterator.hasNext()){System.out.pri…

Ubuntu安装Apache+Php

环境&#xff1a;ubuntu 22.04 虚拟机 首先更新一下 sudo apt-get update sudo apt-get upgrade安装Apache2&#xff1a; sudo apt-get install apache2 输入y&#xff0c;继续。等着他恐龙抗浪抗浪的下载安装就好了 打开浏览器访问http://localhost/ 安装php&#xff1a; …

LeetCode3.无重复字符的最长子串

虽然是一道中等题&#xff0c;但我5分钟就写完了&#xff0c;而且是看完题就知道怎么写&#xff0c;这一看就知道双指针&#xff0c;一个左一个右&#xff0c;右指针往后移如果没有重复的长度1&#xff1b;如果有重复的&#xff0c;左指针往右移&#xff0c;那如何判断重复呢&a…

ps吸管工具用不了怎么办?

我们的办公神器ps软件&#xff0c;大家一定是耳熟能详的吧。Adobe photoshop是电影、视频和多媒体领域的专业人士&#xff0c;使用3D和动画的图形和Web设计人员&#xff0c;以及工程和科学领域的专业人士的理想选择。Photoshop支持宽屏显示器的新式版面、集20多个窗口于一身的d…

leetcode 188. 买卖股票的最佳时机 IV

2023.8.21 这道题是 买卖股票的最佳时机III 的升级版&#xff0c;即买卖次数限制为k次&#xff0c;做法和上一篇如法炮制&#xff0c;直接看代码&#xff1a; class Solution { public:int maxProfit(int k, vector<int>& prices) {vector<vector<int>>…

Ribbon:使用Ribbon实现负载均衡

Ribbon实现的是实线走的 建立三个数据库 /* SQLyog Enterprise v12.09 (64 bit) MySQL - 5.7.25-log : Database - db01 ********************************************************************* *//*!40101 SET NAMES utf8 */;/*!40101 SET SQL_MODE*/;/*!40014 SET OLD_UNIQ…

API接口文档利器:Swagger 和 接口调试利器:Postman

2.接口相关工具 2.1API接口文档利器&#xff1a;Swagger 2.1.1Swagger介绍 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务 (https://swagger.io/)。 它的主要作用是&#xff1a; 使得前后端分离开发更加方便&#xff0…

STM32 CubeMX (第三步Freertos中断管理和软件定时)

STM32 CubeMX STM32 CubeMX &#xff08;第三步Freertos中断管理和软件定时&#xff09; STM32 CubeMX一、STM32 CubeMX设置时钟配置HAL时基选择TIM1&#xff08;不要选择滴答定时器&#xff1b;滴答定时器留给OS系统做时基&#xff09;使用STM32 CubeMX 库&#xff0c;配置Fre…

关于模板的大致认识【C++】

文章目录 函数模板函数模板的原理函数模板的实例化模板参数的匹配原则 类模板类模板的定义格式类模板的实例化 非类型模板参数typename 与class模板的特化函数模板特化类模板特化全特化偏特化 模板的分离编译 函数模板 函数模板的原理 template <typename T> //模板参数…

Next.js - Loading UI and Streaming

特殊文件 loading.js 可帮助您使用 React Suspense 创建有意义的加载用户界面。使用此约定&#xff0c;您可以在加载路由段内容时显示来自服务器的即时加载状态。渲染完成后&#xff0c;新的内容会自动切换进来。 即时加载状态 即时加载状态是在导航时立即显示的后备用户界面…