马尔可夫性质的初衷是通过定义一个包罗万象的当前状态,将对无限历史的依赖简化为对有限信息的依赖,让对动态系统的分析和预测和决策变得Tractable。随时间演变的系统包含天气&炒股&智能体在游戏中的行为,都是未来取决于过去。一个系统的未来状态 St+1 可能受到从初始时刻 S0 到当前时刻 St 的完整历史路径 Ht ={S0 ,S1 ,…,St } 的影响。带来的问题是如果需要根据整个历史来进行预测那么模型的输入维度会随着时间的推移而无限增长,可能性的组合数量会呈指数级爆炸让计算在实际上无法进行。以及我们永远无法收集到足够的数据来覆盖所有可能的历史路径,所以无法可靠地学习从历史到未来的映射关系 P(St+1 ∣Ht )。
马尔可夫性质引入Stat的概念规定如果我们能找到一个在时刻 t 的变量 St ,只要它被确定那么系统的未来演变将不再依赖于St 之前的任何历史信息,这里的状态 St 已经包含了预测未来所需的全部历史信息。
这里的St成为了历史 Ht−1 ={S0 ,…,St−1 } 关于未来 St+1 的一个充分统计量,我们知道了 St 那么过去是如何到达 St 的所有细节对于预测未来都是多余的。马尔可夫就是把处理无限历史这个问题转化为了如何定义一个信息足够丰富的状态 St 。
回到问题强化学习模型使用RNN/LSTM,是否违背了马尔可夫性质的初衷?在现在许多的任务中agent在某个时刻 t 得到的observation并不等同于环境的真实状态state,这个观测 ot只是真实状态的一个片面并且带有噪声的投影,这种情况下的决策过程被称为部分可观测马尔可夫决策过程(Partially Observable Markov Decision Process, POMDP)。比如一个只有摄像头的机器人,当前的单帧图像不足以让它确定自己的确切位置,如果它能记住自己刚刚从一个红色门口右转过来就能更准确地定位。
RNN/LSTM的作用就是从非马尔可夫的观测序列中构建一个近似马尔可夫的内部状态,这就是像RNN/LSTM等记忆模型的用武之地,它们的核心功能是处理序列数据然后将历史信息压缩到一个固定长度的hidden state中。
ht =f(h t−1 ,ot )
RNN的当前隐状态是由上一个隐状态 ht−1 和当前观测 ot 共同决定的,所以公式里面的ht含了从开始到时刻 t的整个观测序列 (o1 ,o2 ,…,ot ) 的信息摘要。
环境的真实状态是马尔可夫的但是智能体不可知→智能体得到的观测是非马尔可夫的→RNN/LSTM通过其循环结构,将历史观测序列 o1 ,…,ot 编码成一个内部隐状态 ht →这个隐状态 ht 被设计用来作为真实状态的一个充分统计量或近似表示 → 强化学习算法不再直接使用 ot 作为输入而是使用 ht 作为状态输入,来计算Q值或选择动作。
补充一下隐状态,h_t是历史的摘要,这个概念与POMDP的理论可以和核心信念状态Belief State b_t关联。 在POMDP的严格定义中,解决部分可观测问题的理想方法是维护一个信念状态bt,它是在给定所有历史观测和动作的条件下,关于环境真实状态s的一个概率分布。
bt (s)=P(St =s∣o0 ,a0 ,o1 ,a1 ,…,ot ),这个信念状态bt本身是满足马尔可夫性质的,基于当前的信念bt和动作at可以预测下一个信念bt+1,但是信念状态是一个连续的高维的概率分布,直接计算和使用它通常是不可行的。RNN的隐状态h_t可以被看作是这个理论上完美的信念状态bt的一个学习到的低维度和向量化的近似表示。智能体不是在学习一个完整的概率分布而是在学习一个足够丰富的特征向量h_t,这个向量能有效地服务于策略网络和价值网络。
上述,所以使用RNN/LSTM并不是抛弃马尔可夫性质,而是从一个非马尔可夫的观测流中为我们的决策系统恢复或重建一个有效的近似马尔可夫的状态表示。
伪代码
算法 1 标准智能体
这个智能体假设环境的每一次观测 observation 本身就包含了所有决策所需的信息 观测 o_t 就是马尔可夫状态 s_t
// Algorithm 1: A standard agent that assumes observations are Markovian states.
// 1. 初始化
Initialize Policy Network π(action | state)
Initialize Environment env
// 2. 主循环
for each episode:
// 重置环境,获取初始观测
current_observation = env.reset()
// 将初始观测直接作为智能体的决策状态
agent_state = current_observation // <-- 核心假设:s_t = o_t
while not done:
// 决策:策略网络直接基于当前观测(被视为状态)做出决策
action = π.select_action(agent_state) // <-- 决策完全依赖于 agent_state (即 o_t)
// 与环境交互
next_observation, reward, done = env.step(action)
// 学习:使用 (s_t, a_t, r_t, s_{t+1}) 元组更新策略
// 在这里 s_t = current_observation, s_{t+1} = next_observation
π.update(current_observation, action, reward, next_observation)
// 更新状态以进行下一步决策
current_observation = next_observation
agent_state = current_observation // <-- 状态被下一个观测简单覆盖,无记忆
在部分可观测环境POMDP里面current_observation 信息不全不满足马尔可夫性质,所以π.select_action(agent_state) 这一步是基于一个有缺陷的状态做出的会导致次优或者错误决策。
使用RNN的循环智能体
这个智能体不信任单次观测而是通过一个RNN来维护一个内部的Belief State并基于这个来决策。
// Algorithm 2: A recurrent agent using an RNN to handle non-Markovian observations.
// 1. 初始化
Initialize Recurrent Network f_rnn(hidden_state, observation) -> next_hidden_state
Initialize Policy Network π(action | hidden_state)
Initialize Environment env
// 2. 主循环
for each episode:
// 重置环境,获取初始观测
current_observation = env.reset()
// 初始化RNN的隐状态(记忆的起点)
// 此时,智能体的决策状态是隐状态 h_t,而非观测 o_t
hidden_state = f_rnn.get_initial_state() // <-- 内部记忆状态 h_0
// 用初始观测更新一次隐状态
hidden_state = f_rnn.forward(hidden_state, current_observation)
while not done:
// 决策:策略网络基于RNN的隐状态(内部记忆)做出决策
action = π.select_action(hidden_state) // <-- 决策依赖于 h_t,它包含了历史信息
// 与环境交互
next_observation, reward, done = env.step(action)
// 学习:通常基于整个序列或子序列进行更新 (例如,使用 BPTT)
// 存储轨迹 (..., (o_t, h_t, a_t, r_t), ...) 用于后续更新
trajectory.add(current_observation, hidden_state, action, reward)
// 更新状态以进行下一步决策
current_observation = next_observation
// **核心步骤:用旧的隐状态和新的观测,生成新的隐状态**
hidden_state = f_rnn.forward(hidden_state, current_observation) // <-- h_{t+1} = f(h_t, o_{t+1})
// 在 episode 结束或一定步数后
// π 和 f_rnn 会使用收集到的轨迹进行联合更新
π.update_from_trajectory(trajectory)
f_rnn.update_from_trajectory(trajectory)
算法 2 使用RNN的循环智能体
这个智能体不信任单次观测,它通过一个RNN来维护一个内部的“记忆”或“信念状态”(Belief State),并基于这个内部状态来决策。
// Algorithm 2: A recurrent agent using an RNN to handle non-Markovian observations.
// 1. 初始化
Initialize Recurrent Network f_rnn(hidden_state, observation) -> next_hidden_state
Initialize Policy Network π(action | hidden_state)
Initialize Environment env
// 2. 主循环
for each episode:
// 重置环境,获取初始观测
current_observation = env.reset()
// 初始化RNN的隐状态(记忆的起点)
// 此时,智能体的决策状态是隐状态 h_t,而非观测 o_t
hidden_state = f_rnn.get_initial_state() // <-- 内部记忆状态 h_0
// 用初始观测更新一次隐状态
hidden_state = f_rnn.forward(hidden_state, current_observation)
while not done:
// 决策:策略网络基于RNN的隐状态(内部记忆)做出决策
action = π.select_action(hidden_state) // <-- 决策依赖于 h_t,它包含了历史信息
// 与环境交互
next_observation, reward, done = env.step(action)
// 学习:通常基于整个序列或子序列进行更新 (例如,使用 BPTT)
// 存储轨迹 (..., (o_t, h_t, a_t, r_t), ...) 用于后续更新
trajectory.add(current_observation, hidden_state, action, reward)
// 更新状态以进行下一步决策
current_observation = next_observation
// **核心步骤:用旧的隐状态和新的观测,生成新的隐状态**
hidden_state = f_rnn.forward(hidden_state, current_observation) // <-- h_{t+1} = f(h_t, o_{t+1})
// 在 episode 结束或一定步数后
// π 和 f_rnn 会使用收集到的轨迹进行联合更新
π.update_from_trajectory(trajectory)
f_rnn.update_from_trajectory(trajectory)
在算法1 智能体被迫将环境给出的 可能不满足马尔可夫性质的observation当作决策状态,在算法2智能体主动地通过RNN构建了一个新的内部变量hidden_state和选择将它作为决策状态。
RNN的作用是 h_t = f(h_{t-1}, o_t),hidden_state (h_t) 是整个历史观测序列 (o_0, o_1, …, o_t) 的一个函数,训练目标是让h_t成为真实但不可见的马尔可夫状态s_t的一个充分统计量,我们希望学习到一个RNN使得其输出的 h_t 近似地满足马尔可夫性质。
强化学习的核心算法比如贝尔曼方程的更新,能够良好运作的前提是决策所依赖的状态是马尔可夫的,算法1在观测不满足此前提时盲目应用,算法2认识到了这个问题,没有抛弃马尔可夫原则而是去增加了一个状态重构模块,它先将非马尔可夫的观测流o_t转化为一个近似马尔可夫的内部状态流h_t,然后再将这个净化过的状态输入给策略网络。