A3C 算法原理与超级马里奥实践(上)

1. AC 算法

1.1 策略梯度

在强化学习中,如果我们想让智能体学会这样一个 策略(在不同状态下选什么动作):

  • 一个动作能带来高奖励,就要让它以后更可能被选上
  • 一个动作只能带来低回报,就要减少使用它的频率

而策略梯度就是一个这样的工具,“根据奖励信号,调整策略参数,让好动作更可能被选中,坏动作少被选上。”

策略梯度,为什么要加上“梯度”?
因为我们的目标是如何最大化期望奖励:$J(\theta) = \mathbb{E}{\pi\theta}[R]$。这就像爬山——目标是爬到“最大奖励”的山顶,梯度就是指引方向的指南针:告诉我们“往哪个方向改策略,奖励会变大”。

策略梯度的公式:
$$\nabla_\theta J(\theta) = \mathbb{E}{\pi\theta}\Big[\nabla_\theta \log \pi_\theta(a|s) \cdot Q^\pi(s,a)\Big]$$

  • $\nabla_\theta \log \pi_\theta(a|s)$:表示如果我要让动作 $a$ 在状态 $s$ 下更常出现,参数该怎么调整?简单来说就是一个方向提示
  • $Q^\pi(s,a)$:这个动作到底值不值得?也就是动作的分数

整个公式的意思是:调整参数,让高价值动作出现概率上升,低价值动作出现概率下降。

1.2 奖励期望

在强化学习中,每次智能体执行动作,环境会给出一个奖励 $r$

  • 累积奖励 $R$ :一条轨迹(episode)里所有奖励的总和,或者折扣累积总和
  • 奖励期望:按照当前策略 $\pi$ 执行动作,智能体在长期平均下来可以获得的奖励的期望值

用公式表示为:$J(\theta) = \mathbb{E}{\pi\theta}[R]$
意思就是:如果按照策略 $\pi_\theta$ 玩很多次游戏,平均每次能得到多少奖励
举个例子,就像某人每天做菜会选择不同食谱,而奖励就是吃的满意度,如果后面一周一直按某种做菜策略选择食谱,奖励期望就是这一周的总满意度 / 7。

1.3 Baseline 的引入与 Critic 的作用

策略梯度里,如果动作 $a$ 的回报 $Q^\pi(s,a)$ 高,就增加它的概率,如果回报低,就减少它的概率。
但问题是如果$Q^\pi(s,a)$ 的数值波动大(高方差),训练就会变得很不稳定。比如某人今天心情好奖励高,明天环境差奖励低,这样就会导致梯度的更新方向乱跳。

为了让更新更稳定,我们引入一个 基准线(baseline),公式变为:
$$\nabla_\theta J(\theta) = \mathbb{E}{\pi\theta}\big[ \nabla_\theta \log \pi_\theta(a|s) \cdot (Q^\pi(s,a) - V^\pi(s)) \big]$$
这里的 baseline 最常用就是 状态值函数 $V^\pi(s)$。

  • $Q^\pi(s,a)$:在状态 $s$ 下,选择动作 $a$ 的概率分布,然后按照策略 $\pi$ 继续执行,能得到的 长期累计奖励的期望,Q 值并不是在算概率,而是在算 某个具体动作一旦发生后的表现
  • $V^\pi(s)$:在当前状态下,不指定动作,平均水平的表现
  • 两者相减 $(Q^\pi(s,a) - V^\pi(s))$:就是“动作 $a$ 相比平均水平,到底好多少或差多少”

这样一来,如果动作比平均水平好 → 增加概率,如果动作比平均水平差 → 降低概率,如果差不多 → 不用大幅调整。这样的更新更有针对性,方差也大大降低。

以上策略也是Actor-Critic 架构的由来:

  • Actor(演员):负责学策略 $\pi_\theta(a|s)$,输出“我下一步该怎么做”,像一个舞台演员,他想尝试各种表演动作(策略)
  • Critic(评论家):负责学状态值函数 $V^\pi(s)$,用作 baseline,给 Actor 一个“基准参考”,像观众/评论家,给出“这个动作比一般水平好/差多少”的评价

有了 Critic 的反馈,Actor 就能更稳定地提升自己的表现。

原始策略梯度只看“绝对奖励” → 学习抖动大,而引入 baseline 让更新看“相对奖励” → 更平稳。Critic 的任务就是提供这个 baseline(通常是 $V^\pi(s)$)。
所以 Actor-Critic 的本质就是:Actor 负责决策,Critic 负责评价,二者协作使得学习更快更稳。

1.4 Q 值与回报的近似关系

在强化学习里,Q 值 $Q^\pi(s,a)$ 的意思是在状态 $s$ 下执行动作 $a$,然后继续按照策略 $\pi$ 行动,能得到的 长期累计奖励的期望。但问题是,这个“长期累计奖励”通常需要跑完整条轨迹(可能很长)才能算出来,在实际应用中(比如玩游戏、机器人控制),这样做代价太大。

于是,有人想了个聪明的办法:不用看那么远,先近似一下
公式:
$$Q^\pi(s,a) \approx r(s,a) + \gamma V^\pi(s’)$$
你在 $s$ 状态下做了动作 $a$,立刻得到了一个 即时奖励 $r(s,a)$,然后环境跳转到新状态 $s’$,在这个新状态下,你还能继续获得未来的奖励,未来的奖励我们就用 Critic 学到的 状态值函数 $V^\pi(s’)$ 来估计,折扣因子 $\gamma$ 表示“未来的奖励要打点折扣,因为不确定性更大”。
换句话说:Q 值 ≈ 当前得到的奖励 + 未来可能奖励的估计

打个比方,想象你投资一个项目:今天投进去 100 块(即时奖励),明天这个项目的价值取决于市场行情(下一个状态的价值),你关心的不是仅仅今天的收益,而是 今天赚多少 + 明天可能的未来价值,但未来越远越不确定,所以要打折($\gamma$)。

这样做的好处是不用等完整一局游戏打完再更新,可以 在线学习,这样更新速度会更快,更符合实际应用(比如实时决策)。这其实就是 时序差分(Temporal Difference, TD)方法 的核心思想。

1.5 优势函数的定义与意义

优势函数定义:
$$A^\pi(s,a) = Q^\pi(s,a) - V^\pi(s)$$

  • $Q^\pi(s,a)$:表示“在状态 $s$ 下,做动作 $a$,然后继续执行策略 $\pi$,能得到的总回报”
  • $V^\pi(s)$:表示“在状态 $s$ 下,按照策略 $\pi$ 的平均水平,能得到的总回报”

所以,$A^\pi(s,a)$ 就是 动作 $a$ 相比平均水平,到底好多少或差多少

想象一个同学在学校里考试,考了 90 分(对应 $Q^\pi(s,a)$),班级平均分是 85 分(对应 $V^\pi(s)$),那么他的优势就是 90 - 85 = +5。如果另一个同学考了 70 分,相比平均分 85,他的优势就是 70 - 85 = -15。所以 优势函数本质上就是一个“相对好坏的评价标准”

在策略梯度更新里,原始版本用的是 $Q^\pi(s,a)$,但有问题,它只告诉你动作的“绝对表现”,没告诉你“相对表现”。
举个例子:假设某状态下所有动作回报都很高(环境奖励普遍高),那你更新时可能会把所有动作概率都加大,其实没有意义。
引入优势函数后,就变成了只关心某个动作比“平均水平”好多少。好就增加概率,差就减少概率,如果差不多,就别乱调。这样更新方向更精准,学习更高效。

策略梯度的最终公式:
$$\nabla_\theta J(\theta) = \mathbb{E}{\pi\theta}\big[ \nabla_\theta \log \pi_\theta(a|s) \cdot A^\pi(s,a) \big]$$

  • $\nabla_\theta \log \pi_\theta(a|s)$:如果要多做这个动作,应该怎样调整参数
  • $A^\pi(s,a)$:这个动作值得多做还是少做

合起来就是:往“有优势”的动作方向调整策略

优势函数衡量了“一个动作相对于平均水平的好坏”,它让策略更新更精准、更稳定,是 Actor-Critic 系列算法的核心工具。

1.6 Actor 与 Critic 的分工

  • Actor:根据策略 $\pi_\theta$ 选择动作,并通过梯度更新策略。
  • Critic:估计状态值函数 $V^\pi(s)$,帮助构造 baseline,从而降低方差。
  • 优势函数 $A(s,a)$:把 Actor 的学习信号调节成“比平均水平好多少”,让训练更加高效。

我们想最大化回报 $\mathbb{E}[R]$,于是引出 策略梯度方法,但带来了一个方差太大的问题。为了解决方差太大、训练不稳定的问题,自然引出了 Critic 的角色。Critic 通过学习状态值函数 $V^\pi(s)$,作为一个 baseline,帮助我们在更新策略时不直接依赖高方差的 $Q^\pi(s,a)$。进一步地,借助近似关系 $Q^\pi(s,a) \approx r + \gamma V^\pi(s’)$,Critic 估计的 $V$ 还能被用来间接构造 $Q$,从而让 Actor 的更新既可计算、又更稳定。

2. 优势函数深入解析

在前面我们已经聊过策略梯度、baseline 以及 Actor-Critic,现在再看看 优势函数(Advantage Function) 。它其实是 Actor-Critic 中的一个关键工具,帮助我们判断 某个动作到底值不值得选

2.1 优势函数的定义

$$A^\pi(s,a) = Q^\pi(s,a) - V^\pi(s)$$

  • $Q^\pi(s,a)$:在状态 $s$ 下执行动作 $a$,然后继续按照策略 $\pi$ 行动,能拿到的长期累计奖励的期望。可以理解为:“这个动作的绝对表现”
  • $V^\pi(s)$:在状态 $s$ 下,不管选什么动作,按照策略 $\pi$ 的整体水平,能拿到的平均回报。可以理解为:“这个状态下的平均水平”

于是,优势函数就是:“某个动作的表现” - “当前状态的平均表现”。

2.2 Q 的近似

在实际计算中,Q 值不好直接估。怎么办?
我们可以用 一步回报加上后续状态的价值 来近似:
$$Q^\pi(s,a) \approx r(s,a) + \gamma V^\pi(s’)$$
意思是:这次动作拿到的即时奖励 + 后续状态的价值折扣

2.3 优势函数的近似

把上面这个近似放进优势函数里:
$$A^\pi(s,a) \approx r(s,a) + \gamma V^\pi(s’) - V^\pi(s)$$
看出来没?我们只需要知道:

  • 当前的即时奖励 $r(s,a)$
  • 下一步的价值 $V^\pi(s’)$
  • 当前的价值 $V^\pi(s)$

就能估出来优势函数。

这意味着我们根本不需要再去训练一个庞大的 Critic 来估 Q。只要 Critic 能学好 $V(s)$,我们就能间接得到 $Q$ 和 $A$。这就极大降低了复杂度。因为 $V(s)$ 只跟状态有关,估计起来比 $Q(s,a)$ (既依赖状态又依赖动作)要简单得多。

3. A3C 中的计算流程

3.1 数据采集与轨迹生成

A3C 的核心思想之一是 多线程异步采集数据,即每个线程(worker)在环境里独立运行自己的 Actor,按照当前策略 π 采样动作。线程不断生成 状态-动作-奖励序列(trajectory),比如:$s_0, a_0, r_0, s_1, a_1, r_1, …, s_T$

异步采样优势:

  1. 提高训练效率
  2. 避免单线程样本相关性太强导致训练不稳定
  3. 不同线程探索不同策略,增加策略多样性

3.2 优势函数计算(近似化原因)

前面讲过优势函数 $A^\pi(s,a) \approx r + \gamma V(s’) - V(s)$,可以理解为:“这次动作比平均水平多拿了多少分”。

如果只用一步回报,优势函数可能 噪声大,因为单步奖励可能波动很大。例如,你走了一步,突然踩到陷阱,$r$ 很小,但后续可能有大回报,单步估计会误导 Actor,策略更新不稳定。
n-step 回报就是折中方案:既考虑了短期奖励,也引入了未来价值的估计。公式是:
$$R_t^{(n)} = r_t + \gamma r_{t+1} + \dots + \gamma^{n-1} r_{t+n-1} + \gamma^n V(s_{t+n})$$
然后优势函数用它计算:$A(s_t, a_t) = R_t^{(n)} - V(s_t)$

3.3 双网络更新(Actor + Critic)

3.3.1 Actor 更新:学会选好动作

公式:$L_\text{actor} = - \log \pi(a|s) \cdot A(s,a)$
Actor 的任务就是学会策略 $π(a|s)$,让“好动作”更容易被选。
我们用优势函数 $A(s,a)$ 来告诉 Actor:

  • A > 0 → 这个动作比平均水平好 → 提高它被选的概率
  • A < 0 → 这个动作比平均水平差 → 降低它被选的概率

3.3.2 Critic 更新:学会评估状态

公式:$L_\text{critic} = (R - V(s))^2$
Critic 负责估计状态价值 $V(s)$,告诉 Actor “当前状态的平均表现是多少”。
更新目标是尽量让 $V(s)$ 接近实际的 n-step 回报 R(即未来奖励的估计值)。

3.3.3 Actor + Critic 共享主干网络

共享主干网络:卷积层或全连接层,用来提取状态特征,好处是避免重复计算,提升效率。
两条分支

  1. Actor 分支:输出动作概率 $π(a|s)$
  2. Critic 分支:输出状态价值 $V(s)$

优势:状态表示一致,Actor 和 Critic 可以互相辅助;Critic 提供优势函数给 Actor,Actor 产生的策略又反过来指导 Critic 更新。

3.4 稳定性问题与解决方案

A3C 的训练本质是异步更新,可能出现:

  • 梯度噪声大:多个线程同时更新全局网络
  • 策略崩塌:Actor 在探索不足或优势估计不稳定时,策略可能退化

解决方案:

  1. 异步多线程:各线程采样不同轨迹,互相平均梯度,减小方差
  2. 优势函数减方差:用 $V(s)$ 做 baseline
  3. 熵正则化(Entropy Regularization):鼓励策略保持一定随机性,避免过早收敛$L_\text{entropy} = -\beta \sum_a \pi(a|s) \log \pi(a|s)$

A3C 就像多个小队同时在不同战场打仗,各自收集战况(数据),把战况汇报给总部(全局网络)更新策略。Critic 提供参考评分(优势函数),n-step 回报让评分更稳,熵正则保证队伍不太偏激。

4. A3C 整体架构

4.1 与 AC 的关系

  • AC(Actor-Critic):单线程版本,Actor 负责策略 $π$,Critic 负责状态价值 $V(s)$。
  • A3C(Asynchronous Advantage Actor-Critic):在 AC 的基础上有两个关键增强:
    1. Asynchronous(异步):引入多线程异步更新,同时启动多个 本地 Actor-Critic 线程,每个线程在自己环境里采集数据,然后把梯度异步更新到全局网络;
    2. Advantage(优势函数):不用直接学习 $Q(s,a)$,而是通过 $A(s,a) = Q(s,a) - V(s)$ 来衡量动作相对好坏,从而降低方差、提升训练稳定性。

A3C = “多人同时玩游戏,每个人自己练,同时把经验汇报给总部”,而 AC 只能一个人玩。

4.2 全局网络 vs 本地网络

A3C 有两个层次的网络:

  1. 全局网络(Global Network),负责存储全局的策略 $π$ 和状态价值 $V(s)$,接收各线程上传的梯度,更新权重,充当“策略大脑”或总部
  2. 本地网络(Local Network),每个线程有自己一份副本,用于与环境交互采样,采集完数据后计算梯度,然后异步发送给全局网络,最后更新后同步全局网络的参数,保证策略一致

全局网络是总部,本地网络是各个分队,每个分队都在前线收集信息、训练经验,然后把梯度发回总部,总部更新策略后再下发给各分队。

4.3 异步更新流程

整体流程可以拆成四步:

  1. 采集:每个线程独立与环境交互,生成 状态-动作-奖励序列
  2. 梯度计算:用采集到的轨迹计算优势函数 $A(s,a)$,得到 Actor/Critic 的梯度
  3. 异步更新:把梯度发送给全局网络,更新全局策略和价值网络
  4. 同步:本地线程把更新后的全局网络参数同步回来,继续采集下一轮数据

就像“前线特工 → 发送报告 → 总部更新策略 → 特工拿到新指令再行动”,循环往复。

4.4 多智能体并行的好处

  1. 降低样本相关性:单线程 AC 连续采样的数据强相关,容易导致训练不稳定,多线程采样的数据彼此独立或弱相关,梯度更新更稳健
  2. 提升策略探索能力:每个线程探索不同状态、动作,能发现更多策略组合,避免单线程陷入局部最优

5. A3C 的损失函数

5.1 策略损失(Policy Loss)

公式:$L_{policy} = - \log \pi(a|s) \cdot A(s,a)$
作用:让 Actor 学会选“好动作”,放大优势动作的概率,抑制劣势动作。

  • 优势函数 $A(s,a)$ > 0 → 这个动作比平均水平好 → Actor 提高被选概率
  • 优势函数 $A(s,a)$ < 0 → 动作比平均水平差 → Actor 降低被选概率

Actor 就像一个决策者,优势函数是评分表。好动作分数高 → 多用,坏动作分数低 → 少用。

5.2 价值损失(Value Loss)

公式:$L_{value} = (R - V(s))^2$
作用:让 Critic 学会准确预测状态价值 V(s),学会打分,减小估计误差。

  • Critic 给每个状态打分,R 是 n-step 回报的真实估计
  • V(s) 是 Critic 的预测
  • 损失函数是 MSE(均方误差),优化 V(s) 逼近真实回报

Critic 是裁判,价值损失是校准评分表,让评分更准确,只有评分准确了,Actor 才能根据优势函数判断动作优劣。

5.3 熵损失(Entropy Loss)

公式:$L_{entropy} = -\sum_a \pi(a|s) \log \pi(a|s)$
作用:鼓励策略保持一定随机性,避免过早收敛到单一动作。

  • 如果策略过于确定(概率几乎集中在一个动作),探索能力下降
  • 加入熵正则项,让策略保持多样性,提高探索能力

熵损失就像给 Actor 一个“小小的冒险精神”,提醒它偶尔尝试新动作,不要只走老路。

5.4 总体损失公式

综合三项损失:$L = L_{policy} + \alpha L_{value} + \beta L_{entropy}$

  • α:控制价值损失的重要性
  • β:控制熵正则的重要性

总损失就是三者的平衡,既保证策略学习正确,又让策略稳定且有探索性。

6. 总结

本文主要讲了 Actor-Critic (AC) 框架及其高效实现——Actor + Critic (A3C) 算法。核心内容可概括为以下几点:

6.1 ​策略梯度与基线(Baseline)的引入​

策略梯度的核心思想是通过梯度上升,调整策略参数,增加高回报动作的概率,减少低回报动作的概率,以最大化期望累积奖励。
直接使用动作价值 $Q^\pi(s,a)$ 进行更新会导致高方差,训练不稳定。引入状态价值函数 $V^\pi(s)$ 作为基线(Baseline),将更新基准从“绝对奖励”变为“相对优势”(即 $A^\pi(s,a) = Q^\pi(s,a) - V^\pi(s)$),显著降低了方差,使学习过程更平稳、高效。

6.2 ​Actor-Critic 架构的分工​

Actor(行动者)​​:负责执行策略 $\pi_\theta(a|s)$,并根据优势函数的信号更新策略,决定“如何行动”。
Critic(评论者)​​:负责评估状态价值 $V^\pi(s)$,提供基线,并计算优势函数,扮演“评价者”的角色。
两者协作,形成了“行动-评价-更新”的闭环,这是AC系列算法的基石。

6.3 ​优势函数(Advantage Function)的核心作用​

优势函数 $A^\pi(s,a)$ 量化了特定动作相对于该状态下平均水平的优劣程度
再通过时序差分(TD)思想,其计算被近似为 $A^\pi(s,a) \approx r(s,a) + \gamma V^\pi(s’) - V^\pi(s)$。这意味着只需训练一个估计 $V(s)$ 的Critic网络,即可同时得到$Q$值和优势函数,大大简化了架构和训练难度。

6.4 A3C 算法的异步并行架构与创新​

A3C 在AC基础上引入了多线程异步并行的框架。每个线程拥有一个本地网络与环境交互、采集数据、计算梯度。 一个全局网络作为中央大脑,异步接收并聚合所有线程的梯度进行更新,随后将更新后的参数同步给各线程。

这种架构带来了两大核心优势:

  1. 数据来源多样化,降低了样本相关性,使训练更稳定
  2. 效率极大提升,通过并行探索加快了学习速度

6.5 A3C 的损失函数与稳定化技术​

A3C的优化目标是一个综合损失函数,包含三项:

  • 策略损失 ($L_{policy}$)​​:引导Actor根据优势函数优化策略
  • 价值损失 ($L_{value}$)​​:训练Critic更准确地估计状态价值
  • 熵正则项 ($L_{entropy}$)​​:鼓励探索,防止策略过早收敛到局部最优,是保障算法稳定性和性能的关键技术

总而言之,从策略梯度到AC,再到A3C,其演进脉络清晰:​为了更稳定、更高效地求解强化学习问题。A3C通过优势函数解决了AC的方差问题,通过异步并行框架解决了效率和探索问题,通过熵正则化等技巧确保了稳定性,成为深度强化学习发展史上一个里程碑式的高效算法。