Keras代码Q-learning OpenAI健身房FrozenLake出问题了
也许我的问题看起来很愚蠢. 我正在研究Q学习算法.为了更好地理解它,我正在尝试重新制定此frozenlake 示例示例到keras代码. 我的代码: import gym import numpy as np import random from keras.layers import Dense from keras.models import Sequential from keras import backend as K import matplotlib.pyplot as plt %matplotlib inline env = gym.make('FrozenLake-v0') model = Sequential() model.add(Dense(16, activation='relu', kernel_initializer='uniform', input_shape=(16,))) model.add(Dense(4, acti
26 2024-03-07
编程技术问答社区
Q学习中收敛的标准
我正在尝试Q学习算法.我已经从不同的来源阅读并了解了算法,但是,似乎没有明确的收敛标准. 大多数来源都建议多次迭代(例如,n = 1000),而其他人则说,当所有状态和动作对(s,a)经常访问时,会达到融合.但是这里的问题是,无限多少.想要手工解决算法的人的最佳标准是什么? 如果有人能对此进行教育,我会很感激.我也将感谢任何文章. 问候. 解决方案 Q学习是强化学习的主要突破,这是因为这是第一种保证融合最佳政策的算法.它最初是在(Watkins,1989年) 在简而言之,必须满足两个条件,以确保在极限中保证融合,这意味着该策略将在任意长时间后任意接近最佳政策.请注意,这些条件对毫无疑问 策略将接触最佳策略. 学习率必须接近零,但不会太快. 正式,这要求学习率的总和必须分歧收敛.具有这些属性的示例序列是1/1, 1/2, 1/3, 1/4, ... 每个状态行动对必须经常访问. 这具有精确的数学定义:每个动作必须具有策略选择的非零概率在每个状态下, e.
Q-learning和Value Iteration之间的区别是什么?
Q学习与增强学习中的价值迭代有何不同? 我知道Q学习是无模型的,训练样本是过渡(s, a, s', r).但是,由于我们知道Q学习中每个过渡的过渡和奖励,所以它与基于模型的学习不同,我们知道我们对国家和行动对的奖励,以及来自国家的每个行动的过渡(BE BE它随机还是确定性)?我不明白区别. 解决方案 您是100%正确的,如果我们知道Q学习中每个过渡的过渡概率和奖励,那将不清楚为什么我们会使用它而不是基于模型的学习或它如何使用根本不同.毕竟,过渡概率和奖励是在价值迭代中使用的模型的两个组件 - 如果您有模型. 关键是,在Q学习中,代理不知道状态过渡概率或奖励.代理只发现通过给定的行动从一个状态到另一个状态并获得奖励会有奖励.同样,它只通过以该状态结束并查看其选项来弄清从给定状态可用的过渡.如果状态转变是随机的,则通过观察不同的过渡的频率来了解状态之间过渡的可能性. 这里可能的混乱来源是,作为程序员,您可能会确切地知道如何设置奖励和状态过渡.实际上,当您首次设计系统
Q值的无限制增加,在Q学习中重复同一动作后的重复性奖励的结果。
我正在开发一个简单的Q学习实现过程中,但是有些东西一直困扰着我. 让我们考虑Q学习的标准配方 Q(S, A) = Q(S, A) + alpha * [R + MaxQ(S', A') - Q(S, A)] 让我们假设有两个可能的动作,既可以通过A和A'授予我们的代理奖励R>和R'. 如果我们遵循一种几乎全部刺激的方法(假设我们假设是0.1 epsilon),则首先我会随机选择其中一种动作,例如A.下次,我可能会(90%的时间)再次选择A,这将导致Q(k,a)不断成长,也是如此,即使我偶然我尝试A',也是如此. ,由于它的奖励可能与A的奖励相同,因此我们已经进入了一种情况,在其余的学习期间,几乎不可能从我们的第一个猜测中"恢复". 我猜一定不是这样,否则代理基本上不会学习 - 只需遵循一个简单的食谱:做所有事情时要做的一切. 我想念什么吗?我知道我可以调整alpha值(通常会随着时间的推移减少),但这绝不会改善我们的情况. 解决方案 来自 th
Q-learning和SARSA之间有什么区别?
尽管我知道根据这本书加固学习:简介:(Sutton and Barto和Barto).在SARSA算法中,给定策略,相应的动作值函数Q(在时间段t的状态和操作A中),即sub>),可以如下更新 q(s t ,a t )= q(s t ,a t ) +α *(r t +γ*q(s t+1 ,a t+1 ) - q(s t ,a t )) 另一方面,Q学习算法的更新步骤是以下 q(s t ,a t )= q(s t ,a t ) +α *(r t +γ*max a q(s t + 1 ,a) - q(s t ,a t )) 也可以写为 q(s t ,a t )=(1 -α) * q(s t ,a t t ) +α *(r t +γ * max a q(s t + 1 ,a)) 其中γ(伽马)是折现因子,r t 是从环境获得的奖励, 这两种算法之间的差异是SARSA仅查找下一个策略值时,Q-学习的情况下是下一个最大值策略值? tldr(和我自己的
20 2024-03-07
编程技术问答社区
如何将强化学习应用于连续行动空间?
我试图让代理学习鼠标运动所需的鼠标运动,以最好地在强化学习设置中执行某些任务(即奖励信号是学习的唯一反馈). 我希望使用Q学习技术,但是当我找到将此方法扩展到连续状态空间的一种方法,我似乎无法弄清楚如何使用连续的动作空间解决问题. 我只能迫使所有鼠标运动具有一定程度的大小,并且只有一定数量的不同方向,但是任何合理的使动作离散的方法都将产生巨大的动作空间.由于标准Q学习要求代理评估所有可能的动作,因此这种近似在任何实际意义上都无法解决问题. 解决方案 解决此问题的常见方法是使用 Actor-Critic-Cricity方法/a>.这些自然扩展到连续的动作空间.但是,基本的Q学习在使用近似值时可能会有所不同,但是,如果您仍然想使用它,则可以尝试将其与自组织的映射组合在一起,如其他解决方案 快进了今年,来自DeepMind的人们提出了一种深入的增强学习行为者 - 批评方法,以处理 连续状态和行动空间.它基于一种称为确定性政策梯度的技术.请参阅论文连续控制深入增强学习和一些
22 2024-01-22
编程技术问答社区
在Keras中只训练网络的一个输出
我在KERAS中有一个带有许多输出的网络,但是,我的培训数据仅一次提供单个输出的信息. 目前,我的培训方法是对所讨论的输入进行预测,更改我正在训练的特定输出的值,然后进行一次批次更新.如果我正确,这与将所有输出的损失设置为零相同,除了我要训练的输出. 有更好的方法吗?我尝试了班级权重,除了要训练的输出外,我都为所有人设置了零重量 我正在使用Theano后端. 解决方案 输出多个结果并仅优化其中一个 假设您要从多层返回输出,也许是从某些中间层返回的,但是您只需要优化一个目标输出.您可以做到这一点: 让我们从此模型开始: inputs = Input(shape=(784,)) x = Dense(64, activation='relu')(inputs) # you want to extract these values useful_info = Dense(32, activation='relu', name='useful_info')
44 2023-10-20
编程技术问答社区
运行 Tensorflow 时 GPU 利用率低
我一直在使用TensorFlow和OpenAI健身房进行深入的增强学习.我的问题是GPU利用率较低.谷歌搜索这个问题,我知道在训练小型网络(例如,用于培训MNIST)时,期望大量GPU利用是错误的.但是我认为,我的神经网络并不小.该体系结构与原始DeepMind纸中的给定相似(或多或少).我的网络的体系结构总结了下面 卷积第1层(滤波器= 32,kernel_size = 8x8,步幅= 4) 卷积第2层(过滤器= 64,kernel_size = 8x8,步幅= 2) 卷积第3层(滤波器= 64,kernel_size = 8x8,步幅= 1) 密集层(单位= 512) 输出层(单位= 9) 我正在Tesla P100 16GB GPU上进行培训.我的学习算法很简单. (同样,从深纸纸中).超参数均为论文中的给出. GPU利用率仍然低于10%(如NVIDIA-SMI所示).可能的问题是什么? import tensorflow as tf im
18 2023-10-16
编程技术问答社区
如何在每次迭代后返回控制权的强化学习程序中使用Tensorflow优化器而不重新计算激活值?
edit(1/3/16):我正在使用TensorFlow(Python接口)来实现使用stochastic gradient descent>. 在实验的每次迭代中,代理中的一个步骤函数被称为基于新的奖励和激活来更新近似值的参数,然后选择一个新的动作来执行. 这是问题(加固学习术语): 代理商计算其状态行动价值预测以选择一个动作. 然后将控件还给另一个程序,该程序模拟了环境中的一步. 现在,要为下一个迭代来调用代理的步骤函数.我想使用TensorFlow的优化器类来计算我的梯度.但是,这需要我计算最后一步及其图的状态行动价值预测.所以: 如果我在整个图上运行优化器,则必须重新计算状态行动值预测. 但是,如果我将预测(用于选定的动作)存储为变量,然后将其作为占位符将其馈送到优化器,则它不再具有计算梯度的必要图. 我不能仅仅在同一语句中运行所有内容,因为我必须放弃控制权并返回所选的行动,以获取下一个观察和奖励(用于损失的目标中功能). 所以,我有没有办法(不加强
14 2023-10-16
编程技术问答社区
Q-learning 和带有贪婪选择的 SARSA 是否等效?
Q学习和SARSA之间的差异是Q学习比较当前状态和最佳下一个状态,而SARSA将当前状态与实际下一个状态进行了比较. 如果使用了贪婪的选择策略,即100%的时间选择具有最高动作值的动作,则SARSA和Q学习是相同的? 解决方案 好吧,实际上不是. SARSA和Q学习之间的一个关键区别是SARSA是一种政策算法(它遵循学习的策略),而Q学习是一种非政策算法(它可以遵循任何策略(满足某些汇聚要求) . 请注意,在两种算法的以下伪代码中,SARSA选择'和s',然后更新Q功能; Q学习首先更新Q功能,并且在下一个迭代中选择了下一个要执行的操作,该操作是从更新的Q功能派生的,不一定等于选择的A'用于更新Q. . 在任何情况下,这两种算法都需要探索(即采取与贪婪动作不同的动作)进行收敛. SARSA和Q-Learning的伪代码是从Sutton和Barto的书中提取的:其他解决方案 如果我们仅使用贪婪的政策,那么就不会进行探索,因此学习将行不通.在Epsilon
26 2023-08-21
编程技术问答社区
OpenAI体育馆突围-拉姆-v4无法学习
我正在使用Q学习,并且该程序在尝试后应该能够玩游戏,但是即使Epsilon值为0.1,也没有学习. 我尝试更改批处理大小的内存大小.如果玩家死亡,我已经更改了代码以获得-1奖励. import gym import numpy as np import random import tensorflow as tf import numpy as np from time import time import keyboard import sys import time env = gym.make("Breakout-ram-v4") observationSpace = env.observation_space actionSpace= env.action_space episode = 500 class Model_QNN : def __init__(self): self.memory = [] self.
30 2023-08-07
编程技术问答社区
学习用DQN玩Curve Fever游戏的奖励功能
我制作了一个简单的曲线发烧版本,也称为" Achtung Die Kurve".我希望这台机器能够最佳地玩游戏.我从Atari游戏示例中复制并稍微修改了现有的DQN. 我很想找出适当的奖励功能.目前,我使用此奖励设置: 0.1对于每帧,它不会崩溃 每次崩溃的-500 这是正确的方法吗?我需要调整值吗?还是我需要完全不同的方法? 解决方案 -500的奖励会破坏您的网络.您应该将奖励扩展到1至-1之间的值. (还将输入图像缩放-1和1或0和1之间). 只要给您的网络坠毁而造成-1的奖励,一旦敌人崩溃,就会获得+1的奖励.没有敌人,撞车的奖励就足够了.在某些情况下,拥有少量的积极的生活奖励可能是有益的(例如,当网络必须在两次不可避免的崩溃之间决定一个会比另一个不可避免的崩溃更快的崩溃时),但这也将使学习Q功能更为复杂.您可以尝试有没有持续的奖励,看看什么最有效. 不可避免的崩溃的示例还表明了为什么您不应该使用少量的负面生活奖励.在这种情况下,网络将选择最快崩
在奖励总是-1的环境中,DQN是如何工作的?
鉴于Openai Gym环境 我的理解最终需要找到"稀疏的奖励".但是,据我所知/a>,除-1外,再也没有任何奖励.感觉更像是一个"无奖励"环境. 几乎可以回答我的问题的原因,但实际上没有:当任务快速完成时,返回(奖励之和)(奖励之和)较大.因此,如果汽车永远找不到标志,则回报为-1000.如果汽车很快找到国旗,则退货可能为-200.这没有回答我的问题的原因是因为有了DQN和经验重播,这些回报(-1000,-200)在体验重播记忆中永远不会出现.所有的内存都是形式的元素(状态,动作,奖励,next_state),当然请记住,将元素从内存中随机拉出,而不是逐个剧集. 这个特定的OpenAi健身房环境的另一个要素是,在两种情况下,完成的状态是返回的:击中标志(是的)或在某个步骤(boo)之后按时返回.但是,代理人对待两者都一样,接受-1的奖励.因此,就记忆中的元素而言,这两个事件从奖励的角度看着相同. 所以,我在内存中看不到任何表明该情节表现良好的任何内容. 因此,我
48 2023-08-07
编程技术问答社区
强化学习中依赖状态的行动集
人们如何处理不同州的法律行动不同的问题?就我而言,我总共有大约10项诉讼,法律诉讼并不是重叠,这意味着在某些州,相同的3个州始终是合法的,而在其他类型的州,这些州从来都不是合法的. 我也有兴趣看看如果法律诉讼重叠,解决方案是否会有所不同. 对于Q学习(我的网络为我提供了状态/行动对的值),我想也许我可以谨慎构建目标值时要选择哪个Q值. (即,我没有选择最大,而是在法律诉讼中选择最大...) 对于策略级的方法,我不确定适当的设置是什么.计算损失时,可以掩盖输出层吗? 解决方案 最近两年中有两项密切相关的作品: [1] Boutilier,Craig等. "通过随机行动集进行计划和学习." Arxiv预印型ARXIV:1805.02363(2018). [2] Chandak,Yash等. "强化学习何时所有动作并不总是可用." AAAI. 2020. 其他解决方案 当前这个问题似乎没有一个通用和直率的答案.也许是因为这不是问题? 您建议为
80 2023-08-07
编程技术问答社区
一个Q型学习代理的学习率
问题如何影响收敛率和收敛本身. 如果学习率是恒定的,Q函数是否会收敛到最佳或学习率必须衰减以确保收敛? 解决方案 学习率讲述了对解决方案采取的步骤的幅度. 不应该太大一个数字,因为它可能会不断振荡, 不应太小,否则会花费很多时间和迭代到达最小值. 学习率建议衰减的原因是因为最初是在解决方案空间中完全随机点时,我们需要向解决方案迈出很大的飞跃,后来我们接近它,我们进行小跳跃,因此最终达到了最小值. 类比可以作为:在 Golf的游戏中到洞.后来,当他到达标记区域时,他选择了另一种棍子来获得准确的短镜头. 这样,这并不是说他不能在不选择短射棒的情况下将球放入孔中,他可能会将球送到目标前两次或三次.但是,如果他最佳地发挥并使用适量的力量来到达孔,那将是最好的.腐烂的学习率也一样. 其他解决方案 学习率必须衰减,但不要太快. 收敛条件如下(对不起,没有乳胶): sum(alpha(t),1,inf)= inf sum(alpha(t)^2,1,i
34 2023-08-07
编程技术问答社区
贪婪的Q学习中的Epsilon和学习率的衰减
我知道,伊普西隆(Epsilon)标志着勘探和剥削之间的权衡.一开始,您希望Epsilon变得很高,以便您取得突飞猛进并学习东西.当您了解未来的奖励时,Epsilon应该衰落,以便您可以利用自己发现的更高的Q值. 但是,我们的学习率是否在随机环境中会随着时间的流逝而衰减?关于我看到的帖子,我只讨论epsilon衰减. 我们如何设置epsilon和alpha,以使值收敛? 解决方案 一开始,您希望Epsilon变得很高,以便您取得大飞跃并学习东西 我认为您误认为Epsilon和学习率.该定义实际上与学习率有关. 学习率衰减 学习率是您在寻找最佳政策方面的飞跃.用简单的qlearning术语来看,您正在使用每个步骤更新Q值的数量. 更高的 alpha 意味着您正在大步更新Q值.当代理商学习时,您应该衰减以稳定您的模型输出,最终会收敛到最佳策略. epsilon decay 当我们在已经拥有的Q值上选择特定动作基础时,使用 Epsilo
764 2023-08-07
编程技术问答社区
Q-学习值变得太高
我最近尝试在Golang中实现基本的Q学习算法.请注意,我是强化学习的新手和AI的新手,因此错误很可能是我的. 这是我如何实现M,N,K-Game环境的解决方案: 在每个给定的时间t中,代理人持有最后的州行动(s, a),并为其持有获得的奖励;代理商根据Epsilon-Greedy策略选择了MOVE a'并计算奖励r,然后继续更新时间Q(s, a)的值Q(s, a) func (agent *RLAgent) learn(reward float64) { var mState = marshallState(agent.prevState, agent.id) var oldVal = agent.values[mState] agent.values[mState] = oldVal + (agent.LearningRate * (agent.prevScore + (agent.DiscountFactor * reward) -
18 2023-08-07
编程技术问答社区
在机器学习中,不兼容的数组类型在前向输入(LinearFunction)中被混合。
我已经使用Chanier训练了一个深Q学习模型: class Q_Network (chainer.Chain): def __init__(self, input_size, hidden_size, output_size): super (Q_Network, self).__init__ ( fc1=L.Linear (input_size, hidden_size), fc2=L.Linear (hidden_size, hidden_size), fc3=L.Linear (hidden_size, output_size) ) def __call__(self, x): h = F.relu (self.fc1 (x)) h = F.relu
36 2023-04-14
编程技术问答社区
将Q-learning推广到连续*行动*空间的工作中去
我正在尝试获得一个代理人学习在加强学习设置中最佳地执行一些任务所需的鼠标移动(即奖励信号是学习的唯一反馈). 我希望使用Q学习技术,但是在我发现一种将这种方法扩展到连续状态空间的方法,我似乎无法弄清楚如何容纳连续动作空间的问题. 我只能强制所有鼠标运动都有一定幅度,并且只有一定数量的不同方向,但是制造行动离散的任何合理方式都会产生巨大的动作空间.由于标准Q-Learning要求代理评估所有可能的动作,因此这种近似并不能在任何实际意义上解决问题. 解决方案 处理此问题的常见方法是演员 - 批评方法.这些自然地延伸到连续动作空间.然而,基本Q-Learning可以在使用近似时发散,但如果您仍然想要使用它,则可以尝试将其与自组织地图相结合,如"自组织地图的应用"".本文还包含您可能会发现有用的一些进一步的参考.
C++问题 在Hashable中存储数组
我目前正在研究如何通过使用 Q-learning 算法来帮助代理获得奖励来实现一个 C++ 程序. 我正在尝试使用 Hashtable 来存储我的状态和操作.我对C++编程不熟悉... 我想做的就像使用哈希表来存储数组.但我找不到正确的存储方式...哈希表说它是数组的错误类型. using namespace std; int state[2] = {0,0}; unordered_map hashtable; hashtable.emplace("State1", state); cout
1324 2022-07-17
编程技术问答社区