摘要
Q学习是一种强化学习算法,通过试错和记录经验来优化决策。以“迷宫里的小老鼠”为例,小老鼠的目标是找到奶酪。初始时,小老鼠随机探索迷宫,记录每次选择的路径和结果。通过反复尝试,小老鼠逐渐学会在特定路口选择最优方向,最终找到最短路径。这一过程通过Q表(记分本)实现,Q表记录每个状态和动作的Q值(预期奖励)。每次尝试后,Q表根据即时奖励和未来奖励的估计值进行更新。Q学习的核心公式为:新Q值 = 旧Q值 + 学习率 × [即时奖励 + 折扣率 × 下一步最大Q值 - 旧Q值]。通过不断更新Q表,小老鼠最终学会在迷宫中做出最优决策。
Q学习的故事版解释——“迷宫里的小老鼠”
1. 场景设定
想象有一只小老鼠被放进了一个迷宫。迷宫里有很多路口,每个路口可以选择往左、往右、往前、往后走。迷宫的某个角落藏着一块奶酪,小老鼠的目标就是找到奶酪。
2. 小老鼠的学习过程
第一次尝试
- 小老鼠什么都不知道,只能瞎走。
- 走着走着,可能碰到死胡同,也可能误打误撞找到奶酪。
- 每次找到奶酪后,老鼠会记住自己走过的路线。
反复尝试
- 老鼠每次都尝试不同的路线。
- 每当它做出一个选择(比如在某个路口往左走),它会记下这个选择带来的“结果”。
- 如果这条路最终带它找到了奶酪,它会觉得“在这个路口往左走”是个好选择。
- 如果走错了,老鼠会觉得“在这个路口往左走”没什么用。
记分本(Q表)
- 老鼠有一本“记分本”,记录每个路口(状态)每个方向(动作)带来的“分数”(Q值)。
- 每次尝试后,老鼠会根据结果更新记分本:如果某个选择带来了奶酪,分数就提高;如果带来了死胡同,分数就降低。
越来越聪明
- 经过多次尝试,老鼠的记分本越来越准确。
- 以后每次遇到路口,老鼠都会查记分本,优先选择分数高的方向。
- 最终,老鼠能用最短的路线找到奶酪。
Q学习的核心思想
- 状态(State):比如老鼠在迷宫的某个位置。
- 动作(Action):比如往哪个方向走。
- 奖励(Reward):比如找到奶酪就得分,走错路就扣分。
- Q值(Q-Value):在某个状态下采取某个动作,最终能获得的总奖励的估计值。
- 学习过程:不断尝试、记录、更新Q值,最终学会在每个状态下选最优动作。
Q学习的公式(简单理解)
每次老鼠做出一个选择后,都会用下面的方式更新记分本:
新Q值 = 旧Q值 + 学习率 × [即时奖励 + 折扣率 × 下一步最大Q值 - 旧Q值]
- 学习率:新经验影响记分本的程度。
- 折扣率:未来奖励的重要性。
总结
Q学习就像一只小老鼠在迷宫里不断试错、记笔记,最终学会了最快找到奶酪的办法。它的秘诀就是:每次尝试后都更新自己的“记分本”,下次遇到同样的情况就能做出更聪明的选择。
接下来我会用具体代码和流程图,帮助你更直观地理解Q学习的实现过程。
一、Q学习的流程图(文字版)
开始
|
v
初始化Q表(记分本)
|
v
重复多次(每一回合):
|
v
选择一个起点(状态)
|
v
重复直到到达终点(如找到奶酪):
|
v
选择一个动作(比如随机探索或查Q表选最优)
|
v
执行动作,观察新状态和奖励
|
v
用Q学习公式更新Q表
|
v
状态更新为新状态
|
v
回合结束
|
v
结束
二、Q学习的流程图(Mermaid语法)
你可以在支持Mermaid的平台粘贴以下代码生成流程图:
flowchart TD
A[开始] --> B[初始化Q表]
B --> C[每一回合]
C --> D[选择起点]
D --> E{是否到达终点?}
E -- 否 --> F[选择动作]
F --> G[执行动作,观察新状态和奖励]
G --> H[更新Q表]
H --> I[状态更新为新状态]
I --> E
E -- 是 --> J[回合结束]
J --> K{是否训练结束?}
K -- 否 --> C
K -- 是 --> L[结束]
三、Q学习的简化代码实现(Python伪代码)
我们用一个简单的迷宫环境(如OpenAI Gym的FrozenLake)来演示Q学习的核心代码:
import numpy as np
import gym
# 创建环境
env = gym.make('FrozenLake-v1', is_slippery=False) # 4x4冰湖迷宫
# 初始化Q表
Q = np.zeros([env.observation_space.n, env.action_space.n])
# 超参数
learning_rate = 0.8
discount_factor = 0.95
num_episodes = 2000
for episode in range(num_episodes):
state = env.reset()[0]
done = False
while not done:
# 选择动作:有时探索,有时利用
if np.random.uniform(0, 1) < 0.1:
action = env.action_space.sample() # 随机探索
else:
action = np.argmax(Q[state, :]) # 查Q表选最优
# 执行动作
next_state, reward, done, _, _ = env.step(action)
# Q学习公式更新Q表
Q[state, action] = Q[state, action] + learning_rate * (
reward + discount_factor * np.max(Q[next_state, :]) - Q[state, action]
)
state = next_state
# 训练结束后,Q表就是小老鼠的“记分本”
print("训练好的Q表:")
print(Q)
说明:
- Q表的每一行代表一个状态,每一列代表一个动作。
- 训练过程中,Q表不断被更新,最终学会在每个状态下选最优动作。
四、Q学习的核心公式再解释
每次老鼠(智能体)做出一个动作后,Q表的更新公式是:
Q(当前状态, 当前动作) ← Q(当前状态, 当前动作) + 学习率 × [奖励 + 折扣率 × 下一状态的最大Q值 - Q(当前状态, 当前动作)]
- Q(当前状态, 当前动作):记分本上当前格子的分数
- 奖励:这一步获得的分数
- 下一状态的最大Q值:假设以后都做最优选择,能拿到的最高分
- 学习率:新经验对记分本的影响程度
- 折扣率:未来奖励的重要性
五、总结
- Q学习就像小老鼠在迷宫里不断试错、记笔记,最终学会最快找到奶酪的办法。
- 记分本(Q表)不断被更新,越来越准确。
- 训练结束后,查Q表就能知道每一步该怎么走。