强化学习实战:价值函数、Q-learning与训练踩坑指南

发布时间:2026/10/21 21:25:15
强化学习实战:价值函数、Q-learning与训练踩坑指南 上篇我们把强化学习比作一个靠摸爬滚打自学成才的AI不喂标准答案只有摔跤之后的反馈。很多人看完都会问一个问题——道理听懂了可AI到底是怎么把那些乱七八糟的摔倒经验变成一套稳稳当当的行动策略的这篇下篇咱们不聊概念直接聊算法、聊代码、聊训练过程里那些坑。先说结论强化学习能“自学成才”的核心不在于它记住了多少次成功或失败而在于它学会了一套“对未来收益的判断”。这个判断机制是整套技术真正神仙的地方。下面我从价值函数讲起带你走一遍从算法原理到亲手训练一个小AI的全过程。1. 从试错到“涨记性”价值函数到底在估什么1.1 为什么AI需要“预期收益”这个概念强化学习和我们熟悉的监督学习有个特别大的区别监督学习每次做题都有标准答案错了马上知道错哪强化学习呢AI走一步棋要等几十步之后才知道这盘棋到底赢没赢。中间每一步是好是坏没有人告诉它。那怎么办AI必须学会一件事——给“当前状态”打一个分。这个分数不是“现在得到了多少奖励”而是“从这个状态出发未来总共还能赚到多少奖励”。这就是价值函数的本质。我用一个生活类比来帮你建立直觉。假设你正在一个游乐园里找出口手上没有地图。走到一个岔路口左边那条路走过去立刻能看到卖冰淇淋的摊位右边那条路走进去一片漆黑、看不到尽头。如果只看眼前你肯定选左边因为立刻就有正反馈。但假如有个人告诉你“右边那条路虽然黑但穿过去就是游乐园大门出去就能回家了。”你会不会重新考虑那个告诉你“右边有更大收益”的信息就是价值函数在干的事。AI不是贪婪地只看眼前这一步的奖励而是学会预测“这一步走下去未来到底划不划算”。这个对未来的预测能力才是强化学习区别于普通“撞运气瞎试”的关键。在数学上这个“未来总收益”被定义成从当前状态出发按照某个策略行动所能获得的累计折扣奖励的期望值。所谓折扣奖励就是下一时刻的奖励要打个折扣再算进当前价值里。为什么这么设计因为未来的事情不确定越远的事情越不可靠所以越晚的奖励在“当前状态价值”里的权重越低。1.2 折扣因子AI为什么也会“近视”和“远视”折扣因子是价值函数里最重要的一个参数一般记作γ。它的取值在0到1之间。举个具体数字假设下一步能拿到的奖励是1块钱那这1块钱折算进当前状态价值的时候乘以γ。如果γ是0.9那当前状态的价值就因此增加了0.9如果γ是0.5那只能增加0.5。你可以把折扣因子理解成AI的“远视度数”。γ越接近1AI越看得远愿意为很久以后的回报做铺垫γ越接近0AI越近视只管眼前三五步的收益。注意γ不能真的设成1除非任务有限定长度。因为如果未来奖励不打折扣价值函数会趋近无穷大算法就没法稳定收敛了。所以工程上γ基本都在0.9到0.99之间具体取多少要看任务的“决策视野”有多长。我做过一个模拟物流调度的小实验任务里每辆车的行驶路径很长前面几十步的决策都会影响最终的配送效率。一开始我把γ设成0.8结果AI训练完之后表现得特别短视——它总倾向于先把近处的单子抢完完全不考虑后面的路径优化整体效率反而很差。后来我把γ调到0.98AI开始愿意“绕路”去先取远单因为模型学会了判断这条路虽然眼前亏一点但后续的路线价值高很多。这就是折扣因子对行为风格的直接影响不是玄学是数学。明白了价值函数和折扣因子的作用下面的问题就很自然了算法到底拿什么去学这个价值函数这就引出了强化学习家族的两大主流门派。2. 算法家族的两条主线先学会打分还是先学会动手2.1 Q-learning和DQN先学会判断价值最早一批被广泛应用的强化学习算法走的是“先学会打分”的路子。它的思路特别直白既然我不知道当前状态好不好那我就学一个函数输入状态s输出每个动作a的“价值分”这个分值叫做Q值。学完之后怎么作决策简单哪个动作的Q值最高就选哪个。这个学派里的代表作就是Q-learning以及它的深度学习进阶版DQN。Q-learning的更新公式是整个领域的基石我手写出来大家感受一下它的直观性Q_new(s, a) Q_old(s, a) α × [r γ × max(Q(s, a)) − Q_old(s, a)]这个公式读起来就是新的估计值等于旧的估计值加上一个学习率α乘以“真实奖励加未来最佳价值减去旧的估计值”这个误差。说白了就是每走一步就把“原来以为的价值”往“实际得到的奖励加下一步的最佳价值”方向拉一把。走得多了Q值就会越来越接近真实的“状态-动作价值”。Q-learning有一个很关键的特点它是离策略的。意思是AI学习的时候用的数据不完全来自它当前正要执行的动作。换句话说它可以看着自己“乱逛”的记录来学习“正经走路”的价值。这个特性给了Q-learning极大的灵活性。DQN做的事情是在Q-learning基础上把那个Q函数从一张表换成了一个神经网络。为什么要换因为真实问题的状态空间太大了。一个棋盘游戏的状态数是天文数字你不可能为每一种局面建一张对应的表。神经网络的价值在于它能把相近的输入映射到相近的输出天然的“举一反三”。这里有个容易踩的坑DQN如果直接用连续几步的数据训练神经网络模型会很快崩溃。因为相邻几步的数据高度相关网络会不断朝同一个小方向更新导致震荡。业界标准解法是加一个“经验回放池”把AI走过的每一步都存进一个缓冲区训练的时候随机抽一小批出来用把数据之间的相关性打散。这是DQN工程化落地里最重要的一步但很多新手会忽略它。2.2 策略梯度直接练“肌肉”另一条路线更直接——不学价值函数直接学“策略本身”。什么叫策略就是给定状态直接输出每个动作的概率分布。这条路线叫策略梯度方法。你可以这样理解两条路线的区别。Q-learning像是一个棋手先学“判断棋局优劣”然后再根据棋局优劣走棋策略梯度则像是棋手直接练“肌肉记忆”每一步棋都直接练练多了自然知道怎么走。策略梯度方法的优势在于它能处理连续动作空间。举个例子控制一台机械臂的关节角度输出的是一个连续数值不可能枚举出“每个动作”的Q值。这种时候策略网络直接输出一个动作向量天然适合这类场景。但纯粹的策略梯度有个痛点——方差太大。想象一下你让AI跑完一整局棋总共拿到了1的奖励。你回头再看这局棋里的每一步是不是每一步都对最终的胜利有贡献不一定。但简化版的策略梯度会把这局的结果平均分配回每一步导致某些明明走得很臭的棋也被强化了。这就是高方差问题的来源。后来业界的主流方案是Actor-Critic架构把两条路线缝合起来。2.3 Actor-Critic边打拳边照镜子Actor-Critic从名字就能看出它的结构Actor负责出招也就是输出动作Critic负责评价也就是估计当前状态的价值。每次AI走一步Critic给一个实时反馈——“这步走得在平均水平之上还是之下”Actor就用这个信号来调整自己的出招概率。这个思路解决了前面说的方差问题。Critic的价值估计相当于给每一招提供了“该局即时评分”而不是等整局结束再统一算账。于是Actor每一步都能得到反馈训练信号密集得多收敛速度快得多。目前工业界和学术界用得最多的PPO算法就属于Actor-Critic家族。它额外做了一件事限制Actor每次更新的幅度。如果Actor一次更新太猛策略发生剧烈变化下一步训练集里的数据就全部失效了模型很容易崩溃。PPO用一个“截断比例”把每次更新的步长限制在可控范围内相当于告诉AI“你可以进步但一次只能进步一点点。”这个设计让PPO在大量实际任务里都表现得非常稳定也是它成为当前默认选择的第一梯队方法的原因。到这里算法家族的脉络已经清晰了。但光讲理论不够下面我带你亲手写一个最小可运行的强化学习Demo看看Q-learning是怎么在代码里一步步“自学成才”的。3. 亲手训练一个会走格子的AIQ-learning实战3.1 任务设计与奖励设定我选一个特别经典的教学场景一个4×4的网格世界。网格左下角是起点右上角是终点中间有一个格子是陷阱。AI每次可以往上、下、左、右走一格走到终点得10分掉进陷阱扣5分并终止其余每一步扣0.1分——这个轻微惩罚是为了让AI学会“抄近路”而不是在地图里瞎转悠。这个任务虽然小但强化学习的几个关键要素全都齐了状态空间、动作空间、终止条件、稀疏奖励、延迟奖励。20行代码就能写完非常适合第一次动手验证原理。3.2 核心代码与关键参数下面是完整的训练脚本我加了注释方便对照原理。import numpy as np # 网格世界定义4x4状态编号0~15 # 起点0(左下)终点15(右上)陷阱5地图中间 WORLD_SIZE 4 ACTIONS [(-1, 0), (1, 0), (0, -1), (0, 1)] # 上、下、左、右 GAMMA 0.9 # 折扣因子AI的“远视程度” ALPHA 0.5 # 学习率每次更新往目标方向迈多大步 EPSILON 0.9 # 初始探索率一开始90%概率随机乱走 MIN_EPSILON 0.01 # 最小探索率 EPSILON_DECAY 0.995 # 探索率衰减系数 EPISODES 2000 # 初始化Q表16个状态 x 4个动作 Q np.zeros((WORLD_SIZE * WORLD_SIZE, len(ACTIONS))) def step(state, action): 执行一步返回新状态、奖励、是否结束 i, j state // WORLD_SIZE, state % WORLD_SIZE di, dj ACTIONS[action] ni, nj i di, j dj # 撞墙不能移动 if ni 0 or ni WORLD_SIZE or nj 0 or nj WORLD_SIZE: ni, nj i, j new_state ni * WORLD_SIZE nj # 奖励设定 if ni 3 and nj 3: return new_state, 10.0, True if ni 1 and nj 1: return new_state, -5.0, True return new_state, -0.1, False # 训练主循环 for ep in range(EPISODES): state 0 done False while not done: # epsilon-greedy策略探索与利用的平衡 if np.random.rand() EPSILON: action np.random.randint(len(ACTIONS)) else: action np.argmax(Q[state]) new_state, reward, done step(state, action) # Q-learning核心更新公式 best_next np.max(Q[new_state]) Q[state, action] ALPHA * (reward GAMMA * best_next - Q[state, action]) state new_state # 随着训练推进逐渐减少随机探索 EPSILON max(MIN_EPSILON, EPSILON * EPSILON_DECAY) # 训练结束打印学到的策略 print(学到的策略0-15格子应该走的方向) directions [↑, ↓, ←, →] for i in range(WORLD_SIZE): row for j in range(WORLD_SIZE): state i * WORLD_SIZE j if state 15: row 终点 elif state 5: row 陷阱 else: best_action np.argmax(Q[state]) row directions[best_action] print(row)这个代码短但里面藏着两个特别重要的工程细节。第一个是探索率衰减。如果AI一直都在乱走它永远不会利用已经学到的经验如果它一上来就完全按Q值选动作它又会错过那些“看起来不怎么样但其实收益更高”的路径。所以一开始EPSILON设得很高让AI充分探索地图随着训练推进AI慢慢减少乱走开始正儿八经地利用经验。这个“先探索后利用”的节奏是整个训练能否收敛的关键。第二个是Q-learning更新使用了一步之后的Q值。注意AI当前这一步可能是随机走出来的更新时却用了“下一步的最佳Q值”这种离策略特性意味着AI即使在做随机动作也能学到“如果认真走应该怎么走”的价值判断。很多新手上手写代码会不小心把这种更新方式改成“下一动作也按随机策略来”那样就变样了学出来的策略会偏差很多。3.3 训练过程会观察到什么跑一遍这段代码你能亲眼看到几个特别有意思的现象。前几百个episode里AI完全像个没头的苍蝇很多次都在陷阱里结束Q表里的值全是负的。大概到第400个episode左右AI开始偶尔摸到终点Q表里终点附近的格子先出现了正数。从第800个episode开始AI已经能在大部分回合里找到终点。但如果你打印出Q表会发现不只是终点路径周围有高值有些岔路口的值也是正的。这是因为AI在学习“哪条路能通向终点”而不是简单记住“该往哪走”。最终训练结束后沿着最大Q值走就能得到一条从左下到右上的最短路径。我自己第一次跑通这个Demo的时候有个特别深的感触你不需要写任何“规则”告诉AI终点在哪、陷阱在哪。它就靠一次次试错在几千步内自己把地图环境摸清了。这段代码只有几十行却是整个强化学习大厦的一个微观缩影。4. 奖励设计AI会不会钻空子全看这一步4.1 奖励稀疏黑洞问题很多入门者把强化学习理解成“只要有奖励函数AI就能学会任何任务”。这个理解对了一半。奖励函数确实是整个系统的指挥棒但真正难的是如何把奖励设计得恰到好处。最常见的问题是奖励稀疏。在一个特别大的地图里如果只有最终终点才给奖励AI可能需要随机乱走几万步才能碰巧撞到一次终点。这个过程中Q值几乎没有有效更新信号模型很难学起来。这种情况有个形象的叫法强化学习的“黑洞问题”——奖励信号太稀疏梯度完全传不回来。解决奖励稀疏问题的主流思路之一是奖励塑形。就是在通往终点的路上给一些额外的中间奖励引导AI往正确的大方向走。比如前面的网格例子我加了每一步扣0.1分。这个设计本质上是在告诉AI“少走冤枉路。”有了这个轻微惩罚AI才会主动追求最短路径而不是满足于“反正能到终点就行”。4.2 奖励塑形要小心“钻空子”奖励塑形听着简单做起来全是坑。我曾经做一个模拟机器人抓取物体的项目为了让机械臂更高效我给每个接近目标的动作都加了一点正向奖励。结果训练完的AI学会了一招非常“猥琐”的策略——它把手停在目标上方一直来回小幅抖动因为这样能反复触发“接近目标”的正奖励而真正的抓取动作反而迟迟不做。这种“奖励黑客”现象本质上是因为AI发现了一条不按设计者预期走、但奖励更高的路径。它没有违背数学上的目标函数——目标函数就是“最大化奖励”——它只是找到了一个设计者没想到的漏洞。做强化学习的人基本都会经历这个阶段你以为你在教AI做事AI却教会了你什么叫做“规则漏洞”。一个比较有效的做法是把奖励细分到“任务的最终目标”上把中间过程的引导信号设置成相对其真的很小的值并且避免给“重复性动作”定义正向奖励。比如机械臂任务最终“抓起并放稳”给一个大奖励中间“接近目标”只给很小的奖励同时对“长时间悬停不动”做轻微的负向惩罚。这样AI的收益重心仍然在最终目标上钻空子的收益就没那么大了。4.3 非平稳环境与随机性还有一个容易忽略的点是环境本身的动态性。如果任务的规则会随时间变化——比如交通信号灯的配时每天都不同——AI前面学到的策略可能第二天就失效了。这在强化学习里叫非平稳环境问题。处理这个问题没有银弹工程上常用的手段是“持续在线更新”。也就是不让训练完全停止让AI在部署之后保持一个小幅度的学习率继续更新追踪环境变化。同时要注意如果环境里本身有大量随机性比如游戏里有概率掉落不同道具那么训练曲线的震荡是正常的。别看到曲线忽上忽下就急着调整参数先看它整体趋势是在上升还是原地不动。5. 训练翻车实录常见问题与排查经验5.1 训练不收敛怎么办这是被问得最多的问题。训练不收敛的表现是损失值震荡得非常厉害或者学了半天策略始终没提升。我的排查顺序是固定的依次走一遍基本能定位问题所在。第一先看探索率。如果探索率降得太快AI很快就进入“纯利用”状态永远没机会发现更好的路径。我见过不少案例是epsilon衰减系数设成了0.99导致几千个回合后探索率就趋近于0AI学了一半就固化住了。调这个参数的直觉是训练回合数越多探索率应该降得越慢任务越复杂探索期应该拉得越长。第二查奖励尺度。如果奖励值有正有负且绝对值差距特别大比如正奖励是100负奖励是-0.1那模型的大部分精力都花在追逐极端值上了Q值的估计会非常不稳。实际操作中我习惯把所有奖励归一化到一个可控区间比如[-1, 1]这样模型收敛速度会显著提升。第三检查状态表征。状态怎么喂给神经网络直接决定模型能不能学到有用的特征。如果两个本来应该非常相似的状态在输入空间里完全不挨边那模型的学习效率会很低。这个靠经验比较多但有个通用思路状态表征要尽量保留“对决策有影响的差异”忽略“对决策没影响的差异”。比如控制机械臂关节角度比末端坐标通常更能反映状态的物理意义。5.2 探索和利用怎么平衡这个平衡是所有强化学习算法的命门。探索太多AI一直在犯傻探索太少AI容易钻入局部最优出不来。我常用一个经验法则选动作的时候用epsilon-greedy策略但探索率和训练进度挂钩。比如前20%的训练回合保持探索率在0.3以上中间60%慢慢降到0.05最后20%基本按最优动作来。这个“退火曲线”不一定是线性的你可以根据实际训练曲线自己调。我见过一个高质量的做法是用“噪声注入”。就是在连续动作控制中给最终输出的动作加一个逐渐衰减的高斯噪声让AI在早期探索得更大胆后期越来越精准。这跟epsilon-greedy思路一致但对连续控制任务更自然不会因为随机选一个离群的离散动作而令系统剧烈抖动。5.3 一次失败的教训分享一个让我印象特别深刻的失败案例。当时我想用强化学习训练一个自动推荐策略的模型AI决定每次给用户推送哪些内容。我用真实的点击数据作为奖励信号初始版本很快就“学会了”策略——点击率确实上去了但后来一查日志才发现AI学到的其实是“追逐热点内容”而不是理解用户偏好。它把推荐流量全部导给少数高热内容用户的短期点击率是高了但留存率反而掉了。这个教训让我彻底明白了奖励函数定义错了AI会把你的指标优化得“看起来很漂亮”但实际业务目标完全没有达成。从那以后我再设计奖励函数一定会先写清楚“真正的业务成功指标是什么”再回头看当前这个奖励函数能不能引导AI走向那个指标。如果两者不一致再怎么调超参都是白费功夫。后来我把奖励改成“点击行为发生后用户接下来一个星期内是否还活跃”整个推荐策略就变得完全不一样了——AI开始学着推荐那些短期不那么抓眼球、但用户真正需要的内容。说到底强化学习本身不会造假造假的是你给AI设定的目标函数。我自己的体会是强化学习的门槛不在理论而在“你怎么定义问题”。模型结构可以抄代码可以拿来改但奖励设计和环境定义是一个项目里真正没法抄的部分也是最考验功力的地方。每次项目翻车十有八九不是算法不够先进而是我在任务建模阶段埋下的问题训练了几天之后才暴露出来。另外一个长期有用的技巧是永远准备一个“最小可行任务”做打磨。在正式训练大型模型前先在一个极简版本上验证你的奖励函数和任务设计是否符合直觉。我在网格世界Demo上只需要几分钟就能跑通一次实验但在实际大项目上一次完整训练经常要跑几天。在简易环境里把基本功打磨好了再上真实环境省下的时间是以天为单位的。强化学习这套“摸爬滚打”的机制说到底并没有那么玄乎——给AI一个目标让它自己试错给它足够的耐心它就能在试错中找到一条通往目标的路。难的从来不是让AI学会而是想清楚到底该让它学会什么。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询