Definiujemy epokę, która przeszła przez wszystkie dostępne próbki szkoleniowe, a rozmiar mini-partii jako liczbę próbek, w stosunku do której uśredniamy, aby znaleźć aktualizacje wag / odchyleń potrzebnych do zejścia z gradientu.
Moje pytanie brzmi: czy powinniśmy rysować bez zastępowania z zestawu przykładów treningu, aby wygenerować każdą mini-partię w epoce. Wydaje mi się, że powinniśmy unikać wymiany, aby upewnić się, że faktycznie „narysujemy wszystkie próbki”, aby spełnić wymóg końca epoki, ale mam problem ze znalezieniem ostatecznej odpowiedzi w ten czy inny sposób.
Próbowałem googlować i czytać Ch. 1 z sieci neuronowych i głębokiego uczenia Nielsena, ale nie znalazłem jasnej odpowiedzi. W tym tekście Nielsen nie określa, że losowe próbkowanie powinno odbywać się bez zamiany, ale wydaje się sugerować, że tak jest.
W razie potrzeby można znaleźć jaśniejszą formalizację szkolenia w epokach - /stats//a/141265/131630
Edycja: to pytanie wydawało się podobne do mnie, ale nie było jasne, jak zastosować fakt, że liniowość oczekiwań jest niezależna od niezależności w tej sytuacji - czy próbkowanie powinno nastąpić z zastąpieniem lub bez
Odpowiedzi:
Dobra analiza teoretyczna zi bez zastępczych schematów w kontekście algorytmów iteracyjnych opartych na losowych losowaniach (które są przeszkodami dla wielu przeszkolonych głębokich sieci neuronowych (DNN)) można znaleźć tutaj
Krótko mówiąc, okazuje się, że pobieranie próbek bez zamiany prowadzi do szybszej konwergencji niż pobieranie próbek z zamianą.
Dam tutaj krótką analizę na podstawie dostarczonego przez nich przykładu zabawki: Powiedzmy, że chcemy zoptymalizować następującą funkcję celu:
gdzie cel . W tym przykładzie, staramy się rozwiązać za optymalny x , podanych N etykietach rw I oczywiście.yi∼N(μ,σ2) x N. yi
Ok, więc jeśli mielibyśmy rozwiązać bezpośrednio dla powyższego optymalne , wówczas wzięlibyśmy pochodną funkcji straty tutaj, ustawiliśmy ją na 0 i rozwiązaliśmy dla x . Tak więc w naszym powyższym przykładzie strata jestx x
i jego pierwszą pochodną byłoby:
Ustawienie do 0 i rozwiązanie dlax, daje:δLδx x
Innymi słowy, optymalne rozwiązanie jest niczym innym jak średnią próbki dla wszystkich próbek y .N y
Teraz, jeśli nie moglibyśmy wykonać powyższego obliczenia naraz, musielibyśmy to zrobić rekurencyjnie, korzystając z poniższego równania aktualizacji spadku gradientu:
a po prostu wstawienie tutaj naszych warunków daje:
Jeśli prowadzimy wyżej dla wszystkich , to skutecznie wykonujemy tę aktualizację bez wymiany. Powstaje zatem pytanie: czy możemy w ten sposób uzyskać optymalną wartość x ? (Pamiętaj, że optymalna wartość x to nic innego jak średnia próbki y ). Odpowiedź brzmi tak, jeśli pozwolisz λ i = 1 / i . Aby to zobaczyć, rozszerzamy:i∈1,2,...N x x y λi=1/i
Ostatnie równanie jest jednak niczym innym jak wzorem średniej bieżącej! Tak więc, gdy przechodzimy przez zestaw od , i = 2 itd. Aż do i = N , wykonalibyśmy nasze aktualizacje bez wymiany, a nasza formuła aktualizacji daje nam optymalne rozwiązaniei=1 i=2 i=N , czyli próbka średnia!x
W przeciwieństwie do tego, gdybyśmy faktycznie rysowali z zamianą, to podczas gdy nasze losowania byłyby wtedy naprawdę niezależne, zoptymalizowana wartość byłaby różna od (optymalnej) średniej μ , a błąd kwadratowy dałby:xN μ
która będzie wartością dodatnią, a ten prosty przykład zabawki można rozszerzyć na większe wymiary. Powoduje to, że chcielibyśmy wykonywać próbkowanie bez wymiany jako bardziej optymalne rozwiązanie.
Mam nadzieję, że to wyjaśni to jeszcze bardziej!
źródło
Zgodnie z kodem w repozytorium Nielsena mini-partie są losowane bez zamiany:
Widzimy, że w epoce nie ma zamiany próbek treningowych. Co ciekawe, możemy również zauważyć, że Nielsen nie martwi się dostosowywaniem
eta
(szybkości uczenia się) ostatniej wielkości mini_batchu, która może nie mieć tylu próbek treningowych, jak poprzednie mini-partie. Przypuszczalnie jest to zaawansowana modyfikacja, którą zostawia w kolejnych rozdziałach. **** EDYCJA: W rzeczywistości to skalowanie występuje w
def update_mini_batch
funkcji. Na przykład z ciężarami:Jest to konieczne, ponieważ ostatnia mini_batch może być mniejsza niż poprzednie mini_batch, jeśli liczba próbek treningowych na mini_batch nie dzieli się równomiernie na całkowitą liczbę dostępnych próbek treningowych.
Wynik:
Zmiana
mini_batch_size
na3
, która nie dzieli się równomiernie na nasze 10 próbek treningowych. Do produkcji otrzymujemy:Gdy oceniamy zakres ponad indeksami listy (coś w formie
[x:y]
gdziex
i gdziey
są niektóre indeksy na liście), jeśli nasza wartość po prawej stronie przekracza długość listy, python po prostu zwraca elementy z listy do góry, aż wartość wyjdzie poza zakres indeksu .Tak więc ostatnia mini-partia może być mniejsza niż poprzednie mini-partie, ale jeśli jest ona ważona tak samo,
eta
te próbki treningowe przyczynią się bardziej do uczenia się niż próbki z innych, większych mini-partii. Ponieważ jest to tylko ostatnia mini-partia, prawdopodobnie nie warto martwić się zbytnio, ale można ją łatwo rozwiązać, skalująceta
do długości mini-partii.źródło