kramann.info
© Guido Kramann

Login: Passwort:










8.1 Einzelnes Neuron

  • Das am häufigsten eingesetzte Modell für eine Neuron ist das s.g. Perzeptron.
  • Hier kann es eine beliebige Anzahl von Eingängen xk geben, die mit den Gewichten wk multipliziert werden.
  • Die Summe der gewichteten Eingänge liefert das Argument für eine sigmoide Funktion, deren Ergebnis z.B. der Ausgang des i-ten Neurons oi ist.
Durch Veränderungen der Gewichte wk und d "lernt" ein Neuronales Netz.
Schema eines Perzeptrons

Bild 8.1-1: Schema eines Perzeptrons

  • Als sigmoide Funktion werden teilweise abschnittsweise Geraden verwendet.
  • Häufig kommt die folgende Funktion zum Einsatz:
Beispiel einer sigmoiden Funktion

Bild 8.1-2: Beispiel einer sigmoiden Funktion

  • o ist dabei der Ausgang.
  • u ist die Summe der gewichteten Eingänge des Neurons.
  • Je größer der positive Parameter d ist, desto mehr nähert sich die Funktion einer Rechteckfunktion.

Umsetzung der Antivalenzschaltung durch geschickte Wahl der Gewichte

  • Im folgenden soll gleich eine Umsetzung einer logischen Antivalenzschaltung mit Hilfe der folgenden Neuronalen Struktur umgesetzt werden:
Neuronales Netz, mit dessen Hilfe eine logische Antivalenzverknüpfung realisiert werden soll.

Bild 8.1-3: Neuronales Netz, mit dessen Hilfe eine logische Antivalenzverknüpfung realisiert werden soll.

  • Idee zur Verteilung der Gewichte...
  • Vom Eingang zur ersten Schicht:
  • w0 = 1
  • w1 = -1
  • w2 = -1
  • w3 = 1
  • Vom Eingang zur zweiten Schicht:
  • w4 = 1
  • w5 = 1
  • Bei Neuronalen Netzen wird häufig zur "Belernung" der Backpropagation-Algorithmus eingesetzt.
  • Bei diesem Algorithmus wird der Fehler am Ausgang nach bestimmten Regeln anteilig Schicht für Schicht negativ auf die Gewichte verteilt.
  • Zunächst verwenden wir aber was wir haben:
  • Einen Genetischen Algorithmus.
Übung
  • Das folgende Java-Programm repräsentiert obiges Neuronale Netz und enthält auch gleich eine Fehlerfunktion.
  • Testen Sie die Güte obiger Gewichtsparameterverteilung in Bezug auf eine Realisierung des Antivalenzgatters.
  • Optimieren Sie das Neuronale Netz automatisiert.
  • Ziehen Sie eine weitere Schicht mit zwei Neuronen ein und optimieren Sie neu.
public class Neuro1
{
    public static double[] ww = new double[6];
    public static double[] dd = new double[3];
    public static double sigmoid(double u, double d)
    {
        return 1.0 / ( 1.0 + Math.exp(-d*u) );
    }
    public static double netz(double in0, double in1,double[] w, double[] d)
    {
        double n10 = sigmoid(in0*w[0]+in1*w[3],d[0]);
        double n11 = sigmoid(in1*w[2]+in0*w[1],d[1]);
        double n20 = sigmoid(n10*w[4]+n11*w[5],d[2]);
        return n20;
    }
    public static double berechneFehler(double[] w, double[] d)
    {
        double ausgang;      
        double fehler = 0.0;
        ausgang = netz(0.0,0.0,w,d);
        //System.out.println("in: 0 0 sollout: 0, istwert:"+ausgang);
        fehler += (ausgang-0.0)*(ausgang-0.0);
        ausgang = netz(1.0,0.0,w,d);
        //System.out.println("in: 1 0 sollout: 1, istwert:"+ausgang);
        fehler += (ausgang-1.0)*(ausgang-1.0);
        ausgang = netz(0.0,1.0,w,d);
        //System.out.println("in: 0 1 sollout: 1, istwert:"+ausgang);
        fehler += (ausgang-1.0)*(ausgang-1.0);
        ausgang = netz(1.0,1.0,w,d);
        //System.out.println("in: 1 1 sollout: 0, istwert:"+ausgang);
        fehler += (ausgang-0.0)*(ausgang-0.0);
        return fehler;
    }
    public static double berechneFehler(double[] param)
    {
        for(int i=0;i<6;i++)
            ww[i] = 100.0*param[i]-50.0;
        for(int i=0;i<3;i++)
            dd[i] = 100.0*param[i+6]-50.0;
        return berechneFehler(ww,dd);
    }
    public static void main(String[] args)
    {
        double[] w = new double[]
        {1.0,-1.0,-1.0,1.0,1.0,1.0};
        double[] d = new double[]
        {1.0, 1.0, 1.0};
        System.out.println("Fehler = "+berechneFehler(w,d));
    }
}

Code 8.1-1: Java-Implementierung eines Neuronalen Netzes.