Podczas mini-serii treningu sieci neuronowej usłyszałem, że ważną praktyką jest tasowanie danych treningowych przed każdą epoką. Czy ktoś może wyjaśnić, dlaczego pomieszanie w każdej epoce pomaga?
W wyszukiwarce Google znalazłem następujące odpowiedzi:
- pomaga szybko zbiegać się treningowi
- zapobiega to stronniczości podczas treningu
- uniemożliwia modelowi nauczenie się kolejności szkolenia
Mam jednak problem ze zrozumieniem, dlaczego którykolwiek z tych efektów jest spowodowany losowym tasowaniem. Czy ktoś może podać intuicyjne wyjaśnienie?
źródło
Z bardzo uproszczonego punktu widzenia, dane wprowadza się kolejno, co sugeruje, że przynajmniej jest to możliwe na zamówienie Dane mieć wpływ na wyjście. Jeśli kolejność nie ma znaczenia, randomizacja z pewnością nie zaszkodzi. Jeśli kolejność ma znaczenie, randomizacja pomoże wygładzić te losowe efekty, aby nie stały się systematycznym uprzedzeniem. Krótko mówiąc, randomizacja jest tania i nigdy nie boli i często minimalizuje efekty porządkowania danych.
źródło
Uwaga: w tej odpowiedzi odnoszę się do minimalizacji utraty treningu i nie omawiam kryteriów zatrzymania, takich jak utrata potwierdzenia. Wybór kryteriów zatrzymania nie wpływa na proces / koncepcje opisane poniżej.
Proces uczenia sieci neuronowej polega na znalezieniu minimalnej wartości funkcji utraty , gdzie reprezentuje macierz (lub kilka macierzy) wag między neuronami, a reprezentuje zbiór danych treningowych. Używam indeksu dolnego dla aby wskazać, że nasze minimalizowanie występuje tylko powyżej wag (to znaczy szukamy tak, że jest zminimalizowane), gdy jest ustalony.LX(W) W X X L W W L X
Teraz, jeśli założymy, że mamy elementów w (to znaczy, że wagami w sieci), jest powierzchnią w przestrzeni wymiarowej . Aby dać wizualny analog, wyobraź sobie, że mamy tylko dwie masy neuronów ( ). Zatem ma łatwą interpretację geometryczną: jest powierzchnią w przestrzeni trójwymiarowej. Wynika to z faktu, że dla dowolnej macierzy wag funkcję straty można oszacować na a wartość ta staje się rzędną powierzchni.P W P L P+1 P=2 L W X
Ale istnieje problem niewypukłości; opisana przeze mnie powierzchnia będzie miała wiele lokalnych minimów, a zatem algorytmy opadania gradientu są podatne na utknięcie w tych minimach, podczas gdy w pobliżu może znajdować się głębsze / niższe / lepsze rozwiązanie. Jest to prawdopodobne, jeśli pozostaje niezmieniony we wszystkich iteracjach treningowych, ponieważ powierzchnia jest ustalona dla danego ; wszystkie jego funkcje są statyczne, w tym różne minima.X X
Rozwiązaniem tego jest trening mini-partyjny połączony z tasowaniem. Przesuwając rzędy i trenując tylko ich podzbiór podczas danej iteracji, zmienia się z każdą iteracją i jest całkiem możliwe, że nie zostaną wykonane dwie iteracje w całej sekwencji iteracji treningowych i epok dokładnie na tym samym . W rezultacie solver może łatwo „odbić” się od lokalnego minimum. Wyobraź sobie, że solver utknął w lokalnym minimum podczas iteracji podczas szkolenia mini-partii . To lokalne minimum odpowiada ocenianemu przy określonej wartości wag; nazwiemy toX X i Xi L LXi(Wi) . W następnej iteracji kształt naszej powierzchni faktycznie się zmienia, ponieważ używamy , to znaczy, że może przyjąć inną wartość niż i jest całkiem możliwe, że nie odpowiada to lokalnemu minimum! Możemy teraz obliczyć aktualizację gradientu i kontynuować trening. Dla jasności: kształt będzie - ogólnie - różnił się od . Zauważ, że mam tu na myśli funkcję straty ocenianą na zestawie treningowym ; jest to kompletna powierzchnia zdefiniowana dla wszystkich możliwych wartościXi+1 LXi+1(Wi) LXi(Wi) LXi+1 LXi L X W Zamiast oceny tej straty (która jest skalar) o wartości określonej w . Należy również zauważyć, że jeśli mini-partie są używane bez tasowania, nadal istnieje pewien stopień „dywersyfikacji” powierzchni strat, ale będzie ograniczona (i stosunkowo niewielka) liczba unikalnych powierzchni błędów widocznych przez solver (konkretnie, zobaczy to ten sam dokładny zestaw mini-partii - i dlatego straty powierzchni - podczas każdej epoki).W
Jedną rzeczą, której celowo unikałem, była dyskusja na temat wielkości mini-partii, ponieważ istnieje na ten temat milion opinii i ma to znaczące implikacje praktyczne (większą równoległość można osiągnąć przy większych partiach). Uważam jednak, że warto wspomnieć o następujących kwestiach. Ponieważ jest obliczane przez obliczenie wartości dla każdego wiersza (i zsumowanie lub pobranie średniej; tj. Operatora przemiennego) dla danego zestawu macierzy wag , układ rzędów nie ma wpływu przy zastosowaniu pełnego- opadanie gradientu partii (to znaczy, gdy każda partia ma pełny , a iteracje i epoki są takie same).L X W X X
źródło
Wyobraź sobie, że kilka ostatnich etykiet minibatchów rzeczywiście ma więcej hałasu. Następnie te partie pociągną ostateczne wyuczone ciężary w złym kierunku. Jeśli za każdym razem tasujesz, szanse na to, że kilka ostatnich partii będzie nieproporcjonalnie głośne, spada.
źródło
Gdy trenujesz swoją sieć przy użyciu stałego zestawu danych, co oznacza dane, których nigdy nie tasujesz podczas treningu. Jest bardzo prawdopodobne, że otrzymasz ciężarki, które są bardzo wysokie i bardzo niskie, takie jak 40,70, -101,200 ... itd. Oznacza to po prostu, że twoja sieć nie nauczyła się danych treningowych, ale nauczyła się szumu danych treningowych. Klasyczna obudowa modelu typu overfit. Dzięki takiej sieci zobaczysz prognozy dotyczące danych, które wykorzystałeś do treningu. Jeśli użyjesz innych danych do przetestowania, Twój model rozpadnie się. Teraz, kiedy tasujesz dane treningowe po każdej epoce (iteracja całego zestawu), po prostu dodajesz różne dane wejściowe do neuronów w każdej epoce, a to po prostu reguluje wagi, co oznacza, że bardziej prawdopodobne jest uzyskanie „niższych” ciężarów, które są bliższe zeru , a to oznacza, że Twoja sieć może dokonywać lepszych uogólnień.
Mam nadzieję, że to było jasne.
źródło
Oto bardziej intuicyjne wyjaśnienie:
Podczas korzystania z opadania gradientu chcemy, aby strata została zmniejszona w kierunku gradientu. Gradient oblicza się na podstawie danych z jednej mini-partii dla każdej rundy aktualizacji masy. Chcemy, aby ten mini-okresowy gradient był w przybliżeniu gradientem populacji, ponieważ oczekuje się, że spowoduje to szybszą konwergencję. (Wyobraź sobie, że podajesz do sieci 100 danych klasy 1 w jednej mini-partii, a 100 danych klasy 2 w innej, sieć będzie się unosić. Lepszym sposobem jest karmienie go 50 klasami 1 + 50 klasy 2 w każdej mini-partii.)
Jak to osiągnąć, skoro nie możemy wykorzystać danych o populacji w mini-partii? Sztuka statystyki mówi nam: przetasuj populację, a pierwsze fragmenty danych batch_size mogą reprezentować populację. Dlatego musimy przetasować ludność.
Muszę powiedzieć, że tasowanie nie jest konieczne, jeśli masz inną metodę próbkowania danych z populacji i upewnienia się, że próbki mogą generować rozsądny gradient.
To jest moje zrozumienie. Mam nadzieję, że to pomoże.
źródło