15 时序差分学习之Q学习的原理与实现

在上一篇中,我们详细探讨了SARSA算法,这是一种基于时序差分学习的方法。接下来,我们将深入了解Q学习,这也是一种常用的时序差分学习算法。在这篇文章中,我们将重点讨论Q学习的原理、特点以及如何在Python中实现这一算法。

Q学习的基本原理

Q学习是一种无模型的强化学习算法,旨在学习一个策略,使得在一个给定的环境中智能体能够最大化其累积回报。它通过学习一个动作-价值函数,即Q函数,来实现这一目标。Q函数的定义为:

$$
Q(s, a) = \mathbb{E} \left[ R_t + \gamma \max_{a’} Q(s’, a’) \mid s_t = s, a_t = a \right]
$$

其中:

  • $s$ 表示状态
  • $a$ 表示动作
  • $R_t$ 是时间 $t$ 时所获得的即时回报
  • $\gamma$ 是折扣因子(通常在0和1之间)
  • $s’$ 是执行动作 $a$ 后所到达的下一个状态
  • $a’$ 是在状态 $s’$ 下可选择的动作

Q学习的核心思想在于通过不断更新Q值,使其能够逼近真实的Q值,从而找到最优策略。

Q值更新公式

Q学习使用以下更新公式来调整Q值:

$$
Q(s, a) \leftarrow Q(s, a) + \alpha \left[ R + \gamma \max_{a’} Q(s’, a’) - Q(s, a) \right]
$$

其中 $\alpha$ 是学习率,它决定了新经验对已有Q值的影响程度。

Q学习的特点

  1. 无模型:Q学习不需要环境的模型,即智能体不需要了解状态转移概率。
  2. 离线学习:Q学习可以基于经验回放进行学习,这意味着智能体可以利用历史经验来提高学习效率。
  3. 探索与利用平衡:Q学习通过 ε-greedy 策略来平衡探索与利用,智能体在选择动作时会随机选择某些动作以获得更多的经验。

算法实现

接下来,我们将通过一个简单的网格环境案例,来实现Q学习算法。

环境设置

我们可以创建一个简单的5x5网格环境,智能体需要从起始位置(左下角)移动到目标位置(右上角)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import numpy as np
import random

class GridWorld:
def __init__(self, grid_size):
self.grid_size = grid_size
self.state = (0, 0) # 起始位置

def reset(self):
self.state = (0, 0)
return self.state

def step(self, action):
if action == 0: # 上
next_state = (max(0, self.state[0] - 1), self.state[1])
elif action == 1: # 下
next_state = (min(self.grid_size[0] - 1, self.state[0] + 1), self.state[1])
elif action == 2: # 左
next_state = (self.state[0], max(0, self.state[1] - 1))
elif action == 3: # 右
next_state = (self.state[0], min(self.grid_size[1] - 1, self.state[1] + 1))

reward = 1 if next_state == (grid_size[0] - 1, grid_size[1] - 1) else 0
done = next_state == (grid_size[0] - 1, grid_size[1] - 1)
self.state = next_state

return next_state, reward, done

Q学习实现

现在我们将实现Q学习算法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class QLearningAgent:
def __init__(self, grid_size, learning_rate=0.1, discount_factor=0.99, exploration_rate=1.0, exploration_decay=0.99):
self.grid_size = grid_size
self.q_table = np.zeros((*grid_size, 4)) # Q值表
self.alpha = learning_rate
self.gamma = discount_factor
self.epsilon = exploration_rate
self.epsilon_decay = exploration_decay

def choose_action(self, state):
if random.uniform(0, 1) < self.epsilon: # 探索
return random.randint(0, 3)
else: # 利用
return np.argmax(self.q_table[state])

def update_q_value(self, state, action, reward, next_state):
max_future_q = np.max(self.q_table[next_state])
current_q = self.q_table[state + (action,)]

# Q值更新
self.q_table[state + (action,)] = current_q + self.alpha * (reward + self.gamma * max_future_q - current_q)

def train(self, episodes):
for episode in range(episodes):
state = env.reset()
done = False

while not done:
action = self.choose_action(state)
next_state, reward, done = env.step(action)
self.update_q_value(state, action, reward, next_state)
state = next_state

# 衰减探索率
self.epsilon *= self.epsilon_decay

训练智能体

我们可以训练我们的智能体并观察结果:

1
2
3
4
5
6
7
8
9
grid_size = (5, 5)
env = GridWorld(grid_size)
agent = QLearningAgent(grid_size)

# 训练智能体
agent.train(1000)

# 打印最终的Q值表
print(agent.q_table)

小结

在本篇文章中,我们详细介绍了Q学习的原理与实现。通过创建一个简单的网格环境,我们成功实现了Q学习算法,并展示了如何通过行动与回报来不断更新Q值。Q学习的成功之处在于它能够在没有环境模型的情况下,通过与环境的交互自我学习最终实现最优策略。

在下一篇文章中,我们将深入探讨Q学习的详细应用和变种。在学习Q学习的过程中,您会发现它在强化学习中的重要性和广泛应用。希望您能将这些理论和实践相结合,加深对强化学习的理解。

15 时序差分学习之Q学习的原理与实现

https://zglg.work/reinforcement-learning-zero/15/

作者

IT教程网(郭震)

发布于

2024-08-15

更新于

2024-08-16

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论