ML Atlas

06 · Sieci · 5 min czytania · aktualizacja

Jaki batch size wybrać przy trenowaniu sieci neuronowej?

W skrócie

Zacznij od minipaczki 32–256 albo od największej, jaka mieści się w pamięci. Większa paczka to mniej kroków: podnieś współczynnik uczenia lub liczbę epok.

Co to jest

Rozsądny start to minipaczka (batch size) od 32 do 256 przykładów, a w praktyce największa, przy której sprzęt jest w pełni wykorzystany; zmieniając ją, trzeba jednocześnie dostosować współczynnik uczenia (w przybliżeniu proporcjonalnie do rozmiaru paczki przy SGD) albo liczbę epok, bo większa paczka oznacza mniej kroków optymalizacji. Większość opowieści o tym, że „duże paczki gorzej uogólniają”, to w rzeczywistości porównania przy tej samej liczbie epok i tym samym współczynniku uczenia.

Minipaczka to liczba przykładów, z których liczy się jeden gradient i robi jeden krok. Mała paczka daje gradient zaszumiony, ale tani i częsty. Duża paczka daje gradient dokładny, ale drogi i rzadki. Jedna epoka to zawsze przejście przez cały zbiór, więc przy paczce 32 sieć robi 32 razy więcej kroków niż przy paczce 1024.

Rozmiar minipaczki jest więc przede wszystkim decyzją o wykorzystaniu sprzętu i o liczbie kroków, a dopiero w drugiej kolejności — o regularyzacji.

Mechanizm — dlaczego tak działa

Szum gradientu maleje jak 1/√B. Gradient z paczki B przykładów to średnia, więc jego odchylenie standardowe maleje proporcjonalnie do 1/√B. Czterokrotnie większa paczka daje dwa razy mniej szumu za czterokrotnie większy koszt kroku. Do pewnego rozmiaru opłaca się to, bo GPU liczy paczkę równolegle prawie w tym samym czasie; powyżej tego progu zysk na kroku nie rekompensuje mniejszej liczby kroków.

Krytyczny rozmiar paczki. Badania nad treningiem równoległym (Shallue i in., 2019; McCandlish i in., 2018) pokazują, że do pewnego rozmiaru podwojenie paczki pozwala niemal o połowę zmniejszyć liczbę kroków potrzebnych do celu. Powyżej tego krytycznego rozmiaru liczba kroków przestaje maleć i dalsze zwiększanie paczki to marnowanie obliczeń. Krytyczny rozmiar zależy od problemu i rośnie w trakcie treningu.

Reguła liniowego skalowania. Przy SGD k kolejnych kroków o współczynniku η na paczkach rozmiaru B ma w przybliżeniu ten sam efekt co jeden krok o współczynniku kη na paczce rozmiaru kB. Goyal i in. (2017) wytrenowali w ten sposób ResNet-50 na ImageNet z paczką 8192 bez straty dokładności, dodając rozgrzewkę współczynnika uczenia. Przy Adamie zależność jest słabsza; często stosuje się skalowanie pierwiastkowe.

Szum jako regularyzacja. Mały rozmiar paczki dodaje do optymalizacji szum, który może pomagać unikać ostrych minimów (Keskar i in., 2017). Ten efekt istnieje, ale jest mniejszy, niż sugerowały wczesne prace: duża część „luki uogólniania” znika po wyrównaniu liczby kroków i dostrojeniu współczynnika uczenia.

Ograniczenia praktyczne. Pamięć GPU wyznacza górną granicę; normalizacja wsadowa źle działa przy paczkach poniżej ok. 8–16; bardzo małe paczki źle wykorzystują sprzęt. Gdy pożądana paczka nie mieści się w pamięci, stosuje się akumulację gradientów.

Na przykładzie

Digits: 1347 obrazków treningowych, 450 testowych (random_state=0), sieć MLP 64 → 128 → 128 → 10, trzy ziarna losowości. Trzy eksperymenty: (A) stałe 30 epok, Adam, współczynnik 0,001; (B) stała liczba ok. 1500 kroków, Adam 0,001; (C) SGD z momentem, 30 epok, współczynnik 0,01 stały albo skalowany liniowo względem paczki 32. Trafność na teście:

Rozmiar paczkiA: kroków w 30 epokachA: trafnośćB: ~1500 krokówC: SGD, stały wsp.C: SGD, wsp. skalowany
850700,9740,964——
3212900,9750,9700,9700,970 (0,01)
1283300,9670,9750,9430,967 (0,04)
512900,9390,9710,7930,967 (0,16)
1347 (cały zbiór)300,8460,967——

W eksperymencie A wygląda na to, że duże paczki są złe: pełny zbiór daje 0,846. Ale to tylko 30 kroków. W eksperymencie B, przy tej samej liczbie kroków, paczka 128 jest najlepsza (0,975), a pełny zbiór daje 0,967 — prawie tyle, co mała paczka. W C stały współczynnik uczenia przy paczce 512 daje 0,793, a ten sam trening z współczynnikiem zwiększonym 16 razy — 0,967. Problemem nie był rozmiar paczki, tylko za mało kroków lub za małe kroki.

Czas: na CPU 30 epok z paczką 8 trwało 2,3 s, z paczką 32 — 0,8 s, a z paczką 512 — 0,4 s. Paczka 8 dała ten sam wynik co 32, ale trzy razy wolniej; na GPU różnica byłaby jeszcze większa.

Dane: Digits (ręcznie pisane cyfry 8×8)

W praktyce

Reguła wyboru:

  • Start: DataLoader(ds, batch_size=64, shuffle=True) dla małych modeli; dla dużych — największa potęga dwójki, która mieści się w pamięci.
  • Zwiększasz paczkę k razy przy SGD → zwiększ współczynnik uczenia ok. k razy i dodaj rozgrzewkę (torch.optim.lr_scheduler.LinearLR(opt, start_factor=0.1, total_iters=500)); przy Adamie zacznij od √k.
  • Porównuj rozmiary paczek przy stałej liczbie kroków lub po dostrojeniu współczynnika uczenia — porównanie przy stałych epokach faworyzuje małe paczki.
  • Paczka za duża dla pamięci → akumulacja gradientów: loss = loss / k; loss.backward() i opt.step(); opt.zero_grad() co k paczek.
  • Normalizacja wsadowa i paczki poniżej ok. 16 → rozważ nn.GroupNorm lub nn.LayerNorm.
  • W scikit-learn: MLPClassifier(batch_size=...) domyślnie min(200, n_samples).

Najczęstsze pytania

Czy mniejsza paczka zawsze lepiej uogólnia?
Nie zawsze. Szum małych paczek może działać jak regularyzacja, ale większość obserwowanych różnic wynika z innej liczby kroków lub niedostrojonego współczynnika uczenia. Po wyrównaniu tych czynników różnice zwykle są małe aż do krytycznego rozmiaru paczki.
Dlaczego rozmiary paczek to zwykle potęgi dwójki?
Z przyzwyczajenia i dla wygody — pamięć i rdzenie GPU są zorganizowane w bloki o rozmiarach będących potęgami dwójki, więc takie paczki czasem lepiej wykorzystują sprzęt. Różnica między 64 a 60 jest zwykle niezauważalna; nie trzeba się jej trzymać za wszelką cenę.
Jaki rozmiar paczki do fine-tuningu dużych modeli?
Zwykle mały na urządzenie (często 1–16 sekwencji, bo modele zajmują dużo pamięci) i akumulacja gradientów do efektywnej paczki rzędu kilkudziesięciu–kilkuset przykładów. Przy LoRA i małych zbiorach efektywne paczki 16–64 są typowym punktem startowym.

Źródła

  • Goyal P. i in. „Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour”, arXiv:1706.02677, 2017.
  • Keskar N. S., Mudigere D., Nocedal J., Smelyanskiy M., Tang P. T. P. „On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima”, ICLR 2017.
  • Shallue C. J. i in. „Measuring the Effects of Data Parallelism on Neural Network Training”, Journal of Machine Learning Research 20, 2019.
  • McCandlish S., Kaplan J., Amodei D. i in. „An Empirical Model of Large-Batch Training”, arXiv:1812.06162, 2018.
  • Goodfellow I., Bengio Y., Courville A. „Deep Learning”, MIT Press 2016, rozdz. 8.1.3 (Batch and Minibatch Algorithms).

Zobacz też