首页 文章

如何实现Q学习以近似最优控制?

提问于
浏览
2

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

我的代码形式如下:

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

我正在寻找的是一种形式的算法:

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

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

2 回答

  • 3

    这里提出的很多评论都要求您对强化学习有深入的了解 . 您似乎刚刚开始强化学习,所以我建议从最基本的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矩阵 .

    如果有什么事情没有意义,请告诉我!

  • 3

    我还建议你从标准的Q学习算法开始 . 虽然如果你真的想尝试一种近似的Q学习算法,你可以从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这样的非线性:代理的观察结果没有标准化,因此sigmoids可能会从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))
    

    然后我们需要训练代理的Q函数以最小化TD损失

    enter image description here

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

    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学习代理播放env并同时训练它 .

相关问题