PyBrain - 强化学习模块


强化学习(RL)是机器学习的重要组成部分。强化学习使智能体根据环境的输入来学习其Behave。

强化过程中​​相互作用的组件如下:

  • 环境
  • 代理人
  • 任务
  • 实验

强化学习的布局如下 -

强化学习模块

在强化学习中,智能体在迭代中与环境对话。在每次迭代中,代理都会收到具有奖励的观察结果。然后它选择操作并将其发送到环境。每次迭代时的环境都会移动到一个新的状态,并且每次收到的奖励都会被保存。

RL 代理的目标是收集尽可能多的奖励。在迭代之间,将代理的性能与表现良好的代理的性能进行比较,性能的差异会导致奖励或失败。强化学习主要用于解决问题的任务,如机器人控制、电梯、电信、游戏等。

让我们看看如何在 Pybrain 中使用 RL。

我们将研究迷宫环境,该环境将使用二维 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

下一步是创建代理。

Agent 在 RL 中发挥着重要作用。它将使用 getAction() 和integrateObservation() 方法与迷宫环境交互。

代理有一个控制器(它将状态映射到操作)和一个学习器。

PyBrain 中的控制器就像一个模块,其输入是状态并将其转换为动作。

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

ActionValueTable需要2个输入,即状态数和动作数标准迷宫环境有 4 个动作:北、南、东、西。

现在我们将创建一个学习器。我们将使用 SARSA() 学习算法来让学习器与代理一起使用。

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

步骤4

此步骤是将 Agent 添加到环境中。

为了将代理连接到环境,我们需要一个称为任务的特殊组件。任务的作用是寻找环境中的目标以及代理如何获得行动奖励。

环境有它自己的任务。我们使用的 Maze 环境有 MDPMazeTask 任务。MDP 代表“马尔可夫决策过程”,这意味着智能体知道自己在迷宫中的位置。环境将是任务的参数。

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")

这是完整的代码 -

例子

迷宫.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")

输出

蟒蛇迷宫.py

蟒蛇迷宫

自由字段中的颜色将在每次迭代时发生变化。