图片

零知识机器学习(zkML)是密码学魔法与人工智能的结合,想象一下,在不泄露模型输入、内部工作原理或结果的情况下,证明一个机器学习模型产生了特定的结果,这就是 zkML 的愿景 - 目前已有多种前沿方法竞相将其变为现实。

在本文中,我们将深入探讨三种领先的 zkML 范式 - JOLT(已针对机器学习操作进行修改,并带有预编译功能:JOLTx)、EZKL(基于 Halo2)和 DeepProve(基于 GKR),比较它们的工作原理和性能,并解释为什么 JOLT 以查找为中心的方法会像出租车上的雪球一样震撼整个行业。

什么是 zkML?

零知识机器学习(zkML)是一个新兴领域,它将零知识证明(ZKP)与机器学习(ML)相结合,以实现可验证且隐私保护的 ML 计算,zkML 允许证明者证明 ML 模型已正确执行,而无需泄露敏感输入或要求验证者重新运行计算,您还可以使用它来隐藏模型权重和模型。

这对于去中心化金融、隐私保护型 AI 和安全的链下计算等应用至关重要,通过确保 ML 推理的私密性和去信任性,zkML 为区块链、Web3 及其他领域中透明且可扩展的 AI 应用铺平了道路。

zkML 的技术基础

基于 JOLT 的 zkML(JOLTx)– JOLT 是一个 zkVM,一种可以证明任意程序执行的零知识虚拟机(JOLT 论文,JOLT 博客)。

JOLT 以 RISC-V 指令集为目标,这意味着您可以将任何程序(使用 Rust 或 C++ 等高级语言编写)编译为 RISC-V 汇编语言,然后生成该汇编代码正确运行的证明。

JOLT 在底层引入了一个基于“查找奇点”概念的新前端:它不再对每个操作施加繁重的代数约束,而是将 CPU 指令转换为在一个巨大的预定义有效指令结果表中进行查找,每一步计算(例如加法、乘法,甚至是按位运算)都会通过名为 Lasso 或最近的 Shout 的快速查找参数与该表进行比对,从而进行验证。

JOLT 的电路只需在这些表中执行查找操作,从而显著简化了证明生成过程,例如,64 位“或”以及“与”运算(在常规算术约束下执行成本高昂)在 JOLT 下只需进行一次表查找即可完成。

该设计确保证明器在每条 CPU 指令中的主要工作只是提交少量字段元素(每步约 6 个 256 位数字)并证明这些查找的正确性,这使得 JOLT 成为一种通用且可扩展的方法:任何机器学习模型都可以被视为一个程序,并通过最少的定制电路设计进行证明。

我们计划为 JOLT 堆栈贡献一些针对机器学习操作的专用预编译功能,非线性可以通过查找高效处理,而其他常见属性可以通过和校验以及 JOLT zkVM 独有的一些技术来处理。

我们将此扩展称为 JoltX,但它实际上只是在 JOLT 的基础上添加了几个工具和专用预编译功能,我们预计将在几个月后发布,敬请期待!

还有哪些其他优秀的 zkML 项目?

EZKL(基于 Halo2)- EZKL 采用基于 Halo2 构建的更传统的 SNARK 电路方法。

EZKL 并非模拟 CPU,而是在机器学习模型的计算图层面运行,开发人员将神经网络(或任何计算图)导出为 ONNX 文件,EZKL 工具包会将其编译成一组针对该模型定制的多项式约束(算术电路)。

神经网络的每一层 - 例如卷积、矩阵乘法、激活函数 - 都被转化为 Halo2 证明器可以求解的约束,为了处理非自然多项式的运算(例如 ReLU 激活或大整数运算),Halo2 也使用查找参数,但方式更为有限。

例如,大型表(例如 64 位运算的所有 $2^{64}$ 种可能性)必须拆分或“分块”为较小的表(例如 16 位块),并且需要多次查找加上重组约束来模拟原始运算,这种分块会增加电路的开销和复杂性。

因此,EZKL 的证明生成涉及创建许多这样的约束,并使用 Halo2 的证明算法(通常是 KZG 或基于 Halo 的承诺)来生成证明,EZKL 方法的优势在于它具有模型感知能力 - 它可以针对神经网络层进行专门优化,甚至可以修剪或量化权重以提高效率。

然而,每个新模型或层类型可能都需要自定义约束编写或至少重新生成电路,并且证明者必须处理大型约束系统,这对于大型模型来说可能会很慢。

DeepProve(基于 GKR)- Lagrange 提出的 DeepProve 采用了不同的路径,使用称为 GKR(Goldwasser–Kalai–Rotblum)的交互式证明协议。

本质上,GKR 将整个计算过程(类似于机器学习模型的前向传递)视为一个分层的算术电路,并通过和校验协议而非繁琐的多项式运算来证明其正确性,DeepProve 的工作流程是提取模型(同样通过 ONNX 实现),然后自动生成与神经网络每一层对应的计算序列。

它并非直接将其转换为静态的 SNARK 电路,而是使用 GKR 以最小的加密哈希/承诺开销来检查每一层的输出与其输入,GKR 方案中的证明者运行实际的模型计算,然后进行交互式证明(使用 Fiat-Shamir 算法使其变为非交互式),以使验证者确信每一层都计算正确。

GKR 的优点在于其证明器复杂度与电路规模呈线性关系(O(n)),与正常执行相比,仅有很小的常数因子减慢,事实上,对于某些任务(例如大型矩阵乘法),基于 GKR 的现代系统可以比普通执行慢不到 10 倍,DeepProve 将此与现代多项式承诺技术相结合,在校验轮后输出简洁的证明,从而有效地创建了针对神经网络推理的 zkSNARK。

GKR 的一个缺点是,它最适用于结构化计算(例如神经网络的静态层),并且涉及更复杂的加密协议逻辑,但它的优势在于在深度计算证明方面的原始速度。

优势与劣势

每种方法都有其独特的优势和潜在的缺点。

JOLTx(基于查找的预编译 zkVM)

优势:极其灵活(它可以证明任何代码,而不仅仅是神经网络),并且受益于 JOLT 的“查找奇点”优化,即使是位级操作也成本低廉。

它不需要每个模型定制电路 - 只需编译即可运行——这极大地提升了开发人员的体验并降低了出现 bug 的可能性。

使用 Lasso 查找意味着证明约束主要根据执行的操作数量而非其复杂性进行扩展,从而使 JOLT 拥有一致的成本模型。 

缺点:作为通用虚拟机,它可能会为每条指令带来一些开销;对于包含数百万个简单操作的超大型模型,像 GKR 这样的专用方法可以通过流式计算来实现更低的绝对证明时间。

此外,JOLT 相对较新 - 它依赖于一种新颖的查找参数和复杂的 ISA 级表,这些是尖端技术,需要时间才能成熟,但考虑到其设计,即使是 JOLT 目前的原型在效率上也优于之前的 zkVM。

EZKL(Halo2 / PLONK)

优势:它基于广泛使用的 SNARK 框架构建,这意味着它可以受益于现有的工具、审计和链上验证器支持(Halo2 证明可以使用以太坊友好的加密技术进行验证)。

EZKL 对数据科学家来说相当易于使用:你可以使用 PyTorch 或 TensorFlow 模型,导出 ONNX,并获得模型推理正确完成的证明。

它已经实现了实际集成(从 DeFi 风险模型到游戏 AI,我们将在下文讨论),这表明它能够证明真正的机器学习任务。 

缺点:随着模型的增长,性能可能成为瓶颈,传统的 SNARK 电路通常会带来巨大的开销 - 从历史上看,证明者的工作量比仅仅运行模型要多一百万倍。

Halo2 的方法试图进行优化,但诸如大矩阵乘法或非线性激活之类的操作仍然会转化为许多约束,对大型查找进行分块(例如 32 位算术或非线性函数)的需求增加了额外的约束和证明时间。

本质上,EZKL 可能难以处理非常大的网络(在证明时间和内存方面),有时需要拆分电路或使用特殊技术来适应实际限制,这是一种很好的通用 SNARK 方法,但在扩展时并不是最快的。

DeepProve(GKR)

优势:为深度模型提供极快的证明生成速度,通过避免将每个乘法编码为多项式约束的开销,GKR 使证明器几乎只需进行常规数值计算,然后添加一层薄薄的加密校验,DeepProve 团队报告称,在同等神经网络上,GKR 的证明速度比 EZKL 快 54 到 158 倍。

事实上,模型越大,GKR 的优势就越大:随着模型复杂度的增加,DeepProve 的优势也越来越大,因为它的线性扩展仍然可控,而基于电路的方法的成本却在不断膨胀。

劣势:该方法在某种程度上仅适用于类似电路的计算(幸运的是,这类计算涵盖了大多数前馈机器学习),如果您的工作负载包含大量条件逻辑或不规则运算,那么它的灵活性会降低 - 这些操作在 JOLT 等虚拟机中更容易处理。

此外,将 GKR 证明设为零知识证明且简洁,会导致证明规模大于经典的 SNARK 证明和验证程序,尽管后者比重新运行整个模型快得多,但并非即时完成。

DeepProve 的证明对于 CNN 的验证时间约为 0.5 秒,这对于大型模型来说非常出色,但传统的 SNARK 验证器可以以毫秒为单位完成。

因此,DeepProve 专注于性能,这可能会以证明协议的复杂性和比 Halo2 证明等略重的验证任务为代价,它是扩展 zkML 的强大方法,尤其是在服务器或云环境中,尽管在进一步优化之前,它可能不太适合轻客户端或链上验证。

性能和效率比较

就原始性能而言,每种 zkML 方法都有不同的优先级,证明生成时间通常是关键指标,DeepProve 基于 GKR 的证明器目前在速度方面占据首位 - 基准测试表明,在相同模型下,其生成证明的速度比 EZKL快 50 倍到 150 倍。

这一飞跃源于 GKR 的近线性时间算法,该算法避开了 SNARK 电路繁重的多项式代数运算,实际上,EZKL 可能需要数小时才能证明的神经网络推理,使用 DeepProve 只需几分钟即可完成,而且,随着模型规模增大(更多层、更多参数),这一差距会进一步扩大,因为 GKR 的单次操作开销保持较低,而 Halo2 的开销却在不断增长。

JOLT 的性能目标同样雄心勃勃 - 它的目标是比现有的 SNARK 框架快一个数量级,a16z 团队已经演示了 Lasso(JOLT 中的查找引擎),其运行速度比 Halo2 的查找机制快 10 倍,并计划将速度提升至 40 倍。

这意味着曾经是瓶颈的操作(例如那些令人讨厌的按位运算或大字段运算)变得便宜得多,JOLT 本质上是用计算换取了表查找,而且由于 Lasso,在巨大的虚拟表中查找值的成本很低,成本不会随着表大小的增加而增长(不,它们实际上并没有在内存中存储 2^{128}$ 行数据!)- 它主要随着执行的查找次数而增长。

因此,如果您的机器学习模型执行了一百万个 ReLU,那么证明器的成本会随着这百万次操作而增长,但每次操作都只是一次快速的表格检查,早期结果表明,JOLT 的证明器每条指令步骤只需处理少量字段元素承诺,开销极低,简而言之,JOLT 正在最大限度地优化每条操作的计算量,通过使用预先计算的知识(查找表)来跳过复杂的动态数学运算,从而大幅降低传统的 SNARK 开销。

EZKL 与 Halo2 的结合虽然速度较慢,但也并未停滞不前,它受益于 Halo2 的优化,例如自定义门和部分查找,对于中等规模的模型,EZKL 完全可用,并且已被证明优于一些早期的替代方案,在 Cairo 上,它比基于 STARK 的方法快约 3 倍,在 2024 年的一项基准测试中,它比 RISC-V STARK 快 66 倍。

这表明,经过精心优化的 SNARK 电路可以击败实现方式较为简单的虚拟机,缺点是,为了达到这些速度,EZKL 和 Halo2 必须仔细调整所有内容,而且它们仍然继承了多项式承诺、FFT 和证明算法的基本成本。

相比之下,JOLT 和 DeepProve 的新方法避免了大部分 FFT 或高阶多项式的开销 - JOLT 通过将自身限制在查找操作(加上一个新参数来高效处理查找操作),而 DeepProve 则使用和校验(它适用于多线性多项式,并且只需要轻量级哈希承诺)。

在经典的 SNARK 中,大量时间都花在计算大型 FFT 或多标量乘法等操作上,GKR 通过对布尔超立方体和多线性扩展进行操作,在很大程度上避免了 FFT,而 JOLT 通过从一开始就不实现巨型表,避免了查找所需的大型 FFT。

在证明大小和验证方面,存在着权衡,JOLT 和 EZKL(Halo2)最终生成标准的 SNARK 证明(通常为几 KB),可以快速验证(一些配对或一些多项式求值)。

DeepProve 的方法类似于 STARK,可能会生成更大的证明(几十 KB 到几百 KB,具体取决于模型),并且验证虽然比重新运行模型快得多,但可能比验证简洁的 KZG 证明涉及更多步骤。

DeepProve 团队强调,他们的验证速度比使用 GPU 简单地重新计算 MLP 来检查它快 671 倍,对于相当复杂的模型,可将验证时间缩短至约 0.5 秒。

这是一个强有力的结果,表明即使证明规模更大,验证起来也比进行原始的人工智能计算要容易得多(如果验证者是智能合约或计算能力有限的轻客户端,这一点尤其重要),Halo2 的证明规模更小,验证速度也更快,但如果一开始就证明它们的速度对于你的应用程序来说太慢,那么这种差异就显得无关紧要了。

效率的一个重要方面在于这些框架如何处理特殊操作,例如,在机器学习推理中,我们经常会遇到非线性步骤(例如 ArgMax、ReLU 或 Sigmoid),EZKL 可以通过使用布尔选择器强制执行约束来处理 ReLU(这本身可以通过查找或其他约束来完成)。

相比之下,JOLT 可以在程序中实现 ReLU(作为几条基于符号位分支的 CPU 指令),并通过查找以低成本证明这些分支 - 本质上是利用了 CPU 的比较能力。

DeepProve 可以通过将分段线性函数合并到 GKR 将要验证的算术电路中来适应分段线性函数,但高度非线性函数(例如 Sigmoid)可能需要多项式或查找近似,总体而言,JOLT 的理念是通过执行实际代码(包括条件语句、循环等)并使用查找参数来覆盖任何操作的逻辑,使所有奇特的东西看起来都正常。

Halo2 的理念是将所有内容限制在多项式方程中(有时对于复杂的运算来说会很繁琐),而 GKR 的理念是将计算分解为可递归验证的和与积,每种方法处理这些问题的效率将反映在证明时间上:JOLT 可能擅长控制逻辑,GKR 擅长大型线性代数运算,而 Halo2 则处于两者之间,两者兼顾,但开销较高。

为了验证 Kinic 证明,我们使用互联网计算机区块链,因为它比其他 L1 区块链更快地处理更大规模的证明验证,我们也不受预编译的限制,因为预编译需要一些复杂的工作才能将 JOLTx 上链。

大规模模型的可扩展性

当我们在 zkML 中谈论可扩展性时,我们可能指两件事:处理大型模型(多层级、大量参数)和处理多样化模型(不同架构甚至动态模型),我们首先考虑大规模部署 - 假设你想在一个大型 CNN 或具有数百万个参数的 Transformer 上进行推理验证。

DeepProve 专为此场景而设计,其性能会随着模型规模的扩大而倍增,例如,如果一个小型模型(比如一个微型 MLP)用 DeepProve 证明的速度比用 EZKL 证明的速度快 50 倍,那么一个更大的模型可能要快 100 倍以上。

该团队指出,随着我们扩展到包含数百万个参数的模型,DeepProve 的速度将比其他方案更快,他们计划通过并行和分布式证明技术进一步提升这一速度,GKR 易于并行化,因为许多子计算(例如某一层中的所有神经元)可以批量验证。

此外,GKR 不需要一个会随着电路规模增长而增长的巨型单片“证明密钥” - 它能够实时运行,因此内存占用更低,这使得 DeepProve 在未来有望用于云规模甚至链上大型神经网络的验证。

EZKL(Halo2)可以处理相当大的网络,但也存在局限性,为大型模型构建单个巨型电路可能需要大量内存和时间(在某些情况下需要数十 GB 的 RAM 和数小时的计算时间),EZKL 团队一直在探索改进方法,例如电路拆分和聚合(分别对模型的各个部分进行证明,然后合并证明),以及量化策略以降低算术复杂度。

尽管如此,像 Halo2 这样的通用 SNARK 算法,如果没有专门的优化,在超过一定规模后仍将面临挑战,它可能最适合中小型模型,或者离线且不频繁进行证明的情况(或有强大硬件可用)。

其优点是,一旦生成证明,即使对于大型模型,验证它也很容易 - 这对于链上场景非常有用,因为智能合约可能会验证包含 1 亿个参数的模型的证明,而这在链上重新计算是绝对不可行的。

JOLT 在可扩展性方面处于一个有趣的位置,一方面,它是一种基于 SNARK 的方法,因此它的工作量也必须与执行的操作数量大致呈线性关系(就像 Halo2 和 GKR 一样)。

另一方面,由于采用了基于查找的技术,JOLT 的每次操作的常数非常低,如果我们考虑“大规模部署”,比如运行一个包含 1000 万次操作的模型,JOLT 就必须执行这 1000 万次查找和相应的承诺,这很繁重,但从本质上来说并不比 GKR 或甚至一个简单的电路更重 - 它仍然是线性的。

问题是:JOLT 能多好地优化和并行化它?由于 JOLT 将每条指令视为一个步骤,如果证明系统支持拆分跟踪,它可以通过并行执行多条指令(类似于多个 CPU 内核)来实现证明的并行化。

目前的研究表明,他们首先关注单核性能(每步成本约为 6 个字段元素),但由于该方法是一种虚拟机,因此可以设想将来在证明器之间分发程序跟踪的不同部分(这只是推测,但考虑到查找参数可以组合,这并非不可能)。

即使没有花哨的分布,JOLT 也可以利用现有的多项式承诺技巧 - 例如支持任意大小电路的通用设置,因此不需要为更大的模型提供新的可信设置。

在处理不同的 ML 架构方面,JOLT 表现出色:无论您的模型是 CNN、带循环的 RNN、决策树集成还是某种新的混合模型,只要您可以在 CPU 上运行它,JOLT 就可以证明它,这使得它在开发意义上具有高度的可扩展性 - 您不需要为每种新模型类型重新设计证明方法。

DeepProve 和其他基于 GKR 的方法目前针对典型的深度神经网络(矩阵运算层和元素函数)进行了定制,它们能够随着网络的深度和宽度而出色地扩展,但如果你给它们施加非常不规则的工作负载(例如,一个动态决定跳过层或具有数据依赖循环的模型),该框架可能需要进行调整或可能会损失一些效率。

不过,大多数已部署的大规模机器学习模型(视觉、自然语言处理等)都具有规则的结构,因此这没有问题。

有人可能会问:哪种方法最适合实时或设备端使用,而不是云规模?实时意味着即使对于较小的模型,我们也希望证明延迟非常低。

JOLT 的方法是一种 SNARK,可能允许在几秒或更短的时间内在一个不错的设备上证明较小的模型,尤其是在技术成熟的情况下,移动 CPU 上的 EZKL 可能会更慢(Halo2 证明还不是完全适合移动设备,尽管有人努力加速它)。

DeepProve 可以有效地利用 GPU - 如果设备上有 GPU,它实际上可能会非常快速地证明一个小模型(GKR 喜欢并行硬件),但 CPU 上的 DeepProve 可能不如 CPU 上的 JOLT 那样针对实时场景进行优化。

因此,可扩展性不仅仅在于处理更大的模型 - 还在于在正确的环境中有效地处理正确的尺寸,JOLT 的目标是成为跨环境的万能主力,从长远来看,这使其成为云和边缘部署的有力候选者。

JOLTx:通过校验和查找重新定义 zkML 功能

既然有这么多创新,为什么我们还要强调基于 JOLT 的 zkML 是未来的最佳选择呢?答案在于它的多功能性、性能和实际应用 - 这三者的组合很难被超越。

首先,JOLT 引入了一种构建 SNARK 的全新范式,JOLT 不再将高级程序逐个门地嵌入到电路中,而是实现了设计仅执行查找操作的电路的愿景,这意味着复杂性在预计算阶段得到处理(定义那些庞大的指令表),而在线阶段则非常简单:只需证明你进行了有效的查找即可。

这就像将电路中的每个复杂操作都变成了 “O(1)” 步骤,这大大降低了证明者在 SNARK 中执行传统上非常繁琐的任务(例如,位操作、任意分支逻辑)的开销。

对于机器学习模型,它通常混合了线性代数(SNARK 可以处理)和非线性决策或数据转换(SNARK 处理不佳),JOLT 提供了一个平衡的解决方案 - 线性代数仍然必须逐步完成,但每个算术操作都很简单,任何非线性决策(例如 ReLU 中的“如果神经元 > 0 则...”)也很简单,因为 VM 可以简单地分支,并且正确分支的证明只是一个查找检查。

其次,JOLT 速度很快,而且速度还在不断提升,其背后的研究表明,与主流 SNARK 工具相比,其证明器速度可立即提升 10 倍以上,并暗示通过优化可达到 40 倍。

它还继承了SNARK 的许多前期改进:它采用了现代多项式承诺方案,并可以利用现有的密码库,其核心的 Lasso 论证以效率为核心,并且已经展现出优于旧式查找论证(后者是 Halo2 等系统的瓶颈)的性能。

对于实时或本地机器学习而言,这意味着在智能手机或笔记本电脑上生成证明的想法突然变得不再那么疯狂,如果您的模型推理通常需要 100 毫秒,那么 JOLT 可能只需几秒钟就能证明这一点 - 这可是件大事!

相比之下,旧方法中的证明可能需要几分钟或几小时,因此在服务器场之外无法实现,JOLT 的效率提升使 zkML 更接近交互式使用的领域。

例如,我们可以设想一个浏览器扩展程序,它使用 JOLT 实时证明“我在您刚上传的图像上运行了一个视觉模型,它不包含任何 NSFW 内容”,然后再允许发布该图像。

或者汽车的车载计算机向保险服务器证明它确实在自动驾驶过程中使用了经过验证的驾驶模型,这些场景需要快速周转,而 JOLT 的速度使其成为可能。

另一个重要因素是开发者和用户的体验,JOLT 允许开发者使用他们熟悉的语言和模型(通过 RISC-V 编译和即将推出的 ONNX 转换),你无需了解 SNARK 电路的复杂性即可使用它。

对于机器学习领域来说,这一点至关重要:大多数机器学习工程师都不是密码学专家,他们也不应该成为密码学专家,使用 JOLT,他们可以编写或编译现有代码并获得证明,这种方法类似于 GPU 的早期 - 最初只有图形专家编写 GPU 代码,但最终通用框架允许任何程序员使用 GPU 加速。

从这个意义上讲,JOLT 就像“用于零知识证明的 GPU”:一个可通过标准工具链访问的专用引擎,这大大降低了采用的门槛,我们很可能会看到一些库将常见的机器学习任务(例如模型推理、模型准确性证明等)打包在 JOLT 之上,以便其他人可以即插即用。

JOLT 的可审计性是另一个微妙的改变,由于它本质上是在证明标准 ISA 的执行情况,因此比定制电路更容易推理和审计,您可以依赖定义明确的 RISC-V 规范和查找表的正确性,而无需验证成千上万个手写约束,这意味着对关键机器学习模型的证明拥有更高的可信度。

例如,如果某个模型用于法庭或医疗决策,那么拥有清晰的轨迹(“该程序已正确执行”)比“只有少数专家理解的这个定制电路已得到满足”更令人放心,如果需要,审计人员甚至可以单步执行虚拟机执行轨迹,而这在单片电路证明中是无法实现的。

基于 JOLT 的零知识证明(zkML)将理论的优雅与实际实现完美结合 - 既具备可扩展性所需的性能突破,也具备广泛应用所需的灵活性,它将零知识证明转化为开发者友好的高速实用程序。

虽然基于 Halo2 和 GKR 的方法已经开辟了道路,展示了其可能性(并将继续以其特定优势应用),但 JOLT 有望统一和提升 zkML 领域,这就像从手工汇编到高级编程的飞跃 - 一旦出现通用高效的解决方案,它就能赋能整个生态系统蓬勃发展。

对于任何希望在实践中部署可验证机器学习的人来说,JOLT 提供了一条清晰且极具吸引力的前进之路:快速证明,适用于任何模型,随时随地,zkML 的未来也属于精心设计的 zkVM 及其预编译代码!

图片

#Kinic #AI #ICP生态

你关心的 IC 内容

技术进展 | 项目信息 | 全球活动

收藏关注 IC 币安频道

掌握最新资讯