Próbuję więc nauczyć się sieci neuronowych (do zastosowań regresji, nie klasyfikując zdjęć kotów).
Moje pierwsze eksperymenty polegały na uczeniu sieci implementacji filtra FIR i dyskretnej transformaty Fouriera (trening sygnałów „przed” i „po”), ponieważ są to operacje liniowe, które mogą być realizowane przez pojedynczą warstwę bez funkcji aktywacji. Oba działały dobrze.
Chciałem więc sprawdzić, czy mogę dodać abs()
i nauczyć się widma amplitudy. Najpierw pomyślałem o tym, ile węzłów będzie potrzebował w warstwie ukrytej, i zdałem sobie sprawę, że 3 ReLU są wystarczające do przybliżonego przybliżenia abs(x+jy) = sqrt(x² + y²)
, więc przetestowałem tę operację samodzielnie na pojedynczych liczbach zespolonych (2 wejścia → 3 ukryte warstwy węzłów ReLU → 1 wynik). Czasami działa:
Ale przez większość czasu, gdy próbuję, utknie w lokalnym minimum i nie znajduje odpowiedniego kształtu:
Wypróbowałem wszystkie optymalizatory i warianty ReLU w Keras, ale nie mają one większego znaczenia. Czy jest coś innego, co mogę zrobić, aby proste sieci takie jak ta niezawodnie zbiegały się? A może po prostu podchodzę do tego z niewłaściwym podejściem, a ty powinieneś rzucić o wiele więcej węzłów niż to konieczne w przypadku problemu, a jeśli połowa z nich umrze, nie jest to wielka sprawa?
Odpowiedzi:
Wynik wydaje się silnie sugerować, że jeden lub więcej twoich neuronów nie żyje (lub być może hiperpłaszczyzna wag dla dwóch twoich neuronów połączyła się). Możesz zobaczyć, że z 3 Relu, dostajesz 3 mroczne podziały w środku, kiedy zbierzesz się do bardziej rozsądnego rozwiązania. Możesz łatwo zweryfikować, czy to prawda, sprawdzając wartości wyjściowe każdego neuronu, aby sprawdzić, czy pozostaje on martwy przez większość próbek. Alternatywnie, możesz wykreślić wszystkie masy neuronów 2x3 = 6, pogrupowane według ich odpowiednich neuronów, aby sprawdzić, czy dwa neurony zapadną się do tej samej pary wag.
Podejrzewam, że jedną z możliwych przyczyn jest przechylenie kierunku jednej współrzędnej, np. , w którym to przypadku próbujesz odtworzyć tożsamość, a następnie . Naprawdę niewiele można tutaj zrobić, aby temu zaradzić. Jedną z opcji jest dodanie większej liczby neuronów podczas próby. Drugą opcją jest próba ciągłej aktywacji, takiej jak sigmoid, lub może coś niezwiązanego, jak wykładniczy. Możesz także spróbować porzucić (z powiedzmy 10% prawdopodobieństwem). Możesz użyć regularnej implementacji porzucania w keras, która jest na tyle inteligentna, że zignoruje sytuacje, gdy wszystkie 3 neurony wypadną.x + ja y x ≫ y a b s ( x + i y) ≈ x
źródło
3 shadowy splits in the center when you converge to the more reasonable solution.
Tak, mam na myśli przybliżone przybliżenie; odwrócona sześciokątna piramida.or perhaps something unbounded like an exponential
Próbowałem elu i selu, które nie działały znacznie lepiej.two neurons collapse to the same pair of weights
Ach, nie myślałem o tym; Po prostu założyłem, że nie żyją.