强化学习 (2) —— 马尔科夫决策过程

强化学习 (2) —— 马尔科夫决策过程

强化学习中的环境一般就是一个马尔科夫决策过程。

马尔科夫决策过程包含状态信息以及状态之间的转移机制,如果用强化学习去解决一个实际问题,第一步就是把这个问题抽象成一个马尔科夫决策过程。

马尔科夫过程

随机过程: 概率论的动力学部分。传统概率论内容研究的是静态的随机现象,而随机过程研究的是随着时间演变的随机现象,

在随机过程中,我们将随机现象在某个时刻 \(t\) 的取值视作一个向量随机变量,用 \(S_t\) 表示。

所有的可能的状态组成状态集合 \(S\) ,随机现象便是状态的变化过程,在某个时刻 \(t\) 的状态通常取决于 \(t\) 之前的状态。我们将已知的历史信息 \((S_1, \dots,S_t)\) 的下一个时刻状态 \(S_{t+1}\) 的概率表示为 \(P(S_{t+1}|S_1,\dots,S_t)\)

马尔科夫性质:如果某时刻的状态 只取决于 上一个时刻的状态,这个随机过程被称为具有马尔科夫性质。即 \(P(S_{t+1}|S_t) = P(S_{t+1} | S_1,\dots,S_t)\)

当前状态可以反映所有的历史信息,只需要当前状态信息就可以决定未来。

马尔科夫过程:指具有马尔科夫性质的随机过程,也叫马尔科夫链。

使用元组 \(\langle S,P \rangle\) 来描述一个马尔科夫过程,其中 \(S\) 是有限数量的状态集合,\(P\) 是状态转移矩阵。假设一共有 \(n\) 个状态,此时 \(S = \{ s_1,\dots,s_n \}\) ,状态转移矩阵 \(P\) 定义了所有状态对之间的转移概率,即

$P = \begin{bmatrix} P(s_1|s_1) & \dots & P(S_n|S_1)\ \vdots & \ddots & \vdots \ P(s_n|s_1) & \dots & P(s_n|s_n) \end{bmatrix} $

其中 \(P(s_j|s_i) = P(S_{t+1} = s_j |S_t = s_i)\) 表示从状态 \(s_i\) 转移到 \(s_j\) 的概率。

我们称 \(P(s'|s)\) 为状态转移函数,从某个状态出发,到达其他状态的概率和必须为 \(1\) ,即状态转移矩阵每一行的和都为 \(1\)

给定一个马尔科夫过程,我们就可以从某一个状态出发,根据他的状态转移矩阵生成一个状态序列 (episode) ,这个过程被叫做 采样。例如从 \(s_1\) 出发,可以采样得到序列 \(s_1 \to s_3 \to s_5 \to s_6\) 或者 \(s_1 \to s_5 \to s_6\) ,生成这些序列的概率和状态转移矩阵有关。

马尔科夫奖励过程

在马尔科夫过程的基础上加入奖励函数 \(r(s)\) 和折扣因子 \(\gamma\) ,就可以得到一个马尔科夫奖励过程 \(\langle S, P, r, \gamma \rangle\)

其中 \(r\) 为奖励函数,其中某个状态的奖励 \(r(s)\) 指转移到该状态可以获得奖励的期望。

\(\gamma\) 为折扣因子,由于远期利益具有一定的不确定性,有时候我们更希望能够尽快获得奖励,所以我们需要引入折扣因子。

在一个马尔科夫过程中,从第 \(t\) 时刻的状态 \(S_t\) 开始,直到终止状态时,所有奖励的衰减之和称做为回报 \(G_t\) ,有 \(G_t = R_t + \gamma R_{t+1} + \gamma^2 R_{t+2} + \dots = \sum^{\infty}_{k=0} \gamma^k R_{t+k}\)

价值函数:在马尔科夫奖励过程中,一个状态的期望回报(即从这个状态出发的未来累积奖励的期望)被称为这个状态的价值。所有状态的价值就组成了价值函数,价值函数的输入为某个状态,输出为这个状态的价值,我们将价值函数写成 \(V(s)=\mathbb{E}[G_t|S_t=s]\) ,展开得到

\[V(s) = \mathbb{E}[G_t|S_t = s] = \\ =\mathbb{E} [R_t+(\gamma R_{t+1} + \gamma^2 R_{t+2} + \dots) | S_t = s] \\ = \mathbb{E}[R+t+\gamma G_{t+1} | S_t = s] \\ = E[R_t + \gamma V(S_{t+1}) | S_t = s] \]

可以见到,即时奖励的期望就是奖励函数的输出,即 \(\mathbb{E} [R_t | S_t = s] = r(s)\) ;而且等式中剩余的部分为 \(\mathbb{E}[\gamma V(S_{t+1}) | S_t = s]\) 可以根据状态 \(S\) 的转移概率得到。

从而得到贝尔曼方程

\(V(s) = r(s) + \gamma \sum_{s' \in S} p(s'|s) V(s')\)

这个方程对于每一状态都成立。如果马尔科夫奖励过程有 \(n\) 个状态 \(S = \{ s_1, s_2, \dots s_n \}\),我们将所有的状态的价值表示为一个列向量 \(\mathcal{V} = [V(s_1),V(s_2),\dots,V(s_n)]^T\) ,奖励函数写作 \(\mathcal{R} = [r(s_1), r(s_2), \dots, r(s_n)]^T\) ,则贝尔曼方程矩阵形式为

\(\mathcal{V = R} + \gamma \mathcal{PV}\)

\(\begin{bmatrix}V(s_1) \\ V(s_2) \\ \vdots \\ V(s_n) \end{bmatrix} = \begin{bmatrix} r(s_1) \\ r(s_2) \\ \vdots \\ r(s_n) \end{bmatrix} + \gamma \begin{bmatrix} P(s_1|s_1) & P(s_2|s_1) & \dots & P(s_n | s_1) \\ P(s_1|s_2) & P(s_2|s_2) & \dots & P(s_n | s_2) \\ \dots & \dots & \dots & \dots \\ P(s_1|s_1) & P(s_2|s_1) & \dots & P(s_n | s_1) \\ \end{bmatrix} \begin{bmatrix} V(s_1) \\ V(s_2) \\ \dots \\ V(s_n) \end{bmatrix}\)

我们可以直接根据矩阵运算求解析解:\(\mathcal{V} = (I-\gamma P )^{-1} ]\mathcal{R}\)

解析解的计算复杂度为 \(O(n^3)\) ,其中 \(n\) 为状态个数。

马尔科夫决策过程

引入一个智能体来对随机过程施加外界刺激,得到马尔科夫决策过程。

马尔科夫决策过程可以表述为 \(\langle S, A,P,r,\gamma \rangle\)

其中 \(S\) 为状态的集合,\(A\) 为动作的集合,\(\gamma\) 为折扣因子,\(r(s,a)\) 为奖励函数(同时取决于状态和动作),\(P(s'|s,a)\) 状态转移函数(在状态 \(s\) 执行动作 \(a\) 之后转移到 \(s'\) 的概率)

智能体根据当前状态 \(S_t\) 来选择动作 \(A_t\) (决策) ,MDP 根据奖励函数和状态转移函数获得 \(S_{t+1}\)\(R_{t+1}\) 并反馈给智能体。智能体的目标是最大化所得到的累积奖励。

这个过程中智能不断和环境进行交互。

决策\(\pi(a|s)=P(A_t=a|S_t=s)\) 为一个函数,表示在输入状态 \(s\) 的情况下选择动作 \(a\) 的概率。由于马尔科夫性的存在,策略只需要和当前状态 \(s\) 有关,不需要考虑历史状态。

状态价值函数:MDP中基于决策 \(\pi\) 的状态价值函数,定义为从状态 \(s\) 出发遵守策略 \(\pi\) 所获得的期望回报, \(V^{\pi} (s) = \mathbb{E}_{\pi} [G_t|S_t=s]\)

动作价值函数:动作价值函数,我们使用 \(Q^{\pi}(s,a)=\mathbb{E}_{\pi}[G_t|S_t=s,A_t=a]\)

在策略 \(\pi\) 中,状态 \(s\) 的价值等于在该状态下基于策略 \(\pi\) 采取的所有动作的概率和对应的价值的乘积之和的结果。 \(V^{\pi}(s)=\sum_{a \in A} \pi(a|s) Q^{\pi} (s,a)\)

使用策略 \(\pi\) 时,状态 \(s\) 下采取动作 \(a\) 的价值等于即使奖励加上经过衰减之后的所有可能的下一个状态的状态转移概率和其价值的乘积。\(Q^{\pi}(s,a)=r(s,a) + \gamma \sum_{s' \in S} P(s'|s,a) V^{\pi}(s')\)

贝尔曼期望方程:$$V^{\pi}(s) = \mathbb{E}{\pi}[R_t+\gamma V^{\pi}(S) | S_t = s] = \ \sum_{a \in A} \pi(a|s) [r(s,a) + \gamma \sum_{s' \in S} p(s'|s, a) V^{\pi}(s')] \ Q^{\pi} (s,a) = \mathbb{E}{\pi}[R_t + \gamma Q^{\pi} (S,A_{t+1})|S_t=s,A_t=a] \ = r(s,a) + \gamma \sum_{s' \in S} p(s'|s,a) \sum_{a' \in A} \pi(a'|s')Q^{\pi}(s',a')$$

希望计算在一个 MDP 下基于策略 \(\pi\) 的状态价值函数。

尝试将 MDP 转化为一个 MRP ,即对策略的动作选择做边缘化(对于一个状态,将策略所有动作的奖励和策略中该动作的概率加权的奖励和),\(r'(s) = \sum_{a \in A} \pi(a|s) r(s,a)\) ;同时传递函数也需要边缘化为 \(P'(s'|s) = \sum_{a \in A} \pi(a|s) P(s'|s, a)\)

于是我们可以得到一个 MRP : \(\langle S, P', r', \gamma \rangle\),其中 MDP 的状态价值函数和转化后的 MRP 的价值函数是一样的,可以通过 MRP 中计算价值函数的解析解来计算这个 MDP 中该策略的状态价值函数。

蒙特卡洛方法

使用蒙特卡洛方法来估计一个策略在马尔科夫决策过程中的状态价值函数。

用策略在MDP上遵守状态转移矩阵和相应的策略采样出状态序列,计算期望回报。

\(V^{\pi} (s) = \mathbb{E}_{\pi} [G_t|S_t=s] \approx \frac{1}{N} \sum_{i=1}^{N} G_t^{(i)}\)

def sample(MDP, Pi, timestep_max, number):
    ''' 采样函数,策略Pi,限制最长时间步timestep_max,总共采样序列数number '''
    S, A, P, R, gamma = MDP
    episodes = []
    for _ in range(number):
        episode = []
        timestep = 0
        s = S[np.random.randint(4)]  # 随机选择一个除s5以外的状态s作为起点
        # 当前状态为终止状态或者时间步太长时,一次采样结束
        while s != "s5" and timestep <= timestep_max:
            timestep += 1
            rand, temp = np.random.rand(), 0
            # 在状态s下根据策略选择动作
            for a_opt in A:
                temp += Pi.get(join(s, a_opt), 0)
                if temp > rand:
                    a = a_opt
                    r = R.get(join(s, a), 0)
                    break
            rand, temp = np.random.rand(), 0
            # 根据状态转移概率得到下一个状态s_next
            for s_opt in S:
                temp += P.get(join(join(s, a), s_opt), 0)
                if temp > rand:
                    s_next = s_opt
                    break
            episode.append((s, a, r, s_next))  # 把(s,a,r,s_next)元组放入序列中
            s = s_next  # s_next变成当前状态,开始接下来的循环
        episodes.append(episode)
    return episodes


# 采样5次,每个序列最长不超过20步
episodes = sample(MDP, Pi_1, 20, 5)
print('第一条序列\n', episodes[0])
print('第二条序列\n', episodes[1])
print('第五条序列\n', episodes[4])

# 对所有采样序列计算所有状态的价值
def MC(episodes, V, N, gamma):
    for episode in episodes:
        G = 0
        for i in range(len(episode) - 1, -1, -1):  #一个序列从后往前计算
            (s, a, r, s_next) = episode[i]
            G = r + gamma * G
            N[s] = N[s] + 1
            V[s] = V[s] + (G - V[s]) / N[s]


timestep_max = 20
# 采样1000次,可以自行修改
episodes = sample(MDP, Pi_1, timestep_max, 1000)
gamma = 0.5
V = {"s1": 0, "s2": 0, "s3": 0, "s4": 0, "s5": 0}
N = {"s1": 0, "s2": 0, "s3": 0, "s4": 0, "s5": 0}
MC(episodes, V, N, gamma)
print("使用蒙特卡洛方法计算MDP的状态价值为\n", V)

占用度量:不同策略的价值函数是不一样(对于同一个MDP,不同的策略会访问的状态的概率分布是不一样的)。不同的策略会使得智能体访问到不同概率分布的状态,而这个不同的概率分布的状态。

我们定义 MDP 的初始状态分布为 $\mathcal{v_0} (s) $,使用 \(P^{\pi}_{t}(s)\) 为采取策略 \(\pi\) 的智能体在时刻 \(t\) 状态为 \(s\) 的概率,特别的 \(P_{0}^{\pi}(s) = \mathcal{\nu_0} (s)\) ,然后定义一个策略的状态访问分布为 \(\mathcal{\nu}^{\pi}(s) = (1-\gamma) \sum^{\infty}_{t=0} \gamma^{t} P^{\pi}_{t}(s)\) 。 状态访问概率表示一个策略和MDP交互之后会访问到的状态的分布。实际上智能体和MDP交互在一个序列中是有限的,但是仍然可以用来表达状态访问概率。

\(\mathcal{\nu}^{\pi} (s') = (1-\gamma)\nu_0(s') + \gamma \iint P(s|s', a) \pi(a|s) \mathcal{\nu}^{\pi} (s) ds da\)

定义一个策略的占用度量(occupancy measure) 为

\(\rho^{\pi}(s,a) = (1-\gamma) \sum^{\infty}_{t=0} \gamma^t P_t^{\pi} (s) \pi(a|s)\)

表示动作状态对 \((s,a)\) 被访问到的概率,有 \(\rho^{\pi}(s,a) = \nu^{\pi}(s) \pi(a|s)\)

posted @ 2026-07-09 02:06  BorisDimitri  阅读(2)  评论(0)    收藏  举报