PyBrain - модуль обучения с подкреплением

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

Компоненты, которые взаимодействуют друг с другом во время армирования, следующие:

  • Environment
  • Agent
  • Task
  • Experiment

Схема обучения с подкреплением приведена ниже -

В RL агент итеративно общается со средой. На каждой итерации агент получает наблюдение, за которое полагается вознаграждение. Затем он выбирает действие и отправляет его в среду. Окружение на каждой итерации переходит в новое состояние, и полученное вознаграждение каждый раз сохраняется.

Цель агента RL - собрать как можно больше наград. Между итерациями производительность агента сравнивается с эффективностью агента, который действует хорошо, и разница в производительности приводит либо к вознаграждению, либо к провалу. RL в основном используется для решения таких задач, как управление роботом, лифт, телекоммуникации, игры и т. Д.

Давайте посмотрим, как работать с RL в Pybrain.

Собираемся работать над лабиринтом environmentкоторый будет представлен с использованием двумерного массива numpy, где 1 - стена, а 0 - свободное поле. Ответственность агента заключается в перемещении по свободному полю и нахождению точки ворот.

Вот пошаговая инструкция по работе с окружением лабиринта.

Шаг 1

Импортируйте нужные нам пакеты с помощью приведенного ниже кода -

from scipy import *
import sys, time
import matplotlib.pyplot as pylab # for visualization we are using mathplotlib

from pybrain.rl.environments.mazes import Maze, MDPMazeTask
from pybrain.rl.learners.valuebased import ActionValueTable
from pybrain.rl.agents import LearningAgent
from pybrain.rl.learners import Q, QLambda, SARSA #@UnusedImport
from pybrain.rl.explorers import BoltzmannExplorer #@UnusedImport
from pybrain.rl.experiments import Experiment
from pybrain.rl.environments import Task

Шаг 2

Создайте среду лабиринта, используя приведенный ниже код -

# create the maze with walls as 1 and 0 is a free field
mazearray = array(
   [[1, 1, 1, 1, 1, 1, 1, 1, 1],
   [1, 0, 0, 1, 0, 0, 0, 0, 1],
   [1, 0, 0, 1, 0, 0, 1, 0, 1],
   [1, 0, 0, 1, 0, 0, 1, 0, 1],
   [1, 0, 0, 1, 0, 1, 1, 0, 1],
   [1, 0, 0, 0, 0, 0, 1, 0, 1],
   [1, 1, 1, 1, 1, 1, 1, 0, 1],
   [1, 0, 0, 0, 0, 0, 0, 0, 1],
   [1, 1, 1, 1, 1, 1, 1, 1, 1]]
)
env = Maze(mazearray, (7, 7)) # create the environment, the first parameter is the 
maze array and second one is the goal field tuple

Шаг 3

Следующим шагом будет создание агента.

Агент играет важную роль в RL. Он будет взаимодействовать со средой лабиринта с помощью методов getAction () и integrationObservation ().

У агента есть контроллер (который будет отображать состояния в действия) и ученик.

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

controller = ActionValueTable(81, 4)
controller.initialize(1.)

В ActionValueTableтребуется 2 входа, т.е. количество состояний и действий. Стандартная среда лабиринта имеет 4 действия: север, юг, восток, запад.

Теперь создадим ученика. Мы собираемся использовать алгоритм обучения SARSA () для учащегося, который будет использоваться с агентом.

learner = SARSA()
agent = LearningAgent(controller, learner)

Шаг 4

На этом этапе агент добавляется в среду.

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

У среды есть своя задача. В среде Maze, которую мы использовали, есть задача MDPMazeTask. MDP означает“markov decision process”это означает, что агент знает свое положение в лабиринте. Окружение будет параметром задачи.

task = MDPMazeTask(env)

Шаг 5

Следующим шагом после добавления агента в среду является создание эксперимента.

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

experiment = Experiment(task, agent)

Теперь мы собираемся запустить эксперимент 1000 раз, как показано ниже -

for i in range(1000):
   experiment.doInteractions(100)
   agent.learn()
   agent.reset()

Среда будет работать 100 раз между агентом и задачей, когда будет выполнен следующий код:

experiment.doInteractions(100)

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

for i in range(1000):
   experiment.doInteractions(100)
   agent.learn()
   agent.reset()
   pylab.pcolor(table.params.reshape(81,4).max(1).reshape(9,9))
   pylab.savefig("test.png")

Вот полный код -

пример

maze.py

from scipy import *
import sys, time
import matplotlib.pyplot as pylab

from pybrain.rl.environments.mazes import Maze, MDPMazeTask
from pybrain.rl.learners.valuebased import ActionValueTable
from pybrain.rl.agents import LearningAgent
from pybrain.rl.learners import Q, QLambda, SARSA #@UnusedImport
from pybrain.rl.explorers import BoltzmannExplorer #@UnusedImport
from pybrain.rl.experiments import Experiment
from pybrain.rl.environments import Task

# create maze array
mazearray = array(
   [[1, 1, 1, 1, 1, 1, 1, 1, 1],
   [1, 0, 0, 1, 0, 0, 0, 0, 1],
   [1, 0, 0, 1, 0, 0, 1, 0, 1],
   [1, 0, 0, 1, 0, 0, 1, 0, 1],
   [1, 0, 0, 1, 0, 1, 1, 0, 1],
   [1, 0, 0, 0, 0, 0, 1, 0, 1],
   [1, 1, 1, 1, 1, 1, 1, 0, 1],
   [1, 0, 0, 0, 0, 0, 0, 0, 1],
   [1, 1, 1, 1, 1, 1, 1, 1, 1]]
)
env = Maze(mazearray, (7, 7))

# create task
task = MDPMazeTask(env)

#controller in PyBrain is like a module, for which the input is states and 
convert them into actions.
controller = ActionValueTable(81, 4)
controller.initialize(1.)

# create agent with controller and learner - using SARSA()
learner = SARSA()

# create agent
agent = LearningAgent(controller, learner)

# create experiment
experiment = Experiment(task, agent)

# prepare plotting
pylab.gray()
pylab.ion()

for i in range(1000):
experiment.doInteractions(100)

agent.learn()
agent.reset()

pylab.pcolor(controller.params.reshape(81,4).max(1).reshape(9,9))
pylab.savefig("test.png")

Вывод

python maze.py

Цвет в свободном поле будет изменяться на каждой итерации.