Udostępnij przez


BrainScript minibatchSize w CNTK

Uwaga: w przypadku użytkowników BrainScript parametrem rozmiaru minibatch jest minibatchSize, dla użytkowników języka Python jest to minibatch_size_in_samples. W przypadku użytkowników języka Python zobacz tutaj.

CNTK ma bardzo określoną definicję parametruminibatchSize: określa liczbę próbek między aktualizacjami modelu. Przykład w tym miejscu jest zdefiniowany jako jeden wektor lub tensor przepływając przez system. Na przykład w zadaniu rozpoznawania obrazów jeden obraz jest jednym z przykładów.

Rozmiar minibatch dla każdej epoki, podany w próbkach (tensorów wzdłuż osi dynamicznej). Wartość domyślna to 256. Możesz użyć różnych wartości dla różnych epok, np 128*2:1024 . (w języku BrainScript) lub 128*2 + 1024 (w języku Python) oznacza użycie minibatch rozmiaru 128 dla pierwszych dwóch epok, a następnie 1024 dla reszty. Należy pamiętać, że rozmiar minibatch w CNTK oznacza liczbę próbek przetworzonych między aktualizacjami modelu. Ta definicja jest również przechowywana w przypadku równoległości między procesami roboczymi (np. w przypadku K procesów roboczych liczba próbek, które przetwarza minibatchSize/Kkażdy proces roboczy). W przypadku danych wejściowych minibatchSize o zmiennej długości odnosi się do liczby elementów w tych sekwencjach, a nie liczby sekwencji. SGD podejmie próbę dopasowania do jak największej liczby sekwencji w minibatch, która nie przekracza minibatchSize łącznej liczby próbek. Jeśli podano kilka danych wejściowych, tensor są dodawane do bieżącego minibatch, dopóki jeden z danych wejściowych nie przekroczy minibatchSize.

Co ważne, w przypadku danych sekwencyjnych próbka jest pojedynczym elementem sekwencji. W związku z tym CNTK minibatchSizenie odnosi się do liczby sekwencji w minibatch, ale zagregowana liczba elementów/tokenów sekwencji w sekwencjach, które stanowią minibatch. CNTK ma natywną obsługę sekwencji o zmiennej długości, tj. może pomieścić sekwencje o bardzo różnych długościach w ramach tej samej minibatch, bez konieczności obejścia takich jak zasobniki. Wraz z pojęciem CNTK określania szybkości nauki na próbkę (zamiast średniej minibatch), każdy element sekwencji o dowolnej długości przyczynia się do gradientu, co prowadzi do spójnej zbieżności. (Wiele innych zestawów narzędzi definiuje rozmiar minibatch dla danych sekwencyjnych jako liczbę sekwencji w minibatch. Jest to problematyczne, zwłaszcza jeśli gradienty są również zdefiniowane jako średnie minibatch, a nie sumy minibatch CNTK, ponieważ wkład do gradientu z każdego tokenu lub kroku w sekwencji byłby odwrotnie proporcjonalny do długości sekwencji. CNTK podejście to pozwala uniknąć).

Jeśli jest używanych wiele Input{}s, możliwe, że nie wszystkie dane wejściowe mają taką samą długość sekwencji. Na przykład w sekwencji klasyfikacja etykieta każdej sekwencji jest pojedynczym tokenem. W tym przypadku dane wejściowe z największą liczbą próbek kontrolują rozmiar minibatch. (To zachowanie można zmienić, określając definesMbSize=True dla niektórych danych wejściowych, a następnie rozmiar minibatch zostanie zliczany na podstawie sekwencji z tych danych wejściowych. Po określeniu kilku danych wejściowych tylko jeden z nich może mieć definesMbSize wartość True.)

Pomimo naszej jasnej minibatchSize definicji liczby próbek między aktualizacjami modelu, istnieją dwa razy, w których musimy złagodzić definicję:

  • dane sekwencyjne: sekwencje o zmiennej długości nie sumują się zazwyczaj do dokładnie żądanego rozmiaru minibatch. W takim przypadku, jak najwięcej sekwencji jest zapakowanych w minibatch bez przekroczenia żądanego rozmiaru minibatch (z jednym wyjątkiem: Jeśli kolejna sekwencja w losowym korpusie przekracza długość rozmiaru minibatch, rozmiar minibatch będzie składać się z tej sekwencji).
  • równoległość danych: w tym przypadku rozmiar minibatch jest przybliżony, ponieważ nasz algorytm losowania oparty na fragmentach nie może zagwarantować, że każdy proces roboczy otrzyma dokładnie taką samą liczbę próbek.

Wszystkie powyższe zagadnienia dotyczą epochSizerównież metody , ale epochSize mają pewne różnice, zobacz tutaj.