Künstliche Intelligenz mit Java
Maschinelles Lernen mit Neuronalen Netzwerken

Der Algorithmus der vorherigen Seite wird jetzt für das Neuronale Netzwerk vollständig implementiert:

  private void makeBackPropagationForOutputLayer(double[] targets) {
    System.out.println("\nbackpropagation output layer");
    double[] possibleBiasValuesForOutputlayer = new double[targets.length];
    for (int i = 0; i < ProcessMonitoring.lastOutputs.length; i++) {
      double lastOutputI = ProcessMonitoring.lastOutputs[i];
      System.out.println("\noutput: " + lastOutputI + "     target: " + targets[i] + "\n");
      int numberOfWeightsInclBias = outputLayer.get(i).getWeights().length;
      for (int j = 0; j < numberOfWeightsInclBias; j++) {
        double singleWeightError = (targets[i] - lastOutputI) * (lastOutputI) *
                                                                         (1 - lastOutputI);
        double deltaW = singleWeightError * TrainingParameter.learningRate;
        deltaW *= (isNotABiasWeight(j, numberOfWeightsInclBias)) ?
                                       ProcessMonitoring.lastOutputsFromHiddenLayer[j] : 1;
        double newWeight = outputLayer.get(i).getWeights(j) + deltaW;
        if (isNotABiasWeight(j, numberOfWeightsInclBias)) {
          outputLayer.get(i).setWeights(j, newWeight);
          System.out.println("new weight: " + newWeight);
        }
        else {
          System.out.println("bias calculation " + (i + 1) + ": " + newWeight);
          possibleBiasValuesForOutputlayer[i] = newWeight;
        }
      }
    }
    if (TrainingParameter.isBiasBackPropagationDesired)
      setBias(possibleBiasValuesForOutputlayer, outputLayer);
  }

  // die Klasse FeedForwardNetwork geht gleich weiter


Zwei Methoden wurden ausgelagert. Die erste Methode gibt an, ob ein Gewicht ein „normales Gewicht“ oder ein Bias-Gewicht ist:

  private boolean isNotABiasWeight(int j, int numberOfWeightsInclBias) {
    return j < numberOfWeightsInclBias - 1;
  }

  // die Klasse FeedForwardNetwork geht gleich weiter


Die zweite Methode setzt für alle Neuronen einer Schicht (entweder Hidden-Layer oder Output-Layer) den Bias-Wert. Dieser ist der Durchschnitt aller möglichen Bias-Werte:

  private void setBias(double[] bias, ArrayList<Neuron> layer) {
    double average = 0;
    for (double possibleValue : bias)
      average += possibleValue;
    average /= bias.length;
    for (int i = 0; i < layer.size(); i++)
      layer.get(i).setWeights(layer.get(i).getWeights().length - 1, average);
  }

  // die Klasse FeedForwardNetwork geht auf der nächsten Seite weiter

- 46 -