本文探讨了机器学习模型在隐私和透明性之间的平衡问题,介绍了零知识简洁非交互式知识论证(ZK-SNARKs)如何在不泄露模型权重的情况下证明模型正确执行。通过开源框架zkml,本文提供了利用ZK-SNARKs进行机器学习模型信任执行的具体示例,展示了该技术在社交媒体和医疗领域的潜在应用。
由 Daniel Kang 和 Edward Gan 撰写
机器学习(ML)越来越多地融入我们的生活,从我们在社交媒体上看到的内容到医疗决策。然而,ML 模型越来越多地在封闭的 API 后执行。这背后有很好的理由:如果模型是在用户数据(例如医疗数据)上训练的,出于隐私原因,可能无法公开模型权重,公司也希望保护商业机密。例如,Twitter 最近开源了他们的 “For You” 时间线排名算法,但由于隐私原因无法发布权重。OpenAI 也未发布 GPT-3 或 4 的权重。
随着 ML 的不断整合,越来越需要确保 ML 模型具有理想的性质并且能够诚实执行。对于 ML,我们需要确保模型照承诺运行(计算完整性)并且使用了正确的权重(同时保持隐私)。例如,对于 GPT 和 Twitter 排名模型,我们希望确认模型结果在任何时候都是一致的、没有偏见和审查。我们如何在隐私(用户数据和模型权重)和透明性之间取得平衡?
为了实现这一点,我们可以使用一种称为 ZK-SNARKs 的加密技术。ZK-SNARKs 似乎具有神奇的属性,可以让 ML 模型的拥有者证明模型以诚实的方式执行而无须透露权重!
在接下来的部分中,我们将描述 ZK-SNARKs 是什么,以及如何使用它们在隐私和透明性之间取得平衡。我们还将描述如何使用我们最近的 开源 框架 zkml 来生成 ML 模型的 ZK-SNARKs。
了解支持隐私计算的一个关键加密构件是很重要的:零知识紧凑非交互式知识论证(ZK-SNARK)。ZK-SNARKs 是一种强大的加密原语,它允许一方在不透露任何与计算输入相关的信息的情况下,证明计算的有效性!ZK-SNARKs 还不需要除了证明以外的任何交互,也不需要计算的验证者执行计算本身。
ZK-SNARKs 也是 紧凑 的,这意味着它们相对计算是小的(通常是常数或对数大小)!具体来说,对于即使是大型模型,证明通常小于 5kb。这是受欢迎的,因为许多种加密协议需要商品字节或更多的通信,从而节省了多达 六个数量级 的通信。
给定一组公共输入(x)和私有输入(w),ZK-SNARKs 可以证明值之间存在关系 F(x,w),而不揭示私有输入。例如,证明者可以证明他们知道一个数独问题的解决方案。在这里,公共输入是起始方格,私有输入是构成解决方案的其余方格。
在 ML 的上下文中,ZK-SNARKs 可以证明 ML 模型正确执行 而不 揭示模型权重。在这种情况下,模型权重 w 是私有输入,模型输入特征 F 和输出 O 是公共输入的一部分。为了识别模型,我们还在公共输入中包含一个 模型承诺 C。模型承诺的功能类似于哈希,因此,如果权重被修改,承诺很有可能也会不同。因此 x = (C,F,O)。然后我们想要证明的关系是,对于某些私有权重值 w,拥有承诺 C,模型在输入 F 上输出 O。
如果验证者给出了证明 π(和 x),他们可以验证 ML 模型是否正确运行:
举个具体的例子,Twitter 可以证明他们诚实地运行了他们的排名算法来生成你的时间线。医疗 ML 提供商也可以提供证明,表明特定的监管机构批准的模型是诚实执行的。
我们已经将我们的库 zkml 开源,用于构建 ML 模型执行的证明,允许任何人验证这些证明。但首先,让我们看看标准的 ML 提供者会做什么:
具有 ML 模型消费者和提供者的标准 ML 流程
如上所示,ML 消费者提供输入,但没有确保模型正确执行的保证!通过 zkml,我们可以添加一个步骤来提供模型正确执行的保障!如下图所示,ML 消费者对权重没有任何了解:
使用 zkml 扩展标准 ML 流程
为了演示如何使用 zkml 无信任地执行 ML 模型,我们将构建一个在 MNIST 上达到 99.5% 准确率的模型证明,这是一个标准的 ML 图像识别数据集。zkml 将生成证明,还将生成允许证明者生成证明的证明密钥和允许验证者验证执行是否诚实的验证密钥。首先,构建证明、证明密钥和验证密钥,只需执行以下命令:
## 安装 rust,如果你已经安装了 rust,可以跳过
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
git clone https://github.com/ddkang/zkml.git
cd zkml
rustup override set nightly
cargo build --release
mkdir params_kzg
## 第一次运行大约需要 8 秒,第二次运行需要约 4 秒
./target/release/time_circuit examples/mnist/model.msgpack examples/mnist/inp.msgpack kzg
这将构建证明,证明密钥在此过程中生成。在这里,model.msgpack 是模型权重,inp.msgpack 是模型的输入(在此情况下,它是一个手写的 5 的图像)。证明生成还将生成公共值 x(包括模型承诺),我们将在下一步中使用。它还将生成验证密钥,如上所述。你将看到以下输出:
<snip>
final out[0] x: -5312 (-10.375)
final out[1] x: -8056 (-15.734375)
final out[2] x: -8186 (-15.98828125)
final out[3] x: -1669 (-3.259765625)
final out[4] x: -4260 (-8.3203125)
final out[5] x: 6614 (12.91796875)
final out[6] x: -5131 (-10.021484375)
final out[7] x: -6862 (-13.40234375)
final out[8] x: -3047 (-5.951171875)
final out[9] x: -805 (-1.572265625)
<snip>
在这里看到的输出是模型的 logits,可以转换为概率。如我们所见,第五个输出是最大的,这意味着模型正确地分类了 5。
给定证明,验证者可以在 没有 模型权重的情况下验证 ML 模型是否正确执行。在这里,vkey 是验证密钥,证明是 π,而 public_vals 是公共输出:
$ ./target/release/verify_circuit examples/mnist/config.msgpack vkey proof public_vals kzg
Proof verified!
它会显示证明正确验证。请注意,验证者只需要配置、验证密钥、证明和公共值!
我们会有更多的博文来详细描述 zkml 的应用!查看我们的 开源仓库,如果你想讨论你的想法或与我们进行头脑风暴,请填写 此表格!
感谢 Yi Sun 对此博客文章的评论。
- 原文链接: medium.com/@danieldkang/...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!