简介:《强化学习的数学原理》是西湖大学赵世钰教授撰写的英文专著,面向具备线性代数、概率论基础的研究生及算法工程师,系统解决强化学习理论理解不深、公式推导脱节、算法设计缺乏数学支撑等核心痛点。全书10章+附录,从网格世界直观建模出发,严格推导贝尔曼方程、值迭代与策略迭代的收敛性,深入剖析蒙特卡洛与时间差分的统计本质,并覆盖策略梯度、Actor-Critic等前沿方法的数学框架,特别强化了随机近似、收缩映射定理等关键工具的讲解。资源为单文件PDF(18.9MB),内容完整、排版规范,含大量示例、矩阵向量形式推导及Q&A环节,便于精读与公式复现。目前已有845人学习下载,适合希望夯实RL理论根基、提升算法分析与改进能力的学习者。
1. 强化学习的数学原理:不是调参玄学,而是智能体的“人生账本”与“决策心法”
你有没有想过,一个机器人在迷宫里左冲右撞、反复试错,最后居然能自己找到出口——它到底靠什么“想明白”的?不是靠预设路线,不是靠上帝视角,而是靠一次次跌倒后默默记下:“从A格子往右走,平均会拿到+2分;往下走,却常掉进-5分的陷阱”。这个“记分+算账+改主意”的全过程,就是强化学习。而《强化学习的数学原理》这本书,干了一件特别实在的事:它不教你用哪个库、跑哪段代码,而是把这套“记分—算账—改主意”的底层逻辑,掰开揉碎,用数学语言写成一本清晰可读的“智能体生存手册”。
打个比方:如果把强化学习比作一个人学开车,那么大多数教程教的是“怎么踩油门、怎么打方向”,而这本书问的是:“为什么松油门时车会减速?为什么方向盘转15度车身偏移量是0.8米?这些数字背后,是牛顿第二定律还是轮胎摩擦模型?”它不回避公式,但每个公式都配一个网格世界的例子——比如小机器人在3×3格子里找金币,每步扣1分,拿到金币加10分。所有抽象符号(V(s)、Q(s,a)、γ)都在这个小世界里有血有肉。你读完第一章,不会记住一堆定义,但会突然懂:原来“策略”就是司机的习惯,“奖励”是每次操作后的油费/罚款,“状态值”是他心里对“现在停在路口”这件事的长期估值。这不是高不可攀的理论,而是让机器学会“权衡眼前和未来”的基本心法。对刚入门的人来说,它像一张亲手绘制的地图;对已调过百次超参却总卡在收敛慢、策略震荡的人,它是一剂退烧药——告诉你,问题不在learning rate,而在你根本没看清贝尔曼方程里那个“期望”到底在对谁取。
2. 贝尔曼方程:强化学习的“复式记账法”,为什么它不是可有可无的装饰?
2.1 为什么非得有个“方程”?没有它,智能体就是瞎猜
想象你在玩一个单机RPG游戏,角色站在岔路口:左边是幽暗洞穴(可能有宝箱,也可能有陷阱),右边是阳光大道(安全但只有铜币)。你凭直觉选了左边,结果被毒蜘蛛咬了一口,血掉一半。下次你还敢去吗?人会想:“上次去亏了,但听说洞穴深处有传说级装备……要不要再试一次?”这个“上次亏了”是即时反馈,“传说级装备”是未来预期。而贝尔曼方程,就是把这两者焊死在一起的数学铁链。
它说:一个状态s的价值V(s),不等于你此刻看到的奖励r,而是“当前奖励 + 后续所有可能状态价值的加权平均”。写成公式就是:
$$ V^\pi(s) = \mathbb{E}\pi \left[ r{t+1} + \gamma r_{t+2} + \gamma^2 r_{t+3} + \cdots \mid s_t = s \right] $$
别被求和符号吓住——这其实就是会计里的“现值折现”:明年赚100块,不如今天拿80块(假设折现率γ=0.8)。贝尔曼方程把它进一步拆解:
$$ V^\pi(s) = \sum_a \pi(a|s) \sum_{s'} P(s'|s,a) \left[ R(s,a,s') + \gamma V^\pi(s') \right] $$
通俗地说:“我现在值多少钱”,取决于“我接下来最可能去哪、能拿多少、以及那地方本身值多少钱”。没有这个方程,智能体就像只看K线图做交易的股民——只见红绿箭头,不见资金流与基本面。它无法理解“牺牲短期收益换取长期优势”这种事,所有学习都是碎片化的条件反射。
提示:初学者常误以为“多试几次就能自动学会”,但实验证明:没有贝尔曼结构约束的学习,极易陷入局部最优。比如在迷宫中反复绕圈拿小金币,永远找不到大宝藏——因为它的“账本”没把“绕圈成本”和“宝藏延迟收益”放在同一张表里核算。
2.2 矩阵形式:当状态多到数不清,怎么算出所有V(s)?
网格世界只有9个格子,手算V(s)还能列方程组。但真实场景呢?自动驾驶要处理上万种道路组合,AlphaGo的棋盘状态数远超宇宙原子数。这时,贝尔曼方程必须“升维”——写成矩阵向量形式:
$$ \mathbf{V}^\pi = \mathbf{R}^\pi + \gamma \mathbf{P}^\pi \mathbf{V}^\pi $$
其中:
- $\mathbf{V}^\pi$ 是状态值向量(每个元素是某个s的V值)
- $\mathbf{R}^\pi$ 是策略π下的即时奖励向量($\mathbf{R}^\pi(s) = \sum_a \pi(a|s) \sum_{s'} P(s'|s,a) R(s,a,s')$)
- $\mathbf{P}^\pi$ 是策略π诱导的状态转移矩阵($\mathbf{P}^\pi(s,s') = \sum_a \pi(a|s) P(s'|s,a)$)
这个写法看似更抽象,实则极大提升了计算效率。比如求解$\mathbf{V}^\pi$,可直接移项:
$$ (\mathbf{I} - \gamma \mathbf{P}^\pi) \mathbf{V}^\pi = \mathbf{R}^\pi $$
只要$(\mathbf{I} - \gamma \mathbf{P}^\pi)$可逆(γ<1时恒成立),就能用线性代数库一招解出全部状态值。这相当于给智能体配了个Excel宏:输入转移概率和奖励规则,一键生成整张“人生资产负债表”。
2.3 迭代法才是真·工程实践:为什么闭式解只是教科书幻觉?
理论上,上面那个矩阵方程有闭式解:$\mathbf{V}^\pi = (\mathbf{I} - \gamma \mathbf{P}^\pi)^{-1} \mathbf{R}^\pi$。但现实很骨感:
- 状态空间稍大(比如1000个状态),$\mathbf{P}^\pi$就是1000×1000矩阵,求逆计算量O(n³),内存爆表;
- 更致命的是,真实环境中$\mathbf{P}^\pi$根本未知——你不可能提前知道“踩油门后车速精确变为32.7km/h的概率是0.63”。
所以书中重点讲的是迭代法(也叫“值迭代雏形”):
# 伪代码:贝尔曼方程的迭代求解 V_old = np.zeros(num_states) for iteration in range(max_iter): V_new = np.zeros(num_states) for s in all_states: # 对每个动作a,计算“执行a后能获得的期望价值” q_values = [] for a in actions[s]: expected_reward = 0 for s_next in next_states[s][a]: prob = transition_prob[s][a][s_next] reward = reward_func[s][a][s_next] expected_reward += prob * (reward + gamma * V_old[s_next]) q_values.append(expected_reward) # 策略π下,状态s的价值 = 所有动作q值的加权平均 V_new[s] = sum(pi[a|s] * q_values[a] for a in actions[s]) V_old = V_new # 更新旧值这段代码的核心思想,就是“用昨天的估值,算今天的估值”。它不要求全局知识,只需局部采样;不依赖精确模型,连概率分布都可以用经验频率替代。这就是为什么蒙特卡洛和时序差分方法能后来居上——它们把贝尔曼方程从“静态方程”变成了“动态更新规则”,让智能体边走边记账,越活越精明。
2.4 从状态值到动作值:Q函数——把“该不该做”和“做了之后怎样”焊死
V(s)回答:“我在s这个地方,长期来看值多少?”但它不告诉你下一步具体该干什么。就像知道“北京房价均价8万一平”并不能指导你买朝阳还是海淀。真正指挥行动的是动作值函数Q(s,a):
$$ Q^\pi(s,a) = \mathbb{E}\pi \left[ r{t+1} + \gamma r_{t+2} + \gamma^2 r_{t+3} + \cdots \mid s_t = s, a_t = a \right] $$
注意!这里固定了第一步动作a,后续才按策略π执行。所以Q(s,a)的本质是:“如果我现在硬着头皮在s做a,后面照常发挥,最终能捞多少?”
贝尔曼方程自然升级为Q版:
$$ Q^\pi(s,a) = \sum_{s'} P(s'|s,a) \left[ R(s,a,s') + \gamma \sum_{a'} \pi(a'|s') Q^\pi(s',a') \right] $$
这个式子揭示了一个关键设计哲学:Q函数把“环境反馈”(P,R)和“自身策略”(π)解耦了。左边Q(s,a)只关心“我做a的结果”,右边求和里π(a'|s')只影响后续决策,不影响当前a的评估。这为后续Q-learning(完全抛弃π,直接学最优Q*)埋下伏笔。实践中,Q表比V表更实用——查表时,你不需要先猜策略π,直接找max_a Q(s,a)就能行动。
2.5 常见误区:V、Q、π、R,谁才是爸爸?谁又是孙子?
初学者最容易在概念层级上“认错爹”,导致后续所有推导都错位。以下是五个高频混淆点,务必厘清:
易混点1:认为“奖励R就是价值V”
→ 为什么混:两者单位都是“分”,且R出现在V的定义里。
→ 怎么区分:R是单次快照(踩刹车瞬间的减速度),V是长期录像回放(从踩刹车到停车全程的舒适度评分)。R决定V的“原料”,但V还包含“后续所有R的折现总和”。没有R,V是空谈;只有R,V是短视。
易混点2:把“策略π”当成“目标”,而忽略它是实现V的工具
→ 为什么混:教材常写“求最优策略π*”,让人误以为π是终点。
→ 怎么区分:π是手段,V或Q才是目标函数。就像健身不是为了练出“每天跑步3公里”这个习惯,而是为了提升“心肺功能V”和“体脂率Q”。所有算法(值迭代、策略迭代)本质都在优化V/Q,π只是它的参数化表达。
易混点3:以为“贝尔曼方程必须用精确概率P”
→ 为什么混:公式里明晃晃写着∑P(s'|s,a)…
→ 怎么区分:P只是建模方式之一。蒙特卡洛用实际轨迹均值替代期望,时序差分用单步采样+后续估计替代全期望。贝尔曼方程是结构框架,不是计算枷锁。就像“复式记账”要求“有借必有贷”,但你可以用手写账本、Excel或区块链实现。
易混点4:混淆“状态值V(s)”和“状态-动作值Q(s,a)”的适用场景
→ 为什么混:两者都叫“value”,且Q(s,a) = ∑_s' P(s'|s,a)[R + γV(s')]。
→ 怎么区分:V(s)适合策略评估(检查当前π好不好);Q(s,a)适合策略改进(对比不同a,选最好的)。就像体检报告(V)告诉你健康得分,但开药方(π)必须看各项指标(Q)。
易混点5:认为“折扣因子γ是调参技巧,不是数学必需”
→ 为什么混:γ常被当作超参调,且γ=1时公式更简洁。
→ 怎么区分:γ是保证收敛的数学地基。当γ<1时,无穷回报级数∑γ^t r_t绝对收敛;若γ=1且存在循环路径,V(s)可能发散(无限绕圈得零分,但数学上不收敛)。它不是让结果“更好看”,而是让问题“有解”。
3. 贝尔曼最优方程:当智能体开始“内卷”,它如何定义自己的天花板?
3.1 最优≠完美:为什么“最好策略”永远带着折扣率的烙印?
“最优策略π*”听起来像终极答案,但强化学习里的“最优”非常务实:它不是指“在所有可能宇宙中都无敌”,而是“在给定规则(尤其是折扣率γ)下,能最大化长期折现回报的策略”。这就像高考状元不是知识总量第一,而是在“语数外+X”计分规则下总分最高的人。γ就是那个隐形的“科目权重”——γ越接近1,智能体越看重遥远未来(如十年后退休金);γ越小,它越像月光族,只顾下个月房租。
贝尔曼最优方程(BOE)正是这个务实最优的数学宣言:
$$ V^(s) = \max_a \sum_{s'} P(s'|s,a) \left[ R(s,a,s') + \gamma V^(s') \right] $$
对比普通贝尔曼方程,关键变化在max_a——它宣告:在s状态,我不再问“按π做a值多少”,而是问“所有可能a中,哪个能让我后续价值最大?”这个max操作,把策略π从“给定条件”升级为“待优化变量”,V从此成为所有Vπ的上界:$V^(s) \geq V^\pi(s), \forall \pi, s$。
注意:BOE的解V唯一,但实现它的最优策略π可能不唯一。比如在十字路口,直行和左转都能到达终点,V相同,则两者都是π。算法只需找到任一π*,不追求“唯一解”。
3.2 收敛性证明:为什么“不断取max”不会让价值爆炸?
看到BOE里嵌套的V*(s'),你可能会担心:这不成了“鸡生蛋,蛋生鸡”?定义V要用到V,岂不循环论证?书中用压缩映射定理(Contraction Mapping Theorem)破除疑虑。核心思想:定义一个算子$\mathcal{T}$:
$$ (\mathcal{T}V)(s) = \max_a \sum_{s'} P(s'|s,a) \left[ R(s,a,s') + \gamma V(s') \right] $$
BOE即求解不动点:$\mathcal{T}V^* = V^$。而压缩映射定理保证:只要γ∈[0,1),$\mathcal{T}$就是压缩的——即对任意两个价值函数V₁,V₂,有:
$$ | \mathcal{T}V_1 - \mathcal{T}V_2 |\infty \leq \gamma | V_1 - V_2 |\infty $$
这意味着:每次应用$\mathcal{T}$,函数间的“距离”至少缩小γ倍。就像橡皮筋被持续拉紧,最终所有V都会收敛到同一个V。这是强化学习算法(值迭代、Q-learning)能落地的数学定心丸——它不保证最快,但保证一定到。
3.3 值迭代:用“抄作业”方式逼近最优,为什么它比策略迭代更抗造?
值迭代(Value Iteration)是求解BOE最直观的算法:
# 值迭代核心循环 V = np.zeros(num_states) # 初始化 for iter in range(max_iter): V_new = np.zeros(num_states) for s in all_states: # 对每个s,穷举所有a,找能使“即时奖励+后续V”最大的那个 best_value = -float('inf') for a in actions[s]: expected = 0 for s_next in next_states[s][a]: prob = P[s][a][s_next] reward = R[s][a][s_next] expected += prob * (reward + gamma * V[s_next]) if expected > best_value: best_value = expected V_new[s] = best_value V = V_new # 最终V即V*,对应π*(s) = argmax_a Q(s,a)它的精妙在于:不显式存储策略π,只迭代价值V,最后从V反推π*。这带来两大工程优势:
- 内存友好:只需存一个V数组,而非策略表π(s,a);
- 鲁棒性强:即使环境模型P,R有误差,V迭代仍能收敛到近似最优(因max操作有天然抗噪性)。
相比之下,策略迭代(Policy Iteration)需交替执行“策略评估”(算Vπ)和“策略改进”(用Vπ更新π),步骤更多,且策略评估阶段若用迭代法,可能因初始V不准而震荡。值迭代就像一个专注刷题的学生——不纠结“我现在策略对不对”,只管“这道题标准答案是多少”,答案刷多了,自然形成正确解题思路(π*)。
3.4 策略迭代:当“反思”成为刚需,为什么它有时比值迭代更快?
策略迭代(Policy Iteration)走的是另一条路:
- 策略评估:给定当前πₖ,精确求解V^{πₖ}(解线性方程组或迭代至收敛);
- 策略改进:基于V^{πₖ},贪婪更新πₖ₊₁(s) = argmax_a Q^{πₖ}(s,a);
- 重复直到πₖ₊₁ = πₖ。
它的优势在于收敛步数极少。理论证明:策略迭代最多|A|^|S|步收敛(|A|动作数,|S|状态数),而值迭代可能需要O(log(1/ε)/log(1/γ))步才能达到ε精度。在小规模确定性问题中,策略迭代常3-5步就锁定π*,而值迭代要迭代几十轮。
但代价是:策略评估阶段计算量大。若用闭式解,需解|S|元线性方程组;若用迭代,又面临收敛慢问题。因此,工程中常采用截断策略迭代(Truncated Policy Iteration):策略评估只做k步迭代(k=1~3),不求精确V^{πₖ},用粗糙估计加速。这本质上是值迭代(k=1)和策略迭代(k→∞)的连续谱系,给了工程师灵活调控“精度-速度”天平的杠杆。
3.5 常见误区:最优、收敛、贪婪,三个词为何总被串错?
这三个词是强化学习的“三叉戟”,但初学者常把它们插错位置:
易混点1:认为“最优策略π*意味着每一步都选即时奖励最大的动作”
→ 为什么混:“贪婪”字面意思就是“见好就收”。
→ 怎么区分:贪婪是局部最优,π是全局最优。例如:A→B(+1分)→C(+100分) vs A→D(+50分)→E(0分)。贪心选D得50分,π选B得101分。BOE中的max_a是对未来价值的贪婪,不是对R的贪婪。
易混点2:把“算法收敛”等同于“学到完美策略”
→ 为什么混:收敛证明常以“∥Vₖ - V∥ → 0”结尾。
→ 怎么区分:收敛保证数学解存在且可达,但实际中受制于:① 模型误差(P,R不准);② 函数近似(用神经网络拟合V,必然有泛化误差);③ 探索不足(没访问过某些状态,V未知)。收敛是必要条件,非充分条件。
易混点3:混淆“贪婪策略”和“ε-贪婪策略”的目的
→ 为什么混:两者都含“贪婪”,且都用于动作选择。
→ 怎么区分:贪婪策略(greedy policy)是策略改进的工具——用当前V估计来生成新π;ε-贪婪是探索机制——以ε概率随机选动作,防止卡在次优环里。前者服务于“利用”,后者服务于“探索”,如同开车时“按导航走”(贪婪)和“偶尔偏离试试小路”(ε-贪婪)。
4. 蒙特卡洛 vs 时序差分:当智能体开始“边走边学”,它该信经验还是信模型?
4.1 蒙特卡洛方法:用“人生复盘”代替“纸上谈兵”
蒙特卡洛(MC)方法的核心信条是:不依赖环境模型,只靠真实经历。它像一个爱写日记的老人,每次完整走完一趟(episode),回家就摊开本子,把这一路的每一步、每一分都记下来,然后算平均值:“上次从起点出发,第3步走到走廊,总共得了12分;上上次走了15分……所以走廊这步平均值是13.5分。”
MC Basic算法流程极简:
- 用当前策略π生成完整episode:$s_0,a_0,r_1,s_1,a_1,r_2,\dots,s_T$;
- 对episode中每个状态sₜ,计算其首次访问回报(first-visit return):$G_t = r_{t+1} + \gamma r_{t+2} + \dots + \gamma^{T-t} r_T$;
- 用所有Gₜ的均值更新V(sₜ)。
关键特性:
- 无偏性:因Gₜ是真实轨迹回报,E[Gₜ] = V^π(sₜ),估计无系统偏差;
- 高方差:一次episode的Gₜ波动巨大(运气好捡到宝箱,运气差掉陷阱),需大量episode平滑;
- 延迟更新:必须等episode结束才能更新,不适合实时控制(如机器人摔倒前无法修正)。
提示:MC的“首次访问”与“每次访问”是两种变体。前者只用第一次出现sₜ的Gₜ,避免同一episode内重复计数;后者用所有出现,样本更多但有自相关性。实践中,首次访问更常用。
4.2 时序差分(TD):用“边走边猜”解决MC的三大痛点
TD方法是强化学习的革命性突破,它问:“既然要等终点才知道总分,能不能走一步就估一步?”答案是:用当前估计V(sₜ₊₁)替代未来所有r的求和。TD Target定义为:
$$ G_t^{TD} = r_{t+1} + \gamma V(s_{t+1}) $$
TD Error(δ)即预测误差:
$$ \delta_t = r_{t+1} + \gamma V(s_{t+1}) - V(s_t) $$
然后用δ更新V(sₜ):
$$ V(s_t) \leftarrow V(s_t) + \alpha \delta_t $$
这带来了MC梦寐以求的三大改进:
- 无模型:和MC一样,不需P,R;
- 低方差:V(sₜ₊₁)是已有估计,比随机Gₜ稳定得多;
- 在线更新:每步后立即更新,支持实时学习。
但代价是有偏性:因V(sₜ₊₁)本身是估计,E[r_{t+1} + \gamma V(s_{t+1})] ≠ V^π(sₜ)。这是“用偏差换方差”的经典权衡。
4.3 SARSA与Q-learning:同源双生子,为何一个谨慎一个激进?
SARSA(State–Action–Reward–State–Action)和Q-learning都属TD方法,都更新Q(s,a),但哲学迥异:
SARSA是“胆小鬼”:它更新Q(sₜ,aₜ)时,用的是实际执行的下一个动作aₜ₊₁:
$$ Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha \left[ r_{t+1} + \gamma Q(s_{t+1},a_{t+1}) - Q(s_t,a_t) \right] $$
它严格遵循“所见即所得”,学的是当前策略π下的Q^π。如果π是ε-贪婪,SARSA学到的就是带探索的Q^π,行为更保守。
Q-learning是“冒险家”:它更新Q(sₜ,aₜ)时,用的是下一个状态sₜ₊₁下最优动作的Q值:
$$ Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha \left[ r_{t+1} + \gamma \max_{a'} Q(s_{t+1},a') - Q(s_t,a_t) \right] $$
它假装“sₜ₊₁后我要选最好的a'”,因此学的是最优Q*,与当前策略无关。这使它能离线学习(off-policy):用随机探索的数据,学最优策略。但风险是:若探索不足,max操作会放大噪声,导致“幻觉最优”。
注意:Q-learning的off-policy特性是双刃剑。它允许重用历史数据(如经验回放),但也要求探索充分,否则易学偏。SARSA的on-policy更稳,但数据利用率低。
4.4 n-step TD:在MC和TD之间修一座桥
n-step TD是两者的融合体:它既不像MC那样等整个episode,也不像1-step TD那样只看下一步,而是看接下来n步的真实奖励 + 第n+1步的估计值:
$$ G_t^{(n)} = r_{t+1} + \gamma r_{t+2} + \dots + \gamma^{n-1} r_{t+n} + \gamma^n V(s_{t+n}) $$
当n=1,退化为TD;当n→∞,退化为MC。n的选择是艺术:
- n小:方差低,偏差高,更新快;
- n大:偏差低,方差高,更准但慢。
实践中,n=3~5是常见折中。它让智能体既能快速响应(如n=1),又能捕捉中程模式(如n=5),比单一方法更适应复杂任务。
4.5 常见误区:模型、无模型、on/off-policy,三组概念如何精准对号入座?
这三组术语常被混为一谈,实则维度不同:
易混点1:“无模型”不等于“不用任何模型”
→ 为什么混:MC/TD都说“不依赖环境模型”。
→ 怎么区分:“无模型”指不需已知P,R的解析形式,但MC用轨迹数据隐式建模,TD用V/Q函数显式建模。它反对的是“手写转移概率表”,不反对“用神经网络学P,R”。
易混点2:“on-policy”和“off-policy”不是指“是否用策略”,而是指“更新目标与行为策略是否一致”
→ 为什么混:SARSA用π生成数据并更新Q^π,Q-learning用π生成数据却更新Q*。
→ 怎么区分:关键看TD Target中的策略。SARSA Target含π(aₜ₊₁|sₜ₊₁),Q-learning Target含max,与π无关。这决定了能否重用旧数据——Q-learning可以,SARSA不行。
易混点3:“蒙特卡洛”不是一种算法,而是一类基于采样的方法论
→ 为什么混:常把MC Basic当作MC的全部。
→ 怍么区分:MC涵盖所有用完整episode回报估计期望的方法,包括MC Control(如MC Exploring Starts)、Importance Sampling MC(处理off-policy)等。它和TD是“估计范式”的并列关系,不是具体算法。
5. 函数近似与深度Q网络:当状态多到存不下,智能体如何学会“举一反三”?
5.1 从表格到函数:为什么“查表”在真实世界必然失败?
在3×3网格世界,我们能轻松建一个9×4的Q表(9状态×4动作)。但换成围棋:状态数≈10¹⁷⁰,比宇宙原子数还多。存不下是其一,更致命的是泛化能力缺失——表格式学习者像死记硬背的考生:它记得“黑棋在A1白棋在H8时该下C3”,但若白棋挪到H7,它就懵了,因为这是新条目。而人类棋手会说:“H7和H8相似,C3应该还是好点。”这种“举一反三”,就是函数近似(Function Approximation)要解决的。
核心思想:不再为每个(s,a)存独立Q值,而是用一个参数化函数$Q(s,a;\theta)$(如神经网络)来拟合Q*。θ是可训练参数,通过调整θ,让$Q(s,a;\theta)$逼近真实Q*(s,a)。这就像用一条光滑曲线拟合散点图,而不是画无数个孤立的点。
5.2 TD with Function Approximation:当梯度遇上贝尔曼误差
用函数近似后,TD更新不再是简单查表:
$$ \theta \leftarrow \theta + \alpha \left[ r_{t+1} + \gamma Q(s_{t+1},a_{t+1};\theta) - Q(s_t,a_t;\theta) \right] \nabla_\theta Q(s_t,a_t;\theta) $$
这个式子叫半梯度TD(Semi-gradient TD),关键在∇ₜₕₑₜₐ Q(sₜ,aₜ;θ)——它只对当前估计Q(sₜ,aₜ;θ)求导,而对Target $r_{t+1} + \gamma Q(s_{t+1},a_{t+1};\theta)$中的Q部分不求导(视为常数)。这是为保证收敛性做的妥协:若对Target也求导,会引入二阶导数,算法不稳定。
提示:这个“半梯度”设计是深度Q网络(DQN)成功的基石。它让神经网络能稳定地学习贝尔曼误差,而不被复杂的梯度流冲垮。
5.3 深度Q网络(DQN):四招绝技,驯服神经网络这只猛兽
原始Q-learning用神经网络直接拟合Q,会崩溃。DQN通过四大创新驯服它:
1. 经验回放(Experience Replay):
把每步交互$(s_t,a_t,r_{t+1},s_{t+1})$存入回放缓冲区,训练时随机采样batch。这打破数据时间相关性,让梯度更新更平稳——就像学生不按课本顺序刷题,而是打乱题库随机练,避免思维定势。
2. 目标网络(Target Network):
维护两个网络:主网络Q(s,a;θ)用于决策和计算TD Error;目标网络Q(s,a;θ⁻)用于生成Target:
$$ \text{Target} = r_{t+1} + \gamma \max_{a'} Q(s_{t+1},a';\theta^-) $$
θ⁻定期从θ复制,大幅降低Target抖动。这相当于考试时,老师批卷用的是上周的参考答案(θ⁻),而不是学生刚写的最新答案(θ),避免“自我抄袭”式震荡。
3. 截断奖励(Reward Clipping):
将所有r映射到[-1,1]区间。因神经网络对大数值敏感,且不同任务奖励尺度差异大(如雅达利游戏有+1000分奖励),截断后训练更鲁棒。
4. 双重DQN(Double DQN):
解决Q-learning的过高估计(overestimation)问题。普通Q-learning用同一网络选动作又评价值,易因噪声选错a'。Double DQN分离:用主网络选a',用目标网络评Q(sₜ₊₁,a'),更准。
# Double DQN核心片段(PyTorch风格) # 主网络选动作,目标网络评价值 next_q_values_target = target_net(next_state) # [batch, num_actions] next_q_values_online = online_net(next_state) # [batch, num_actions] next_actions = next_q_values_online.argmax(dim=1) # 主网选动作 next_q_target = next_q_values_target.gather(1, next_actions.unsqueeze(1)) # 目标网评价值 target_q = reward + gamma * next_q_target * (1 - done)5.4 策略梯度:当Q函数失效,为何要另起炉灶学π?
Q-learning在离散动作空间大放异彩,但遇到连续动作(如机器人关节扭矩、汽车油门开度)就卡壳——因为maxₐ Q(s,a)需穷举所有a,而连续空间a有无限多个。此时,策略梯度(Policy Gradient)登场:它不学Q,直接学策略π(a|s;θ),让参数θ控制动作分布。
核心思想:定义性能指标J(θ)(如期望回报),然后沿梯度∇ₜₕₑₜₐ J(θ)更新θ:
$$ \theta \leftarrow \theta + \alpha \nabla_\theta J(\theta) $$
REINFORCE算法给出梯度估计:
$$ \nabla_\theta J(\theta) = \mathbb{E}\pi \left[ \nabla\theta \log \pi(a|s;\theta) \cdot G_t \right] $$
即
本文还有配套的精品资源,点击获取