Właśnie dowiedziałem się o regularyzacji jako podejściu do kontrolowania nadmiernego dopasowania i chciałbym włączyć ten pomysł do prostej implementacji propagacji wstecznej i perceptronu wielowarstwowego (MLP), które zestawiłem.
Obecnie, aby uniknąć nadmiernego dopasowania, sprawdzam krzyżowo i utrzymuję sieć z najlepszym wynikiem do tej pory na zestawie sprawdzania poprawności. Działa to OK, ale dodanie regularyzacji przyniosłoby mi korzyść w tym prawidłowym wyborze algorytmu i parametru regularyzacji sprawiłby, że moja sieć bardziej systematycznie zbierałaby się w modelu nienadmiarowym.
Wzór, który mam dla terminu aktualizacji (z kursu Coursera ML) jest podany jako aktualizacja partii, np. Dla każdej masy, po zsumowaniu wszystkich odpowiednich delt dla całego zestawu treningowego z propagacji błędów, lambda * current_weight
dodaje się korektę przed połączonym delta jest odejmowana na końcu partii, gdzie lambda
jest parametr regularyzacji.
Moja implementacja propagacji wstecznej wykorzystuje aktualizacje wag poszczególnych artykułów. Obawiam się, że nie mogę po prostu skopiować metody wsadowej, chociaż intuicyjnie wygląda mi to OK. Czy mniejszy termin regularyzacji na produkt również działa?
Na przykład, gdy lambda * current_weight / N
N jest rozmiarem zestawu treningowego - na pierwszy rzut oka wygląda to rozsądnie. Nie mogłem jednak znaleźć niczego na ten temat i zastanawiam się, czy to dlatego, że regularyzacja nie działa tak dobrze z aktualizacją dla poszczególnych elementów, czy nawet pod inną nazwą lub zmienioną formułą.
źródło
Aby uzupełnić to, co powiedział Insys :
Regularne obliczanie jest stosowane przy obliczaniu propagacji wstecznej dla wszystkich wag w Twojej MLP. Dlatego zamiast obliczać gradient w odniesieniu do wszystkich danych wejściowych zestawu szkoleniowego (
batch
), używasz tylko niektórych / jednej pozycji (stochastic or semi-stochastic
). Ostatecznie ograniczysz wynik aktualizacji w odniesieniu do jednego elementu zamiast wszystkich, co również jest poprawne.Ponadto, jeśli dobrze pamiętam, używał Andrew NG
L2-regularization
./N
Wlambda * current_weight / N
nie jest obowiązkowe, to po prostu pomaga przeskalowanie wejścia. Jeśli jednak nie zdecydujesz się go użyć, będziesz musiał (w większości przypadków) wybrać inną wartośćlambda
.Możesz także użyć algorytmu wyszukiwania siatki, aby wybrać najlepszą wartość
lambda
( hiperparametr => ten, który musisz wybrać).źródło