机器学习入门项目:强化学习与Q学习算法详解
机器学习入门项目:强化学习与Q学习算法详解强化学习基础概念强化学习是机器学习的一个重要分支,它模拟了生物体通过与环境互动来学习决策的过程。想象一下你正在玩超级马里奥游戏:马里奥就是智能体(Agent),游戏关卡就是环境(Environment),马里奥所处的位置和周围环境构成了状态(State),而马里奥可以执行的动作(如跳跃、移动)就是动作(Action)。当马里奥吃到金币时获得奖励(Rew..
机器学习入门项目:强化学习与Q学习算法详解
强化学习基础概念
强化学习是机器学习的一个重要分支,它模拟了生物体通过与环境互动来学习决策的过程。想象一下你正在玩超级马里奥游戏:马里奥就是智能体(Agent),游戏关卡就是环境(Environment),马里奥所处的位置和周围环境构成了状态(State),而马里奥可以执行的动作(如跳跃、移动)就是动作(Action)。当马里奥吃到金币时获得奖励(Reward),碰到敌人则受到惩罚。
强化学习的核心三要素:
- 智能体:学习并做出决策的主体
- 环境:智能体交互的外部世界
- 奖励函数:评价动作好坏的反馈机制
Q学习算法原理
Q学习是一种经典的强化学习算法,它通过学习一个称为Q表的数据结构来指导智能体的决策。Q表记录了在特定状态下采取每个动作的"质量"或"价值"。
贝尔曼方程
Q学习的理论基础是贝尔曼方程,它定义了如何更新Q值:
Q(s,a) ← (1-α)Q(s,a) + α[r + γ·max(Q(s',a'))]
其中:
- α:学习率,控制新信息覆盖旧信息的程度
- γ:折扣因子,权衡即时奖励与未来奖励的重要性
- r:即时奖励
- max(Q(s',a')):下一状态所有可能动作中的最大Q值
探索与利用的平衡
在强化学习中,我们需要平衡:
- 探索:尝试新动作以发现可能更好的策略
- 利用:使用已知的最佳动作以获得最大奖励
常用的策略是ε-greedy方法,即以ε概率随机选择动作(探索),以1-ε概率选择当前最佳动作(利用)。
实战:彼得与狼的世界
让我们通过一个具体例子来理解Q学习。我们创建一个8×8的方格世界,包含以下元素:
- 地面:可以行走
- 水:不可行走
- 树/草地:可以休息
- 苹果:目标,获得正奖励
- 狼:危险,获得负奖励
环境初始化
首先设置环境参数:
from rlboard import *
width, height = 8, 8
m = Board(width, height)
m.randomize(seed=13)
m.plot()
定义可能的动作(上、下、左、右):
actions = { "U": (0,-1), "D": (0,1), "L": (-1,0), "R": (1,0) }
action_idx = { a: i for i,a in enumerate(actions.keys()) }
奖励函数设计
合理的奖励函数对学习效果至关重要:
move_reward = -0.1 # 每步小惩罚,鼓励最短路径
goal_reward = 10 # 找到苹果的大奖励
end_reward = -10 # 遇到狼或水的惩罚
def reward(m, pos=None):
pos = pos or m.human
if not m.is_valid(pos):
return end_reward
x = m.at(pos)
if x == Board.Cell.water or x == Board.Cell.wolf:
return end_reward
if x == Board.Cell.apple:
return goal_reward
return move_reward
Q表初始化
Q表是一个三维数组,维度为:宽度×高度×动作数
import numpy as np
Q = np.ones((width, height, len(actions)), dtype=np.float) * 1.0/len(actions)
初始时,所有动作的价值相等,相当于随机策略。
训练过程
实现Q学习算法:
def probs(v, eps=1e-4):
"""将Q值转换为动作概率"""
v = v - v.min() + eps
v = v / v.sum()
return v
lpath = []
for epoch in range(5000): # 5000次训练周期
m.random_start() # 随机起始位置
n = 0
cum_reward = 0
while True:
x, y = m.human
v = probs(Q[x,y])
a = random.choices(list(actions), weights=v)[0] # 按概率选择动作
dpos = actions[a]
m.move(dpos, check_correctness=False)
r = reward(m)
cum_reward += r
if r == end_reward or cum_reward < -1000:
lpath.append(n)
break
alpha = np.exp(-n / 10e5) # 动态学习率
gamma = 0.5 # 折扣因子
ai = action_idx[a]
# Q值更新
Q[x,y,ai] = (1 - alpha) * Q[x,y,ai] + alpha * (r + gamma * Q[x+dpos[0], y+dpos[1]].max())
n += 1
策略测试
训练完成后,我们可以测试学到的策略:
def qpolicy(m):
"""基于Q表的策略"""
x, y = m.human
v = probs(Q[x,y])
a = random.choices(list(actions), weights=v)[0]
return a
def print_statistics(policy):
"""统计策略表现"""
s, w, n = 0, 0, 0
for _ in range(100):
z = walk(m, policy)
if z < 0:
w += 1
else:
s += z
n += 1
print(f"平均路径长度 = {s/n}, 被狼吃掉次数: {w}")
print_statistics(qpolicy)
学习过程分析
观察训练过程中的平均路径长度变化,我们可以发现三个典型阶段:
- 初期增长阶段:智能体对环境一无所知,容易陷入危险区域
- 中期下降阶段:随着学习进行,智能体找到更优路径
- 偶然波动阶段:由于探索机制,偶尔会出现路径长度突增
实际应用建议
- 参数调优:学习率α和折扣因子γ对训练效果影响很大,需要合理设置
- 奖励设计:奖励函数的设计直接影响学习目标,需谨慎设计
- 探索策略:初期应侧重探索,后期逐渐增加利用比例
- 状态表示:复杂问题可能需要更精细的状态表示方法
通过这个项目,我们实现了从零开始构建一个Q学习算法,并成功训练智能体在网格世界中找到最优路径。这为理解更复杂的强化学习算法奠定了坚实基础。

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)