Влияние использования relu для градиентного спуска

Какое влияние оказывает тот факт, что функция активации relu не содержит производной?

Как реализовать функцию ReLU в Numpy реализует relu как максимум из (0, элементы вектора матрицы).

Означает ли это, что для градиентного спуска мы не берем производную от функции relu?

Обновлять :

Из ​​Обратное распространение нейронной сети с помощью RELU

этот текст помогает понять:

Функция ReLU определяется как: Для x> 0 выходом является x, то есть f (x) = max (0, x)

Итак, для производной f '(x) это на самом деле:

если x ‹0, вывод равен 0. если x> 0, вывод равен 1.

Производная f '(0) не определена. Таким образом, он обычно устанавливается на 0 или вы изменяете функцию активации на f (x) = max (e, x) для небольшого e.

Обычно: ReLU - это блок, который использует функцию активации выпрямителя. Это означает, что он работает точно так же, как любой другой скрытый слой, но кроме tanh (x), sigmoid (x) или любой другой активации, которую вы используете, вместо этого вы будете использовать f (x) = max (0, x).

Если вы написали код для работающей многоуровневой сети с сигмоидной активацией, это буквально 1 строка изменения. Ничего о прямом или обратном распространении не меняется алгоритмически. Если у вас еще не работает более простая модель, вернитесь и начните сначала с нее. В противном случае ваш вопрос на самом деле не о ReLU, а о реализации NN в целом.

Но это по-прежнему оставляет некоторую путаницу, поскольку функция стоимости нейронной сети обычно принимает производную от функции активации, поэтому, например, как это влияет на функцию стоимости?


person blue-sky    schedule 30.11.2017    source источник
comment
Это означает, что вы можете потерять все гарантии в отношении GD (вики называет это неопределенным).   -  person sascha    schedule 30.11.2017
comment
Текст в обновлении не отвечает на вопрос: (1): это субградиент. (2): субградиент может использоваться в SGD; но не в простом GD.   -  person sascha    schedule 30.11.2017


Ответы (1)


Стандартный ответ заключается в том, что вход в ReLU редко бывает точно равен нулю, см. здесь, например, поэтому это не имеет особого значения.

В частности, для того, чтобы ReLU получил нулевой входной сигнал, скалярное произведение одной целой строки входных данных для слоя с одним целым столбцом весовой матрицы слоя должно быть точно равно нулю. Даже если у вас есть входная выборка с нулевыми значениями, в последней позиции все равно должен быть член смещения, поэтому я действительно не вижу, чтобы это когда-либо происходило.

Однако, если вы хотите проверить себя, попробуйте реализовать производную на нуле как 0, 0.5 и 1 и посмотрите, не изменится ли что-нибудь.

Документы PyTorch предоставляют простую нейронную сеть с большим количеством примеров с один скрытый слой и активация relu. Я воспроизвел это ниже с фиксированным случайным начальным значением и тремя вариантами настройки поведения градиента ReLU на 0. Я также добавил термин смещения.

N, D_in, H, D_out = 4, 2, 30, 1

# Create random input and output data
x = x = np.random.randn(N, D_in)
x = np.c_(x, no.ones(x.shape[0]))
y = x = np.random.randn(N, D_in)

np.random.seed(1)

# Randomly initialize weights
w1 = np.random.randn(D_in+1, H)
w2 = np.random.randn(H, D_out)

learning_rate = 0.002
loss_col = []
for t in range(200):
    # Forward pass: compute predicted y
    h = x.dot(w1)
    h_relu = np.maximum(h, 0)  # using ReLU as activate function
    y_pred = h_relu.dot(w2)

    # Compute and print loss
    loss = np.square(y_pred - y).sum() # loss function
    loss_col.append(loss)
    print(t, loss, y_pred)

    # Backprop to compute gradients of w1 and w2 with respect to loss
    grad_y_pred = 2.0 * (y_pred - y) # the last layer's error
    grad_w2 = h_relu.T.dot(grad_y_pred)
    grad_h_relu = grad_y_pred.dot(w2.T) # the second laye's error 
    grad_h = grad_h_relu.copy()        
    grad_h[h < 0] = 0  # grad at zero = 1
    # grad[h <= 0] = 0 # grad at zero = 0
    # grad_h[h < 0] = 0; grad_h[h == 0] = 0.5 # grad at zero = 0.5
    grad_w1 = x.T.dot(grad_h)

    # Update weights
    w1 -= learning_rate * grad_w1
    w2 -= learning_rate * grad_w2
person Imran    schedule 30.11.2017