Dla zabawy próbuję rozwinąć sieć neuronową.
Teraz dla propagacji wstecznej widziałem dwie techniki.
Pierwszy jest używany tutaj i w wielu innych miejscach.
Co to robi:
- Oblicza błąd dla każdego neuronu wyjściowego.
- Propaguje go z powrotem do sieci (obliczając błąd dla każdego wewnętrznego neuronu).
- Aktualizuje wagi za pomocą wzoru: (gdzie jest zmiana masy, szybkość uczenia się, błąd neuronu odbierającego sygnał wejściowy z synapsy i będący wynikiem wysyłanym przez synapsę).
- Powtarza się dla każdego wpisu zestawu danych tyle razy, ile jest to wymagane.
Jednak sieć neuronowa zaproponowana w tym samouczku (dostępna również na GitHub) używa innej techniki:
- Wykorzystuje funkcję błędu (druga metoda ma funkcję błędu, ale nie używa jej do szkolenia).
- Ma inną funkcję, która może obliczyć błąd końcowy, zaczynając od wag.
- Minimalizuje tę funkcję (poprzez opadanie gradientu).
Którą metodę należy zastosować?
Myślę, że pierwszy jest najczęściej używany (ponieważ widziałem różne przykłady z jego użyciem), ale czy on również działa?
W szczególności nie wiem:
- Czy nie podlega bardziej lokalnym minimum (ponieważ nie używa funkcji kwadratowych)?
- Ponieważ na zmianę każdej masy wpływa wartość wyjściowa jej neuronu wyjściowego, czy wpisy zestawu danych, które akurat wytwarzają wyższe wartości w neuronach (nie tylko wyjściowych), mają większy wpływ na wagi niż inne wpisy?
Teraz wolę pierwszą technikę, ponieważ łatwiej mi ją wdrożyć i łatwiej o niej myśleć.
Chociaż, jeśli występują problemy, o których wspomniałem (a mam nadzieję, że tak nie jest), czy istnieje jakiś faktyczny powód, aby używać go w stosunku do drugiej metody?