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
Цвет в свободном поле будет изменяться на каждой итерации.