Wdrażam sieć neuronową i chciałem użyć ReLU jako funkcji aktywacji neuronów. Ponadto ćwiczę sieć z SDG i propagacją wsteczną. Testuję sieć neuronową z paradygmatycznym problemem XOR i do tej pory poprawnie klasyfikuje nowe próbki, jeśli używam funkcji logistycznej lub stycznej hiperbolicznej jako funkcji aktywacyjnych.Uwagi dotyczące używania ReLU jako funkcji aktywacji
Czytałem o zaletach korzystania z nieszczelnego Relu jako funkcji aktywacji, i wprowadziły go w Pythonie, tak:
def relu(data, epsilon=0.1):
return np.maximum(epsilon * data, data)
gdzie np
to nazwa NumPy. Powiązana pochodna jest zaimplementowana w następujący sposób:
def relu_prime(data, epsilon=0.1):
if 1. * np.all(epsilon < data):
return 1
return epsilon
Używając tej funkcji jako aktywacji, otrzymuję niepoprawne wyniki. Np
wejściowa = [0, 0] -> wyjściowy = [0,43951457]
wejściowa = [0, 1], -> wyjściowy = [0,46252925]
wejście = [1, 0] -> wyjściowy = [0,34939594]
wejściowy [1, 1] -> wyjściowy = [0,37241062]
Można zauważyć, że wyjścia różnią się znacznie od oczekiwanych XOR. Tak więc pytanie brzmi, czy jest jakaś szczególna uwaga, aby użyć ReLU jako funkcji aktywacyjnej?
Proszę, nie wahaj się prosić mnie o więcej kontekstu lub kodu. Z góry dziękuję.
EDYCJA: Występuje błąd w pochodnej, ponieważ zwraca tylko jedną wartość zmiennoprzecinkową, a nie tablicę NumPy. Poprawny kod powinien być:
def relu_prime(data, epsilon=0.1):
gradients = 1. * (data > epsilon)
gradients[gradients == 0] = epsilon
return gradients
czy to działa po zmodyfikowaniu części obliczeniowej gradientu? –
@KrishnaKishoreAndhavarapu Po modyfikacji otrzymuję poprawne wyniki, ale jak 5 na 10 razy. Uważam, że za każdym razem powinienem uzyskać poprawne wyniki. Jest wyraźnie coś, czego mi brakuje w tej funkcji aktywacji. – tulians
Czy jesteś pewien, że 'gradienty = 1. * (dane> epsilon) mają sens? Jaka jest twoja definicja nieszczelnej funkcji ReLU? Ustawiłoby to gradient równy epsilon dla niektórych wartości danych, które są większe od zera. –