Глубокая модификация Q-обучения - PullRequest
0 голосов
/ 05 октября 2018

@ Edit:

Я пытаюсь создать агента для игры в тетрис, используя сверточный nnet, который принимает состояние доски + текущую фигуру в качестве входных данных.Из того, что я прочитал, глубокое обучение Q не очень хорошо в этом, что я только что подтвердил.

@ end Edit

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

s, a, r, s ', выполнено

, представляющее

состояние, действие, награда, следующее состояние, игра окончена

В алгоритме Deep Q-learning агент находится в состоянии s и предпринимает некоторые действия a (следуя политике epsilon-greedy ), наблюдает за вознаграждением r и переходит в следующее состояние s '.

Агент действует следующим образом:

# returns an action index
get_action(state, epsilon)
   if random() < epsilon
       return random_action_index
   else
      return argmax(nnet.predict(state))

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

# action taken was 'a' in state 's' leading to 's_'
prediction = nnet.predict(s)
if done
   target = reward
else
   target = reward + gamma * max(nnet.predict(s_))

prediction[a] = target

[предсказание, цель] является подачей в некоторый nnet для обновления веса.Таким образом, этот nnet получает состояние s в качестве входных данных и выводит вектор значений q с размерностью n_actions .Это все для меня ясно.

Теперь предположим, что мои действия на уровне состояния настолько шумны, что этот подход просто не будет работать.Таким образом, вместо вывода вектора измерения n_actions мой вывод nnet представляет собой одно значение, представляющее «качество состояния» (насколько желательно это состояние).

Теперь мой агент действуетвот так:

# returns an action based on how good the next state is
get_action(state, epsilon):
    actions = []
    for each action possible in state:
         game.deepcopy().apply(action)
         val = nnet.predict(game.get_state())
         action.value = val
         actions.append(action)

    if random() < epsilon
        return randomChoice(actions)
    else
        return action with_max_value from actions

И мой [прогноз, цель] таков:

# action taken was 'a' in state 's' leading to 's_'
prediction = nnet.predict(s)
if done
   target = reward
else
   target = reward + gamma * nnet.predict(s_)

У меня есть несколько вопросов относительно этого второго алгоритма:

а) Имеет ли смысл иногда действовать не жадно?

Интуитивно нет, потому что если я приземлился в плохом состоянии, это, вероятно, было из-за плохого случайного действия, а не потому, что предыдущее состояние было 'плохой'.Обновление Q-Learning исправит плохое действие, но этот второй алгоритм неверно отрегулирует предыдущее состояние.

b) Что это за алгоритм?Где оно подходит для обучения в области подкрепления?

в) В случае тетриса состояние почти никогда не повторяется, так что я могу сделать в этом случае?Не в этом ли причина глубокого q-обучения?

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

1 Ответ

0 голосов
/ 05 октября 2018

Теперь предположим, что мои состояния-действия настолько шумные, что этот подход просто не будет работать.Таким образом, вместо вывода вектора измерения n_actions мой вывод nnet представляет собой одно значение, представляющее «состояние-качество» (насколько желательно это состояние).

Теперь мой агент действуеткак это:

# returns an action based on how good the next state is
get_action(state, epsilon):
    actions = []
    for each action possible in state:
         game.apply(action)
         val = nnet.predict(game.get_state())
         action.value = val
         actions.append(action)

    if random() < epsilon
        return randomChoice(actions)
    else
        return action with_max_value from actions

Сначала короткая заметка об этом псевдокоде: я не думаю, что это сработает, потому что вы не моделируете эффекты различных действий на копиях игрового состояния, но только на игровое состояние напрямую.Возможно, вы захотите сначала создать отдельные копии состояния игры и запускать каждое действие один раз для другой копии.

В любом случае такой тип алгоритма обычно считается невозможным в настройках обучения с подкреплением.В RL мы обычно работаем в предположении, что у нас нет «симулятора», «форвард-модели» или чего-то подобного.Обычно мы предполагаем, что у нас есть агент, расположенный в реальной среде, в которой мы можем накопить опыт, из которого можно извлечь уроки.В этом предположении мы не можем реализовать такой цикл for each action possible in state, который имитирует то, что произойдет, если мы будем выполнять разные действия в одном игровом состоянии.Предполагается, что мы сначала должны выбрать одно действие , выполнить его, а затем извлечь уроки из этой конкретной траектории опыта; мы больше не можем «возвращаться» , представьте, что мы выбрали другое действие, а также извлекли урок из этой траектории.

Конечно, на практике это часто возможно, потому что мычасто на самом деле есть симулятор (например, симулятор робота или игра и т. д.).В большинстве исследований в области RL все еще делается предположение, что у нас нет такого симулятора, потому что это приводит к алгоритмам, которые в конечном итоге могут быть использованы в реальных ситуациях (например, в реальных физических роботах).Реализация идеи, которую вы описали выше, фактически означает, что вы больше двигаетесь к алгоритмам поиска (таким как поиск по дереву Монте-Карло), а не к алгоритмам обучения с подкреплением.Это означает, что ваш подход ограничен сценариями, в которых у вас есть симулятор (например, игры).


a) Имеет ли смысл иногда действовать не жадно?

Несмотря на то, что вы включаете поисковый процесс, повторяющий все действия и имитирующий все их эффекты, я подозреваю, что вам все равно понадобится некоторая форма исследования, если вы хотите перейти к хорошей политике, так что выПридется иногда действовать не жадно.Да, похоже, это заставит ваш алгоритм сходиться к чему-то отличному от традиционной интерпретации «оптимальной политики».Это не слишком большая проблема, если ваш эпсилон довольно низкий.На практике это, скорее всего, будет более "безопасной" политикой, которую выучилиСм. Также мой ответ на этот другой вопрос .

б) Что это за алгоритм?Где он подходит для обучения в области подкрепления?

Помимо моего обсуждения выше о том, как это на самом деле немного движется в сторону алгоритмов поиска, а не алгоритмов RL, мне также кажется, что это было быАлгоритм on-policy , а не алгоритм off-policy (стандартное Q-обучение не является политикой, потому что оно узнает о жадной политике, в то же время генерируя опыт посредством не жадной политики),Это различие также подробно обсуждается в большинстве ответов на вопрос, с которым я связан выше.

...