BSV 上的零知识隐私机器学习

news2024/12/22 20:07:08

此前,我们已经演示了在 BSV 上运行一个成熟的深度神经网络,其中机器学习 (ML) 算法的输入和模型都是公开的。在实践中,通常希望将输入或模型保持在链下并因此保持私有,同时仍确保 ML 算法如实运行。我们通过将零知识证明 (ZKP) 应用于 ML 来实现这一点。

零知识链上机器学习

涉及 ML 时,有两类隐私信息:

  • 隐私输入

模型的输入是隐私的,但模型本身是公开的。这对于涉及敏感和隐私数据的应用程序特别有用,例如财务记录、生物识别数据(例如指纹、面部)、医疗记录和位置信息。例如,可以证明他已经超过21岁而无需透露他的年龄。或者保险公司使用信用评分模型进行贷款审批。该模型是为提高透明度而公开的,但申请人的工资和银行对账单等输入内容应保密。

  • 隐私模型

模型的输入是公开的,但模型本身是私有的,通常是因为它是知识产权和专有的。例如,我们使用一家私人公司拥有的肿瘤分类模型来从图像中检测肿瘤。在对公共数据集进行分类时,该模型被证明具有 99% 的准确率。公司可以只发布其模型的密码承诺,即所有模型参数的哈希。我们可以确定该模型是合法的,虽然没有看到它。为了公平起见,密码学承诺还确保将相同的模型应用于每个人。这在例如根据候选人的公开信息对候选人进行排名的录取模型中是需要的。

ZKP 非常适合在使用链上 ML 时保留隐私,因为它可以在链下隐藏信息,同时证明 ML 推理是正确的。

手写数字分类

作为演示,我们实现了一个简单的手写数字分类模型。该模型使用来自 MNIST 数据集的标记示例进行训练。该模型的架构与我们用于完全链上模型的架构非常相似。

在这里插入图片描述
我们使用 ZoKrates 构建 ZK 电路,它可以通过简单地使用关键字 private 声明它来简单地将任何输入设为私有。

隐私输入

def main(private u64[N_NODES_IN] model_inputs
         u64[N_NODES_HL][N_NODES_IN] weights0, \
         u64[N_NODES_OUT][N_NODES_HL] weights1, \
         u64[N_NODES_HL] biases0, \
         u64[N_NODES_OUT] biases1, \) {
    u64[N_NODES_HL] step0 = apply_weights0(model_inputs, weights0);
    u64[N_NODES_HL] step1 = add_biases0(step0, biases0);
    u64[N_NODES_HL] step2 = apply_relu(step1);
    u64[N_NODES_OUT] step3 = apply_weights1(step2, weights1);
    u64[N_NODES_OUT] step4 = add_biases1(step3, biases1);
    u64 res = argmax(step4);

    assert(res == TARGET_CLASS);
    return;
}

从上面的代码中,我们可以看到模型的输入 model_inputs 作为私有参数传递,同时模型参数(权重和偏差)是公开的。一旦我们将输入传递给模型,电路就会对数据执行所有模型操作并输出模型预测/类别。

隐私模型

以下是将模型设为私有的代码。

def main(private u64[N_NODES_HL][N_NODES_IN] weights0, \
         private u64[N_NODES_OUT][N_NODES_HL] weights1, \
         private u64[N_NODES_HL] biases0, \
         private u64[N_NODES_OUT] biases1, \
         u64[N_TEST_EXAMPLES][N_NODES_IN] test_examples, \
         u64[N_TEST_EXAMPLES] test_labels) {
    u32 mut correct = 0;

    for u32 idx_test_example in 0..N_TEST_EXAMPLES {
        u64[N_NODES_HL] step0 = apply_weights0(test_examples[idx_test_example], weights0);
        u64[N_NODES_HL] step1 = add_biases0(step0, biases0);
        u64[N_NODES_HL] step2 = apply_relu(step1);
        u64[N_NODES_OUT] step3 = apply_weights1(step2, weights1);
        u64[N_NODES_OUT] step4 = add_biases1(step3, biases1);
        u64 res = argmax(step4);

        u32 to_add = if res == test_labels[idx_test_example] { 1 } else { 0 };
        correct = correct + to_add;
    }

    assert((correct * 100) / (N_TEST_EXAMPLES * 100) >= TARGET_CA);
    return;
}

这里我们不传递模型输入数据,而是将模型参数本身作为隐私输入。使用这些秘密参数,电路执行模型的所有必要操作,并将结果与​​一批测试示例进行比较。如果模型达到某个分类准确率 (CA) 阈值,则执行成功。

第一个场景和第二个场景的完整代码都可以在 GitHub 上找到。

总结

我们已经演示了如何利用 zk-SNARKS 的 ZK 属性进行链上机器学习,这允许我们隐藏 ML 计算的特定部分。

参考

零知识机器学习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/115921.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你确定没有滥用 goroutine 吗

写在前面 学习 golang ,路还很长呢,犹记得刚开始学习 golang 的时候,写起来确实非常简单,有很多包和工具使用,不需要重复造轮子,但是要真的学好一门语言作为工具,对于其原理是非常有必要学懂的…

极限多标签学习综述(Extreme Multi-label Learning)

A Survey on Extreme Multi-label Learning 先给地址: https://arxiv.org/abs/2210.03968 博主曾整理过Multi-Label Image Classification(多标签图像分类),但这类任务中所用的数据集往往较小,分类数量并不多。但在更…

JavaScript的原型链

JavaScript的原型链 JavaScript的继承主要是通过原型链实现的,所以理解原型链是掌握JavaScript继承的关键一环。原型链的继承的基本思想是通过原型链继承多个引用类型的属性和方法。 理解原型链 关于原型链的定义与理解: 每个构造函数都有一个原型对…

Python实现将位图描摹为彩色矢量 svg 图片的源代码,Python实现位图转彩色矢量代码

Color Trace 这是一个将位图描摹为彩色矢量 svg 图片的程序,是一个命令行工具,使用 Python 脚本实现,运行环境 Python3.8。 ✨ 效果 以一个字帖图片为例,这是 png 格式的位图(370KB): 这是颜…

多智能体强化学习环境【星际争霸II】SMAC环境配置

多智能体强化学习这个领域中,很多Paper都使用的一个环境是——星际争多智能体挑战(StarCraft Multi-Agent Challenge, SMAC)。最近也配置了这个环境,把中间一些步骤记录下来。2022.12.26 文章目录1 环境介绍1.1 相关论文1.2 项目代码地址2 安装过程3 相关…

2023年pmp的考试时间是什么时候?(含pmp资料)

不出意外,按照原计划,就是3、6、9、12月,22年11月延期考试地区的考生或者退考的估计会在3月或者6月考。具体就及时关注官网消息。 ​新版中文报名网站:中国国际人才交流基金会 这里说一下PMP的基本考试情况: 【考试注…

模型实战(2)之YOLOv5 实时实例分割+训练自己数据集

模型实战(2)之YOLOv5 实时实例分割训练自己数据集 本文将详解YOLOv5实例分割模型的使用及从头训练自己的数据集得到最优权重,可以直接替换数据集进行训练的训练模型可通过我的gitcode进行下载:https://gitcode.net/openmodel/yolo…

使用matplotlib画图 + python色彩大全

目录画线画点散点画点的形状、线的形状画点线在特定位置写文字plt.legend()中图例的位置方法一 plt.legend(loc4)方法二 plt.legend(bbox_to_anchor(num1, num2))方法三 bbox_to_anchor(1.05, 1), loc2, borderaxespad0保存图片指定图片大小网格线根据自己的需求做了一个画图的…

图的最短路径

文章目录单源最短路径-Dijkstra算法单源最短路径--Bellman-Ford算法多源最短路径--Floyd-Warshall算法单源最短路径-Dijkstra算法 针对一个带权有向图G,将所有结点分为两组S和Q,S是已经确定最短路径的结点集合,在初始时为空(初始…

如何使用监控诊断工具Arthas(阿尔萨斯)

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信…

【python】实现精美圣诞树-拿下女神不是梦

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专…

Java Web基础面试题

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:Java面试题…

【K3s】第4篇 一篇文章带你了解使用Kompose

目录 1、Kompose介绍 2、安装Kompose 3、docker-compose文件转换为k8s文件 1、Kompose介绍 kompose是一个帮助熟悉 Kubernetes 的用户迁移到k8s的工具。 获取 Docker Compose 文件并将其转换为 Kubernetes 资源。 kompose是一个方便的工具,可以从本地 Docker …

Ffuf爆破神器(超详细)

目录为什么是Ffuf基本使用最基本的使用多个字典同时使用带cookie扫描(-b)静默模式(-s)递归扫描(-recursion)指定扩展名(-e)POST请求爆破方式1:指明请求地址和请求体【不推…

iOS 自动化测试踩坑(一): 技术方案、环境配置与落地实践

移动端的自动化测试,最常见的是 Android 自动化测试,我个人觉得 Android 的测试优先级会更高,也更开放,更容易测试;而 iOS 相较于 Android 要安全稳定的多,但也是一个必须测试的方向,这个系列文…

Android实现雪花特效自定义view

一、前言 这个冬天,老家一直没有下雨, 正好圣诞节,就想着制作一个下雪的特效。 圣诞祝福:平安夜,舞翩阡。雪花飘,飞满天。心与心,永相伴。 圣诞节是传统的宗教节日,对于基 督徒&…

前端自学你还在浪费时间吗?

其实最主要不是学的过程,而是学完后,你有没有把今天的练习题自己在重新敲个2,3遍,这样印象就会更加深刻,以后自己写代码的时候也会更加的得心应手。 手抄笔记让我打好了HTML基础和良好的CSS能力,当然这不一…

Cesium打包入门(gulp与esbuild)

本文针对Cesium源码包的打包工具gulp和esbuild进行了初步探讨,属于入门篇。 首先简要介绍采用gulpesbuild如何为多个源代码文件打包成一个单独文件,然后介绍了下Cesium中的源码包的结构,并简要分析了其打包的相关函数。 本文编译环境IDE使用…

【并发编程学习】一、线程的基本认识

一、线程的基本认识 1.1线程的基本介绍 线程是什么? 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运行单位。 为什么会有多线程? ①因为其是CPU的最小调度单位,所以在多核CPU中&#xff0c…

圣诞节,深圳街头有点冷清了~

正文大家好,我是bug菌~今天是圣诞节,这也是我新冠康复的第二周了吧,还有点小咳嗽,伴随有点鼻炎,不过这周已经上了三天班了,整体感觉还算好吧,毕竟我嘴巴不硬,也比较低调不嚣张&#…