Функция ReLu в Python

Relu или Rectified Linear Activation Function – самый распространенный выбор функции активации в мире глубокого обучения. Relu обеспечивает передовые результаты и при этом вычислительно очень эффективен.

Основная концепция функции активации Relu следующая:

Return 0 if the input is negative otherwise return the input as it is.

Мы можем математически представить ее следующим образом:

Relu Function

Псевдокод для 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. Давайте узнаем о ней дальше.

Функция Leaky 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

Давайте вычислим градиент для функции Leaky ReLu. Градиент может получиться таким:

f'(x) = 1,  x>=0
      = 0.01, x<0

В этом случае градиент для отрицательных входов ненулевой. Это означает, что все нейроны будут обновлены.

Реализация Leaky 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.

Source:
https://www.digitalocean.com/community/tutorials/relu-function-in-python