【RL】强化学习入门(二):Q-Learning算法

上文提出了强化学习问题的定义,核心问题是:智能体的决策是怎样产生的呢?

传统方法是提前制定固定规则(如棋类套路),或者将整个环境建模预处理最优解。像考试前背下所有题目答案,但遇到新题就会失败。

Q-Learning 的突破在于:放弃对环境的完美认知,转而从实际经验中学习。这种设计让它能应对现实世界中的不确定性,但也需要更多试错数据(类似人类需要多次练习才能掌握技能)。

1 评价函数

我们在面临一个状态 s s s 的时候,怎样评价在该状态下执行操作 a a a 的好坏呢?要回答这个问题,我们需要建立一个能够同时考虑即时收益和长期影响的评价标准。由于强化学习任务中奖励的稀疏性和延时性,这个标准不仅要反映当前动作带来的直接回报,还要包含这个动作对未来可能状态的潜在影响。

比如《打砖块》游戏中,当球从右侧飞来时,智能体需要决定是将球拍向左移动还是向右移动。单次操作使球拍移动的距离可能很小,无法带来任何收益。此外,还应该考虑这个动作会导致球飞向哪个方向,进而影响后续能否连续击碎更多砖块。

为此,首先定义累计回报 G t G_t Gt ------ 它表示从时刻 t t t 开始,未来所有奖励经过时间衰减后的总和:
G t = r t + 1 + γ r t + 2 + γ 2 r t + 3 + ⋯ = ∑ k = 0 ∞ γ k r t + k + 1 = r t + 1 + γ G t + 1 \begin{aligned} G_t &= r_{t+1} + \gamma r_{t+2} + \gamma^2 r_{t+3} + \cdots \\ &= \sum_{k=0}^\infty \gamma^k r_{t+k+1}\\ &= r_{t+1} + \gamma G_{t+1} \end{aligned} Gt=rt+1+γrt+2+γ2rt+3+⋯=k=0∑∞γkrt+k+1=rt+1+γGt+1

其中 γ ∈ [ 0 , 1 ) \gamma \in [0,1) γ∈[0,1) 是折扣因子。这个设计既保证无穷级数收敛(当 γ < 1 \gamma<1 γ<1时),又体现"近期奖励比远期更重要"的决策直觉。

首先考虑一个固定策略 π 的情况。假设我们有一个固定的行为规则,那么可以定义策略 π 下的动作价值函数:
Q π ( s , a ) = E π G t ∣ s t = s , a t = a Q^π(s,a) = \mathbb{E}_π \left G_t \\mid s_t=s, a_t=a \\right Qπ(s,a)=EπGt∣st=s,at=a

这个函数表示在状态 s 下执行动作 a 后,继续按照策略 π 行动所能获得的期望累计回报。这里的期望是对策略 π 下所有可能轨迹的平均,就像记录一个固定打法的玩家千万次游戏的平均得分。

强化学习的目标是找到最优策略 π*,即在每个状态都能做出最佳决策的策略。这就引出了最优动作价值函数的概念:
Q ∗ ( s , a ) = max ⁡ π Q π ( s , a ) Q^*(s,a) = \max_π Q^π(s,a) Q∗(s,a)=πmaxQπ(s,a)

这个函数表示在所有可能的策略中,能够获得最大期望回报的那个策略对应的价值。理解这个区别很关键: Q π Q^π Qπ 反映的是特定策略的表现,而 Q ∗ Q^* Q∗ 反映的是潜在的最佳表现。

最优 Q Q Q 函数满足贝尔曼最优方程:
Q ∗ ( s , a ) = E r + γ max ⁡ a ′ Q ∗ ( s ′ , a ′ ) Q^*(s,a) = \mathbb{E} \left r + \\gamma \\max_{a'} Q\^\*(s',a') \\right Q∗(s,a)=Er+γa′maxQ∗(s′,a′)

该方程将一个全局优化问题转化为局部递归关系。右边的 m a x max max 操作确保了我们在每个后续状态都会选择最优动作,从而保证整个策略的最优性。方程本质反映了动态规划的最优子结构特性:当前最优决策必须包含后续所有最优决策。

如果我们对贝尔曼方程进行递归预处理,提前求出 Q Q Q 表,就回归到了传统方法。面临着状态空间巨大、需要提前得知环境信息和无法应对环境改变等问题。

2 迭代规则

实践中,我们无法遍历所有可能的未来路径,于是通过采样单次转移 ( s , a , r , s ′ ) (s,a,r,s') (s,a,r,s′) 构造迭代规则:

Q-Learning 的迭代规则是:
Q ( s , a ) ← Q ( s , a ) + α ( r + γ max ⁡ a ′ Q ( s ′ , a ′ ) − Q ( s , a ) ) Q(s,a) \leftarrow Q(s,a) + \alpha \left( r + \gamma \max_{a'} Q(s',a') - Q(s,a) \right) Q(s,a)←Q(s,a)+α(r+γa′maxQ(s′,a′)−Q(s,a))

即将 Q ( s , a ) Q(s,a) Q(s,a) 更新为 Q ( s , a ) Q(s,a) Q(s,a) 和 r + γ max ⁡ a ′ Q ( s ′ , a ′ ) r + \gamma \max_{a'} Q(s',a') r+γmaxa′Q(s′,a′) 的加权平均数。

经过充分迭代后, Q Q Q 函数最终收敛到真实的最优价值评估。

3 举个栗子

3.1 游戏背景

理解 Q-Learning 的核心机制后,让我们通过一个典型例子来加深理解。以 OpenAI Gym 中经典的网格世界导航问题 FrozenLake 为例。

在一个 4x4 的网格中(可扩展至 8x8),每个网格中有一个字母:

  1. S 仅一个,位于左上角,为游戏起始点
  2. G 仅一个,位于右下角,为游戏目标点
  3. F 安全冰面
  4. H 危险冰洞

智能体需要在此环境中探索从起点到终点的最优路径,同时规避所有陷阱区域。

操作空间 :每回合可以执行一个操作,分别是:上(0)、下(1)、左(2)、右(3)。

当启用滑动模式时,实际状态转移将以33.3%的概率偏离指定方向。使操作结果具有不确定性,模拟了真实决策场景中的部分可观测性,要求智能体必须建立鲁棒的状态-动作映射。

奖励机制:仅当抵达目标点时获得+1奖励,落入冰洞则回合立即终止且无任何回报。

3.2 代码

python 复制代码
"""
代码结构解析:
1. 环境初始化:使用OpenAI Gym的FrozenLake环境
2. Q表设计:用二维数组存储状态-动作价值
3. ε-greedy策略:平衡探索与利用
4. Q值更新:实现贝尔曼最优方程
5. 训练过程:包含探索率衰减机制
6. 策略测试:展示最终学习效果

关键参数说明:
- alpha:控制新信息的吸收速度
- gamma:未来奖励的折扣程度
- epsilon:探索概率,随时间衰减
- episodes:训练回合数

"""
import gym
import numpy as np

# 创建FrozenLake环境
env = gym.make('FrozenLake-v1', render_mode='human', is_slippery=False)

# 初始化Q表 (状态数 x 动作数)
q_table = np.zeros([env.observation_space.n, env.action_space.n])

# 超参数设置
alpha = 0.8   # 学习率
gamma = 0.95  # 折扣因子
epsilon = 0.1 # 探索概率
episodes = 1000

# 训练循环
for episode in range(episodes):
    state, _ = env.reset()
    done = False
    total_reward = 0
    
    while not done:
        # ε-greedy策略选择动作
        if np.random.uniform(0, 1) < epsilon:
            action = env.action_space.sample()  # 探索
        else:
            action = np.argmax(q_table[state])  # 利用
            
        # 执行动作
        next_state, reward, done, _, _ = env.step(action)
        
        # 更新Q值 (贝尔曼方程)
        old_value = q_table[state, action]
        next_max = np.max(q_table[next_state])
        new_value = (1 - alpha) * old_value + alpha * (reward + gamma * next_max)
        q_table[state, action] = new_value
        
        total_reward += reward
        state = next_state

    # 逐步降低探索率
    epsilon = max(0.01, epsilon * 0.995)
    
    if episode % 100 == 0:
        print(f"Episode: {episode}, Total Reward: {total_reward}")

# 测试训练后的策略
test_episodes = 5
for episode in range(test_episodes):
    state, _ = env.reset()
    done = False
    print(f"\nTest Episode {episode+1}")
    
    while not done:
        action = np.argmax(q_table[state])  # 完全利用
        state, reward, done, _, _ = env.step(action)
        env.render()
        
        if done:
            print("Reached goal!" if reward == 1 else "Fell into hole!")
            break

env.close()

Q-Learning 算法为后续 DQN 的发展奠定基础------用深度网络拟合 Q 函数。这种"从试错中建立价值认知"的范式,成为现代强化学习的核心方法论。

相关推荐
大数据在线2 小时前
布局Agentic AI,亚马逊云科技组合拳再升级
人工智能·openai·亚马逊云科技·智能体·agentic ai
8Qi83 小时前
回文子串(Palindromic Substrings)—— 题解
算法·leetcode·职场和发展·动态规划
皮皮学姐分享-ppx6 小时前
政府绿色采购数据库(2015-2024.3)
大数据·网络·数据库·人工智能·制造
GIS数据转换器6 小时前
基于3D GIS的监控视频精准标定平台
人工智能·物联网·3d·音视频·无人机·知识图谱
专注VB编程开发20年6 小时前
AI 生成C# WinForm 窗体 = 目前就是垃圾
开发语言·人工智能·c#
深小乐7 小时前
Claude Fable5 尝鲜,效果挺不错
人工智能
Nayxxu7 小时前
Gemini + RAG 企业知识库教程:从文档切片到答案生成
运维·人工智能
冬奇Lab7 小时前
真正的 AI-Native Workflow 是什么?——四个判断测试
人工智能·agent
冬奇Lab7 小时前
每日一个开源项目(第128篇):Agent Skills - 给 AI 编程 Agent 装上工程纪律
人工智能·开源·资讯
Deepoch7 小时前
Deepoc VLA开发板:采摘机器人的环境鲁棒作业与不确定性应对
人工智能·机器人·采摘机器人·deepoc