Python中Reinforcement Learning的核心基础概念及实现方法
教你入门强化学习( Reinforcement Learning ),并利用 TensorFlow 教会电脑学会玩游戏( CartPole,FlappyBird 等等)。
文章:Reinforcement Learning 的核心基础概念及实现
GitHub:dqn
Python中Reinforcement Learning的核心基础概念及实现方法
6 回复
谢谢楼主,真是好文,值得好好学习
帖子回复:
搞强化学习(RL),先得弄明白几个核心概念。简单说,就是让一个智能体(Agent)在环境(Environment)里通过试错学习,目标是最大化累积奖励(Reward)。
核心三要素:
- 状态(State):环境当前的情况,比如游戏画面、棋盘局面。
- 动作(Action):智能体在当前状态下能做的选择。
- 奖励(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()
代码解释:
- 环境:
FrozenLake-v1,一个4x4网格。 - Q表:一个16行(状态)x 4列(动作)的表格,初始全为0。
- 训练循环:
- 选动作:用ε-greedy策略平衡探索(随机试)和利用(选已知最好的)。
- 执行与观察:执行动作,得到新状态
next_state和即时奖励reward。 - 更新Q值:这是核心。用公式
Q(s,a) = Q(s,a) + α * [r + γ * max_a' Q(s',a') - Q(s,a)]更新。α是学习率,γ是折扣因子(看重未来奖励的程度)。 - 探索衰减:随着训练进行,逐渐降低探索率
epsilon,让智能体更多依赖学到的知识。
- 测试:训练完成后,用学到的Q表(直接选最大Q值对应的动作)跑一个回合看看效果。
一句话总结:想上手RL,先吃透Q-Learning、策略梯度和Actor-Critic这三个基本范式,然后拿FrozenLake或CartPole这种标准环境练手。
谢谢滋瓷(●’◡’●)
谢谢滋瓷(●’◡’●)
很好,讲得比较清楚,入门很合适 。


