查看原文
其他

ZK-SNARKs如何通过zkML(zk Machine Learning) 为私有机器学习模型带来透明度

杨赟博 隐私计算研习社 2024-01-09


1

前沿介绍

机器学习(ML)正逐渐融入我们的生活,从社交媒体上的内容到医疗决策都有所应用。ML模型越来越多地在封闭的API中执行,这样做有几个原因:

1. 如果模型是基于用户数据(例如医疗数据)训练的,由于隐私原因,模型权重可能无法透露;

2. 同时,公司也希望保护商业秘密。例如,Twitter最近开源了他们的"For You"时间线排序算法,但由于隐私原因无法发布权重,与此同时,OpenAI也没有发布GPT-3或4的权重。

随着ML与我们的生活逐渐合二为一,我们越来越需要确保ML模型具有理想的性质,且是正确地被训练出来的。对于ML来说,我们需要保证模型按照承诺的方式运行(计算完整性),并且使用了正确的权重(同时保持隐私)。例如,对于GPT和Twitter排序模型,我们希望确认模型的结果一直是正确的,且无需经过审查的。那么我们如何平衡对隐私(用户数据和模型权重)和透明性的需求呢?

为了实现这一目标,我们可以使用一种称为ZK-SNARKs的加密技术。ZK-SNARKs具有看似神奇的特性,可以让ML模型的所有者证明模型的诚实执行,而不需要透露权重!

在本文的其余部分,我们将介绍ZK-SNARKs是什么以及如何使用它们来平衡隐私和透明性的目标。我们还将介绍如何使用本文最近开源的框架zkml生成ML模型的ZK-SNARKs。

2

zkSNARKs在ML中的使用

zkSNARKs一种关键的加密基础模块,它可以实现保护隐私的计算,全称是零知识简洁非交互式知识论证(ZK-SNARK),ZK-SNARK是一种强大的加密原语,允许一方在不透露计算输入信息的情况下证明计算的有效性,ZK-SNARK还不需要除证明之外的任何交互,并且不需要计算验证者执行计算本身。


ZK-SNARK也是简洁的,意味着它们相对于计算来说很小(通常是常数大小或对数大小)!具体来说,即使是大型模型,证明通常都小于5kb。我们经常可以使用zkSNARK来压缩证明的大小,以达到更好的传输效率,因为许多加密协议需要千兆字节甚至更多的通信,可以节省高达六个数量级的通信。


给定一组公共输入(x)和私有输入(w),ZK-SNARKS可以证明在这些值之间存在一个关系F(x,w),而不泄露私有输入。例如,证明者可以证明他们知道数独问题的解,在这个例子中,公共输入是初始的数字,私有输入是构成解的其余数字。


在机器学习的背景下,ZK-SNARKs可以证明机器学习模型的正确执行,同时不泄露模型的权重。


在这种情况下,模型权重w是私有输入,模型的输入特征F和输出O是公共输入的一部分。为了识别模型,我们还在公共输入中包括了一个模型承诺C。模型承诺类似于哈希,因此如果权重被修改了,承诺也会不同。


因此,x = (C,F,O),然后,我们要证明的关系是,在某个私有的权重值w下,具有承诺C的模型在输入F上输出了O。


如果验证者获得了证明π(和x),他们可以验证机器学习模型是否正确运行。


举个具体的例子,Twitter可以证明他们公正地运行了排名算法来生成你的时间线,医疗机器学习提供商也可以提供证明,证明特定经监管机构批准的模型也是公正执行的。


3

用zkML解决模型训练的不信任问题

我们已经将我们的库zkml开源,用于构建ML模型执行的证明,并允许任何人验证这些证明。但首先,让我们看一下标准的ML提供商会做什么:


正如我们所看到的,ML的使用者提供输入,但也无法确保模型的正确执行。使用zkml,我们可以添加一个步骤来确保模型的正确执行!正如我们所看到的,ML消费者不了解权重相关的任何信息。


为了演示如何使用zkm执行一个机器学习模型,我们将构建一个在MNIST上达到99.5%准确率的模型的证明。zkml将生成证明,同时也会生成证明密钥和验证密钥,这使得证明者可以生成证明(证明密钥),而验证者可以验证执行是否诚实(验证密钥)。


首先,为了构建证明、证明密钥和验证密钥,只需执行以下命令:

# Installs rust, skip if you already have rust installed
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

# This should take ~8s to run the first time and ~4s to run the second time
./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>


这里看到的输出是模型的逻辑值,可以转换为概率。可以看到,第5个输出最大,表示模型正确地分类了第5个。


根据证明,验证者可以验证ML模型在没有模型权重的情况下正确执行。这里,vkey是验证密钥,proof是π,public_vals是公共输出。

$ ./target/release/verify_circuit examples/mnist/config.msgpack vkey proof public_vals kzg

Proof verified!


这表明证明已被正确验证。请注意,验证者只需要配置、验证密钥、证明和公共值!

作者: Daniel Kang

翻译: 杨赟博

来源:https://medium.com/@danieldkang/bridging-the-gap-how-zk-snarks-bring-transparency-to-private-ml-models-with-zkml-e0e59708c2fc

分享仅供学习参考,若有不当,请联系我们处理


END

1.会议征稿|第六届“大数据安全与隐私计算”学术会议通知

2.论文分享|联邦学习赋能6G网络综述

3.会议信息 | 2023年10月截稿的密码学与信息安全会议整理

4.深入浅出格密码理论(三)|对偶格


继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存