Я также предлагаю вам начать со стандартного алгоритма Q-обучения. Хотя, если вы действительно хотите попробовать приблизительный алгоритм Q-обучения, вы можете взять любую игру Atari из openAI и попытаться решить проблему управления
Прежде всего, вам нужно разработать политику нейронной сети.
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))
Это довольно простая сеть, но она будет работать. Также избегайте использования нелинейностей, таких как сигмоид и танх: наблюдения агента не нормированы, поэтому сигмоиды могут насыщаться от init.
Затем мы пробуем действие с эпсилон-жадной политикой
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)
Оставшаяся часть заключается в создании сессий - играйте в env с примерным агентом q-learning и тренируйте его одновременно.