序列模型
PointNet++
PointNet Weakness
PointNet 直接处理无序点集。其基本流程是:
- 输入点云坐标 。
- 对每个点独立使用共享 MLP,得到逐点 latent feature。
- 对所有点特征做 Max Pooling,得到全局特征。
- 用全局特征完成 classification,或与逐点特征拼接后完成 segmentation。
其核心优势是 permutation invariance(置换不变性)。由于点云是集合而不是序列,点的输入顺序不应影响最终结果。PointNet 通过共享 MLP 和对称池化函数实现这一性质。
但 PointNet 的主要问题是缺少局部几何建模。 每个点本质上只经过 single-point receptive field 的 处理,随后直接全局 pooling。 这类似于对图像中每个像素独立做 conv 后直接全局池化,难以捕捉局部结构。
注:点云的 坐标本身携带空间位置信息,因此 PointNet 在一些任务上仍然有效;但当任务依赖局部形状、曲面结构或 part-level pattern 时,仅靠单点特征明显不足。
PointNet++ Motivation
PointNet++ 的基本思想是:在局部区域内递归应用 PointNet,从而实现层级化点集特征学习。
它希望同时满足三类性质:
- Hierarchical feature learning:从 local feature 到 part-level feature,再到 global feature。
- Local translation invariance:局部几何特征应尽量不受局部区域整体平移影响。
- Permutation invariance:每个局部点集内部仍然是无序集合。
相比 PointNet 直接从单点跳到全局,PointNet++ 更接近 CNN 的层级 receptive field:低层聚合小邻域,高层聚合更大尺度的结构。
Local Neighborhood Features
PointNet++ 需要先为每个中心点定义局部邻域。常见方法包括 KNN 和 Ball Query。
| 方法 | 定义 | 优点 | 局限 |
|---|---|---|---|
| KNN | 选取距离最近的 个点 | 点数固定,便于批处理 | 几何范围随点密度变化 |
| Ball Query | 选取半径 球内的点 | 几何尺度固定,符合局部感受野 | 点数不固定 |
PointNet++ 通常采用 Ball Query。球半径是超参数,表示局部区域的空间尺度。为了便于 GPU 并行,实际实现会限制每个球最多取 个点:
- 若球内点数大于 ,随机采样 个点。
- 若球内点数小于 ,重复复制部分点补足。
- 重复点不会影响 PointNet 的 max pooling 结果。
注:Ball Query 固定的是几何尺度,而不是点数。这使得局部特征更像 CNN 中固定大小的 receptive field。
Set Abstraction Layer
Set Abstraction Layer 是 PointNet++ 的核心模块,可理解为点云上的“降采样 + 局部特征提取”。
Pipeline:
- Sampling:使用 Farthest Point Sampling(FPS)从原始点集中选择中心点,使采样点尽可能覆盖整体几何轮廓。
- Grouping:以每个中心点为球心做 Ball Query,得到局部点集。
- Local coordinate normalization:将邻域点坐标减去中心点坐标,得到相对坐标 。
- Local PointNet:对每个局部点集使用共享 PointNet,提取 translation-invariant 的局部几何特征。
- Feature construction:输出新的点集,每个采样中心点携带其局部区域的高维特征。
坐标中心化使局部 PointNet 更关注局部形状,而不是绝对位置。与此同时,中心点的绝对坐标仍可与特征拼接,保留全局空间信息。
通过多层 Set Abstraction,点云分辨率逐层降低,特征维度逐层升高。分类任务最终可得到少量点甚至单个全局特征,再接 fully connected layers 输出 class scores。
Segmentation Upsampling
点云 segmentation 需要输出 per-point label,因此仅有低分辨率全局特征不够,还必须恢复到原始点分辨率。PointNet++ 通过插值和 skip connection 实现 feature propagation。
Feature Propagation Pipeline:
-
将低分辨率点集的特征上采样到更高分辨率点集。
-
对新增点,寻找低分辨率点集中的若干 nearest neighbors。
-
按距离倒数对邻居特征做加权插值:
其中 是邻居点特征, 是新点到邻居点的距离。
-
将插值特征与 encoder 中同分辨率的 skip feature 拼接。
-
再通过 unit PointNet 或 MLP 更新逐点特征,最终输出 per-point class scores。
注:PointNet++ 的 decoder 并不是简单复制特征,而是插值后再通过可学习网络更新局部特征,因此可以看作点云上的 up-convolution。
PointNet++ vs CNN
若把图像看成带颜色的二维点云, 是坐标, 是特征,那么理论上 PointNet++ 也可以处理图像。但它与 CNN 有本质差异。
| 方法 | 局部权重机制 | 位置建模方式 |
|---|---|---|
| CNN | 每个相对位置有独立可学习卷积核权重 | 显式建模 anisotropic spatial kernel |
| PointNet++ | 局部点共享同一个 MLP | 通过相对坐标作为输入隐式区分位置 |
CNN 的 卷积核中不同位置有不同参数,因此天然支持空间各向异性;PointNet++ 的局部 PointNet 对所有邻域点共享权重,位置差异主要由相对坐标输入表达,因此局部建模能力弱于标准卷积。
后续点云卷积方法尝试弥补这一点。例如 KPConv 在球内设置多个 kernel points,每个 kernel point 学习独立权重;也可以使用 Hypernetwork 根据点的位置动态预测局部网络权重。
Sparse Convolution
Voxel Networks Motivation
另一类处理 3D 数据的思路是将点云或形状体素化为规则三维栅格,再使用 3D CNN。体素表示的优点是规则、可索引,能够直接继承二维卷积中的局部卷积、平移等变性和层级特征结构。
但 dense voxel grid 的复杂度很高。若分辨率为 ,存储和计算量随 增长。低分辨率体素会带来明显信息损失,高分辨率体素又难以承受内存和计算开销。
Sparsity Exploitation
真实三维物体通常主要由表面构成,空间中绝大多数体素为空。Sparse Convolution 的核心思想是:
- 只存储 occupied grids,也即表面附近的 sparse surface signals。
- 只在非空体素及其相关邻域附近执行计算。
- 使用稀疏索引结构维护体素邻接关系,避免 dense grid 的全空间扫描。
这样既保留了规则网格的索引优势,又显著降低了 dense 3D convolution 的冗余计算。
Voxel vs Point Cloud
| 方法 | 优点 | 局限 |
|---|---|---|
| Sparse Conv | 比 dense conv 高效;规则网格支持索引;表达能力接近 2D Conv;具有类似卷积的 translation equivariance | 仍有 discretization error;分辨率受限 |
| Point Cloud Networks | 高分辨率;直接处理原始点;容易快速尝试 | FPS 与 Ball Query 较慢;局部卷积核表达弱;大规模场景性能可能受限 |
Sparse Conv 更适合大规模场景,例如自动驾驶 LiDAR 点云;点云网络更适合需要保留高分辨率表面细节或快速构建 baseline 的任务。
常见实现包括 SparseConvNet、MinkowskiEngine、TorchSparse 和 Tensorflow3D。
Sequence Modeling
Sequential Task
序列数据具有顺序性和因果性,例如文本、语音、视频帧和时间序列。序列建模的核心目标是根据历史信息预测未来或生成后续元素:
不同输入输出形式可归纳为:
| 类型 | 形式 | 示例 |
|---|---|---|
| One-to-one | 单输入到单输出 | 标准图像分类 |
| One-to-many | 单输入到序列输出 | Image Caption |
| Many-to-one | 序列输入到单输出 | Video Action Classification |
| Many-to-many | 序列输入到序列输出 | Video Caption、Language Modeling |
RNN(Recurrent Neural Network)通过 hidden state 在时间维度传递历史信息,是早期序列建模的基本结构。
Vanilla RNN
Vanilla RNN 在每个时间步接收当前输入 和上一时刻 hidden state ,并输出新的 hidden state :
输出通常由 hidden state 线性映射得到:
其中 在所有时间步共享。将 RNN 按时间展开后,可以看作一个深度等于序列长度的计算图,参数在各层之间共享。
注: 通常初始化为零向量,也可以作为可学习参数或由其他网络生成。
Backpropagation Through Time
RNN 的训练使用 Backpropagation Through Time(BPTT)。由于展开后的计算图沿时间方向很长,完整 BPTT 会带来较高内存和计算开销。
实际训练常使用 Truncated BPTT:
- 从长序列中截取固定长度窗口 。
- 只在该窗口内展开 RNN 并反向传播。
- 窗口外的长期依赖不会直接受到训练约束。
注:若训练窗口长度为 ,模型无法从梯度信号中学习长于 的 temporal relationship。这是 RNN 处理 long-term dependence 的重要限制之一。
RNN Language Model
以 Character-Level Language Model 为例,给定训练字符串 “HELLO”,模型在每个时间步用当前字符预测下一个字符:
- 输入 ,预测 。
- 输入 ,预测 。
- 输入 ,预测下一个 。
- 输入 ,预测 。
每个字符通常先转为 one-hot 或 embedding,再输入 RNN。输出 经 softmax 得到下一字符的概率分布,训练损失为 Cross-Entropy Loss。
注:embedding layer 有时可使用固定的 pretrained word embedding,也可以随语言模型一起训练。
Sampling Strategy
语言模型生成时,需要从当前 softmax 概率分布中选择下一个 token。不同采样策略在确定性、多样性和计算成本之间取舍。
| 策略 | 机制 | 特点 |
|---|---|---|
| Greedy Sampling | 每步选择概率最大的 token | 确定性强,只能生成一个序列,容易重复 |
| Weighted Sampling | 按预测概率分布随机采样 | 多样性更好,但可能采到低质量 token |
| Exhaustive Search | 枚举长度为 的所有序列并找最大概率 | 复杂度 ,不可行 |
| Beam Search | 每步保留 个最可能的部分序列 | 比 exhaustive search 高效,但不保证全局最优 |
| Top-p Sampling | 从累计概率达到 的最小 token 集中采样 | 动态截断低概率尾部,兼顾质量和多样性 |
Beam Search 的 称为 beam size。 越大,搜索覆盖面越广,但计算成本越高。
Gradient Vanishing and Explosion
RNN 展开后相当于很深的网络,梯度需要沿时间反向传播。对最后一步 loss 而言,梯度会包含大量连乘项:
由于:
时间步较长时,连乘会导致两类问题(下面的谱半径包含了前面的因子):
- Gradient Vanishing:若整体雅可比矩阵的谱半径小于 1,梯度随时间距离指数衰减。
- Gradient Explosion:若谱半径大于 1,梯度随时间距离指数增长。
Gradient Explosion 可通过 gradient clipping 或 rescaling 缓解; Gradient Vanishing 更难处理,导致模型参数主要学习 short-term effects,而不是 long-term effects。
注:提高 RNN 容量可以使用 Multilayer RNNs,即在每个时间步堆叠多层 RNN。但多层结构主要增强表示能力,并不能从根本上解决时间方向的梯度消失问题。
LSTM
Motivation
LSTM(Long Short-Term Memory)通过引入独立的 cell state 缓解长期依赖问题。每个时间步同时维护:
- Hidden state :用于当前输出和传递短期状态。
- Cell state :用于存储长期信息。
LSTM 可以对 cell state 执行 read、erase 和 write,这些操作由门控向量动态控制。门的取值来自 sigmoid,范围在 到 之间,表示某一维信息保留或通过的程度。
Gate Formula
将上一时刻 hidden state 与当前输入拼接为 ,LSTM 计算四组信号:
其中 是 input gate, 是 forget gate, 是 output gate, 是候选 cell content。
状态更新为:
其中 表示 element-wise multiplication。
LSTM Advantages
LSTM 的关键在于 cell state 的加性更新:
这使得梯度可以沿 方向通过一条较直接的路径回传,而不是每一步都反复乘以同一个 和 。因此 LSTM 更容易学习保留跨越许多时间步的信息。
注:LSTM 并不严格保证梯度永不消失或爆炸;如果 forget gate 长期接近 0,旧信息仍会被清除。但相比 vanilla RNN,它在实践中显著改善了 long-term dependence。
GRU
GRU(Gated Recurrent Unit)是 LSTM 的简化变体。它不显式区分 hidden state 和 cell state,而是用两个门控制信息更新:
其中 是 reset gate,控制计算候选状态时使用多少过去信息; 是 update gate,控制保留旧状态和写入新状态的比例。
GRU 参数量少于 LSTM,结构更简洁,在许多任务中效果接近 LSTM。
From RNN to Attention
RNN、LSTM 和 GRU 都是因果序贯处理结构。它们在 时刻通常只能直接访问 到 的历史信息,长距离交互必须经过 hidden state 逐步传递。
后续的 Attention 与 Transformer 将改变这一点:序列中任意两个位置可以直接建立联系,从而更高效地建模长距离依赖,也更适合并行训练。
注:虽然 RNN 类模型在大模型时代不再是主流序列建模框架,但其 hidden state、BPTT、梯度消失、门控记忆等概念仍是理解 Transformer 与现代序列模型的重要基础。