最近在学习强化学习相关知识,强烈推荐西湖大学赵世钰老师的课程,讲解的非常清晰流畅,一路学习下来令人身心大爽,感受数学抽丝剥茧,化繁为简的神奇魅力。
bellman方程还是比较容易理解的:当前状态下的state value等于即时奖励加上未来状态下的state value。
向量形式版本如下:
整体完整版本如下:
上述公式中只涉及状态变量,而状态的改变是通过action实现的。基于全概率公式,利用状态-动作概率分布函数,可以推导得到局部细节的bellman方程如下:
在一步一步推导bellman方程的过程中,是从局部细节版到整体完整版,再到清晰明了的向量形式。但我们理解时,可以反其道而行之。根据向量形式的公式感性认识bellman方程的内涵,再通过理性思考不断展开细化向量形式,得到整体完整版,再进一步细化得到局部细节版,如此形成闭环学习认知,实现知识点的融会贯通。这正是华老所提倡的读书从薄到厚,再从厚到薄。与大家共勉!!!
在讲解bellman方程的向量形式的课程最后,赵老师给出了几个计算实例,不同于之前讲解知识点所采用的2阶矩阵,例题给出的是5阶状态矩阵。一时无法快速给出每个状态的state value。为了验证自己的学习效果,本人选择其中状态转移概率分布最简单的一个案例进行分析,如下图红框所示。
可以发现,每个状态的动作方向都是确定的,且都是指向自己的右侧,因此其状态转移矩阵
P
P
P必呈现一定的规律性。以第一行中的5个状态为例,不难得到转移矩阵为:
以此类推,可以得到完整的25阶的转移矩阵。
接着,列出每个状态的即使奖励,得到向量
r
r
r,代入向量形式的bellman方程,即可求解得到最终的state value。
笔者利用matlab实现完整求解过程如下:
clc;
close all;
clear all;
strele = zeros(5,5);
strele(1,2) = 1;
strele(2,3) = 1;
strele(3,4) = 1;
strele(4,5) = 1;
strele(5,5) = 1;
P = zeros(25,25);
for i = 0:4
P(5*i+1:5*i+5,5*i+1:5*i+5) = strele;
end
r = zeros(25,1);
numlists = [5,6,7,10,12,15,16,18,20,21,25]; % 不难得到每个状态的即时奖励。
for i = 1:length(numlists)
r(numlists(i),1) = -1;
end
r(17,1) = 1;
res = inv(eye(25) - 0.9*P) * r;
res = reshape(res,5,5)'; % 因为上述构造P和r矩阵是按照行优先,而matlab是列优先,所以需要转置
最终求解得到的res矩阵为:
如果保留一位小数后,得到的结果和课程中给出的数据是一致的,验证了上述计算过程的正确性。因为其他案例中不存在如此明显的规律性,需要人为挨个计算得到P和r矩阵,大家感兴趣可以进一步测试。