Reconnaissance du son, du langage parlé et même des images, les systèmes d’intelligence artificielle ne cessent d’impressionner, et ce, dans plusieurs filières : assistants personnels intelligents, enceintes connectées, etc. Il y a seulement que des individus malveillants bien au fait de leurs principes de fonctionnement peuvent les amener à se tromper. L’une des façons de procéder est de perturber de façon furtive les données soumises à une intelligence artificielle pour analyse afin de créer un dysfonctionnement de cette dernière, ce qui s’appelle attaque « adversarial » dans le jargon IA.
Une publication de chercheurs en intelligence artificielle employés par Google illustre ce concept. Ces derniers ont montré que des modifications quasi invisibles à l’œil nu sur l’image d’un panda peuvent perturber une intelligence artificielle au point qu’elle se mette à identifier un grand singe.
Une autre équipe de chercheurs d’universités américaines a montré qu’il est possible d’étendre cette catégorie d’attaques au monde réel. En positionnant des autocollants blancs spécialement conçus sur des panneaux routiers (un aspect auquel peu de monde prêtera attention), ils sont parvenus à faire dire à une intelligence artificielle qu’un panneau de stop est un panneau de limitation de vitesse. Inquiétant lorsqu’on sait que de l’utilisation de tels systèmes va aller croissant et lorsqu’on prend en compte l’enjeu d’une analyse.
La bibliothèque ART développée en python permet d’entraîner un modèle d’intelligence artificielle puis de le soumettre à des attaques adversarial en s’appuyant sur les modules d’attaque (7 modules). L’enchaînement logique est l’utilisation des modules de défense (4 fournis) pour tester la robustesse de l’intelligence artificielle et l’améliorer.
ART en est à sa première release (version 0.1) et, pour le moment, permet l’entraînement des réseaux de neurones implémentés à l’aide des frameworks Tensorflow ou Keras. Ci-dessous, le code source – sous licence MIT – de l’un des modèles de réseaux de neurones à convolution basé sur le modèle séquentiel Keras.
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | from __future__ import absolute_import, division, print_function from keras.models import Sequential, model_from_json from keras.layers import Dense, Activation, Flatten, Conv2D, MaxPooling2D, Dropout from keras.layers.normalization import BatchNormalization from art.classifiers.classifier import Classifier def mnist_layers(input_shape, nb_filters): layers = [Conv2D(nb_filters, (8, 8), strides=(2, 2), padding="same", input_shape=input_shape), "activation", Conv2D((nb_filters * 2), (6, 6), strides=(2, 2), padding="valid"), "activation", Conv2D((nb_filters * 2), (5, 5), strides=(1, 1), padding="valid"), "activation", Flatten()] return layers def cifar10_layers(input_shape, nb_filters): layers = [Conv2D(nb_filters // 2, (3, 3), padding="same", input_shape=input_shape), "activation", MaxPooling2D(pool_size=(2, 2)), Dropout(0.5), Conv2D(nb_filters, (3, 3), padding="valid"), "activation", MaxPooling2D(pool_size=(2, 2)), Dropout(0.5), Flatten(), Dense(500), "activation", Dropout(0.5)] return layers [docs]class CNN(Classifier): """ Implementation of a convolutional neural network using Keras sequential model """ def __init__(self, input_shape=None, include_end=True, act='relu', bnorm=False, input_ph=None, nb_filters=64, nb_classes=10, act_params={}, model=None, defences=None, preproc=None, dataset="mnist"): """Instantiates a ConvolutionalNeuralNetwork model using Keras sequential model :param tuple input_shape: shape of the input images :param bool include_end: whether to include a softmax layer at the end or not :param str act: type of the intermediate activation functions :param bool bnorm: whether to apply batch normalization after each layer or not :param input_ph: The TensorFlow tensor for the input (needed if returning logits) ("ph" stands for placeholder but it need not actually be a placeholder) :param int nb_filters: number of convolutional filters per layer :param int nb_classes: the number of output classes :param dict act_params: dict of params for activation layers :rtype: keras.model object """ if model is None: model = Sequential(name='cnn') layers = [] if "mnist" in dataset: layers = mnist_layers(input_shape, nb_filters) elif "cifar10" in dataset: layers = cifar10_layers(input_shape, nb_filters) elif "stl10" in dataset: raise NotImplementedError("No CNN architecture is defined for dataset '{0}'.".format(dataset)) for layer in layers: if layer == "activation": model.add(self.get_activation(act, **act_params)) if bnorm: model.add(BatchNormalization()) else: model.add(layer) model.add(Dense(nb_classes)) if include_end: model.add(Activation('softmax')) super(CNN, self).__init__(model, defences, preproc) |
Sources
Blog
GitHub
Publication de recherche Google
Publication de l’équipe de chercheurs américains
Et vous ?
Qu’en pensez-vous ?
Voir aussi
Qui devra être tenu pour responsable si une intelligence artificielle fait un mauvais diagnostic induisant un médecin en erreur ?
Watson, l'Intelligence artificielle d'IBM découvre chez une patiente une leucémie rare qui n'avait pas pu être détectée par les médecins
Une intelligence artificielle bat des experts de l'armée de l'air américaine dans des simulations de combats aériens
Google utilise l'intelligence artificielle pour détecter la rétinopathie diabétique qui expose près de 415 millions de diabétiques à la cécité