Как реализовать Q-обучение, чтобы приблизиться к оптимальному управлению?

Я заинтересован во внедрении Q-обучения (или какой-либо формы обучения с подкреплением), чтобы найти оптимальный протокол. В настоящее время у меня есть функция, написанная на Python, где я могу принимать протокол или «действие» и «состояние» и возвращать новое состояние и «вознаграждение». Однако у меня возникают проблемы с поиском Python-реализации Q-обучения, которую я могу использовать в этой ситуации (то есть чего-то, что может изучить функцию, как если бы это был черный ящик). Я смотрел тренажерный зал OpenAI, но для этого потребовалось бы написать новую среду. Кто-нибудь знает о более простом пакете или сценарии, которые я могу использовать для этого?

Мой код имеет вид:

def myModel (state, action, param1, param2):
    ...
    return (state, reward)

Я ищу алгоритм вида:

def QLearning (state, reward):
    ...
    return (action)

И какой-то способ сохранить действия, которые переходят между состояниями. Если у кого-нибудь есть идеи, где это искать, я был бы очень взволнован!


person tooty44    schedule 09.09.2018    source источник
comment
Во всех известных мне наборах инструментов RL есть отдельный код для функции перехода и политики, хотя кажется, что ваш код объединяет их в myModel. Я предлагаю вам адаптировать свой код, чтобы иметь action = policy(state,param1,param2) и (state,reward) = step(state,action). Функция step войдет в среду тренажерного зала (просто скопируйте и адаптируйте одну из самых простых сред, это проще, чем вы думаете).   -  person Simon    schedule 09.09.2018
comment
Спасибо за ответ! Я немного запутался в action = policy(state,param1,param2), поскольку цель - изучить оптимальную политику (если не ошибаюсь)?   -  person tooty44    schedule 09.09.2018
comment
Да, политика параметризована, и вы узнаете оптимальные параметры. Что вы делаете: вы начинаете с некоторого начального params_0, собираете образцы, обновляете параметры и получаете params_1, повторяете до тех пор, пока не будут изучены оптимальные параметры (= политика). Сбор образцов выглядит следующим образом: нарисовано начальное состояние, нарисовано действие в соответствии с policy(state,params_i), передано действие симулятору step(state,action), чтобы получить следующее состояние и награду, и повторяться до тех пор, пока не будет выполнено какое-либо конечное условие (и обычно также собираются дополнительные траектории, такие как это до тех пор, пока у вас не будет достаточно образцов).   -  person Simon    schedule 10.09.2018
comment
Таким образом, params обновляется на каждой итерации обучения. Обычно политика включает какой-то шум для исследования (вы можете узнать шум или просто уменьшить его вручную). В качестве альтернативы вы можете просто собрать образцы самостоятельно (используйте случайную политику или также вручную добавьте шум и уменьшите его с течением времени), а когда у вас будет достаточно данных, запустите алгоритм обучения без дальнейшего взаимодействия с симулятором и получите оптимальную политику в один выстрел. С алгоритмом работает лучше, зависит от проблемы, которую вы хотите решить. OpenAI также имеет репозиторий с алгоритмами RL первого типа.   -  person Simon    schedule 10.09.2018
comment
Хорошим репозиторием для начала работы с RL может быть this (есть также второй, с большим количеством алгоритмы). Извините за множество комментариев, но я не думаю, что это действительно ответ на ваш вопрос: D   -  person Simon    schedule 10.09.2018
comment
Ах, в этом есть смысл! Спасибо за большую помощь и ссылки!   -  person tooty44    schedule 10.09.2018


Ответы (2)


Многие представленные здесь комментарии требуют от вас глубоких знаний об обучении с подкреплением. Похоже, вы только начинаете заниматься обучением с подкреплением, поэтому я бы рекомендовал начать с самого базового алгоритма обучения 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-матрицу новыми знаниями.

Дайте мне знать, если что-то не имеет смысла!

person Rui Nian    schedule 10.09.2018
comment
Я рада, что помогло! - person Rui Nian; 16.09.2018

Я также предлагаю вам начать со стандартного алгоритма 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-потерю.

введите описание изображения здесь

При выполнении градиентного спуска мы не будем распространять градиенты через него, чтобы сделать обучение более стабильным.

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