1. 引言
过去数年来,ZKP(Zero-Knowledge Proof,零知识证明)在区块链领域主要有两大用途:
- 1)对计算受限的网络进行扩容:在链下处理交易,在主链上验证结果。即Valdity Rollup。
- 2)保护用户隐私:支持shield交易,仅对拥有解密密钥方可见。即链上隐私解决方案。
在区块链场景下,需要这些属性的原因显而易见:
- 像以太坊这样的去中心化网络,若无法满足提升对validator处理能力、带宽和延迟的要求(因此需要validity rollup),就无法增加吞吐量或块大小,并且所有交易都对任何人可见(因此需要链上隐私解决方案)。
但ZKP还有第三大能力:
- 可高效验证任意类型计算的正确性(不局限于EVM实例的链下计算)。
这一能力的影响范围将远超区块链领域。
随着简洁验证计算的ZKP系统的进步,用户可要求现有的每一个数字产品(最关键的是机器学习模型)都具有区块链所保证的同等程度的不信任和可验证性。对区块链计算的高需求激励了ZKP研究,创造了内存占用更小、证明和验证时间更快的现代证明系统,使得如今可在链上验证某些小型机器学习算法。
迄今为止,人们都体验到了与功能强大的机器学习产品交互的潜力。几天前,我使用GPT-4帮助创建了一个在国际象棋中始终击败我的人工智能。这感觉就像是过去几十年中机器学习所有进步的一个诗意的缩影:IBM的开发人员花了12年时间才生产出深蓝,这是一款在32个IBM RS/6000 SP计算机节点上运行的模型,每秒能够评估近2亿个国际象棋动作,并在1997年击败了国际象棋冠军Gary Kasparov。相比之下,我花了几个小时------只需最少的编码------就创建了一个可以战胜我的程序。
诚然,我怀疑我创造的人工智能能否在国际象棋上击败Gary Kasparov,但这不是重点。关键是,任何玩GPT-4的人都可能有过获得超能力的类似经历:只需付出很少的努力,就可创造出接近或超越自己能力的东西。我们都是IBM的研究人员;我们都是Gary Kasparov。
显然,这既令人激动的,也令人生畏。对于任何在加密货币行业工作的人来说,自然的冲动(在惊叹于机器学习的作用之后)是考虑潜在的中心化vectors,以及如何将这些vectors去中心化到人们可以透明审计和拥有的网络中。目前的模型是通过吸收大量公开的文本和数据来制作的,但现在只有少数人控制和拥有这些模型。更具体地说,问题不是"人工智能会有巨大的价值吗?",而是"我们如何构建这些系统,让任何与之互动的人都能从中获得经济利益,如果他们愿意,确保他们的数据以尊重隐私权的方式使用。"
最近,人们一直在努力暂停或减缓Chat GPT等主要人工智能项目的进展。停止进展可不是解决方案:相反,最好推动模型开源,在模型提供商希望其权重或数据保密的情况下,用链上且完全可审计的保护隐私的ZKP来保护它们。如今,围绕私有模型权重和数据的latter用例在链上还不可行,但ZKP系统的进步将使其在未来成为可能。
2. 可验证和可拥有的机器学习
使用人工智能Chat GPT构建国际象棋感觉相对温和:一个输出相当统一的程序,其不使用侵犯宝贵知识产权或侵犯隐私的数据。但是,当想要保证在API后面运行的模型确实是所告知的模型时,会发生什么?或者,如果想将经过验证的数据注入到链上的模型中,并保证数据确实来自合法的一方?如果想保证提交数据的"人"实际上是人,而不是试图对网络进行女巫攻击的机器人,该怎么办?ZKP,以及它们简洁地表示和验证任意程序的能力,是实现这一点的一种方法。
值得注意的是,当今,在链上机器学习的背景下,ZKP的主要用例是验证计算的正确性。换句话说,ZKP,更具体地说,SNARK(Succinct Non-Interactive Arguments of Knowledge),在ML上下文中因其succinctness(简洁性)属性而最有用。这是因为ZKP保护了Prover(及其处理的数据)的隐私,使其免受窥探的Verifier的攻击。像全同态加密(FHE)、功能加密(Functional Encryption)或可信执行环境(TEE)这样的隐私增强技术更适用于让不可信的Prover在私人输入数据上运行计算(相关更深入地探索不在本文范围内)。
退一步,从更高的层次了解可在ZK中表示的机器学习应用程序的种类。(要更深入地了解ZK,请参看文章 零知识证明算法和硬件改进,Justin Thaler关于SNARK性能的研究,或者a16z的零知识canon。)ZKP通常将程序表示为算术电路:使用这些电路,Prover根据公开和隐私输入生成证明,Verifier在数学上计算出该statement的输出是正确的,而没有获得任何关于隐私输入的信息。
当前仍处于在链上使用ZKP验证计算可行性的早期阶段,但算法的改进正在扩大可行的范围。以下是ZKP在机器学习中应用的五种方法:
- 1)模型真实性
- 2)模型完整性
- 3)Attestations
- 4)去中心化推理或训练
- 5)Proof of Personhood
2.1 ZKP用于证明模型真实性
所谓模型真实性,是指:
- 希望确保实际运行的模型确实是某些实体声称的机器学习模型。
比如:在API后面访问的某模型,相应的模型供应商有多个版本------如,一个更便宜、更不准确的版本,以及一个更昂贵、更高性能的版本。若无证据,就无法知道供应商是否在为你提供更便宜的型号,而你实际上已经为更贵的型号付费(如,供应商希望节省服务器成本并提高利润率)。
要做到这一点,需为模型的每个实例提供单独的证明。实现这一点的一种实用方法是通过Dan Boneh、Wilson Nguyen和Alex Ozdemir的functional commitment框架,这是一种基于SNARK的零知识承诺方案,允许模型所有者对模型进行承诺,用户可以将数据输入到模型中,并接收所承诺模型已运行的verification。某些基于RiscZero(为基于STARK的通用虚拟机)之上构建的应用程序也支持这一功能。Daniel Kang、Tatsunori Hashimoto、Ion Stoica和Yi Sun进行的其他研究(Open-sourcing zkml: Trustless Machine Learning for All)表明,可以在ImageNet数据集上验证有效推理,准确率为92%(与性能最高的非ZK验证ImageNet模型持平)。
但是,仅仅收到已承诺模型已经运行的proof并不一定足够。一个模型可能不能准确地表示给定的程序,所以人们希望承诺的模型由第三方进行审计。Functional commitments允许Prover确定其使用了一个已承诺的模型,但它们不能保证该已承诺模型的任何信息。若能使ZKP具有足够的性能来证明训练(见下面的"2.4 ZKP用于证明去中心化推理或训练"),则有一天也可以开始获得这些保证。
2.2 ZKP用于证明模型完整性
所谓模型完整性,是指:
- 需保证相同的机器学习算法以相同的方式在不同用户的数据上运行。
这在不希望应用任意偏见的领域很有用,比如信用评分决策和贷款申请。也可为此使用functional commitment。要做到这一点,需对模型及其参数进行承诺,并允许人们提交数据。输出将验证模型是否基于已承诺的参数来运行每个用户的数据。或者,模型及其参数可以公开,用户自己可证明其将适当的模型和参数应用于自己的(经过验证的)数据。这在医疗领域可能特别有用,因为法律要求对患者的某些信息保密。在未来,这将使医疗诊断系统能够从保持完全私有的实时用户数据中学习和改进。
2.3 ZKP用于证明Attestations
所谓attestations,是指:
- 将外部verified parties的attestations集成到模型中,或集成到运行在链上的智能合约中。所谓verified parties,是指,如,可生成数字签名的数字平台或硬件。
为此,需要采用ZKP来验签,并将相应的proof作为program的输入。为此,Anna Rose、Tarun Chitra、Daniel Kang、Yi Sun等人于2023年2月的episode Episode 265: Where ZK and ML intersect with Yi Sun and Daniel Kang中讨论了该领域的最新进展。
Daniel Kang、Yi Sun等人论文 ZK-IMG: Attested Images via Zero-Knowledge Proofs to Fight Disinformation 中,旨在验证带有attested传感器的相机拍摄的图像是否经过了裁剪、调整大小或有限编辑等转换------这在证明图像不是深度伪造的,而是经过了某种合法形式的编辑时很有用。Dan Boneh和Trisha Datta也做过类似的工作(见博客Using ZK Proofs to Fight Disinformation),使用零知识证明来验证图像的出处。
但更广泛来看,任何经过数字attested的信息都是这种验证形式的候选者:正在EZKL库(下一节将对此进行详细介绍)工作的Jason Morton称之为"给区块链眼睛"(见视频Zero Knowledge Machine Learning)。任何Signed endpoint:(如,Cloudflare的SXG服务------第三方公证人)都会生成可验证的数字签名,有助于从可信方证明出处和真实性。
2.4 ZKP用于证明去中心化推理或训练
所谓去中心化推理或训练,是指:
- 以去中心化的方式执行机器学习推理或训练,并允许人们向公共模型提交数据。
为此,可在链上部署一个已经存在的模型,或者构建一个全新的网络,并使用ZKP来压缩模型。Jason Morton的EZKL库正在创建一种方法,用于接收ONXX和JSON文件,并将这些文件转换为ZK-SNARK电路。最近ETH Denver的一个演示(见视频How to build and deploy on-chain AI/ML with zero-knowledge machine learning with Jason Morton)显示,可用于创建链上寻宝的图像识别等应用程序,游戏创作者可以上传照片,生成图像证明,玩家可以上传图像;Verifier检查用户上传的图像是否与创建者生成的proof充分匹配。EZKL现在可验证多达1亿个参数的模型,这意味着它可用于验证链上ImageNet大小的模型(有6000万个参数)。
其他团队,如Modulus Labs,正在为链上推理测试不同的证明系统(详细见Modulus Labs 2023年1月30日文档 The Cost of Intelligence: Proving Machine Learning Inference with Zero-Knowledge)。Modulus的基准测试运行了多达1800万个参数。在训练方面,Gensyn正在构建一个去中心化的计算系统,用户可在其中输入公共数据,并通过去中心化的节点网络训练其模型,并验证训练的正确性。
2.5 ZKP用于Proof of Personhood
所谓Proof of Personhood,是指:
- 在不损害隐私的情况下验证某人是一个独特的人。
为此,需创建一种验证方法------如,生物特征扫描,或以加密方式提交政府身份证的方法。然后使ZKP来检查某人是否已经被验证,而不会透露任何关于该人身份的信息,无论该身份是完全可识别的,还是像公钥一样的伪匿名。
Worldcoin的Proof of Personhood协议 通过为用户生成唯一的虹膜码来确保抗女巫攻击的Proof of Personhood。至关重要的是:
- 为WorldID创建的私钥(以及为Worldcoin用户创建的加密钱包的其他私钥) 与 该项目的眼睛扫描orb在本地生成的虹膜码 完全分离。
这种分离将 生物特征标识符 与 任何形式的用户密钥 完全分离,这些密钥可能属于一个人。Worldcoin还允许应用程序嵌入一个SDK来支持用户使用WorldID登录,并通过利用ZKP保护隐私 来 允许应用程序检查个人是否拥有WorldID,但不支持追踪个人用户(具体见Worldcoin博客PRIVACY AT WORLDCOIN)。
Worldcoin的Proof of Personhood协议利用的是ZKP的隐私保护属性,对抗较弱、更恶意人工智能形式的实例。因此与之前的其它例子截然不同(如,在不透露任何关于自己的信息的情况下证明你是一个真人,而不是机器人)。
3. 模型架构及挑战
SNARK(Succinct Non-Interactive Arguments of Knowledge)证明系统的突破是将许多机器学习模型放到链上的关键驱动因素。
一些团队正在使用现有架构(包括Plonk、Plonky2、Air等)制作自定义电路。在自定义电路方面:
- 1)Halo2已经成为Daniel Kang等人(见博客Trustless Verification of Machine Learning)和Jason Morton的EZKL项目中使用的流行后端。
- Halo2的证明时间是准线性的,证明大小通常只有几千字节,Verifier时长是恒定的。
- 更重要的是,Halo2拥有强大的开发工具,使其成为开发人员使用的流行SNARK后端。
- 2)其他团队,如RiscZero,正致力于通用VM策略。
- 3)其他人正在使用Justin Thaler基于sum-check协议的超高效证明系统(见2020年Justin Thaler博客The Unreasonable Power of the Sum-Check Protocol)创建自定义框架。
从绝对意义上讲,证明生成和验证时长取决于生成和检查证明的硬件以及用于证明生成的电路的大小。但需注意的关键是,无论所代表的程序是什么,证明大小总是相对较小的,因此Verifier检查证明的负担是有限的。然而,这里有一些微妙之处:对于像Plonky2这样使用基于FRI承诺方案的证明系统,证明大小可能会增加。(除非它最后被包裹在一个基于pairing的SNARK中,如Plonk或Groth16,这样它们的大小不会随着statement的复杂性而增加。)
机器学习模型的含义是,一旦设计了一个准确表示模型的证明系统,实际验证输出的成本将非常低廉。
- 开发人员最需要考虑的是Prover的时间和内存:以一种可相对快速地证明模型的方式来表示模型,且证明大小最好在几千字节左右。
- 为了具有零知识属性地证明机器学习模型的正确执行,需对模型架构(层、节点和激活函数)、参数、约束和矩阵乘法运算进行编码,并将它们表示为电路。
这涉及到将这些属性分解为可在有限域上执行的算术运算。
该领域仍处于萌芽阶段。
- 在将模型转换为电路的过程中,精度和保真度可能会受到影响。
- 当模型被表示为算术电路时,可能需要对上述模型参数、约束和矩阵乘法运算进行近似和简化。
- 当算术运算被编码为证明的有限域中的元素时,可能会损失一些精度(或者在当前零知识框架下,如果没有这些优化,生成证明的成本将高得难以承受)。
- 此外,为了精确起见,机器学习模型的参数和激活通常被编码为32位,但当今的ZKP无法在没有大量开销的情况下以必要的算术电路格式表示32位浮点运算。因此,开发人员可能会选择使用量化的机器学习模型,其32位整数已经转换为8位精度。这些类型的模型有利于表示为ZKP,但被验证的模型可能是更高质量初始模型的粗略近似。
在现阶段,这无疑是一场追赶游戏。随着ZKP变得更加优化,机器学习模型的复杂性也在增加。已经有许多有前景的优化领域:
- 递归证明可通过允许将proof用作下一个proof的输入来减少总体证明大小,即解锁证明压缩。
- 还有一些新兴的框架,比如Linear A的Apache Tensor虚拟机(TVM)的分支,提出了一种将浮点数转换为零知识友好整数表示的转换器(见https://github.com/zk-ml/tachikoma(Python和C++))。
- a16z团队乐观地认为,未来 将浮点数表示为SNARK中32位整数 将更合理。
4 "scale(扩容)"的双重定义
ZKP通过压缩实现扩容:
- SNARK允许对一个极其复杂的系统(虚拟机、机器学习模型)进行数学表示,以便验证它的成本低于运行它的成本。
- 机器学习通过expansion进行扩容:如今的模型随着更多的数据、参数,以及参与训练和推理过程的GPU/TPU 而越来越好。中心化公司可 以几乎无限的规模运行服务器:每月对API调用收取费用,并承担运营成本。
区块链网络的经济现实几乎是相反的:鼓励开发者优化其代码,使其在链上运行具有计算可行性(且成本低廉)。这种不对称性有一个巨大的好处:
- 创造了一个需要提高证明系统效率的环境。
我们应努力寻找方法,要求区块链在机器学习中提供同样的好处,即可验证的所有权和共享的真理概念。
虽然区块链已经激励优化zk-SNARK,但计算领域的每个领域都将受益。
参考资料
[1] a16z团队2023年5月博客 Checks and balances: Machine learning and zero-knowledge proofs