[英]How to implement Q-learning to approximate an optimal control?
我對實施Q學習(或某種形式的強化學習)以尋找最佳協議感興趣。 目前,我有一個用Python編寫的函數,可以在其中加入協議或“操作”和“狀態”,並返回新的狀態和“獎勵”。 但是,我很難找到在這種情況下可以使用的Q學習的Python實現(即可以學習該功能的東西,就好像它是黑匣子一樣)。 我看過OpenAI體育館,但這需要編寫一個新環境。 有人會知道我可以采用的更簡單的程序包或腳本嗎?
我的代碼形式如下:
def myModel (state, action, param1, param2):
...
return (state, reward)
我正在尋找的是以下形式的算法:
def QLearning (state, reward):
...
return (action)
以及保持狀態在狀態之間轉換的某種方式。 如果有人知道在哪里尋找它,我將非常興奮!
這里提出的很多評論都要求您對強化學習有深入的了解。 看來您才剛剛開始進行強化學習,因此我建議您從最基本的Q學習算法開始。
學習RL的最好方法是為自己編寫基本算法。 該算法分為兩部分(模型,代理),如下所示:
model(state, action):
...
return s2, reward, done
其中s2是模型在執行動作后輸入的新狀態。 獎勵基於在該狀態下執行該操作。 完成只是代表情節的結束與否。 看來您已經擁有了這一部分。
下一部分是代理,如下所示:
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-矩陣。
讓我知道是否沒有任何意義!
我還建議您從標准的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的觀測值未標准化,因此Sigmoids可能會因初始化而變得飽和。
然后我們用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並同時對其進行訓練。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.