强化学习(reinforcement learning)教程

正文:

Q学习算法是一种用来解决马尔可夫决策过程中最优化问题的方法。Q学习算法最大的特点是它具有选择瞬时奖励和延迟奖励的能力。在每一步中,agent通过观察状态s的向量,然后选择并执行行动a,随着状态从s转移到s‘agent能够收到一个强化值rs a)。训练的目标是发现一条行动的路径,从而使得整个过程强化值的和最大,也就是从起点到终点间的一条最短路径。

Q学习算法的转移规则表示为以下形式:

Q (state action) = R(state action) + gamma * Max[Q(next state all actions)]

参数gamma的范围是[01],从而保证结果收敛。如果gamma更接近0agent趋向于只考虑瞬时奖励值,反之如果更接近1,则agent为延迟奖励赋予更大的权重,更侧重于延迟奖励。

Q学习算法的步骤表示如下:

设置gamma以及环境奖励矩阵R

将矩阵Q初始化为0

对于每次迭代(episode):

随机选择一个初始状态;

直到达到目标状态:

从所有可能的行动中选择一个行动;

执行行动到达下一状态;

获取下一状态所有行动中最大的Q值;

利用公式更新Q

下面的教程通过一个简单而详细的数值例子介绍Q学习算法的概念。本例描述了一个通过agent利用非监督学习学习未知的环境。对比该例和的源代码,你可能也会发现很有帮助。

假设一个建筑内有的5间房间,房间之间通过门连接,如下图所示。我们为每个房间进行标号,记为0-4。建筑外面也可以认为是一个大的房间(5),注意门14均可以到达5


我们可以用图的形式表示房间的连接情况,每个房间对应一个节点,每扇门对应节点间的弧。


在本例中,我们假设在其中任意一个房间中放置一个agent,然后要求agent从该房间走出该建筑(即目标房间)。换而言之,目标房间就是5。为了把这个房间作为目标,我们需要为每个门关联一些奖励值(节点间的弧)。与目标直接相连的门具有瞬时奖励,值设为100。其他没有直连的门的奖励为0。注意因为门是双向的,因此弧是双向的,弧之间瞬时奖励值如下图所示。


当然,房间5和自己相连,拥有100的奖励值,其它与5直连的房间都有100的奖励值。在Q学习中,目标是以最高的奖励值到达目标状态,因此,如果agent到达了目标,他将永远停留,这种类型的目标称为"absorbing goal"

假设我们的agent是一个能够通过实验学习的“哑巴虚拟机器人”。Agent能够从一个房间到达另一个房间,但是对环境一无所知,而且也不知道哪些门通向外面。

假设我们要为可能处于任意房间的agent建立模型。现在我们假设agent在房间2,我们希望agent能够通过学习达到5


Q学习中术语包括状态和行为。

我们把0-5每个房间称为状态,把agent从一个房间移动到另一房间称为行为(action),在图中,状态表示一个节点,行为表示一条有向弧。


假设agent在状态2,因为23直连,因此可以从状态2可以移动到状态3。从状态2不能直接到状态1因为两者不直连。同理,从状态3可以到状态14或者回到2。如果agent在状态4,那么就有3个可能的行为,到05或者3。如果agent在状态1,那么可以到53,从0只能到达4

我们可以根据状态间的关系和瞬时奖励值创建矩阵R


-1表示状态间不直连。例如0不能直接到达1

现在可以增加一个相似的矩阵Q,它可以看作是agent的“大脑”,表示了agent通过学习环境留下的“记忆”,矩阵Q的行表示agent当前的状态,列表示到达下一状态可能的行为。

在开始时agent对环境一无所知,因此矩阵Q初始化为0。在本例中,为了简单起见,我们假设状态的数量已知,如果状态数量未知,矩阵Q初始化时只有一个元素,如果发现新状态后再添加行和列。

Q学习的转移规则是一个很简单的方程:

Q(state action) = R(state action) + Gamma * Max[Q(next state all actions)]

根据这个方程,一个值被赋予给矩阵Q中一个特定值,它等于R矩阵中对应值的和和学习参数gamma,乘以下一状态中所有行为中Q值最高的值。

虚拟的agent通过经验进行学习,没有老师(称为无监督学习)。Agent从一个状态转移到另一状态不断的探索直到到达目标。我们把每一次探索称为一次迭代(episode)。每一个episode包含agent从初始状态移动到目标状态。每当agent到达目标状态,程序继续下一episode

Q学习算法步骤如下:

设置gamma参数以及矩阵R

初始化矩阵Q

对于每次episode

随机选择一个初始状态;

目标状态没有到达:

从当前状态的所有行为中选择一个

转移到下一状态;

计算;

将下一状态设为当前状态;

Agent通过以上算法进行学习,每次episode相当于一次训练。在每一次训练中,agent探索环境(矩阵R表示),接受奖励直到到达目标状态。训练的目的是增强agent的大脑,即矩阵Q。训练越多,Q结果越好。通过这种方式,如果Q被加强了,而不是反复探索,不断回到同一房间,就能快速找到目标状态。

参数gamma的取值范围是0-1,如果gamma趋近于0,则agent趋向于考虑瞬时奖励,如果接近1,则趋向于未来的奖励,延迟奖励。

为了使用矩阵Qagent仅仅跟踪状态,从初始状态到目标状态。算法能够根据矩阵Q中记录的奖励值为当前状态找到具有最大奖励值的行为。

为了更好理解Q学习算法的工作原理,我们一步一步的进行演示,剩下的步骤可以参考源代码。

首先设置gamma参数=08,初始状态为1

将矩阵Q全部初始化为0


观察矩阵R的第二行,当前状态有两个行为,到达状态3或者状态5。通过随机的选择,我们选择到达状态5


现在我们想像下如果agent到达状态5后会发生什么?观察矩阵R的第6行,它有三个行为,到达状态14,、5

Q(state action) = R(state action) + Gamma * Max[Q(next state all actions)]

Q(1 5) = R(1 5) + 0.8 * Max[Q(5 1) Q(5 4) Q(5 5)] = 100 + 08 * 0 = 100

因为矩阵Q初始化为0Q(51) Q(54)Q(55)的值都为0Q(15)的计算结果为100因为矩阵RR(51)的瞬时奖励为100

下一状态5,成为当前状态。因为5是目标状态,我们结束一次episode。更新后的矩阵Q为:


下一个episode,我们随机选择一个初始状态。这一次我们选择状态3

观察矩阵R的第4行,它有三个行为,到达状态124。通过随机选择,我们到达状态1

现在假设到达状态1,观察矩阵R的第二行,它有两个行为,到达状态35,接下来计算Q

Q(state action) = R(state action) + Gamma * Max[Q(next state all actions)]

Q(1 5) = R(1 5) + 08 * Max[Q(1 2) Q(1 5)] = 0 + 08 * Max(0 100) = 80

我们用更新过的矩阵Q进行计算。Q(13)=0Q(15)=100Q(31)的结果=80因为奖励为0。矩阵Q变为:


 此时状态1成为当前状态,我们重复Q算法的内循环因为状态1不是目标状态。

开始新的循环,状态1有两个行为,到达状态3或者5,很幸运,我们选择状态5


现在假设在状态55有三个行为,145。我们利用这三个行为中最大的奖励值更新矩阵Q

Q(state action) = R(state action) + Gamma * Max[Q(next state all actions)]

Q(1 5) = R(1 5) + 0.8 * Max[Q(5 1) Q(5 4) Q(5 5)] = 100 + 08 * 0 = 100 

更新后的矩阵QQ(51) Q(54) Q(55)全部为0Q(15)的计算结果为100因为矩阵RR(51)的瞬时奖励为100

因为5是目标状态,我们结束这次episode,矩阵Q更新为:


如果agent不断地学习,矩阵Q最终会收敛,如下图所示。


接下来可以对矩阵Q进行标准化


一旦矩阵Q趋于收敛,我们知道agent学到了到达目标状态的最优路径。跟踪最优状态的序列和弧就可以得到最高的奖励值。


例如,从初始状态2agent以矩阵Q为指导;

从状态2,最大Q值指向状态3

状态3,最大Q指指向14,假设随机选择1

从状态1最大Q值指向状态5

因此序列为2-3-1-5

1


Q Matrix values:

0 0 0 0 396 0

0 0 0 316 0 496

0 0 0 316 0 0

0 396 252 0 396 0

316 0 0 316 0 496

0 396 0 0 396 496


Shortest routes from initial states:

1 5

3 1 5

5 5

2 3 1 5

4 5

0 4 5

2和例1相比,仅仅增加了节点。类似的代码,少量的优化


Shortest routes from initial states:

1 0 4 8 9 5 6 2 3 7 11 15

3 7 11 15

5 6 2 3 7 11 15

2 3 7 11 15

4 8 9 5 6 2 3 7 11 15

0 4 8 9 5 6 2 3 7 11 15

原文链接:http://mnemstudio.org/path-finding-q-learning-tutorial.htm

译文链接:http://blog.csdn.net/xudong0612/article/details/9304811/

发布了392 篇原创文章 · 获赞 487 · 访问量 239万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览