SID Ćwiczenia 7 – Sieci neuronowe
Marcin Wojnarski

1.	[20.11, trzeba] Skonstruować ręcznie siec obliczającą XOR z dwoma wejściami.
Struktura: 2 atrybuty (1,2), warstwa I: 2 neurony (3,4), warstwa II: 1 neuron (5). Wszystkie neurony: perceptrony z funkcją progową.
Neuron 3 wykonuje (x1 AND x2) (zob. str. 7 w notatkach), 4 – (NOT (x1 OR x2)), 
5 – (NOT (x3 OR x4)). Neurony 3 i 4 można narysować na wykresie, podobnie jak jest w notatkach. 5 ‘sumuje’ obszary pozytywne neuronów 3 i 4.
Sposób przypisania wag dla poszczególnych operacji logicznych – w notatkach.

2.	[można, zob. 20.17] Czy jest sens używać sieci wielowarstwowej o wszystkich neuronach liniowych? (Czyli gdy funkcja aktywacji jest identycznościowa. Często neurony liniowe są używane w ostatniej warstwie sieci wielowarstwowej)

NIE. Sieć 2-warstowa o neuronach liniowych jest równoważna pewnej sieci 1-warstowej.
Jeśli W1, W2 – macierze wag warstwy 1 i 2 (w kolumnach są wagi kolejnych neuronów), wtedy funkcja realizowana przez całą sieć to (dla ułatwienia pomijając wagi przesunięcia w0):
	F(X) = XT * W1 * W2	(X – wektor wejściowy, pionowy)
Tak więc sieci 2-warstwowej odpowiada 1-warstwowa o macierzy wag:
	W = W1 * W2

3.	[20.19, warto]
Załóżmy, że zbiór treningowy zawiera tylko jeden przykład powtórzony 100 razy. W 80 przypadkach z wartością wyjściową 1, a w 20  - 0. Co wyliczy propagacja wsteczna dla tego przykładu, zakładając, że została wytrenowana i osiagnęła optimum globalne?   Niech y oznacza odpowiedź sieci dla tego wzorca, F – funkcję realizowaną przez sieć, 
W – wagi całej sieci (być może wielowarstwowej).
Zachodzi:   
	dE/dW = 0,		E – funkcja średniego błędu sieci na całym zbiorze uczący
	E = 0,8 * E1 + 0,2 * E0, 	Ei – błąd sieci na jednym wzorcu, o decyzji „i”
Czyli:
	0 = dE/dW = 0,8 * dE1/dW + 0,2 * dE0/dW = 0,8*(y-1)*dF/dW + 0,2*(y-0)*dF/dW
	   = (0,8*(y-1) + 0,2*y) * dF/dW
	0 = y – 0,8
	y = 0,8

4.	[warto] Pewna informacja jest kodowana za pomocą n-elementowego wektora liczb rzeczywistych, w którym jest duża redundancja, np. podejrzewamy, że ta sama informacja może być zakodowana na wektorze (n/2)-elementowym. Jak można wykorzystać sieć neuronową do kompresji wektora n-elementowego do (n/2)-elem.? Zakładamy, że mamy do dyspozycji wiele przykładowych wektorów n-elementowych.
 trzeba zbudować sieć wielowarstwową (min. 2, a zwykle 4 warstwy) o n wejściach i n wyjściach, w której środkowa warstwa ma n/2 neuronów. W trakcie uczenia podawać wektory n-elementowe jednocześnie na wejście i wyjście. W wyuczonej sieci kompresja będzie realizowana przez początkowe warstwy (skompresowany wektor trzeba odczytywać z warstwy środkowej), a dekompresja – przez końcowe.

5.	[warto] Mamy sieć neuronową S, o 2 wejściach, np. może to być sieć, która dla podanego położenia robota (x,y) mówi, czy robot znajduje się na dozwolonym terenie, czy poza nim. Niech (x,y) będą odległościami od ustalonego punktu orientacyjnego, wyrażonymi w metrach. Pytania:
a.	Chcemy przerobić sieć S na taką sieć S’, której będzie można podawać odległości wyrażone w centymetrach, a odpowiedzi będą takie same jak S
 trzeba podzielić wagi I warstwy przez 100:  W’ = W/100  
(przyjmijmy, że nie ma wag przesunięcia; sieć może być wielowarstwowa)

b.	Chcemy sieć S’ otrzymać w procesie uczenia, a nie z przetworzenia S. Czym musi się różnić proces uczenia, żeby otrzymać S’ zamiast S (poza tym, że zbiór treningowy musi zawierać odległości wyrażone w cm)? Zakładamy, że generator liczb losowych jest tak samo zainicjalizowany.
 trzeba zmienić:
- wartości początkowe wag W na 100 razy mniejsze
- współczynnik uczenia alfa na 10000 razy mniejszy (!!!)
W := W – alfa * dE/dW			- wzór uczenia dla sieci S
W/100 := W/100 – alfa/100 * dE/dW 	- po dzieleniu obustronnym przez 100
W/100 := W/100 – alfa/10000 * dE/(dW/100)
W’ := W’ – alfa’ * dE/dW’

Wniosek: parametr alfa zależy od przeskalowania atrybutów! Dla jednego problemu dobre alfa to 10^5, a dla innego 10^(-5).
(pytanie: co się dzieje gdy alfa jest zbyt duże lub zbyt małe?)

c.	Teraz odległość x chcemy wyrazić w cm, a y – w km. Czy można wyuczyć sieć S’ odpowiadającą sieci S?
 Raczej nie, bo parametr alfa musiałby być inny dla połączeń wychodzących z atrybutu x niż dla wychodzących z y (iloraz tych alfa musiałby wynosić 10^10 !) – tego się nie stosuje (nie sposób jest ręcznie ustawić parametr alfa dla każdego atrybutu).

Wniosek: czasem może nie istnieć dobre alfa.
Ten problem można rozwiązać [może studenci sami wymyślą]: znormalizować każdy atrybut, np. do jednostkowego odchylenia standardowego lub do jednostkowej różnicy między minimalną a maksymalną wartością. Rozrzut wartości wszystkich atrybutów będzie porównywalny, więc jest szansa na istnienie wspólnego dobrego alfa o ‘rozsądnej’ wartości.

d.	A czy trzeba podobnie przeskalować atrybuty wyjściowe (decyzyjne)?
Na uczenie których wag ma wpływ przeskalowanie atr. wyjściowych?
 Tak, jeśli mamy ogólny problem aproksymacji funkcji (dla klasyfikacji nie jest to potrzebne). Przeskalowanie atr. wyjściowych wpływa na uczenie wszystkich wag sieci, nie tylko jednej warstwy, bo od niego zależy błąd E, występujący w dE/dW.

6.	[20.14, warto podać pod koniec, do zastanowienia]
Funkcji boolowskich dla n wejść jest 2 do 2 do n. Ile z nich może być reprezentowanych przez perceptron progowy? Nie znam odpowiedzi.