Künstliche Intelligenz (KI) als Hobby / Artificial Intelligence (AI) as a Hobby

Facebook Gruppe: Künstliche Intelligenz (KI) als Hobby

Basierend auf dem Tutorial: Neuronale Netze [008] - Matrixschreibweise von Neuronalen Netzen

Neuronales Netz als PHP-Arrays

Grafisch oder als Skizze erscheint ein neuronales Netz sehr intuitiv. Um jedoch Berechnungen durchführen zu können, ist es sinnvoll die grafische Darstellung in PHP als Arrays darzustellen und so zu berechnen.

Nehmen wir wie im Video Beispiel an, dass es 4 Inputneuronen gibt, 3 versteckte Neuronen und 1 Output Neuron. Die daraus resultierende Matrix enthält die jeweiligen Gewichtungen. Dazu wird in jedem Schritt die Aktivierungsfunktion berücksichtigt.

Die Matrix bzw. das Array ist so aufgebaut, dass auf der ersten Ebene die 3 versteckten Neuronen aufgeführt sind, und auf der zweiten Ebene pro verstecktem Neuron 4 Verbindungen von den 4 Inputneuronen aufgeführt sind.

20180119_Neuronales_Netz_als_Array_Matrix_Skizze.jpg

1. Gewichtungsebene zwischen Input- und versteckten Neuronen

Array für die Gewichte zwischen Input- und versteckten Neuronen

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 4
            [2] => 7
            [3] => 10
        )

    [1] => Array
        (
            [0] => 2
            [1] => 5
            [2] => 8
            [3] => 11
        )

    [2] => Array
        (
            [0] => 3
            [1] => 6
            [2] => 9
            [3] => 12
        )

)

Array für die Werte der 4 Inputneuronen

Jetzt muss ein zweites Array definiert werden, welches die Werte für die 4 Input Neuron erhält. Es ist ein einfaches eindimensionales Array in diesem Beispiel mit 4 Werten, da es 4 Inputneuron gibt.

Array
(
    [0] => 10
    [1] => 20
    [2] => 30
    [3] => 40
)

Multiplikation der beiden Arrays

Die erste Berechnung besteht nun darin, die Inputneuronen mit den Gewichtungen zu multiplizieren, um einen Wert für die versteckten Neuronen zu bekommen, der dann mit der Aktivierungsfunktion der versteckten Neuronen weiterverarbeitet wird.

Berechnete Werte der 3 versteckten Neuronen

Array
(
    [0] => 700
    [1] => 800
    [2] => 900
)

In diesem Beispiel ergeben sich für die drei versteckten Neuronen die Werte 700, 800, und 900. Diese Werte stellen jedoch den Inputwert für die versteckten Neuronen dar, sodass mit diesem Input Wert die Aktivierungsfunktion der versteckten Neuronen gefüllt werden muss. Zur Vereinfachung wird angenommen dass es keine Aktivierungsfunktion gibt, bzw. dass der Inputwert für die versteckten Neuronen direkt und ohne Umrechnung übernommen wird, sodass das Ergebnis der Berechnung direkt dem Wert der versteckten Neuronen entspricht.

2. Gewichtungsebene zwischen 3 versteckten Neuronen und 1 Output-Neuron

Im nächsten Schritt passiert im Grunde genau das gleiche, nur dass diesmal anstatt der Inputneuronen die Werte der versteckten Neuronen eingesetzt werden, so das mit den Gewichtungen zwischen versteckten Neuronen und Output Neuron der Wert für das Output Neuron ausgerechnet werden kann.

Diesmal gibt es jedoch nur drei Gewichte, da es nur ein Output Neuron gibt, welches von drei erstellten Neuronen angesprochen wird, was zu nur drei Verbindungen führt. Damit das Berechnungsschema das gleiche bleibt, wird trotzdem ein zweidimensionales Array angelegt, welches jedoch auf der ersten Ebene nur ein Element hat.

Array für die 3 Gewichte zwischen 3 versteckten Neuronen und 1 Output-Neuron

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 4
            [2] => 7
        )

)

Wir brauchen nun jedoch kein weiteres Array zu erzeugen, da wir direkt das eben berechnete Array für die versteckten Neuronen als Input verwenden.

Berechnete Werte der 3 versteckten Neuronen

Array
(
    [0] => 700
    [1] => 800
    [2] => 900
)

Ergebnis: Wert des Output-Neurons

Array
(
    [0] => 10200
)

Verwendeter PHP-Code

$Gewichte1= array
  (
  array(1,4,7,10),
  array(2,5,8,11),
  array(3,6,9,12),
  );

$Inputneuronen = array(10,20,30,40);

$HiddenneuronenInput = array();
for($i=0; $i count($Gewichte1); $i++)
{
$Zeilenergebnis = "";
    for($i2=0; $i2 count($Inputneuronen); $i2++)
    {
        $Zeilenergebnis = $Zeilenergebnis + ( $Gewichte1[$i][$i2] * $Inputneuronen[$i2] );
    } ;
$HiddenneuronenInput[$i] = $Zeilenergebnis;
};

$Gewichte2= array
  (
  array(1,4,7),
  );

$OutputNeuronen = array();
for($i=0; $i count($Gewichte2); $i++)
{
$Zeilenergebnis = "";
    for($i2=0; $i2 count($HiddenneuronenInput); $i2++)
    {
        $Zeilenergebnis = $Zeilenergebnis + ( $Gewichte2[$i][$i2] * $HiddenneuronenInput[$i2] );
    } ;
$OutputNeuronen[$i] = $Zeilenergebnis;
};