尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

强化学习入门:从核心概念到DQN实战,掌握智能决策框架

强化学习入门:从核心概念到DQN实战,掌握智能决策框架 1. 从零开始的强化学习为什么它值得你投入时间如果你对人工智能感兴趣尤其是那些能下围棋、打游戏、甚至控制复杂物理系统的智能体那么“强化学习”这个词你一定不陌生。它听起来很酷但入门时常常让人望而生畏马尔可夫决策过程、贝尔曼方程、策略梯度……一堆术语扑面而来。很多人可能翻了几页教材或看了几篇博客就放弃了觉得这玩意儿离实际应用太远或者理论过于艰深。我最初接触RL时也有同感感觉像是在学一门全新的数学而不是一个能动手实践的技术。但我想告诉你的是强化学习可能是目前最接近“通用人工智能”学习范式的一种方法。它的核心思想极其直观一个智能体通过与环境互动根据行动带来的奖励或惩罚来学习如何做出更好的决策。这和我们人类学习骑自行车、掌握一门新技能的过程何其相似——没人给你一本厚厚的操作手册你通过尝试、摔倒、再尝试最终找到了保持平衡的窍门。RL的魅力就在于它将这种试错学习的过程数学化和自动化了。所以这篇“Lecture 1”的目的不是带你快速浏览一遍教科书目录而是帮你搭建一个坚实、直观的认知框架。我们会暂时抛开那些复杂的公式推导先搞清楚几个最根本的问题RL到底在解决什么问题它和传统的监督学习、无监督学习有什么本质不同一个典型的RL系统由哪些部分组成理解了这些你再去啃那些数学细节就会有一种“原来如此”的通透感。无论你是学生、工程师还是对AI有好奇心的爱好者这篇文章都将为你打开一扇门让你看到RL不仅是一门理论更是一套强大且正在被广泛应用的工具。2. 强化学习的核心范式与监督学习的根本分野要理解强化学习最有效的方法就是把它和我们更熟悉的监督学习放在一起对比。很多人刚开始会混淆觉得RL只是监督学习的一个变种但事实上它们的底层逻辑截然不同。在监督学习中我们面对的是一个静态的数据集。比如图像分类我们有一大堆已经标注好“猫”、“狗”的图片。学习过程就是让模型去拟合这些已经存在的“标准答案”。数据是给定的答案也是给定的模型的任务是找到从输入到输出之间的映射关系。整个学习过程是“离线”的模型不会因为它的预测而改变它接下来要学习的数据。而强化学习处理的是一个动态的、序列决策的问题。想象一下训练一个机器人走路。我们无法给它一个包含所有可能状态和正确动作的“数据集”因为环境是连续变化的并且机器人的每一个动作都会改变它接下来所处的状态。这里没有现成的“标准答案”即“在某个精确的时刻腿关节应该转动多少度”。我们只能给智能体提供一个模糊的“奖励”信号比如“向前移动了就给正分摔倒了就给负分”。智能体的目标就是在与环境的持续交互中通过尝试不同的动作序列最大化它长期获得的总奖励。这个根本性的差异引出了RL的几个独特挑战试错与探索智能体必须自己去探索哪些动作是好的。如果它一开始就找到一个能获得微小奖励的动作它可能会陷入“局部最优”而不敢尝试其他可能带来更大回报但暂时未知的动作。如何平衡“利用”已知的好动作和“探索”新的可能性是RL的核心议题之一。延迟奖励奖励往往是延迟的。在下围棋时只有最终赢了棋才能获得正奖励而中间下的每一步棋其好坏在当时是无法立即知晓的。智能体需要具备“远见”能够为了长远的最终胜利而牺牲眼前的短期利益。时间序列与信用分配当智能体获得一个奖励无论是好是坏时它需要弄清楚这个结果主要是由我刚刚做的这个动作导致的还是由之前一系列动作共同导致的这个问题被称为“信用分配”。比如在玩《星际争霸》时一场胜利是源于十分钟前的一次关键科技升级还是最后一波犀利的操作智能体需要学会将功劳或责任正确地归因到历史动作上。为了应对这些挑战RL建立了一套完整的数学框架来描述这个问题其中最核心的就是马尔可夫决策过程。你可以把它理解为RL问题的“标准建模模板”。一个MDP通常包含五个关键元素状态集合、动作集合、状态转移概率、奖励函数和折扣因子。它假设当前状态包含了做出最优决策所需的全部历史信息即马尔可夫性这大大简化了问题。虽然现实问题未必完全满足马尔可夫性但MDP为我们提供了一个强大且通用的分析工具。理解MDP是理解几乎所有现代RL算法的基础。3. 智能体与环境的互动循环解剖一个RL系统现在让我们把视角拉近像一个系统架构师一样拆解一个正在运行的RL智能体。这个互动过程是一个持续的循环理解这个循环的每一个环节就等于理解了RL系统是如何“呼吸”和“生长”的。这个循环始于一个时间步t。此时智能体从环境中接收到一个对当前世界的观测我们称之为状态。状态需要尽可能准确地反映环境信息。例如在自动驾驶场景中状态可能包括车辆的速度、位置、周围其他车辆和行人的信息、交通信号灯状态等。基于当前的状态智能体内部的“大脑”——也就是它的策略——会决定要采取哪个动作。策略是一个函数它把状态映射到动作上。它可以是确定性的看到状态S就一定输出动作A也可以是随机性的看到状态S以某种概率分布输出不同的动作。初期这个策略可能是完全随机的智能体只是在胡乱尝试。智能体执行这个动作后会作用到环境上。环境因此发生变化进入一个新的状态t1。同时环境会给出一个奖励信号告诉智能体刚才那个动作是好是坏。这个奖励是一个标量数值是智能体唯一明确的优化目标。设计奖励函数是一门艺术也是RL项目成功的关键。一个设计不当的奖励函数会导致智能体学到意想不到的、甚至有害的行为。比如你让一个游戏AI“获得高分”它可能会发现某种刷分的漏洞而不是真正学会如何玩好游戏。注意奖励函数的设计原则是“你得到你所奖励的”。如果你奖励一个清理机器人移动的距离它可能会在原地不停转圈如果你奖励它收集的垃圾数量它可能会把垃圾扔了又捡起来。一个好的奖励函数应该与最终目标高度一致并且尽可能平滑、无歧义。智能体接收到新的状态和奖励后就完成了一次交互。它会将这次经历记录在案通常存储为一个四元组(状态 动作 奖励 新状态)也称为一个“转移”。这些转移被存储在经验回放缓冲区中。这个缓冲区是许多RL算法的关键组件它有两大作用一是打破数据之间的时间相关性让学习更稳定二是可以重复利用旧的经验提高数据利用率。接下来就是学习的核心环节策略更新。智能体会从经验回放缓冲区中采样一批过去的经历用它来评估当前策略的好坏并据此更新策略使其在未来能获得更高的累积奖励。如何利用经验来更新策略就衍生出了各种各样的RL算法。有的算法直接建模并优化策略本身策略梯度方法有的算法先评估状态或动作的价值再根据价值来改进策略价值迭代方法还有的将两者结合Actor-Critic方法。这个“观察-决策-行动-学习”的循环会一直持续直到智能体的策略收敛性能不再显著提升或者达到了预设的训练步数。通过数百万甚至数十亿次这样的循环智能体从一张白纸逐渐进化成一个能在复杂环境中达成目标的专家。4. 核心概念深度解析价值、策略与模型在RL的术语体系中有三个概念如同三根支柱支撑起了整个理论大厦价值函数、策略和模型。深入理解它们你就能看懂大多数RL算法论文在讨论什么。4.1 价值函数评估“位置”的好坏价值函数回答的问题是“从当前状态或采取当前动作后出发我未来预期能获得多少总奖励” 它是一个长远眼光下的评估指标。状态价值函数 V(s)表示在状态s下遵循某个特定策略所能获得的期望累积回报。它衡量的是某个状态的“潜在价值”。比如在象棋里一个“车马炮俱全且阵型工整”的状态其V值通常比一个“丢车保帅”的状态要高。动作价值函数 Q(s, a)表示在状态s下执行动作a然后之后遵循某个特定策略所能获得的期望累积回报。它衡量的是在某个状态下执行某个特定动作的“好坏”。Q函数是许多经典算法如Q-Learning、DQN的核心。它们之间的关系由著名的贝尔曼方程描述。贝尔曼方程本质上是一个递归等式当前状态的价值等于立即获得的奖励加上下一个状态的折扣后价值。这个方程是RL中许多算法进行迭代更新的理论基础。因为它揭示了价值函数可以通过“自举”的方式利用自身的估计来更新自己。4.2 策略智能体的行为准则策略是智能体的决策函数它定义了在何种状态下应该采取何种动作。我们可以把策略分为两大类确定性策略a π(s)。给定一个状态直接输出一个确定的动作。这种方式简单直接但在需要探索的环境里可能不够灵活。随机性策略π(a|s)。给定一个状态输出的是一个动作的概率分布。比如在状态s下有70%的概率向左走30%的概率向右走。随机性策略天然地包含了探索行为在需要尝试不同动作的任务中非常有用。策略可以是简单的查找表也可以是复杂的深度神经网络。如今深度强化学习的成功很大程度上得益于使用深度神经网络来拟合非常复杂的策略函数和价值函数。4.3 模型智能体对世界的理解模型是智能体对环境动力学的内部表示。它试图预测两件事状态转移给定当前状态s和动作a下一个状态s会是什么即P(s|s, a)。奖励预测给定当前状态s和动作a能获得的即时奖励r是多少即R(s, a)。根据智能体是否拥有或学习环境模型RL算法可以分为两大类无模型方法智能体不尝试理解环境如何运作它直接通过试错来学习策略或价值函数。就像一个人学骑车他不需要知道空气动力学和肌肉控制原理只需要不断练习直到学会。DQN、Policy Gradient、A3C等都是无模型方法。它们更通用但通常样本效率较低需要大量交互数据。基于模型的方法智能体会先学习一个环境模型然后要么利用这个模型进行规划像下棋时在脑海里推演未来几步要么利用它来辅助策略学习。这就像学骑车前先研究了一下力学原理。基于模型的方法样本效率可能更高因为可以在“脑海”中模拟减少真实交互但面临模型误差累积的风险——如果模型学得不准确基于它的规划就会出错。在实际应用中无模型方法目前更为流行和成熟但基于模型的方法是一个非常有前景的研究方向特别是在真实物理世界交互成本高昂的场景下如机器人控制。5. 强化学习算法的家族图谱面对琳琅满目的RL算法初学者很容易感到困惑。其实我们可以根据两个关键维度对它们进行清晰的分类这能帮助你快速定位不同算法的特点和适用场景。维度一策略优化 vs. 价值迭代这个维度关注算法的更新目标是什么。基于价值的这类算法的核心是学习一个最优的价值函数通常是Q函数。一旦学到了准确的Q函数最优策略就显而易见了在每个状态选择那个能使Q值最大的动作。Q-Learning及其深度学习版本DQN是典型代表。它们的特点通常是更稳定但处理连续动作空间或随机策略比较困难。基于策略的这类算法直接参数化策略并通过梯度上升等方法直接优化策略参数以最大化期望回报。REINFORCE算法是最经典的策略梯度方法。它们天然适用于连续动作空间和随机策略但训练过程可能方差较大不够稳定。演员-评论家这是前两者的混合体。它同时学习一个策略演员和一个价值函数评论家。演员负责产生动作评论家负责评估演员在当前状态下的表现好坏并指导演员的更新。A3C/A2C, TRPO, PPO等都属于这个家族。AC框架结合了价值和策略方法的优点是目前解决复杂问题最主流的范式。维度二无模型 vs. 基于模型这个维度我们上一节已经讨论过关注算法是否学习环境模型。无模型绝大多数经典和流行的算法都属于此类如DQN, Policy Gradient, PPO等。它们与环境的交互是“黑盒”的。基于模型如Dyna,MBPO等。它们先学习模型然后利用模型。将这两个维度组合起来我们就可以把常见算法放到一个象限图里。例如DQN是无模型基于价值的PPO是无模型演员-评论家的。而像AlphaGo其核心的蒙特卡洛树搜索过程就是一个典型的基于模型规划的方法它使用了一个快速评估的策略和价值网络作为模型来进行推演。理解这个分类法当你在面对一个新问题时就可以先问自己我的动作空间是离散的还是连续的我是否需要随机策略我与环境交互的成本高吗回答这些问题就能帮你初步筛选出合适的算法类型。6. 实战第一步如何设计你的第一个RL实验理论说了这么多不动手永远学不会。设计第一个RL实验不需要一开始就挑战《星际争霸》或机器人行走。从简单的标准环境开始是关键。OpenAI Gym及其后继者Gymnasium是RL社区公认的“健身房”它提供了大量从简单到复杂的环境是入门实践的不二之选。6.1 环境选择与问题定义对于绝对新手我强烈推荐从CartPole车杆平衡环境开始。它的目标非常直观控制一个小车左右移动使得它顶部的杆子保持直立不倒。状态包括小车位置、速度、杆子角度和角速度动作是离散的向左推或向右推奖励规则很简单每坚持一个时间步就获得1的奖励杆子倒下或小车超出界限则回合结束。选择CartPole的理由有三第一状态和动作空间都很小你可以专注于理解算法逻辑而不是处理复杂的输入输出。第二问题足够简单一个正确的算法能在几分钟到几十分钟内训练出成功的策略你能快速获得正反馈。第三它是检验你的代码和理解是否正确的“试金石”。如果你实现的算法连CartPole都解决不了那肯定哪里出了问题。6.2 算法实现以DQN为例Deep Q-Network是深度强化学习的里程碑也是理解价值学习的最佳切入点。下面我们勾勒一下实现一个基础DQN来解决CartPole的关键步骤和代码逻辑。首先你需要一个神经网络来近似Q函数。输入是状态4维向量输出是对应两个动作的Q值2维向量。import torch import torch.nn as nn class QNetwork(nn.Module): def __init__(self, state_dim, action_dim): super().__init__() self.fc1 nn.Linear(state_dim, 128) self.fc2 nn.Linear(128, 128) self.fc3 nn.Linear(128, action_dim) def forward(self, state): x torch.relu(self.fc1(state)) x torch.relu(self.fc2(x)) return self.fc3(x) # 输出每个动作的Q值接下来是DQN智能体的核心逻辑主要包括经验回放和固定目标网络这两个关键技巧。class DQNAgent: def __init__(self, state_dim, action_dim): self.action_dim action_dim self.q_net QNetwork(state_dim, action_dim) # 在线网络 self.target_net QNetwork(state_dim, action_dim) # 目标网络 self.target_net.load_state_dict(self.q_net.state_dict()) # 初始同步 self.optimizer torch.optim.Adam(self.q_net.parameters(), lr1e-3) self.replay_buffer [] # 简易经验回放池 self.batch_size 64 self.gamma 0.99 # 折扣因子 self.epsilon 0.1 # 探索率 def select_action(self, state): # epsilon-greedy 策略 if random.random() self.epsilon: return random.randint(0, self.action_dim-1) # 探索 else: with torch.no_grad(): state_tensor torch.FloatTensor(state).unsqueeze(0) q_values self.q_net(state_tensor) return q_values.argmax().item() # 利用 def store_transition(self, state, action, reward, next_state, done): self.replay_buffer.append((state, action, reward, next_state, done)) # 简单限制回放池大小 if len(self.replay_buffer) 10000: self.replay_buffer.pop(0) def update(self): if len(self.replay_buffer) self.batch_size: return # 随机采样一批经验 batch random.sample(self.replay_buffer, self.batch_size) states, actions, rewards, next_states, dones zip(*batch) # 转换为张量 states torch.FloatTensor(states) actions torch.LongTensor(actions).unsqueeze(1) # 形状 [batch, 1] rewards torch.FloatTensor(rewards).unsqueeze(1) next_states torch.FloatTensor(next_states) dones torch.FloatTensor(dones).unsqueeze(1) # 计算当前Q值 (Q_net预测的对应所执行动作的Q值) current_q_values self.q_net(states).gather(1, actions) # shape: [batch, 1] # 计算目标Q值 (来自target_net) with torch.no_grad(): next_q_values self.target_net(next_states).max(1)[0].unsqueeze(1) # 最大Q值 target_q_values rewards self.gamma * next_q_values * (1 - dones) # 计算损失 (MSE) loss nn.MSELoss()(current_q_values, target_q_values) # 反向传播更新在线网络 self.optimizer.zero_grad() loss.backward() self.optimizer.step() def update_target_network(self): # 定期将在线网络的参数复制给目标网络 self.target_net.load_state_dict(self.q_net.state_dict())在主训练循环中你需要做的就是与环境交互收集经验并定期调用agent.update()。每隔一定步数比如每100步调用一次agent.update_target_network()。6.3 核心技巧与避坑指南即使在一个简单的环境里直接实现“教科书版”的Q-Learning也常常失败。DQN的成功依赖于几个关键技巧不理解它们你的训练很可能无法收敛经验回放这是打破数据相关性的利器。智能体连续经历的状态是高度相关的直接用它们做训练会导致网络震荡甚至发散。经验回放将历史经验存储起来每次随机抽样一批进行训练相当于让数据变得“独立同分布”大大提高了训练的稳定性。固定目标网络在计算目标Q值时我们使用了另一个独立的网络目标网络。这个网络的参数每隔一段时间才从在线网络同步一次。如果使用同一个不断变化的在线网络来计算目标值目标值就像是一个移动的靶子会导致训练极其不稳定。固定目标网络相当于在一段时间内提供了一个稳定的学习目标。ε-贪婪策略这是一个简单有效的探索策略。以概率ε随机选择动作探索以概率1-ε选择当前认为最好的动作利用。通常ε会随着训练从较高的值如1.0衰减到一个较小的值如0.01或0.1让智能体从广泛探索逐渐过渡到精细利用。实操心得在CartPole中一个常见的失败现象是智能体似乎很快“学会”了保持平衡但几十个回合后性能突然崩溃。这往往是过拟合或探索不足的迹象。智能体可能只是记住了一些特定的状态序列而没有学到通用的策略。解决方法是确保经验回放池足够大并且在整个训练过程中保持一个小的、固定的ε如0.01来进行持续探索。7. 超越CartPole经典挑战与进阶方向当你成功用DQN解决了CartPole后恭喜你你已经跨过了RL实践的第一道门槛。但这只是开始。OpenAI Gym里有一系列难度递增的环境可以帮你循序渐进地提升。MountainCar小车需要在一个山谷中左右摆动积累动量才能冲上右侧山顶。这个环境的挑战在于智能体在到达目标前几乎得不到任何正奖励稀疏奖励它必须学会“延迟满足”为了最终的巨大奖励而进行一系列看似无用的前期动作。这非常考验算法的探索能力和长期规划能力。LunarLander控制登月器平稳降落在两个旗帜之间的平地上。这个环境状态更复杂位置、速度、角度等动作是离散的点火器开关奖励函数结合了稀疏奖励成功着陆100和稠密奖励减少速度、靠近目标点等。这是一个从离散控制过渡到更复杂任务的好台阶。Atari游戏如Breakout,Pong,SpaceInvaders等。这是DQN当年一战成名的地方。这些环境的状态是图像像素210x160x3动作是游戏手柄按键。处理这类问题需要引入卷积神经网络来从图像中提取特征并且会面临部分可观测、奖励延迟等更真实的挑战。在尝试这些更复杂的环境时你会遇到新的挑战也需要掌握新的工具输入处理对于图像输入你需要使用CNN。一个常见的做法是将连续4帧图像堆叠在一起作为状态输入以提供时间维度上的运动信息。算法升级基础的DQN可能不够用了。你需要了解它的改进版如Double DQN解决Q值过估计问题、Dueling DQN将Q值分解为状态价值和动作优势学习更高效、Prioritized Experience Replay更重要的经验被采样概率更高等。通常我们会直接使用集成了这些改进的Rainbow DQN。连续控制当动作空间是连续的如机器人的关节扭矩基于价值的方法就不太方便了。这时你需要转向策略梯度方法如PPO或SAC。这些算法能直接输出连续动作空间中的概率分布如高斯分布然后从中采样动作。仿真到现实这是机器人领域的核心挑战。在仿真器中训练的策略直接部署到真实机器人上往往会失败因为仿真模型和真实物理世界存在“现实差距”。这催生了领域随机化、系统辨识、仿真到现实的迁移学习等一系列研究方向。从CartPole到Atari再到真实的机器人抓取每一步的跨越都意味着对算法、工程和问题理解深度的更高要求。但万变不离其宗你在这个“第一课”中建立起来的关于智能体、环境、奖励、价值、策略的认知框架将始终是你理解和运用新知识、解决新问题的基石。RL的学习之路是一场马拉松找准节奏从解决一个个具体的小问题开始积累代码和直觉你会发现自己能驾驭的领域越来越广阔。
返回列表