打破网格限制: 自适应格点如何彻底改变神经图像压缩
我们生活在一个由视觉数据主导的世界里。从流媒体播放 4K 视频到在 Instagram 上滑动浏览,图像压缩是维持互联网运转的隐形引擎。几十年来,像 JPEG 这样的标准定义了这一领域。但在过去五年中,利用深度神经网络 (DNN) 对图像进行编码的神经图像压缩 (Neural Image Compression) 技术迅速超越了传统的人工设计方法。
然而,这些神经系统中存在一个瓶颈: 量化 (Quantization) 。
量化是将连续值 (如神经网络中的激活值) 舍入为可存储为比特的离散数字的过程。大多数系统使用一种死板的方形网格 (标量量化) 。虽然简单,但它效率低下。
在这篇文章中,我们将深入探讨一篇 CVPR 论文,题为 “Multirate Neural Image Compression with Adaptive Lattice Vector Quantization” (基于自适应格点矢量量化的多码率神经图像压缩) 。 研究人员提出了一种方法,不仅使用更好的网格 (格点,Lattices) ,而且让这种网格具有自适应性 。 他们的方法允许单个模型处理多种文件大小,并适应不同类型的图像 (如卡通与照片) ,而无需重新训练庞大的神经网络。
让我们来拆解他们是如何做到的。
1. 背景: 为何形状至关重要
要理解这篇论文,我们首先需要了解标量量化 (Scalar Quantization, SQ) 和矢量量化 (Vector Quantization, VQ) 之间的区别。
“方块”问题 (标量量化)
想象一下你要用地砖铺满地板。在标量量化中,我们独立处理每个像素 (或特征) 。这本质上是在数据上画了一个方格网。如果一个数据点落在某个方格内,它就会被舍入到该方格的中心。
这很容易计算,但从几何角度来看,正方形并不是“填充”空间最有效的方式。效率上的缺口会导致在相同数据量 (码率) 下产生更高的量化误差 (失真) 。
“蜂窝”方案 (格点矢量量化)
矢量量化 (VQ) 将维度组合在一起。我们不再分别舍入 \(x\) 和 \(y\),而是将点 \((x,y)\) 视为 2D 空间中的一个整体。
格点矢量量化 (Lattice Vector Quantization, LVQ) 是一种特殊的 VQ,其中码本 (允许的点) 形成重复的、结构化的模式。如下图所示,不同的格点提供不同的“Voronoi 单元 (Voronoi cells) ” (属于特定点的空间区域) 。

- (b) 均匀标量量化器 (Uniform Scalar Quantizer) : 标准的方格网。
- (c) 六边形格点 (Hexagonal Lattice) : 蜂窝状图案。它比正方形更有效地覆盖 2D 空间。
- (d) 菱形格点 (Diamond Lattice) : 本研究论文的主角。
研究人员专注于菱形格点 。 为什么?因为它们提供了一个最佳平衡点: 它们比正方形更好地覆盖空间 (失真更低) ,但在数学结构上足够规整,允许快速编码,而不像非结构化的矢量量化 (a) 那样复杂。
2. 核心方法: 自适应格点矢量量化
现有的基于 LVQ 的神经网络存在的问题在于灵活性。
- 固定码率 (Fixed Rate) : 如果你想要一张高质量图片和一个低质量缩略图,通常需要训练和存储两个独立的神经网络 。
- 固定域 (Fixed Domain) : 一个在自然照片上训练的模型,通常在屏幕内容 (截屏、文本) 上表现不佳,因为预定义的格点不适合新的数据分布。
作者提出了一个统一的解决方案: 自适应 LVQ (Adaptive LVQ) 。 他们不改变神经网络,而是简单地实时改变格点网格的形状和大小。
A 部分: 菱形格点结构
首先,让我们看看格点背后的数学原理。一个格点 \(\Lambda\) 由基矩阵 \(\mathbf{B}\) 定义。格点中的任意点都是这些基向量的整数线性组合。

编码器的目标是在格点中找到距离输入向量 \(\mathbf{y}\) 最近的点 \(\mathbf{\hat{y}}\)。

研究人员使用的是菱形格点 , 它有一种巧妙的“陪集表示 (coset representation) ”。可以将其视为两个标准的方格网叠加在一起,其中一个稍微移动了一点。

在图 2 中,你可以看到黑点 (网格 1) 和红点 (网格 2) 。两者的结合构成了密集的菱形图案。这允许一种非常快速的量化算法:
- 舍入到最近的黑点 (\(\mathbf{y}_0\))。
- 舍入到最近的红点 (\(\mathbf{y}_1\))。
- 选择优胜者。

这使得复杂度从大规模搜索 (典型的 VQ) 降低到了简单的 \(O(1)\) 运算。
B 部分: 码率自适应 (单模型,多尺寸)
如何在不重新训练网络的情况下改变比特率 (码率) ?
在标准系统中,格点是冻结的。为了获得更小的文件大小,你会强迫神经网络输出靠得更近的值,这会以网络可能无法处理的方式降低质量。
作者建议缩放基向量 。 如果你想要更低的比特率,就让格点变得“更稀疏” (拉开点的距离) 。如果你想要更高的质量,就让格点“更密集”。
在数学上,这是通过学习一个标量 \(a\) 来完成的。新的基 \(\mathbf{B}\) 变成了原始基 \(\mathbf{G}\) 的缩放版本:
\[ \mathbf{B} = a\mathbf{G} \]在实现中,他们只需在量化前将输入特征缩放 \(1/a\),然后在解码时乘以 \(a\)。这就像是网格的“缩放”功能。只需调节这个旋钮 \(a\),单个神经网络现在就可以支持连续的比特率。
C 部分: 域自适应 (格点变形)
这是最具创新性的贡献。当神经网络在风景照上训练时,潜特征 (压缩后的代码) 具有特定的几何分布。如果你突然给它输入卡通图片,分布会发生变化,固定的菱形格点可能不再是最合适的了。
作者没有重新训练庞大的神经网络 (包含数百万个参数) ,而是建议学习一个小的线性变换 A,将格点基 G 重塑为新的基 B。

通过优化矩阵 A,他们可以拉伸、旋转和倾斜格点单元,以完美贴合新领域的数据分布。
“可逆”技巧
这里有个陷阱。如果你任意改变格点基,就会失去菱形格点快速的 \(O(1)\) 量化速度。你将不得不求助于缓慢的算法来寻找最近邻。
为了解决这个问题,作者对优化进行了限制。他们学习的是一个可逆线性映射 。

请看上面的 图 3(c) 。
- 变换: 他们不对复杂、倾斜的格点进行最近邻搜索 (那很慢) ,而是将逆变换 \(\mathbf{A}^{-1}\) 应用于输入数据。
- 量化: 他们使用标准的、快速的菱形格点 (\(\mathbf{G}\)) 对变换后的数据进行量化。
- 恢复: 他们将前向变换 \(\mathbf{A}\) 应用于结果。

这保持了推理速度快如闪电,同时允许格点在几何上适应任何新数据集。为 A 学习的参数数量极少 (仅占网络的 0.06%) ,从而防止了即使在小数据集上的过拟合。
3. 实验与结果
那么,“弯曲网格”真的有效吗?研究人员在几个标准数据集 (Kodak, CLIC) 和架构 (Cheng2020, MBT2018) 上对此进行了测试。
赢得率失真权衡 (Rate-Distortion Trade-off)
主要指标是率失真 (R-D) 。我们希望在低文件大小 (bpp) 下获得高质量 (PSNR) 。
下图比较了不同的模型。
- 红方块 (SQ-m): 标准标量量化 (可变码率) 。
- 紫星 (LVQ-m): 提出的自适应 LVQ (可变码率) 。

如你所见, 紫星始终高于红方块。这意味着在相同的文件大小下,自适应 LVQ 提供了更好的图像质量。实际上,可变码率 LVQ 模型 (单模型) 的表现几乎与为每个比特率单独训练固定码率模型 (黄菱形) 一样好——这是一个巨大的效率胜利。
码率节省
下表量化了节省的程度。 BD-Rate 代表在相同质量下节省了多少比特。

观察高亮的红色单元格,固定 LVQ 模型 (LVQ-s) 是理论上限。提出的可变模型 (LVQ-m) 非常接近,与标量量化模型相比,提供了显著的码率节省 (在 Tecnick 上高达 17%) 。
域自适应的成功
最后,矩阵变换 A 对域自适应有帮助吗?
作者采用了一个在照片上训练的模型,并将其适应于屏幕内容 (文本/UI) 和卡通 。

表 4 显示,仅仅学习格点变换 A——而不触及神经网络权重——就在所有测试类别中实现了码率节省 (负 BD-Rate) 。虽然增益适中 (约 1%) ,但这本质上是通过微调极少量参数获得的“免费”提升。
4. 结论与启示
论文 “Multirate Neural Image Compression with Adaptive Lattice Vector Quantization” 填补了神经压缩领域的一个关键空白。
通过从死板的标量量化转向自适应格点矢量量化 , 作者证明了:
- 格点能更好地表示数据: 我们获得了更好的单位比特质量。
- 格点可以是灵活的: 通过缩放基,单个模型可以传输 4K 或 480p 质量。
- 格点可以是自适应的: 通过变换基,模型可以针对卡通或截屏进行自我优化,而不会忘记如何压缩自然照片。
对于深度学习领域的学生和研究人员来说,这强调了一个重要的教训: 不要只优化神经网络层。 网络周围的数学组件——如量化器——是创新的沃土。
这种方法——将码率控制和域自适应统一到一个单一的几何框架中——为既高效又极其通用的通用图像编解码器铺平了道路。
](https://deep-paper.org/en/paper/file-2145/images/cover.png)