标签:q-learning
此篇文接上篇
为了更好的理解Q-Learning算法是如何工作的,我们一步步手动计算一些过程。
我们把γ的值设为0.8,初始状态在房间1中。
把Q矩阵初始化为0
让我们看一下R矩阵的第二行(状态1),对当前状态1有两种可能的动作:到达状态3或者到达状态5.我们随机选择到达状态5作为采取的动作。
现在让我们想象一下Agent在状态5会发生什么。观察R矩阵的第六行(状态5),它有三种可能的动作:到达状态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(5,1)的回报值是100.
接下来的状态5,现在成了当前状态。因为状态5是目标状态,所以我们就完成了一个场景(这个翻译似乎不妥)。
我们的Agent的大脑现在是更新过的矩阵Q.
个人觉得上面更新的矩阵应该是有错误的,这个图片是从原文网站上直接down下来的,应该是Q(1,5)=100,而不是Q(2,5)=100
下一个过程中,我们随机选择状态3作为起始状态。
注意观察R矩阵的第四行,它有三个可能的动作:到达状态1,2或4
我们随机选择到达状态1作为我们的动作。
现在我们想象我们在状态1,观察R矩阵的第二行(即状态1),它有两个可能的动作:到达状态3或者状态5.然后我们计算Q值:
Q(state, action) = R(state, action) + Gamma * Max[Q(next state, all actions)]
Q(3,1) = R(3,1) + 0.8 * Max[Q(1, 3), Q(1, 5)] =
0 + 0.8 * Max(0, 100) = 80
这里我们使用上个过程中更新的Q矩阵, Q(1, 3) = 0而Q(1, 5) = 100
Q(3,1)的计算值为80,这是由于回报值R(3,1)=0.
Q矩阵变成了以下所示:
下一个状态1,现在变成当前状态了。然后重复Q-Learning的内部循环,因为此时状态1还不是目标状态。
所以,以1为当前状态开始新的循环,那么就有两种可能的动作:到达状态3或者状态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(1,5)的回报值。这个结果没有改变矩阵Q。因为矩阵5是目标状态,因此我们完成了这次过程。现在我们的Agent的大脑包含的矩阵Q为:
如果我们的Agent通过进一步的过程学习更多的话,那么Q矩阵的最终状态将会是以下这样的:
这个Q矩阵,可以通过这种方式标准化:把所有非零项的值除以非零项的最大值(这里是500),然后乘以100。然后这个矩阵就变成下面所示:
一旦矩阵Q达到了接近收敛的状态,我们就知道我们的Agent已经学到了到达目标状态的最优路径。找到到达目标状态的最佳状态序列很简单:从初始状态出发,每一个动作都选择有最大Q值的那条链路。
举个例子来说,加入起始状态为2,那么Agent可以使用Q矩阵作为自己的向导:
从状态2开始,最大的Q值建议的动作是到达3;
从状态3开始,最大的Q值建议了两个动作:到达状态1或者状态4
假设我们到达了状态1
从状态1开始最大的Q值建议的动作是到达状态5
因此,状态顺序是2--3--1--5
标签:q-learning
原文地址:http://blog.csdn.net/suozqwp/article/details/44175555