# SARSA算法

# 基本概念

SARSA(State-Action-Reward-State-Action)是一种在线策略(On-Policy)的强化学习算法。与Q-Learning不同,SARSA在学习过程中使用实际执行的动作来更新Q值,这使得它更加保守和安全。

# 数学原理

# 1. 算法名称由来

SARSA名称来源于算法使用的五元组:

  • sts_t (当前状态)
  • ata_t (当前动作)
  • rt+1r_{t+1} (即时奖励)
  • st+1s_{t+1} (下一状态)
  • at+1a_{t+1} (下一动作)

# 2. 值函数定义

SARSA的状态-动作值函数定义:

Q(s,a)=E[Rt+γRt+1+γ2Rt+2+...st=s,at=a]Q(s,a) = E[R_t + \gamma R_{t+1} + \gamma^2 R_{t+2} + ... | s_t=s, a_t=a]

其中:

  • Q(s,a)Q(s,a) 是状态-动作值函数
  • γ\gamma 是折扣因子(0到1之间)
  • RtR_t 是在时间t获得的奖励

# 3. 更新规则

SARSA的更新公式:

Q(st,at)Q(st,at)+α[rt+1+γQ(st+1,at+1)Q(st,at)]Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha[r_{t+1} + \gamma Q(s_{t+1},a_{t+1}) - Q(s_t,a_t)]

其中:

  • α\alpha 是学习率(0到1之间)
  • rt+1r_{t+1} 是即时奖励
  • Q(st+1,at+1)Q(s_{t+1},a_{t+1}) 是下一个状态-动作对的Q值

# 4. 策略选择

通常使用ε-贪心策略:

P(as)={1ϵ+ϵA,ifa=argmaxaQ(s,a)ϵA,otherwiseP(a|s) = \begin{cases} 1-\epsilon + \frac{\epsilon}{|A|}, & \text{if } a = \arg\max_{a'}Q(s,a') \\ \frac{\epsilon}{|A|}, & \text{otherwise} \end{cases}

# 算法步骤

  1. 初始化

    • 创建Q表并初始化
    • 设定超参数:学习率α、折扣因子γ、探索率ε
  2. 对每个回合

    • 初始化状态s
    • 使用策略选择动作a
    • 重复直到达到终止状态:
      1. 执行动作a,观察r和s'
      2. 使用相同策略选择a'
      3. 更新Q值
      4. s ← s',a ← a'
import numpy as np

class SARSA:
    def __init__(self, n_states, n_actions, alpha=0.1, gamma=0.9, epsilon=0.1):
        self.q_table = np.zeros((n_states, n_actions))
        self.alpha = alpha  # 学习率
        self.gamma = gamma  # 折扣因子
        self.epsilon = epsilon  # 探索率
        
    def choose_action(self, state):
        if np.random.random() > self.epsilon:
            return np.argmax(self.q_table[state])
        return np.random.randint(self.q_table.shape[1])
        
    def learn(self, state, action, reward, next_state, next_action):
        old_value = self.q_table[state, action]
        next_value = self.q_table[next_state, next_action]
        
        # SARSA更新公式
        new_value = (1 - self.alpha) * old_value + \
                    self.alpha * (reward + self.gamma * next_value)
        
        self.q_table[state, action] = new_value

# 优势特点

# 1. 在线学习

  • 使用实际执行的动作更新
  • 更符合实际交互场景
  • 策略评估更准确

# 2. 安全性

  • 考虑实际执行策略
  • 避免危险状态
  • 更适合真实环境

# 3. 稳定性

  • 更新更加平滑
  • 波动相对较小
  • 训练更加稳定

# 应用场景

  1. 机器人导航

    • 避障导航
    • 路径规划
    • 安全探索
  2. 游戏AI

    • 赛车游戏
    • 迷宫探索
    • 生存游戏
  3. 工业控制

    • 过程控制
    • 设备调度
    • 能源管理
  4. 金融交易

    • 风险控制
    • 投资组合
    • 交易策略

# 优缺点

# 优点

  1. 更安全保守
  2. 更适合实际场景
  3. 训练更加稳定
  4. 考虑动作连续性

# 缺点

  1. 收敛速度较慢
  2. 性能可能次优
  3. 对探索策略敏感
  4. 需要更多样本

# 实践建议

# 1. 参数设置

  • 适当降低学习率
  • 根据任务调整γ
  • 动态调整ε

# 2. 环境设计

  • 合理设置奖励
  • 避免稀疏奖励
  • 考虑安全约束

# 3. 探索策略

  • 使用软性探索
  • 渐进式探索
  • 引导式探索

# 4. 改进方向

  • 经验回放
  • 优先级采样
  • 多步SARSA

# 进阶优化

  1. Expected SARSA

    • 考虑期望更新
    • 降低方差
    • 提高稳定性
  2. n步SARSA

    • 使用多步回报
    • 加速价值传播
    • 平衡偏差方差
  3. SARSA(λ)

    • 引入资格迹
    • 加速学习
    • 提高效率
  4. Safe SARSA

    • 约束探索
    • 保证安全性
    • 风险控制