簡體   English   中英

如何實施Q學習來逼​​近最佳控制?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM