Как правильно вознаграждать нейронную сеть, играя в игру - PullRequest
0 голосов
/ 20 ноября 2018

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

game field

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

Модель для моегоСеть действительно простая (я использую tflearn)

network = input_data(shape=[None, 13, 1], name='input')
network = fully_connected(
    network,
    13**2,
    activation='relu'
)
network = fully_connected(network, 1, activation='linear')
network = regression(
    network,
    optimizer='adam',
    learning_rate=self.lr,
    loss='mean_square',
    name='target',
)
model = tflearn.DNN(network, tensorboard_dir='log')

, где 13 - это ряд функций, которые я могу извлечь из игрового состояния.Но полученная модель дает действительно плохое поведение при игре

[default] INFO:End the game with a score: 36
[default] INFO:Path: up,up,up,up,up,up,up,up,up,up,up,up,up,up,up

Поэтому я хочу выяснить, какие важные части я пропустил, и у меня есть несколько открытых вопросов, чтобы уточнить:

Training Step: 3480  | total loss: 0.11609 | time: 4.922s
| Adam | epoch: 001 | loss: 0.11609 -- iter: 222665/222665
  1. Какое значение потери я ищу?Есть ли эмпирическое правило, которое скажет мне, что потери достаточно хороши?
  2. Сколько эпох мне нужно иметь?Как определить точное их количество?
  3. Что, если моя архитектура NN полностью неверна и не подходит для этой задачи?Как это определить?
  4. И, наконец: с чего начать при отладке вашей сети, и какие аспекты я должен сначала перепроверить и проверить.

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

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Хорошо, значит, вы должны решить проблему с помощью подходящих инструментов.Как упомянуто в комментариях, правильный способ сделать это - использовать Reinforcement Learning.Вот алгоритм, который возвращает оптимальную политику для нашей среды (на основе Q-learning)

states_space_size = (game.field.leny - 2)*(game.field.lenx - 2)
actions_space_size = len(DIRECTIONS)
QSA = np.zeros(shape=(states_space_size, actions_space_size))
max_iterations = 80
gamma = 1  # discount factor
alpha = 0.9  # learning rate
eps = 0.99  # exploitation rate
s = 0  # initial state
for i in range(max_iterations):
    # explore the world?
    a = choose_an_action(actions_space_size)
    # or not?
    if random.random() > eps:
        a = np.argmax(QSA[s])

    r, s_ = perform_action(s, a, game)
    qsa = QSA[s][a]
    qsa_ = np.argmax(QSA[s_])
    QSA[s][a] = qsa + alpha*(r + gamma*qsa_ - qsa)

    # change state
    s = s_
print(QSA)

Вот более подробное объяснение с упрощенным примером того, как достичь этого результата.

0 голосов
/ 14 декабря 2018

Традиционно обучение с подкреплением ограничивалось только решением задач дискретного действия с дискретным состоянием, потому что непрерывные проблемы вызывали проблему «проклятия размерности».Например, предположим, что манипулятор робота может двигаться в диапазоне от 0 до 90 градусов.Это означает, что вам нужно действие для угла = 0, 0,00001, 0,00002, ..., которое недостижимо для традиционного табличного RL.

Чтобы решить эту проблему, нам пришлось учить RL, что 0,00001 и 0,00002 большеили менее то же самое.Чтобы достичь этого, нам нужно использовать функцию приближения, такую ​​как нейронные сети.Цель этих аппроксимаций - аппроксимировать Q-матрицу в табличном RL и зафиксировать политику (то есть выбор робота).Тем не менее, даже до сегодняшнего дня аппроксимация нелинейных функций, как известно, чрезвычайно трудна для обучения.Первый раз, когда НС были успешны в РЛ, был Дэвид Сильвер и его детерминированный политический градиент (2014).Его подход состоял в том, чтобы отобразить состояния на действия напрямую, без Q-значения.Но функция потерь нейронной сети будет руководствоваться наградами.

Чтобы ответить на оригинальный вопрос «как правильно вознаграждать NN»:

  1. Создайте множество траекторий ваших роботовдвижение в государственном пространстве.В вашем примере одна траектория заканчивается либо когда агент достигает цели, либо если он сделал более 50 шагов (слишком много).Мы будем называть каждый шаг одним эпизодом.
  2. После каждой успешной траектории (достижения цели), наградите последний эпизод наградой 1, и каждый эпизод перед этим должен быть сброшен вашимучетная ставка.Пример: 2-й последний эпизод получит вознаграждение 0,95, если ваша ставка дисконтирования равна 0,95 и т. Д.
  3. После того, как собраны адекватные траектории (~ 50), представьте это как контролируемую проблему обучения.Там, где ваши входные данные - это состояния, цель - действия, а награда - это кросс-энтропийная управляемая потеря: -log (pi) * R, где pi - вероятность выполнения этого действия в этом состоянии.R - ваша текущая награда.
  4. Тренируйтесь, используя вариант градиентного спуска, принимая градиент кросс-энтропийной управляемой потери за вознаграждение: - (dPi / pi * R).Здесь вы можете видеть, что очень отрицательный R будет иметь большие потери, тогда как положительный R будет иметь низкие потери.
  5. Повторяйте до схождения.Этот метод обучения называется методом Монте-Карло, потому что мы генерируем много траекторий, и мы говорим, что среднее значение каждой пары S, A, R, S очень вероятно.

Вот оригинальная статья:http://proceedings.mlr.press/v32/silver14.pdf

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

2 самых популярных алгоритма: Глубокий детерминистический градиент политики и проксимальная оптимизация политики.

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

0 голосов
/ 29 ноября 2018

Не ответ на вопрос выше, но хорошее место, чтобы начать получать ценную информацию для вашей конкретной сети здесь

...