强化学习(Reinforcement Learning, RL)是一种通过与环境交互来学习最优策略的机器学习方法。在强化学习中,Q-Learning和Sarsa是两种重要的基于值的算法。本文将详细讲解这两种算法,并通过实际代码示例展示其应用。
1. 强化学习基础
强化学习涉及以下几个基本概念:
- 状态(State, s):描述环境的某一时刻的状态。
- 动作(Action, a):智能体在某一状态下可以采取的行为。
- 奖励(Reward, r):智能体采取某一动作后环境给出的反馈。
- 策略(Policy, π):智能体选择动作的规则或函数。
- 价值函数(Value Function, V(s)):在某一状态下的期望回报。
- 动作价值函数(Action-Value Function, Q(s, a)):在某一状态下采取某一动作的期望回报。
2. Q-Learning算法
原理
Q-Learning是一种无模型(model-free)的离线强化学习算法,通过学习状态-动作对的Q值来找到最优策略。Q-Learning基于Bellman方程更新Q值,目标是使Q值函数逐渐逼近真实的状态-动作值函数。
公式推导
Q-Learning的更新公式为:
其中:
- 是学习率(learning rate),控制更新的步长。
- 是折扣因子(discount factor),权衡未来奖励的影响。
- 是当前的即时奖励。
- 是当前动作执行后的新状态。
- 是在新状态下采取的下一动作。
代码实现
我们以经典的OpenAI Gym中的CartPole环境为例,展示Q-Learning算法的实现。
import gym
import numpy as np
env = gym.make('CartPole-v1')
n_actions = env.action_space.n
n_states = 20 # 离散化状态空间的粒度
# 将连续状态空间离散化
def discretize_state(state, n_states):
env_low = env.observation_space.low
env_high = env.observation_space.high
env_dx = (env_high - env_low) / n_states
discrete_state = ((state - env_low) / env_dx).astype(int)
return tuple(discrete_state)
# Q表初始化
Q_table = np.zeros([n_states] * len(env.observation_space.high) + [n_actions])
# 参数设置
alpha = 0.1 # 学习率
gamma = 0.99 # 折扣因子
epsilon = 0.1 # 探索率
episodes = 1000
for episode in range(episodes):
state = discretize_state(env.reset(), n_states)
done = False
while not done:
# epsilon-greedy策略选择动作
if np.random.rand() < epsilon:
action = env.action_space.sample()
else:
action = np.argmax(Q_table[state])
next_state, reward, done, _ = env.step(action)
next_state = discretize_state(next_state, n_states)
best_next_action = np.argmax(Q_table[next_state])
td_target = reward + gamma * Q_table[next_state][best_next_action]
td_error = td_target - Q_table[state][action]
Q_table[state][action] += alpha * td_error
state = next_state
env.close()
print("Q-Learning训练完成")
3. Sarsa算法
原理
Sarsa(State-Action-Reward-State-Action)是一种基于策略的强化学习算法,与Q-Learning不同的是,Sarsa使用行为策略(on-policy),即在更新Q值时使用的是实际执行的动作。
公式推导
Sarsa的更新公式为:
其中:
- 是在新状态下实际采取的动作。
代码实现
同样以CartPole环境为例,展示Sarsa算法的实现。
import gym
import numpy as np
env = gym.make('CartPole-v1')
n_actions = env.action_space.n
n_states = 20 # 离散化状态空间的粒度
def discretize_state(state, n_states):
env_low = env.observation_space.low
env_high = env.observation_space.high
env_dx = (env_high - env_low) / n_states
discrete_state = ((state - env_low) / env_dx).astype(int)
return tuple(discrete_state)
Q_table = np.zeros([n_states] * len(env.observation_space.high) + [n_actions])
alpha = 0.1
gamma = 0.99
epsilon = 0.1
episodes = 1000
for episode in range(episodes):
state = discretize_state(env.reset(), n_states)
done = False
# epsilon-greedy策略选择动作
if np.random.rand() < epsilon:
action = env.action_space.sample()
else:
action = np.argmax(Q_table[state])
while not done:
next_state, reward, done, _ = env.step(action)
next_state = discretize_state(next_state, n_states)
# epsilon-greedy策略选择下一动作
if np.random.rand() < epsilon:
next_action = env.action_space.sample()
else:
next_action = np.argmax(Q_table[next_state])
td_target = reward + gamma * Q_table[next_state][next_action]
td_error = td_target - Q_table[state][action]
Q_table[state][action] += alpha * td_error
state = next_state
action = next_action
env.close()
print("Sarsa训练完成")
4. Q-Learning与Sarsa的对比
特点 | Q-Learning | Sarsa |
---|---|---|
策略类型 | 离线策略(Off-Policy) | 在线策略(On-Policy) |
下一状态更新 | 使用最大Q值的动作更新 | 使用实际执行的动作更新 |
收敛性 | 更具探索性,可能更快收敛到全局最优 | 更具稳定性,逐步逼近最优 |
风险控制 | 相对更激进 | 相对更保守 |
5. 总结
Q-Learning和Sarsa是两种经典的强化学习算法,各有优缺点。Q-Learning通过最大化未来的预期回报来更新Q值,具有更强的探索性;而Sarsa则使用实际执行的动作进行更新,更注重策略的稳定性。通过实际代码示例,我们可以看到这两种算法的实现和应用。根据不同的应用场景,可以选择适合的算法来解决实际问题。