强化学习里常见的 VAE、MSE、CNN、RNN、GRU 到底是什么

写在前面:这篇先解决“见过但记不住”的问题

看强化学习、机器人学习、深度学习论文或代码时,经常会遇到这些词:

  • MSE
  • CNN
  • RNN
  • GRU
  • LSTM
  • VAE
  • AutoEncoder

它们有些是损失函数,有些是网络结构,有些是生成模型。如果只是背中文名,很容易混在一起。

这篇我想按一个更实用的方式整理:

它解决什么问题?数学上大概在算什么?在强化学习里通常出现在哪里?

先不追求把每个模型推导到最深,而是建立一个以后看代码和论文能快速定位的框架。

先用一张表建立直觉

名词 类型 主要解决什么问题 一句话记忆
MSE 损失函数 衡量预测值和真实值差多少 平方误差的平均值
CNN 网络结构 从图像、网格、局部结构中提特征 用卷积核扫图像
RNN 网络结构 处理序列数据 当前输出依赖过去记忆
GRU 网络结构 改进 RNN 的记忆能力 用门控决定记住多少
LSTM 网络结构 更强的长序列记忆 用输入门、遗忘门、输出门控制记忆
AutoEncoder 表征学习 把数据压缩再还原 学一个低维表示
VAE 生成模型 学习概率潜空间并生成样本 AutoEncoder + 概率分布约束

1. MSE:均方误差,最常见的回归损失

MSE 的全称是 Mean Squared Error,均方误差。

如果真实值是 yiy_i,预测值是 y^i\hat y_i,那么 MSE 写作:

MSE=1Ni=1N(yiy^i)2\mathrm{MSE}=\frac{1}{N}\sum_{i=1}^{N}(y_i-\hat y_i)^2

它的意思很直接:

  1. 每个样本算一次误差:yiy^iy_i-\hat y_i
  2. 把误差平方:(yiy^i)2(y_i-\hat y_i)^2
  3. 对所有样本取平均。

为什么要平方?

  1. 正误差和负误差不会互相抵消。
  2. 大误差会被放大,模型会更重视离谱预测。
  3. 数学上可导,优化起来方便。

在强化学习里,MSE 常见于 value function 的训练。

比如 critic 要预测状态价值 Vϕ(st)V_\phi(s_t),而训练目标是某个回报估计 V^t\hat V_t,那么可以写:

LV(ϕ)=1Nt(Vϕ(st)V^t)2L_V(\phi)=\frac{1}{N}\sum_t \left(V_\phi(s_t)-\hat V_t\right)^2

这里的直觉是:

critic 预测“这个状态未来大概能拿多少分”,MSE 用来惩罚预测值和目标回报之间的差距。

在 PPO 这类算法里,经常会看到 value loss,本质上就很接近 MSE。

2. CNN:卷积神经网络,擅长从图像或局部结构里提特征

CNN 编码流程

CNN 的全称是 Convolutional Neural Network,卷积神经网络。

它最常用于图像,因为图像有明显的局部结构:

  • 一个像素和周围像素有关。
  • 边缘、角点、纹理都是局部模式。
  • 同一种局部模式可能出现在图像不同位置。

普通全连接网络会把图像直接展平成一个很长的向量,这会丢掉很多空间结构。而 CNN 用卷积核在图像上滑动,提取局部特征。

二维卷积可以粗略写成:

Y(i,j)=mnX(i+m,j+n)K(m,n)Y(i,j)=\sum_m\sum_n X(i+m,j+n)K(m,n)

其中:

  • XX 是输入图像或特征图。
  • KK 是卷积核。
  • YY 是输出特征图。
  • i,ji,j 是当前位置。

可以把卷积核想象成一个小窗口:

输入图像:一大片像素
卷积核:一个 3x3 或 5x5 的小矩阵
操作:小矩阵在图像上滑动,每个位置算一次加权和

CNN 的几个重要概念:

局部连接

卷积核只看局部区域,不是一上来就连接整张图。

这符合图像直觉:边缘、角点、纹理通常都是局部形成的。

参数共享

同一个卷积核会在整张图上滑动。

这意味着:

同一个特征检测器可以在不同位置复用。

比如一个检测“竖直边缘”的卷积核,不管边缘在左上角还是右下角,都可以检测到。

池化 pooling

池化用于降低分辨率,保留主要信息。

常见最大池化:

Y(i,j)=max(m,n)ΩX(i+m,j+n)Y(i,j)=\max_{(m,n)\in \Omega}X(i+m,j+n)

直觉:

在一个小区域里,只保留最明显的特征响应。

在强化学习里,CNN 常见于视觉输入任务,例如:

  • Atari 游戏。
  • 机器人相机图像输入。
  • 深度图、地形高度图。
  • occupancy map / height map。

如果 policy 输入是图像,通常会先用 CNN 提取视觉特征,再接 MLP 输出 action。

3. RNN:循环神经网络,用隐藏状态记住过去

RNN/GRU 记忆结构

RNN 的全称是 Recurrent Neural Network,循环神经网络。

它适合处理序列数据,例如:

  • 时间序列。
  • 语言文本。
  • 机器人传感器历史。
  • 部分可观测环境中的 observation history。

普通 MLP 每次只看当前输入:

yt=f(xt)y_t=f(x_t)

而 RNN 会维护一个隐藏状态 hth_t

ht=f(Wxxt+Whht1+b)h_t=f(W_xx_t+W_hh_{t-1}+b)

yt=g(Wyht)y_t=g(W_yh_t)

这里最关键的是 ht1h_{t-1}

它表示:

当前隐藏状态不仅由当前输入 xtx_t 决定,也由上一时刻的记忆 ht1h_{t-1} 决定。

所以 RNN 的结构可以理解成:

x1 → h1 → y1

x2 → h2 → y2

x3 → h3 → y3

RNN 在强化学习里很有用,因为很多任务不是完全可观测的。

比如四足机器人 policy 当前只能看到:

  • IMU。
  • 关节角。
  • 关节速度。
  • 上一帧动作。

但它可能看不到:

  • 地面摩擦系数。
  • 精确接触状态。
  • 外部扰动。
  • 过去几帧发生了什么。

这时候 RNN 可以用历史观测形成一个“内部记忆”。

但是普通 RNN 有一个问题:长序列训练时容易梯度消失或梯度爆炸。

4. GRU:带门控的 RNN,学会选择性记忆和遗忘

GRU 的全称是 Gated Recurrent Unit,门控循环单元。

它是 RNN 的改进版。普通 RNN 每一步都直接更新隐藏状态,GRU 则增加了“门”来决定:

  1. 过去的记忆保留多少。
  2. 当前的新信息写入多少。

GRU 的核心公式常见写法是:

zt=σ(Wzxt+Uzht1+bz)z_t=\sigma(W_zx_t+U_zh_{t-1}+b_z)

rt=σ(Wrxt+Urht1+br)r_t=\sigma(W_rx_t+U_rh_{t-1}+b_r)

h~t=tanh(Whxt+Uh(rtht1)+bh)\tilde h_t=\tanh(W_hx_t+U_h(r_t\odot h_{t-1})+b_h)

ht=(1zt)ht1+zth~th_t=(1-z_t)\odot h_{t-1}+z_t\odot \tilde h_t

这里:

  • ztz_t 是 update gate,更新门。
  • rtr_t 是 reset gate,重置门。
  • h~t\tilde h_t 是候选隐藏状态。
  • \odot 表示逐元素相乘。
  • σ\sigma 是 sigmoid 函数,输出范围在 0 到 1。

怎么理解这些门?

更新门 ztz_t

ztz_t 决定新信息写入多少。

如果 ztz_t 接近 0:

htht1h_t \approx h_{t-1}

说明主要保留旧记忆。

如果 ztz_t 接近 1:

hth~th_t \approx \tilde h_t

说明更多采用新信息。

重置门 rtr_t

rtr_t 决定在计算候选状态时,过去记忆参与多少。

如果 rtr_t 接近 0,说明计算新候选状态时,基本忽略过去。

如果 rtr_t 接近 1,说明过去记忆完整参与。

GRU 的一句话理解:

它不是每一步都粗暴覆盖记忆,而是学会什么时候记、什么时候忘。

在强化学习里,GRU 常见于 recurrent policy / recurrent critic。

比如 policy 可以写成:

ht=GRU(ot,ht1)h_t=\mathrm{GRU}(o_t,h_{t-1})

at=π(ht)a_t=\pi(h_t)

这里 policy 不只是根据当前观测 oto_t 输出动作,而是根据带历史信息的隐藏状态 hth_t 输出动作。

5. LSTM:另一种更经典的门控循环网络

LSTM 的全称是 Long Short-Term Memory。

它和 GRU 目标类似:解决普通 RNN 长序列记忆困难的问题。

LSTM 比 GRU 多维护了一个 cell state,通常记作 ctc_t

常见公式是:

ft=σ(Wfxt+Ufht1+bf)f_t=\sigma(W_fx_t+U_fh_{t-1}+b_f)

it=σ(Wixt+Uiht1+bi)i_t=\sigma(W_ix_t+U_ih_{t-1}+b_i)

ot=σ(Woxt+Uoht1+bo)o_t=\sigma(W_ox_t+U_oh_{t-1}+b_o)

c~t=tanh(Wcxt+Ucht1+bc)\tilde c_t=\tanh(W_cx_t+U_ch_{t-1}+b_c)

ct=ftct1+itc~tc_t=f_t\odot c_{t-1}+i_t\odot \tilde c_t

ht=ottanh(ct)h_t=o_t\odot \tanh(c_t)

这里:

  • ftf_t 是 forget gate,遗忘门。
  • iti_t 是 input gate,输入门。
  • oto_t 是 output gate,输出门。
  • ctc_t 是长期记忆单元。
  • hth_t 是当前输出隐藏状态。

和 GRU 相比:

  • LSTM 结构更复杂。
  • 参数更多。
  • 记忆能力强,但计算更重。
  • GRU 更简洁,经常在工程里也很好用。

粗略记忆:

RNN:有记忆,但容易忘太快或训练不稳。
GRU:用两个门控制记忆。
LSTM:用三个门和 cell state 控制记忆。

6. VAE:变分自编码器,学习一个概率潜空间

VAE 潜空间示意图

VAE 的全称是 Variational AutoEncoder,变分自编码器。

它比普通 AutoEncoder 多了一个重要思想:

不只是把输入压缩成一个确定向量,而是压缩成一个概率分布。

普通 AutoEncoder 是:

z=fθ(x)z=f_\theta(x)

x^=gϕ(z)\hat x=g_\phi(z)

VAE 则是:

qθ(zx)=N(μθ(x),σθ2(x))q_\theta(z|x)=\mathcal{N}(\mu_\theta(x),\sigma_\theta^2(x))

也就是说,encoder 不直接输出一个 zz,而是输出:

  • 均值 μ\mu
  • 方差 σ2\sigma^2

然后从这个分布里采样:

zqθ(zx)z\sim q_\theta(z|x)

再用 decoder 重建:

x^=gϕ(z)\hat x=g_\phi(z)

VAE 的损失通常由两部分组成:

L=Lrecon+LKLL = L_{\mathrm{recon}} + L_{\mathrm{KL}}

第一项是重建损失:

Lrecon=xx^2L_{\mathrm{recon}}=\lVert x-\hat x\rVert^2

它要求 decoder 尽量还原输入。

第二项是 KL 散度:

LKL=DKL(qθ(zx)p(z))L_{\mathrm{KL}}=D_{\mathrm{KL}}(q_\theta(z|x)\|p(z))

它要求学到的潜空间分布不要太乱,通常希望接近标准正态分布:

p(z)=N(0,I)p(z)=\mathcal{N}(0,I)

直觉上:

  • 重建损失负责“像不像”。
  • KL 散度负责“潜空间规不规整”。

如果没有 KL 约束,latent space 可能很碎,随机采样出来的 zz 不一定能生成合理数据。

有了 KL 约束后,VAE 更像一个生成模型:

从 N(0, I) 采样 z → decoder → 生成一个样本

在强化学习里,VAE 可能出现在:

  1. 从高维 observation 学低维 latent state。
  2. 世界模型 world model。
  3. 从图像中提取紧凑状态表示。
  4. 模仿学习或离线 RL 中学习行为/轨迹分布。
  5. 表示不确定性。

比如视觉强化学习里,原始图像很大,可以先用 VAE 压缩成 latent:

zt=Encoder(ot)z_t=\mathrm{Encoder}(o_t)

然后 policy 使用 ztz_t 而不是原始图像:

at=π(zt)a_t=\pi(z_t)

7. AutoEncoder:先理解 VAE 的普通版本

AutoEncoder 可以看成 VAE 的前置概念。

它由两部分组成:

输入 x → Encoder → latent z → Decoder → 重建 x_hat

数学上:

z=fθ(x)z=f_\theta(x)

x^=gϕ(z)\hat x=g_\phi(z)

训练目标通常是让 x^\hat x 尽量接近 xx

L=xx^2L=\lVert x-\hat x\rVert^2

也就是一个重建 MSE。

它的作用不是分类,而是学习一个压缩表示。

比如输入是一张深度图,AutoEncoder 可以把它压缩成一个低维向量:

深度图 64x64 → latent vector 32维

然后这个 latent vector 可以给 policy 使用。

AutoEncoder 和 VAE 的区别:

模型 latent 是什么 是否方便生成
AutoEncoder 确定向量 不一定
VAE 概率分布采样 更方便

8. 它们在强化学习里通常出现在哪里

MSE 在哪里出现

MSE 常用于训练 value function 或 dynamics model。

例如:

LV=(V(st)V^t)2L_V=\left(V(s_t)-\hat V_t\right)^2

或者预测下一状态:

L=s^t+1st+12L=\lVert \hat s_{t+1}-s_{t+1}\rVert^2

CNN 在哪里出现

CNN 用于处理视觉输入:

image / depth / height map → CNN → feature vector → policy

比如机器人看到深度图,CNN 先提取地形特征,再让 policy 决定关节目标。

RNN / GRU / LSTM 在哪里出现

它们用于处理历史信息:

observation sequence → recurrent network → hidden state → action

在 POMDP 问题里特别常见。

POMDP 的意思是:policy 看不到完整 state,只能看到 observation。

这时历史信息很重要:

ht=f(ot,ht1)h_t=f(o_t,h_{t-1})

at=π(ht)a_t=\pi(h_t)

VAE 在哪里出现

VAE 用于学习 latent representation:

高维观测 → VAE encoder → 低维 latent → policy / world model

或者:

latent z → decoder → 生成可能的观测或轨迹

9. 一个简单记忆框架

我觉得可以按“输入是什么、输出是什么”来记。

MSE

输入:预测值和目标值
输出:一个损失数字
用途:训练模型更接近目标

CNN

输入:图像 / 网格数据
输出:特征图或特征向量
用途:提取空间局部特征

RNN / GRU / LSTM

输入:当前观测 + 过去隐藏状态
输出:新的隐藏状态
用途:处理时间序列和历史记忆

AutoEncoder / VAE

输入:高维数据
输出:低维 latent,再重建原数据
用途:学习压缩表示或生成模型

10. 容易混淆的地方

MSE 不是网络结构

MSE 是 loss,不是一个模型。

它不能“提特征”,只能告诉模型预测得好不好。

CNN 不一定只用于图片

CNN 最常用于图片,但只要数据有局部结构,也可能用 CNN。

例如:

  • 高度图。
  • occupancy grid。
  • 一维时间信号。
  • 局部地形 patch。

RNN、GRU、LSTM 不是强化学习算法

它们只是神经网络结构。

PPO、SAC、DDPG 这些才是强化学习算法。

你可以有:

PPO + MLP policy
PPO + CNN policy
PPO + GRU policy
SAC + CNN encoder

也就是说:

强化学习算法负责怎么优化策略,网络结构负责怎么表示策略或价值函数。

VAE 不是普通分类器

VAE 重点不是分类,而是学习 latent distribution。

它更关心:

  1. 能不能重建输入。
  2. latent space 是否规整。
  3. 能不能从 latent space 采样生成合理数据。

总结

这几个名词可以这样记:

MSE:衡量预测和目标差多少。
CNN:从图像或局部结构中提空间特征。
RNN:用隐藏状态记住过去。
GRU:用门控机制改进 RNN,选择性记忆和遗忘。
LSTM:更复杂的门控记忆结构,适合长序列。
AutoEncoder:把高维输入压缩成 latent,再重建。
VAE:让 latent 变成概率分布,既能压缩也能生成。

放到强化学习里:

observation → encoder(CNN/VAE/MLP/RNN) → feature/hidden state → policy → action
value target / reconstruction target → MSE 等 loss → 更新网络参数

我现在的理解是:

强化学习里很多看起来吓人的名词,其实可以拆成两类:一类是“用什么网络表示”,一类是“用什么损失训练”。先分清这两类,读论文和代码会轻松很多。

algorithms axis-angle bode calibration chrome cmake cmakelists cnn colcon conan control cpp cpu d435i data_struct db design-pattern dots economics eigen factory-pattern fcpx figure finance forge fov gazebo gdb git gnu ibus interest isaac gym isaaclab kdl latex launch learning-notes legged locomotion legged-robot life linux mac math matlab matrix memory mlp money motor moveit mpc network ocs2 ode operator optimal algorithm optimal-control perf performance personal-finance ppo profiling python qos realsense rnn robot robotics ros ros2 rtb security shell simulation stl thread tools twist ubuntu uml unitree urdf vae valgrind vcxsrv velocity vim web wifi work wsl 中文输入 交叉编译 依赖管理 分支管理 四足机器人 强化学习 机器人视觉 构建系统 深度学习 深度相机 点云 版本控制 神经网络 输入法 配置类
知识共享许可协议