经典教材Reinforcement Learning: An Introduction 第二版由强化领域权威Richard S. Sutton 和 Andrew G. Barto 完成编写,内容深入浅出,非常适合初学者。在本篇中,引入Grid World示例,结合强化学习核心概念,并用python代码实现OpenAI Gym的模拟环境,进一步实现策略评价算法。
先来回顾一下强化学习的建模基础:有限马尔可夫决策过程(Finite Markov Decision Process, Finite MDP)。如下图,强化学习模型将世界抽象成两个实体,强化学习解决目标的主体Agent和其他外部环境。它们之间的交互过程遵从有限马尔可夫决策过程:若Agent在t时间步骤时处于状态 S t S_t St,采取动作 A t A_t At,然后环境根据自身机制,产生Reward R t + 1 R_{t+1} Rt+1 并将Agent状态变为 S t + 1 S_{t+1} St+1。
环境自身机制又称为dynamics,工程上可以看成一个输入(S, A),输出(S, R)的方法。由于MDP包含随机过程,某个输入并不能确定唯一输出,而会根据概率分布输出不同的(S, R)。Finite MDP简化了时间对于模型的影响,因为(S, R)只和(S, A)有关,不和时间t有关。另外,有限指的是S,A,R的状态数量是有限的。数学上dynamics可以如下表示
p ( s ′ , r ∣ s , a ) ≐ Pr { S t = s ′ , R t = r ∣ S t − 1 = s , A t − 1 = a } p\left(s^{\prime}, r \mid s, a\right) \doteq \operatorname{Pr}\left\{S_{t}=s^{\prime}, R_{t}=r \mid S_{t-1}=s, A_{t-1}=a\right\} p(s′,r∣s,a)≐Pr{St=s′,Rt=r∣St−1=s,At−1=a}
即是四元组作为输入的概率函数 p : S × R × S × A → [ 0 , 1 ] p: S \times R \times S \times A \rightarrow [0, 1] p:S×R×S×A→[0,1]。
满足
∑ s ′ ∈ S ∑ r ∈ R p ( s ′ , r ∣ s , a ) = 1 , for all s ∈ S , a ∈ A ( s ) \sum_{s^{\prime} \in \mathcal{S}} \sum_{r \in \mathcal{R}} p\left(s^{\prime}, r \mid s, a\right)=1, \text { for all } s \in \mathcal{S}, a \in \mathcal{A}(s) s′∈S∑r∈R∑p(s′,r∣s,a)=1, for all s∈S,a∈A(s)
以Grid World为例,当Agent处于编号1的网格时,可以往四个方向走,往任意方向走都只产生一种 S, R,因为这个简单的游戏是确定性的,不存在某一动作导致stochastic状态。例如,在1号网格往左就到了终点网格(编号0),得到Reward -1这个规则可以如下表示
p ( s ′ = 0 , r = − 1 ∣ s = 1 , a = L ) = 1 p\left(s^{\prime}=0, r=-1 \mid s=1, a=\text{L}\right) = 1 p(s′=0,r=−1∣s=1,a=L)=1
因此,状态s=1的所有dynamics概率映射为
p ( s ′ = 0 , r = − 1 ∣ s = 1 , a = L ) = 1 p ( s ′ = 2 , r = − 1 ∣ s = 1 , a = R ) = 1 p ( s ′ = 1 , r = − 1 ∣ s = 1 , a = U ) = 1 p ( s ′ = 5 , r = − 1 ∣ s = 1 , a = D ) = 1 \begin{aligned} p\left(s^{\prime}=0, r=-1 \mid s=1, a=\text{L}\right) &=& 1 \\ p\left(s^{\prime}=2, r=-1 \mid s=1, a=\text{R}\right) &=& 1 \\ p\left(s^{\prime}=1, r=-1 \mid s=1, a=\text{U}\right) &=& 1 \\ p\left(s^{\prime}=5, r=-1 \mid s=1, a=\text{D}\right) &=& 1 \end{aligned} p(s′=0,r=−1∣s=1,a=L)p(s′=2,r=−1∣s=1,a=R)p(s′=1,r=−1∣s=1,a=U)p(s′=5,r=−1∣s=1,a=D)====1111
在给定了问题以及定义了强化学习的模型之后,强化学习的目的当然是通过学习让Agent能够学到最佳策略 π ∗ \pi_{*} π∗,也就是在某个状态下的行动分布,记成 π ( a ∣ s ) \pi(a|s) π(a∣s)。对应在数值上的优化目标是Agent在一系列过程中采取某种策略的reward总和的期望(Expected Return)。下面公式定义了t步往后的reward总和,其中 γ \gamma γ 为discount factor,用于权衡短期和长期reward对于当前Agent的效用影响。等式最后一步的意义是t步后的reward总和等价于t步所获的立即reward R t + 1 R_{t+1} Rt+1,加上t+1步后的reward总和 γ G t + 1 \gamma G_{t+1} γGt+1。
G t ≐ R t + 1 + γ R t + 2 + γ 2 R t + 3 + γ 3 R t + 4 + ⋯ = R t + 1 + γ ( R t + 2 + γ R t + 3 + γ 2 R t + 4 + ⋯ ) = R t + 1 + γ G t + 1 \begin{aligned} G_{t} & \doteq R_{t+1}+\gamma R_{t+2}+\gamma^{2} R_{t+3}+\gamma^{3} R_{t+4}+\cdots \\ &=R_{t+1}+\gamma\left(R_{t+2}+\gamma R_{t+3}+\gamma^{2} R_{t+4}+\cdots\right) \\ &=R_{t+1}+\gamma G_{t+1} \end{aligned} Gt≐Rt+1+γRt+2+γ2Rt+3+γ3Rt+4+⋯=Rt+1+γ(Rt+2+γRt+3+γ2Rt+4+⋯)=Rt+1+γGt+1
有了reward总和的定义,评价Agent策略 π \pi π 就可以定义成Agent在状态 s 时采用此策略的Expected Return。
v π ( s ) ≐ E π [ G t ∣ S t = s ] v_{\pi}(s) \doteq \mathbb{E}_{\pi}\left[G_{t} \mid S_{t}=s\right] vπ(s)≐Eπ[Gt∣St=s]
下面公式推导了 v π ( s ) v_{\pi}(s) vπ(s) 数值上和相关状态 s ′ s{\prime} s′ 的关系:
v π ( s ) ≐ E π [ G t ∣ S t = s ] = E π [ ∑ k = 0 ∞ γ k R t + k + 1 ∣ S t = s ] = E π [ R t + 1 + γ G t + 1 ∣ S t = s ] = ∑ a π ( a ∣ s ) ∑ s ′ ∑ r p ( s ′ , r ∣ s , a ) [ r + γ E π [ G t + 1 ∣ S t + 1 = s ′ ] ] = ∑ a π ( a ∣ s ) ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ v π ( s ′ ) ] for all s ∈ S \begin{aligned} v_{\pi}(s) &\doteq \mathbb{E}_{\pi}\left[G_{t} \mid S_{t}=s\right] \\ &=\mathbb{E}_{\pi}\left[\sum_{k=0}^{\infty} \gamma^{k} R_{t+k+1} \mid S_{t}=s\right]\\ &=\mathbb{E}_{\pi}\left[R_{t+1}+\gamma G_{t+1} \mid S_{t}=s\right] \\ &=\sum_{a} \pi(a \mid s) \sum_{s^{\prime}} \sum_{r} p\left(s^{\prime}, r \mid s, a\right)\left[r+\gamma \mathbb{E}_{\pi}\left[G_{t+1} \mid S_{t+1}=s^{\prime}\right]\right] \\ &=\sum_{a} \pi(a \mid s) \sum_{s^{\prime}, r} p\left(s^{\prime}, r \mid s, a\right)\left[r+\gamma v_{\pi}\left(s^{\prime}\right)\right] \quad \text { for all } s \in \mathcal{S} \end{aligned} vπ(s)≐Eπ[Gt∣St=s]=Eπ[k=0∑∞γkRt+k+1∣St=s]=Eπ[Rt+1+γGt+1∣St=s]=a∑π(a∣s)s′∑r∑p(s′,r∣s,a)[r+γEπ[Gt+1∣St+1=s′]]=a∑π(a∣s)s′,r∑p(s′,r∣s,a)[r+γvπ(s′)] for all s∈S
注意到如果将 v π ( s ) v_{\pi}(s) vπ(s) 看成未知数,上式即形成 ∣ S ∣ \mid \mathcal{S} \mid ∣S∣ 个未知变量的方程组,可以在数值上解得各个 v π ( s ) v_{\pi}(s) vπ(s)。
书中用Backup Diagram来表示递推关系,下图是 v π ( s ) v_{\pi}(s) vπ(s)的backup diagram。
尽管v值可以来衡量策略,但由于 v π ( s ) v_{\pi}(s) vπ(s) 是Agent在策略 π ( a ∣ s ) \pi(a|s) π(a∣s)的Expected Return,将不同的action拆出来单独计算Expected Return,这样的做法有时更为直接,这就是著名的Q Learning中的q 值,记成 q π ( s , a ) q_{\pi}(s, a) qπ(s,a) 。
q π ( s , a ) ≐ E π [ G t ∣ S t = s , A t = a ] q_{\pi}(s, a) \doteq \mathbb{E}_{\pi}\left[G_{t} \mid S_{t}=s, A_{t}=a\right] qπ(s,a)≐Eπ[Gt∣St=s,At=a]
下面是 $q_{\pi}(s, a) $ 的递推 backup diagram。
对于所有状态集合 S \mathcal{S} S,策略 π {\pi} π的评价指标 v π ( s ) v_{\pi}(s) vπ(s) 是一个向量,本质上是无法相互比较的。但由于存在Bellman 最佳原则(Bellman’s principle of optimality):在有限状态情况下,一定存在一个或者多个最好的策略 π ∗ {\pi}_{*} π∗,它在所有状态下的v值都是最好的,即 v π ∗ ( s ) ≥ v π ′ ( s ) for all s ∈ S v_{\pi_{*}}(s) \ge v_{\pi^{\prime}}(s) \text { for all } s \in \mathcal{S} vπ∗(s)≥vπ′(s) for all s∈S。
因此,最佳v值定义为最佳策略 π ∗ {\pi}_{*} π∗ 对应的 v 值
v ∗ ( s ) ≐ max π v π ( s ) v_{*}(s) \doteq \max_{\pi} v_{\pi}(s) v∗(s)≐πmaxvπ(s)
同理,也存在最佳q值,记为
q ∗ ( s , a ) ≐ max π q π ( s , a ) \begin{aligned} q_{*}(s, a) &\doteq \max_{\pi} q_{\pi}(s,a) \end{aligned} q∗(s,a)≐πmaxqπ(s,a)
将 v ∗ ( s ) v_{*}(s) v∗(s) 改写成递推形式,称为 Bellman Optimality Equation,推导如下
v ∗ ( s ) = max a ∈ A ( s ) q π ∗ ( s , a ) = max a E π ∗ [ G t ∣ S t = s , A t = a ] = max a E π ∗ [ R t + 1 + γ G t + 1 ∣ S t = s , A t = a ] = max a E [ R t + 1 + γ v ∗ ( S t + 1 ) ∣ S t = s , A t = a ] = max a ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ v ∗ ( s ′ ) ] \begin{aligned} v_{*}(s) &=\max _{a \in \mathcal{A}(s)} q_{\pi_{*}}(s, a) \\ &=\max _{a} \mathbb{E}_{\pi_{*}}\left[G_{t} \mid S_{t}=s, A_{t}=a\right] \\ &=\max _{a} \mathbb{E}_{\pi_{*}}\left[R_{t+1}+\gamma G_{t+1} \mid S_{t}=s, A_{t}=a\right] \\ &=\max _{a} \mathbb{E}\left[R_{t+1}+\gamma v_{*}\left(S_{t+1}\right) \mid S_{t}=s, A_{t}=a\right] \\ &=\max _{a} \sum_{s^{\prime}, r} p\left(s^{\prime}, r \mid s, a\right)\left[r+\gamma v_{*}\left(s^{\prime}\right)\right] \end{aligned} v∗(s)=a∈A(s)maxqπ∗(s,a)=amaxEπ∗[Gt∣St=s,At=a]=amaxEπ∗[Rt+1+γGt+1∣St=s,At=a]=amaxE[Rt+1+γv∗(St+1)∣St=s,At=a]=amaxs′,r∑p(s′,r∣s,a)[r+γv∗(s′)]
直觉上可以理解为状态 s 对应的最佳v值是只采取此状态下的最佳动作后的Expected Return。
最佳q值递归形式的意义为最佳策略下状态s时采取行动 a 的Expected Return,等于所有可能后续状态 s’ 下采取最优行动的Expected Return的均值。推导如下:
q ∗ ( s , a ) = E [ R t + 1 + γ max a ′ q ∗ ( S t + 1 , a ′ ) ∣ S t = s , A t = a ] = ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ max a ′ q ∗ ( s ′ , a ′ ) ] \begin{aligned} q_{*}(s, a) &=\mathbb{E}\left[R_{t+1}+\gamma \max _{a^{\prime}} q_{*}\left(S_{t+1}, a^{\prime}\right) \mid S_{t}=s, A_{t}=a\right] \\ &=\sum_{s^{\prime}, r} p\left(s^{\prime}, r \mid s, a\right)\left[r+\gamma \max _{a^{\prime}} q_{*}\left(s^{\prime}, a^{\prime}\right)\right] \end{aligned} q∗(s,a)=E[Rt+1+γa′maxq∗(St+1,a′)∣St=s,At=a]=s′,r∑p(s′,r∣s,a)[r+γa′maxq∗(s′,a′)]
v ∗ ( s ) , q ∗ ( s , a ) v_{*}(s), q_{*}(s, a) v∗(s),q∗(s,a) 的backup diagram 如下图
Grid World 的最佳策略如下:尽可能快的走出去
Grid World最佳策略 上面的2D图中不同颜色表示不同V值,终点格子的红色表示0,隔着一步的黄色为-1,隔两步的绿色为-2,最远的紫色为-3。下面是立体图示。 Grid World最佳策略V值下面是OpenAI Gym框架下Grid World环境的代码实现。本质是在GridWorldEnv构造函数中构建MDP,类型定义如下
MDP = Dict[State, Dict[Action, List[Tuple[Prob, State, Reward, bool]]]]
# P[state][action] = [
# (prob1, next_state1, reward1, is_done),
# (prob2, next_state2, reward2, is_done), ...]
class Action(Enum):
UP = 0
DOWN = 1
LEFT = 2
RIGHT = 3
State = int
Reward = float
Prob = float
Policy = Dict[State, Dict[Action, Prob]]
Value = List[float]
StateSet = Set[int]
NonTerminalStateSet = Set[int]
MDP = Dict[State, Dict[Action, List[Tuple[Prob, State, Reward, bool]]]]
# P[s][a] = [(prob, next_state, reward, is_done), ...]
class GridWorldEnv(discrete.DiscreteEnv):
"""
Grid World environment described in Sutton and Barto Reinforcement Learning 2nd, chapter 4.
"""
def __init__(self, shape=[4,4]):
self.shape = shape
nS = np.prod(shape)
nA = len(list(Action))
MAX_R = shape[0]
MAX_C = shape[1]
self.grid = np.arange(nS).reshape(shape)
isd = np.ones(nS) / nS
# P[s][a] = [(prob, next_state, reward, is_done), ...]
P: MDP = {}
action_delta = {Action.UP: (-1, 0), Action.DOWN: (1, 0), Action.LEFT: (0, -1), Action.RIGHT: (0, 1)}
for s in range(0, MAX_R * MAX_C):
P[s] = {a.value : [] for a in list(Action)}
is_terminal = self.is_terminal(s)
if is_terminal:
for a in list(Action):
P[s][a.value] = [(1.0, s, 0, True)]
else:
r = s // MAX_R
c = s % MAX_R
for a in list(Action):
neighbor_r = min(MAX_R-1, max(0, r + action_delta[a][0]))
neighbor_c = min(MAX_C-1, max(0, c + action_delta[a][1]))
s_ = neighbor_r * MAX_R + neighbor_c
P[s][a.value] = [(1.0, s_, -1, False)]
super(GridWorldEnv, self).__init__(nS, nA, P, isd)
策略评估需要解决在给定环境dynamics和Agent策略 π \pi π下,计算策略的v值 v π v_{\pi} vπ。由于所有数量关系都已知,可以通过解方程组的方式求得,但通常会通过数值迭代的方式来计算,即通过一系列 v 0 , v 1 , . . . , v k v_{0}, v_{1}, ..., v_{k} v0,v1,...,vk 收敛至 v π v_{\pi} vπ。如下迭代方式已经得到证明,当 k → ∞ k \rightarrow \infty k→∞ 一定收敛至 v π v_{\pi} vπ。
v k + 1 ( s ) ≐ E π [ R t + 1 + γ v k ( S t + 1 ) ∣ S t = s ] = ∑ a π ( a ∣ s ) ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ v k ( s ′ ) ] \begin{aligned} v_{k+1}(s) & \doteq \mathbb{E}_{\pi}\left[R_{t+1}+\gamma v_{k}\left(S_{t+1}\right) \mid S_{t}=s\right] \\ &=\sum_{a} \pi(a \mid s) \sum_{s^{\prime}, r} p\left(s^{\prime}, r \mid s, a\right)\left[r+\gamma v_{k}\left(s^{\prime}\right)\right] \end{aligned} vk+1(s)≐Eπ[Rt+1+γvk(St+1)∣St=s]=a∑π(a∣s)s′,r∑p(s′,r∣s,a)[r+γvk(s′)]
书中具体伪代码如下
KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ &\textbf{Itera…
下面是python 代码实现,注意这里单run迭代时,新的v值直接覆盖数组里的旧v值,这种做法在书中被证明不仅有效,甚至更为高效。这种做法称为原地(in place)更新。
def policy_evaluate(policy: Policy, env: GridWorldEnv, gamma=1.0, theta=0.0001):
V = np.zeros(env.nS)
while True:
delta = 0
for s in range(env.nS):
v = 0
for a, action_prob in enumerate(policy[s]):
for prob, next_state, reward, done in env.P[s][a]:
v += action_prob * prob * (reward + gamma * V[next_state])
delta = max(delta, np.abs(v - V[s]))
V[s] = v
if delta < theta:
break
return np.array(V)
输入策略为随机选择方向,运行上面的policy_evaluate最终多轮收敛后的V值输出为
[[ 0. -13.99931242 -19.99901152 -21.99891199]
[-13.99931242 -17.99915625 -19.99908389 -19.99909436]
[-19.99901152 -19.99908389 -17.99922697 -13.99942284]
[-21.99891199 -19.99909436 -13.99942284 0. ]]
在3D V值图中可以发现,由于是随机选择方向的策略, Agent在每个格子的V值绝对数值要比最佳V值大,意味着随机策略下Agent在Grid World会得到更多的负reward。
Grid World随机策略V值欢迎关注公众号MyEncyclopedia,定期发布AI,算法,工程类深度和前沿文章。学习本文的最佳姿势为收藏本文,发送本文链接到桌面版浏览器,打开文末阅读原文,敲入代码运行。