Künstliche Intelligenz mit Java
Maschinelles Lernen mit Neuronalen Netzwerken

Das Training selbst ist algorithmisch relativ leicht zu implementieren. N-mal (Anzahl der Epochen) wird zufällig eines der möglichen Eingangskombinationen an den Eingang des Neurons gelegt und dann geguckt, ob der Output gleich dem gewünschten Ziel ist. Wenn nicht, werden die Gewichte neu justiert:

public void trainWithSupervisedLearning() {

  Random random = new Random();
  for (int epoche = 1; epoche <= TrainingParameter.numberOfEpochs; epoche++) {
    int sample = random.nextInt(TrainingParameter.inputs.length);
    System.out.println("epoche: " + epoche + "   data number: " + (sample + 1)); 
    calculateOutput(TrainingParameter.inputs[sample],
TrainingParameter.activationFunction); 
   
if (TrainingParameter.targets[sample] - 
                                  processMonitoring.lastOutputWithActivationFunction != 0) 
      calculateNewWeights(TrainingParameter.targets[sample]);
    }
  System.out.println("end of training\n");

}

Wie wird der Output berechnet? Relativ einfach:

public void calculateOutput(double[] inputs, ActivationFunction activationFunction) {

  this.inputs = inputs;
  ProcessMonitoring.lastOutputAsSum = neuron.getOutput(inputs, ActivationFunction.ONLYSUM);  
  ProcessMonitoring.lastOutputWithActivationFunction = 
                                              neuron.getOutput(inputs, activationFunction); 
  ProcessMonitoring.lastWeights = neuron.getWeights();

}

Die Methode bekommt zur Laufzeit eine der möglichen Eingangskombinationen und die Aktivierungsfunktion übergeben.

Die Neujustierung der Gewichte hingegen ist schwieriger. Zuerst braucht man die Formel für den Fehler, den eine der möglichen Eingangskombinationen erzeugt hat:

error = target – outputWithHeaviside

Wenn die Ausgabe dem Ziel entspricht, dann ist der Fehler 0. Ansonsten kann er entweder "1 – 0 = 1" oder "0 – 1 = -1" betragen. Wenn es einen Fehler gibt, sollen alle Gewichte um einen Faktor deltaW verändert werden. Die Rechenregel, Delta-Regel genannt, für deltaW lautet für die „normalen“ Gewichte wie folgt:

deltaW0 = error * TrainingParameter.learningRate * inputs[0]

deltaW1 = error * TrainingParameter.learningRate * inputs[1]

deltaWn-1 = error * TrainingParameter.learningRate * inputs[n-1]

- 18 -