Что такое обучение с подкреплением?

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

Почему обучение с подкреплением?

Обучение с учителем требует меток (правильных ответов), чтобы учиться, например, стоимость жилья, но что, если мне нужно обучиться вождению автомобиля? Не может быть «правильных ответов» для каждой ситуации вождения автомобиля. Мы не можем генерировать образцы пар меток в определенной задаче, чтобы использовать контролируемое обучение. Тем не менее, обучение с подкреплением является лучшим решением для этого типа проблем. Потому что ему не нужна метка для каждого экземпляра, а просто нужно вознаграждение, сообщающее агенту, какие результаты хорошие или плохие.

Как обучать с подкреплением?

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

Я пропущу здесь математику и объясню ее как можно проще.

Сначала импортируйте вспомогательные пакеты. tf.keras.backend.set_floatx(‘float64’) используется, чтобы избежать будущих предупреждений, читатель может игнорировать эту строку кода. А затем установить среду как CartPole-v1 из Open-AI. Ожидается, что агент научится играть в эту игру.

Затем используйте env.action_space и env.observation_space, чтобы узнать, что наблюдения содержат 4 разных значения, а соответствующие действия равны 2, то есть left и right. Таким образом, мы установим размер ввода нашей сети равным 4, а размер вывода - 2. Наша цель: для разных состояний внутри среды мы наблюдаем 4 разных значения и помещаем их в сеть, сеть обрабатывает состояния и производит лучшее действие для выполнения.

Построение нейронной сети с использованием TensorFlow 2.0 с 1 скрытым слоем и 100 узлами. Результатом является Softmax layer с 2 узлами, что относится к 2 вероятностям, соответствующим 2 действиям.

На этом этапе вы можете попробовать использовать модель (или сеть) для игры и посмотреть, как неподготовленный агент не может играть в игру.

Вот код:

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

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

Отмечено, что в TensorFlow есть два способа сделать это: первый — использовать sample_weight при подгонке, второй — умножить вывод softmax на вознаграждения, они оба одинаковы. Оба они сообщают сети в данном состоянии, какой выход является более благоприятным.

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

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

Способ 1:

Использование sample_weight

Геймплей и результаты здесь:

Всего после 81 игры агент может набрать 500 очков подряд.

Путь2:

Умножение вывода softmax на вознаграждения:

Репо для этого поста:

https://github.com/paklong/Policy-Gradient-TF2.0