前一阵研究强化学习,发现中文的资料非常少,实例就更少。于是翻译一篇q学习算法的教程,供需要的人学习。
原文链接:http://mnemstudio.org/path-finding-q-learning-tutorial.htm
正文:
Q学习算法是一种用来解决马尔可夫决策过程中最优化问题的方法。Q学习算法最大的特点是它具有选择瞬时奖励和延迟奖励的能力。在每一步中,agent通过观察状态s的向量,然后选择并执行行动a,随着状态从s转移到s‘,agent能够收到一个强化值r(s, a)。训练的目标是发现一条行动的路径,从而使得整个过程强化值的和最大,也就是从起点到终点间的一条最短路径。
Q学习算法的转移规则表示为以下形式:
Q (state, action) = R(state, action) + gamma * Max[Q(next state, all actions)]
参数gamma的范围是[0,1],从而保证结果收敛。如果gamma更接近0,agent趋向于只考虑瞬时奖励值,反之如果更接近1,则agent为延迟奖励赋予更大的权重,更侧重于延迟奖励。
Q学习算法的步骤表示如下:
设置gamma以及环境奖励矩阵R;
将矩阵Q初始化为0;
对于每次迭代(episode):
随机选择一个初始状态;
直到达到目标状态:
从所有可能的行动中选择一个行动;
执行行动到达下一状态;
获取下一状态所有行动中最大的Q值;
利用公式更新Q值;
下面的教程通过一个简单而详细的数值例子介绍Q学习算法的概念。本例描述了一个通过agent利用非监督学习学习未知的环境。对比该例和的源代码,你可能也会发现很有帮助。
假设一个建筑内有的5间房间,房间之间通过门连接,如下图所示。我们为每个房间进行标号,记为0-4。建筑外面也可以认为是一个大的房间(5),注意门1和4均可以到达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,因为2与3直连,因此可以从状态2可以移动到状态3。从状态2不能直接到状态1因为两者不直连。同理,从状态3可以到状态1或4或者回到2。如果agent在状态4,那么就有3个可能的行为,到0、5或者3。如果agent在状态1,那么可以到5或3,从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,则趋向于未来的奖励,延迟奖励。
为了使用矩阵Q,agent仅仅跟踪状态,从初始状态到目标状态。算法能够根据矩阵Q中记录的奖励值为当前状态找到具有最大奖励值的行为。
为了更好理解Q学习算法的工作原理,我们一步一步的进行演示,剩下的步骤可以参考源代码。
首先设置gamma参数=0。8,初始状态为1。
将矩阵Q全部初始化为0。
观察矩阵R的第二行,当前状态有两个行为,到达状态3或者状态5。通过随机的选择,我们选择到达状态5。
现在我们想像下如果agent到达状态5后会发生什么?观察矩阵R的第6行,它有三个行为,到达状态1、4,、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 + 0。8 * 0 = 100
因为矩阵Q初始化为0,Q(5,1), Q(5,4)Q(5,5)的值都为0。Q(1,5)的计算结果为100因为矩阵R中R(5,1)的瞬时奖励为100。
下一状态5,成为当前状态。因为5是目标状态,我们结束一次episode。更新后的矩阵Q为:
下一个episode,我们随机选择一个初始状态。这一次我们选择状态3
观察矩阵R的第4行,它有三个行为,到达状态1,2或4。通过随机选择,我们到达状态1
现在假设到达状态1,观察矩阵R的第二行,它有两个行为,到达状态3或5,接下来计算Q值
Q(state, action) = R(state, action) + Gamma * Max[Q(next state, all actions)]
Q(1, 5) = R(1, 5) + 0。8 * Max[Q(1, 2), Q(1, 5)] = 0 + 0。8 * Max(0, 100) = 80
我们用更新过的矩阵Q进行计算。Q(1,3)=0Q(1,5)=100。Q(3,1)的结果=80因为奖励为0。矩阵Q变为:
此时状态1成为当前状态,我们重复Q算法的内循环因为状态1不是目标状态。
开始新的循环,状态1有两个行为,到达状态3或者5,很幸运,我们选择状态5。
现在假设在状态5,5有三个行为,1,4,5。我们利用这三个行为中最大的奖励值更新矩阵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 + 0。8 * 0 = 100
更新后的矩阵Q,Q(5,1), Q(5,4) Q(5,5)全部为0,Q(1,5)的计算结果为100因为矩阵R中R(5,1)的瞬时奖励为100。
因为5是目标状态,我们结束这次episode,矩阵Q更新为:
如果agent不断地学习,矩阵Q最终会收敛,如下图所示。
接下来可以对矩阵Q进行标准化
一旦矩阵Q趋于收敛,我们知道agent学到了到达目标状态的最优路径。跟踪最优状态的序列和弧就可以得到最高的奖励值。
例如,从初始状态2,agent以矩阵Q为指导;
从状态2,最大Q值指向状态3;
状态3,最大Q指指向1或4,假设随机选择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 例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