MINIBLOG

Blog Note Tags Links About
Home Search
May 10, 2026
miniyuan

序列模型


PointNet++

PointNet Weakness

PointNet 直接处理无序点集。其基本流程是:

  1. 输入点云坐标 (X,Y,Z)(X, Y, Z)(X,Y,Z)。
  2. 对每个点独立使用共享 MLP,得到逐点 latent feature。
  3. 对所有点特征做 Max Pooling,得到全局特征。
  4. 用全局特征完成 classification,或与逐点特征拼接后完成 segmentation。

其核心优势是 permutation invariance(置换不变性)。由于点云是集合而不是序列,点的输入顺序不应影响最终结果。PointNet 通过共享 MLP 和对称池化函数实现这一性质。

但 PointNet 的主要问题是缺少局部几何建模。 每个点本质上只经过 single-point receptive field 的 1×11\times11×1 处理,随后直接全局 pooling。 这类似于对图像中每个像素独立做 1×11\times11×1 conv 后直接全局池化,难以捕捉局部结构。

注:点云的 XYZXYZXYZ 坐标本身携带空间位置信息,因此 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选取距离最近的 KKK 个点点数固定,便于批处理几何范围随点密度变化
Ball Query选取半径 rrr 球内的点几何尺度固定,符合局部感受野点数不固定

PointNet++ 通常采用 Ball Query。球半径是超参数,表示局部区域的空间尺度。为了便于 GPU 并行,实际实现会限制每个球最多取 KKK 个点:

  1. 若球内点数大于 KKK,随机采样 KKK 个点。
  2. 若球内点数小于 KKK,重复复制部分点补足。
  3. 重复点不会影响 PointNet 的 max pooling 结果。

注:Ball Query 固定的是几何尺度,而不是点数。这使得局部特征更像 CNN 中固定大小的 receptive field。

Set Abstraction Layer

Set Abstraction Layer 是 PointNet++ 的核心模块,可理解为点云上的“降采样 + 局部特征提取”。

Pipeline:

  1. Sampling:使用 Farthest Point Sampling(FPS)从原始点集中选择中心点,使采样点尽可能覆盖整体几何轮廓。
  2. Grouping:以每个中心点为球心做 Ball Query,得到局部点集。
  3. Local coordinate normalization:将邻域点坐标减去中心点坐标,得到相对坐标 (x−xc,y−yc,z−zc)(x-x_c,y-y_c,z-z_c)(x−xc​,y−yc​,z−zc​)。
  4. Local PointNet:对每个局部点集使用共享 PointNet,提取 translation-invariant 的局部几何特征。
  5. Feature construction:输出新的点集,每个采样中心点携带其局部区域的高维特征。

坐标中心化使局部 PointNet 更关注局部形状,而不是绝对位置。与此同时,中心点的绝对坐标仍可与特征拼接,保留全局空间信息。

通过多层 Set Abstraction,点云分辨率逐层降低,特征维度逐层升高。分类任务最终可得到少量点甚至单个全局特征,再接 fully connected layers 输出 class scores。

Segmentation Upsampling

点云 segmentation 需要输出 per-point label,因此仅有低分辨率全局特征不够,还必须恢复到原始点分辨率。PointNet++ 通过插值和 skip connection 实现 feature propagation。

Feature Propagation Pipeline:

  1. 将低分辨率点集的特征上采样到更高分辨率点集。

  2. 对新增点,寻找低分辨率点集中的若干 nearest neighbors。

  3. 按距离倒数对邻居特征做加权插值:

    fnew=∑i=13fi/di∑i=131/dif_{\text{new}} = \frac{\sum_{i=1}^{3} f_i / d_i}{\sum_{i=1}^{3} 1 / d_i}fnew​=∑i=13​1/di​∑i=13​fi​/di​​

    其中 fif_ifi​ 是邻居点特征,did_idi​ 是新点到邻居点的距离。

  4. 将插值特征与 encoder 中同分辨率的 skip feature 拼接。

  5. 再通过 unit PointNet 或 MLP 更新逐点特征,最终输出 per-point class scores。

注:PointNet++ 的 decoder 并不是简单复制特征,而是插值后再通过可学习网络更新局部特征,因此可以看作点云上的 up-convolution。

PointNet++ vs CNN

若把图像看成带颜色的二维点云,(u,v)(u,v)(u,v) 是坐标,(r,g,b)(r,g,b)(r,g,b) 是特征,那么理论上 PointNet++ 也可以处理图像。但它与 CNN 有本质差异。

方法局部权重机制位置建模方式
CNN每个相对位置有独立可学习卷积核权重显式建模 anisotropic spatial kernel
PointNet++局部点共享同一个 MLP通过相对坐标作为输入隐式区分位置

CNN 的 3×33\times33×3 卷积核中不同位置有不同参数,因此天然支持空间各向异性;PointNet++ 的局部 PointNet 对所有邻域点共享权重,位置差异主要由相对坐标输入表达,因此局部建模能力弱于标准卷积。

后续点云卷积方法尝试弥补这一点。例如 KPConv 在球内设置多个 kernel points,每个 kernel point 学习独立权重;也可以使用 Hypernetwork 根据点的位置动态预测局部网络权重。

Sparse Convolution

Voxel Networks Motivation

另一类处理 3D 数据的思路是将点云或形状体素化为规则三维栅格,再使用 3D CNN。体素表示的优点是规则、可索引,能够直接继承二维卷积中的局部卷积、平移等变性和层级特征结构。

但 dense voxel grid 的复杂度很高。若分辨率为 N×N×NN\times N\times NN×N×N,存储和计算量随 O(N3)O(N^3)O(N3) 增长。低分辨率体素会带来明显信息损失,高分辨率体素又难以承受内存和计算开销。

Sparsity Exploitation

真实三维物体通常主要由表面构成,空间中绝大多数体素为空。Sparse Convolution 的核心思想是:

  1. 只存储 occupied grids,也即表面附近的 sparse surface signals。
  2. 只在非空体素及其相关邻域附近执行计算。
  3. 使用稀疏索引结构维护体素邻接关系,避免 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

序列数据具有顺序性和因果性,例如文本、语音、视频帧和时间序列。序列建模的核心目标是根据历史信息预测未来或生成后续元素:

P(xt+1∣x1,x2,…,xt)P(x_{t+1}\mid x_1,x_2,\dots,x_t)P(xt+1​∣x1​,x2​,…,xt​)

不同输入输出形式可归纳为:

类型形式示例
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 在每个时间步接收当前输入 xtx_txt​ 和上一时刻 hidden state ht−1h_{t-1}ht−1​,并输出新的 hidden state hth_tht​:

ht=tanh⁡(Whht−1+Wxxt)h_t = \tanh(W_h h_{t-1} + W_x x_t)ht​=tanh(Wh​ht−1​+Wx​xt​)

输出通常由 hidden state 线性映射得到:

yt=Wyhty_t = W_y h_tyt​=Wy​ht​

其中 Wh,Wx,WyW_h,W_x,W_yWh​,Wx​,Wy​ 在所有时间步共享。将 RNN 按时间展开后,可以看作一个深度等于序列长度的计算图,参数在各层之间共享。

注:h0h_0h0​ 通常初始化为零向量,也可以作为可学习参数或由其他网络生成。

Backpropagation Through Time

RNN 的训练使用 Backpropagation Through Time(BPTT)。由于展开后的计算图沿时间方向很长,完整 BPTT 会带来较高内存和计算开销。

实际训练常使用 Truncated BPTT:

  1. 从长序列中截取固定长度窗口 ΔT\Delta TΔT。
  2. 只在该窗口内展开 RNN 并反向传播。
  3. 窗口外的长期依赖不会直接受到训练约束。

注:若训练窗口长度为 ΔT\Delta TΔT,模型无法从梯度信号中学习长于 ΔT\Delta TΔT 的 temporal relationship。这是 RNN 处理 long-term dependence 的重要限制之一。

RNN Language Model

以 Character-Level Language Model 为例,给定训练字符串 “HELLO”,模型在每个时间步用当前字符预测下一个字符:

  1. 输入 HHH,预测 EEE。
  2. 输入 EEE,预测 LLL。
  3. 输入 LLL,预测下一个 LLL。
  4. 输入 LLL,预测 OOO。

每个字符通常先转为 one-hot 或 embedding,再输入 RNN。输出 yty_tyt​ 经 softmax 得到下一字符的概率分布,训练损失为 Cross-Entropy Loss。

注:embedding layer 有时可使用固定的 pretrained word embedding,也可以随语言模型一起训练。

Sampling Strategy

语言模型生成时,需要从当前 softmax 概率分布中选择下一个 token。不同采样策略在确定性、多样性和计算成本之间取舍。

策略机制特点
Greedy Sampling每步选择概率最大的 token确定性强,只能生成一个序列,容易重复
Weighted Sampling按预测概率分布随机采样多样性更好,但可能采到低质量 token
Exhaustive Search枚举长度为 TTT 的所有序列并找最大概率复杂度 O(VT)O(V^T)O(VT),不可行
Beam Search每步保留 KKK 个最可能的部分序列比 exhaustive search 高效,但不保证全局最优
Top-p Sampling从累计概率达到 ppp 的最小 token 集中采样动态截断低概率尾部,兼顾质量和多样性

Beam Search 的 KKK 称为 beam size。KKK 越大,搜索覆盖面越广,但计算成本越高。

Gradient Vanishing and Explosion

RNN 展开后相当于很深的网络,梯度需要沿时间反向传播。对最后一步 loss LTL_TLT​ 而言,梯度会包含大量连乘项:

∂LT∂W∝∏t∂ht∂ht−1=∏tdiag⁡(tanh⁡′(⋅))Wh\frac{\partial L_T}{\partial W} \propto \prod_t \frac{\partial h_t}{\partial h_{t-1}} = \prod_t \operatorname{diag}(\tanh'(\cdot))W_h∂W∂LT​​∝t∏​∂ht−1​∂ht​​=t∏​diag(tanh′(⋅))Wh​

由于:

tanh⁡′(x)=1−tanh⁡2(x)∈[0,1]\tanh'(x)=1-\tanh^2(x)\in[0,1]tanh′(x)=1−tanh2(x)∈[0,1]

时间步较长时,连乘会导致两类问题(下面的谱半径包含了前面的因子):

  • 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 ctc_tct​ 缓解长期依赖问题。每个时间步同时维护:

  • Hidden state hth_tht​:用于当前输出和传递短期状态。
  • Cell state ctc_tct​:用于存储长期信息。

LSTM 可以对 cell state 执行 read、erase 和 write,这些操作由门控向量动态控制。门的取值来自 sigmoid,范围在 000 到 111 之间,表示某一维信息保留或通过的程度。

Gate Formula

将上一时刻 hidden state 与当前输入拼接为 [ht−1,xt][h_{t-1},x_t][ht−1​,xt​],LSTM 计算四组信号:

it=σ(Wi[ht−1,xt]+bi)ft=σ(Wf[ht−1,xt]+bf)ot=σ(Wo[ht−1,xt]+bo)c~t=tanh⁡(Wc[ht−1,xt]+bc)\begin{aligned} i_t &= \sigma(W_i[h_{t-1},x_t]+b_i) \\ f_t &= \sigma(W_f[h_{t-1},x_t]+b_f) \\ o_t &= \sigma(W_o[h_{t-1},x_t]+b_o) \\ \tilde{c}_t &= \tanh(W_c[h_{t-1},x_t]+b_c) \end{aligned}it​ft​ot​c~t​​=σ(Wi​[ht−1​,xt​]+bi​)=σ(Wf​[ht−1​,xt​]+bf​)=σ(Wo​[ht−1​,xt​]+bo​)=tanh(Wc​[ht−1​,xt​]+bc​)​

其中 iti_tit​ 是 input gate,ftf_tft​ 是 forget gate,oto_tot​ 是 output gate,c~t\tilde{c}_tc~t​ 是候选 cell content。

状态更新为:

ct=ft⊙ct−1+it⊙c~tht=ot⊙tanh⁡(ct)\begin{aligned} c_t &= f_t \odot c_{t-1} + i_t \odot \tilde{c}_t \\ h_t &= o_t \odot \tanh(c_t) \end{aligned}ct​ht​​=ft​⊙ct−1​+it​⊙c~t​=ot​⊙tanh(ct​)​

其中 ⊙\odot⊙ 表示 element-wise multiplication。

LSTM Advantages

LSTM 的关键在于 cell state 的加性更新:

ct=ft⊙ct−1+it⊙c~tc_t = f_t \odot c_{t-1} + i_t \odot \tilde{c}_tct​=ft​⊙ct−1​+it​⊙c~t​

这使得梯度可以沿 ctc_tct​ 方向通过一条较直接的路径回传,而不是每一步都反复乘以同一个 WhW_hWh​ 和 tanh⁡′\tanh'tanh′。因此 LSTM 更容易学习保留跨越许多时间步的信息。

注:LSTM 并不严格保证梯度永不消失或爆炸;如果 forget gate 长期接近 0,旧信息仍会被清除。但相比 vanilla RNN,它在实践中显著改善了 long-term dependence。

GRU

GRU(Gated Recurrent Unit)是 LSTM 的简化变体。它不显式区分 hidden state 和 cell state,而是用两个门控制信息更新:

rt=σ(Wr[ht−1,xt])zt=σ(Wz[ht−1,xt])h~t=tanh⁡(Wh[rt⊙ht−1,xt])ht=(1−zt)⊙ht−1+zt⊙h~t\begin{aligned} r_t &= \sigma(W_r[h_{t-1},x_t]) \\ z_t &= \sigma(W_z[h_{t-1},x_t]) \\ \tilde{h}_t &= \tanh(W_h[r_t \odot h_{t-1},x_t]) \\ h_t &= (1-z_t)\odot h_{t-1}+z_t\odot\tilde{h}_t \end{aligned}rt​zt​h~t​ht​​=σ(Wr​[ht−1​,xt​])=σ(Wz​[ht−1​,xt​])=tanh(Wh​[rt​⊙ht−1​,xt​])=(1−zt​)⊙ht−1​+zt​⊙h~t​​

其中 rtr_trt​ 是 reset gate,控制计算候选状态时使用多少过去信息;ztz_tzt​ 是 update gate,控制保留旧状态和写入新状态的比例。

GRU 参数量少于 LSTM,结构更简洁,在许多任务中效果接近 LSTM。

From RNN to Attention

RNN、LSTM 和 GRU 都是因果序贯处理结构。它们在 ttt 时刻通常只能直接访问 111 到 ttt 的历史信息,长距离交互必须经过 hidden state 逐步传递。

后续的 Attention 与 Transformer 将改变这一点:序列中任意两个位置可以直接建立联系,从而更高效地建模长距离依赖,也更适合并行训练。

注:虽然 RNN 类模型在大模型时代不再是主流序列建模框架,但其 hidden state、BPTT、梯度消失、门控记忆等概念仍是理解 Transformer 与现代序列模型的重要基础。

目录
  • PointNet++
    • PointNet Weakness
    • PointNet++ Motivation
    • Local Neighborhood Features
    • Set Abstraction Layer
    • Segmentation Upsampling
    • PointNet++ vs CNN
  • Sparse Convolution
    • Voxel Networks Motivation
    • Sparsity Exploitation
    • Voxel vs Point Cloud
  • Sequence Modeling
    • Sequential Task
    • Vanilla RNN
    • Backpropagation Through Time
  • RNN Language Model
    • Sampling Strategy
    • Gradient Vanishing and Explosion
  • LSTM
    • Motivation
    • Gate Formula
    • LSTM Advantages
    • GRU
    • From RNN to Attention
© 2026 miniyuan. All rights reserved.
Go to miniyuan's GitHub repo