我一直在尝试实现这里描述的算法,然后在同一篇论文中描述的"大动作任务"上测试它.
算法概述:

简而言之,该算法使用下面所示形式的RBM通过改变其权重来解决强化学习问题,使得网络配置的自由能等于为该状态动作对给出的奖励信号.
为了选择动作,算法在保持状态变量固定的同时执行gibbs采样.有足够的时间,这会产生具有最低自由能的动作,因此是给定状态的最高奖励.
大型行动任务概述:

作者的实施指南概述:
具有13个隐藏变量的受限Boltzmann机器在具有12位状态空间和40位动作空间的大动作任务的实例化上被训练.随机选择了13个关键状态.该网络运行了12000次,学习率从0.1到0.01,在整个培训过程中,温度从1.0到0.1呈指数级增长.每个迭代都以随机状态初始化.每个动作选择包括100次Gibbs采样迭代.
重要的遗漏细节:
我的实施:
我最初假设作者没有使用指南中描述的机制,所以我尝试在没有偏置单元的情况下训练网络.这导致了近乎机会的表现,这是我的第一个线索,即使用的某些机制必须被作者视为"显而易见",因此被省略.
我玩了上面提到的各种省略机制,并通过使用以下方式获得了我最好的结果:
但即使进行了所有这些修改,我在任务上的表现通常在12000次迭代后的平均奖励为28.
每次迭代的代码:
%%%%%%%%% START POSITIVE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
data = [batchdata(:,:,(batch)) rand(1,numactiondims)>.5];
poshidprobs = softmax(data*vishid + hidbiases);
%%%%%%%%% END OF POSITIVE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
hidstates = softmax_sample(poshidprobs);
%%%%%%%%% START ACTION SELECTION PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if test
[negaction poshidprobs] = choose_factored_action(data(1:numdims),hidstates,vishid,hidbiases,visbiases,cdsteps,0);
else
[negaction poshidprobs] = choose_factored_action(data(1:numdims),hidstates,vishid,hidbiases,visbiases,cdsteps,temp);
end
data(numdims+1:end) = negaction > rand(numcases,numactiondims);
if mod(batch,100) == 1
disp(poshidprobs);
disp(min(~xor(repmat(correct_action(:,(batch)),1,size(key_actions,2)), key_actions(:,:))));
end
posprods …Run Code Online (Sandbox Code Playgroud) matlab artificial-intelligence machine-learning bayesian-networks reinforcement-learning
我正在尝试实现深度强化学习的异步方法,其中一个步骤需要在不同的步骤上累积渐变然后应用它.在tensorflow中实现这一目标的最佳方法是什么?我已经积累了渐变,我认为不是实现它的最快方法(从tensorflow到python和back的很多转移).欢迎任何建议.这是我的玩具NN的代码.它不会模拟或计算它只是运行我想要使用的操作的任何东西.
import tensorflow as tf
from model import *
graph = tf.Graph()
with graph.as_default():
state = tf.placeholder(tf.float32, shape=[None, 80,80,1])
with tf.variable_scope('layer1'):
W = weight_variable([8, 8, 1, 32])
variable_summaries(W, "layer1/W")
b = bias_variable([32])
variable_summaries(b, "layer1/b")
h = conv2d(state, W, 4) + b
activation = tf.nn.relu(h)
pool1 = max_pool_2x2(activation)
print(pool1.get_shape())
pool1 = tf.reshape(pool1, [-1, 3200])
with tf.variable_scope('readout'):
W = weight_variable([3200, 3])
b = bias_variable([3])
logits = tf.matmul(pool1, W) + b
variable_summaries(h, "y")
action_indexes = tf.placeholder(tf.int32, shape=[None], name="action_indexes")
loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, …Run Code Online (Sandbox Code Playgroud) 此问题最初发布在Github#3320上.最好从那里开始,因为在该线程中有更多关于原始问题的细节而且体积庞大,所以我不希望在StackOverflow上重新发布.问题摘要是使用GPU时性能比CPU处理TensorFlow图表要慢.包含CPU/GPU时间轴(调试)以进行评估.其中一条评论涉及优化图表以加速处理,并要求讨论玩具示例." 原始解决方案 "是我的强化学习代码,表现出缓慢的性能,并为社区讨论和评估创建了一些已发布的代码.
我附上了测试脚本以及一些原始数据,Trace Files和TensorBoard日志文件,以加快审查速度. CPUvsGPU testing.zip
讨论已移至StackOverflow,因为此主题将使所有Tensorflow用户受益.我希望发现的是优化已发布图表性能的方法.可以通过更高效的TensorFlow图解决GPU与CPU的问题.
我做的是采取我的原始解决方案并剥离"游戏环境".我用随机数据生成代替了它.在此游戏环境中,不会创建/修改TensorFlow图.该结构密切关注/利用nivwusquorum的Github强化学习示例.
2016年7月15日,我做了一个"git pull"前往Tensorflow.我在启用和启用GPU的情况下执行图表并记录时间(参见附图).意想不到的结果是GPU的性能超过了CPU(这是最初的期望未达到).因此,带有支持库的代码"cpuvsgpu.py"在GPU上表现更好.所以我把注意力转向了原始解决方案和已发布代码之间的不同之处.我还将头部更新为2016年7月17日.由于原始解决方案上的CPU和GPU之间的整体差异比一周再次接近,因为我看到47s CPU与71s GPU相比,有些东西确实有所改善.快速浏览新的Traces与我的初始跟踪,似乎"摘要"可能已经改变,但也可能有其他改进.

我尝试了其他两种组合来更好地反映原始解决方案的功能.那些CPU负载很重(~60% - 70%),并通过并发执行该脚本进行模拟.另一个变化是增加"数据IO",原始解决方案使用观察列表随机选择观察训练.此列表具有固定的上限,然后在附加新列表时开始删除列表中的第一个项目.我想其中一个可能是放慢了数据流到GPU的速度.不幸的是,这些版本都没有导致CPU超越GPU.我还运行了一个快速的GPUTESTER应用程序,它可以进行大型矩阵乘法,以了解与任务大小的时序差异,并且符合预期.
我真的想知道如何改进这个图表并减少小OPS的数量.似乎这是大部分性能可能会发生的地方.学习将较小的ops组合成较大的ops而不影响图形的逻辑(功能)的任何技巧都会很好.
我正在加强学习计划,我正在使用这篇文章作为参考.我使用python与keras(theano)创建神经网络和我正在使用的伪代码
Do a feedforward pass for the current state s to get predicted Q-values for all actions.
Do a feedforward pass for the next state s’ and calculate maximum overall network outputs max a’ Q(s’, a’).
Set Q-value target for action to r + ?max a’ Q(s’, a’) (use the max calculated in step 2). For all other actions, set the Q-value target to the same as originally returned from step 1, making the error 0 for those …Run Code Online (Sandbox Code Playgroud) 我目前正在TensorFlow中实现深度双Q学习算法.我有一个基于NumPy数组实现的体验重放缓冲区.但是,一些性能分析表明,使用feed_dict将数据从NumPy数组馈送到图形是非常低效的.这也在文档https://www.tensorflow.org/performance/performance_guide中指出.
有没有人建议可以更有效地完成喂食?使用静态数据集,可以使用输入管道(例如记录读取器)完成馈送.然而,经验重播缓冲区随着时间的推移而变化,使得这种类型的喂养更具挑战性.
非常感谢任何答案,谢谢!
想象一下二元分类问题,如情绪分析.既然我们有标签,我们不能用实际预测的间隔作为RL的奖励吗?
我想尝试强化学习分类问题
我正在使用Keras构建LSTM,并通过使用外部成本函数进行梯度下降来对其进行调整。因此权重将更新为:
weights := weights + alpha* gradient(cost)
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用获得权重keras.getweights(),但是如何进行梯度下降并更新所有权重并相应地更新权重。我尝试使用initializer,但仍然没有弄清楚。我只找到了一些与tensorflow相关的代码,但我不知道如何将其转换为Keras。
任何帮助,提示或建议,将不胜感激!
After training a PyTorch model on a GPU for several hours, the program fails with the error
RuntimeError: cuDNN error: CUDNN_STATUS_INTERNAL_ERROR
Training Conditions
nn.LSTM with nn.Linear outputstate passed into forward() has the shape (32, 20, 15), where 32 is the batch size我正在尝试将稳定基线3库https://stable-baselines3.readthedocs.io/en/master/中的 PPO 算法应用到我制作的自定义环境中。
我不明白的一件事是下面这一行:
mean_reward, std_reward = evaluate_policy(model, env, n_eval_episodes=10, deterministic=True)
Run Code Online (Sandbox Code Playgroud)
我应该始终让确定性等于 True 吗?当我保持确定性=“真”时,我的自定义环境“以某种方式”总是得到解决(即总是返回 1 +/- 0 标准的奖励)。
当我将其更改为“False”时,它开始以合理的方式表现(即有时会成功(奖励=1),有时会失败(奖励=0)。
tensorflow ×3
keras ×2
python ×2
dqn ×1
lstm ×1
matlab ×1
nlp ×1
openai-gym ×1
performance ×1
python-3.x ×1
pytorch ×1
rnn ×1
theano ×1