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.
Bild 0-1: Schema eines Perzeptrons
- Als sigmoide Funktion werden teilweise abschnittsweise Geraden verwendet.
- Häufig kommt die folgende Funktion zum Einsatz:
|
Bild 0-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:
|
Bild 0-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 0-1: Java-Implementierung eines Neuronalen Netzes.