☰
强化学习方法全景图:从分类选型到训练排查
2026/11/4 20:52:37 网站建设 项目流程

强化学习这块内容我断断续续啃了将近两年,真正开窍是在脑子里把“方法概览”这张地图画清楚之后。之前的状态很典型:Q-learning、策略梯度、Actor-Critic 这些名词全都听过,真到动手就不知道从哪儿选起,调参数基本靠运气,训练曲线一崩就彻底懵。这一讲的原始材料来自某位长期做控制理论教学的教授在公开课上的系列讲授,第四讲没有急着堆算法,而是先把整个方法体系按两个维度切了一遍——有没有环境模型、学的是值函数还是策略。这篇笔记就是顺着这条线把内容重新捋了一遍,同时补上了我自己在代码里踩过的坑,以及实测下来比较稳的做法。读完它你应该能拿到三个东西:看到一个任务能大致判断它落在哪一类,能给自己排一条最小可行的算法路线,知道训练不收敛的时候按什么顺序排查。适合刚过完监督学习想往这边走的同学,也适合已经刷过几篇论文但脑子里还是散装知识的从业者,尤其是做控制、机器人、调度优化这几个方向、手里有仿真环境却没想好怎么下手的人。

1. 先把方法全景图铺开:用两把尺子切分整片森林

强化学习的算法名字加起来能凑出几十个,但真正决定一个算法“性格”的,只有少数几个结构性选择。原始讲义里反复强调的是分类而不是罗列,因为一旦你知道了某个算法在坐标系里的位置,它的优缺点几乎是可以推导出来的,不需要背。这个思路对我帮助极大,后面做选型的时候基本就是先定位、再查表。

1.1 第一把尺子:手上有没有环境模型

最粗的一刀切在“模型”上。如果智能体能拿到环境的转移概率和奖励函数,也就是知道在状态 s 执行动作 a 之后会以多大概率跳到 s'、能拿到多少期望奖励,那它站在“有模型”这一侧;如果只能通过在环境里试错拿到一条条轨迹样本,那就是“无模型”。

这个区别不是学术洁癖,它直接决定了样本效率的量级。有模型的方法可以把模型当成一个可以任意查询的模拟器,一次真实交互采到的数据能被反复利用几百上千次,样本效率极高。而无模型方法每学一点东西几乎都要真刀真枪地交互,现实世界里机器人抓一次杯子要两秒,这就是硬成本。

但另一个容易被忽略的点是:有模型的方法把成本从“采样”挪到了“建模”。你需要一个足够准的模型,而模型误差会在多步展开的时候被放大。我做过的几个仿真到实物的方向里,模型误差带来的偏差比想象中大得多,最后往往是拿无模型方法做微调收尾。所以这条分界线不是“好与坏”,而是“成本放在哪儿”的问题。

1.2 第二把尺子:学的是值函数、策略,还是两者都要

第二刀切在“学什么”上。整体可以分成三块:

  • 值函数路线:先估计状态或状态动作对有多好,再通过“选最好的动作”隐式得到策略。这条路线的代表是动态规划、蒙特卡洛、时序差分、Q-learning。
  • 策略路线:直接把策略参数化成 π(a|s; θ),用梯度去抬高期望回报。代表是 REINFORCE 这一类策略梯度方法。
  • 两条腿一起走:用一个值函数当“评委”降低策略梯度的方差,就是 Actor-Critic 家族。

值函数路线的好处是样本利用相对紧凑,坏处是动作一多就难受——如果动作空间是连续的,你没法对每个动作都枚举一遍取最大值。策略路线正好反过来,输出动作天然适合连续控制,但梯度估计的方差大得吓人,不加方差缩减几乎训不动。这个“枚举 vs 采样”的取舍,几乎解释了后面所有算法设计的动机。

1.3 换一种排法:按“采样”和“自举”两个开关重新排队

讲义里有个我很喜欢的视角:把“要不要采样”和“要不要自举”当成两个开关,四种组合正好对应四类经典方法。

是否自举是否采样对应方法一句话特征
否否动态规划(策略/值迭代)用模型穷举,无噪声但需要完整模型
否是蒙特卡洛等回合结束再算总账,无偏但方差大
是否规划类方法(如基于模型的 rollout)用模型做多步展开并自举
是是时序差分、SARSA、Q-learning边走边学,有偏但方差小

这张表值钱的地方在于:它把“为什么 TD 会有偏差”这件事解释清楚了。TD 用当前的估计值去更新当前的估计值,这个自我引用就是自举,它带来偏差,但把方差压下去了。很多人在调参时抱怨 Q 值总是偏高或者老是震荡,追根溯源就是自举加函数逼近带来的偏差,不是学习率设错了。

2. 从马尔可夫决策过程到贝尔曼方程:整套东西的地基

跳过 MDP 直接看算法,短期能跑通 demo,长期一定会卡在某个看不懂的地方。我自己就是这么过来的,前半年一直搞不明白“为什么要用折扣因子”,直到做了一次长时间的路径规划才明白。

2.1 状态、动作、奖励、折扣:把任务写成五元组

任务抽象成 (S, A, P, R, γ) 五个要素:状态集合、动作集合、转移概率、奖励函数、折扣因子。前三项定义环境,后两项定义目标。写代码之前先把这五个东西写清楚,比后面调一百次参都有效。

状态表示是最容易出问题的部分。它必须满足马尔可夫性——当前状态包含了做决策需要的全部历史信息。现实里为了省事,很多人只喂当前观测,结果智能体表现忽好忽坏,看起来像随机,实质是状态表示漏了信息。我在一个简单的摆杆任务上就吃过这个亏,只给角度不给角速度,智能体永远学不会“反向借力”,因为从静态角度它无法判断自己在往哪边倒。加上角速度之后训练立刻稳定下来。这就是所谓的“状态设计比算法选择更重要”。

折扣因子 γ 决定智能体看多远。它的直观含义是:k 步之后的奖励,今天只值 γ^k。γ 取 0.99 的时候,大约 100 步以后的奖励权重掉到 0.37,200 步掉到 0.13。所以如果你希望智能体对 300 步以后的结果负责,γ 至少得往上顶到 0.995。但 γ 越接近 1,回报的方差越大、收敛越慢,而且函数逼近下的稳定性也越差。我的经验是先从 0.99 起步,任务确实需要长视野再往 0.995 调,同时把学习率压低一档。

2.2 值函数的两种写法与贝尔曼期望、最优方程

值函数分成两种,V(s) 回答“站在这个状态,按当前策略走下去平均能拿多少”,Q(s,a) 回答“站在这个状态,先执行动作 a,之后按当前策略走下去平均能拿多少”。前者维度低,后者信息全。有 Q 就能直接贪心取动作,不需要模型,这是 Q-learning 能成立的根本原因。

贝尔曼方程本质上是一种递归分解:把“从今天到未来所有奖励”拆成“今天这一步的奖励”加“从明天开始的折扣回报”。

V(s) = Σ_a π(a|s) Σ_s' P(s'|s,a) [ R(s,a,s') + γ V(s') ]

这行公式看着简单,含义却很重:它说明值函数不是一群孤立的数,而是一个自洽的方程组。强化学习里所有的迭代方法,本质上都是在解这个方程组——要么直接解,要么采样估计,要么用随机近似一点点逼近。

最优贝尔曼方程把“按当前策略”换成“按最优策略”,把求和换成最大化:

Q*(s,a) = Σ_s' P(s'|s,a) [ R(s,a,s') + γ max_a' Q*(s',a') ]

注意这里出现了 max,它让方程变成非线性的,也意味着不能再简单套用线性方程组解法,只能迭代。这就是值迭代的由来。

2.3 自举是后续所有算法的分水岭

自举(bootstrapping)的意思是:算更新目标的时候,用了自己当前的估计值。TD 的更新目标 r + γV(s') 里那个 V(s') 就是估计出来的,不是真实值。这带来两个直接后果:

第一,偏差进来了。估计有误差,误差又送回自己身上,会形成正反馈。Q-learning 里著名的“Q 值高估”就是这么来的,max 操作专门挑被高估的那个动作,偏差被系统性地放大。

第二,方差下去了。蒙特卡洛要等一整条轨迹跑完,把几十上百步的随机奖励加起来,方差随步数线性增长;TD 只用一步真实奖励加一个相对稳定的估计,方差小得多。样本效率上的巨大差异就是这么来的。

提示:自举不是可选项而是权衡项。如果你在做离线数据分析或者单条轨迹极长(比如持续几小时的流程控制),蒙特卡洛那种无偏但高方差的做法反而更可靠;如果是实时交互、数据金贵,TD 几乎是唯一选择。

3. 值函数路线的四代同堂:DP、MC、TD 与 Q-learning

这一条线上四个方法,学完一个学下一个的时候,你会明显感觉到每一步只是为了修上一个的短板。这种“问题驱动”的演进逻辑,比孤立地背公式要好懂得多。

3.1 动态规划:拿着模型把方程解到底

动态规划假设模型完全已知。策略评估就是反复套用贝尔曼期望方程更新 V,直到收敛;策略改进就是基于 V 做一步贪心。两者交替,就是策略迭代。值迭代则把评估和改进合并,每轮直接用 max 更新,形式更简洁。

它的优势是收敛有保证,而且是精确收敛,没有采样噪声。缺点也很明显:需要完整模型,而且每轮要遍历所有状态动作对,状态空间一大就废了。在实践中我几乎不会直接用它求解,但会用它做两件事:一是在小规模问题上算出最优解,用来给你的近似算法当“天花板”参照;二是用来验证你对贝尔曼方程的理解有没有写错。

3.2 蒙特卡洛:等回合结束再算总账

没有模型怎么办?跑!跑完一整条轨迹,把实际拿到的折扣回报 G_t 算出来,直接拿它当 V(s_t) 的更新目标:

V(s_t) ← V(s_t) + α [ G_t - V(s_t) ]

好处是无偏,因为 G_t 是真实采样出来的回报。坏处是必须等回合结束,而且方差大。方差大这件事在代码里表现得很直接:同一个状态跑两次,回报可能差好几倍,值函数就在那儿来回晃。

另一个细节是“首次访问”和“每次访问”的区别。同一条轨迹里如果状态重复出现,是只用第一次出现的位置更新,还是每次都更新?实践中每次访问更常用,样本利用率高,理论收敛性在步长满足条件时也成立。

蒙特卡洛还有一个重要的适用场景:回合制、轨迹长度可控、且奖励只在终点给出的任务。比如棋类、走迷宫、单元测试式的任务评分,这类场景里 TD 反而会因为中间没有奖励信息而“传不回去”。

3.3 TD 与 SARSA:边走边学

TD(0) 的核心改动是把 G_t 换成“一步真实奖励 + 下一状态的估计值”:

V(s_t) ← V(s_t) + α [ r_{t+1} + γ V(s_{t+1}) - V(s_t) ]

括号里那一坨叫 TD 误差,记作 δ。整个强化学习里,TD 误差大概是被用得最多的一个中间量:它既是更新信号,又是“惊讶程度”的度量,还被拿去做优先级采样、做优势函数估计。

把 TD 用到动作值上,并且更新时用“实际执行的下一个动作”,就得到 SARSA:

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

名字就是 s, a, r, s', a' 这个五元组。注意这里 a' 是策略实际选出来的,不是最贪心的那个,所以 SARSA 学的是“当前这个带探索的策略”的价值,属于 on-policy。它学出来的策略倾向于绕开悬崖边上的危险路径,因为在探索过程中它真的掉下去过,这是所谓“保守”的来源。

3.4 Q-learning:off-policy 的经典一步

Q-learning 只改了一个符号,把 Q(s', a') 换成 max_a' Q(s', a'):

# 表格型 Q-learning 的核心更新,十行以内能跑通 import numpy as np def q_learning(env, episodes=5000, alpha=0.1, gamma=0.99, eps_start=1.0, eps_end=0.05, eps_decay=0.995): Q = np.zeros((env.observation_space.n, env.action_space.n)) eps = eps_start for ep in range(episodes): s, _ = env.reset() done = False while not done: # epsilon-greedy 探索 if np.random.rand() < eps: a = env.action_space.sample() else: a = int(np.argmax(Q[s])) s_next, r, terminated, truncated, _ = env.step(a) done = terminated or truncated # 关键:目标用的是下一状态的最大 Q,与采样的动作无关 target = r if terminated else r + gamma * np.max(Q[s_next]) td_error = target - Q[s, a] Q[s, a] += alpha * td_error s = s_next eps = max(eps_end, eps * eps_decay) return Q

这个改动带来的是行为策略和目标策略分离:数据可以用任意探索策略采集,学的却是贪心策略的价值。这就是 off-policy 的含义,也是它能吃历史数据、能吃人类示范数据的原因。

但代价是它对“探索不足”和“高估偏差”都更敏感。表格型问题里无所谓,一到函数逼近就暴露:Q 值会系统性地往上飘,最后整个价值面被抬起来,策略退化。后面 DQN 里的双网络、Double DQN 里解耦动作选择和动作评估,都是在补这个洞。

3.5 四种方法的横向对照与选型建议

方法需要模型更新时机偏差方差典型适用场景
动态规划是每轮全量无无小规模规划、做基准
蒙特卡洛否回合结束无高回合制、稀疏终点奖励
SARSA否每步有低有风险代价、需要保守
Q-learning否每步有低离散动作、可离线复用数据

选型上我的一般顺序是:动作离散且状态空间能表格化,直接上 Q-learning,一晚上能跑出结果;动作离散但状态连续,Q-learning 加线性或小型网络近似;动作连续,别硬套值函数路线,直接去策略梯度那一侧。至于蒙特卡洛,它现在更多是作为方差缩减的组件出现在策略梯度里,而不是独立求解器。

4. 策略梯度与 Actor-Critic:连续动作空间的解法

前面那套方法在连续动作上会直接卡死,因为 max 没法算。策略梯度换了个思路:不估计价值再取最大,而是直接调整策略参数,让“好动作”的概率变大。

4.1 策略参数化与对数导数技巧

策略通常写成高斯分布:均值由网络输出,标准差可以学也可以固定。采样动作就是从这个分布里取一个点。这样天然支持连续动作,而且策略本身带随机性,探索是内建的。

目标是期望折扣回报 J(θ),我们要算它的梯度。直接用定义算不出来,因为动作是采样出来的,梯度传不过去。这里用到对数导数技巧:

∇J(θ) ≈ (1/N) Σ_i Σ_t ∇log π(a_t|s_t; θ) · G_t

直觉解释很漂亮:把 log 策略的梯度看成“往哪个方向调能让这个动作更可能发生”,把 G_t 看成“这个动作到底好不好”。两者相乘再累加,好动作被推高,坏动作被压低。

朴素的 REINFORCE 实现起来极简:

# REINFORCE 的核心:跑完一条轨迹,用回报加权对数概率的梯度 log_probs, rewards = [], [] # ... 采样过程,每步记录 log π(a|s) 和 r ... returns = [] G = 0 for r in reversed(rewards): G = r + gamma * G returns.insert(0, G) returns = torch.tensor(returns) returns = (returns - returns.mean()) / (returns.std() + 1e-8) # 标准化,非常关键 loss = -(torch.stack(log_probs) * returns).sum() loss.backward() optimizer.step()

注意里面那行标准化。不加的话,几乎不可能训起来——因为回报的量纲直接决定了梯度的大小,奖励是 100 分制还是 1 分制,等效学习率差了 100 倍。

4.2 方差问题:基线、优势函数、GAE

REINFORCE 理论上无偏,实际方差大到令人绝望。原因很直接:G_t 里有大量与当前动作无关的随机因素,这些噪声全都被乘进了梯度。

第一个补丁是减基线:把 G_t 换成 G_t - b(s),b(s) 可以是 V(s) 的估计。数学上这不改变期望,因为减去的那项与动作无关、期望为零;但方差能降一大截。这个操作的实质是:不再问“这个动作拿了多少分”,改问“这个动作比平均水平好多少”。

第二个补丁是优势函数 A(s,a) = Q(s,a) - V(s,a),就是上面那件事的严格版本。实践中很少真的去估 Q,通常用 TD 误差 δ = r + γV(s') - V(s) 作为优势的单步估计,它本身就是无偏的优势估计(在 V 准确的前提下)。

第三个补丁是 GAE,把多步的 TD 误差做指数加权:

A_t^GAE = Σ_{l=0}^{∞} (γλ)^l δ_{t+l}

λ 等于 0 退化成单步 TD 误差,偏差最大方差最小;λ 等于 1 退化成蒙特卡洛回报,方差最大偏差最小。0.95 左右是个常用的折中,这个参数实际上是在调“我愿意相信估计值到什么程度”。我自己在连续控制任务上习惯从 0.95 起手,如果曲线抖得厉害往 0.9 压,如果收敛太慢往 0.98 放。

4.3 Actor-Critic 的结构拆解与代码骨架

Actor-Critic 就是“策略网络 + 价值网络”两件套。Actor 负责出动作,Critic 负责评价。Critic 的评价信号进 Actor 的损失里,替代原始的回报。

结构上要注意几点:

  • 两套网络不要共享太多底层:状态简单的时候共享能加速,状态复杂、任务多的时候共享层容易让两个目标打架。我的经验是,视觉输入用共享卷积提特征,之后立刻分流;低维状态向量干脆不共享。
  • 两个学习率分开设:Critic 通常要比 Actor 学得快一点,否则 Actor 在追一个还在乱动的评价标准。常见做法是 Actor 学习率 3e-4,Critic 学习率 1e-3。
  • 价值目标要做截断:Critic 的回归目标会随训练不断变化,如果不裁剪,偶尔一次异常回报就会把价值网络拉飞,进而毁掉整个策略。裁剪范围通常是上一轮价值标准差的若干倍。

它的最大优势是把“探索”和“评价”解耦了:策略自带随机性负责探索,价值网络负责稳定梯度。在连续控制任务上,这是目前最主流的结构。

5. 函数逼近与工程落地:从表格到神经网络

表格法只能处理小规模问题。状态一旦是几十维连续向量,表格就彻底失效,必须上函数逼近——也就是用参数化的函数去拟合值函数或策略。

5.1 为什么要逼近,以及它带来的不稳定

用函数逼近的核心假设是“相似的状态有相似的价值”,也就是泛化。好处是样本可以在状态之间共享,一个没见过的状态能靠邻域推出来。坏处是,泛化错了你也不知道。

更麻烦的是著名的“死亡三角”:函数逼近 + 自举 + off-policy,三者同时出现时会破坏收敛性保证。原因在于,自举让更新目标依赖于参数本身,函数逼近让一个样本的更新影响到一大片状态,off-policy 让数据分布与当前策略不一致。三者叠加,参数的更新就不再有收缩性保证,表现出来就是 Q 值发散或者塌到某个固定值。

DQN 给出的两个工程解药,本质上是把这个三角拆开:

  • 经验回放:把历史转移存进缓冲池,随机采样训练。这打散了样本的时间相关性,让数据分布更接近独立同分布,缓解了 off-policy 带来的分布漂移。
  • 目标网络:单独维护一份延迟更新的网络来算目标值。这让更新目标在一段时间内固定,暂时把自举那条边剪掉,恢复部分收缩性。

5.2 关键超参与它们的物理含义

超参常见取值调大后的效果调小后的效果
回放池容量1e5 ~ 1e6数据多样,但旧策略数据占比高新鲜,但相关性大
目标网络更新周期每 500~2000 步目标更稳定,但学习滞后跟得紧,但容易震荡
批大小32 ~ 256梯度更稳,单步更慢噪声大,但更新频率高
折扣因子 γ0.99(可到 0.999)视野长,方差大短视,可能学不到长期收益
探索率衰减线性到 5% 左右探索更久收敛快但可能陷入局部

这些数不是拍脑袋来的。回放池容量和任务长度大致挂钩:如果单条回合只有 200 步,池子装 1e5 条基本能覆盖几百个回合的历史,够用;如果回合长达几千步,池子就得更深。目标网络周期和更新频率有关,一般让目标值在“几百次梯度更新”这个尺度上保持稳定。

5.3 奖励设计与归一化:最容易被低估的环节

奖励函数是整个系统里唯一直接表达“我想要什么”的地方,也是最容易出事的地方。我见过的问题里,超过一半最后追到奖励设计上。

几个实操原则:

  • 稠密化但不要作弊。给中间步骤一些引导性奖励能显著加快学习,但引导项太强会让智能体学会“刷分”而不是完成任务。比如想让它走过去,就别给“靠近目标”的奖励给得太猛,否则它会在目标附近绕圈。
  • 量纲统一。所有奖励项的量级尽量对齐到同一个数量级,否则小项形同不存在。
  • 奖励缩放。把奖励除以一个参考尺度,让它大致落在 [-1, 1] 附近,这一步配合学习率调整几乎是必需的。奖励量级变了十倍而不改学习率,等效于学习率变了十倍。
  • 终止条件要和奖励一致。碰撞终止给了负奖励,但“超时终止”如果不给惩罚,智能体可能学会故意磨蹭。这个坑很隐蔽。

注意:不要在训练过程中随意改动奖励函数。改一次奖励,之前学的价值函数全部失效,而你又很难从曲线里看出这是“奖励变了”还是“算法崩了”。要改就重开一轮,别在旧模型上接着练。

6. 常见问题与排查技巧实录

训练不收敛是常态,收敛是意外。有一套固定的排查顺序能省下大量时间,这比记住某个算法的公式有用得多。

6.1 一个可复用的排查顺序

我现在的固定流程是这样,从便宜到贵依次排除:

  1. 先确认环境本身没写错。随机策略跑几百回合看奖励分布,如果全是同一个值,多半是奖励没接上或者 done 标志永远不触发。这一步能抓出大量的低级错误。
  2. 用人类规则跑一遍。手写一个简单的启发式控制器,看它能不能拿到不错的分数。如果连规则策略都跑不好,说明任务定义有问题,别指望学习算法救场。
  3. 检查状态是否满足马尔可夫性。把最近几帧拼进状态里试试,如果表现突然变好,原来的状态表示就是漏信息的。
  4. 把探索开到最大看一眼。ε 设成 1 或者策略标准差调大,观察状态覆盖范围。如果探索只覆盖了状态空间的一小块,那不管算法多好都学不出全局策略。
  5. 极端简化验证算法实现。把问题换成一个 5x5 的网格世界,如果 Q-learning 在这个上面都学不会,代码里一定有 bug。
  6. 最后才调超参。学习率、γ、网络大小,按这个顺序试。

这个顺序的价值在于:它把“可能是算法问题”这个模糊的判断,拆成了几个可以在十分钟内验证的具体假设。我见过太多人一上来就怀疑算法、换网络、加层数,最后发现是 done 标志在超时的时候没置位。

6.2 典型症状与对应处理

症状可能原因处理方式
奖励曲线完全平的奖励没连通、动作空间映射错误、done 不触发打印每步奖励与 done,用随机策略验证
前期上升后突然崩掉学习率过大、目标网络更新太频、价值爆炸降学习率一半、拉长目标更新周期、加梯度裁剪
Q 值持续单调上涨自举带来的系统性高估换 Double 结构、加目标网络、降低 γ
策略退化成确定性输出熵坍缩、探索噪声被学没了加熵奖励项、提高初始探索标准差
训练快但泛化差过拟合到少量状态、回放池太小增大池子、加入状态扰动、减少网络容量
不同种子结果差异巨大方差问题、初始化敏感至少跑 5 个种子看分布,别信单条曲线

关于“种子差异”这一条我想多说一句:强化学习实验里单次运行的结果几乎没有参考价值。我做过同一套配置跑 10 个种子,最好和最差能差出 3 倍分数。所以判断一次改动是否有效,至少要看 5 个种子的中位数,这是最基本的要求。截图里挑最好看的那条曲线,最后会让你在真实任务上被打脸。

6.3 几条压箱底的经验

第一,先把算法跑在你能完全理解的最小问题上。我习惯用 4x4 的网格世界做第一道关,它的最优策略闭着眼睛都能写出来。任何新算法、新实现,先过这一关,能省掉后面 80% 的调试时间。

第二,日志比曲线重要。除了回合奖励,至少还要记:平均回合长度、TD 误差的绝对值均值、策略熵、价值函数均值、梯度范数。这五个量放在一起看,能定位到具体是哪一环出问题。比如奖励在涨但回合长度在掉,多半是学会了提前终止;TD 误差均值持续变大,说明价值估计在跑偏。

第三,别迷信“最优超参”。同一套参数换个任务就得重调,这是常态。真正可迁移的是“参数的物理含义”和你对“训练到什么状态算健康”的判断力。我现在看到一个任务,会先根据它的回合长度决定 γ,根据奖励量级决定学习率,根据动作维度决定网络宽度,这三步定完之后再去微调,基本能省掉大量盲试。

第四,评估时关掉探索。训练用带噪声的策略,评估必须用均值的、确定性的版本。这个细节听起来理所当然,但真的有人一边训练一边拿带噪声的策略算成功率,然后困惑为什么评估曲线那么抖。

第五,留一个“旧版本快照”。每次做改动之前,把当前能跑通的代码和配置存一份。强化学习的改动经常是“修好一个坏掉两个”,有个能回退的基线,比什么都管用。

这个系列后续还会往具体算法里钻,从时序差分的收敛性证明讲到分布式实现。对我自己来说,把这张方法概览图记住,比背下十个算法伪代码要值钱得多——因为你面对一个新任务时,真正需要的是判断力,而不是模板。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询