Tło: Dopasowując sieci neuronowe z aktywacją relu, stwierdziłem, że czasami prognoza staje się prawie stała. Uważam, że jest to spowodowane umieraniem neuronów relu podczas treningu, jak stwierdzono tutaj. (Na czym polega problem „umierania ReLU” w sieciach neuronowych? )
Pytanie: Mam nadzieję zaimplementować kontrolę w samym kodzie, aby sprawdzić, czy neurony nie żyją. Następnie kod może w razie potrzeby odnowić sieć.
Jako takie, co jest dobrym kryterium do sprawdzania martwych neuronów? Obecnie myślę o sprawdzeniu niskiej wariancji w prognozie jako kryterium.
Jeśli to pomoże, używam keras.
Odpowiedzi:
Martwa ReLU oznacza po prostu, że jej wartość argumentu jest ujemna, tak że gradient pozostaje na poziomie 0; bez względu na to, jak trenujesz od tego momentu. Możesz po prostu spojrzeć na gradient podczas treningu, aby zobaczyć, czy ReLU nie żyje.
W praktyce możesz po prostu użyć nieszczelnych jednostek ReLU, tzn. Zamiast f (x) = max (0, x) ustawiasz f (x) = x, jeśli x> 0 oraz f (x) = 0,01x, jeśli x <= 0 W ten sposób zawsze pozwalasz na mały niezerowy gradient i jednostka nie powinna już całkowicie utknąć w treningu.
źródło
Martwy neuron to neuron, który nie aktualizuje się podczas treningu, tj. 0 gradient.
Keras umożliwia ekstrakcję gradientu bezpośrednio dla danego wiersza danych. (Kolejny fajny przykład)
Możesz też wyodrębnić wagi neuronów i samodzielnie obliczyć gradient
(np. Dla relu, argument ujemny dla relu -> gradient 0).
Niestety gradient jest zależny od punktu danych. Tylko jeśli gradient jest równy 0 dla każdego wiersza danych treningowych, możesz być pewien, że neuron nie zaktualizuje się dla wszystkich minibatches podczas epoki treningowej.
Nieszczelne relu może być pomocną strategią, ponieważ nie ma wartości dla nieszczelnego relu, gdzie gradient wynosi 0.
źródło