Często czytam, że w przypadku modeli Deep Learning zwykłą praktyką jest stosowanie mini-partii (zazwyczaj małej, 32/64) w kilku epokach treningowych. Naprawdę nie mogę pojąć przyczyny tego.
O ile się nie mylę, wielkość partii to liczba instancji treningowych widocznych przez model podczas iteracji treningu; a epoka jest pełną turą, gdy model widzi każdą z instancji treningowych. Jeśli tak, nie widzę przewagi iteracji nad prawie nieznacznym podzbiorem instancji treningowych kilka razy, w przeciwieństwie do zastosowania „maksymalnej partii” poprzez udostępnienie modelu wszystkich dostępnych instancji treningowych w każdej turze (zakładając, oczywiście, wystarczającą ilość pamięć). Jaka jest zaleta tego podejścia?
machine-learning
deep-learning
Hendrik
źródło
źródło
Odpowiedzi:
Kluczowa zaleta korzystania z minibatcha w przeciwieństwie do pełnego zestawu danych sięga fundamentalnej idei stochastycznego spadku 1 .
W gradiencie wsadowym obliczasz gradient w całym zbiorze danych, uśredniając potencjalnie ogromną ilość informacji. Aby to zrobić, potrzeba dużo pamięci. Ale prawdziwym utrudnieniem jest trajektoria gradientu partii, która ląduje w złym miejscu (punkt siodłowy).
Z drugiej strony w czystym SGD aktualizujesz parametry, dodając (znak minus) gradient obliczony na pojedynczej instancji zestawu danych. Ponieważ jest oparty na jednym losowym punkcie danych, jest bardzo głośny i może odejść w kierunku dalekim od gradientu partii. Jednak hałas jest dokładnie tym, czego chcesz w optymalizacji niewypukłej, ponieważ pomaga ci uciec od punktów siodłowych lub lokalnych minimów (Twierdzenie 6 w [2]). Wadą jest to, że jest wyjątkowo nieefektywne i trzeba znaleźć wiele zestawów danych w pętli, aby znaleźć dobre rozwiązanie.
Metodologia minibatch jest kompromisem, który wprowadza wystarczającą ilość hałasu do każdej aktualizacji gradientu, jednocześnie osiągając względnie szybką zbieżność.
1 Bottou, L. (2010). Uczenie maszynowe na dużą skalę ze stochastycznym spadkiem gradientu. W Proceedings of COMPSTAT'2010 (s. 177-186). Physica-Verlag HD.
[2] Ge, R., Huang, F., Jin, C. i Yuan, Y. (2015, June). Ucieczka od punktów siodłowych - stochastyczny gradient online dla rozkładu tensora. W COLT (str. 797-842).
EDYTOWAĆ :
Właśnie widziałem ten komentarz na Facebooku Yanna LeCuna, który daje świeże spojrzenie na to pytanie (przepraszam, nie wiem jak połączyć z fb.)
Zacytował ten artykuł, który właśnie został opublikowany na arXiv kilka dni temu (kwiecień 2018 r.), Który warto przeczytać,
Dominic Masters, Carlo Luschi, Ponowne szkolenie dla małych partii dla głębokich sieci neuronowych , arXiv: 1804.07612v1
Z abstrakcji
źródło
Pamięć nie jest tak naprawdę powodem tego, ponieważ można po prostu gromadzić gradienty podczas iteracji zestawu danych i stosować je na końcu, ale nadal w SGD stosuje się je na każdym etapie.
Powody, dla których SGD jest tak szeroko stosowane, to:
1) Wydajność. Zazwyczaj, szczególnie na początku szkolenia, gradienty parametrów dla różnych podzbiorów danych będą miały tendencję do wskazywania w tym samym kierunku. Tak więc gradienty oceniane na 1/100 danych będą z grubsza wskazywać w tym samym ogólnym kierunku, co w pełnym zbiorze danych, ale wymagają tylko 1/100 obliczeń. Ponieważ konwergencja w wysoce nieliniowej głębokiej sieci zwykle wymaga tysięcy lub milionów iteracji bez względu na to, jak dobre są twoje gradienty, sensowne jest wykonanie wielu aktualizacji na podstawie tanich oszacowań gradientu, a nie kilku aktualizacji na podstawie tych dobrych.
2) Optymalizacja: hałaśliwe aktualizacje mogą pozwolić ci odskoczyć od złych lokalnych optymów (chociaż nie mam źródła, które pokazuje, że to ma znaczenie w praktyce).
3) Uogólnienie. Wydaje się (patrz Zhang i in .: Teoria głębokiego uczenia się III: Właściwości uogólniające SGD ), że SGD faktycznie pomaga uogólnieniu, znajdując „płaskie” minima na zestawie szkoleniowym, które częściej są również minima na zestawie testowym. Intuicyjnie możemy myśleć o SGD jako o rodzaju workowania - obliczając nasze parametry w oparciu o wiele minibatch danych, wzmacniamy reguły uogólniające się w minibatchach i anulujemy reguły, które tego nie robią, przez co jesteśmy mniej podatni na nadmierne dopasowanie do zestaw treningowy.
źródło
Prawidłowo (chociaż nazwałbym to „krokiem aktualizacji wagi”)
Poprawny
Cóż, właściwie to. Zwykle nie masz wystarczającej ilości pamięci. Powiedzmy, że mówimy o klasyfikacji obrazów. ImageNet to niezwykle popularny zestaw danych. Przez długi czas VGG-16D był jednym z najpopularniejszych modeli. Wymaga obliczenia 15 245 800 liczb zmiennoprzecinkowych (na mapach obiektów) dla jednego obrazu 224 x 224. Oznacza to około 61 MB na obraz. Jest to tylko przybliżona dolna granica ilości pamięci potrzebnej podczas treningu dla każdego obrazu. ImageNet zawiera kilka tysięcy (około 1,2 miliona?) Obrazów. Chociaż możesz mieć tak dużo pamięci głównej, na pewno nie masz tyle pamięci GPU. Widziałem, jak GPU przyspiesza rzeczy do około 21x. Więc na pewno chcesz użyć GPU.
Ponadto: czas na jedną mini-partię jest znacznie krótszy. Pytanie brzmi zatem: czy wolałbyś raczej robić n aktualizacji z mini-partią na godzinę na GPU lub m kroków aktualizacji z partią bez GPU, gdzie n >> m.
źródło
Oprócz innych odpowiedzi uważam, że warto zauważyć, że istnieją dwie wielkości, które są różne, ale często połączone:
Jak zauważyli inni, gradient względem minibatchu jest przybliżeniem prawdziwego gradientu. Im większy minibatch, tym lepsze zbliżenie.
Kompromis dotyczy wyłącznie wydajności (pamięci / cykli).
Ilości te są zwykle takie same, tzn. Wielkość minibatchów, ale w zasadzie można je oddzielić.
źródło