06 · Sieci · 4 min czytania · aktualizacja
Czym jest batch size i jak wpływa na trening sieci neuronowej?
W skrócie
Mini-batch to porcja przykładów, na której liczy się jeden gradient i robi jeden krok. Mały batch daje szumny, częsty krok; duży gładki, ale rzadszy i droższy.
Co to jest
Mini-batch to podzbiór przykładów treningowych (zwykle od kilkunastu do kilku tysięcy), na którym liczy się średni gradient straty i wykonuje jeden krok aktualizacji wag. Rozmiar batcha (batch size) to hiperparametr między dwiema skrajnościami: batch = 1 (stochastyczny spadek gradientu w pierwotnym sensie) i batch = cały zbiór (pełny spadek gradientu).
Mini-batche stosuje się we wszystkich sieciach neuronowych i dużych modelach językowych; w boostingu drzew odpowiednikiem jest podpróbkowanie wierszy (subsample).
Intuicja: sondaż. Pytając jedną osobę, dostajesz szybką, ale bardzo niepewną odpowiedź. Pytając cały kraj — dokładną, ale po roku. Sondaż na tysiącu osób daje odpowiedź „wystarczająco dobrą” na tyle szybko, że można jej użyć i zapytać znowu.
Mechanizm — dlaczego tak działa
Gradient z jednego przykładu to głośna wskazówka: mówi, co poprawić dla tego jednego punktu. Gradient uśredniony po B przykładach jest nieobciążonym estymatorem gradientu po całym zbiorze, a jego szum (odchylenie standardowe) maleje jak 1/√B. Czterokrotnie większy batch tłumi szum tylko dwukrotnie — to malejący zysk.
Koszt policzenia gradientu rośnie liniowo z B, ale na GPU do pewnej wielkości batcha czas kroku prawie się nie zmienia (równoległość). Powyżej tego progu większy batch oznacza mniej kroków w tym samym czasie. Ponieważ postęp treningu zależy od liczby kroków, a nie od liczby epok, w ustalonym budżecie epok mały batch robi ich więcej. Stąd pozorny paradoks, że „szumny” trening uczy się szybciej.
Szum gradientu ma też wartość samą w sobie: pomaga opuszczać punkty siodłowe i sprzyja płaskim minimom, które lepiej generalizują (Keskar i in. 2017). Bardzo duże batche bez korekty learning rate dają gorszą generalizację, a nie tylko wolniejszy trening. Reguła liniowego skalowania (Goyal i in. 2017) — batch k razy większy, learning rate k razy większy — przywraca podobną dynamikę do pewnego k, powyżej którego potrzebna jest rozgrzewka, a zysk z większego batcha gaśnie.
Zastrzeżenie: batch normalization liczy statystyki na batchu, więc bardzo małe batche (poniżej około 8–16) destabilizują sieci z tą warstwą.
Na przykładzie
Najpierw szum. Dla regresji logistycznej na Breast Cancer Wisconsin (569 guzów, cechy standaryzowane, wagi zerowe) policzyłem pełny gradient i porównałem go z gradientami z 2000 losowych mini-batchy (random_state=0). Norma pełnego gradientu wynosi 1,41, a średni błąd gradientu z batcha: 2,07 przy B = 1, 1,09 przy B = 4, 0,55 przy B = 16, 0,27 przy B = 64. Każde czterokrotne zwiększenie batcha mniej więcej połowi błąd, zgodnie z regułą 1/√B.
Potem trening. MLPClassifier z 64 neuronami (SGD bez momentum, learning rate 0,05) na Digits 8×8 (1347 obrazów treningowych, random_state=0) trenowany przez 5 epok osiąga na teście 94,9% przy B = 1 (6735 kroków), 92,9% przy B = 16 (425 kroków), 81,8% przy B = 64 (110 kroków), 46,2% przy B = 256 (30 kroków) i 8,9% przy pełnym zbiorze (5 kroków). Gdy jednak zrównać liczbę kroków do około 200, batche 16, 64 i 256 dają podobnie: 91,8%, 90,4% i 91,8%. „Lepszy” mały batch w budżecie epok to głównie więcej kroków.
Dane: Breast Cancer Wisconsin (diagnostyka raka piersi) Digits (ręcznie pisane cyfry 8×8)
W praktyce
- Typowe wartości: 32–256 dla sieci na danych tabelarycznych i obrazach; w
MLPClassifierbatch_size='auto'oznacza min(200, n). W LLM batch liczy się w tokenach: od setek tysięcy do milionów na krok. - PyTorch:
DataLoader(dataset, batch_size=64, shuffle=True); gradient accumulation symuluje większy batch przy małej pamięci. - Zmieniasz batch → zmień learning rate (w przybliżeniu proporcjonalnie dla SGD; dla Adama zależność jest słabsza).
- Potęgi dwójki (32, 64, 128) to konwencja ułatwiająca wykorzystanie pamięci GPU, nie wymóg matematyczny.
- Typowy błąd: porównywanie „batch 16 kontra 512” przy tej samej liczbie epok i wnioskowanie, że mały batch jest „lepszy” — zwykle zrobił po prostu więcej kroków.
Najczęstsze pytania
- Jaki batch size wybrać?
- Zacznij od 32–128. Zwiększ, jeśli GPU jest niewykorzystane; zmniejsz, jeśli brakuje pamięci lub walidacja jest gorsza niż przy małym batchu. Zmieniając batch k-krotnie, skaluj learning rate w podobnym stosunku i sprawdź walidację.
- Czy większy batch size jest lepszy?
- Nie automatycznie. Większy batch daje gładszy gradient i lepiej wykorzystuje GPU, ale robi mniej kroków na epokę i bez korekty learning rate generalizuje gorzej. Bardzo małe batche są szumne i wolne na GPU. Optimum zależy od sprzętu i zadania.
- Czym różni się SGD od mini-batch gradient descent?
- Historycznie SGD oznaczał krok po jednym przykładzie, a pełny spadek gradientu — po całym zbiorze. Mini-batch jest pośrodku. Dziś „SGD” w bibliotekach oznacza mini-batch: optymalizator jest ten sam, różni się tylko liczbą przykładów uśrednianych na krok.
Źródła
- Goodfellow, Bengio, Courville (2016). Deep Learning, rozdz. 8.1.3 "Batch and minibatch algorithms". https://www.deeplearningbook.org/contents/optimization.html
- Keskar i in. (2017). "On large-batch training for deep learning: generalization gap and sharp minima". ICLR. arXiv:1609.04836
- Goyal i in. (2017). "Accurate, large minibatch SGD: training ImageNet in 1 hour". arXiv:1706.02677
- Masters, D., Luschi, C. (2018). "Revisiting small batch training for deep neural networks". arXiv:1804.07612
- Zhang i in. Dive into Deep Learning, rozdz. 12.5 "Minibatch stochastic gradient descent". https://d2l.ai/chapter_optimization/minibatch-sgd.html