📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在👉强化学习专栏: 【强化学习】(30)---《半马尔可夫决策过程 (SMDP) -->分层强化学习》
半马尔可夫决策过程,Semi-Markov Decision Processes (SMDP) 是一种用于分层强化学习的模型,适用于那些包含不规则时间步或长期延迟决策的任务。相比于标准的马尔可夫决策过程(Markov Decision Process, MDP),SMDP 能够处理不同时间间隔之间的决策问题,因此在强化学习中广泛应用于分层结构,尤其是需要长时间跨度或多步策略的复杂任务中。
上图展示了MDP的状态轨迹由小的、离散时间的转变组成,而smdp的状态轨迹由大的、连续时间的转变组成 。
SMDP 通过扩展 MDP,使其能够处理可变时间步长的决策问题。在 SMDP 中,每个动作的执行时间不是固定的,而是可能持续多步。这在分层强化学习中非常重要,因为高层策略通常制定长期目标,低层策略则负责在多个时间步内执行具体的动作。
SMDP 的分层结构常用于分解复杂任务:
在 SMDP 中,状态、动作和转移与标准 MDP 相似,但有所扩展:
):描述环境的当前状态。
):可以是原始动作或子任务的选择。在分层结构中,低层策略根据高层策略设定的子目标选择具体动作。
):表示一个动作持续的时间,即从当前状态转移到下一个状态所需的时间步数。
):给定当前状态
和动作
,转移到下一状态
并经历时间间隔
的概率。
SMDP 的目标是在一个可能存在不同时间间隔的任务中,最大化长期期望回报。其回报函数包括了时间间隔的折扣,因此目标是找到最优策略来最大化累积奖励。
假设
是时间步
的即时奖励,
是折扣因子,
是动作持续的时间间隔。则总回报为:
与标准 MDP 不同的是,SMDP 需要考虑动作执行的时间间隔对总回报的影响。
SMDP 的值函数可以通过 Bellman 方程扩展为半马尔可夫形式。在给定策略
下,状态
的值函数表示为:
其中:
是状态
的值函数。
是在状态
执行动作
的即时奖励。
是折扣因子,
是动作持续时间。
是转移后的状态。
SMDP 中的 Q-learning 算法类似于标准的 Q-learning,但需要考虑时间间隔的影响。其 Q 值更新公式为:
其中:
是状态
下执行动作
的 Q 值。
是学习率。
是动作
执行的时间间隔。
SMDP 在分层强化学习中通常用于建模高层策略和低层策略的不同时间尺度。这种架构使得算法能够应对长时间跨度的任务。
SMDP 的学习过程可以总结为以下步骤:
下面是Semi-Markov Decision Process (SMDP) 的 Python 伪代码。此伪代码展示了如何使用 SMDP 进行强化学习,尤其是使用 Q-learning 方法更新 Q 值。此伪代码假设任务中每个动作执行时间
是可变的,并且使用时间间隔调整折扣因子
。
"""《SMDP伪代码》
时间:2024.10.15
作者:不去幼儿园
"""
import numpy as np
# 定义环境类(伪代码)
class Environment:
def __init__(self):
pass
def get_state(self):
# 返回当前状态
pass
def take_action(self, action):
# 执行动作,返回奖励、下一个状态和动作执行所花费的时间
next_state = None
reward = None
tau = None # 时间间隔
return next_state, reward, tau
# 定义SMDP的Q-learning算法
class SMDPAgent:
def __init__(self, state_space_size, action_space_size, alpha=0.1, gamma=0.99, epsilon=0.1):
# 初始化参数
self.q_table = np.zeros((state_space_size, action_space_size)) # 初始化Q表
self.alpha = alpha # 学习率
self.gamma = gamma # 折扣因子
self.epsilon = epsilon # 探索率
self.action_space_size = action_space_size
def choose_action(self, state):
# 根据epsilon-greedy策略选择动作
if np.random.uniform(0, 1) < self.epsilon:
return np.random.randint(0, self.action_space_size) # 随机探索
else:
return np.argmax(self.q_table[state]) # 选择Q值最大的动作
def update_q_value(self, state, action, reward, next_state, tau):
# 使用Q-learning公式更新Q值,考虑时间间隔tau
best_next_action = np.argmax(self.q_table[next_state])
q_target = reward + (self.gamma ** tau) * self.q_table[next_state, best_next_action]
self.q_table[state, action] += self.alpha * (q_target - self.q_table[state, action])
# 主函数(伪代码)
def main():
# 初始化环境和SMDP代理
env = Environment()
agent = SMDPAgent(state_space_size=100, action_space_size=4)
# 开始训练
num_episodes = 1000
for episode in range(num_episodes):
state = env.get_state() # 获取初始状态
done = False
while not done:
action = agent.choose_action(state) # 选择动作
next_state, reward, tau = env.take_action(action) # 执行动作
# 更新Q值
agent.update_q_value(state, action, reward, next_state, tau)
state = next_state # 转移到下一个状态
if __name__ == "__main__":
main()
choose_action
方法:基于 epsilon-greedy 策略选择动作,以平衡探索和利用。update_q_value
方法:使用 SMDP 版本的 Q-learning 更新 Q 值,考虑时间间隔 对折扣因子的影响,即
,用于更新 Q-learning 公式中的折扣因子。
该伪代码是强化学习中的 SMDP Q-learning 算法的基本实现,可用于需要不同时间跨度的任务中,如机器人控制、规划任务等。
由于博文主要为了介绍相关算法的原理和应用的方法,缺乏对于实际效果的关注,算法可能在上述环境中的效果不佳,一是算法不适配上述环境,二是算法未调参和优化,三是等等。上述代码用于了解和学习算法足够了,但若是想直接将上面代码应用于实际项目中,还需要进行修改。
是一个关键问题,尤其在复杂任务中,如何平衡不同时间尺度的奖励和更新过程是一个难题。
SMDP 适用于以下场景:
Semi-Markov Decision Processes (SMDP) 并不是某一篇具体的论文中首次提出的单一算法,而是对标准马尔可夫决策过程(MDP)的一种扩展,最早由 J.A. Bather 提出,并被应用到多个领域。SMDP 被广泛应用于强化学习中的分层结构,以处理可变的时间间隔问题。
不过,在强化学习领域中,Richard S. Sutton 和他的合作者们将 SMDP 引入强化学习中的工作可以作为一个重要的参考点。特别是在强化学习领域,Sutton 等人在其经典著作中讨论了 SMDP 的应用与算法。
可参考文献:
这篇论文详细描述了如何将时间抽象引入强化学习,并通过SMDP框架实现层次化的任务规划。
🔥想了解更多分层强化学习的文章,请查看文章: 【RL Latest Tech】分层强化学习(Hierarchical RL)
文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者