强化学习中最经典、最重要的数学模型就是Markov 决策过程(Markov Decision Process, MDP),本章将导出 Markov 决策过程模型,并介绍相关性质,最后给出一种求解 Markov 决策过程最优策略的方法。
一个时间离散化的智能体与环境的交互轨迹(trajectory)可表示为:。若智能体可以完全观测到环境的状态,即环境是完全可观测的,不失一般性的,可令 ,那么轨迹可表示为:。部分不完全可观测的问题可以建模为部分可观测的 Markov 决策过程(Partially Observable Markov Decision Process, POMDP)。
引入概念定义: 为在时间 ,动作 情况下,从状态 转移到 且获得奖励 的概率,就可以得到 Markov 决策过程模型。在该定义下,下一状态 和奖励 只依赖于当前状态 和动作 ,而不依赖于更早的状态和动作,这种性质称为 Markov 性。
若状态空间 、动作空间 、奖励空间 都是元素个数有限的集合,这样的 Markov 决策过程称为有限 Markov 决策过程(Finite Markov Decision Process, Finite MDP)。Markov 决策过程的环境由动力刻画,对于有限 Markov 决策过程,定义函数 为 Markov 决策过程的动力(dynamics):
利用动力的定义 可以导出:
对于不是有限 Markov 决策过程的 Markov 决策过程,可以用类似的方法定义动力函数与导出量,只是定义时应当使用概率分布函数。动力的定义将离散空间和连续空间的情况用统一的字母表述,简化了书写。
在 Mrokov 决策过程中,定义策略(policy)为从状态到动作的转移概率。对于有限 Markov 决策过程,可以定义策略 为:
这种策略称为随机性策略。对于动作集为连续的情况,可以用概率分布来定义策略。若策略为 ,即定义: ,则该策略称为确定性策略。
强化学习的核心概念是奖励,强化学习的目标是最大化长期的奖励,下面来定义这个长期的奖励。对于回合制任务,假设回合在 步终止,则从步骤 ) 以后的回报(return):
对于连续性任务,引入折扣(discount)概念,定义回报为:
其中折扣因子 。折扣因子决定了如何在最近的奖励和未来的奖励间进行折中: 只考虑眼前利益,未来和当前一样重要,一般设定 ,此时若奖励有界,则回报也是有界的。
基于回报的定义,可以进一步定义价值函数(value function)。对于给定的策略 ,可以定义一下价值函数:
策略评估(policy evaluation):试图求解给定策略的价值函数(Bellman 期望方程常用来进行策略评估)。
状态价值函数和动作价值函数之间可以互相表示,它们的的关系及推导如下:
从状态价值和动作价值的互相表示出发,用代入法消除其中一种价值,就可以得到 Bellman 期望方程:
定义一个偏序关系:对于策略 和 ,如果对于任意 都满足 ,则称策略 小于等于 ,记做 。如果动作空间 是闭集,那么就存在一个策略 ,使得所有的策略都小于等于这个策略,此时的策略 就称为最优策略(optimal policy)。最优策略的价值函数称为最优价值函数,包括以下两种形式:
最优策略可能存在多个,但其价值函数是相同的,任取一个最优策略来考察也不是一般性。其中一种选取方法是选择这样的一种确定性策略:
其中若有多个动作使得 取得最大值,则任取一个动作。将以上确定性策略带入状态价值和动作价值的互相表示表达式中有:
同 Bellman 期望方程的推导,将上两式相互代带入,即可得到 Bellman 最优方程:
将 松弛为 ,并消去 以减少决策变量,即可得到一个线性规划:
其中 是一组任意取值的正实数。Bellman 最优方程的解显然在线性规划的可行域内,而且由于 ,所以线性规划的最优解肯定会让约束条件中的某些不等式取到等号,使得 Bellman 最优方程成立。可以证明,这个线性规划的最优解满足 Bellman 最优方程。
但实际上使用 Bellman 最优方程求解最优策略可能会遇到下列困难:
使用 gym 库中的悬崖寻路问题(CliffWalking-v0)作为案例分析,该环境是一个有限 Markov 决策过程,该环境的信息和交互过程可以通过本人学习代码中的 get_env_info
和 run_episode
函数来了解。下面将使用 Bellman 期望方程来对策略进行评估,以及使用线性规划求解 Bellman 最优方程来获得最优策略。
在该案例中,到达下一个状态的奖励是确定的,即公式 可写为 ,再代入到根据用状态价值函数表示的 Bellman 期望方程 ,并化为方程组的标准形式有:
根据该公式,将所有参数代入即可得到一个线性方程组,求解该线性方程组即可得到状态价值函数的解。在求解状态价值函数后,将改写的 带入到公式 中,即可求得动作价值函数:
该案例的策略评估代码实现如下。为求解线性方程组 ,先根据已知的环境模型 env
和策略 policy
参数求出系数矩阵 a
和向量 b
( 2~8 行),再通过 np.linalg.solve
函数求解线性方程组 得到状态价值函数 v
;然后再次结合已知参数,通过公式 求出动作价值函数 q
( 11~14 行)。
1def evaluate_policy(env, policy, gamma=1.0):
2 a, b = np.eye(env.nS), np.zeros((env.nS))
3 for state in range(env.nS - 1):
4 for action in range(env.nA):
5 pi = policy[state][action]
6 for proba, next_state, reward, done in env.P[state][action]:
7 a[state, next_state] -= gamma * pi * proba
8 b[state] += pi * reward * proba
9 v = np.linalg.solve(a, b)
10 q = np.zeros((env.nS, env.nA))
11 for state in range(env.nS - 1):
12 for action in range(env.nA):
13 for proba, next_state, reward, done in env.P[state][action]:
14 q[state][action] += (proba * (reward + gamma * v[next_state]))
15 return v, q
将线性规划 中的 全都设置为 1 ,并将改写的 带入到公式中,再转化为标准形式有:
然后使用 scipy.optimize.linprog
函数来计算该动态问题,代码如下。该函数第一个参数为系数 ,全部设置为 1 ( 第9 行);第二、三个参数为形如 “” 这样的不等式约束的系数矩阵 和向量 的值,线性规划 的不等式约束转化为 表示后,在代码中的系数矩阵 为 a_ub
和向量 为 b_ub
;关键字参数 bounds
指定决策变量是否有界;关键字参数 method
确定优化方法,因默认的方法不能处理不等式约束,所以这里选择了能够处理不等式约束的内点法(interior-point method)。最后求解出最优状态价值函数为 optimal_v
及最优动作价值函数为 optimal_q
。
xxxxxxxxxx
161def get_optimal_value_func(env, gamma=1.0):
2 p = np.zeros((env.nS, env.nA, env.nS))
3 r = np.zeros((env.nS, env.nA))
4 for state in range(env.nS - 1):
5 for action in range(env.nA):
6 for proba, next_state, reward, done, in env.P[state][action]:
7 p[state, action, next_state] += proba
8 r[state, action] += (reward * proba)
9 c = np.ones(env.nS)
10 a_ub = gamma * p.reshape(-1, env.nS) - np.repeat(np.eye(env.nS), env.nA, axis=0)
11 b_ub = -r.reshape(-1, )
12 bounds = [(None, None),] * env.nS
13 res = scipy.optimize.linprog(c, a_ub, b_ub, bounds=bounds, method='interior-point')
14 optimal_v = res.x
15 optimal_q = r + gamma * np.dot(p, optimal_v)
16 return optimal_v, optimal_q
得到最优动作价值函数后,再由公式 可以得到一种最优确定性策略,代码为:
xxxxxxxxxx
21optimal_v, optima_q = get_optimal_value_func(env)
2optimal_policy = optimal_q.argmax(axis=1)