一、基础概念
Markov Decision Process(MDP)是以马尔科夫过程为基础,加入决策变量而形成的数学模型。它主要包含以下成分:
状态(State):描述系统当前的所有状态,可能是一维或多维向量。在某一时刻,系统处于某个具体的状态。
决策(Decision):指当前状态下拟采取的行动或策略。决策的选择受到限制,如有些状态下只有一个可选择的决策,有些则有多个不同的决策可供选择。
奖励(Reward):在当前状态下,由于做出该决策所获得的收益或者价值。
转移概率(Transition Probability):指在某个状态下,执行某个决策转移到另一个状态的概率。在马尔科夫过程中,当前状态的下一个状态仅与当前状态相关,与之前的状态和决策无关。
MDP模型可以用以下状态转移矩阵表示:
s1 s2 s3 ... sn a1,s1 -> s'1 p11 p12 p13 ... p1n a1,s2 -> s'2 p21 p22 p23 ... p2n a1,s3 -> s'3 p31 p32 p33 ... p3n ... ... ... ... ... ... a1,sn -> s'n pn1 pn2 pn3 ... pnn a2,s1 -> s'1 q11 q12 q13 ... q1n a2,s2 -> s'2 q21 q22 q23 ... q2n a2,s3 -> s'3 q31 q32 q33 ... q3n ... ... ... ... ... ... a2,sn -> s'n qn1 qn2 qn3 ... qnn ... ... ... ... ... am,s1 -> s'1 r11 r12 r13 ... r1n am,s2 -> s'2 r21 r22 r23 ... r2n am,s3 -> s'3 r31 r32 r33 ... r3n ... ... ... ... ... ... am,sn -> s'n rm1 rm2 rm3 ... rmn
其中,$s_i$表示第$i$个状态,$a_j$表示第$j$个决策,$s'_k$表示第$k$个状态。$p_{i,k}$表示在状态$s_i$下,执行决策$a_1$,转移到状态$s'_k$的概率;$q_{i,k}$表示在状态$s_i$下,执行决策$a_2$,转移到状态$s'_k$的概率;$r_{i,k}$表示在状态$s_i$下,执行决策$a_m$,转移到状态$s'_k$的概率。
二、价值函数
价值函数是MDP中的一个核心概念,用于评价某个状态或状态集合的价值,即在这个状态或状态集合下,执行某个策略所能获得的期望奖励。
具体来说,对于某个状态$s$,我们定义它的价值函数为$V(s)$,表示在状态$s$下,执行我们所选择的策略能够获得的期望奖励。进一步地,我们可以将所有状态的价值函数组合成一个向量:
$$ V = [V(s_1), V(s_2), ..., V(s_n)]^T $$同样,对于某个状态$s$和一个决策$a$,我们定义它的价值函数为$Q(s,a)$,表示从状态$s$开始,采取决策$a$,以后策略的预期收益。进一步地,我们可以将所有状态和所有决策的价值函数组合成一个$nxm$维的矩阵$Q$:
$$ Q = \begin{bmatrix} Q(s_1,a_1) & Q(s_1,a_2) & ... & Q(s_1,a_m) \\ Q(s_2,a_1) & Q(s_2,a_2) & ... & Q(s_2,a_m) \\ ... & ... & ... & ... \\ Q(s_n,a_1) & Q(s_n,a_2) & ... & Q(s_n,a_m) \end{bmatrix} $$三、策略(Policy)
策略指从状态到决策的映射,即在每个状态下采取哪个决策。如果策略是确定性策略,那么对于同一个状态,总是选择相同的决策;如果是随机策略,那么在相同的状态下,每个决策的选择是按一定概率分布随机选择的。
我们可以使用$\pi(a|s)$表示从状态$s$开始采取决策$a$的概率。同时,我们也可以使用$\pi$来表示整个MDP中的策略,即$pi = [\pi(a|s_1), \pi(a|s_2), ..., \pi(a|s_n)]$,其中$s_1, s_2, ..., s_n$是所有可能的状态。
四、MDP的求解
1. 值迭代
值迭代是解决MDP的最简单的方法。它的思路很简单:我们从某个初始状态开始,按照某个策略,不断地更新当前状态的价值函数,直到价值函数不再变化。这时,我们可以得到这个策略的“最优”价值函数。因此,我们可以选择每个状态中最具有代表性的决策,组成一个最优策略。该过程中,我们使用式子(1)来更新价值函数:
$$ V(s) = \max_{a_i \in A(s)}\sum_{s'\in S}p(s' | s, a_i) [ R(s, a_i, s') + \gamma V(s') ] $$其中,$A(s)$表示在状态$s$下可选择的决策的集合,$p(s'|s,a_i)$表示根据$s$和$a_i$转移到$s'$的概率,$R(s,a_i,s')$表示在状态$s$下执行决策$a_i$转移到状态$s'$时所获得的奖励,$\gamma$表示考虑未来远期收益的折扣因子。
2. 策略迭代
策略迭代是一种交替进行策略评估和策略改进的算法。在每轮迭代中,首先通过与当前策略不同的一些策略,计算出它们的价值函数,然后根据新的价值函数来改进策略,最后返回一个新的策略。迭代循环直到策略收敛。在策略评估过程中,有两种方法用来计算一个策略的价值函数。一种是采用而非确定性策略(stochastic policy),计算价值函数时考虑采用每个决策的概率。另一种是采用确定性策略(deterministic policy)。
下面是策略迭代的代码示例:
import numpy as np # 策略评估 def policy_evaluation(transitions, policy, gamma=1.0, theta=0.00001): num_states = transitions.shape[0] V = np.zeros(num_states) while True: delta = 0 for state in range(num_states): v = 0 for action, next_states in enumerate(transitions[state]): for next_state in next_states: prob, reward = next_state[0], next_state[1] v += policy[state][action] * prob * (reward + gamma * V[next_state[2]]) delta = max(delta, abs(v - V[state])) V[state] = v if delta < theta: break return np.array(V) # 策略改进 def policy_improvement(transitions, policy_eval_fn=policy_evaluation, gamma=1.0): num_states, num_actions = transitions.shape[0], transitions.shape[1] policy = np.ones([num_states, num_actions]) / num_actions while True: policy_stable = True value_function = policy_eval_fn(transitions, policy, gamma) for state in range(num_states): chosen_action = np.argmax(policy[state]) action_values = np.zeros(num_actions) for action in range(num_actions): for next_state in transitions[state][action]: prob, reward = next_state[0], next_state[1] action_values[action] += prob * (reward + gamma * value_function[next_state[2]]) best_action = np.argmax(action_values) if chosen_action != best_action: policy_stable = False policy[state] = np.eye(num_actions)[best_action] if policy_stable: return policy, value_function
五、总结
本文介绍了MDP的基本概念,包括状态、决策、奖励和转移概率,在此基础上进一步介绍了价值函数和策略的概念。接着,我们讨论了两种常用的MDP求解方法:值迭代和策略迭代。值迭代通过不断找到最大价值函数来推导出最优决策。而策略迭代则通过不断改进策略,来得出最优策略。最后,我们给出了策略评估和策略改进的示例代码。