Q学习如何与强化学习中的价值迭代不同?我知道Q学习是无模型的,训练样本是过渡(s, a, s', r).但是,既然我们知道Q学习中每次转换的过渡和奖励,那么它与基于模型的学习不同,我们知道状态和动作对的奖励,以及来自州的每个动作的转换(无论如何)随机的还是确定的)?我不明白其中的区别.
artificial-intelligence machine-learning reinforcement-learning q-learning
我正在大学里学习一门名为"智能机器"的课程.我们介绍了3种强化学习方法,并且我们给出了直接使用它们的直觉,并引用:
是否有任何好的例子说明何时选择一种方法而不是另一种方法?
machine-learning reinforcement-learning temporal-difference q-learning
我正在尝试从原始资源Andrej Karpathy Blog中重新创建非常简单的Policy Gradient示例。在该文章中,您将找到带有CartPole和Policy Gradient以及重量和Softmax激活列表的示例。这是我重新创建的非常简单的CartPole政策梯度示例,效果很好。
import gym
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
import copy
NUM_EPISODES = 4000
LEARNING_RATE = 0.000025
GAMMA = 0.99
# noinspection PyMethodMayBeStatic
class Agent:
def __init__(self):
self.poly = PolynomialFeatures(1)
self.w = np.random.rand(5, 2)
def policy(self, state):
z = state.dot(self.w)
exp = np.exp(z)
return exp/np.sum(exp)
def __softmax_grad(self, softmax):
s = softmax.reshape(-1,1)
return np.diagflat(s) - np.dot(s, s.T)
def grad(self, probs, action, state):
dsoftmax = self.__softmax_grad(probs)[action,:]
dlog = …Run Code Online (Sandbox Code Playgroud) python math machine-learning reinforcement-learning deep-learning
我知道Q学习算法应该尝试在探索和利用之间取得平衡.由于我是这个领域的初学者,我想实现一个简单版本的探索/开发行为.
最佳epsilon值我的实现使用了ε-greedy策略,但在决定epsilon值时我很茫然.ε应该由算法访问给定(状态,动作)对的次数限制,还是应该由执行的迭代次数限制?
我的建议:非常感激!
我一直在寻找一个实现强化学习算法的C++库,但对结果并不是很满意.
我从TU Graz 找到了Reinforcement Learning Toolbox 2.0,但不幸的是这个项目很老了,我无法编译.
还有来自Hado van Hasselt的代码.它看起来很有希望,但似乎没有积极维护.
您在C++中使用哪些库进行强化学习?
我正在研究这个SARSA-Lambda实现(即:具有资格跟踪的SARSA),还有一个我仍然没有得到的细节.

(图片来自http://webdocs.cs.ualberta.ca/~sutton/book/ebook/node77.html)
所以我理解所有Q(s,a)都是更新的,而不仅仅是代理为给定时间步长选择的Q(s,a).我也理解E矩阵在每集开头都没有重置.
让我们假设一分钟图7.12的面板3是第1集的结束状态.
在第2集开始时,代理人向北而不是向东移动,让我们假设这给它奖励-500.这不会影响前一集中访问过的所有州吗?
如果想要奖励那些在当前剧集中被访问过的状态,那么为什么在每集开头都没有重置包含所有e(s,a)值的矩阵?看起来在这个实现中,在上一集中访问过的状态对于代理在这一新剧集中所做的动作是"惩罚"或"奖励".
我正在尝试在 openAI 健身房的一款游戏上实现 DQL 模型。但它给了我以下错误。
TypeError: len 没有为符号张量很好地定义。(activation_3/Identity:0) 请致电
x.shape而不是len(x)获取形状信息。
营造健身房环境:
ENV_NAME = 'CartPole-v0'
env = gym.make(ENV_NAME)
np.random.seed(123)
env.seed(123)
nb_actions = env.action_space.n
Run Code Online (Sandbox Code Playgroud)
我的模型看起来像这样:
model = Sequential()
model.add(Flatten(input_shape=(1,) + env.observation_space.shape))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(nb_actions))
model.add(Activation('linear'))
print(model.summary())
Run Code Online (Sandbox Code Playgroud)
将该模型拟合到来自 keral-rl 的 DQN 模型,如下所示:
policy = EpsGreedyQPolicy()
memory = SequentialMemory(limit=50000, window_length=1)
dqn = DQNAgent(model=model, nb_actions=nb_actions, memory=memory, nb_steps_warmup=10, target_model_update=0.001, policy=policy)
dqn.compile(Adam(lr=1e-3), metrics=['mse', 'mae'])
dqn.fit(env, nb_steps=5000, visualize=False, verbose=3)
Run Code Online (Sandbox Code Playgroud)
错误来自这一行:
dqn = DQNAgent(model=model, nb_actions=nb_actions, memory=memory, nb_steps_warmup=10, target_model_update=0.001, policy=policy)
Run Code Online (Sandbox Code Playgroud)
我正在使用 keras-rl==0.4.2 和 tensorflow==2.1.0。根据其他答案,我也尝试了 tensorflow==2.0.0-beta0 但它没有解决错误。
有人可以向我解释为什么我面临这个错误吗?以及如何解决? …
该代码的构建如下:我的机器人拍摄一张照片,一些 tf 计算机视觉模型计算目标对象在图片中的起始位置。该信息(x1 和 x2 坐标)被传递到 pytorch 模型。它应该学会预测正确的运动激活,以便更接近目标。执行运动后,机器人再次拍照,tf cv 模型应计算电机激活是否使机器人更接近所需状态(x1 为 10,x2 坐标为 at31)
然而,每次我运行代码时,pytorch 都无法计算梯度。
我想知道这是否是某种数据类型问题,或者是否是一个更普遍的问题:如果不直接从 pytorch 网络的输出计算损失,是否无法计算梯度?
任何帮助和建议将不胜感激。
#define policy model (model to learn a policy for my robot)
import torch
import torch.nn as nn
import torch.nn.functional as F
class policy_gradient_model(nn.Module):
def __init__(self):
super(policy_gradient_model, self).__init__()
self.fc0 = nn.Linear(2, 2)
self.fc1 = nn.Linear(2, 32)
self.fc2 = nn.Linear(32, 64)
self.fc3 = nn.Linear(64,32)
self.fc4 = nn.Linear(32,32)
self.fc5 = nn.Linear(32, 2)
def forward(self,x):
x = self.fc0(x)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x)) …Run Code Online (Sandbox Code Playgroud) python gradient reinforcement-learning deep-learning pytorch
我最近一直致力于一个使用神经网络进行虚拟机器人控制的项目.我使用tensorflow对其进行编码并且运行顺畅.到目前为止,我使用顺序模拟来评估神经网络有多好,但是,我想并行运行多个模拟以减少获取数据所需的时间.
要做到这一点,我正在导入python的multiprocessing包.最初我将sess变量(sess=tf.Session())传递给一个运行模拟的函数.但是,一旦我找到使用此sess变量的任何语句,该进程将退出而不会发出警告.摸索了一会儿后,我发现这两个职位:
Tensorflow:传递会话的蟒蛇多进程
,并同时运行多个tensorflow会议
虽然它们高度相关,但我还是无法弄清楚如何使其发挥作用.我尝试为每个单独的过程创建一个会话,并将神经网络的权重分配给它的可训练参数,但没有成功.我也尝试将会话保存到文件中,然后在一个进程中加载它,但也没有运气.
有人能够将会话(或会话克隆)传递给多个进程吗?
谢谢.
python parallel-processing multiprocessing reinforcement-learning tensorflow
编辑(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
python ×4
q-learning ×4
tensorflow ×3
c++ ×1
gradient ×1
keras ×1
keras-rl ×1
math ×1
pytorch ×1
sarsa ×1