算法与伽玛值大或小的差异有什么不同?在我的视觉中,只要它既不是0或1,它应该完全相同.另一方面,无论我选择什么样的伽玛,看起来Qvalues都非常快地接近于零(我在这里的值大约是10 ^ -300,只是在快速测试中).通常人们如何绘制Qvalues(我正在为这个问题绘制一个(x,y,最佳QValue)?我试图用对数来解决这个问题,但即便如此,感觉有点尴尬.
另外,我不知道Q学习更新功能中有和alpha参数背后的原因是什么.它基本上设置了我们要对Q值函数进行更新的幅度.我认为它通常会随着时间的推移而减少.让它随着时间的推移减少有什么兴趣?一开始的更新值应该比以后的1000集更重要吗?
此外,我认为每次代理不想做贪婪行动时探索状态空间的好主意是探索任何仍然具有零QValue的状态(这意味着,至少在大多数时候,一个前所未有的国家),但我没有看到任何文献中提到的那个.这有什么缺点吗?我知道这不能与(至少一些)泛化函数一起使用.
其他想法是保留一个访问状态/操作表,并尝试执行在该状态之前尝试次数较少的操作.当然,这只能在相对较小的状态空间中完成(在我的情况下,这绝对是可能的).
在探索过程的最后阶段,第三个想法是不仅要查看选定的行动以寻找最佳的q值,还要查看所有可能的行动和状态,然后查看其他状态等等.
我知道这些问题有点无关,但我想听听之前有过这方面工作的人的意见,并且(可能)也与其中一些人挣扎过.
language-agnostic artificial-intelligence reinforcement-learning
我想使用这个 q-learning(强化学习)代码。看起来代码是正确的,但我收到错误,我不知道为什么:
function q=ReinforcementLearning
clc;
format short;
format compact;
int state=0;
R= [-inf,-inf,-inf,-inf, 0,-inf;
-inf,-inf,-inf, 0,-inf, 100;
-inf,-inf,-inf, 0,-inf,-inf;
-inf, 0, 0,-inf, 0,-inf;
0,-inf,-inf, 0,-inf, 100;
-inf, 0,-inf,-inf, 0, 100];
gamma=0.8;
q=zero(size(R));
q1=one(size(R))*inf;
count=0;
for episode = 0:20000;
y=randperm(size(R,1));
state=y(1);
x=find(R(state,:)>=0);
if size(x,1)>0,
x1=RandomPermutation(x);
x1=x1(1);
end
qMax=max(q,[],2);
q(state,x1)=R(state,x1)+ gamma* qMax(x1);
int state=x1;
if sum(sum(abs(q1-q)))<0.0001 && sum(sum(q>0))
if count > 1000;
break
else
count=count+1;
end
else
q1=q;
count=0;
end
end
Run Code Online (Sandbox Code Playgroud)
但我收到以下警告和错误:
enter code here
Warning: The method char/int will be removed …Run Code Online (Sandbox Code Playgroud) 我试图建立一个利用强化学习的神经网络.我选择了scikit-neuralnetwork作为库(因为它很简单).看起来,两次装配会使Theano崩溃.
这是导致崩溃的最简单的代码(注意,它与哪些层无关,学习率或n_iter也不重要):
import numpy as np
from sknn.mlp import Classifier, Layer
clf = Classifier(
layers=[
Layer("Softmax")
],
learning_rate=0.001,
n_iter=1)
clf.fit(np.array([[0.]]), np.array([[0.]])) # Initialize the network for learning
X = np.array([[-1.], [1.]])
Y = np.array([[1.], [0.]])
clf.fit(X, Y) # crash
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
ValueError: Input dimension mis-match. (input[0].shape[1] = 2, input[1].shape[1] = 1)
Apply node that caused the error: Elemwise{Mul}[(0, 1)](y, LogSoftmax.0)
Toposort index: 12
Inputs types: [TensorType(float64, matrix), TensorType(float64, matrix)]
Inputs shapes: [(1L, 2L), (1L, 1L)]
Inputs strides: [(16L, 8L), (8L, 8L)] …Run Code Online (Sandbox Code Playgroud) 我想在CartPole-v0不打开渲染窗口的情况下访问 OpenAI 健身房环境中的原始像素。我该怎么做呢?
示例代码:
import gym
env = gym.make("CartPole-v0")
env.reset()
img = env.render(mode='rgb_array', close=True) # Returns None
print(img)
img = env.render(mode='rgb_array', close=False)
# Opens annoying window, but gives me the array that I want
print(img.shape)
Run Code Online (Sandbox Code Playgroud)
附注。我很难为 OpenAI 健身房找到好的文档。它只是我,还是根本不存在?
编辑:我不需要打开渲染视频。
我正在尝试实现一个 Q 学习代理来学习在井字游戏中与随机代理对战的最佳策略。
我制定了一个我相信会奏效的计划。只有一个部分我无法理解。这是因为环境中有两个玩家。
现在,Q Learning 代理应该对当前状态s采取行动,给定一些策略采取a的行动,给定动作的连续状态s',以及从该连续状态收到的任何奖励,r。
让我们把它放到一个元组中 (s, a, r, s')
现在通常一个代理会对它在给定动作中遇到的每个状态采取行动,并使用 Q 学习方程来更新前一个状态的值。
然而,由于 Tic Tac Toe 有两个玩家,我们可以将状态集分成两个。一组状态可以是学习代理开始采取行动的状态。另一组状态可以是对手开始行动的地方。
那么,我们是否需要将状态一分为二?或者学习代理是否需要更新游戏中访问的每个状态?
I feel as though it should probably be the latter, as this might affect updating Q Values for when the opponent wins the game.
Any help with this would be great, as there does not seem to be anything online that helps with my predicament.
[注意我正在使用xvfb-run -s "-screen 0 1400x900x24" jupyter notebook]
我尝试在OpenAI Gym中运行一组基本命令
import gym
env = gym.make("CartPole-v0")
obs = env.reset()
env.render()
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
...
~/Downloads/yes/lib/python3.7/site-packages/pyglet/gl/__init__.py in <module>()
225 else:
226 from .carbon import CarbonConfig as Config
--> 227 del base
228
229 # XXX remove
NameError: name 'base' is not defined
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能解决此问题?
我创建了一个自定义的 openai 健身房环境,其中包含离散的动作空间和稍微复杂的状态空间。状态空间被定义为元组,因为它结合了一些连续的维度和其他离散的维度:
import gym
from gym import spaces
class CustomEnv(gym.Env):
def __init__(self):
self.action_space = spaces.Discrete(3)
self.observation_space = spaces.Tuple((spaces.Discrete(16),
spaces.Discrete(2),
spaces.Box(0,20000,shape=(1,)),
spaces.Box(0,1000,shape=(1,)))
...
Run Code Online (Sandbox Code Playgroud)
我很幸运地使用 keras-rl(特别是 DQNAgent)训练了一个代理,但是 keras-rl 的支持不足且文档很少。对于可以处理此类观察空间的强化学习包有什么建议吗?目前看来 openai 基线和 stable-baselines 都无法处理它。
或者,是否有一种不同的方式可以定义我的状态空间,以便将我的环境适应这些定义更好的包之一?
python machine-learning reinforcement-learning openai-gym keras-rl
我正在尝试使用 tf_agents 库通过批量学习来训练 DDPG 代理。但是,我需要定义一个 Observation_spec 和 action_spec,它们说明代理将接收到的张量的形状。我设法创建了可以提供数据的轨迹,但是这些轨迹和代理本身的形状不匹配
我尝试使用代理定义更改观察和操作规范。这是我的代理定义:
observation_spec = TensorSpec(shape = (1,),dtype = tf.float32)
time_step_spec = time_step.time_step_spec(observation_spec)
action_spec = BoundedTensorSpec([1],tf.float32,minimum = -100, maximum = 100)
actor_network = ActorNetwork(
input_tensor_spec=observation_spec,
output_tensor_spec=action_spec,
fc_layer_params=(100,200,100),
name="ddpg_ActorNetwork"
)
critic_net_input_specs = (observation_spec, action_spec)
critic_network = CriticNetwork(
input_tensor_spec=critic_net_input_specs,
observation_fc_layer_params=(200,100),
joint_fc_layer_params=(100,200),
action_fc_layer_params=None,
name="ddpg_CriticNetwork"
)
agent = ddpg_agent.DdpgAgent(
time_step_spec=time_step_spec,
action_spec=action_spec,
actor_network=actor_network,
critic_network=critic_network,
actor_optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
critic_optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)
)
Run Code Online (Sandbox Code Playgroud)
这就是轨迹的样子
Trajectory(step_type=<tf.Variable 'Variable:0' shape=(1, 2) dtype=int32, numpy=array([[0, 1]], dtype=int32)>, observation=<tf.Variable 'Variable:0' shape=(1, 2) dtype=int32, numpy=array([[280, 280]], dtype=int32)>, action=<tf.Variable 'Variable:0' shape=(1, …Run Code Online (Sandbox Code Playgroud) 我在自定义环境中训练了 Ray-RLlib PPOTrainer。如何评估特定州的政策?
完整示例:
from ray.rllib.agents.ppo import PPOTrainer
from cust_env.envs import CustEnv
from ray.tune.logger import pretty_print
ray.init()
config = ppo.DEFAULT_CONFIG.copy()
config["num_workers"] = 2
config["eager"] = False
config["output"] = 'tmp/debug/'
trainer = PPOTrainer(config=config, env=TravelEnv)
# Can optionally call trainer.restore(path) to load a checkpoint.
for i in range(101):
result = trainer.train()
if i % 10 == 0:
print(pretty_print(result))
Run Code Online (Sandbox Code Playgroud)
有没有一种方法,如下所示,我可以在给定状态下返回最佳操作?
policy = trainer.get_policy()
optimal_action_at_state_S = policy.get_optimal_action(S)
Run Code Online (Sandbox Code Playgroud)
该函数policy.compute_actions( )似乎从随机策略中返回随机样本,而不是最优操作。
我目前正在尝试从具有连续动作空间的 openAi 健身房环境中解决 Pendulum-v0。因此,我需要使用正态分布来对我的行为进行采样。我不明白的是 log_prob 使用时的维度:
import torch
from torch.distributions import Normal
means = torch.tensor([[0.0538],
[0.0651]])
stds = torch.tensor([[0.7865],
[0.7792]])
dist = Normal(means, stds)
a = torch.tensor([1.2,3.4])
d = dist.log_prob(a)
print(d.size())
Run Code Online (Sandbox Code Playgroud)
我期待一个大小为 2 的张量(每个动作一个 log_prob),但它输出一个大小为(2,2)的张量。
但是,当对离散环境使用分类分布时,log_prob 具有预期大小:
logits = torch.tensor([[-0.0657, -0.0949],
[-0.0586, -0.1007]])
dist = Categorical(logits = logits)
a = torch.tensor([1, 1])
print(dist.log_prob(a).size())
Run Code Online (Sandbox Code Playgroud)
给我一个大小为(2)的张量。
为什么正态分布的 log_prob 大小不同?
python ×5
openai-gym ×3
keras-rl ×1
matlab ×1
pytorch ×1
q-learning ×1
ray ×1
scikit-learn ×1
tensor ×1
tensorflow ×1
tic-tac-toe ×1