跳到正文
Go back

深度解析:CKKS 同态加密中的多精度乘法优化 (HMPM)

编辑此页

前言

全同态加密(FHE)允许我们在密文状态下进行计算,其中 CKKS 方案因其支持近似计算(Approximate Arithmetic)而特别适用于机器学习和隐私保护数据分析。然而,CKKS 在处理高精度乘法时面临一个严峻的挑战:模数消耗(Modulus Consumption)

在标准 CKKS 中,为了维持高精度(例如 100-bit 的 Scaling Factor),每次乘法后的 Rescaling 操作需要消耗大量的模数位宽。这导致模数链迅速耗尽,限制了电路的深度,或者迫使我们使用巨大的环维数 NN,从而拖慢计算速度。

本文将深入解析论文 《Homomorphic Multiple Precision Multiplication for CKKS and Reduced Modulus Consumption》(简称 HMPM 方案),探讨其如何通过同态欧几里得除法(Homomorphic Euclidean Division)双密文表示(Pair Representation),在保持高精度的同时,将模数消耗减半。


核心痛点:为什么高精度 CKKS 这么“贵”?

在 CKKS 方案中,消息 mm 被编码为 mΔm \cdot \Delta(其中 Δ\Delta 是缩放因子)。 当我们执行乘法 ct1×ct2ct_1 \times ct_2 时,底层的消息变成了 (m1Δ)×(m2Δ)=m1m2Δ2(m_1 \Delta) \times (m_2 \Delta) = m_1 m_2 \Delta^2。 为了进行后续计算,我们必须通过 Rescaling 操作将缩放因子从 Δ2\Delta^2 降回 Δ\Delta


核心技术:同态欧几里得除法与 Pair 表示

HMPM 方案的核心思想借鉴了经典计算机科学中的定点数算术(Fixed-point Arithmetic):当寄存器无法容纳大数乘法时,我们将大数拆分为“高位”和“低位”分别计算。

1. 密文分解 (Decomposition)

论文提出将一个大模数下的密文 ctct,分解为两个较小模数空间下的分量: ct=2kct^+ctˇct = 2^k \cdot \hat{ct} + \check{ct}

这种分解被称为同态欧几里得除法。虽然在同态加密的噪声环境下,我们无法得到完美的数学商和余数,但论文证明了一种**“弱形式”(Weak Form)**的分解是可行的:即允许 ct^\hat{ct}ctˇ\check{ct} 各自带有误差,只要它们组合起来能还原原始消息,且低位部分的系数足够小(2k/2\le 2^k/2)即可。

2. Mult2\text{Mult}^2 算法:省模数的秘密

基于分解后的密文对 (ct^,ctˇ)(\hat{ct}, \check{ct}),论文设计了全新的乘法算法 Mult2\text{Mult}^2。假设我们要计算 A×BA \times BA2kA^+AˇA \approx 2^k \hat{A} + \check{A} B2kB^+BˇB \approx 2^k \hat{B} + \check{B}

标准乘法展开为: AB=22k(A^B^)+2k(A^Bˇ+AˇB^)+AˇBˇA \cdot B = 2^{2k}(\hat{A}\hat{B}) + 2^k(\hat{A}\check{B} + \check{A}\hat{B}) + \check{A}\check{B}

Mult2\text{Mult}^2 的策略是:直接丢弃最后那一项 AˇBˇ\check{A}\check{B}(低位 ×\times 低位)。

这样做有两个巨大的好处:

  1. 隐式除法(Implicit Division):通过提取高位和交叉项,我们实际上构造了一个在数学上被“除以了 2k2^k”的新结果。这相当于免费完成了一半的 Rescaling 工作。
  2. 模数节省:由于 Δ22k\Delta \approx 2^{2k},我们只需要物理消耗剩下的 2k2^k 大小的模数来进行后续的 RS2\text{RS}^2(Rescaling)。

结论:原本需要消耗 2k2k bits 模数的乘法,现在只需要消耗 kk bits。模数消耗减半!


算法详解:Tensor², Relin² 与 RS²

为了实现上述策略,算法被细分为三个步骤:

1. Tensor2\text{Tensor}^2 (交叉乘法)

这一步负责计算 A^B^\hat{A}\hat{B}(新高位)和 A^Bˇ+AˇB^\hat{A}\check{B} + \check{A}\hat{B}(新低位)。

2. Relin2\text{Relin}^2 (重线性化)

标准的 Relinearization 会引入噪声。如果直接对高位 ct^\hat{ct} 做 Relin,噪声会被系数 2k2^k 放大,导致精度崩溃。

3. RS2\text{RS}^2 (重缩放)

这是物理消耗模数的一步。


精度控制与参数优化

1. 为什么是 50/50 分解?

可能会有疑问:既然 qdivq_{\text{div}}(分解因子)是“免费”的缩放,为什么不让它尽可能大?

2. 低位膨胀与 Recombine

随着乘法层数的增加,低位部分 ctˇ\check{ct} 会逐渐混入高位的信息(交叉项),导致其数值不断膨胀(每层增加约 1 bit)。


实验结果与应用价值

1. 更深的计算深度

在同等参数(N=215N=2^{15})下,标准 CKKS 只能支持 13 层乘法,而 Double-CKKS(即 Mult2\text{Mult}^2)可以支持 18 层。这是因为每层“省吃俭用”,同样的模数预算可以花得更久。

2. 高精度场景的降维打击

对于 100-bit 精度的需求:

3. 工程启示:32-bit RNS 系统

这篇论文不仅优化了高精度计算,还为工程实现打开了新思路。 通常 RNS-CKKS 依赖 50-60 bit 的大素数。结合 HMPM,我们可以使用 28-bit 以下的小素数(适配 32-bit 整数运算和 AVX2/512 指令集)来合成高精度 Scaling Factor。这允许在更广泛的硬件平台上实现高性能的 FHE。


总结

HMPM 方案通过巧妙的代数分解,打破了 CKKS 中“高精度 = 高消耗”的魔咒。它通过将乘法中的部分缩放任务转移给算法结构(丢弃低阶项),实现了模数消耗的减半。这不仅提升了同态计算的容量,更重要的是,它允许我们在更小的环维数下处理高精度任务,为全同态加密的实用化铺平了道路。


编辑此页
Share this post on:

Previous Post
CUDA Kernel 性能测试的正确姿势:从 cudaEvent 到系统级 Benchmark
Next Post
再看《Homomorphic Multiple Precision Multiplication for CKKS and Reduced Modulus Consumption》