Praca z sieciami neuronowymi: lista kontrolna do debugowania

Praca z sieciami neuronowymi: lista kontrolna do debugowania

Kod oprogramowania do uczenia maszynowego jest często złożony i dość zagmatwany. Wykrywanie i eliminowanie błędów jest zadaniem wymagającym dużych zasobów. Nawet najprostsze sieci neuronowe z wyprzedzeniem wymagają poważnego podejścia do architektury sieci, inicjalizacji wag i optymalizacji sieci. Mały błąd może prowadzić do nieprzyjemnych problemów.

Ten artykuł dotyczy algorytmu debugowania sieci neuronowych.

Skillbox poleca: Kurs praktyczny Programista Pythona od podstaw.

Przypomnienie: dla wszystkich czytelników „Habr” - rabat w wysokości 10 000 rubli przy zapisywaniu się na dowolny kurs Skillbox przy użyciu kodu promocyjnego „Habr”.

Algorytm składa się z pięciu etapów:

  • łatwy start;
  • potwierdzenie strat;
  • sprawdzenie wyników pośrednich i połączeń;
  • diagnostyka parametrów;
  • kontrola pracy.

Jeśli coś wydaje Ci się bardziej interesujące niż reszta, możesz od razu przejść do tych sekcji.

Łatwy start

Sieć neuronowa o złożonej architekturze, regularyzacji i harmonogramie szybkości uczenia się jest trudniejsza do debugowania niż zwykła sieć. Jesteśmy tutaj trochę podstępni, ponieważ sam punkt jest pośrednio związany z debugowaniem, ale nadal jest to ważne zalecenie.

Prostym początkiem jest utworzenie uproszczonego modelu i wytrenowanie go na jednym zestawie (punkcie) danych.

Najpierw tworzymy uproszczony model

Aby szybko zacząć, tworzymy małą sieć z jedną ukrytą warstwą i sprawdzamy, czy wszystko działa poprawnie. Następnie stopniowo komplikujemy model, sprawdzając każdy nowy aspekt jego struktury (dodatkowa warstwa, parametr itp.) i ruszamy dalej.

Trenujemy model na pojedynczym zestawie (punkcie) danych

Aby szybko sprawdzić poprawność projektu, możesz użyć jednego lub dwóch punktów danych szkoleniowych, aby potwierdzić, czy system działa poprawnie. Sieć neuronowa musi wykazywać 100% dokładność podczas uczenia i testowania. Jeśli tak nie jest, to albo model jest za mały, albo masz już błąd.

Nawet jeśli wszystko jest w porządku, zanim przejdziesz dalej, przygotuj model dla jednej lub kilku epok.

Ocena strat

Oszacowanie strat jest głównym sposobem udoskonalenia wydajności modelu. Należy upewnić się, że strata jest odpowiednia do problemu i że funkcje straty są oceniane we właściwej skali. Jeśli używasz więcej niż jednego typu straty, upewnij się, że wszystkie są tej samej kolejności i są poprawnie skalowane.

Ważne jest, aby zwracać uwagę na początkowe straty. Sprawdź, jak blisko wyniku rzeczywistego jest wynik oczekiwany, jeśli model rozpoczął się od losowego domysłu. W Praca Andreya Karpathy'ego sugeruje, co następuje:: „Upewnij się, że uzyskasz oczekiwany wynik, zaczynając od małej liczby parametrów. Utratę danych lepiej jest od razu sprawdzić (przy stopniu regularyzacji ustawionym na zero). Na przykład dla CIFAR-10 z klasyfikatorem Softmax oczekujemy, że początkowa strata wyniesie 2.302, ponieważ oczekiwane prawdopodobieństwo rozproszone wynosi 0,1 dla każdej klasy (ponieważ istnieje 10 klas), a strata Softmax jest logarytmem ujemnym prawdopodobieństwa właściwej klasy jako − ln (0.1) = 2.302.”

W przykładzie binarnym podobne obliczenia przeprowadza się po prostu dla każdej klasy. Oto na przykład dane: 20% 0 i 80% 1. Oczekiwana początkowa strata wyniesie do –0,2 ln (0,5) –0,8 ln (0,5) = 0,693147. Jeśli wynik jest większy niż 1, może to oznaczać, że wagi sieci neuronowej nie są odpowiednio zbilansowane lub dane nie są znormalizowane.

Sprawdzanie wyników pośrednich i połączeń

Aby zdebugować sieć neuronową, konieczne jest zrozumienie dynamiki procesów zachodzących w sieci oraz roli poszczególnych warstw pośrednich w momencie ich połączenia. Oto typowe błędy, które możesz napotkać:

  • niepoprawne wyrażenia dotyczące aktualizacji stopni;
  • aktualizacje wagi nie są stosowane;
  • eksplodujące gradienty.

Jeśli wartości gradientu wynoszą zero, oznacza to, że tempo uczenia się w optymalizatorze jest zbyt wolne lub że napotkałeś nieprawidłowe wyrażenie do aktualizacji gradientu.

Dodatkowo konieczne jest monitorowanie wartości funkcji aktywacji, wag i aktualizacji każdej z warstw. Na przykład wielkość aktualizacji parametrów (wagi i odchylenia) powinno być 1-e3.

Istnieje zjawisko zwane „Dying ReLU” lub „problem znikającego gradientu”, gdy neurony ReLU wyjdą zero po nauczeniu się dużej ujemnej wartości odchylenia dla swoich wag. Neurony te nigdy nie zostaną ponownie uruchomione w żadnym momencie danych.

Aby zidentyfikować te błędy, można zastosować sprawdzanie gradientu, przybliżając gradient za pomocą podejścia numerycznego. Jeżeli jest on zbliżony do obliczonych gradientów, oznacza to, że propagacja wsteczna została zaimplementowana poprawnie. Aby utworzyć kontrolę gradientu, przejrzyj te wspaniałe zasoby z CS231 tutaj и tutaja także z lekcja Andrew Nga na ten temat.

Faizan Szejk wskazuje trzy główne metody wizualizacji sieci neuronowej:

  • Wstępy to proste metody, które pokazują nam ogólną strukturę wytrenowanego modelu. Należą do nich dane wyjściowe kształtów lub filtrów poszczególnych warstw sieci neuronowej oraz parametry w obrębie każdej warstwy.
  • Oparta na aktywacji. Rozszyfrujemy w nich aktywacje poszczególnych neuronów lub grup neuronów, aby zrozumieć ich funkcje.
  • Na podstawie gradientów. Metody te mają tendencję do manipulowania gradientami utworzonymi w wyniku przejść do przodu i do tyłu szkolenia modelu (w tym map istotności i map aktywacji klas).

Istnieje kilka przydatnych narzędzi do wizualizacji aktywacji i połączeń poszczególnych warstw, m.in. KonX и Tablica Tensorowa.

Praca z sieciami neuronowymi: lista kontrolna do debugowania

Diagnostyka parametrów

Sieci neuronowe mają wiele parametrów, które oddziałują ze sobą, co komplikuje optymalizację. Właściwie ta sekcja jest przedmiotem aktywnych badań specjalistów, dlatego poniższe sugestie należy traktować jedynie jako porady, punkty wyjścia do budowania.

Wielkość paczki (wielkość partii) — jeśli chcesz, aby wielkość partii była wystarczająco duża, aby uzyskać dokładne szacunki gradientu błędów, ale jednocześnie wystarczająco mała, aby opadanie gradientu stochastycznego (SGD) umożliwiało normalizację sieci. Małe partie będą prowadzić do szybkiej konwergencji ze względu na hałas podczas procesu uczenia, a w konsekwencji do trudności optymalizacyjnych. Zostało to opisane bardziej szczegółowo tutaj.

Szybkość uczenia się - zbyt niska będzie prowadzić do powolnej zbieżności lub ryzyka utknięcia w lokalnych minimach. Jednocześnie wysoki współczynnik uczenia spowoduje rozbieżność optymalizacji, ponieważ ryzykujesz przeskoczenie przez głęboką, ale wąską część funkcji straty. Spróbuj użyć harmonogramu szybkości, aby ją zmniejszyć podczas uczenia sieci neuronowej. Aktualny z CS231n istnieje obszerna sekcja poświęcona temu problemowi.

Przycinanie gradientowe  — przycinanie gradientów parametrów podczas propagacji wstecznej przy wartości maksymalnej lub normie krańcowej. Przydatne do rozwiązywania problemów z eksplodującymi gradientami, które możesz napotkać w punkcie trzecim.

Normalizacja wsadowa - służy do normalizacji danych wejściowych każdej warstwy, co rozwiązuje problem wewnętrznego przesunięcia współzmiennych. Jeśli używasz jednocześnie Dropout i Batch Norma, sprawdź ten artykuł.

Zejście w gradiencie stochastycznym (SGD) — istnieje kilka odmian SGD, które wykorzystują dynamikę, adaptacyjne współczynniki uczenia się i metodę Niestierowa. Żaden z nich nie ma jednak wyraźnej przewagi zarówno pod względem efektywności uczenia się, jak i generalizacji (szczegóły tutaj).

Regularyzacja - ma kluczowe znaczenie przy budowaniu modelu, który można uogólnić, ponieważ dodaje karę za złożoność modelu lub ekstremalne wartości parametrów. Jest to sposób na zmniejszenie wariancji modelu bez znaczącego zwiększania jego odchylenia. Więcej szczegółowe informacje - tutaj.

Aby wszystko ocenić samodzielnie należy wyłączyć regularyzację i samodzielnie sprawdzić gradient utraty danych.

Rezygnacja to kolejna metoda usprawnienia sieci w celu zapobiegania zatorom. Podczas treningu dropout następuje jedynie poprzez utrzymanie aktywności neuronu z pewnym prawdopodobieństwem p (hiperparametr) lub ustawienie go na zero w odwrotnym przypadku. W rezultacie sieć musi używać innego podzbioru parametrów dla każdej partii szkoleniowej, co ogranicza zmiany niektórych parametrów, które stają się dominujące.

Ważne: Jeśli używasz zarówno normalizacji porzucania, jak i normalizacji wsadowej, zachowaj ostrożność co do kolejności tych operacji, a nawet używaj ich razem. Wszystko to jest nadal aktywnie omawiane i uzupełniane. Oto dwie ważne dyskusje na ten temat na Stackoverflow и ArXiv.

Kontrola pracy

Chodzi o dokumentowanie przepływów pracy i eksperymentów. Jeśli niczego nie dokumentujesz, możesz na przykład zapomnieć, jakie tempo uczenia się lub wagi klas są stosowane. Dzięki sterowaniu możesz łatwo przeglądać i odtwarzać poprzednie eksperymenty. Pozwala to zmniejszyć liczbę duplikatów eksperymentów.

Ręczna dokumentacja może jednak stać się trudnym zadaniem w przypadku dużego nakładu pracy. Tutaj z pomocą przychodzą narzędzia takie jak Comet.ml, które pomagają automatycznie rejestrować zbiory danych, zmiany w kodzie, historię eksperymentów i modele produkcyjne, w tym kluczowe informacje o modelu (hiperparametry, metryki wydajności modelu i informacje środowiskowe).

Sieć neuronowa może być bardzo wrażliwa na niewielkie zmiany, co będzie prowadzić do spadku wydajności modelu. Śledzenie i dokumentowanie swojej pracy to pierwszy krok, jaki możesz podjąć, aby ujednolicić swoje środowisko i modelowanie.

Praca z sieciami neuronowymi: lista kontrolna do debugowania

Mam nadzieję, że ten post będzie punktem wyjścia do rozpoczęcia debugowania sieci neuronowej.

Skillbox poleca:

Źródło: www.habr.com

Dodaj komentarz