Я также предлагаю вам начать со стандартного алгоритма 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))
Это довольно простая сеть, но она будет работать. Также избегайте использования нелинейностей, таких как sigmoid & tanh: наблюдения агента не нормализованы, поэтому сигмоиды могут стать насыщенными из 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-потерю.
![введите описание изображения здесь](https://i.stack.imgur.com/Xmnr8.png)
При выполнении градиентного спуска мы не будем распространять градиенты через него, чтобы сделать обучение более стабильным.
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 и обучите его одновременно.
person
Daniel Chepenko
schedule
11.09.2018
myModel
. Я предлагаю вам адаптировать свой код, чтобы иметьaction = policy(state,param1,param2)
и(state,reward) = step(state,action)
. Функцияstep
войдет в среду тренажерного зала (просто скопируйте и адаптируйте одну из самых простых сред, это проще, чем вы думаете). - person Simon   schedule 09.09.2018action = policy(state,param1,param2)
, поскольку цель - изучить оптимальную политику (если не ошибаюсь)? - person tooty44   schedule 09.09.2018params_0
, собираете образцы, обновляете параметры и получаетеparams_1
, повторяете до тех пор, пока не будут изучены оптимальные параметры (= политика). Сбор образцов выглядит следующим образом: нарисовано начальное состояние, нарисовано действие в соответствии сpolicy(state,params_i)
, передано действие симуляторуstep(state,action)
, чтобы получить следующее состояние и награду, и повторяться до тех пор, пока не будет выполнено какое-либо конечное условие (и обычно также собираются дополнительные траектории, такие как это до тех пор, пока у вас не будет достаточно образцов). - person Simon   schedule 10.09.2018params
обновляется на каждой итерации обучения. Обычно политика включает какой-то шум для исследования (вы можете узнать шум или просто уменьшить его вручную). В качестве альтернативы вы можете просто собрать образцы самостоятельно (используйте случайную политику или также вручную добавьте шум и уменьшите его с течением времени), а когда у вас будет достаточно данных, запустите алгоритм обучения без дальнейшего взаимодействия с симулятором и получите оптимальную политику в один выстрел. С алгоритмом работает лучше, зависит от проблемы, которую вы хотите решить. OpenAI также имеет репозиторий с алгоритмами RL первого типа. - person Simon   schedule 10.09.2018