You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

mindarmour.rst 17 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. mindarmour
  2. ==========
  3. MindArmour是MindSpore的工具箱,用于增强模型可信,实现隐私保护机器学习。
  4. .. py:class:: mindarmour.Attack
  5. 所有通过创建对抗样本的攻击类的抽象基类。
  6. 对抗样本是通过向原始样本添加对抗噪声来生成的。
  7. .. py:method:: batch_generate(inputs, labels, batch_size=64)
  8. 根据输入样本及其标签来批量生成对抗样本。
  9. **参数:**
  10. - **inputs** (Union[numpy.ndarray, tuple]) - 生成对抗样本的原始样本。
  11. - **labels** (Union[numpy.ndarray, tuple]) - 原始/目标标签。若每个输入有多个标签,将它包装在元组中。
  12. - **batch_size** (int) - 一个批次中的样本数。默认值:64。
  13. **返回:**
  14. - **numpy.ndarray** - 生成的对抗样本。
  15. .. py:method:: generate(inputs, labels)
  16. 根据正常样本及其标签生成对抗样本。
  17. **参数:**
  18. - **inputs** (Union[numpy.ndarray, tuple]) - 生成对抗样本的原始样本。
  19. - **labels** (Union[numpy.ndarray, tuple]) - 原始/目标标签。若每个输入有多个标签,将它包装在元组中。
  20. **异常:**
  21. - **NotImplementedError** - 此为抽象方法。
  22. .. py:class:: mindarmour.MembershipInference(model, n_jobs=-1)
  23. 成员推理是由Shokri、Stronati、Song和Shmatikov提出的一种用于推测用户隐私数据的灰盒攻击。它需要训练样本的loss或logits结果。(隐私是指单个用户的一些敏感属性)。
  24. 有关详细信息,请参见 :`教程 <https://mindspore.cn/mindarmour/docs/en/master/test_model_security_membership_inference.html>`_。
  25. 参考文献:`Reza Shokri, Marco Stronati, Congzheng Song, Vitaly Shmatikov. Membership Inference Attacks against Machine Learning Models. 2017. <https://arxiv.org/abs/1610.05820v2>`_。
  26. **参数:**
  27. - **model** (Model) - 目标模型。
  28. - **n_jobs** (int) - 并行运行的任务数量。-1表示使用所有处理器,否则n_jobs的值必须为正整数。
  29. **异常:**
  30. - **TypeError** - 模型的类型不是Mindspore.Model。
  31. - **TypeError** - n_jobs的类型不是int。
  32. - **ValueError** - n_jobs的值既不是-1,也不是正整数。
  33. .. py:method:: train(dataset_train, dataset_test, attack_config)
  34. 根据配置,使用输入数据集训练攻击模型。
  35. 将攻击模型保存至self._attack_list。
  36. **参数:**
  37. - **dataset_train** (minspore.dataset) - 目标模型的训练数据集。
  38. - **dataset_test** (minspore.dataset) - 目标模型的测试集。
  39. - **attack_config** (Union[list, tuple]) - 攻击模型的参数设置。格式为
  40. .. code_block::
  41. attack_config =
  42. [{"method": "knn", "params": {"n_neighbors": [3, 5, 7]}},
  43. {"method": "lr", "params": {"C": np.logspace(-4, 2, 10)}}]
  44. - 支持的方法有knn、lr、mlp和rf,每个方法的参数必须在可变参数的范围内。参数实现的提示可在下面找到:
  45. - `KNN <https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html>`_ ,
  46. - `LR <https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html>`_ ,
  47. - `RF <https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html>`_ ,
  48. - `MLP <https://scikit-learn.org/stable/modules/generated/sklearn.neural_network.MLPRegressor.html>`_ 。
  49. **异常:**
  50. - **KeyError** - attack_config中的配置没有键{"method", "params"}。
  51. - **NameError** - attack_config中的方法(不区分大小写)不在["lr", "knn", "rf", "mlp"]中。
  52. .. py:method:: eval(dataset_train, dataset_test, metrics)
  53. 评估目标模型的不同隐私。
  54. 评估指标应由metrics规定。
  55. **参数:**
  56. - **dataset_train** (minspore.dataset) - 目标模型的训练数据集。
  57. - **dataset_test** (minspore.dataset) - 目标模型的测试数据集。
  58. - **metrics** (Union[list, tuple]) - 评估指标。指标的值必须在["precision", "accuracy", "recall"]中。默认值:["precision"]。
  59. **返回:**
  60. - **list** - 每个元素都包含攻击模型的评估指标。
  61. .. py:class:: mindarmour.ImageInversionAttack(network, input_shape, input_bound, loss_weights=(1, 0.2, 5))
  62. 一种用于通过还原图像的深层表达来重建图像的攻击方法。
  63. 参考文献:`Aravindh Mahendran, Andrea Vedaldi. Understanding Deep Image Representations by Inverting Them. 2014. <https://arxiv.org/pdf/1412.0035.pdf>`_。
  64. **参数:**
  65. - **network** (Cell) - 网络,用于推断图像的深层特征。
  66. - **input_shape** (tuple) - 单个网络输入的数据形状,应与给定网络一致。形状的格式应为(channel, image_width, image_height)。
  67. - **input_bound** (Union[tuple, list]) - 原始图像的像素范围,应该像[minimum_pixel, maximum_pixel]或(minimum_pixel, maximum_pixel)。
  68. - **loss_weights** (Union[list, tuple]) - InversionLoss中三个子损失的权重,可以调整以获得更好的结果。默认值:(1, 0.2, 5)。
  69. **异常:**
  70. - **TypeError** - 网络类型不是Cell。
  71. - **ValueError** - input_shape的值都不是正int。
  72. - **ValueError** - loss_weights的值都不是正值。
  73. .. py:method:: generate(target_features, iters=100)
  74. 根据target_features重建图像。
  75. **参数:**
  76. - **iters** (int) - 逆向攻击的迭代次数,应为正整数。默认值:100。
  77. **返回:**
  78. - **numpy.ndarray** - 重建图像,预计与原始图像相似。
  79. **异常:**
  80. - **TypeError** - target_features的类型不是numpy.ndarray。
  81. - **ValueError** - iters的值都不是正int.Z
  82. .. py:method:: evaluate(original_images, inversion_images, labels=None, new_network=None)
  83. 通过三个指标评估还原图像的质量:原始图像和还原图像之间的平均L2距离和SSIM值,以及新模型对还原图像的推理结果在真实标签上的置信度平均值。
  84. **参数:**
  85. - **original_images** (numpy.ndarray) - 原始图像,其形状应为(img_num, channels, img_width, img_height)。
  86. - **inversion_images** (numpy.ndarray) - 还原图像,其形状应为(img_num, channels, img_width, img_height)。
  87. - **labels** (numpy.ndarray) - 原始图像的ground truth标签。默认值:None。
  88. - **new_network** (Cell) - 其结构包含self._network所有部分的网络。_network,但加载了不同的模型文件。默认值:None。
  89. **返回:**
  90. - **float** - l2距离。
  91. - **float** - 平均ssim值。
  92. - **Union** [float, None] - 平均置信度。如果labels或new_network为 None,则该值为None。
  93. .. py:class:: mindarmour.DPModel(micro_batches=2, norm_bound=1.0, noise_mech=None, clip_mech=None, **kwargs)
  94. DPModel用于构建差分隐私训练的模型。
  95. 这个类就是重载Mindpore.train.model.Model。
  96. 详情请查看:`教程 <https://mindspore.cn/mindarmour/docs/zh-CN/master/protect_user_privacy_with_differential_privacy.html#%E5%B7%AE%E5%88%86%E9%9A%90%E7%A7%81>`_。
  97. **参数:**
  98. - **micro_batches** (int) - 从原始批次拆分的小批次数。默认值:2。
  99. - **norm_bound** (float) - 用于剪裁绑定,如果设置为1,将返回原始数据。默认值:1.0。
  100. - **norm_bound** (float) - 对象可以生成不同类型的噪音。默认值:None。
  101. - **clip_mech** (Mechanisms) - 该对象用于更新自适应剪裁。默认值:None。
  102. **异常:**
  103. - **ValueError** - DPOptimizer和noise_mech都为None或非None。
  104. - **ValueError** - noise_mech或DPOtimizer的mech方法是自适应的,而clip_mech不是None。
  105. .. py:class:: mindarmour.BlackModel
  106. 将目标模型视为黑盒的抽象类。模型应由用户定义。
  107. .. py:method:: is_adversarial(data, label, is_targeted)
  108. 检查输入样本是否为对抗样本。
  109. **参数:**
  110. - **data** (numpy.ndarray) - 要检查的输入样本,通常是一些恶意干扰的样本。
  111. - **label** (numpy.ndarray) - 对于目标攻击,标签是受扰动样本的预期标签。对于无目标攻击,标签是相应未扰动样本的原始标签。
  112. - **is_targeted** (bool) - 对于有目标/无目标攻击,请选择True/False。
  113. **返回:**
  114. - **bool** - 如果为True,则输入样本是对抗性的。如果为False,则输入样本不是对抗性的。
  115. .. py:method:: predict(inputs)
  116. 使用用户指定的模型进行预测。预测结果的shape应该是(m,n),其中n表示此模型分类的类数。
  117. **参数:**
  118. - **inputs** (numpy.ndarray) - 要预测的输入样本。
  119. **异常:**
  120. - **NotImplementedError** - 抽象方法未实现。
  121. .. py:class:: mindarmour.Detector
  122. 所有对抗样本检测器的抽象基类。
  123. .. py:method:: fit(inputs, labels=None)
  124. 拟合阈值,拒绝与去噪样本差异大于阈值的对抗样本。当应用于正常样本时,阈值由假正率决定。
  125. **参数:**
  126. - **inputs** (numpy.ndarray) - 用于计算阈值的输入样本。
  127. - **labels** (numpy.ndarray) - 训练数据的标签。默认值:None。
  128. **异常:**
  129. - **NotImplementedError** - 抽象方法未实现。
  130. .. py:method:: detect_diff(inputs)
  131. 计算输入样本和去噪样本之间的差值。
  132. **参数:**
  133. - **inputs** (Union[numpy.ndarray, list, tuple]) - 要检测的输入样本。
  134. **异常:**
  135. - **NotImplementedError** - 抽象方法未实现。
  136. .. py:method:: detect(inputs)
  137. 从输入样本中检测对抗样本。
  138. **参数:**
  139. - **inputs** (Union[numpy.ndarray, list, tuple]) - 要检测的输入样本。
  140. **异常:**
  141. - **NotImplementedError** - 抽象方法未实现。
  142. .. py:method:: transform(inputs)
  143. 过滤输入样本中的对抗性噪声。
  144. **参数:**
  145. - **inputs** (Union[numpy.ndarray, list, tuple]) - 要转换的输入样本。
  146. **异常:**
  147. - **NotImplementedError** - 抽象方法未实现。
  148. .. py:class:: mindarmour.Defense(network)
  149. 所有防御类的抽象基类,用于防御对抗样本。
  150. **参数:**
  151. - **network** (Cell) - 要防御的MindSpore风格的深度学习模型。
  152. .. py:method:: batch_defense(inputs, labels, batch_size=32, epochs=5)
  153. 带有批量样本的防御模型。
  154. **参数:**
  155. - **inputs** (numpy.ndarray) - 生成对抗样本的原始样本。
  156. - **labels** (numpy.ndarray) - 输入样本的标签。
  157. - **batch_size** (int) - 一个批次中的样本数。默认值:32。
  158. - **epochs** (int) - epochs的数量。默认值:5。
  159. **返回:**
  160. - **numpy.ndarray** - 批处理防御操作的损失。
  161. **异常:**
  162. - **ValueError** - batch_size为0。
  163. .. py:method:: defense(inputs, labels)
  164. 带样本的防御模型。
  165. **参数:**
  166. - **inputs** (numpy.ndarray) - 生成对抗样本的原始样本。
  167. - **labels** (numpy.ndarray) - 输入样本的标签。
  168. **异常:**
  169. - **NotImplementedError** - 抽象方法未实现。
  170. .. py:class:: mindarmour.ConceptDriftCheckTimeSeries(window_size=100, rolling_window=10, step=10, threshold_index=1.5, need_label=False)
  171. 概念漂移检查时间序列(ConceptDriftCheckTimeSeries)用于样本序列分布变化检测。
  172. 有关详细信息,请查看:`教程 <https://mindspore.cn/mindarmour/docs/zh-CN/master/concept_drift_time_series.html>`_.
  173. **参数:**
  174. - **window_size** (int) - 概念窗口的大小,不小于10。如果给定输入数据,window_size在[10, 1/3*len(input data)]中。如果数据是周期性的,通常window_size等于2-5个周期,例如,对于月/周数据,30/7天的数据量是一个周期。默认值:100。
  175. - **rolling_window** (int) - 平滑窗口大小,在[1, window_size]中。默认值:10。
  176. - **step** (int) - 滑动窗口的跳跃长度,在[1, window_size]中。默认值:10。
  177. - **threshold_index** (float) - 阈值索引,:math:`(-\infty, +\infty)`。默认值:1.5。
  178. - **need_label** (bool) - False或True。如果need_label=True,则需要概念漂移标签。默认值:False。
  179. .. py:method:: concept_check(data)
  180. 在数据系列中查找概念漂移位置。
  181. **参数:**
  182. - **data(numpy.ndarray) - 输入数据。数据的shape可以是(n,1)或(n,m)。请注意,每列(m列)是一个数据序列。
  183. **返回:**
  184. - **numpy.ndarray** - 样本序列的概念漂移分数。
  185. - **float** - 判断概念漂移的阈值。
  186. - **list** - 概念漂移的位置。
  187. .. py::class:: mindarmour.Fuzzer(target_model)
  188. 深度神经网络的模糊测试框架。
  189. 参考文献:`DeepHunter: A Coverage-Guided Fuzz Testing Framework for Deep Neural Networks <https://dl.acm.org/doi/10.1145/3293882.3330579>`_。
  190. **参数:**
  191. - **target_model** (Model) - 目标模糊模型。
  192. .. py:method:: fuzzing(mutate_config, initial_seeds, coverage, evaluate=True, max_iters=10000, mutate_num_per_seed=20)
  193. 深度神经网络的模糊测试。
  194. **参数:**
  195. - **mutate_config** (list) - 变异方法配置。格式为:
  196. .. code-block:: python
  197. mutate_config =
  198. [{'method': 'GaussianBlur',
  199. 'params': {'ksize': [1, 2, 3, 5], 'auto_param': [True, False]}},
  200. {'method': 'UniformNoise',
  201. 'params': {'factor': [0.1, 0.2, 0.3], 'auto_param': [False, True]}},
  202. {'method': 'GaussianNoise',
  203. 'params': {'factor': [0.1, 0.2, 0.3], 'auto_param': [False, True]}},
  204. {'method': 'Contrast',
  205. 'params': {'alpha': [0.5, 1, 1.5], 'beta': [-10, 0, 10], 'auto_param': [False, True]}},
  206. {'method': 'Rotate',
  207. 'params': {'angle': [20, 90], 'auto_param': [False, True]}},
  208. {'method': 'FGSM',
  209. 'params': {'eps': [0.3, 0.2, 0.4], 'alpha': [0.1], 'bounds': [(0, 1)]}}]
  210. ...]
  211. - 支持的方法在列表 `self._strategies` 中,每个方法的参数必须在可选参数的范围内。支持的方法分为两种类型:
  212. - 首先,自然鲁棒性方法包括:'Translate', 'Scale'、'Shear'、'Rotate'、'Perspective'、'Curve'、'GaussianBlur'、'MotionBlur'、'GradientBlur'、'Contrast'、'GradientLuminance'、'UniformNoise'、'GaussianNoise'、'SaltAndPepperNoise'、'NaturalNoise'。
  213. - 其次,对抗样本攻击方式包括:'FGSM'、'PGD'和'MDIM'。'FGSM'、'PGD'和'MDIM'分别是 FastGradientSignMethod、ProjectedGradientDent和MomentumDiverseInputIterativeMethod的缩写。 `mutate_config` 必须包含在['Contrast', 'GradientLuminance', 'GaussianBlur', 'MotionBlur', 'GradientBlur', 'UniformNoise', 'GaussianNoise', 'SaltAndPepperNoise', 'NaturalNoise']中的方法。
  214. - 第一类方法的参数设置方式可以在 `mindarmour/natural_robustness/transform/image <https://gitee.com/mindspore/mindarmour/tree/master/mindarmour/natural_robustness/transform/image>`_ 中看到。第二类方法参数配置参考 `self._attack_param_checklists` 。
  215. - **initial_seeds** (list[list]) - 用于生成变异样本的初始种子队列。初始种子队列的格式为[[image_data, label], [...], ...],且标签必须为one-hot。
  216. - **coverage** (CoverageMetrics) - 神经元覆盖率指标类。
  217. - **evaluate** (bool) - 是否返回评估报告。默认值:True。
  218. - **max_iters** (int) - 选择要变异的种子的最大数量。默认值:10000。
  219. - **mutate_num_per_seed** (int) - 每个种子的最大变异次数。默认值:20。
  220. **返回:**
  221. - **list** - 模糊测试生成的变异样本。
  222. - **list** - 变异样本的ground truth标签。
  223. - **list** - 预测结果。
  224. - **list** - 变异策略。
  225. - **dict** - Fuzzer的指标报告。
  226. **异常:**
  227. - **ValueError** - 参数'Coverage'必须是CoverageMetrics的子类。
  228. - **ValueError** - 初始种子队列为空。
  229. - **ValueError** - 初始种子队列中的种子不是包含两个元素。

MindArmour关注AI的安全和隐私问题。致力于增强模型的安全可信、保护用户的数据隐私。主要包含3个模块:对抗样本鲁棒性模块、Fuzz Testing模块、隐私保护与评估模块。 对抗样本鲁棒性模块 对抗样本鲁棒性模块用于评估模型对于对抗样本的鲁棒性,并提供模型增强方法用于增强模型抗对抗样本攻击的能力,提升模型鲁棒性。对抗样本鲁棒性模块包含了4个子模块:对抗样本的生成、对抗样本的检测、模型防御、攻防评估。