现在我们设计一张表格,其中每行是训练实体的状态,而每列是训练实体可能采取的动作。所以上例有 16×5 种可能的状态-行动对,其中每种状态都是迷宫中的一个单元格。 首先我们初始化矩阵(上文所述的 16×5 表格)为零矩阵,然后根据不同动作所获得的奖励更新矩阵的元素。当然,更新该矩阵的方法为计算贝尔曼方程(Bellman Equation): 「S」代表当前状态,「a」代表训练实体在当前状态下所采取的动作,「S'」代表采取该动作所产生的状态,「r'」是采取该动作所得到的奖励。贴现系数(discount factor)「γ」决定了训练实体对未来奖励的重视程度,γ越大,训练实体就会越重视以往经验,而γ越小,训练实体只重视眼前的利益。如果说训练实体向远离目标状态的状态运动,而该状态遇到蛇的概率减少,那么实时奖励将减少,未来奖励将增加,j2直播,训练实体更注重未来的奖励。 我们将每次迭代(训练主体的尝试动作)作为一个 episode。对于每一次 episode,训练主体将尝试到达目标状态,并且对于每一次动作,Q 矩阵元素都会进行一次更新。 现在让我们了解一下 Q 矩阵是如何计算的(为了更简洁,我们采用更小的 2×2 迷宫): Q 矩阵的初始状态如下(每行代表一个状态,每列代表一个动作): U—向上走, D—向下走, L—向左走, R—向右走 奖励矩阵如下所示: 其中 E 代表空值(NULL,训练主体不能采取该动作) 算法: 初始化 Q 矩阵为零矩阵,设定「γ」值,完成奖励矩阵。 对于每一 episode,选择一个随机起始状态(在这个案例中,我们严格限制起始状态为-1)。 在当前状态(S)的所有可能动作中选择一个。 作为该动作(a)的结果,训练主体移往下一个状态(S')。 对于状态(S')产生的所有可能动作,选择 Q 值最大的动作。 使用贝尔曼方程(Bellman Equation)更新 Q 矩阵。 将下一个状态设置为当前状态。 如果到达目标状态,结束算法。 我们可以从以下一段伪代码进一步理解: 现在假设训练主体从状态 1 开始,其可以采取动作 D 或 R。如果采取了动作 D,那么训练主体到达状态 3(蛇),并可以采取动作 U 或 R。现在取值γ = 0.8,那么方程有: Q(1,D) = R(1,D) + γ*[max(Q(3,U) & Q(3,R))] Q(1,D) = -10 + 0.8*0 = -10 其中,因为 Q 矩阵还没有更新,max(Q(3,U) & Q(3,R)) = 0。设定设定踩上蛇的奖励为-10。现在新的 Q 矩阵的值就如下所示: 现在,状态 3 为当前状态,从状态 3 采取了动作 R。训练主体就到达状态 4,并其可以采取动作 U 或 L。 Q(3,R) = R(3,R) + 0.8*[max(Q(4,U) & Q(4,L))] Q(3,R) = 10 + 0.8*0 = 10 再一次更新 Q 矩阵的值: j2直播,打造自己的迷宫智能体" src="http://www.wzatv.cc/atv/uploads/allimg/170404/1924106419_0.png" /> 所以,现在训练主体到达目标状态 4。接下来终止该进程,并进行更多的训练直到训练主体理解了所有状态和动作,且所有的 Q 矩阵元素成为常数。这也就意味为训练主体已经尝试了所有的状态-动作对。 这一过程的 Python 实现: 最后 Q 矩阵的输出: (责任编辑:本港台直播) |