qBlog Quadina w świecie PHP

11paź/121

Sztuczna Inteligencja w PHP

Witajcie,

Minęło już kilka dni od PHPCona. Ja nadgoniłem zaległości i biorę się za materiały dla Was. Poniżej najfajniejsza, moim zdaniem, klasa do zrozumienia tematu nauki sieci neuronowej w PHP.

Klasa NeuralNetwork ma bardzo dobrą dokumentacje zamieszczoną w komentarzach. Jednakże przedstawie Wam w jaki sposób ja ją wykorzystuje do demonstrowania działania sieci neuronowych. Na potrzeby produkcyjne niestety ta klasa jest zbyt wolna.

Na początku był obiekt

Tworzymy obiekt i wstępnie go konfigurujemy. Konfigurację możemy zostawić na wartościach domyślnych, ale ja zwykle je wypisuje, bo często je modyfikuje. Polecam je zostawić i Wam, żeby prześledzić jak zmiana parametru momentum wpływa na prędkość uczenia się sieci. Parametry konstruktora obiektu są dobrane pod względem ilości wejść i wyjść. 4 wejścia, i 2 wyjścia. Wartość w środku to ilość neuronów w warstwie ukrytej. Dla uproszczenia możemy przyjąć że jest to średnia arytmetyczna wejścia i wyjścia zaokrąglona do góry.

$n = new NeuralNetwork( 4, 4, 2 );
$n->setVerbose( true ); // do debugowania lub śledzenia procesu uczenia się
$n->setMomentum( 0.5 );
$n->setLearningRate( 0.3 );

Następnie generujemy sobie zestawy danych i przepisujemy je do obiektu jako dane testowe:

$zestawy = generuj( 13 );
foreach( $zestawy as $zestaw ){
	$n->addTestData( $zestaw[ 'in' ], $zestaw[ 'out' ] );
}

Funkcję generującą zaprezentuje na przykładzie generatora punktów funkcji sinus. Nie będę się tutaj zagłębiać w obliczenia matematyczne, natomiast elementy 'in' i 'out' wymagają pewnego komentarza. Aproksymując funkcję sinus, czy jakąkolwiek inną funkcję, trudno by było ją przybliżać na podstawie tylko jednej ostatniej danej. W takim właśnie celu generator bierze pod uwagę 6 kolejno wygenerowanych punktów. 4 pierwsze to wzór wejściowy, 2 ostatnie to wzór wyjściowy. Dzięki temu dostajemy ile chcemy wzorów in/out dla systemu z 4 wejściami i 2 wyjściami.

function generuj(){
	$max = 20;
	$zestaw = array( );

	$obrot = 360 / $max;
	$dane = array( );
	for( $i = 0; $i < $max; $i++ ){
		 $dane[ ] = round( cos( deg2rad( $i * $obrot ) ) , 3 );
	}

	for( $i = 5; $i < $max; $i++ ){
		$zestaw[ ] = array(
		 'in' => array(
		 $dane[ $i - 5 ],
		 $dane[ $i - 4 ],
		 $dane[ $i - 3 ],
		 $dane[ $i - 2 ]
		),
		'out' => array(
		 $dane[ $i - 1 ],
		 $dane[ $i ]
		)
		);
	 }
	 return $zestaw;
}

No i najbardziej czasochłonna rzecz czyli wykonanie w pętli procesu uczenia się.

while( !$success ){
	$success = @$n->train( 2000, 0.01 );
}

Nasza świeżo nauczona sieć może się już teraz przydać do przybliżania sinusa z danych, które niekoniecznie są dokładne np.

echo $n->calculate( array( -0.3, 0.2, 0.3, 0.4 ); // powinno dac 0.77
echo $n->calculate( array( -0.9, -0.8, -0.7, -0.6 ); // powinno dac -0.35
echo $n->calculate( array( 0.9, 0.8, 0.7, 0.6 ); // powinno dac 0.27
echo $n->calculate( array( 0.4, 0.3, 0.2, 0.1 ); // powinno dac -0.01
echo $n->calculate( array(  0.3, 0.2, 0.1, 0  ); // powinno dac -0.12

Materiały:

class_neuralnetwork

Zakres tematyczny: Bez kategorii Dodaj komentarz
Komentarze (1) Trackbacks (0)
  1. generuj( 13 );
    //….
    function generuj(){

    Rozumiem że 13 miało być tym $max=20; ?

    Jak by komuś nie chciało się szukać:
    http://www.tremani.nl/open-source/neural-network/?p=source


Leave a comment

Brak trackbacków.