Я пытаюсь понять роль производной сигмовидной функции в нейронных сетях.
Сначала я строю сигмовидную функцию и производную всех точек из определения, используя python. Какова роль этой производной?
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def derivative(x, step):
return (sigmoid(x+step) - sigmoid(x)) / step
x = np.linspace(-10, 10, 1000)
y1 = sigmoid(x)
y2 = derivative(x, 0.0000000000001)
plt.plot(x, y1, label='sigmoid')
plt.plot(x, y2, label='derivative')
plt.legend(loc='upper left')
plt.show()
machine-learning
neural-network
lukassz
источник
источник
Ответы:
Использование производных в нейронных сетях для учебного процесса называется обратным распространением . Этот метод использует градиентный спуск , чтобы найти оптимальный набор параметров модели, чтобы минимизировать функцию потерь. В вашем примере вы должны использовать производную сигмоида, потому что это активация, которую используют ваши отдельные нейроны.
Функция потерь
Суть машинного обучения состоит в том, чтобы оптимизировать функцию стоимости так, чтобы мы могли либо минимизировать, либо максимизировать некоторую целевую функцию. Обычно это называется функцией потерь или затрат. Обычно мы хотим минимизировать эту функцию. Функция стоимости, , связывает некоторое наказание на основе возникающих ошибок при передаче данных через вашу модель как функцию параметров модели.C
Давайте посмотрим на пример, где мы пытаемся пометить, содержит ли изображение кошку или собаку. Если у нас есть идеальная модель, мы можем дать модели фотографию, и она скажет нам, кошка это или собака. Однако ни одна модель не идеальна, и она будет ошибаться.
Когда мы тренируем нашу модель, чтобы иметь возможность выводить значение из входных данных, мы хотим минимизировать количество ошибок, которые она допускает. Таким образом, мы используем тренировочный набор, эти данные содержат много изображений собак и кошек, и у нас есть метка правдивости, связанная с этим изображением. Каждый раз, когда мы проводим обучающую итерацию модели, мы рассчитываем стоимость (количество ошибок) модели. Мы хотим минимизировать эту стоимость.
Существует множество функций стоимости, каждая из которых служит своей цели. Общая функция стоимости, которая используется, является квадратичной стоимостью, которая определяется как
Это квадрат разницы между предсказанной меткой и меткой наземной правды для изображений, которые мы изучали. Мы хотим минимизировать это каким-то образом.N
Минимизация потерь
Действительно, большинство машинного обучения - это просто семейство платформ, которые способны определять распределение путем минимизации некоторой функции стоимости. Вопрос, который мы можем задать: «Как мы можем минимизировать функцию»?
Давайте минимизировать следующую функцию
Если мы построим это, то увидим, что при существует минимум . Чтобы сделать это аналитически, мы можем взять производную этой функции какx=2
Однако зачастую поиск глобального минимума аналитически невозможен. Поэтому вместо этого мы используем некоторые методы оптимизации. Здесь также существует много разных способов, таких как: Ньютон-Рафсон, поиск по сетке и т. Д. Среди них градиентный спуск . Это техника, используемая нейронными сетями.
Градиентный спуск
Давайте используем известную аналогию, чтобы понять это. Представьте себе проблему минимизации 2D. Это равносильно горному походу в пустыню. Вы хотите вернуться в деревню, которая, как вы знаете, находится в самой низкой точке. Даже если вы не знаете основных направлений деревни. Все, что вам нужно сделать, это постоянно идти по крутому пути вниз, и вы в конечном итоге доберетесь до деревни. Таким образом, мы будем спускаться по поверхности в зависимости от крутизны склона.
Давайте возьмем нашу функцию
мы определим для которого минимизирован. Алгоритм градиентного спуска сначала говорит, что мы выберем случайное значение для . Начнем с . Тогда алгоритм будет делать следующее итеративно, пока мы не достигнем сходимости.у х х = 8x Y Икс х = 8
где - это скорость обучения, мы можем установить любое значение, которое нам понравится. Однако есть разумный способ выбрать это. Слишком большой, и мы никогда не достигнем нашего минимального значения, а слишком большой, мы потратим слишком много времени, прежде чем попадем туда. Это аналогично размеру ступеней, которые вы хотите спуститься по крутому склону. Маленькие шаги, и ты умрешь на горе, ты никогда не спустишься. Слишком большой шаг, и вы рискуете застрелить деревню и оказаться на другой стороне горы. Производная - это средство, с помощью которого мы движемся по этому склону к нашему минимуму.ν
Итерация 1:
x n e w = 6,8 - 0,1 ( 2 * 6,8 - 4 ) = 5,84 x n e w = 5,84 - 0,1 ( 2 * 5,84 - 4 ) = 5,07 x n e w = 5,07 - 0,1Иксn e w= 8 - 0,1 ( 2 * 8 - 4 ) = 6,8
Иксn e w= 6,8 - 0,1 ( 2 * 6,8 - 4 ) = 5,84
Иксn e w= 5,84 - 0,1 ( 2 * 5,84 - 4 ) = 5,07 Иксn e w= 5,07 - 0,1 ( 2 * 5,07 - 4 ) = 4,45
Иксn e w=4.45−0.1(2∗4.45−4)=3.96
xnew=3.96−0.1(2∗3.96−4)=3.57 xnew=3.57−0.1(2∗3.57−4)=3.25
xnew=3.25−0.1(2∗3.25−4)=3.00
xnew=3.00−0.1(2∗3.00−4)=2.80
xnew=2.80−0.1(2∗2.80−4)=2.64 xnew=2.64−0.1(2∗2.64−4)=2.51
xnew=2.51−0.1(2∗2.51−4)=2.41
xnew=2.41−0.1(2∗2.41−4)=2.32 xnew=2.32−0.1(2∗2.32−4)=2.26
xnew=2.26−0.1(2∗2.26−4)=2.21
xnew=2.21−0.1(2∗2.21−4)=2.16
xnew=2.16−0.1(2∗2.16−4)=2.13 xnew=2.13−0.1(2∗2.13−4)=2.10
xnew=2.10−0.1(2∗2.10−4)=2.08
xnew=2.08−0.1(2∗2.08−4)=2.06 xnew=2.06−0.1(2∗2.06−4)=2.05
xnew=2.05−0.1(2∗2.05−4)=2.04
xnew=2.04−0.1(2∗2.04−4)=2.03 xnew=2.03−0.1(2∗2.03−4)=2.02
xnew=2.02−0.1(2∗2.02−4)=2.02
xnew=2.02−0.1(2∗2.02−4)=2.01
xnew=2.01−0.1(2∗2.01−4)=2.01 xnew=2.01−0.1(2∗2.01−4)=2.01
xnew=2.01−0.1(2∗2.01−4)=2.00
xnew=2.00−0.1(2∗2.00−4)=2.00
xnew=2.00−0.1(2∗2.00−4)=2.00
xnew=2.00−0.1(2∗2.00−4)=2.00
xnew=2.00−0.1(2∗2.00−4)=2.00
x n e w = 4,45 - 0,1 ( 2 * 4,45 - 4 ) = 3,96 x n e w = 3,96 - 0,1 ( 2 * 3,96 - 4 ) = 3,57 x n e w = 3,57 - 0,1 ( 2 * 3,57 - 4 )
x n e w = 3,25 - 0,1 ( 2 * 3,25 - 4 ) = 3,00 x n e w = 3,00 - 0,1 ( 2 * 3,00 - 4 ) = 2,80 x n e w = 2,80 - 0,1 ( 2 * 2,80 - 4) ) = 2,64 x n e w =
x n e w = 2,51 - 0,1 ( 2 * 2,51 - 4 ) = 2,41 x n e w = 2,41 - 0,1 ( 2 * 2,41 - 4 ) = 2,32 x n e w = 2,32 - 0,1 ( 2 * 2,32
x n e w = 2,26 - 0,1 ( 2 ∗ 2,26 - 4 ) = 2,21 x n e w = 2,21 - 0,1 ( 2 ∗ 2,21 - 4 ) = 2,16 x n e w = 2,16 - 0,1 ( 2 ∗ 2,16 - 4 ) = 2,13 x n
x n e w =2,10-0,1(2*2,10-4)=2,08 x n e w =2,08-0,1(2*2,08-4)=2,06 x n e w =2,06-0,1(
x n e w = 2,05 - 0,1 ( 2 * 2,05 - 4 ) = 2,04 x n e w = 2,04 - 0,1 ( 2 * 2,04 - 4 ) = 2,03 x n e w = 2,03 - 0,1 ( 2 * 2,03 - 4 ) =
x n e w = 2,02 - 0,1 ( 2 * 2,02 - 4 ) = 2,02 x n e w = 2,02 - 0,1 ( 2 * 2,02 - 4 ) = 2,01 x n e w = 2,01 - 0,1 ( 2 * 2,01 - 4 ) = 2,01 x n e w = 2,01
x n e w = 2,01 - 0,1 ( 2 * 2,01 - 4 ) = 2,00 x n e w = 2,00 - 0,1 ( 2 * 2,00 - 4 ) = 2,00 x n e w = 2,00 - 0,1 ( 2 * 2,00 -
И мы видим, что алгоритм сходится при ! Мы нашли минимум.x=2
Применяется к нейронным сетям
Первые нейронные сети имели только один нейрон, который принимал некоторые входные данные и затем предоставлял выходные данные . Общей используемой функцией является сигмовидная функцияx y^
где - связанный вес для каждого входа и мы имеем смещение . Затем мы хотим минимизировать нашу функцию стоимостиw x b
Как тренировать нейронную сеть?
Мы будем использовать градиентный спуск для обучения веса , основанный на выходе сигмовидной функции , и мы будем использовать некоторые функции стоимости и поезд на пакетах данных размера .C N
и мы имеем, что а производная сигмоидальной функции - таким образом, мы имеем,y^=σ(wTx) ∂σ(z)∂z=σ(z)(1−σ(z))
Таким образом, мы можем затем обновить вес через градиентный спуск как
где - скорость обучения.η
источник
Одна из причин популярности сигмоидальной функции в нейронных сетях заключается в том, что ее производная легко вычисляется .
источник
Простыми словами:
Например, если входное значение равно 0 или 1 или -2 , производная («способность к обучению») является высокой, и обратное распространение значительно улучшит вес нейрона для этого образца.
С другой стороны, если input равен 20 , производная будет очень близка к 0 . Это означает, что обратное распространение на этом образце не «научит» этот нейрон производить лучший результат.
Вышеуказанные условия действительны для одного образца.
Давайте посмотрим на общую картину для всех образцов в тренировочном наборе. Здесь у нас есть несколько ситуаций:
Если производная равна 0 для всех образцов в вашем тренировочном наборе, и нейрон всегда дает правильные результаты - это означает, что нейрон изучал очень хорошо и уже настолько умный, насколько это возможно (примечание: это хороший случай, но он может указывать на потенциальное переобучение, которое не хорошо)
Если производная равна 0 на некоторых образцах, отличная от 0 на других образцах И нейрон дает смешанные результаты - это указывает на то, что этот нейрон выполняет хорошую работу и потенциально может улучшиться после дальнейшего обучения (хотя это не обязательно, поскольку это зависит от других нейронов и данных обучения, которые вы иметь)
Итак, когда вы смотрите на производный график, вы можете увидеть, насколько нейрон подготовлен к изучению и усвоению новых знаний, учитывая конкретный вклад.
источник
Производная, которую вы видите здесь, важна для нейронных сетей. Это причина, почему люди обычно предпочитают что-то еще, такое как выпрямленная линейная единица .
Вы видите падение производной для двух концов? Что если ваша сеть находится на самой левой стороне, но она должна двигаться на правой стороне? Представьте, что вы на -10.0, но вы хотите 10.0. Градиент будет слишком мал для вашей сети, чтобы быстро сходиться. Мы не хотим ждать, мы хотим более быстрой конвергенции. У RLU нет этой проблемы.
Мы называем эту проблему « Нейронная сеть насыщения ».
Пожалуйста, смотрите https://www.quora.com/What-is-special-about-rectifier-neural-units-used-in-NN-learning
источник