Czy batch_size w Keras ma jakikolwiek wpływ na jakość wyników?

38

Mam zamiar wytrenować dużą sieć LSTM z 2-3 milionami artykułów i walczę z błędami pamięci (używam AWS EC2 g2x2large).

Dowiedziałem się, że jednym z rozwiązań jest zmniejszenie batch_size. Nie jestem jednak pewien, czy ten parametr dotyczy tylko problemów z wydajnością pamięci lub czy wpłynie to na moje wyniki. W rzeczywistości zauważyłem również, że batch_sizew przykładach zwykle stosuje się potęgę dwóch, czego też nie rozumiem.

Nie przeszkadza mi, że trenowanie mojej sieci trwa dłużej, ale chciałbym wiedzieć, czy obniżenie batch_sizejakości obniży jakość moich prognoz.

Dzięki.

hipoglucido
źródło
To pytanie nie jest specyficzne dla keras. Myślę, że ogólną konsekwencją jest to, że mniejsze wielkości próbek zbiegają się wolniej, ale są mniej podatne na utknięcie w lokalnych minimach
Alex
Widziałem przypadki, w których zbyt duży rozmiar partii może zapobiec konwergencji nawet przy takiej samej liczbie epok treningowych.
Curtis White,

Odpowiedzi:

43

Po półtora roku wracam do mojej odpowiedzi, ponieważ moja poprzednia odpowiedź była błędna.

Wielkość partii ma znaczący wpływ na naukę. Po przełożeniu partii przez sieć następuje uśrednienie gradientów. Pomysł polega na tym, że jeśli rozmiar partii jest wystarczająco duży, zapewni to wystarczająco stabilne oszacowanie gradientu pełnego zestawu danych. Pobierając próbki ze zbioru danych, oceniasz gradient, jednocześnie znacznie obniżając koszty obliczeniowe. Im niżej zejdziesz, tym mniej dokładne będzie twoje oszacowanie, jednak w niektórych przypadkach te głośne gradienty mogą pomóc uniknąć lokalnych minimów. Gdy jest zbyt niska, waga sieci może po prostu przeskakiwać, jeśli dane są hałaśliwe i może nie być w stanie się uczyć lub zbiega się bardzo powoli, co negatywnie wpływa na całkowity czas obliczeń.

Kolejną zaletą przetwarzania wsadowego jest obliczanie GPU, procesory graficzne są bardzo dobre w równoległym wykonywaniu obliczeń w sieciach neuronowych, jeśli część obliczeń jest taka sama (na przykład powtarzane mnożenie macierzy przez tę samą macierz wagową twojej sieci). Oznacza to, że wielkość partii 16 zajmie mniej niż dwukrotność wielkości partii 8.

W przypadku, gdy potrzebujesz większych rozmiarów partii, ale nie zmieści się ona na twoim GPU, możesz nakarmić małą partię, zapisać szacunkowe gradienty i nakarmić jedną lub więcej partii, a następnie wykonać aktualizację wagi. W ten sposób uzyskasz bardziej stabilny gradient, ponieważ zwiększyłeś swój wirtualny rozmiar partii.

ŹLE, STARA ODPOWIEDŹ: [[[Nie, rozmiar partii średnio wpływa tylko na szybkość uczenia się, a nie na jakość uczenia się. Batch_sizes również nie musi być potęgami 2, chociaż rozumiem, że niektóre pakiety pozwalają tylko na potęgi 2. Powinieneś spróbować uzyskać swój batch_size możliwie najwyższy, który wciąż mieści się w pamięci twojego GPU, aby uzyskać maksymalną możliwą prędkość .]]]]

Jan van der Vegt
źródło
Nie stać mnie na 32, ale mogę sobie pozwolić na 16. Jednak zauważyłem, że jest za wolny. Czy uważasz, że powinienem wypróbować wartości z przedziału 16–32 lub trzymać się wartości 16?
hipoglucido
Postaram się wyliczyć niektóre wartości. Każda epoka powinna być mniej więcej w tym samym czasie, aby nie trwało to długo. Spróbuj 17, aby zobaczyć, czy jest to szybsze czy wolniejsze, ponieważ mnie to interesuje, biorąc pod uwagę, że ta moc 2 zależy od GPU i / lub backendu Keras. Ale myślę, że wypełnienie go po brzegi jest prawdopodobnie najlepsze
Jan van der Vegt
9
Czy jesteś pewien, że wielkość partii nie wpływa na jakość uczenia się? Pamiętam, jak czytałem kilka blogów / artykułów (?), W których powiedziano, że mniejsze partie wytwarzają głośniejsze gradienty niż większe, ale hałas może być użyteczny, aby wydostać się z lokalnych minimów. Nie jestem jednak pewien, czy / jak dotyczy to LSTM.
stmax
Nie do końca przekonany, sam nie miałem wystarczającego doświadczenia, ale to właśnie przeczytałem. Widzę, że gradienty są mniej stabilne, więc mogę być wyłączony.
Jan van der Vegt
2
Półtora roku później i teraz o wiele bardziej kompetentny i zgadzam się.
Zmienię
11

Uważam, że zaakceptowana odpowiedź jest prawdopodobnie błędna. Istnieją warianty w algorytmach spadku gradientu .

  1. Zanikanie gradientu waniliowego : Tutaj oblicza się gradient na wszystkich punktach danych na jednym zdjęciu i przyjmuje się średnią. Dlatego mamy płynniejszą wersję gradientu, której nauka zajmuje więcej czasu.

  2. Stochastyczne zejście gradientu : tutaj jeden punkt danych na raz, stąd gradient jest agresywny (hałaśliwe gradienty), stąd będzie dużo oscylacji (używamy parametrów Momentum - np. Nesterov do kontrolowania tego). Jest więc szansa, że ​​twoje oscylacje mogą sprawić, że algorytm nie osiągnie lokalnego minimum (rozbieżność).

  3. Mini-Batch Gradient Descent : który bierze zalety obu poprzednich uśrednia gradienty małej partii. Dlatego nie jest zbyt agresywny jak SGD i pozwala na naukę online, czego nigdy nie pozwalał Vanilla GD.

Im mniejsza Mini-Batch, tym lepsza byłaby wydajność twojego modelu (nie zawsze) i oczywiście ma to związek z zbyt szybkim uczeniem się epok. Jeśli trenujesz na dużym zbiorze danych, potrzebujesz szybszej konwergencji z dobrą wydajnością, dlatego wybieramy Batch-GD.

SGD ma ustalony parametr uczenia, dlatego uruchamiamy inne Adaptacyjne Optymalizatory, takie jak Adam, AdaDelta, RMS Prop itp., Które zmieniają parametr uczenia na podstawie historii Gradientów.

Jil Jung Juk
źródło
3) zwykle nazywa się minibatch
Alex
@Alex: dodano zmianę.
Jil Jung Juk,
1
Zgadzam się, że nie ma reguły dotyczącej parametru wielkości partii. Ale to stwierdzenie - „Im mniejsza partia, tym lepsza byłaby wydajność twojego modelu” - jest sprzeczne z ogólną zasadą. Na ogół chcesz zmaksymalizować wielkość partii
MonsieurBeilto
4

Co dziwne, odkryłem, że większe rozmiary partii za pomocą keras wymagają więcej epok do zbiegania się.

Na przykład dane wyjściowe tego skryptu oparte na teście integracji keras to

epochs 15   , batch size 16   , layer type Dense: final loss 0.56, seconds 1.46
epochs 15   , batch size 160  , layer type Dense: final loss 1.27, seconds 0.30
epochs 150  , batch size 160  , layer type Dense: final loss 0.55, seconds 1.74

Związane z

Użycie zbyt dużej wielkości partii może mieć negatywny wpływ na dokładność sieci podczas treningu, ponieważ zmniejsza stochastyczność spadku gradientu.

Większość czasu, zwiększając edytuj batch_sizepożądane jest, aby przyspieszyć obliczenia, ale istnieją inne prostszych sposobów, aby to zrobić, jak przy użyciu typów danych mniejszym ślad za pośrednictwem dtypeargumentu, czy to w Keras lub tensorflow , np float32zamiastfloat64

Shadi
źródło
Przy większych partiach (a więc i mniej na epokę) będziesz mieć mniej aktualizacji gradientu na epokę. „epoka” to tylko żargon ML dla „jednego przejścia danych podczas treningu”. Jeśli próbujesz przyspieszyć trening, zmierz czas ściany i ignoruj ​​epoki.
Andrew Wagner