我有兴趣实施Q学习(或某种形式的强化学习)以找到最佳协议。目前,我有一个用Python编写的函数,可以在其中加入协议或“操作”和“状态”,并返回新的状态和“奖励”。但是,我很难找到可以在这种情况下使用的Q学习的Python实现(即可以学习该功能的东西,就像黑盒子一样)。我看过OpenAI体育馆,但这需要编写一个新环境。谁会知道我可以采用的更简单的程序包或脚本吗?
我的代码格式为:
def myModel (state, action, param1, param2):
...
return (state, reward)
我正在寻找的是以下形式的算法:
def QLearning (state, reward):
...
return (action)
某种保持状态在状态之间转换的方法。如果有人知道在哪里寻找它,我将非常兴奋!
答案 0 :(得分: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矩阵。
让我知道是否没有任何意义!
答案 1 :(得分: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等非线性函数:Agent的观测值未标准化,因此Sigmoid可能会因初始状态而变得饱和。
然后我们使用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损失
进行梯度下降时,我们不会通过它传播梯度以使训练更稳定
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 agent播放env并同时对其进行训练。