Функция ReLu в Python
Relu или Rectified Linear Activation Function — наиболее распространенный выбор функции активации в мире глубокого обучения. Relu обеспечивает самые современные результаты и в то же время очень эффективен в вычислительном отношении.
Основная концепция функции активации Relu заключается в следующем:
Return 0 if the input is negative otherwise return the input as it is.
Мы можем представить это математически следующим образом:
Псевдокод для Relu выглядит следующим образом:
if input > 0:
return input
else:
return 0
В этом уроке мы узнаем, как реализовать нашу собственную функцию ReLu, узнаем о некоторых ее недостатках и узнаем о лучшей версии ReLu.
Рекомендуется к прочтению: Линейная алгебра для машинного обучения [Часть 1/2]
Давайте начнем!
Реализация функции ReLu в Python
Давайте напишем собственную реализацию Relu на Python. Мы будем использовать встроенную функцию max для ее реализации.
Код для ReLu выглядит следующим образом:
def relu(x):
return max(0.0, x)
Чтобы протестировать функцию, давайте запустим ее на нескольких входных данных.
x = 1.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))
x = -10.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))
x = 0.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))
x = 15.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))
x = -20.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))
Полный код
Полный код приведен ниже:
def relu(x):
return max(0.0, x)
x = 1.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))
x = -10.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))
x = 0.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))
x = 15.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))
x = -20.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))
Выход :
Applying Relu on (1.0) gives 1.0
Applying Relu on (-10.0) gives 0.0
Applying Relu on (0.0) gives 0.0
Applying Relu on (15.0) gives 15.0
Applying Relu on (-20.0) gives 0.0
Градиент функции ReLu
Давайте посмотрим, каким будет градиент (производная) функции ReLu. При дифференцировании получим следующую функцию:
f'(x) = 1, x>=0
= 0, x<0
Мы видим, что для значений x меньше нуля градиент равен 0. Это означает, что веса и смещения для некоторых нейронов не обновляются. Это может быть проблемой в тренировочном процессе.
Чтобы решить эту проблему, у нас есть функция Leaky ReLu. Давайте узнаем об этом дальше.
Дырявая функция ReLu
Функция Leaky ReLu — это импровизация обычной функции ReLu. Чтобы решить проблему нулевого градиента для отрицательного значения, Leaky ReLu дает чрезвычайно маленькую линейную составляющую x отрицательным входам.
Математически мы можем выразить Leaky ReLu как:
f(x)= 0.01x, x<0
= x, x>=0
Математически:
- f(x)=1 (x<0)
- (αx)+1 (x>=0)(x)
Здесь a – небольшая константа, такая как 0,01, которую мы взяли выше.
Графически это можно представить так:
Градиент Leaky ReLu
Давайте посчитаем градиент для функции Leaky ReLu. Градиент может быть:
f'(x) = 1, x>=0
= 0.01, x<0
В этом случае градиент для отрицательных входных данных отличен от нуля. Это означает, что все нейроны будут обновлены.
Реализация дырявого ReLu в Python
Реализация Leaky ReLu приведена ниже:
def relu(x):
if x>0 :
return x
else :
return 0.01*x
Давайте попробуем это на месте.
x = 1.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))
x = -10.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))
x = 0.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))
x = 15.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))
x = -20.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))
Полный код
Полный код Leaky ReLu приведен ниже:
def leaky_relu(x):
if x>0 :
return x
else :
return 0.01*x
x = 1.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))
x = -10.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))
x = 0.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))
x = 15.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))
x = -20.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))
Выход :
Applying Leaky Relu on (1.0) gives 1.0
Applying Leaky Relu on (-10.0) gives -0.1
Applying Leaky Relu on (0.0) gives 0.0
Applying Leaky Relu on (15.0) gives 15.0
Applying Leaky Relu on (-20.0) gives -0.2
Заключение
Это руководство было посвящено функции ReLu в Python. Мы также видели улучшенную версию функции ReLu. Leaky ReLu решает проблему нулевых градиентов для отрицательных значений в функции ReLu.