Kiedy trenujesz sieć neuronową, jaką różnicę ma ustawienie:
- Wielkość partii z i liczby iteracjib
- w porównaniu do wielkości partii do i liczby iteracji dod
gdzie ?
Innymi słowy, zakładając, że trenujemy sieć neuronową z taką samą liczbą przykładów szkoleniowych, jak ustawić optymalny rozmiar partii i liczbę iteracji? (gdzie wielkość partii * liczba iteracji = liczba przykładów treningu pokazanych sieci neuronowej, przy czym ten sam przykład szkolenia potencjalnie pokazano kilka razy)
Zdaję sobie sprawę, że im większy rozmiar partii, tym więcej potrzebnej pamięci, co często przyspiesza obliczenia. Ale jaka to różnica pod względem wydajności wyszkolonej sieci?
neural-networks
train
Franck Dernoncourt
źródło
źródło
Odpowiedzi:
Od Nitish Shirish Keskar, Dheevatsa Mudigere, Jorge Nocedal, Mikhail Smelyanskiy, Ping Tak Peter Tang. Szkolenie dla dużych partii w zakresie głębokiego uczenia się: luka uogólniająca i ostre minima. https://arxiv.org/abs/1609.04836 :
Ponadto, kilka dobrych spostrzeżeń od Iana Goodfellow'a, odpowiadających na pytanie, dlaczego nie używać całego zestawu treningowego do obliczania gradientu? na Quora:
Powiązane: Opadanie gradientem wsadowym a stochastyczne obniżanie gradientu
źródło
Zakładam, że mówisz o zmniejszeniu wielkości partii w algorytmie stochastycznego gradientu mini wsadu i porównaniu go do większych partii, wymagających mniejszej liczby iteracji.
Andrew Ng. zapewnia dobrą dyskusję na temat tego i niektórych elementów wizualnych w swojej klasie online na temat ML i sieci neuronowych. Tak więc reszta tego postu jest głównie regurgitacją jego nauk z tej klasy.
Weźmy dwie skrajności, z jednej strony każdy krok spadku gradientu wykorzystuje cały zestaw danych. Obliczasz gradienty dla każdej próbki. W takim przypadku znasz dokładnie to, co najlepsze bezpośrednio w lokalnym minimum. Nie marnujesz czasu na pójście w złym kierunku. Jeśli chodzi o liczby stopni spadku gradientu, dostaniesz się tam jak najmniej.
Oczywiście obliczanie gradientu dla całego zestawu danych jest kosztowne. Teraz przechodzimy do drugiej skrajności. Wielkość partii to zaledwie 1 próbka. W takim przypadku gradient tej próbki może poprowadzić Cię całkowicie w złym kierunku. Ale hej, koszt obliczenia jednego gradientu był dość trywialny. Gdy robisz kroki w odniesieniu do tylko jednej próbki, „wędrujesz” trochę, ale średnio zmierzasz w kierunku równie rozsądnego lokalnego minimum, jak przy pełnym opadaniu gradientu partii.
To może być chwila, by wskazać, że widziałem literaturę sugerującą, że być może to podskakiwanie wokół tego 1-próbnego stochastycznego spadku gradientu może pomóc ci odbić się od lokalnych minimów, których nie można uniknąć w trybie pełnego wsadu, ale jest to dyskusyjne. Niektóre inne dobre odpowiedzi tutaj odnoszą się do tego pytania bardziej bezpośrednio niż ja.
Jeśli chodzi o moc obliczeniową, podczas gdy stochastyczny proces GD z pojedynczą próbką wymaga o wiele więcej iteracji, ostatecznie dostajesz się tam za mniej niż koszt pełnego trybu wsadowego, „zwykle”. Tak to ujmuje Andrew Ng.
Teraz znajdźmy środek, o który pytałeś. Możemy zdać sobie sprawę, że współczesne biblioteki BLAS sprawiają, że matematyka obliczeniowa jest dość wydajna, więc obliczenie 10 lub 100 próbek jednocześnie, zakładając, że poprawnie wektoryzowałeś swój kod, będzie niewiele więcej pracy niż obliczenie 1 próbki (zyskujesz wydajność połączeń pamięciowych, a także sztuczki obliczeniowe wbudowane w najbardziej wydajne biblioteki matematyczne). Uśrednienie dla partii 10, 100, 1000 próbek da gradient, który jest bardziej rozsądnym przybliżeniem prawdziwego gradientu pełnego trybu wsadowego. Dlatego nasze kroki są teraz dokładniejsze, co oznacza, że potrzebujemy mniejszej ich liczby, a ich koszt jest tylko nieznacznie wyższy niż GD dla pojedynczej próbki.
Zoptymalizowanie dokładnego rozmiaru mini-partii, której należy użyć, zasadniczo należy do próby i błędu. Przeprowadź kilka testów na próbce zestawu danych o liczbach od powiedzmy dziesiątek do kilku tysięcy i sprawdź, które zbiegają się najszybciej, a następnie przejdź do tego. Rozmiary partii w tych przedziałach wydają się dość powszechne w literaturze. A jeśli twoje dane naprawdę są IID, to centralne twierdzenie graniczne dotyczące zmienności procesów losowych sugerowałoby również, że te zakresy są rozsądnym przybliżeniem pełnego gradientu.
Decyzja o tym, kiedy zatrzymać iterację, jest zwykle podejmowana przez monitorowanie błędu generalizacji w stosunku do nieprzeszkolonego zestawu walidacyjnego i wybranie punktu, w którym błąd walidacji znajduje się w najniższym punkcie. Trening dla zbyt wielu iteracji ostatecznie doprowadzi do przeregulowania, w którym to momencie twój błąd w zestawie sprawdzania poprawności zacznie się wznosić. Gdy zobaczysz, że dzieje się to, wykonaj kopię zapasową i zatrzymaj się w optymalnym punkcie.
źródło
TL; DR: Zbyt duży rozmiar mini-partii zwykle prowadzi do niższej dokładności!
Dla zainteresowanych, oto wyjaśnienie.
Istnieją dwa pojęcia prędkości:
Szybkość obliczeniowa to po prostu szybkość wykonywania obliczeń numerycznych w sprzęcie. Jak powiedziałeś, zwykle jest większy przy większym rozmiarze mini-partii. Jest tak, ponieważ biblioteki algebry liniowej używają wektoryzacji dla operacji wektorowych i macierzowych, aby je przyspieszyć, kosztem wykorzystania większej ilości pamięci. Zyski mogą być znaczące do pewnego momentu. Z mojego doświadczenia wynika, że istnieje pewien moment, w którym prędkość jest minimalna. Punkt zależy od zestawu danych, sprzętu i biblioteki używanej do obliczeń numerycznych (pod maską).
Ale nie zapominajmy, że istnieje również inne pojęcie prędkości, które mówi nam, jak szybko nasz algorytm się zbiega.
Po pierwsze, co to znaczy, że nasz algorytm jest zbieżny? Cóż, od nas zależy, czy zadecydujemy, kiedy jesteśmy zadowoleni z dokładności lub błędu, który otrzymujemy, obliczonego na podstawie zestawu sprawdzania poprawności. Możemy albo zdefiniować go z wyprzedzeniem i poczekać, aż algorytm dojdzie do tego punktu, lub możemy monitorować proces szkolenia i zdecydować o jego zatrzymaniu, gdy błąd sprawdzania poprawności zacznie znacznie rosnąć (model zaczyna przeważać nad zestawem danych). Naprawdę nie powinniśmy go od razu zatrzymywać, w pierwszej chwili błąd zaczyna rosnąć, jeśli pracujemy z mini partiami, ponieważ używamy Stochastic Gradient Descent, SGD. W przypadku (pełnej partii) opadania gradientu, po każdej epoce algorytm ustabilizuje się co najmniej, czy to lokalny, czy globalny. SGD nigdy tak naprawdę nie ustala się na minimum. Oscyluje wokół niego. To może trwać w nieskończoność,
Teraz, po całej tej teorii, istnieje „haczyk”, na który musimy zwrócić uwagę. Przy stosowaniu mniejszej wielkości partii obliczenie błędu powoduje większy hałas niż w przypadku użycia większej wielkości partii. Ktoś powiedziałby, że to źle, prawda? Chodzi o to, że szum może pomóc algorytmowi wyskoczyć ze złego lokalnego minimum i mieć większą szansę na znalezienie albo lepszego lokalnego minimum, albo, mam nadzieję, globalnego minimum.
Jeśli więc możemy szybciej znaleźć lepsze rozwiązanie, używając mniejszego partii zamiast większej, tylko dzięki „niechcianemu” hałasowi, możemy wyregulować całkowity czas potrzebny naszemu algorytmowi na znalezienie zadowalającego rozwiązanie i większa dokładność.
Chcę powiedzieć, że dla danej dokładności (lub błędu) mniejsza wielkość partii może prowadzić do krótszego całkowitego czasu szkolenia, nie dłużej, jak wielu uważa.
Lub, jeśli zdecydujemy się zachować taki sam czas treningu jak poprzednio, możemy uzyskać nieco wyższą dokładność przy mniejszym rozmiarze partii, i najprawdopodobniej zrobimy to, zwłaszcza jeśli odpowiednio wybraliśmy nasz wskaźnik uczenia się.
Jeśli masz czas, sprawdź ten artykuł: Systematyczna ocena postępów CNN w ImageNet Zwłaszcza sprawdź „3.7. Wielkość partii i szybkość uczenia się” oraz Rysunek 8. , że duże rozmiary mini-partii prowadzą do gorszej dokładności , nawet jeśli dostosujesz tempo uczenia się do heurystyki.
Zasadniczo wielkość partii 32 jest dobrym punktem wyjścia i powinieneś również spróbować 64, 128 i 256. Inne wartości (niższe lub wyższe) mogą być odpowiednie dla niektórych zestawów danych, ale podany zakres jest na ogół najlepszy do zacznij eksperymentować z. Jednak poniżej 32 roku życia może stać się zbyt wolny z powodu znacznie niższej prędkości obliczeniowej, z powodu niepełnego wykorzystania wektoryzacji. Jeśli pojawi się błąd „brak pamięci”, i tak spróbuj zmniejszyć rozmiar mini-partii.
Nie chodzi więc tylko o użycie największego możliwego rozmiaru mini-partii, który pasuje do pamięci.
Podsumowując i odpowiadając na twoje pytanie, mniejszy rozmiar mini-partii (niezbyt mały) zwykle prowadzi nie tylko do mniejszej liczby iteracji algorytmu szkoleniowego, niż do dużej wielkości partii, ale także do ogólnej wyższej dokładności, tj. sieć neuronowa, która działa lepiej, przy takim samym czasie szkolenia lub mniej.
Nie zapominaj, że wyższy hałas może pomóc mu wyskoczyć ze złego lokalnego minimum, zamiast pozostawić go w utknięciu.
źródło
Dodaję inną odpowiedź do tego pytania, aby odnieść się do nowego (konferencyjnego) ICLR (2018) od Google, który prawie bezpośrednio odnosi się do tego pytania.
Tytuł: Nie zmniejszaj współczynnika uczenia się, zwiększ wielkość partii
https://arxiv.org/abs/1711.00489
Skopiowano streszczenie z powyższej pracy:
źródło
Pokazuję tutaj pewne doświadczenia empiryczne . Zrobiłem eksperyment z rozmiarem partii 4 i rozmiarem partii 4096. Rozmiar 4096 robi 1024 razy mniej propagacji wstecznych. Moją intuicją jest to, że większe partie wykonują mniej i bardziej zgrubne etapy poszukiwania optymalnego rozwiązania, a zatem mniej prawdopodobne jest, że dzięki konstruowaniu optymalne rozwiązanie będzie zbieżne.
źródło