Zamawianie normalizacji i rezygnacji z partii?

116

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ź.

golmschenk
źródło

Odpowiedzi:

143

W Ioffe i Szegedy 2015 autorzy stwierdzają, że „chcielibyśmy zapewnić, aby dla dowolnych wartości parametrów sieć zawsze wytwarzała aktywacje z pożądanym rozkładem”. Tak więc warstwa normalizacji wsadowej jest faktycznie wstawiana zaraz po warstwie konwersji / warstwie w pełni połączonej, ale przed wprowadzeniem do ReLu (lub innego rodzaju) aktywacji. Aby uzyskać więcej informacji, obejrzyj ten film około 53 minuty.

Jeśli chodzi o dropout, to uważam, że dropout jest stosowany po warstwie aktywacyjnej. Na wykresie odpadowym, rysunek 3b, współczynnik odpadnięcia / macierz prawdopodobieństwa r (l) dla warstwy ukrytej l jest nakładany na y (l), gdzie y (l) jest wynikiem po zastosowaniu funkcji aktywacji f.

Podsumowując, kolejność używania normalizacji i rezygnacji z partii jest następująca:

-> CONV / FC -> BatchNorm -> ReLu (lub inna aktywacja) -> Dropout -> CONV / FC ->

Zhongyu Kuang
źródło
63
Wygląda na to, że nawet Christian Szegedy lubi teraz wykonywać BatchNorm po ReLU (nie przed nim). Cytat F. Cholleta, autora Keras: „Nie wróciłem, żeby sprawdzić, co sugerują w swoim oryginalnym artykule, ale mogę zagwarantować, że najnowszy kod napisany przez Christiana dotyczy relu przed BN. To wciąż sporadycznie temat jednak debaty ”. źródło
pseudomarvin
3
A co z łączeniem, czy miałoby to miejsce między normą partii a aktywacją?
słowa z
5
Wygląda również na to, że dokładność może być wyższa w przypadku BN po aktywacji: github.com/cvjena/cnn-models/issues/3
wordsforhewise
1
wideo zostało jakoś usunięte!
blitu12345
10
Ten artykuł pokazuje, że normalne wypadnięcie z BN prowadzi do gorszych wyników, chyba że zostaną wykonane pewne uwarunkowania, aby uniknąć ryzyka przesunięć wariancji.
Haramoz
37

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

MiloMinderbinder
źródło
Odpowiednia dyskusja na Reddicie na temat umieszczania BatchNorm: reddit.com/r/MachineLearning/comments/67gonq/ ...
saetch_g
3
Ale czy nie zepsuje to twoich statystyk BN, ponieważ będziesz je obliczać po zastosowaniu rezygnacji, co nie będzie miało miejsca w czasie testu?
ZakJ
@ZakJ Chyba nie. Ponieważ obliczamy BN na jednostkę (dla każdej cechy wewnętrznej), a ponadto jest on skalowany, aby skompensować spadek.
gorliwość
@ZakJ ma rację. Zobacz odpowiedź Mohammeda Adela i ten artykuł tutaj: arxiv.org/pdf/1801.05134.pdf . W efekcie warstwy normalizacji wsadowej uczą się, jak przeciwdziałać współzmiennym przesunięciom danych, które już nie istnieją, gdy funkcja Dropout jest wyłączona w czasie testu.
skeller88
@ skeller88 Nie czytałem gazety. Myślę, że jeśli masz BN przed przerwaniem, to zasadniczo psuje intencję warstwy BN, ponieważ funkcją BN jest dostarczanie standardowych danych do następnej warstwy.
MiloMinderbinder
12

Zwykle po prostu upuść Dropout(jeśli masz BN):

  • „BN eliminuje potrzebę, Dropoutw niektórych przypadkach, przyczyny, że BN zapewnia podobne korzyści regularyzacyjne, jak intuicyjna rezygnacja”
  • „Architektury takie jak ResNet, DenseNet itp. Nie używają 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.

xtluo
źródło
a co z MLP, czy warto je łączyć.
DINA TAKLIT
1
@DINATAKLIT Kiedy naprawdę nie masz wystarczających danych treningowych, moim zdaniem TAK.
xtluo
@xtulo czy masz na myśli tę pracę, skoro ich data jest najmniejsza? tak jak gdybym przeczytał, że normalizacja wsadowa działa lepiej z dużymi zbiorami danych! Jestem trochę zdezorientowany :!
DINA TAKLIT
1
@DINATAKLIT Czy w poprzednim komentarzu what about MLPs is it useful to combine themmiałeś to na myśli Is 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.
xtluo
@xtulo tak, to znaczy, czy warto łączyć Droupout i BN, tak, zgadzam się z Twoją ostatnią odpowiedzią.
DINA TAKLIT
6

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 . wprowadź opis obrazu tutaj

Małe demo tego efektu można znaleźć w tym notatniku .

mohamed Adel
źródło
3
Jak to odpowiada na pytanie?
nbubis
1
Papier dostarcza 2 potencjalnych strategii: - Zastosuj Dropout (tylko) po wszystkich warstwach BN - Zmień Dropout w formę bardziej stabilną pod
kątem
@nbubis Myślę, że odpowiada na to pośrednio. Wydaje się, że sugeruje, aby w ogóle nie używać ich razem („wyjaśnia dysharmonię między rezygnacją a normą wsadu (BN)”).
NelsonGon
3

Opierając się na artykule badawczym, aby uzyskać lepszą wydajność, powinniśmy użyć BN przed zastosowaniem Dropouts

Renu
źródło
Odpowiedź nie dotyczy pełnego stosu, zadanego w pytaniu.
salehinejad
2

Prawidłowa kolejność to: Konw.> Normalizacja> Aktywacja> Porzucenie> Pula

salehinejad
źródło
2

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

model.add(Flatten())
model.add(layers.Dense(512, activation="elu"))
model.add(layers.Dense(10, activation="softmax"))

Warstwy konwolucyjne mają rozmiar jądra (3,3), domyślne wypełnienie, aktywacja to elu. Pooling to MaxPooling przy basenie (2,2). Strata jest, categorical_crossentropya optymalizator jest adam.

Odpowiednie prawdopodobieństwo rezygnacji wynosi odpowiednio 0.2lub 0.3. Liczba map obiektów wynosi odpowiednio 32lub 64.

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.

Lukas Nießen
źródło
Ze względu na stochastyczny charakter NN nie wystarczy po prostu bawić się jednym treningiem. Gdy wykonasz około 100 treningów i przyjmiesz średnią - wyniki będą dokładniejsze.
GensaGames
0

ConV / FC - BN - Sigmoid / tanh - dropout. Jeśli funkcja aktywacji to Relu lub inna, kolejność normalizacji i przerwania zależy od zadania

Cro Chan
źródło
0

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 .

Jiaxiang
źródło