Spis treści

Laboratorium 6 - Sztuczne sieci neuronowe

Ćwiczenia bazujące na materiałach Andrew Ng.
Przed zajęciami przejrzyj wykłady VIII i IX
Instructions in English.

Ćwiczenia do pobrania (files to download): Neural Networks

Lista i opis plików

Rozgrzewka

Zanim zaczniemy właściwą część zajęć, poświeć chwilę na obejrzeniu jak działa prosta sieć neuronowa w akcji: http://playground.tensorflow.org/

Zastanów się co wpływa na jakość klasyfikacji:

Wstęp

Celem ćwiczeń laboratoryjnych jest nauczenie sieci neuronowej rozpoznawania cyfr. Sieć neuronowa będzie składać się z 3 warstw. Ilość neuronów w warstwie wyjściowej będzie równa ilości klasyfikowanych wzorców (czyli w naszym przypadku 10).

Struktura sieci neuronowej przedstawiona jest na rysunku poniżej. Pierwsza warstwa zawiera 400 perceptronów, warstwa ukryta zabiera 25 neuronów, a warstwa wyjściowa 10.

Struktura sieci neuronowej do rozpoznawania cyfr

Funkcja kosztu

Uzupełnij plik nnCostFunction.m wyznaczając koszt i gradient dla sieci neuronowej.

Uwaga Macierz X, zawierająca zbiór uczący, zbudowana jest w taki sposób, że poszczególne elementy uczące znajdują się w wierszach. Aby dostać się do i-tego przykładu uczącego należy zatem odwołać się do niego w następujący sposób: X(i,:).

Uwaga Macierz X nie zawiera elementów biasu, dlatego w funkcji nnCostFunction.m konieczne jest dodanie tych elementów!

Uwaga Parametry $\Theta$ dla poszczególnych warstw sieci znajdują się w zmiennych Theta1 oraz Theta2. Theta1 ma rozmiar 25 x 401. Theta2 ma rozmiar 10 x 26.

Wartość funkcji kosztu obliczany jest za pomocą wzoru:

$$J(\theta)= \frac{1}{m}\sum_{i=1}^{m}\sum_{k=1}^{K}\left [  -y_k^{(i)}log((h_\theta(x^{(i)}))_k)-(1-y_k^{(i)})log(1-(h_\theta(x^{(i)}))_k \right ]$$

Gdzie $m$ to ilość przykładów w zbiorze uczącym, a $K$ to ilość etykiet (w naszym przypadku 10).

Uwaga Pamiętaj aby poprawnie obliczyć wartość $h(x)$, która w przypadku sieci neuronowej polega na wymnożeniu współczynników wag Theta i danych wejściowych - zobacz rysunek powyżej.

Uwaga Sieć neuronowa ma 10 neuronów w warstwie wyjściowej. Zatem wyjście sieci oznaczające, że rozpoznano np liczbę 3, będzie wyglądać następująco (cyfrę zero reprezentować będzie 10 indeks wektora y):

$$y = \begin{bmatrix}
0\\ 
0\\ 
1\\ 
0\\ 
...\\ 
0
\end{bmatrix}$$

Sprawdź działanie funkcji za pomocą skrypty check.m. Uruchom skrypt ex4.m. Powinieneś zobaczyć koszt równy około 0.287629.

Funkcja kosztu z regularyzacją

Wartość funkcji kosztu obliczany jest za pomocą wzoru:

$$
J(\theta)= \frac{1}{m}\sum_{i=1}^{m}\sum_{k=1}^{K}\left [  -y_k^{(i)}log((h_\theta(x^{(i)}))_k)-(1-y_k^{(i)})log(1-(h_\theta(x^{(i)}))_k \right ] + R(\theta)
$$

Gdzie

$$
R(\theta) = \frac{\lambda}{2m}\left [ \sum_{j=1}^{25}\sum_{k=1}^{400}(\Theta_{j,k}^{(1)})^2+\sum_{j=1}^{10}\sum_{k=1}^{25}(\Theta_{j,k}^{(2)})^2 \right ]
$$

Uwaga Pamiętaj, żeby we wzorze na remaskularyzację nie uwzględniać biasu.

Przetestuj działanie funkcji za pomocą skryptu check.m. Przetestuj działanie funkcji za pomocą skryptu ex4.m. Powinieneś otrzymać wynik funkcji kosztu na poziomie około 0.383770.

Gradient funkcji sigmoidalnej

Do wykonania następnego zadnia konieczne jest wyznaczenie gradientu funkcji sigmoidalnej. Uzupełnij plik sigmoidGradient.m. Gradient dla funkcji sigmoidalnej obliczany jest wg. wzoru:

$$
g'(z) = \frac{d}{dz}g(z) = g(z)(1-g(z))
$$

Sprawdź poprawność działania funkcji za pomocą skryptu check.m.

Backpropagation

Backpropagation Dla każdego elementu t ze zbioru uczącego wykonaj następujące kroki (tutaj nie da się uniknąć pętli for t=1:m … end).

  1. Ustaw wartości perceptronów (warstwa wejściowa $a^{(1)})$ na t-ty element ze zbioru uczącego $x^{(t)}$. Wykonaj propagacje wprzód (patrz rysunek pierwszy), obliczając poszczególne wartości dla warstw wewnętrznych ($z^{(2)}, a^{(2)},z^{(3)},a^{3)}$). Pamiętaj o uwzględnieniu biasu w zmiennych $a^{(1)}$ oraz $a^{(2)}$. Np. a_1 = [1; a_1].
  2. Dla każdego neuronu z warstwy wyjściowej oblicz

    $$\delta_k^{(3)} = (a_k^{(3)}-y_k)$$

  3. Dla ukrytej warstwy $l = 2$, ustaw:

    $$\delta^{(2)}=(\Theta^{(2)})^T\delta^{(3)}.*g'(z^{(2)})$$

  4. Oblicz zakumulowany gradient dla danego elementu t. Pamiętaj żeby pominąć $\delta_0^{(2)}$:

    $$\Delta^{(l)} = \Delta^{(l)} + \delta^{(l+1)}(a^{(l)})^T$$

  5. Wyznacz niezregularyzowany gradient:

    $$\frac{\partial}{\partial\Theta_{i,j}^{(l)})}J(\Theta) = \frac{1}{m}\Delta_{ij}^{(l)}$$

Uruchom skrypt ex4.m i sprawdź poprawność działania algorytmu. Sprawdź działanie algorytmu za pomocą skryptu check.m

Regularyzowane backpropagation

Regularyzacja gradientu polega na następującej modyfikacji wzoru:

$$\frac{\partial}{\partial\Theta_{i,j}^{(l)})}J(\Theta) = \frac{1}{m}\Delta_{ij}^{(l)}+\frac{\lambda}{m}\Theta_{ij}^{(l)}$$

Uwaga Pamiętaj aby pominąć bias!

Przetestuj działanie algorytmu przy pomocy skryptu check.m oraz ex4.m.

Uwagi