Python中Reinforcement Learning的核心基础概念及实现方法

教你入门强化学习( Reinforcement Learning ),并利用 TensorFlow 教会电脑学会玩游戏( CartPole,FlappyBird 等等)。

文章:Reinforcement Learning 的核心基础概念及实现
GitHub:dqn


Python中Reinforcement Learning的核心基础概念及实现方法

6 回复

谢谢楼主,真是好文,值得好好学习


帖子回复:

搞强化学习(RL),先得弄明白几个核心概念。简单说,就是让一个智能体(Agent)在环境(Environment)里通过试错学习,目标是最大化累积奖励(Reward)。

核心三要素:

  1. 状态(State):环境当前的情况,比如游戏画面、棋盘局面。
  2. 动作(Action):智能体在当前状态下能做的选择。
  3. 奖励(Reward):环境对智能体动作的即时反馈,是学习的“指南针”。

核心方法:

  • 价值学习(Value-Based):比如Q-Learning,核心是学一个Q表(或Q网络),记录在某个状态下做某个动作的长期价值(Q值)。选择动作时,就选Q值最高的那个。它不直接学策略,而是通过价值间接决定动作。
  • 策略学习(Policy-Based):比如REINFORCE算法,直接学习一个策略函数(Policy Function)。这个函数输入状态,直接输出每个动作的概率分布。动作根据这个概率分布采样选择。它更擅长处理连续动作空间和随机策略。
  • 演员-评论家(Actor-Critic):这是上面两种的结合体,算是目前的主流框架。“演员”(Actor)就是一个策略网络,负责根据状态生成动作。“评论家”(Critic)就是一个价值网络(比如Q网络或状态价值V网络),负责评估当前状态(或状态-动作对)的好坏,并指导演员更新。两者一起训练,效率通常比单独用前两种高。

一个简单的Q-Learning例子(表格法): 我们用一个经典的FrozenLake环境来演示。环境里智能体要穿过冰湖到达目标,冰面有的地方是洞,掉进去就失败。

import gymnasium as gym
import numpy as np

# 1. 创建环境
env = gym.make('FrozenLake-v1', desc=None, map_name="4x4", is_slippery=False, render_mode="rgb_array")

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

# 3. 设置超参数
learning_rate = 0.1
discount_factor = 0.99
epsilon = 1.0  # 探索率
epsilon_decay = 0.995
epsilon_min = 0.01
episodes = 10000

# 4. Q-Learning 训练循环
for episode in range(episodes):
    state, _ = env.reset()
    done = False

    while not done:
        # 4.1 选择动作 (epsilon-greedy策略)
        if np.random.uniform(0, 1) < epsilon:
            action = env.action_space.sample()  # 探索:随机选
        else:
            action = np.argmax(q_table[state, :])  # 利用:选Q值最大的

        # 4.2 执行动作,得到反馈
        next_state, reward, terminated, truncated, _ = env.step(action)
        done = terminated or truncated

        # 4.3 更新Q表 (Q-Learning核心公式)
        old_value = q_table[state, action]
        next_max = np.max(q_table[next_state, :]) if not done else 0

        # Q(s,a) = Q(s,a) + α * [r + γ * max_a' Q(s',a') - Q(s,a)]
        new_value = old_value + learning_rate * (reward + discount_factor * next_max - old_value)
        q_table[state, action] = new_value

        # 4.4 转移到下一个状态
        state = next_state

    # 4.5 衰减探索率
    epsilon = max(epsilon_min, epsilon * epsilon_decay)

    if (episode + 1) % 1000 == 0:
        print(f"Episode {episode+1} completed.")

env.close()

# 5. 测试训练好的策略
print("\n=== 测试训练好的Q表 ===")
test_env = gym.make('FrozenLake-v1', desc=None, map_name="4x4", is_slippery=False, render_mode="human")
state, _ = test_env.reset()
done = False
total_reward = 0

while not done:
    action = np.argmax(q_table[state, :])  # 直接选择最优动作
    state, reward, terminated, truncated, _ = test_env.step(action)
    done = terminated or truncated
    total_reward += reward
    test_env.render()

print(f"测试回合总奖励: {total_reward}")
test_env.close()

代码解释:

  1. 环境FrozenLake-v1,一个4x4网格。
  2. Q表:一个16行(状态)x 4列(动作)的表格,初始全为0。
  3. 训练循环
    • 选动作:用ε-greedy策略平衡探索(随机试)和利用(选已知最好的)。
    • 执行与观察:执行动作,得到新状态next_state和即时奖励reward
    • 更新Q值:这是核心。用公式Q(s,a) = Q(s,a) + α * [r + γ * max_a' Q(s',a') - Q(s,a)]更新。α是学习率,γ是折扣因子(看重未来奖励的程度)。
    • 探索衰减:随着训练进行,逐渐降低探索率epsilon,让智能体更多依赖学到的知识。
  4. 测试:训练完成后,用学到的Q表(直接选最大Q值对应的动作)跑一个回合看看效果。

一句话总结:想上手RL,先吃透Q-Learning、策略梯度和Actor-Critic这三个基本范式,然后拿FrozenLakeCartPole这种标准环境练手。

值得好好学习! 感谢!

谢谢滋瓷(●’◡’●)

谢谢滋瓷(●’◡’●)

很好,讲得比较清楚,入门很合适 。

回到顶部