|
|
pl:dydaktyka:ml:lab6 [2017/07/17 10:08] |
pl:dydaktyka:ml:lab6 [2019/06/27 15:50] (aktualna) |
| ====== Laboratorium 6 - Sztuczne sieci neuronowe ====== |
| Ćwiczenia bazujące na materiałach Andrew Ng.\\ |
| Przed zajęciami przejrzyj wykłady [[https://class.coursera.org/ml/lecture/preview|VIII i IX]] \\ |
| {{:pl:dydaktyka:ml:ex4.pdf|Instructions}} in English. |
| |
| Ćwiczenia do pobrania (files to download): {{:pl:dydaktyka:ml:neural-networks.zip|Neural Networks}} |
| |
| |
| ===== Lista i opis plików ===== |
| * //ex4.m// - Skrypt pomagający przejść przez laboratorium |
| * //ex4data1.mat// - Dane uczące zawierające pismo odręczne |
| * //ex4weights.mat// - Parametry sieci neuronowej |
| * //displayData.m// - funkcja wizualizująca zbiór danych |
| * //fmincg.m// - Funkcja wyznaczająca minimum (podobna do //fminunc//) |
| * //sigmoid.m// - funkcja sigmoidalna |
| * //computeNumericalGradient.m// - Numerycznie oblicza gradienty |
| * //checkNNGradients.m// - Funkcja sprawdzajaca gradienty |
| * //debugInitializeWeights.m// - Funkcja inicjalizujaca wagi początkowe |
| * //predict.m// - Funkcja predykcji dla sieci neuronowej |
| * :!: sigmoidGradient.m - Obliczanie gradientów dla funkcji sigmoidalnej |
| * randInitializeWeights.m - Losowa inicjalizacja wag sieci neuronowej |
| * :!: nnCostFunction.m - funkcja kosztu dla sieci neuronowej |
| ===== 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: |
| * ilość neuronów w warstwie ukrytej? |
| * funkcja aktywacji neuronu? |
| * cechy, które podajemy na wejściu? |
| * ilość danych wejśćiowych? |
| * współczynnik regularyzacji lub learning rate? |
| * ilość warstw ukrytych? |
| |
| ===== 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. |
| |
| {{:pl:dydaktyka:ml:digit-nn.png?700|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 ===== |
| {{:pl:dydaktyka:ml:nn-backpropagation.png?700|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//). |
| |
| - 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 {{:pl:dydaktyka:ml:digit-nn.png?linkonly|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]//. |
| - Dla każdego neuronu z warstwy wyjściowej oblicz $$\delta_k^{(3)} = (a_k^{(3)}-y_k)$$ |
| - Dla ukrytej warstwy $l = 2$, ustaw: $$\delta^{(2)}=(\Theta^{(2)})^T\delta^{(3)}.*g'(z^{(2)})$$ |
| - Oblicz zakumulowany gradient dla danego elementu //t//. Pamiętaj żeby pominąć $\delta_0^{(2)}$:$$\Delta^{(l)} = \Delta^{(l)} + \delta^{(l+1)}(a^{(l)})^T$$ |
| - 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 ===== |
| |
| |