Premiers pas avec le réseau de neurones

Workflow typique d’un réseau de neurones

Le flux de travail typique de formation et d’utilisation des réseaux de neurones, quelle que soit la bibliothèque utilisée, se déroule comme suit :

Données d’entraînement

  1. Obtenir les données d’apprentissage : la variable “X” est l’entrée et la variable “Y” est la sortie. La chose la plus simple à faire est d’apprendre une porte logique, où ‘X’ est un vecteur ou deux nombres et ‘Y’ est un vecteur d’un nombre. En règle générale, les valeurs d’entrée et de sortie sont des flottants, donc s’il s’agit de mots, vous pouvez associer chaque mot à un neurone différent. Vous pourriez aussi utiliser directement des caractères, cela utiliserait alors moins de neurones que pour conserver tout un dictionnaire.

Architecture

  1. Définir l’architecture du réseau neuronal : cela se fait en spécifiant comment les neurones sont reliés entre eux et avec quel algorithme les connexions entre neurones sont entraînées et modifiées. Par exemple, le traitement du texte est effectué à l’aide de réseaux de neurones récurrents, qui reçoivent une nouvelle entrée à chaque pas de temps et où les neurones ont une référence à leur valeur antérieure dans le temps à des fins de calcul efficace. Couramment, des couches de neurones sont utilisées, elles sont généralement empilées les unes sur les autres des entrées aux sorties. La façon dont les neurones sont connectés d’une couche à l’autre varie beaucoup. Certaines architectures de vision par ordinateur utilisent des réseaux de neurones profonds (avec de nombreuses couches spécialisées empilées).

Évaluation

  1. Ensuite, le réseau de neurones est généralement évalué sur des données sur lesquelles il n’a pas été formé directement. Cela consiste à présenter la partie « X » des données au réseau de neurones, puis à comparer le « Y » qu’il prédit au « Y » réel. de nombreux indicateurs existent pour évaluer la qualité des apprentissages effectués.

Amélioration

  1. Il est courant de modifier à nouveau l’architecture du réseau de neurones pour améliorer ses performances. Le réseau de neurones ne doit être ni trop intelligent ni trop stupide car les deux cas posent des problèmes. Dans le premier cas, le réseau de neurones pourrait être trop grand pour les données, les mémoriser parfaitement, et il pourrait ne pas se généraliser à de nouveaux exemples invisibles. Dans le second cas, si le réseau de neurones est trop stupide (petit), il échouera également à apprendre.

Utilisation dans le monde réel

  1. L’utiliser sur de nouvelles données pour prédire une sortie. En effet, les réseaux de neurones sont assez utiles, la traduction automatique de texte ou la réponse à une question textuelle en sont de bons exemples. L’une des techniques utilisées pour améliorer le réseau de neurones à ce stade est l’apprentissage en ligne, ce qui signifie que si le réseau peut obtenir une rétroaction constructive sur ses sorties, il est toujours possible de poursuivre le processus d’apprentissage. Par exemple, cela pourrait être le cas de Google Translate qui demande aux utilisateurs des commentaires sur les traductions.

Classe Python Neuron

import numpy as np #There is a lot of math in neurons, so use numpy to speed things up in python; in other languages, use an efficient array type for that language
import random      #Initial neuron weights should be random

class Neuron:

def __init__(self, nbr_inputs, weight_array = None):
    if (weight_array != None): #you might already have a trained neuron, and wish to recreate it by passing in a weight array h ere
        self.weight_array = weight_array
    else:                      #...but more often, you generate random, small numbers for the input weights.  DO NOT USE ALL ZEROES, or you increase the odds of getting stuck when learning
        self.weight_array = np.zeros(nbr_inputs+1)
        for el in range(nbr_inputs+1): #+1 to account for bias weight
            self.weight_array[el] = random.uniform((-2.4/nbr_inputs),(2.4/nbr_inputs))
    self.nbr_inputs = nbr_inputs

def neuron_output(self,input_array):
    input_array_with_bias = np.insert(input_array,0,-1)
    weighted_sum = np.dot(input_array_with_bias,self.weight_array)
    #Here we are using a hyperbolic tangent output; there are several output functions which could be used, with different max and min values and shapes
    self.output = 1.716 * np.tanh(0.67*weighted_sum)
    return self.output

Moteur Java Encog

[Encog][1] est un moteur de réseau neuronal Java facile à utiliser

public static double XOR_INPUT[][] = { { 0.0, 0.0 }, { 1.0, 0.0 },
        { 0.0, 1.0 }, { 1.0, 1.0 } };

public static double XOR_IDEAL[][] = { { 0.0 }, { 1.0 }, { 1.0 }, { 0.0 } };

public static void main(final String args[]) {
    
    // create a neural network, without using a factory
    BasicNetwork network = new BasicNetwork();
    network.addLayer(new BasicLayer(null,true,2));
    network.addLayer(new BasicLayer(new ActivationSigmoid(),true,3));
    network.addLayer(new BasicLayer(new ActivationSigmoid(),false,1));
    network.getStructure().finalizeStructure();
    network.reset();

    // create training data
    MLDataSet trainingSet = new BasicMLDataSet(XOR_INPUT, XOR_IDEAL);
    
    // train the neural network
    final ResilientPropagation train = new ResilientPropagation(network, trainingSet);

    int epoch = 1;

    do {
        train.iteration();
        System.out.println("Epoch #" + epoch + " Error:" + train.getError());
        epoch++;
    } while(train.getError() > 0.01);
    train.finishTraining();

    // test the neural network
    System.out.println("Neural Network Results:");
    for(MLDataPair pair: trainingSet ) {
        final MLData output = network.compute(pair.getInput());
        System.out.println(pair.getInput().getData(0) + "," + pair.getInput().getData(1)
                + ", actual=" + output.getData(0) + ",ideal=" + pair.getIdeal().getData(0));
    }
    
    Encog.getInstance().shutdown();
}

C’est l’équivalent “Hello World” des réseaux de neurones.

[1] : http://www.heatonresearch.com/encog/ “Page d’accueil d’Encog”