您的位置:

Markov Decision Process(马尔科夫决策过程)

一、基础概念

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求解方法:值迭代和策略迭代。值迭代通过不断找到最大价值函数来推导出最优决策。而策略迭代则通过不断改进策略,来得出最优策略。最后,我们给出了策略评估和策略改进的示例代码。