David Silver的强化学习公开课有几个特点,个人感觉首要的一个特点是偏重于讲解理论,而且有时候为了讲清楚一个理论的来龙去脉,也顺带讲了很多不常用的理论;还有一个特点是小例子很多,这些例子有时候不仅是为了讲清楚一个复杂的算法,而且通过例子会加深对一些概念的理解。同样我们在学习他的课程时,也应该注重实践,因为只有通过实践,才会对理论有更深的认识,有时候会在实践中纠正自己曾经一直自己以为正确其实是错误的认识。
本篇我们先简单尝试下怎么对强化学习中的个体、环境等进行建模,借此加深对一些概念的认识。随后我们简单介绍下热门强化学习库gym是怎么对环境及相关对象进行建模的。由于gym提供了许多强化学习经典的环境,学习者只需熟悉gym提供的接口,可以将主要精力放在个体解决强化学习问题的算法实现上,而不需自己搭建一个环境。
有了今天的基础,今后为了能够紧密贴合David的公开课,我们将模仿gym中环境类编写一个格子世界环境,来模拟其公开课中提到的一些示例,比如有风格子世界、随机行走、悬崖行走等小例子。通过这些贴合公开课的例子,相信对于初学者会相当直观。
一、强化学习问题需要描述那些内容
强化学习中最主要的两类对象是“个体”和“环境”,其次还有一些像“即时奖励”、“收获”、“状态”、“行为”、“价值”、“策略”、“学习”、“控制”等概念。这些概念把个体和环境联系起来。通过理论学习,我们知道:
1. 环境响应个体的行为。当个体执行一个行为时,它需要根据环境本身的动力学来更新环境,也包括更新个体状态,同时给以个体一个反馈信息:即时奖励。
2. 对于个体来说,它并不掌握整个环境信息,它只能通过观测来获得其可以获得的信息,它能观测到哪些信息取决于问题的难度;同样个体需要一定的行为与环境进行交互,哪些行为是被允许的,也要由个体和环境协商好。因此环境要确定个体的观测空间和行为空间。
3. 个体还应该有一个决策功能,该功能根据当前观测来判断下一时刻该采取什么行为,也就是决策过程。
4. 个体具有执行一个确定行为的功能。
5. 智能的个体应能从与环境的交互中学习到知识,进而在与环境交互时尽可能多的获取奖励,最终达到最大化累积奖励的目的。
6. 环境应该给个体设置一个(些)终止条件,即当个体处在这个状态或这些状态之一时,约定交互结束,即产生一个完整的Episode。随后重新开始一个Episode或者退出交互。
把上面的过程提炼成伪代码可以是下面这样:
class Environment():
self.states # 所有可能的状态集合
self.agent_cur_state # 记录个体当前的状态
self.observation_space # 个体的观测空间
self.action_space # 个体的行为空间
def reward(self) -> reward # 根据状态确定个体的即时奖励
def dynamics(self, action) -> None # 根据当前状态和个体的行为确定个体的新状态
def is_episode_end(self) -> Bool # 判断是否一个Episode结束
def obs_for_agent() -> obs # 环境把个体当前状态做一定变换,作为个体的观测
class Agent(env: Environment):
self.env = env # 个体依附于一个环境存在
self.obs # 个体的观测
self.reward # 个体获得的即时奖励
def performPolicy(self, obs) -> action # 个体执行一个策略产生一个行为
def performAction(self, action) -> None # 个体与环境交互,执行行为
action = self.performPolicy(self.obs)
self.env.dynamics(action)
def observe(self) -> next_obs, reward # 个体得到从环境反馈来的观测和奖励
self.obs = self.env.obs_for_agent()
self.reward = self.env.reward()
按照上面的