标签: reinforcement-learning

Q学习与价值迭代的区别

Q学习如何与强化学习中的价值迭代不同?我知道Q学习是无模型的,训练样本是过渡(s, a, s', r).但是,既然我们知道Q学习中每次转换的过渡和奖励,那么它与基于模型的学习不同,我们知道状态和动作对的奖励,以及来自州的每个动作的转换(无论如何)随机的还是确定的)?我不明白其中的区别.

artificial-intelligence machine-learning reinforcement-learning q-learning

20
推荐指数
3
解决办法
1万
查看次数

Q学习与时间差异与基于模型的强化学习

我正在大学里学习一门名为"智能机器"的课程.我们介绍了3种强化学习方法,并且我们给出了直接使用它们的直觉,并引用:

  1. Q-Learning - 无法解决MDP的最佳选择.
  2. 时间差异学习 - 当MDP已知或可以学习但无法解决时最佳.
  3. 基于模型 - 在无法学习MDP时最佳.

是否有任何好的例子说明何时选择一种方法而不是另一种方法?

machine-learning reinforcement-learning temporal-difference q-learning

20
推荐指数
1
解决办法
1万
查看次数

了解渐变策略派生

我正在尝试从原始资源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

18
推荐指数
1
解决办法
390
查看次数

最佳epsilon(ε-贪婪)值

ε-贪婪的政策

我知道Q学习算法应该尝试在探索利用之间取得平衡.由于我是这个领域的初学者,我想实现一个简单版本的探索/开发行为.

最佳epsilon值

我的实现使用了ε-greedy策略,但在决定epsilon值时我很茫然.ε应该由算法访问给定(状态,动作)对的次数限制,还是应该由执行的迭代次数限制?

我的建议:
  1. 每次遇到给定(状态,动作)对时,降低epsilon值.
  2. 执行完整迭代后降低epsilon值.
  3. 每次遇到状态s时降低epsilon值.

非常感激!

machine-learning reinforcement-learning q-learning

16
推荐指数
1
解决办法
2万
查看次数

C++强化学习库

我一直在寻找一个实现强化学习算法的C++库,但对结果并不是很满意.

我从TU Graz 找到了Reinforcement Learning Toolbox 2.0,但不幸的是这个项目很老了,我无法编译.

还有来自Hado van Hasselt的代码.它看起来很有希望,但似乎没有积极维护.

您在C++中使用哪些库进行强化学习?

c++ machine-learning reinforcement-learning

15
推荐指数
1
解决办法
7257
查看次数

资格跟踪SARSA-Lambda实施中的剧集之间的重新初始化

我正在研究这个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)值的矩阵?看起来在这个实现中,在上一集中访问过的状态对于代理在这一新剧集中所做的动作是"惩罚"或"奖励".

machine-learning reinforcement-learning sarsa

15
推荐指数
1
解决办法
2473
查看次数

TypeError: len 没有为符号张量很好地定义。(activation_3/Identity:0) 请调用 `x.shape` 而不是 `len(x)` 获取形状信息

我正在尝试在 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 但它没有解决错误。

有人可以向我解释为什么我面临这个错误吗?以及如何解决? …

python reinforcement-learning keras tensorflow keras-rl

15
推荐指数
1
解决办法
5645
查看次数

Pytorch RuntimeError:张量的元素 0 不需要 grad 并且没有 grad_fn

该代码的构建如下:我的机器人拍摄一张照片,一些 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

15
推荐指数
3
解决办法
8万
查看次数

Tensorflow和Multiprocessing:传递会话

我最近一直致力于一个使用神经网络进行虚拟机器人控制的项目.我使用tensorflow对其进行编码并且运行顺畅.到目前为止,我使用顺序模拟来评估神经网络有多好,但是,我想并行运行多个模拟以减少获取数据所需的时间.

要做到这一点,我正在导入python的multiprocessing包.最初我将sess变量(sess=tf.Session())传递给一个运行模拟的函数.但是,一旦我找到使用此sess变量的任何语句,该进程将退出而不会发出警告.摸索了一会儿后,我发现这两个职位: Tensorflow:传递会话的蟒蛇多进程 ,并同时运行多个tensorflow会议

虽然它们高度相关,但我还是无法弄清楚如何使其发挥作用.我尝试为每个单独的过程创建一个会话,并将神经网络的权重分配给它的可训练参数,但没有成功.我也尝试将会话保存到文件中,然后在一个进程中加载​​它,但也没有运气.

有人能够将会话(或会话克隆)传递给多个进程吗?

谢谢.

python parallel-processing multiprocessing reinforcement-learning tensorflow

14
推荐指数
2
解决办法
1万
查看次数

如何使用Tensorflow Optimizer而不重新计算在每次迭代后返回控制的强化学习程序中的激活?

编辑(1/3/16):相应的github问题

我正在使用Tensorflow(Python接口)来实现一个q-learning代理,其函数逼近使用随机梯度下降进行训练.在实验的每次迭代中,调用代理中的步骤函数,其基于新的奖励和激活来更新近似器的参数,然后选择要执行的新动作.

这是问题(加强学习术语):

  • 代理计算其状态 - 动作值预测以选择动作.
  • 然后控制另一个程序,它模拟环境中的一个步骤.
  • 现在调用代理程序的step函数进行下一次迭代.我想使用Tensorflow的Optimizer类为我计算渐变.但是,这需要我计算最后一步的状态 - 动作值预测和它们的图形.所以:
    • 如果我在整个图上运行优化器,那么它必须重新计算状态 - 动作值预测.
    • 但是,如果我将预测(对于所选操作)存储为变量,然后将其作为占位符提供给优化器,则它不再具有计算渐变所需的图形.
    • 我不能只在同一个sess.run()语句中运行它,因为我必须放弃控制并返回所选的动作以获得下一个观察和奖励(在目标中使用损失函数) .

那么,有没有办法可以(没有强化学习行话):

  1. 计算我的图形的一部分,返回value1.
  2. 将value1返回给调用程序以计算value2
  3. 在下一次迭代中,使用value2作为渐变下降的损失函数的一部分,而不重新计算计算value1的图形部分.

当然,我考虑过明显的解决方案:

  1. 只需对渐变进行硬编码:对于我现在使用的非常简单的逼近器来说这很容易,但如果我在一个大的卷积网络中尝试不同的滤波器和激活函数,那将非常不方便.如果可能的话,我真的很想使用Optimizer类.

  2. 从代理内部调用环境模拟: 这个系统做到了这一点,但它会使我更复杂,并删除了很多模块化和结构.所以,我不想这样做.

我已多次阅读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

13
推荐指数
1
解决办法
2781
查看次数