Pierwotne pytanie dotyczyło konkretnie implementacji TensorFlow. Jednak odpowiedzi dotyczą ogólnie wdrożeń. Ta ogólna odpowiedź jest również poprawną odpowiedzią dla TensorFlow.
Czy podczas korzystania z normalizacji wsadowej i rezygnacji z TensorFlow (w szczególności z plików contrib.layers) muszę się martwić o zamówienie?
Wydaje się możliwe, że jeśli użyję dropout, po którym natychmiast nastąpi normalizacja partii, mogą wystąpić problemy. Na przykład, jeśli przesunięcie w ciągach normalizacji wsadowej prowadzi do większej liczby danych wyjściowych treningu, ale wtedy ta sama zmiana jest stosowana do mniejszych (z powodu kompensacji za posiadanie większej liczby wyników) numerów skal bez przerywania podczas testowania, to zmiana może być wyłączona. Czy warstwa normalizacji wsadowej TensorFlow automatycznie to kompensuje? A może to się nie dzieje z jakiegoś powodu, którego mi brakuje?
Czy są też inne pułapki, na które należy zwrócić uwagę podczas używania tych dwóch razem? Na przykład zakładając, że używam ich we właściwej kolejności w odniesieniu do powyższego (zakładając, że jest prawidłowa kolejność), czy może być kłopot z wykorzystaniem zarówno normalizację partii i porzucaniu na wielu kolejnych warstw? Nie widzę od razu problemu z tym, ale może coś mi umknęło.
Dziękuję bardzo!
AKTUALIZACJA:
Test eksperymentalny wydaje się sugerować, że kolejność ma znaczenie. Uruchomiłem tę samą sieć dwa razy z tylko normą wsadową i odwrotną przerwą. Gdy spadek jest przed normą wsadową, utrata walidacji wydaje się wzrastać wraz ze spadkiem strat podczas treningu. W drugim przypadku oboje upadają. Ale w moim przypadku ruchy są powolne, więc po kolejnych treningach sytuacja może się zmienić i to tylko jeden test. Wciąż doceniona byłaby bardziej ostateczna i świadoma odpowiedź.
źródło
Jak zauważył w komentarzach, niesamowity zasób przeczytać na kolejność warstw jest tutaj . Przejrzałem komentarze i jest to najlepsze źródło na temat, jakie znalazłem w Internecie
Moje 2 centy:
Porzucenie ma na celu całkowite zablokowanie informacji z pewnych neuronów, aby upewnić się, że neurony nie będą się wspólnie przystosowywać. Tak więc normalizacja wsadowa musi nastąpić po rezygnacji, w przeciwnym razie informacje są przekazywane przez statystyki normalizacji.
Jeśli się nad tym zastanowić, w typowych problemach ML, jest to powód, dla którego nie obliczamy średniej i odchylenia standardowego dla całych danych, a następnie dzielimy je na zestawy do trenowania, testowania i walidacji. Dzielimy, a następnie obliczamy statystyki w zestawie pociągów i używamy ich do normalizowania i wyśrodkowywania walidacji i testowych zestawów danych
więc proponuję Schemat 1 (uwzględnia komentarz pseudomarvina na temat zaakceptowanej odpowiedzi)
-> CONV / FC -> ReLu (lub inna aktywacja) -> Dropout -> BatchNorm -> CONV / FC
w przeciwieństwie do Schematu 2
-> CONV / FC -> BatchNorm -> ReLu (lub inna aktywacja) -> Dropout -> CONV / FC -> w zaakceptowanej odpowiedzi
Należy pamiętać, że oznacza to, że sieć w ramach Schematu 2 powinna wykazywać nadmierne dopasowanie w porównaniu z siecią w ramach Schematu 1, ale OP przeprowadził pewne testy, jak wspomniano w pytaniu, i obsługują Schemat 2
źródło
Zwykle po prostu upuść
Dropout
(jeśli maszBN
):Dropout
w niektórych przypadkach, przyczyny, że BN zapewnia podobne korzyści regularyzacyjne, jak intuicyjna rezygnacja”Dropout
Aby uzyskać więcej informacji, zapoznaj się z tym artykułem [ Zrozumienie dysharmonii między rezygnacją a normalizacją partii przez przesunięcie wariancji ], o czym wspomniał już @Haramoz w komentarzach.
źródło
what about MLPs is it useful to combine them
miałeś to na myśliIs it useful to combine Dropout and BN when using MLPs
? Mam wrażenie, że zależy to głównie od rozmiaru modelu i ilości posiadanych danych treningowych.Znalazłem artykuł, który wyjaśnia dysharmonię między Dropout a Batch Norm (BN). Kluczową ideą jest to, co nazywają „przesunięciem wariancji” . Wynika to z faktu, że porzucenie ma inne zachowanie między fazą szkolenia i testowania, co zmienia statystyki wejściowe, których uczy się BN. Główną ideę można znaleźć na tym rysunku, który pochodzi z tego artykułu .
Małe demo tego efektu można znaleźć w tym notatniku .
źródło
Opierając się na artykule badawczym, aby uzyskać lepszą wydajność, powinniśmy użyć BN przed zastosowaniem Dropouts
źródło
Prawidłowa kolejność to: Konw.> Normalizacja> Aktywacja> Porzucenie> Pula
źródło
Conv - Aktywacja - DropOut - BatchNorm - Pula -> Test_loss: 0,04261355847120285
Conv - Aktywacja - DropOut - Pool - BatchNorm -> Test_loss: 0,050065308809280396
Conv - Aktywacja - BatchNorm - Pula - DropOut -> Test_loss: 0,04911309853196144
Conv - Aktywacja - BatchNorm - DropOut - Pool -> Test_loss: 0,06809622049331665
Conv - BatchNorm - Aktywacja - DropOut - Pool -> Test_loss: 0,038886815309524536
Conv - BatchNorm - Aktywacja - Pula - DropOut -> Test_loss: 0,04126095026731491
Conv - BatchNorm - DropOut - Activation - Pool -> Test_loss: 0,05142546817660332
Conv - DropOut - Activation - BatchNorm - Pool -> Test_loss: 0,04827788099646568
Conv - DropOut - Activation - Pool - BatchNorm -> Test_loss: 0,04722036048769951
Conv - DropOut - BatchNorm - Aktywacja - Pula -> Test_loss: 0,03238215297460556
Przeszkolony na zestawie danych MNIST (20 epok) z 2 modułami splotowymi (patrz poniżej), a za każdym razem z
Warstwy konwolucyjne mają rozmiar jądra
(3,3)
, domyślne wypełnienie, aktywacja toelu
. Pooling to MaxPooling przy basenie(2,2)
. Strata jest,categorical_crossentropy
a optymalizator jestadam
.Odpowiednie prawdopodobieństwo rezygnacji wynosi odpowiednio
0.2
lub0.3
. Liczba map obiektów wynosi odpowiednio32
lub64
.Edycja: Kiedy upuściłem Dropout, zgodnie z zaleceniami w niektórych odpowiedziach, zbiegał się szybciej, ale miał gorszą zdolność uogólniania niż gdy używam BatchNorm i Dropout.
źródło
ConV / FC - BN - Sigmoid / tanh - dropout. Jeśli funkcja aktywacji to Relu lub inna, kolejność normalizacji i przerwania zależy od zadania
źródło
Przeczytałem zalecane artykuły w odpowiedzi i komentarzach z https://stackoverflow.com/a/40295999/8625228
Z punktu widzenia Ioffe i Szegedy (2015) w strukturze sieci używaj tylko BN. Li i in. (2018) podają analizy statystyczne i eksperymentalne, że występuje przesunięcie wariancji, gdy praktykujący używają Dropout przed BN. Tak więc Li i in. (2018) zalecają stosowanie Dropout po wszystkich warstwach BN.
Z punktu widzenia Ioffe i Szegedy (2015) BN jest zlokalizowany wewnątrz / przed funkcją aktywacji. Jednak Chen i wsp. (2019) używają warstwy IC, która łączy dropout i BN, a Chen et al. (2019) zaleca używanie BN po ReLU.
Ze względów bezpieczeństwa używam Dropout lub BN tylko w sieci.
Chen, Guangyong, Pengfei Chen, Yujun Shi, Chang-Yu Hsieh, Benben Liao i Shengyu Zhang. 2019. „Ponowne przemyślenie wykorzystania normalizacji wsadowej i rezygnacji z treningu głębokich sieci neuronowych”. CoRR abs / 1905.05928.http://arxiv.org/abs/1905.05928 .
Ioffe, Sergey i Christian Szegedy. 2015. „Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift”. CoRR abs / 1502.03167. http://arxiv.org/abs/1502.03167 .
Li, Xiang, Shuo Chen, Xiaolin Hu i Jian Yang. 2018. „Zrozumienie dysharmonii między rezygnacją a normalizacją partii poprzez zmianę wariancji”. CoRR abs / 1801.05134. http://arxiv.org/abs/1801.05134 .
źródło