turorial1:
现在,我们对安全 MPC 的工作原理有了高层次的了解。通过这些教程,我们将解释如何使用 CrypTen 对加密张量进行安全操作。在本教程中,我们将介绍 CrypTen 的一个基本构件,称为 "CrypTensor"。 CrypTensor "是加密的 "torch "张量,可用于对数据进行安全计算。
CrypTen 目前只支持安全的 MPC 协议(不过我们打算增加对其他高级加密协议的支持)。通过使用 ```mpc``` 后端,```CrypTensors``` 可作为 ```torch``` 张量,其值已通过安全 MPC 协议加密。使用```mpc```后端创建的张量称为```MPCTensors```。我们将在教程 2 中详细介绍 ``MPCTensors`` 。
首先,让我们导入 ```crypten``` 和 ```torch`` 库。(如果导入失败,请参阅 README 中的安装说明)。
import crypten
import torch
crypten.init()
创建加密张量
CrypTen 提供了一个 ```crypten.cryptensor``` 工厂函数,类似于 ```torch.tensor```,可以轻松创建 ```CrypTensors```。
让我们先创建一个 ```torch``` 张量,然后使用 ```crypten.cryptensor``` 对其加密。要解密 ```CrypTensor``` ,使用 ```get_plain_text()``` 返回原始张量。 (也可以直接从列表或数组创建```CrypTensors```)。
#### 比较
同样,我们可以对 ```CrypTensor``` 进行元素比较。与算术运算一样,在 ``CrypTensor``s 上执行的比较将返回一个 ``CrypTensor`` 结果。解密这些结果 ```CrypTensor```s 将分别评估为与 ```False``` 和 ```True``` 值相对应的 0 和 1。
#### 高级数学
我们还能使用迭代逼近法在````CrypTensors````上计算更高级的数学函数。CrypTen 为倒数、指数、对数、平方根、tanh 等函数提供 MPC 支持。请注意,由于使用了近似值,这些函数会产生数值误差。
此外,请注意,当输入值超出所用近似值的收敛范围时,其中一些函数会无声失效。这些函数不会产生错误,因为值已加密,不解密就无法检查。使用这些函数时要谨慎。(对某些模型的输入值进行归一化处理是一种很好的做法)。
## 使用加密张量的控制流
注意 ```CrypTensors``` 不能直接用于条件表达式。因为张量已加密,除非先解密张量,否则布尔表达式无法求值。尝试使用加密条件执行控制流将导致错误。
某些控制流仍可在不解密的情况下执行,但必须使用数学表达式执行。我们提供了```crypten.where(condition, x, y)```函数来抽象这种条件值设置。
下面的示例说明了如何为 ```CrypTensors``` 编写这种条件逻辑。
### 高级索引
CrypTen 支持许多对 "torch "张量进行的操作。加密的张量可以被索引、连接、堆叠、重塑等。有关操作的完整列表,请参阅 CrypTen 文档。
#### 实现注意事项
由于内部实现细节的原因,```CrypTensors``` 必须是结合```CrypTensors``` 和```torch``` 张量的操作的第一个操作数。也就是说,对于```CrypTensor``````````x_enc`````和明文张量```y````来说:
- 表达式 ``x_enc < y``` 是有效的,但等价表达式 ``y > x_enc``` 会导致错误。
- 表达式 ``x_enc + y``` 是有效的,但等价表达式 ``y + x_enc``` 会导致错误。
我们打算在将来添加对这两种表达式的支持。