Czy próbki treningowe losowo losowane do treningu neuronowego należy pobierać bez wymiany?

18

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

Bobo
źródło
O ile nie ma konkretnego powodu do danych, mini-partia do szkolenia sieci neuronowej jest zawsze rysowana bez wymiany. Chodzi o to, że chcesz być gdzieś pomiędzy trybem wsadowym, który oblicza gradient z całym zestawem danych i SGD, który używa tylko jednego losowego.
horaceT
SGD nie ogranicza się do użycia jednej losowej próbki. Ten proces nazywa się szkoleniem online. „Ekstremalna wersja zejścia gradientowego polega na użyciu mini-partii wielkości zaledwie 1 ... Ta procedura jest znana jako nauka online, online lub przyrostowa”. A także „Pomysł zwany stochastycznym spadkiem gradientu może być wykorzystany do przyspieszenia uczenia się. Chodzi o oszacowanie gradientu ∇C poprzez obliczenie [it] dla małej próbki losowo wybranych danych treningowych. Uśredniając tę ​​małą próbkę .. . możemy szybko uzyskać dobre oszacowanie prawdziwego gradientu ". Oba cytaty z Nielsen Ch. 1.
Bobo

Odpowiedzi:

13

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:

xopt=argminx12i=1N(xyi)2

gdzie cel . W tym przykładzie, staramy się rozwiązać za optymalny x , podanych N etykietach rw I oczywiście.yiN(μ,σ2)xN.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 jestxx

L=12i=1N(xyi)2

i jego pierwszą pochodną byłoby:

δLδx=i=1N(xyi)

Ustawienie do 0 i rozwiązanie dlax, daje:δLδxx

xopt=1Ni=1Nyi

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:

xi=xi1λi(f(xi1))

a po prostu wstawienie tutaj naszych warunków daje:

xi=xi1λi(xi1yi)

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:i1,2,...Nxxyλi=1/i

xi=xi1λi(xi1yi) xi=xi11i(xi1yi) xi=ixi1(xi1yi)i xi=(i1)xi1+yii ixi=(i1)xi1+yi 

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=1i=2i=N , czyli próbka średnia!x

NxN=(N1)xN1+yN==>xN=1Ni=1Nyi=μ

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μ

E{(xNμ)2}

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!

Tarin Ziyaee
źródło
W tym przykładzie zastosowano całkiem sporo założeń, tj. Wykorzystanie błędu do kwadratu i wypukłości krajobrazu strat. Czy wynik ma miejsce, gdy te założenia nie są spełnione?
bayerj
@bayerj Ten konkretny przykład zabawki, tak. Jednak w dalszej części artykułu rozszerzono ją na inne teoretyczne przypadki. Wierzę, że inne źródła [Boutou myślę] pokazują empiryczne poparcie dla próbkowania bez zastępowania, które jest lepsze.
Tarin Ziyaee,
@TarinZiyaee Dzięki za tę odpowiedź - czy możesz wyjaśnić λ_k = 1 / k? O którym k tutaj mówimy, k z powyższego równania? Nie śledziłem cię tutaj, co utrudniało kolejne podsumowanie i zakończenie. Dzięki.
bobo
1
@ Bobo Postaram się dziś wieczorem wyjaśnić post.
Tarin Ziyaee,
1
@ Bobo Zaktualizowałem kilka odpowiedzi. Proszę spojrzeć i dać mi znać, jeśli to pomoże.
Tarin Ziyaee
5

Zgodnie z kodem w repozytorium Nielsena mini-partie są losowane bez zamiany:

    def SGD(self, training_data, epochs, mini_batch_size, eta, test_data=None):
    n = len(training_data)
    for j in range(epochs):
            random.shuffle(training_data)
            mini_batches = [
                training_data[k:k+mini_batch_size]
                for k in range(0, n, mini_batch_size)
            ]
            for mini_batch in mini_batches:
                self.update_mini_batch(mini_batch, eta)

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_batchfunkcji. Na przykład z ciężarami:

self.weights = [w-(eta/len(mini_batch))*nw for w, nw in zip(self.weights, nabla_w)]     

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.

mylist = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
n = len(mylist)
mini_batch_size = 2
mini_batches = [
    mylist[k:k+mini_batch_size]
    for k in range(0, n, mini_batch_size)
    ]
for mini_batch in mini_batches:
    print(mini_batch)

Wynik:

['1', '2']
['3', '4']
['5', '6']
['7', '8']
['9', '10']

Zmiana mini_batch_sizena 3, która nie dzieli się równomiernie na nasze 10 próbek treningowych. Do produkcji otrzymujemy:

['1', '2', '3']
['4', '5', '6']
['7', '8', '9']
['10']

Gdy oceniamy zakres ponad indeksami listy (coś w formie [x:y]gdzie xi gdzie ysą 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, etate 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ąc etado długości mini-partii.

Bobo
źródło