首页 / 资讯中心 / 文章详情

强化学习入门:智能体、环境、状态、动作与奖励核心概念详解

强化学习入门:智能体、环境、状态、动作与奖励核心概念详解 ★ FEATURED ARTICLE
1. 从“打游戏”说起强化学习到底在解决什么问题如果你之前接触过机器学习大概率是从监督学习入的门——给一堆带标签的数据让模型学会从输入映射到输出。但强化学习完全是另一套逻辑没有标准答案只有一个环境和一个奖励信号智能体得靠自己不断试错从“做对了给颗糖、做错了挨顿打”的过程中慢慢摸索出最优策略。这套思路最早可以追溯到行为心理学里的操作性条件反射后来被引入控制论和计算机科学逐渐演变成今天大家看到的强化学习框架。我刚开始学的时候最大的困惑是这玩意儿跟监督学习到底差在哪后来想明白一个关键点——监督学习是“有人告诉你正确答案”强化学习是“没人告诉你正确答案但你可以试试完环境会给你一个分数”。这个分数往往还是延迟的比如下棋你走了二十步之后才知道这盘棋赢了还是输了中间每一步到底哪步好哪步坏环境不会直接告诉你。这就是强化学习最核心的难点也是它最迷人的地方。这篇文章我打算把强化学习的基本要素从头到尾捋一遍包括智能体、环境、状态、动作、奖励、策略、价值函数、模型这几个核心概念以及它们之间怎么互动。适合刚入门强化学习、被各种术语绕晕的朋友也适合已经看过一些教程但总觉得概念之间串不起来的人。我会尽量用生活化的例子来解释少堆公式多讲直觉。2. 核心要素拆解强化学习这台机器由哪些零件组成2.1 智能体与环境一场永不停歇的对话强化学习系统里最基础的一对概念就是智能体Agent和环境Environment。你可以把智能体想象成一个在玩游戏的玩家环境就是游戏本身。玩家看到屏幕上的画面状态按下一个按钮动作游戏画面发生变化新状态同时得分增加或减少奖励。这个过程不断循环就是强化学习的基本交互模式。我习惯用一个更接地气的类比教一只小狗学握手。小狗是智能体你是环境。小狗一开始不知道你在说什么它可能随便抬个爪子、转个圈、叫一声。某一次它碰巧抬起了前爪你立刻给它一块零食——这就是奖励。小狗慢慢就学会了抬起前爪这个动作能带来零食其他动作不能。于是它就会越来越多地做这个动作。整个过程里你没有写任何“if 抬爪 then 给零食”的代码小狗是通过试错自己发现的。这个类比里有一个很重要的细节奖励必须是环境给的不能是智能体自己编的。如果小狗自己想象“我抬爪了主人应该给我零食”然后自己把自己喂饱了那它永远学不会真正的握手。在强化学习里也是一样奖励信号必须来自环境智能体只能观察和利用不能篡改。2.2 状态与观测智能体眼里的世界长什么样状态State是描述环境当前情况的一组信息。比如下棋时棋盘上所有棋子的位置就是一个完整状态。但现实中智能体往往看不到完整状态只能看到一部分这叫观测Observation。比如打扑克你只能看到自己的手牌和已经打出的牌看不到别人的手牌这就是部分可观测。这里有一个容易混淆的点状态和观测在很多入门教程里被混着用但在严格定义下它们是不一样的。状态是环境的真实全貌观测是智能体实际感知到的信息。如果智能体只能看到观测那它就需要通过历史观测来推断当前状态这就引出了**部分可观测马尔可夫决策过程POMDP**这个概念。不过对于初学者来说先不用纠结这个区分大部分入门例子都是完全可观测的状态等于观测。我在实际写代码的时候踩过一个坑一开始我把状态设计得太简单只给了智能体当前位置没给速度信息。结果智能体学了半天学不会平衡杆因为它不知道自己是往左倒还是往右倒。后来把速度加进状态里立刻就学好了。所以状态设计这件事信息给少了学不会给多了学得慢需要根据具体任务来权衡。2.3 动作空间智能体能做哪些事动作空间Action Space就是智能体所有可选动作的集合。它分为两类离散动作空间和连续动作空间。离散的就是像“上下左右”这种有限个选项连续的就是像“方向盘转多少度”这种可以取任意实数值的。动作空间的设计直接决定了问题的难度。离散动作空间通常用各种Q-learning类算法就能搞定连续动作空间就得上策略梯度或者Actor-Critic这类方法。我个人的经验是如果能用离散动作空间解决问题就尽量不要用连续的因为连续空间的探索效率低很多训练时间往往要长好几倍。还有一个容易被忽略的点动作空间里是否包含“什么都不做”这个选项。有些任务里不动也是一个合法动作有些任务里则必须动。这个细节会影响智能体的学习曲线设计的时候要想清楚。2.4 奖励强化学习里最需要精心设计的部分**奖励Reward**是环境在智能体每执行一个动作后给出的一个标量信号用来告诉智能体这个动作好不好。奖励设计是强化学习里最像“艺术”的部分因为奖励给得不好智能体就会学出各种奇葩行为。我见过一个经典案例有人训练智能体玩赛车游戏奖励是“沿赛道前进的距离”。结果智能体发现在原地转圈也能不断累积前进距离因为转圈的时候有时候会往前蹭一点。最后它学会了原地打转根本不好好开车。这就是典型的**奖励黑客Reward Hacking**问题。奖励设计有几个原则我总结下来比较实用稀疏奖励只在任务完成时给奖励学得慢但不容易学歪稠密奖励每步都给奖励学得快但容易学出奇怪行为奖励缩放很重要奖励值太大或太小都会影响训练稳定性惩罚要慎用过多的负奖励会让智能体变得过于保守提示奖励设计没有万能公式最好的办法是先设计一版跑起来看看智能体学出了什么行为再根据实际表现调整。这个过程往往要迭代好几轮。2.5 策略智能体的行为准则策略Policy是智能体根据当前状态决定下一步动作的规则。它分为两种确定性策略和随机性策略。确定性策略就是“看到状态s就执行动作a”随机性策略是“看到状态s以概率p执行动作a以概率1-p执行动作b”。为什么需要随机性策略因为探索。如果智能体永远只执行当前认为最好的动作它可能永远发现不了更好的动作。就像你每天上班都走同一条路虽然这条路目前最快但你可能永远不知道另一条路其实更近。随机性策略让智能体有机会尝试不同的动作从而发现更优解。策略的表示方式也有两种表格型和函数近似型。表格型就是用一个表格存每个状态下每个动作的价值状态多了表格就爆炸了。函数近似型就是用神经网络之类的模型来拟合策略可以处理连续状态和大规模问题。现在主流的深度强化学习用的都是函数近似。2.6 价值函数评估“待在某个状态有多好”价值函数Value Function是强化学习里另一个核心概念。它评估的是“从某个状态出发按照某个策略走下去未来能拿到多少累计奖励”。注意这里说的是累计奖励不是即时奖励。有时候一个动作即时奖励很低但它能带你进入一个未来奖励很高的状态那这个动作的价值就很高。价值函数分为两种状态价值函数V(s)和动作价值函数Q(s,a)。V(s)衡量的是“待在状态s有多好”Q(s,a)衡量的是“在状态s执行动作a有多好”。两者之间的关系是V(s)等于在状态s下按照策略选择各个动作的Q值加权平均。我学的时候一直搞不清V和Q的区别后来用一个类比就明白了V(s)是“你站在某个路口按照你平时的走法最终能到家吃到饭的概率”Q(s,a)是“你站在某个路口如果这次选择往左拐最终能到家吃到饭的概率”。V是对所有可能动作的期望Q是具体到某个动作的评估。2.7 模型智能体对环境的“内心模拟”模型Model在强化学习里指的是智能体对环境动态的预测能力。如果智能体知道“在状态s执行动作a会转移到状态s并且得到奖励r”那它就拥有了一个环境模型。有模型的强化学习叫基于模型的强化学习Model-Based RL没有模型的叫无模型的强化学习Model-Free RL。基于模型的方法样本效率更高因为智能体可以在“脑子里”模拟各种情况不需要真的在环境里试。但缺点是模型本身可能不准模型错了策略就跟着错。无模型的方法更简单直接但需要大量真实交互数据。现在深度强化学习里无模型的方法还是主流因为神经网络模型很难做到足够准确。3. 要素之间的互动关系它们是怎么串起来的3.1 马尔可夫决策过程强化学习的数学骨架把上面这些要素串起来就得到了强化学习的标准数学框架——马尔可夫决策过程MDP。一个MDP由五元组(S, A, P, R, γ)定义S是状态集合A是动作集合P是状态转移概率R是奖励函数γ是折扣因子。折扣因子γ是一个0到1之间的数用来衡量未来奖励的重要性。γ越接近1智能体越有远见γ越接近0智能体越短视。我一般从0.99开始调如果任务步数很多就调到0.999如果任务很短就调到0.9左右。马尔可夫性说的是下一个状态只取决于当前状态和当前动作跟更早的历史无关。这个假设在现实中往往不成立但它是很多算法能推导出漂亮公式的前提。如果实际任务不满足马尔可夫性就需要通过堆叠历史观测来构造近似状态。3.2 探索与利用强化学习里永恒的权衡**探索Exploration和利用Exploitation**是强化学习里最核心的权衡。利用就是选当前认为最好的动作探索就是尝试一些不那么确定的动作。只利用不探索可能永远困在局部最优只探索不利用学了半天等于没学。常见的探索策略有ε-贪婪以ε的概率随机选动作以1-ε的概率选当前最优动作玻尔兹曼探索根据Q值的大小按概率选动作Q值高的被选概率大上置信界UCB给不确定性高的动作额外加分鼓励探索我个人的经验是ε-贪婪最简单也最常用但ε的衰减策略很关键。一开始ε设大一点比如1.0让智能体充分探索然后慢慢衰减到0.1或0.01让它逐渐转向利用。衰减太快学不好衰减太慢收敛慢。3.3 回报与折扣怎么衡量“长远的好处”**回报Return**是从当前时刻开始未来所有奖励的累计和。但直接累加会有问题如果任务永远不结束回报就是无穷大。所以引入折扣因子γ让远处的奖励打折扣。折扣回报的公式是G_t R_{t1} γR_{t2} γ²R_{t3} ...。这个公式的直觉是今天的100块比明天的100块值钱。γ就是“耐心系数”γ0表示只看眼前γ1表示一视同仁。实际调参的时候γ的选择跟任务的步数有关如果平均100步完成一局γ0.99意味着100步后的奖励衰减到约0.37还算合理如果平均1000步完成一局γ0.99就衰减得太厉害了得用0.999。3.4 贝尔曼方程价值函数的递归之美贝尔曼方程是强化学习里最重要的数学工具之一。它的核心思想是递归当前状态的价值等于即时奖励加上折扣后的下一状态价值。写成公式就是V(s) E[R γV(s)]。这个方程的美妙之处在于它把一个“无限步的未来”问题转化成了一个“一步加递归”的问题。你不需要真的把未来所有步都展开只需要知道下一步的价值就能推出当前的价值。所有动态规划类的强化学习算法本质上都是在迭代这个贝尔曼方程。我第一次看懂贝尔曼方程的时候有一种“原来如此”的感觉。它就像算斐波那契数列F(n) F(n-1) F(n-2)你不需要从第一项开始加只需要知道前两项就能推出当前项。贝尔曼方程也是类似的递归结构。4. 实操入门用代码把基本要素跑起来4.1 环境选择从GridWorld开始理论说再多不如跑一遍代码。我建议新手从最简单的GridWorld开始就是一个网格世界智能体从起点走到终点每走一步扣一点分走到终点给正奖励。这个环境足够简单所有状态和动作都能枚举方便理解每个概念。用Python写一个最简GridWorld大概长这样import numpy as np class GridWorld: def __init__(self, size5): self.size size self.state (0, 0) self.goal (size-1, size-1) self.actions [(-1,0), (1,0), (0,-1), (0,1)] # 上下左右 def reset(self): self.state (0, 0) return self.state def step(self, action): next_state (self.state[0] action[0], self.state[1] action[1]) # 边界检查 if 0 next_state[0] self.size and 0 next_state[1] self.size: self.state next_state if self.state self.goal: return self.state, 1.0, True return self.state, -0.01, False这个环境里状态就是坐标动作就是四个方向奖励是每步-0.01、到终点1.0。你可以用Q-learning算法来训练核心更新公式是Q(s,a) α[r γmaxQ(s,a) - Q(s,a)]。4.2 Q-learning实现把价值函数用表格存起来Q-learning是最经典的无模型强化学习算法适合状态和动作都是离散且数量不多的情况。核心思路是用一个表格存Q值每次交互后更新表格。import random def q_learning(env, episodes1000, alpha0.1, gamma0.99, epsilon0.1): Q {} for i in range(env.size): for j in range(env.size): for a in range(4): Q[((i,j), a)] 0.0 for ep in range(episodes): state env.reset() done False while not done: if random.random() epsilon: action random.randint(0, 3) else: q_values [Q[(state, a)] for a in range(4)] action q_values.index(max(q_values)) next_state, reward, done env.step(env.actions[action]) best_next max([Q[(next_state, a)] for a in range(4)]) Q[(state, action)] alpha * (reward gamma * best_next - Q[(state, action)]) state next_state return Q跑完1000轮之后你可以把每个状态下Q值最大的动作打印出来看看智能体学到的策略是不是一条从起点到终点的路径。我第一次跑通的时候看到智能体真的学会了走最短路那种感觉比看十篇论文都管用。4.3 参数调优几个关键参数怎么设上面代码里有几个关键参数我来说说怎么调参数含义建议范围调参心得α学习率0.01~0.5太大震荡太小收敛慢γ折扣因子0.9~0.999步数多就调大ε探索率1.0衰减到0.01前期多探索后期多利用episodes训练轮数500~10000看任务复杂度我踩过的坑是一开始α设了0.9结果Q值疯狂震荡怎么都收敛不了。后来降到0.1就稳了。学习率这个东西宁可小一点多跑几轮也不要大一点跑飞了。4.4 从表格到神经网络为什么要升级表格型Q-learning有个致命问题状态一多表格就爆炸。比如状态是连续值那表格根本没法存。这时候就需要用神经网络来近似Q函数这就是**DQNDeep Q-Network**的思路。DQN的核心改动是用一个神经网络输入状态、输出每个动作的Q值然后用梯度下降来更新网络参数。但直接这么搞会不稳定所以DQN引入了两个关键技巧经验回放和目标网络。经验回放是把交互数据存起来随机采样打破数据之间的相关性目标网络是用一个更新慢的网络来计算目标Q值避免目标一直在变。这两个技巧背后的直觉是神经网络喜欢独立同分布的数据但强化学习的数据是高度相关的。你连续走十步这十步的数据肯定相关直接拿来训练网络会学歪。经验回放就是把这些数据打散让网络看到更多样的样本。5. 常见问题与排查技巧实录5.1 智能体学不会怎么办这是新手最常遇到的问题。我总结了一个排查清单按顺序检查奖励设计是否有问题智能体有没有可能通过某种奇怪行为刷分如果有先修奖励。状态信息是否足够智能体能不能从状态里推断出做决策所需的信息不够就加特征。探索是否充分ε是不是太小了试试把ε调大或者用更激进的探索策略。学习率是否合适太大震荡太小不收敛试试调小一个数量级。训练轮数是否够有些任务需要几万轮才能学会别跑了一千轮就放弃。我遇到过一个案例智能体在某个任务上怎么都学不会后来发现是状态里少了一个关键特征。加上之后同样的算法和参数几百轮就学会了。所以状态设计往往比算法选择更重要。5.2 奖励曲线震荡严重怎么调奖励曲线震荡通常有几个原因学习率太大、批量太小、奖励尺度不一致、环境随机性太强。我的处理顺序是先把学习率降一半看看如果还震荡就增大批量再不行就检查奖励是不是有异常大的值。还有一个容易被忽略的点奖励的尺度。如果有的奖励是1有的是1000那网络会被大奖励主导小奖励的信号就被淹没了。我一般会把奖励归一化到[-1, 1]或者[0, 1]之间这样训练稳定很多。5.3 训练速度太慢怎么加速强化学习训练慢是常态但有些加速技巧可以用并行环境同时跑多个环境实例把数据收集并行化优先经验回放优先采样那些TD误差大的样本提高数据效率混合精度训练用float16代替float32GPU上能快不少减小网络规模不是越大越好小网络有时候学得更快我实测下来并行环境是最有效的加速手段。开8个环境并行收集数据训练速度差不多能快5到6倍。当然前提是你的机器扛得住。5.4 常见问题速查表问题现象可能原因排查方向奖励不上升奖励设计、探索不足检查奖励函数、调大ε奖励震荡学习率大、批量小降学习率、增大批量学出奇怪行为奖励黑客重新设计奖励收敛后突然崩溃灾难性遗忘用经验回放、调小学习率训练极慢环境交互瓶颈并行环境、优化环境代码注意强化学习的调试跟监督学习很不一样监督学习看loss曲线基本能判断问题强化学习得看奖励曲线加实际行为。有时候奖励在涨但行为很蠢有时候奖励不涨但行为其实在变好。多看智能体实际在做什么比只看数字有用得多。6. 我个人的一些经验和建议学强化学习这段时间我最大的体会是概念要一个一个抠清楚但不要一开始就陷进数学细节里。我见过不少人一上来就啃Sutton的书被各种公式劝退。其实更好的路径是先跑通一个最简单的例子比如GridWorld或者CartPole看着智能体从随机乱走到学会完成任务然后再回头去看理论这时候理解会深很多。另一个建议是自己动手实现一遍核心算法。看别人的代码觉得都懂自己写的时候才发现到处都是坑。比如Q-learning的更新公式看的时候觉得很简单写的时候才发现状态转移、终止状态处理、Q值初始化这些细节都得想清楚。自己踩过一遍坑印象才深刻。最后说一个我觉得很重要的心态强化学习的效果有很大的随机性。同样的代码换个随机种子结果可能差很多。所以不要因为一次跑崩了就怀疑自己多跑几次取平均看趋势。这个领域就是这样耐心比聪明更重要。
阅读完成 · 觉得有帮助?
咨询建站