使用 Concrete ML 构建端到端加密的类 23andMe 基因测试应用程序

  • ZamaFHE
  • 发布于 2024-07-18 17:24
  • 阅读 15

本文介绍了如何使用 Concrete ML 构建一个端到端加密的类似于 23andMe 的基因测试应用程序。文章重点介绍了 Zama Bounty Program Season 5 中两个获胜的解决方案,它们都使用了全同态加密(FHE)来保护敏感的 DNA 数据,并对这两种方案的实现原理、精度和性能进行了分析,展示了 FHE 在保护个人身份信息(PII)方面的价值。

博客

/

教程

Concrete ML

使用 Concrete ML 构建一个端到端加密的类似 23andMe 的基因测试应用程序

2024 年 7 月 17 日

  -

Andrei Stoian


 Zama Bounty Program 第 5 季的一个挑战是使用全同态加密 (FHE) 创建一个加密版本的 23andMe(或其他 DNA 测试平台)。Github 用户 Alephzerox 和 Github 用户 Soptq 成功完成了这个赏金,这篇博客文章是基于他们的贡献。对 Zama Bounty Program 好奇吗?在 Github 上了解更多。

超过 3000 万人已经进行了 DNA 测试,以通过计算机基因血统学确定他们的祖先。通过处理 DNA 碱基的数字化序列,复杂的计算机算法可以识别一个人的祖先是否来自由共同地理起源的祖先确定的一些人口群体。DNA 是敏感的个人身份信息 (PII),因为它可以唯一地识别一个人,并且 DNA 数据泄露已经发生。

Zama Bounty Program 奖励那些构建应用程序的开发人员,这些应用程序展示了 FHE 为保护敏感数据带来的价值,而 DNA 是需要保护的最重要的 PII 之一。在 Zama Bounty Program 的第 5 季中,我们挑战我们的社区构建一个机器学习系统,该系统可以确定加密的 DNA 数据上的祖先。

两个解决方案分享了第一名,并在本博客中讨论:一个由 Github 用户 alephzerox 提供,另一个由 Github 用户 soptq 提供。

两位获胜者实施了不同的策略,但共享类似的数据管道。两种解决方案都使用了来自 1000 genomes project 的 DNA 数据。人类有 23 对染色体,即 DNA 遗传物质的包,并且所提出的解决方案使用来自 22 号染色体的数据。为了这些算法的目的,染色体被表示为 1 和 0 的向量,其中每个这样的二进制值表示染色体中某个位置的基因变异。这些值称为单核苷酸多态性 (SNP)。

让我们看看第一个解决方案:使用 ML 来预测祖先

Github 用户 soptq 采取的方法遵循 Gnomix [1] 并检查 517 个 窗口 - DNA 描述向量的间隔 - 使用逻辑回归预测器来确定每个窗口的祖先。在第二步中,使用第二个分类器聚合这些窗口的决策,该分类器确定人的祖先混合。

下面是基因组数据的一个例子。总的来说,该数据集包含 4480 个人,使用的染色体有 1,059,079 个 SNP。

## 训练集个体
[1 0 1 1 0 1 0 0 0 1 0 0 ... 1]
[1 0 1 0 1 1 0 0 0 1 1 0 ... 0]

在预处理步骤中,基于称为“创始人”的“纯血统”基因组生成训练数据。这些基因组被手动分配了祖先,并被认为具有单一的祖先。为了获得训练数据,执行“混合”模拟:随机的父母基因组以随机比例组合,并计算合成标签 - 生成的基因组中包含的祖先比例。

首先,在第 22 号染色体 SNP 向量中生成随机断点。

num_snps = 10  # 染色体中 SNP 的总数

breakpoints = np.random.choice(
range(1, num_snps),
size=int(sum(np.random.poisson(0.75, size=gen))) + 1,  # 中断点的数量
replace=False  # 没有重复的中断点
)

接下来,使用第 22 对染色体中的一条染色体,在这些随机断点处将 SNP 从一个父本复制到另一个父本:

## 父母 2:选择第 22 对染色体中的一条随机染色体
snp, label = (snp_1, label_1) if random.random() < 0.5 else (snp_2, label_2)

...

## 父母 2:选择第 22 对染色体中的一条随机染色体
_snp, _label = (_snp_1, _label_1) if random.random() < 0.5 else (_snp_2, _label_2)

## 将 SNP 从父母 1 复制到父母 1 和 2 的“混合”后代
snp[breakpoints[i]:breakpoints[i + 1]] =
_snp[breakpoints[i]:breakpoints[i + 1]].copy()

## 生成合成祖先标签
label[breakpoints[i]:breakpoints[i + 1]]
= _label[breakpoints[i]:breakpoints[i + 1]].copy()

一旦生成了训练数据,它将被分成三个集合:第一阶段训练集,第二阶段训练集和验证集。首先,Github 用户 soptq 为分类管道的第一阶段训练逻辑回归模型,用于染色体中的每个位置。如下面的代码片段所示,Concrete ML 分类器是 scikit-learn 分类器的即插即用替代品,这简化了开发。

from concrete.ml.sklearn import LogisticRegression

## 计算染色体中的窗口数
n_windows = chromosome_length // window_size    # 窗口数
context = int(window_size * 0.5)            # 窗口之间的重叠

## 初始化 Concrete ML 逻辑回归模型
## 每个染色体中的每个窗口位置都有一个模型
## 训练在清晰的数据上完成
base_models = [LogisticRegression(n_bits=8,\
penalty="l2",\
C=3.,\
solver="liblinear",\
max_iter=1000) for _ in range(n_windows)]

## 提取一些上下文重叠的窗口
padded_window_size = window_size + 2 * context
## 每个窗口的起始索引
idx = np.arange(0, chromosome_length, window_size)[:-2]
## 从第一阶段训练集 X_t 中提取窗口
## 为每个窗口分类器创建训练数据
X_b = np.lib.stride_tricks.sliding_window_view(
X_t,
padded_window_size,
axis=1)[:, idx, :]

## 训练染色体中每个窗口的模型
models_with_data_and_labels = tuple(
zip(models[:-1],
np.swapaxes(X_b, 0, 1),
np.swapaxes(y_t, 0, 1)[:-1])
)

for (model, x, y) in tqdm(models_with_data_and_labels):
    model.fit(x, y)
    model.compile(x)

这种方法的第二阶段基于第一阶段的预测来预测染色体的全局祖先。要训练第二阶段,必须首先在第二个训练集分割上计算第一阶段分类器的预测。

## 第二个训练分割 X_p 的滑动窗口提取
X_b = np.lib.stride_tricks.sliding_window_view(X_p, padded_window_size, axis=1)[:, idx, :]
models_and_1st_stage_proba = tuple(zip(models[:-1], np.swapaxes(X_b, 0, 1)))

## 使用清晰的预测来为第二阶段生成训练数据
prob_X_t2 = np.array([model.predict_proba(x, fhe="disable")\
for (model, x) in models_and_1st_stage_proba]
)

接下来,训练并编译第二阶段分类器。使用 4 位的量化,这是基于树的模型的最佳设置,树的最大深度设置为 4,以避免过度拟合。

from concrete.ml.sklearn import XGBClassifier

smoother = XGBClassifier(
     n_bits=4, n_estimators=100, max_depth=4,
    learning_rate=0.1, reg_lambda=1, reg_alpha=0,
    n_jobs=N_JOBS, random_state=SEED,
    use_label_encoder=False, objective='multi:softprob',
)

X_slide, y_slide = slide_window(prob_X_t2, 75, y_t)
smoother.fit(X_slide, y_slide)
smoother.compile(X_slide, p_error=P_ERROR)

Concrete ML 分类器在清晰数据上训练时(如本例所示),在底层使用 scikit-learn 训练算法。因此,支持数据科学家熟悉的所有超参数设置,如上面的代码所示。

Github 用户 soptq 方法的准确率达到 96%,并且推断个人加密基因组的祖先的延迟约为 300 秒。

仔细看看第二个解决方案:在基因组参考面板中进行相似性搜索

Github 用户 alephzerox 提出的第二个解决方案实现了 SALAI-Net 论文 [2],并且依赖于个体的参考面板。这组基因组包含“纯血统”个体,并标有应用程序想要识别的祖先。查询染色体是必须受到保护的敏感信息,并且已加密,而参考面板可以保持清晰。

该算法的第一步是计算查询染色体和每个参考面板染色体之间共同 SNP 的数量。将 SNP 向量中的 0 值转换为 -1,第一步通过使用每个查询染色体 SNP 向量和每个参考面板染色体之间的乘法,然后是聚合匹配的Rollup来执行。

from concrete import fhe

reference_panel = self._reference_panel          # 清除参考面板
snp_count = self._active_batch_samples.shape[1]     # 每条染色体的 SNP 数量
window_size = self._model_parameters.window_size    # 分析窗口大小
population_count = reference_panel.population_count # 参考面板的大小

## ------------ 计算 SNP 匹配 ------------
samples_slice = self._active_batch_samples
snp_matches = snps * samples_slice  # 乘法以检查匹配

## ------------ 计算窗口相似性得分 ------------
snp_matches_reshaped = snp_matches.reshape(1, 1, population_count, snp_count)

sum_kernel = np.array([[[[1] * window_size]]])
window_similarity_scores = fhe.conv(snp_matches_reshaped, sum_kernel, strides=(1, window_size))

在第二步中,以滑动窗口的方式在原始相似性得分上应用“平滑”内核。该内核具有类似于在 SALAI-Net 论文 [2] 中学习的波浪形形状。

per_population_scores = per_population_scores.reshape(population_count, 1, window_count)

smoother_kernel = inference_task.model_parameters.smoother_weights_as_tensor

smoother_kernel_size = len(smoother_kernel)
smoother_kernel = smoother_kernel.reshape(1, 1, smoother_kernel_size)

smooth_scores = f.conv1d(per_population_scores, smoother_kernel, padding=smoother_kernel_size // 2)

因此,在查询染色体的每个窗口中,我们获得了该窗口中与参考面板染色体链的相似性得分。将 Top-1 参考染色体作为与特定窗口关联的标签。最后,从预测的每个参考面板祖先的频率中计算每个祖先的百分比。在提交的方法中,Top-1 计算不是在 FHE 中执行的,尽管使用 Zama Concrete 库 中的 max-pool 运算符很容易实现。

Github 用户 alephzerox 方法在 1000 个基因组数据集的测试集上的准确率为 96%,前提是每个祖先的参考面板包含 40 个创始人。准确性与每个祖先的创始人数量成正比:

创始人 准确性
1 29%
5 50%
10 66%
40 96%

对于此设置,使用 40 个创始人,在大型 192 核机器上,FHE 延迟应为数十分钟的量级。

结论

两种解决方案都实现了祖先分类的良好准确性。尽管采用了不同的方法,但两种解决方案之间的延迟复杂度相似,第二种解决方案执行了更多的线性计算:与标量相乘和Rollup。对于需要 PBS 的非线性计算,Github 用户 soptq 解决方案中使用的 XGBoost 分类器在 FHE 中具有与 Github 用户 alephzerox 方法所需的 Top-1 计算相似的复杂度。总的来说,虽然两种方法都获得了相似的准确性,但像 Github 用户 soptq 方法中那样使用机器学习可以降低加密数据的推理延迟。

阅读更多相关帖子

使用 Zama 的 Concrete ML 和全同态加密赢得 TikTok Hackathon \ 在 TikTok Hackathon 期间,来自 NUS 的一组学生开发了一个建立在 Zama 的 Concrete ML 上的广告服务系统。 2024 年 10 月 29 日\ \ Jeremiah Au, Nigel Lee, PJ Anthony, Vansh Nath

社区

Concrete ML

[视频教程] 提高 Concrete ML 中较大神经网络的延迟 \ 在本教程中,Zama 团队成员 Jordan Frery 将向你展示如何提高 Concrete ML 中较大神经网络的延迟。 2024 年 7 月 24 日\ \ Jordan Frery

Concrete ML

教程

Concrete Concrete ML FHEVM TFHE-rs

产品与服务

隐私保护机器学习 保密区块链 阈值密钥管理系统

开发者

博客 文档 GITHUB FHE 资源 研究论文 Bounty Program FHE STATE OS

公司

关于 FHE简介 活动 媒体 职业 法律

联系方式

与专家交谈 联系我们 X Discord Telegram 所有社区渠道

在电子时代,隐私是开放社会所必需的。隐私不是秘密。私事是不想让全世界知道的事情,但秘密是不想让任何人知道的事情。隐私是有选择地向世界展示自己的能力。如果双方有某种交易,那么每个都有他们互动的记忆。每一方都可以谈论他们自己对这件事的记忆;谁能阻止它呢?可以颁布法律来反对它,但是言论自由,甚至比隐私更重要,是开放社会的基础;我们不寻求限制任何言论。如果许多方在同一论坛上一起发言,每方都可以向所有其他人发言,并将关于个人和其他方的知识汇总在一起。电子通信的力量已经实现了这种群体发言,并且不会仅仅因为我们可能想要它而消失。既然我们渴望隐私,我们必须确保交易的每一方只知道该交易直接需要的知识。既然任何信息都可以被谈论,我们必须确保我们尽可能少地揭示。在大多数情况下,个人身份并不重要。当我在商店购买杂志并向店员支付现金时,没有必要知道我是谁。当我要求我的电子邮件提供商发送和接收邮件时,我的提供商不需要知道我在和谁说话或我说什么,或者别人在对我说什么;我的提供商只需要知道如何将邮件发送到那里,以及我欠他们多少费用。当我的身份被交易的底层机制揭示时,我就没有隐私。我不能在这里有选择地展示自己;我必须总是展示我自己。因此,开放社会中的隐私需要匿名交易系统。到目前为止,现金一直是主要的此类系统。匿名交易系统不是秘密交易系统。匿名系统使个人能够在需要时以及仅在需要时揭示自己的身份;这是隐私的本质。开放社会中的隐私也需要密码学。如果我说什么,我希望只有我打算让其听到的人才能听到。如果我的演讲内容对全世界可见,我就没有隐私。加密是为了表示对私密的渴望,而使用弱密码术加密是为了表示对私密性没有太大的渴望。此外,在默认设置为匿名时,要放心地揭示自己的身份,需要密码签名。我们不能期望政府、公司或其他大型的、没有面孔的组织出于善意而给予我们隐私。对他们来说,谈论我们是有利的,我们应该期望他们会谈论。试图阻止他们的言论是与信息的现实作斗争。信息不仅仅是想要自由,它渴望自由。信息会扩展到填满可用的存储空间。信息是谣言的年轻、更强大的表弟;信息脚步更快、眼睛更多、知道更多、理解比谣言少。如果我们希望拥有任何隐私,就必须捍卫我们自己的隐私。我们必须走到一起,创建允许进行匿名交易的系统。几个世纪以来,人们一直在用耳语、黑暗、信封、紧闭的门、秘密握手和信使捍卫自己的隐私。过去的技术不允许强大的隐私,但是电子技术允许。我们密码朋克致力于建设匿名系统。我们正在使用密码学、匿名邮件转发系统、数字签名和电子货币来捍卫我们的隐私。密码朋克编写代码。我们知道必须有人编写软件来捍卫隐私,并且因为除非我们都这样做,否则我们无法获得隐私,所以我们将编写该软件。我们发布我们的代码,以便我们的密码朋克同伴可以练习和使用它。我们的代码可供所有人免费使用,遍布全球。如果你不赞成我们编写的软件,我们并不太在意。我们知道软件无法被销毁,并且广泛分散的系统无法被关闭。密码朋克谴责对密码术的监管,因为加密从根本上说是一种私人行为。事实上,加密行为将信息从公共领域移除。即使是反对密码术的法律也只能达到一个国家的边界和其暴力的手臂。密码术将不可避免地在全球蔓延,并随之蔓延其所实现的匿名交易系统。为了使隐私得到广泛传播,它必须成为社会契约的一部分。人们必须走到一起并部署这些系统以造福大众。隐私只能扩展到社会中同伴的合作。我们密码朋克寻求你的问题和你的担忧,并希望我们能够让你参与进来,以便我们不会欺骗自己。但是,我们不会因为某些人可能不同意我们的目标而改变我们的路线。密码朋克正在积极参与使网络对隐私更安全。让我们一起快速前进。前进。作者:Eric Hughes。1993 年 3 月 9 日。

  • 原文链接: zama.ai/post/build-an-en...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
ZamaFHE
ZamaFHE
Zama是一家开源密码学公司,专注于为区块链和人工智能构建最先进的完全同态加密(FHE)解决方案。