DiNN学习笔记1-理论部分
背景知识
机器学习即服务
机器学习即服务 (Machine Learning as a Service, MLaaS) 可以简单理解为:一系列将机器学习工具作为云计算服务的一部分的服务。 MLaaS 帮助客户从机器学习中获益,却不用承担建立机器学习模型所需的成本、时间和风险。服务商提供预测分析、深度学习、api、数据可视化、自然语言处理等服务;计算由服务商的数据中心处理完成。
以图中的 MLaaS 模型为例,服务商训练一个可用的模型,客户端将其需要进行预测的数据 x x x 提供给服务商,服务商将其输入机器学习模型 (如神经网络) 后将结果 M ( x ) M(x) M(x) 返回给用户端。可以看出该方案存在的一个问题:用户端的数据 x x x 会泄露给服务商。在用户端的数据 x x x 为敏感数据,而服务商不一定可信的情况下,用户端可能不希望自己的数据暴露在服务器端。
MLaaS 中的全同态加密
一个解决方案为全同态加密:
用户将自己的数据加密后上传云服务器,云服务器在加密的数据上进行运算,得到运算结果后返回给用户端,用户端解密后得到所需的结果 M ( x ) M(x) M(x) 。这类方案在保护用户隐私的同时也达到了运算的目的,然而效率却不敢恭维。因此 Pascal Paillier 等人设计了 fhe-DiNN —— 一种基于全同态加密的神经网络预测方案,旨在尽可能快速地同态评估用户输入的数据。
神经网络
异常熟悉的模型,不赘述:
将隐藏层中的每个神经元进行放大:
可见全同态加密只要能够运算 y = f ( ∑ i w i x i ) y = f(\sum_{i} w_i x_i) y=f(∑iwixi) 就能完成密文数据下的神经网络预测。
Fhe-DiNN 中的默认设定
Fhe-DiNN 中有一些默认的设定:
- 模型是在明文上已经训练好的 (本论文实验中是由 python 训练的) 明文模型,输入的数据为加密数据,输出的结果为加密的神经网络输出结果。
- Fhe-DiNN 旨在尽可能地提升评估的效率,因此会在准确率上有一定的损失。
- Fhe-DiNN 只在图像识别中进行了示范,但其实本文提出的是一个泛化的模型,在其他机器学习领域也同样适用。实验中使用的数据集为 MNIST 手写数据集。
Fhe-DiNN 方案
神经元中的计算
为了计算神经元的输出 y = f ( ∑ i w i x i ) y = f(\sum_{i} w_i x_i) y=f(∑iwixi) ,首先需要计算激活函数中的累加结果 (Multisum) :
∑ i w i x i \sum_{i} w_i x_i i∑wixi
给定权重 w i w_i wi 和加密的输入 E n c ( x i ) Enc(x_i) Enc(xi) ,计算他们的乘积与和:
∑ i w i ⋅ E n c ( x i ) \sum_{i} w_i \sdot Enc(x_i) i∑wi⋅Enc(xi)
注意到为了保证正确性,需要权重为整数 : w i ∈ Z w_i \in \mathbb{Z} wi∈Z 。如果权重为浮点数则会损失正确性。此外,权重的取值范围是在准确率和效率之前权衡的问题。
离散神经网络
为了得到一个 FHE 友好的神经网络,本文设计了离散神经网络 Discretized neural networks, DiNN ,该神经网络输入为 { − I , . . . , I } \{ -I, … , I \} {
−I,...,I} 中的整数;权重为 { − W , . . . , W } \{ -W, … , W \} {
−W,...,W} 中的整数;神经元中的激活函数会将累加的和值映射到 { − I , . . . , I } \{ -I, … , I \} {
−I,...,I} 中的整数。这使得神经元的计算可以叠加,即可以增加任意层数而不会产生输入输出取值范围不同的问题。
- 取值范围并没有看起来的这么严格,比如可以只取 0, 1 构成二进制网络
- 这是 size 和 performance 之间的权衡的问题,当离散化一个神经网络时,需要更大的取值范围来保证准确率
- 从实数域上的神经网络转换为离散神经网络十分简单,只需要舍去小数部分即可。DiNN中是这么做的,但这并不一定是最好的
DiNN 评估步骤
DiNN 评估 (Evaluation) 的整体步骤如下:
- 同态地计算累加: ∑ i w i ⋅ E n c ( x i ) = E n c ( ∑ i w i x i ) \sum_i w_i \sdot Enc(x_i) = Enc( \sum_i w_i x_i ) ∑iwi⋅Enc(xi)=Enc(∑iwixi)
- 同态地计算激活函数: E n c ( f ( ∑ i w i x i ) ) Enc(f(\sum_i w_i x_i)) Enc(f(∑iwixi))
- 进行自举: E n c ∗ ( f ( ∑ i w i x i ) ) Enc^*(f(\sum_i w_i x_i)) Enc∗(f(∑iwixi)) 减少噪声,使得运算能够不停运行
- 对每一层的每个神经元进行 1-3 的步骤
消息空间的确定方式可以为:自己猜测、数据推断 或 最坏情况分析 (作者不推荐)
随着乘积、累加等操作,密文的噪声会增长,因此需要从一个很小的噪声开始运算,为保证安全性,需要选择较大的参数。
自举的引入
在此之前的一些工作中 (例如 Cryptonets, DGBL16) 研究者使用了 SHE (SomeWhat Homomorphic Encryption) 。在 SHE 方案中同态加密的参数需要预先设置,并且随着神经网络层数的不断增大,密文的噪声逐渐增加,需要增大参数来保证密文不会被错误解密,这使得 SHE 方案在深度神经网络中不可行(网络深度过大导致参数过大甚至不实际)。
本文的方案引入了自举 (Bootstrapping) ,在每次运算后都更新密文,使得密文的噪声始终控制在一定范围内,且密文的噪声与神经网络的层数不相关,因此该方案可以构造任意深度的神经网络,并且理论上运行时间与神经网络的层数呈近似线性。
文中使用的自举方案为 TFHE 中的门自举 (笔记1) ,在每次运算后都会进行一次自举的步骤,保证密文中噪声的稳定。大体流程可以理解为一个幸运大转盘:
- 首先对这个转盘进行一次旋转 (同态计算 X b − < s , a > X^{b – <s, a>} Xb−<s,a> ) ,需要使用到自举密钥
- 将图中箭头指向的密文取出
- 进行密钥转换,使其变为使用原先的密钥加密的密文,消息不变
激活函数的同态评估
本文将激活函数与自举操作相结合,即在计算激活函数的同时完成密文的自举操作。本文所使用的的激活函数为符号函数: f ( x ) = s i g n ( x ) f(x) = sign(x) f(x)=sign(x) ,方法大致流程如下:
设计如上图所示的幸运大转盘,输出旋转到的数字的符号,即正数输出1,负数输出-1。
对 TFHE 的改进
此外,本文的作者们还在 TFHE 的基础上进行了 4 种改进,分别为:明文的打包、密钥转换的前置、动态变化的消息空间和优化盲旋步骤。
明文的打包
为了减少方案中的带宽,本文将多个值打包到一个密文中,即使用 TLWE 密文代替原先的 LWE 密文,将 N 个元素的密文大小从 N 个 LWE 密文 减小到 1 个 TLWE 密文。
方案 | 消息 | 密文 |
---|---|---|
LWE | 标量 | (n + 1) 标量 |
TLWE | 多项式 | (k + 1) 多项式 |
这种打包技术使得 TLWE 成为 LWE 的一个有吸引力的变种,在 FHE 应用中被广泛使用;通过 Extract 可以提取出 LWE 密文。以一层神经网络为例,计算累加的整体流程如下:
- 首先使用标准的打包技术,将多项式加密为 TLWE 密文: c t = T L W E . E n c r y p t ( ∑ i p i X i ) ct = TLWE.Encrypt(\sum_i p_i X^i) ct=TLWE.Encrypt(∑ipiXi)
- 对第一个隐藏层中的权重进行同样的操作: w p o l : = ∑ i w i X − i w_{pol} := \sum_i w_i X^{-i} wpol:=∑iwiX−i
- 将 1 和 2 中式子相乘可得到累加结果: c t ⋅ w p o l = E n c ( ∑ i w i x i ) ct \sdot w_{pol} = Enc(\sum_i w_i x_i) ct⋅wpol=Enc(∑iwixi)
此外,因为模型已经训练好,在预测过程中不会改变,因此 w p o l w_{pol} wpol 不会改变,可以预先计算好并将其 FFT 表示存储在内存中,在分类步骤中节省时间。
从环面上的元素的数量来看,代价从 N ( n + 1 ) N(n + 1) N(n+1) 变为 N ( k + 1 ) N(k + 1) N(k+1) 。注意到得到的密文是 N N N 维的 LWE 密文,而不是原先的 n n n 维 LWE 密文,因此需要通过密钥转换才能成为合法的密文。
密钥转换的前置
在这里密钥转换的主要目的是减少 LWE 的维度。由于 自举密钥的大小、最终噪声的 level 、外积计算的数量 都和 LWE 的维度线性相关,因此减小维度可以在 内存使用 和 计算效率 上相当重要。本文的作者认为在自举过程开始时减小维度,比在自举过程结束时减小维度的效果更好,因此对密钥转换过程进行了前置。
这样的做法颠倒了两种 LWE 方案的使用:现在所有的事情都在高维的 N-LWE 上完成,而抵维的 n-LWE 只在自举操作期间使用。密钥转换中的噪声不再用于任何计算(直接进入盲旋),因此允许密钥转换中的噪声变得更大,从而减少了保持相同安全性所需的维度,从而在每次自举过程中节省时间。
唯一的缺点是:使用更高维的 N-LWE sample 意味着服务器的内存使用量略高,输出的密文更大,计算密文加法的速度略慢。但是这些操作与自举相比几乎是瞬时的,所以这不是什么问题。
动态变化的消息空间
在整个神经网络计算的过程中,消息空间可以始终保持不变。然而如果在神经网络传递的过程中改变消息空间 (减少 slides 的数量) 可以获得更大的噪声容量,进而减小所需的参数。
文中的操作为更改自举使用的轮子。通过更改每个神经元中轮子上初始的值的数量和大小,能够得到不同的消息空间,进而在神经网络计算的过程中得到不同的消息空间。具体的操作为将 testVector 设置为:
− 1 2 B l + 1 ∑ i = 0 N − 1 X i \frac{-1}{2 B_l + 1} \sum_{i = 0}^{N – 1} X^i 2Bl+1−1i=0∑N−1Xi
其中 B l B_l Bl 由当前的神经网络 l l l 层决定,是下一层神经网络 ( l + 1 l + 1 l+1 层) 的累加的边界。
优化盲旋步骤
盲旋算法概述:
输入:
- 一个 n-LWE 密文 ( a , b ) (\pmb{a}, b) (aaa,b) ,其中系数属于 Z 2 N \mathbb{Z}_{2N} Z2N
- 一个 TLWE 密文 C \pmb{C} CCC ,即 testVector 的加密
- 自举密钥 b k bk bk
输出:
- 一个 TLWE 密文 X b − < s , a > ⋅ t e s t V e c t o r X^{b – <\pmb{s}, \pmb{a}>} \sdot testVector Xb−<sss,aaa>⋅testVector
算法步骤:
- A C C ← X b ⋅ C ACC \leftarrow X^b \sdot \pmb{C} ACC←Xb⋅CCC
- for i i i = 1 … n / 2 n/2 n/2 do
- A C C ← ( ( X a 2 i + a 2 i + 1 − 1 ) b k 3 i + ( X a 2 i − 1 ) b k 3 i + 1 + ( X a 2 i + 1 − 1 ) b k 3 i + 2 ) ⊡ A C C ACC \leftarrow ((X^{a_{2i} + a_{2i + 1}} – 1)bk_{3i} + (X^{a_{2i}}-1)bk_{3i + 1} + (X^{a_{2i} + 1}-1)bk_{3i + 2}) \boxdot ACC ACC←((Xa2i+a2i+1−1)bk3i+(Xa2i−1)bk3i+1+(Xa2i+1−1)bk3i+2)⊡ACC
- end for
- return A C C ACC ACC
文中的优化参考了 [ZYL+17] 中的技术,是 [ZYL+17] 与 TFHE 两种方案的折中。效果对比如下:
DiNN 方案的整体流程
方案的整体流程示意图:
- 将图像加密为 TLWE 密文
- 将 TLWE 密文乘以隐藏层的权重组成的多项式,这一步可以使用 FFT 加速
- 从所的密文中提取出一个 1024-LWE 的密文,它是结果常数项的加密
- 进行密钥转换,得到一个 450-LWE 的密文
- 通过自举减少噪声的 level
- 对密文结果和输出层的权重进行乘法和累加
- 返回神经网络输出结果的 10 个密文,用户解密后可根据分数最高的标签得到神经网络的分类结果
参考资料
视频:https://www.youtube.com/watch?v=iKAnkb7zURo
代码:https://github.com/mminelli/dinn
PPT:https://www.di.ens.fr/~minelli/docs/slides-crypto-2018.pdf
论文:Bourse F, Minelli M, Minihold M, et al. Fast homomorphic evaluation of deep discretized neural networks[C]//Annual International Cryptology Conference. Springer, Cham, 2018: 483-512.
[ZYL+17] Zhou T, Yang X, Liu L, et al. Faster bootstrapping with multiple addends[J]. IEEE Access, 2018, 6: 49868-49876.
本文仅供个人学习使用
今天的文章
DiNN学习笔记1-理论部分分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/80843.html