MindArmour之AI模型安全测试

举报
lzd 发表于 2020/08/27 19:37:39 2020/08/27
【摘要】 AI模型安全测试概述传统软件的决策由代码逻辑决定,传统软件通过代码行覆盖率来判断当前测试是否充分,理想情况下覆盖率越高,代码测试越充分。然而,对于深度神经网络而言,程序的决策逻辑由训练数据、网络模型结构和参数通过某种黑盒机制决定,代码行覆盖率已不足以评估测试的充分性。需要根据深度网络的特点选择更为适合的测试评价准则,指导神经网络进行更为充分的测试,发现更多的边缘错误用例,从而确保模型的通用性...

AI模型安全测试

概述

传统软件的决策由代码逻辑决定,传统软件通过代码行覆盖率来判断当前测试是否充分,理想情况下覆盖率越高,代码测试越充分。然而,对于深度神经网络而言,程序的决策逻辑由训练数据、网络模型结构和参数通过某种黑盒机制决定,代码行覆盖率已不足以评估测试的充分性。需要根据深度网络的特点选择更为适合的测试评价准则,指导神经网络进行更为充分的测试,发现更多的边缘错误用例,从而确保模型的通用性、鲁棒性。

MindArmour针对深度神经网络,提供AI模型安全测试模块Fuzzer。根据神经网络的特点,引入神经元覆盖率[1]的概念,作为Fuzz的测试指导,引导Fuzz朝神经元覆盖率增加的方向生成样本,让输入能够激活更多的神经元,神经元值的分布范围更广,以充分测试DNN,探索不同类型的模型输出结果、模型错误行为。

神经元覆盖率

神经元覆盖率针对深度神经网络提出,通过监测神经元对不同输入的输出情况设计了多种不同类型的神经元覆盖率,能够适用于大多数DNN模型,而非针对特定的DNN结构。

Fuzzer设计图

AI模型安全测试设计图如下。


在用户接口层,需要用户提供原始数据集DataSet、被测试模型Model和配置Fuzzer参数Fuzzer configuration。Fuzzer模块对模型和数据进行Fuzz测试后,返回安全评估报告Security Report

Fuzzer架构主要包括三个模块:

  1. Natural Threat/Adversarial Example Generator(数据变异模块):

    随机选择变异方法对种子数据变异生成多个变种。支持多种样本的变异策略, 包括:

    • 图像仿射变换方法如:平移、旋转、缩放、错切。

    • 基于图像像素值变化的方法如:改变对比度、亮度、模糊、加噪。

    • 基于对抗攻击的白盒、黑盒对抗样本生成方法,如FGSM、PGD、MDIIM。

  2. Fuzzer moduler(变异指导模块):

    对变异生成的数据进行fuzz测试,观察神经元覆盖率的变化情况,如果生成的数据使得神经元覆盖率增加,则加入变异的种子队列,用于下一轮的数据变异。

  3. Evaluation(评估模块):

    评估Fuzzer效果,生成数据的质量,变异方法的强度。支持3个类型5种指标,包括通用评价指标:accuracy,神经元覆盖率指标:kmnc, nbc,snac,对抗攻击评价指标:attack_success_rate。

Fuzzer流程

具体的Fuzzer流程如下:


  1. 根据策略从种子队列中选择一个种子A。

  2. 随机选择变异策略,对种子A进行变异,生成多个变种数据A1,A2...

  3. 用目标模型对变种A1,A2...进行预测,如果变种使得目标模型预测错误,则改变种进入Failed tests。

  4. 若目标模型对于变种的预测结果是正确的,用神经元覆盖率指标进行分析。

  5. 如果变种使得覆盖率增加,那么将该变种放入种子队列,用于下一轮变异。

通过多轮循环,我们获得一系列变异数据Fuzzed Tests,并进一步分析,从多个角度给出安全报告。可以用于深入分析神经网络模型的缺陷,从而针对这些缺陷,进行模型增强等,改善提升模型的通用性、鲁棒性。

代码实现

导入需要的库文件

下列是我们需要的公共模块、MindSpore相关模块和Fuzzer特性模块,以及配置日志标签和日志等级。

import sys

import numpy as np
from mindspore import Model
from mindspore import context
from mindspore.train.serialization import load_checkpoint, load_param_into_net

from lenet5_net import LeNet5
from mindarmour.fuzzing.fuzzing import Fuzzer
from mindarmour.fuzzing.model_coverage_metrics import ModelCoverageMetrics
from mindarmour.utils.logger import LogUtil

LOGGER = LogUtil.get_instance()
TAG = 'Fuzz_test'
LOGGER.set_level('INFO')

参数配置

配置必要的信息,包括环境信息、执行的模式。

context.set_context(mode=context.GRAPH_MODE, device_target=cfg.device_target)

详细的接口配置信息,请参见context.set_context接口说明。

运用Fuzzer

  1. 建立LeNet模型,加载MNIST数据集,操作同模型安全

    ...
    # Lenet model
    model = Model(net)
    # get training data
    data_list = "./MNIST_unzip/train"
    batch_size = 32
    ds = generate_mnist_dataset(data_list, batch_size, sparse=False)
    train_images = []
    for data in ds.create_tuple_iterator():
       images = data[0].astype(np.float32)
       train_images.append(images)
       train_images = np.concatenate(train_images, axis=0)

    # get test data
    data_list = "./MNIST_unzip/test"
    batch_size = 32
    ds = generate_mnist_dataset(data_list, batch_size, sparse=False)
    test_images = []
    test_labels = []
    for data in ds.create_tuple_iterator():
       images = data[0].astype(np.float32)
       labels = data[1]
       test_images.append(images)
       test_labels.append(labels)
    test_images = np.concatenate(test_images, axis=0)
    test_labels = np.concatenate(test_labels, axis=0)
  2. Fuzzer参数配置。

    设置数据变异方法及参数。目前支持的数据变异方法包含三类:

    数据变异方法一定要包含基于图像像素值变化的方法。

    前两种图像变化方法的可配置参数,以及推荐参数范围请参考:https://gitee.com/mindspore/mindarmour/blob/master/mindarmour/fuzzing/image_transform.py对应的类方法,也可以均设置为'auto_param': True,变异参数将在推荐范围内随机生成。

    基于对抗攻击方法的参数配置请参考对应的攻击方法类。

    mutate_config = [{'method': 'Blur',
                     'params': {'auto_param': True}},
                    {'method': 'Contrast',
                     'params': {'auto_param': True}},
                    {'method': 'Translate',
                     'params': {'auto_param': True}},
                    {'method': 'Brightness',
                     'params': {'auto_param': True}},
                    {'method': 'Noise',
                     'params': {'auto_param': True}},
                    {'method': 'Scale',
                     'params': {'auto_param': True}},
                    {'method': 'Shear',
                     'params': {'auto_param': True}},
                    {'method': 'FGSM',
                     'params': {'eps': 0.3, 'alpha': 0.1}}
                    ]

    设置评价指标,目前支持5种评价指标,包括:

    eval_metrics =['accuracy', 'kmnc', 'attack_success_rate']
    • 通用评价指标:accuracy。

    • 神经元覆盖率指标:kmnc, nbc,snac。

    • 对抗攻击评价指标:attack_success_rate。 也可以设置为‘auto’,默认使用所有评价指标。

    • 图像仿射变换方法:Translate、Scale、Shear、Rotate。

    • 基于图像像素值变化的方法: Contrast、Brightness、Blur、Noise。

    • 基于对抗攻击的白盒、黑盒对抗样本生成方法:FGSM、PGD、MDIIM。

  3. 初始化种子队列,种子队列中的每个种子,包含3个值:原始图片、图片标签。

    # make initial seeds
    initial_seeds = []
    for img, label in zip(test_images, test_labels):
    initial_seeds.append([img, label])
    initial_seeds = initial_seeds[:100]
  4. 测试Fuzz测试前的神经元覆盖率。

    segmented_num=1000
    neuron_num=10
    model_coverage_test = ModelCoverageMetrics(model, segmented_num, neuron_num, train_images)
    model_coverage_test.calculate_coverage(np.array(test_images[:100]).astype(np.float32))
    LOGGER.info(TAG, 'KMNC of this test is : %s', model_coverage_test.get_kmnc())

    结果:

    KMNC of this test is : 0.0851
  5. Fuzz测试。

    model_fuzz_test = Fuzzer(model, train_images, neuron_num, segmented_num)
    _, _, _, _, metrics = model_fuzz_test.fuzzing(mutate_config, initial_seeds, eval_metrics=eval_metrics)
  6. 实验结果。

    if metrics:
    for key in metrics:
       LOGGER.info(TAG, key + ': %s', metrics[key])

    Fuzz测试后结果如下:

    Accuracy: 0.7929
    Attack_success_rate: 0.3939
    Neural_coverage_KMNC: 0.4797

    Fuzz测试前种子的KMNC神经元覆盖率为8.5%,Fuzz后,KMNC神经元覆盖率为47.97%,神经元覆盖率提升,样本的多样性提升。Fuzz后,模型对于Fuzz生成样本的准确率为79.3%,使用了对抗攻击方法的样本,攻击成功率为39.4%。由于初始化种子、变异方法和相应的参数均为随机选择的,结果有一定的浮动是正常的。

    原始图片:

    fuzz_seed

    Fuzz生成的变异图片:

参考文献

[1] Pei K, Cao Y, Yang J, et al. Deepxplore: Automated whitebox testing of deep learning systems[C]//Proceedings of the 26th Symposium on Operating Systems Principles. ACM, 2017: 1-18.

[2]Ma L, Juefei-Xu F, Zhang F, et al. Deepgauge: Multi-granularity testing criteria for deep learning systems[C]//Proceedings of the 33rd ACM/IEEE International Conference on Automated Software Engineering. ACM, 2018: 120-131.


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。