Повтор опыта делает моего агента хуже

Я "успешно" настроил Q-сеть для решения задачи "FrozenLake-v0" в спортзале OpenAI (по крайней мере, я думаю... не уверен на 100%, как я наберу очки - я получаю от 70 до 80 из 100 успешных эпизодов после 5к эпизодов тренировки без опыта переигровки). Я все еще плохо знаком с этими проблемами программирования, но у меня есть несколько лет общего опыта программирования. Я использую последний тренажерный зал, Python 3.6.4 (x64) и Tensorflow 1.7. Я еще не установил Tensorflow-GPU на своей 980 Ti буровой установке дома (что из того, что я прочитал, унесет мой процессор из воды).

Теперь я пытаюсь улучшить, внедряя воспроизведение опыта: каждый шаг (= один "опыт") сохраняется как (s, a, r, s'): состояние, действие, награда, новое состояние. После минимума pre_train_steps было принято (другими словами: если было предпринято определенное количество "органических" шагов), каждые 25 шагов (if total_steps % 25 == 0) Я выбираю 4 случайных эпизода из памяти (память - это последние 1000 эпизодов), и для каждого из этих 4 эпизодов я выбираю 4 случайных последовательных шага в этом эпизоде ​​(episode[n:n+4] where n=rand(0, len(episode) + 1 - 4)).

Результат 4*4=16 (s, a, r, s') кортежи в качестве образцов. Для каждого из этих образцов я получаю Q(s, a), Q(s', a') а также max(Q(s', a')), Затем я рассчитываю целевые Q-значения, устанавливая targetQ(:,a) = r + gamma * max(Q(s', a')) where gamma = .99 для каждого из образцов. Я тогда тренируюсь, используя GradientDescentOptimizer(learning_rate=0.1) и функция потерь определяется как loss = reduce_sum(square(targetQ - Q))

Тестируя, не применяя повтор опыта, выполняя 10 тыс. Эпизодов (приблизительно 290 тыс. "Органических" шагов) со всеми параметрами (гамма, LR и т. Д.), Равными указанным выше, я получаю последовательные результаты 70–80 успешных на 100 протестированных эпизодов. Запуск моего ноутбука Lenovo T440s занимает около 9 минут.

Включение воспроизведения опыта, тем не менее, запуск 10 тысяч эпизодов (приблизительно 240 тысяч "органических" и 115 тысяч "обученных" шагов), pre_train_steps = 50k а также train_freq = 25, результаты неизменно ниже (65-70 успешных на 100 эпизодов), принимая немного короче (примерно 8 минут) на моем старом T440.

Зачем? Я ожидаю слишком многого от этой вещи Replay опыта? Я думал, что это сократит мое время и увеличит мою точность (особенно не позволяя сети выбирать только определенные пути, на которые она "заперта"), но вряд ли это поможет. Может быть, мой код неправильный, может, я использую неправильные параметры? Было бы очень полезно, если бы кто-то мог взглянуть на это и направить меня в правильном направлении, так как я хотел бы продолжать увеличивать сложность моей сети и пробовать разные среды, но прежде чем я хочу это сделать, я хочу знаю, что я не делаю что-то совершенно не так...

ТИА!

Полный код: https://pastebin.com/XQU2Tx18

1 ответ

Изучив код в вашей ссылке, у меня сложилось впечатление, что:

  • e это epsilon параметр epsilonжадная стратегия
  • batch_train Похоже, это параметр, который решает, использовать ли Replay опыта или нет?

Предполагая, что вышеупомянутое правильно: одна вещь, которая выделяется для меня, это этот блок кода

for i, experience in enumerate(training_batch):
    s, a, r, ss, d = experience # s a r s' d

    if int(r) == 1:
        e -= e_factor

        if e < e_end:
            e = e_end

    target_Qs[i][int(a)] = r + QN1.gamma * new_Qs_max[i]

который находится внутри ifблок кондиционирован на batch_train == Trueдругими словами, приведенный выше фрагмент кода выполняется только в том случае, если используется Experience Replay. Этот код, кажется, разрушает ваш epsilon параметр.

Как правило, вы не хотите epsilon распадаться на основе количества образцов опыта, из которого вы узнали; Вы хотите, чтобы он затухал в зависимости от количества действий, которые вы фактически предприняли в окружающей среде. Это должно быть независимо от того, используете ли вы Experience Replay или нет. Итак, одно из возможных объяснений состоит в том, что вы просто разлагаетесь epsilon слишком быстро в случае использования Experience Replay.

Кроме того, похоже, что вы по-прежнему выполняете этапы непосредственного обучения на своих самых последних образцах опыта, в дополнение к обучению на старых образцах с помощью Experience Replay. Гораздо более распространено учиться только на сэмплах, случайно выбранных из вашего буфера воспроизведения опыта, и вообще не учиться непосредственно на самых последних сэмплах. Кроме того, гораздо чаще встречается история (s, a, r, s') кортежи в буфере воспроизведения не зависят от того, из какого эпизода они произошли, а затем выполняют шаги обучения гораздо более регулярно, чем раз в 25 действий.

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

Другие вопросы по тегам