【问题标题】:How to implement Q-learning to approximate an optimal control?如何实现 Q-learning 来逼近最优控制?
【发布时间】:2019-02-13 21:00:26
【问题描述】:

我有兴趣实施 Q 学习(或某种形式的强化学习)以找到最佳协议。目前,我有一个用 Python 编写的函数,我可以在其中接受协议或“动作”和“状态”并返回一个新状态和一个“奖励”。但是,我很难找到可以在这种情况下使用的 Q-learning 的 Python 实现(即可以像黑匣子一样学习函数的东西)。我看过 OpenAI 健身房,但这需要编写一个新环境。有人知道我可以为此采用更简单的包或脚本吗?

我的代码是这样的:

def myModel (state, action, param1, param2):
    ...
    return (state, reward)

我正在寻找的是以下形式的算法:

def QLearning (state, reward):
    ...
    return (action)

还有一些方法可以保持在状态之间转换的动作。如果有人知道在哪里可以找到这个,我会非常兴奋!

【问题讨论】:

  • 我知道的所有 RL 工具箱都有用于转换函数和策略的单独代码,而您的代码似乎将它们合并到 myModel 中。我建议您调整您的代码以具有action = policy(state,param1,param2)(state,reward) = step(state,action)step 函数将进入健身房环境(只需复制并适应最简单的环境之一,它比您想象的要容易)。
  • 感谢您的回复!我对action = policy(state,param1,param2) 有点困惑,因为目标是学习最优策略(如果我没记错的话)?
  • 是的,策略是参数化的,您可以学习最佳参数。你要做的是:你从一些初始的params_0开始,收集样本,更新参数并获得params_1,重复直到学习到最佳参数(=policy)。样本的收集是这样的:绘制初始状态,根据policy(state,params_i) 绘制一个动作,将动作馈送到模拟器step(state,action) 以获得下一个状态和奖励,并重复直到满足某个终止条件(通常也是收集更多这样的轨迹,直到你有足够的样本)。
  • 所以params 在每次学习迭代中都会更新。通常策略包括某种探索噪声(你可以学习噪声,或者只是手动减少它)。或者,您可以自己收集样本(使用随机策略或手动添加噪声并随着时间的推移减少它),当您有足够的数据时运行学习算法而不与模拟器进一步交互并获得最佳策略“一口气”。算法效果更好取决于您要解决的问题。 OpenAI 还有一个包含第一类 RL 算法的存储库。
  • 一个很好的开始使用 RL 的存储库可能是 this(还有第二个具有更多算法的存储库)。很抱歉有很多 cmets,但我认为这并不能真正回答你的问题:D

标签: python reinforcement-learning q-learning openai-gym


【解决方案1】:

我还建议您从标准的 Q 学习算法开始。不过如果你真的想尝试一个近似的 Q-learning 算法,你可以从 openAI 获取任何 Atari 游戏并尝试解决控制问题

首先你需要设计一个神经网络策略。

import tensorflow as tf
import keras
import keras.layers as L
tf.reset_default_graph()
sess = tf.InteractiveSession()

keras.backend.set_session(sess)
network = keras.models.Sequential()
network.add(L.InputLayer(state_dim))

network.add(L.Dense(200, activation='relu'))
network.add(L.Dense(200, activation='relu'))
network.add(L.Dense(n_actions))

这是一个非常简单的网络,但它会工作。还要避免使用像 sigmoid 和 tanh 这样的非线性:agent 的观察没有标准化,所以 sigmoid 可能会从 init 开始饱和。

然后我们使用 epsilon-greedy 策略对操作进行采样

def get_action(state, epsilon=0):

    if np.random.random() < epsilon:
        return int(np.random.choice(n_actions))

    return int(np.argmax(q_values))

那么我们需要训练agent的Q-function来最小化TD-loss

在进行梯度下降时,我们不会通过它传播梯度以使训练更稳定

states_ph = keras.backend.placeholder(dtype='float32', shape=(None,) + state_dim)
actions_ph = keras.backend.placeholder(dtype='int32', shape=[None])
rewards_ph = keras.backend.placeholder(dtype='float32', shape=[None])
next_states_ph = keras.backend.placeholder(dtype='float32', shape=(None,) + state_dim)
is_done_ph = keras.backend.placeholder(dtype='bool', shape=[None])

#get q-values for all actions in current states
predicted_qvalues = network(states_ph)

#select q-values for chosen actions
predicted_qvalues_for_actions = tf.reduce_sum(predicted_qvalues * tf.one_hot(actions_ph, n_actions), axis=1)

gamma = 0.99

# compute q-values for all actions in next states
predicted_next_qvalues = network(next_states_ph)

# compute V*(next_states) using predicted next q-values
next_state_values = tf.reduce_max(predicted_next_qvalues, axis=1)

# compute "target q-values" for loss - it's what's inside square parentheses in the above formula.
target_qvalues_for_actions = rewards_ph + gamma*next_state_values

# at the last state we shall use simplified formula: Q(s,a) = r(s,a) since s' doesn't exist
target_qvalues_for_actions = tf.where(is_done_ph, rewards_ph, target_qvalues_for_actions)

最后实现一个您想要最小化的均方误差

loss = (predicted_qvalues_for_actions - tf.stop_gradient(target_qvalues_for_actions)) ** 2
loss = tf.reduce_mean(loss)

# training function that resembles agent.update(state, action, reward, next_state) from tabular agent
train_step = tf.train.AdamOptimizer(1e-4).minimize(loss)

剩下的部分是生成会话 - 使用近似 q-learning 代理玩 env 并同时对其进行训练。

【讨论】:

    【解决方案2】:

    这里介绍的许多 cmets 都要求您对强化学习有深入的了解。看来你刚刚开始学习强化学习,所以我建议从最基本的 Q 学习算法开始。

    学习 RL 的最佳方法是为自己编写基本算法。该算法有两部分(模型、代理),如下所示:

    model(state, action):
        ...
        return s2, reward, done
    

    其中 s2 是模型在执行动作后进入的新状态,a。奖励基于在该状态下执行该操作。完成只是表示它是否是剧集的结尾。好像你已经有了这部分。

    下一部分是代理,看起来像这样:

    states = [s1, s2, s3, ...]
    actions = [a1, a2, a3, ...]
    Q_matrix = np.zeros([state_size, action_size])
    discount = 0.95
    learning_rate = 0.1
    action_list = []
    
    def q_learning_action(s, Q_matrix):
    
        action = index_of_max(Q_matrix[s, :])
        action_list.append(action)      # Record your action as requested
    
        return action
    
    def q_learning_updating(s, a, reward, s2, Q_matrix):
    
        Q_matrix[s, a] = (1 - learning_rate)Q_matrix[s, a] + learning_rate*(reward + gamma*maxQ_matrix[s2, a])
        s = s2
    
        return s, Q_matrix
    

    有了这个,您可以构建一个 RL 代理来学习许多基本知识以实现最佳控制。

    基本上,Q_learning_actions 为您提供在环境中执行所需的操作。然后使用该动作,计算模型的下一个状态和奖励。然后使用所有信息,用新知识更新你的 Q 矩阵。

    如果有什么不明白的地方请告诉我!

    【讨论】:

    • 我很高兴它有帮助!
    猜你喜欢
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 2015-02-06
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多