反向强化学习3——求解线性规划

本文收录在无痛的机器学习第二季目录中。

线性规划求解过程

在上一节我们介绍了反向强化学习的公式形式,接下来我们就要完成求解了。这个问题本质上是一个线性规划的问题,但是目前的公式形式还不是一个易于求解的形式,于是我们要把公式进行转变,采用变量替换的方式,将问题变换成标准的线性规划形式。这里涉及两个变量替换:

t \leftarrow \mathrm{min}_a\{(\pmb P_{s,\pi^*(s)} -\pmb P_{s,a})(\pmb I-\gamma \pmb P_{\pi^*})^{-1}\pmb R\}​

u \leftarrow |\pmb R|

于是可以得到:

max\{\sum_{i=1}^{|S|} \{t_i - \lambda u_i\}\}

s.t.

(\pmb P_{s, \pi^*(s)}(i) - \pmb P_{s,a}(i))(\pmb I - \gamma \pmb P_{\pi^*})^{-1}\pmb R \geqslant t_i ​,​ \forall a \in \pmb A - \pi^*(s),i=1,…|\pmb S|

(\pmb P_{s, \pi^*(s)}(i) - \pmb P_{s,a}(i))(\pmb I - \gamma \pmb P_{\pi^*})^{-1}\pmb R \geqslant 0 ,​ \forall a \in \pmb A - \pi^*(s),i=1,…,|\pmb S|

-u \leqslant \pmb R \leqslant u

 |\pmb R_i| \leqslant \pmb R_{max}

当我们将公式变成这个形式后,就可以进行求解了。我们可以从项目github.com/MatthewJA/In中找到关于这个问题的求解,具体的实现在irl/linear_irl.py中的irl函数,下面就来看看它是如何进行求解的。

代码中使用了cvxopt这个库,它实现常见的凸优化算法,其中也包括线性规划的求解方法。想要使用这个算法库进行求解,我们需要将问题整理成下面的形式:

\mathrm{max} \text{ } c^\mathrm{T}x

s.t.

\pmb Ax \leqslant b

其中A​为矩阵,b、c​为向量。最终我们将​A、b​、c​三部分输入到函数中,就可以利用算法库中的线性规划算法进行求解。

那么,上面的公式该怎么变成这个样子呢?我们可以看到,为了方便计算,此时我们共有三组变量R​,T​和U​,三组变量的长度都是​ |\pmb S| ,所以我们的目标函数就变成了:

\mathrm{max}[0…0, 1,…1, -\lambda,…,-\lambda]^\mathrm{T} [\pmb R, \pmb T, \pmb U]

接下来按照这样的形式,我们可以得到下面的条件约束,其中每一个表达式的维度都是(​ \pmb N,|\pmb S| ),每个表达式的N​有所不同,但是 |\pmb S| ​是一样的:

[-(\pmb P_{s, \pi^*(s)}(i) - \pmb P_{s,a}(i))(\pmb I - \gamma \pmb P_{\pi^*})^{-1}, -1, 0]^\mathrm{T} [\pmb R,\pmb T,\pmb U] \leqslant 0

[-(\pmb P_{s, \pi^*(s)}(i) - \pmb P_{s,a}(i))(\pmb I - \gamma \pmb P_{\pi^*})^{-1}, 0, 0]^\mathrm{T} [\pmb R,\pmb T,\pmb U] \leqslant 0

[-1, 0, -1]^\mathrm{T} [\pmb R,\pmb T,\pmb U] \leqslant 0

[1,0,-1]^\mathrm{T} [\pmb R,\pmb T,\pmb U] \leqslant 0

[-1,0,0]^\mathrm{T} [\pmb R,\pmb T,\pmb U] \leqslant \pmb R_{\mathrm{max}}

[1,0,0]^\mathrm{T} [\pmb R,\pmb T,\pmb U] \leqslant \pmb R_{\mathrm{max}}

​上面的公式还是不够详细,更为更详细的内容如图所示。

按照图14-1将数据组织好,我们就可以求解得到回报向量了。

实际案例

看完了上面的算法,我们来看一个具体的例子,这个例子是Grid World。Grid World是一个很简单的问题,我们给定一个​N* N的棋盘格,这个棋盘格上的每一个格子都可以作为落脚地。如图所示,我们可以用5 * 5​的格子举例子。

站在棋盘的格子上会产生不同的效果,棋盘格的最右下方是一个会得到奖励的格子,站在上面会获得1分,游戏结束。站在其他的格子上不会获得奖励,游戏仍会继续。

玩家在初始状态下会随机站在某个格子上,接下来的每一个时刻,玩家都可以做出决定,选择上下左右4个方向行进。但是世事无常,有时我们并不能到达我们想去的地方,游戏中存在着一股“妖风”,它会以一定的概率触发。触发后玩家的行进将不受控制,会任意选择一个方向前进,如果撞到棋盘的边缘,玩家将被阻挡在那里,停止前进。

整个游戏的规则并不复杂,站在我们的角度看,因为右下角是得分点,因此我们只要不停地向那个方向前进就可以了;如果已经到达了那里,那么保持停留就可以。

如果我们换一个思路:我们并不知道游戏的得分规则,只能看到一个老玩家的操作(这样简单的游戏,相信老玩家也不会太老)。我们能不能通过老玩家的操作推断出得分规则呢?这就是基于Grid World的反向强化学习问题。

由于这个问题并不复杂,我们可以用表格的方式表示问题中的策略、回报和价值向量,运用上面的算法,我们可以得到最终的结果,如图所示。

从图的结果可以看出,我们复原的这个​的Reward结果和真实结果相差很小,或者说这点差距并不能阻碍我们选出正确的策略。这样我们就完成了对这个问题的介绍。

编辑于 2018-06-11

文章被以下专栏收录