相关疑难解决方法(0)

如何使用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
查看次数