W zadaniach uczenia maszynowego często tasuje się dane i normalizuje je. Cel normalizacji jest jasny (dla tego samego zakresu wartości cech). Ale po wielu zmaganiach nie znalazłem żadnego cennego powodu do przetasowania danych.
Przeczytałem tutaj ten post omawiający, kiedy musimy tasować dane, ale nie jest oczywiste, dlaczego powinniśmy tasować dane. Ponadto często widywałem w algorytmach takich jak Adam lub SGD, gdzie potrzebujemy spadku gradientu wsadowego (dane powinny być rozdzielone na mini-partie i należy podać rozmiar partii). Zgodnie z tym postem istotne jest tasowanie danych dla każdej epoki, aby mieć różne dane dla każdej partii. Być może dane są tasowane i, co ważniejsze, zmieniane.
Dlaczego to robimy?
machine-learning
neural-network
deep-learning
Głoska bezdźwięczna
źródło
źródło
Odpowiedzi:
Na podstawie tego, co powinniśmy zrobić, gdy pytanie zadane na DataScience jest duplikatem pytania zadanego na CrossValidated? , Ponownie publikuję odpowiedź na to samo pytanie zadane w CrossValidated ( https://stats.stackexchange.com/a/311318/89653 ).
Uwaga: w tej odpowiedzi odnoszę się do minimalizacji strat treningowych i nie omawiam kryteriów zatrzymania, takich jak utrata walidacji. 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 to powierzchnia w trójwymiarowej przestrzeni. 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. Przetasowują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. Żeby było jasne: 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 pełna 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 przyjęcie ś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
Tasowanie danych służy zmniejszeniu wariancji i upewnieniu się, że modele pozostają ogólne i mniej się przeładowują.
Oczywistym przypadkiem przetasowania danych jest posortowanie danych według ich klasy / celu. Tutaj będziesz chciał przetasować, aby upewnić się, że twoje zestawy treningowe / testowe / walidacyjne są reprezentatywne dla ogólnego rozkładu danych.
Do opadania gradientem partii obowiązuje ta sama logika. Idea opadania gradientu wsadowego polega na tym, że obliczając gradient na pojedynczej partii, zwykle uzyskuje się dość dobre oszacowanie „prawdziwego” gradientu. W ten sposób oszczędzasz czas obliczeń, nie musisz za każdym razem obliczać „prawdziwego” gradientu dla całego zestawu danych.
Chcesz przetasować swoje dane po każdej epoce, ponieważ zawsze będziesz mieć ryzyko tworzenia partii, które nie są reprezentatywne dla całego zestawu danych, a zatem twoje oszacowanie gradientu będzie wyłączone. Przetasowanie danych po każdej epoce gwarantuje, że nie utkniesz w zbyt wielu niepoprawnych partiach.
Podczas regularnego stochastycznego spadku, gdy każda partia ma rozmiar 1, nadal chcesz tasować dane po każdej epoce, aby utrzymać ogólną naukę. Rzeczywiście, jeśli punkt danych 17 jest zawsze używany po punkcie danych 16, jego własny gradient będzie tendencyjny przy wszelkich aktualizacjach danych, które punkt 16 wprowadza w modelu. Przetasowując dane, upewniasz się, że każdy punkt danych tworzy „niezależną” zmianę w modelu, bez uprzedzeń przez te same punkty przed nimi.
źródło
Załóżmy, że dane są sortowane w określonej kolejności. Na przykład zestaw danych sortowany na podstawie klasy. Tak więc, jeśli wybierzesz dane do szkolenia, walidacji i testu bez uwzględnienia tego tematu, wybierzesz każdą klasę do różnych zadań, a proces się nie powiedzie.
Dlatego, aby zapobiec tego rodzaju problemom, prostym rozwiązaniem jest tasowanie danych w celu uzyskania różnych zestawów danych szkoleniowych, walidacyjnych i testowych.
O mini-partii odpowiedzi na ten post mogą być rozwiązaniem twojego pytania.
źródło
Musimy tasować tylko dla minibatch / SGD, bez potrzeby opadania gradientu partii.
Jeśli dane nie są tasowane, dane mogą być sortowane lub podobne punkty danych będą znajdować się obok siebie, co prowadzi do powolnej konwergencji:
I zwrócił wykres funkcji strat L-2 regresji liniowej dla
y=2x
tutajźródło
Uzupełniając odpowiedź @ Josha, chciałbym dodać, że z tego samego powodu należy tasować przed partiami. W przeciwnym razie otrzymujesz tę samą skończoną liczbę powierzchni.
źródło
Aby uzyskać najlepszą dokładność modelu, zawsze zaleca się, aby dane treningowe zawierały wszystkie rodzaje danych.
Przetasowywanie danych szkoleniowych pomaga nam w osiągnięciu tego celu.
źródło
Przesuwając wiersze 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 w tym samym 𝑋
źródło