Я реализую нейронную сеть и хотел использовать ReLU в качестве функции активации нейронов. Кроме того, я обучаю сеть с помощью SDG и обратного распространения. Я тестирую нейронную сеть с парадигматической проблемой XOR, и до сих пор она правильно классифицирует новые образцы, если я использую логистическую функцию или гиперболический тангенс в качестве функций активации.
Я читал о преимуществах использования Leaky ReLU в качестве функции активации и реализовал его на Python следующим образом:
def relu(data, epsilon=0.1):
return np.maximum(epsilon * data, data)
где np
- имя NumPy. Соответствующая производная реализована следующим образом:
def relu_prime(data, epsilon=0.1):
if 1. * np.all(epsilon < data):
return 1
return epsilon
Используя эту функцию в качестве активации, я получаю неверные результаты. Например:
Вход = [0, 0] -> Выход = [0,43951457]
Вход = [0, 1] -> Выход = [0.46252925]
Вход = [1, 0] -> Выход = [0.34939594]
Вход = [1, 1] -> Выход = [0.37241062]
Видно, что выходы сильно отличаются от ожидаемых XOR. Возникает вопрос: есть ли какие-то особые соображения по поводу использования ReLU в качестве функции активации?
Пожалуйста, не стесняйтесь спрашивать меня о дополнительном контексте или коде. Заранее спасибо.
РЕДАКТИРОВАТЬ: в производной есть ошибка, поскольку она возвращает только одно значение с плавающей запятой, а не массив NumPy. Правильный код должен быть:
def relu_prime(data, epsilon=0.1):
gradients = 1. * (data > epsilon)
gradients[gradients == 0] = epsilon
return gradients
gradients = 1. * (data > epsilon)
имеет смысл? Каково ваше определение дырявой функции ReLU? Это установило бы градиент равным эпсилону для некоторых значений данных, которые больше нуля. - person Nick Becker   schedule 09.01.2017epsilon
, а 1 берутся из всех остальных значений большеepsilon
. В данном случае я используюepsilon = 0.1
. - person tulians   schedule 09.01.2017f(x)
в том разделе википедии о Leaky ReLUs, я вижу кусочную производную от 1 при x> 0 и альфа в противном случае. Хотя я мог что-то упустить. - person Nick Becker   schedule 09.01.2017relu_prime
. Я уже использовал значение 0,01 в эпсилоне. В других сообщениях я видел, что значениеepsilon
может быть переменным, если оно мало. - person tulians   schedule 09.01.2017gradients == 0
будет True для значений x больше 0, но меньше эпсилон, тем не менее, делая производную эпсилон для значений x больше 0, но меньше эпсилон. Следует ли это из определения f (x)? - person Nick Becker   schedule 09.01.2017