机器学习入门项目:强化学习与Q学习算法详解

【免费下载链接】ML-For-Beginners 微软出品的面向初学者的机器学习课程,提供了一系列实践项目和教程,旨在帮助新手逐步掌握Python、Azure ML等工具进行数据预处理、模型训练及部署。 【免费下载链接】ML-For-Beginners 项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners

强化学习基础概念

强化学习是机器学习的一个重要分支,它模拟了生物体通过与环境互动来学习决策的过程。想象一下你正在玩超级马里奥游戏:马里奥就是智能体(Agent),游戏关卡就是环境(Environment),马里奥所处的位置和周围环境构成了状态(State),而马里奥可以执行的动作(如跳跃、移动)就是动作(Action)。当马里奥吃到金币时获得奖励(Reward),碰到敌人则受到惩罚。

强化学习的核心三要素:

  1. 智能体:学习并做出决策的主体
  2. 环境:智能体交互的外部世界
  3. 奖励函数:评价动作好坏的反馈机制

Q学习算法原理

Q学习是一种经典的强化学习算法,它通过学习一个称为Q表的数据结构来指导智能体的决策。Q表记录了在特定状态下采取每个动作的"质量"或"价值"。

贝尔曼方程

Q学习的理论基础是贝尔曼方程,它定义了如何更新Q值:

Q(s,a) ← (1-α)Q(s,a) + α[r + γ·max(Q(s',a'))]

其中:

  • α:学习率,控制新信息覆盖旧信息的程度
  • γ:折扣因子,权衡即时奖励与未来奖励的重要性
  • r:即时奖励
  • max(Q(s',a')):下一状态所有可能动作中的最大Q值

探索与利用的平衡

在强化学习中,我们需要平衡:

  1. 探索:尝试新动作以发现可能更好的策略
  2. 利用:使用已知的最佳动作以获得最大奖励

常用的策略是ε-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)

学习过程分析

观察训练过程中的平均路径长度变化,我们可以发现三个典型阶段:

  1. 初期增长阶段:智能体对环境一无所知,容易陷入危险区域
  2. 中期下降阶段:随着学习进行,智能体找到更优路径
  3. 偶然波动阶段:由于探索机制,偶尔会出现路径长度突增

实际应用建议

  1. 参数调优:学习率α和折扣因子γ对训练效果影响很大,需要合理设置
  2. 奖励设计:奖励函数的设计直接影响学习目标,需谨慎设计
  3. 探索策略:初期应侧重探索,后期逐渐增加利用比例
  4. 状态表示:复杂问题可能需要更精细的状态表示方法

通过这个项目,我们实现了从零开始构建一个Q学习算法,并成功训练智能体在网格世界中找到最优路径。这为理解更复杂的强化学习算法奠定了坚实基础。

【免费下载链接】ML-For-Beginners 微软出品的面向初学者的机器学习课程,提供了一系列实践项目和教程,旨在帮助新手逐步掌握Python、Azure ML等工具进行数据预处理、模型训练及部署。 【免费下载链接】ML-For-Beginners 项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐