Поиск по сайту:

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