虽然我知道SARSA是在政策上,而Q-learning是不合时宜的,但在查看他们的公式时,很难(对我而言)看到这两种算法之间存在任何差异.
根据" 强化学习:引言"(Sutton和Barto)一书.在SARSA算法中,给定策略,相应的动作值函数Q(在状态s和动作a,在时间步t),即Q(s t,a t),可以更新如下
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)+α*(r t +γ*max a …
artificial-intelligence reinforcement-learning q-learning sarsa
我正在尝试让代理人学习在强化学习环境中最好地执行某些任务所必需的鼠标移动(即奖励信号是学习的唯一反馈).
我希望使用Q学习技术,但是当我找到一种方法将这种方法扩展到连续状态空间时,我似乎无法弄清楚如何适应连续动作空间的问题.
我可以强迫所有鼠标移动到一定幅度并且只在一定数量的不同方向上移动,但是使动作离散的任何合理方式都会产生巨大的动作空间.由于标准Q学习需要代理评估所有可能的动作,因此这种近似并不能解决任何实际意义上的问题.
algorithm machine-learning reinforcement-learning q-learning
深层强化学习和强化学习有什么区别?我基本上都知道强化学习是什么,但在这种背景下,具体术语深刻的含义是什么?
Q学习如何与强化学习中的价值迭代不同?我知道Q学习是无模型的,训练样本是过渡(s, a, s', r).但是,既然我们知道Q学习中每次转换的过渡和奖励,那么它与基于模型的学习不同,我们知道状态和动作对的奖励,以及来自州的每个动作的转换(无论如何)随机的还是确定的)?我不明白其中的区别.
artificial-intelligence machine-learning reinforcement-learning q-learning
我正在大学里学习一门名为"智能机器"的课程.我们介绍了3种强化学习方法,并且我们给出了直接使用它们的直觉,并引用:
是否有任何好的例子说明何时选择一种方法而不是另一种方法?
machine-learning reinforcement-learning temporal-difference q-learning
我尝试熟悉Q-learning和Deep Neural Networks,目前尝试使用Deep Reinforcement Learning实现Play Atari.
为了测试我的实现并玩它,我试着尝试一个简单的gridworld.我有一个N x N网格,从左上角开始,在右下角结束.可能的操作是:向左,向上,向右,向下.
即使我的实现与此非常相似(希望它是一个好的),它似乎似乎没有学到任何东西.看看它需要完成的总步数(我猜平均值将达到500,网格大小为10x10,但也有非常低和高的值),它对我来说比其他任何东西都更随机.
我尝试使用和不使用卷积层并使用所有参数,但说实话,我不知道我的实现是否有问题或需要更长时间训练(我让它训练了很长时间)或者什么永远.但至少它接缝会聚,这里是一个训练课程的损失值的情节:
那么这种情况下的问题是什么?
但也可能更重要的是我如何"调试"这个Deep-Q-Nets,在监督培训中有训练,测试和验证集,例如精确和召回,可以对它们进行评估.对于使用Deep-Q-Nets的无监督学习,我有哪些选择,以便下次我可以自己修复它?
最后这里是代码:
这是网络:
ACTIONS = 5
# Inputs
x = tf.placeholder('float', shape=[None, 10, 10, 4])
y = tf.placeholder('float', shape=[None])
a = tf.placeholder('float', shape=[None, ACTIONS])
# Layer 1 Conv1 - input
with tf.name_scope('Layer1'):
W_conv1 = weight_variable([8,8,4,8])
b_conv1 = bias_variable([8])
h_conv1 = tf.nn.relu(conv2d(x, W_conv1, 5)+b_conv1)
# Layer 2 Conv2 - hidden1
with tf.name_scope('Layer2'):
W_conv2 = weight_variable([2,2,8,8])
b_conv2 = bias_variable([8])
h_conv2 = tf.nn.relu(conv2d(h_conv1, W_conv2, 1)+b_conv2) …Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用"深度Q学习"来构建模型,其中我有大量的动作(2908).在使用标准DQN取得了一些有限的成功之后:(https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf),我决定做更多的研究,因为我认为动作空间太大了有效的探索.
然后我发现了这篇论文:https://arxiv.org/pdf/1512.07679.pdf,他们使用演员评论模型和政策渐变,然后引导我:https://arxiv.org/pdf/1602.01783.pdf他们使用政策梯度来获得比DQN更好的结果.
我找到了一些他们在Keras实施政策梯度的网站,https : //yanpanlau.github.io/2016/10/11/Torcs-Keras.html 和https://oshearesearch.com/index.php/ 2016/06/14/kerlym-a-deep-reinforcement-learning-toolbox-in-keras /但是我很困惑它们是如何实现的.在前者(当我阅读论文时)似乎不是为演员网络提供输入和输出对,而是为所有权重提供渐变,然后使用网络来更新它,而在后者中他们只计算输入 - 输出对.
我只是困惑自己吗?我应该通过提供输入 - 输出对来训练网络并使用标准的"适合",还是我必须做一些特别的事情?如果是后者,我如何使用Theano后端进行操作?(上面的例子使用TensorFlow).
我知道Q学习算法应该尝试在探索和利用之间取得平衡.由于我是这个领域的初学者,我想实现一个简单版本的探索/开发行为.
最佳epsilon值我的实现使用了ε-greedy策略,但在决定epsilon值时我很茫然.ε应该由算法访问给定(状态,动作)对的次数限制,还是应该由执行的迭代次数限制?
我的建议:非常感激!
编辑(1/3/16):相应的github问题
我正在使用Tensorflow(Python接口)来实现一个q-learning代理,其函数逼近使用随机梯度下降进行训练.在实验的每次迭代中,调用代理中的步骤函数,其基于新的奖励和激活来更新近似器的参数,然后选择要执行的新动作.
这是问题(加强学习术语):
那么,有没有办法可以(没有强化学习行话):
当然,我考虑过明显的解决方案:
只需对渐变进行硬编码:对于我现在使用的非常简单的逼近器来说这很容易,但如果我在一个大的卷积网络中尝试不同的滤波器和激活函数,那将非常不方便.如果可能的话,我真的很想使用Optimizer类.
从代理内部调用环境模拟: 这个系统做到了这一点,但它会使我更复杂,并删除了很多模块化和结构.所以,我不想这样做.
我已多次阅读API和白皮书,但似乎无法提出解决方案.我试图想出一些方法将目标输入图形来计算梯度,但是无法想出一种自动构建图形的方法.
如果事实证明这在TensorFlow中是不可能的,你认为将它作为一个新的运算符来实现它会非常复杂吗?(我在几年内没有使用C++,所以TensorFlow源看起来有点令人生畏.)或者我会更好地切换到像Torch这样具有强制性差异Autograd,而不是象征性差异的东西?
感谢您抽出宝贵时间帮助我解决这个问题.我试图尽可能地简洁.
编辑:在做了一些进一步的搜索后,我遇到了这个先前提出的问题.它与我的有点不同(他们试图避免在Torch的每次迭代中两次更新LSTM网络),并且还没有任何答案.
如果有帮助,这里有一些代码:
'''
-Q-Learning agent for a grid-world environment.
-Receives input as raw rbg pixel representation of screen.
-Uses an artificial neural network function approximator with one hidden layer
2015 Jonathon Byrd
'''
import random
import sys
#import copy
from rlglue.agent.Agent import Agent
from rlglue.agent import AgentLoader as AgentLoader …Run Code Online (Sandbox Code Playgroud) machine-learning reinforcement-learning q-learning tensorflow
我试图在我写的一个简单的游戏中实现Q-learning.该游戏基于玩家必须"跳跃"以避免迎面而来的盒子.
我设计了两个动作系统; jump并且do_nothing状态是距下一个区块的距离(划分和覆盖以确保没有大量状态).
我的问题似乎是我的算法实现没有考虑"未来的奖励",所以它最终在错误的时间跳跃.
这是我对Q学习算法的实现;
JumpGameAIClass.prototype.getQ = function getQ(state) {
if (!this.Q.hasOwnProperty(state)) {
this.Q[state] = {};
for (var actionIndex = 0; actionIndex < this.actions.length; actionIndex++) {
var action = this.actions[actionIndex];
this.Q[state][action] = 0;
}
}
return this.Q[state];
};
JumpGameAIClass.prototype.getBlockDistance = function getBlockDistance() {
var closest = -1;
for (var blockIndex = 0; blockIndex < this.blocks.length; blockIndex++) {
var block = this.blocks[blockIndex];
var distance = block.x - this.playerX;
if (distance >= 0 && (closest === -1 || distance …Run Code Online (Sandbox Code Playgroud)