Ролевая производная сигмоидальной функции в нейронных сетях

18

Я пытаюсь понять роль производной сигмовидной функции в нейронных сетях. введите описание изображения здесь

Сначала я строю сигмовидную функцию и производную всех точек из определения, используя 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()
lukassz
источник
2
Если у вас есть еще вопросы, не стесняйтесь спрашивать
JahKnows

Ответы:

23

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


Функция потерь

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

Давайте посмотрим на пример, где мы пытаемся пометить, содержит ли изображение кошку или собаку. Если у нас есть идеальная модель, мы можем дать модели фотографию, и она скажет нам, кошка это или собака. Однако ни одна модель не идеальна, и она будет ошибаться.

Когда мы тренируем нашу модель, чтобы иметь возможность выводить значение из входных данных, мы хотим минимизировать количество ошибок, которые она допускает. Таким образом, мы используем тренировочный набор, эти данные содержат много изображений собак и кошек, и у нас есть метка правдивости, связанная с этим изображением. Каждый раз, когда мы проводим обучающую итерацию модели, мы рассчитываем стоимость (количество ошибок) модели. Мы хотим минимизировать эту стоимость.

Существует множество функций стоимости, каждая из которых служит своей цели. Общая функция стоимости, которая используется, является квадратичной стоимостью, которая определяется как

Сзнак равно1NΣязнак равно0N(Y^-Y)2 .

Это квадрат разницы между предсказанной меткой и меткой наземной правды для изображений, которые мы изучали. Мы хотим минимизировать это каким-то образом.N

Минимизация потерь

Действительно, большинство машинного обучения - это просто семейство платформ, которые способны определять распределение путем минимизации некоторой функции стоимости. Вопрос, который мы можем задать: «Как мы можем минимизировать функцию»?

Давайте минимизировать следующую функцию

Yзнак равноИкс2-4Икс+6 .

Если мы построим это, то увидим, что при существует минимум . Чтобы сделать это аналитически, мы можем взять производную этой функции какИксзнак равно2

dYdИксзнак равно2Икс-4знак равно0

Иксзнак равно2 .

Однако зачастую поиск глобального минимума аналитически невозможен. Поэтому вместо этого мы используем некоторые методы оптимизации. Здесь также существует много разных способов, таких как: Ньютон-Рафсон, поиск по сетке и т. Д. Среди них градиентный спуск . Это техника, используемая нейронными сетями.

Градиентный спуск

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

Давайте возьмем нашу функцию

y=x24x+6

мы определим для которого минимизирован. Алгоритм градиентного спуска сначала говорит, что мы выберем случайное значение для . Начнем с . Тогда алгоритм будет делать следующее итеративно, пока мы не достигнем сходимости.у х х = 8xYИксИксзнак равно8

ИксNевесзнак равноИксоLd-νdYdИкс

где - это скорость обучения, мы можем установить любое значение, которое нам понравится. Однако есть разумный способ выбрать это. Слишком большой, и мы никогда не достигнем нашего минимального значения, а слишком большой, мы потратим слишком много времени, прежде чем попадем туда. Это аналогично размеру ступеней, которые вы хотите спуститься по крутому склону. Маленькие шаги, и ты умрешь на горе, ты никогда не спустишься. Слишком большой шаг, и вы рискуете застрелить деревню и оказаться на другой стороне горы. Производная - это средство, с помощью которого мы движемся по этому склону к нашему минимуму.ν

dYdИксзнак равно2Икс-4

νзнак равно0,1

Итерация 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евесзнак равно8-0,1(2*8-4)знак равно6,8
ИксNевесзнак равно6,8-0,1(2*6,8-4)знак равно5,84
ИксNевесзнак равно5,84-0,1(2*5,84-4)знак равно5,07
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 )ИксNевесзнак равно5,07-0,1(2*5,07-4)знак равно4,45
xnew=4.450.1(24.454)=3.96
xnew=3.960.1(23.964)=3.57
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 =xnew=3.570.1(23.574)=3.25
xnew=3.250.1(23.254)=3.00
xnew=3.000.1(23.004)=2,80
xnew=2.800.1(22.804)=2.64
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,32xnew=2.640.1(22.644)=2.51
xnew=2.510.1(22.514)=2.41
xnew=2.410.1(22.414)=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 nxnew=2.320.1(22.324)=2.26
xnew=2.260.1(22.264)=2.21
xnew=2.210.1(22.214)=2.16
xnew=2.160.1(22.164)=2.13
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(xnew=2.130.1(22.134)=2.10
xnew=2.100.1(22.104)=2.08
xnew=2.080.1(22.084)=2.06
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 ) =xnew=2.060.1(22.064)=2.05
xnew=2.050.1(22.054)=2.04
xnew=2.040.1(22.044)=2.03
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,01xnew=2.030.1(22.034)=2.02
xnew=2.020.1(22.024)=2.02
xnew=2.020.1(22.024)=2.01
xnew=2.010.1(22.014)=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 -xnew=2.010.1(22.014)=2.01
xnew=2.010.1(22.014)=2.00
xnew=2.000.1(22.004)=2.00
xnew=2.000.1(22.004)=2.00
xnew=2.000.1(22.004)=2.00
xnew=2.000.1(22.004)=2.00

И мы видим, что алгоритм сходится при ! Мы нашли минимум.x=2


Применяется к нейронным сетям

Первые нейронные сети имели только один нейрон, который принимал некоторые входные данные и затем предоставлял выходные данные . Общей используемой функцией является сигмовидная функцияxy^

σ(z)=11+exp(z)

y^(wTx)=11+exp(wTx+b)

где - связанный вес для каждого входа и мы имеем смещение . Затем мы хотим минимизировать нашу функцию стоимостиwxb

C=12Ni=0N(y^y)2 .

Как тренировать нейронную сеть?

Мы будем использовать градиентный спуск для обучения веса , основанный на выходе сигмовидной функции , и мы будем использовать некоторые функции стоимости и поезд на пакетах данных размера .CN

C=12NiN(y^y)2

y^ - это прогнозируемый класс, полученный из сигмоидальной функции, а - метка истинности земли. Мы будем использовать градиентный спуск, чтобы минимизировать функцию стоимости по отношению к весам . Чтобы облегчить жизнь, мы разделим производную следующим образомyw

Cw=Cy^y^w .

Cy^=y^y

и мы имеем, что а производная сигмоидальной функции - таким образом, мы имеем,y^=σ(wTx)σ(z)z=σ(z)(1σ(z))

y^w=11+exp(wTx+b)(111+exp(wTx+b)) .

Таким образом, мы можем затем обновить вес через градиентный спуск как

wnew=woldηCw

где - скорость обучения.η

JahKnows
источник
2
пожалуйста, скажите мне, почему этот процесс не так хорошо описан в книгах? У вас есть блог? Какие материалы для обучения нейронным сетям вы рекомендуете? У меня есть данные испытаний, и я хочу их тренировать. Можно ли нарисовать функцию, которую я буду минимизировать? Я хотел бы визуализировать этот процесс, чтобы лучше понять его.
Лукас
Можете ли вы объяснить обратное распространение таким простым способом?
Лукас
1
Удивительный ответ ... (+ 1)
Адитья,
1
Backprop также похоже на то, что JahKnows объяснил выше ... Его градиент передается на входы прямо с выходов. Быстрый поиск в Google прояснит это. То же самое касается и всех других функций активации. ..
Адитья
1
Cw=(y^y)derivative of sigmoidy^yy^y
2

ИксWИкс+бσ(WИкс+б)

Y^Y L(Y,Y^)знак равноL(Y,σ(WИкс+б))Wб

Wб

Одна из причин популярности сигмоидальной функции в нейронных сетях заключается в том, что ее производная легко вычисляется .

М Сеф
источник
1

Простыми словами:

Производная показывает способность нейрона учиться на конкретном входе.

Например, если входное значение равно 0 или 1 или -2 , производная («способность к обучению») является высокой, и обратное распространение значительно улучшит вес нейрона для этого образца.

С другой стороны, если input равен 20 , производная будет очень близка к 0 . Это означает, что обратное распространение на этом образце не «научит» этот нейрон производить лучший результат.

Вышеуказанные условия действительны для одного образца.

Давайте посмотрим на общую картину для всех образцов в тренировочном наборе. Здесь у нас есть несколько ситуаций:

  • Если производная равна 0 для всех образцов в вашем тренировочном наборе, и нейрон всегда дает неправильные результаты - это означает, что нейрон насыщен (немой) и не улучшится.
  • Если производная равна 0 для всех образцов в вашем тренировочном наборе, и нейрон всегда дает правильные результаты - это означает, что нейрон изучал очень хорошо и уже настолько умный, насколько это возможно (примечание: это хороший случай, но он может указывать на потенциальное переобучение, которое не хорошо)

  • Если производная равна 0 на некоторых образцах, отличная от 0 на других образцах И нейрон дает смешанные результаты - это указывает на то, что этот нейрон выполняет хорошую работу и потенциально может улучшиться после дальнейшего обучения (хотя это не обязательно, поскольку это зависит от других нейронов и данных обучения, которые вы иметь)

Итак, когда вы смотрите на производный график, вы можете увидеть, насколько нейрон подготовлен к изучению и усвоению новых знаний, учитывая конкретный вклад.

VeganHunter
источник
0

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

Вы видите падение производной для двух концов? Что если ваша сеть находится на самой левой стороне, но она должна двигаться на правой стороне? Представьте, что вы на -10.0, но вы хотите 10.0. Градиент будет слишком мал для вашей сети, чтобы быстро сходиться. Мы не хотим ждать, мы хотим более быстрой конвергенции. У RLU нет этой проблемы.

Мы называем эту проблему « Нейронная сеть насыщения ».

Пожалуйста, смотрите https://www.quora.com/What-is-special-about-rectifier-neural-units-used-in-NN-learning

SmallChess
источник