Разное

Обратное распространение ошибки в нейронных сетях: Алгоритм обучения многослойной нейронной сети методом обратного распространения ошибки (Backpropagation)

Содержание

Метод обратного распространения ошибки: математика, примеры, код

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

Обновление правила цепочки

Прямое распространение можно рассматривать как длинный ряд вложенных уравнений. Если вы так думаете о прямом распространении, то обратное распространение — это просто приложение правила цепочки (дифференцирования сложной функции) для поиска производных потерь по любой переменной во вложенном уравнении. С учётом функции прямого распространения:

f(x)=A(B(C(x)))

A, B, и C — функции активации на различных слоях. Пользуясь правилом цепочки, мы легко вычисляем производную f(x) по x:

f′(x)=f′(A)⋅A′(B)⋅B′(C)⋅C′(x)

Что насчёт производной относительно B? Чтобы найти производную по B, вы можете сделать вид, что B (C(x)) является константой, заменить ее переменной-заполнителем B, и продолжить поиск производной по B стандартно.

f′(B)=f′(A)⋅A′(B)

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

Применение правила цепочки

Давайте используем правило цепочки для вычисления производной потерь по любому весу в сети. Правило цепочки поможет нам определить, какой вклад каждый вес вносит в нашу общую ошибку и направление обновления каждого веса, чтобы уменьшить ошибку. Вот уравнения, которые нужны, чтобы сделать прогноз и рассчитать общую ошибку или потерю:

Учитывая сеть, состоящую из одного нейрона, общая потеря нейросети может быть рассчитана как:

Cost=C(R(Z(XW)))

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

C′(W)=C′(R)⋅R′(Z)⋅Z′(W)=(y^−y)⋅R′(Z)⋅X

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

Какова производная от потери по Wo?

C′(WO)=C′(y^)⋅y^′(ZO)⋅Z′O(WO)=(y^−y)⋅R′(ZO)⋅H

А что насчет Wh? Чтобы узнать это, мы просто продолжаем возвращаться в нашу функцию, рекурсивно применяя правило цепочки, пока не доберемся до функции, которая имеет элемент Wh.

C′(Wh)=C′(y^)⋅O′(Zo)⋅Z′o(H)⋅H′(Zh)⋅Z′h(Wh)=(y^−y)⋅R′(Zo)⋅Wo⋅R′(Zh)⋅X

И просто забавы ради, что, если в нашей сети было бы 10 скрытых слоев. Что такое производная потери для первого веса w1?

C(w1)=(dC/dy^)⋅(dy^/dZ11)⋅(dZ11/dh20)⋅(dh20/dZ10)⋅(dZ10/dH9)⋅(dH9/dZ9)⋅(dZ9/dH8)⋅(dH8/dZ8)⋅(dZ8/dH7)⋅(dH7/dZ7)⋅(dZ7/dH6)⋅(dH6/dZ6)⋅(dZ6/dH5)⋅(dH5/dZ5)⋅(dZ5/dh5)⋅(dh5/dZ4)⋅(dZ4/dh4)⋅(dh4/dZ3)⋅(dZ3/dh3)⋅(dh3/dZ2)⋅(dZ2/dh2)⋅(dh2/dZ1)⋅(dZ1/dW1)

Заметили закономерность? Количество вычислений, необходимых для расчёта производных потерь, увеличивается по мере углубления нашей сети. Также обратите внимание на избыточность в наших расчетах производных. Производная потерь каждого слоя добавляет два новых элемента к элементам, которые уже были вычислены слоями над ним. Что, если бы был какой-то способ сохранить нашу работу и избежать этих повторяющихся вычислений?

Сохранение работы с мемоизацией

Мемоизация — это термин в информатике, имеющий простое значение: не пересчитывать одно и то же снова и снова. В мемоизации мы сохраняем ранее вычисленные результаты, чтобы избежать пересчета одной и той же функции. Это удобно для ускорения рекурсивных функций, одной из которых является обратное распространение. Обратите внимание на закономерность в уравнениях производных приведённых ниже.

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

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

Примечание: термин ошибка слоя относится к производной потерь по входу в слой. Он отвечает на вопрос: как изменяется выход функции потерь при изменении входа в этот слой?

Ошибка выходного слоя

Для расчета ошибки выходного слоя необходимо найти производную потерь по входу выходному слою, Zo. Это отвечает на вопрос: как веса последнего слоя влияют на общую ошибку в сети?  Тогда производная такова:

C′(Zo)=(y^−y)⋅R′(Zo)

Чтобы упростить запись, практикующие МО обычно заменяют последовательность (y^−y)∗R'(Zo) термином Eo. Итак, наша формула для ошибки выходного слоя равна:

Eo=(y^−y)⋅R′(Zo)

Ошибка скрытого слоя

Для вычисления ошибки скрытого слоя нужно найти производную потерь по входу скрытого слоя, Zh.

C′(Zh)=(y^−y)⋅R′(Zo)⋅Wo⋅R′(Zh)

Далее мы можем поменять местами элемент Eo выше, чтобы избежать дублирования и создать новое упрощенное уравнение для ошибки скрытого слоя:

Eh=Eo⋅Wo⋅R′(Zh)

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

Производная потерь по любому весу

Вернемся к нашей формуле для производной потерь по весу выходного слоя Wo.

C′(WO)=(y^−y)⋅R′(ZO)⋅H

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

C′(Wo)=Eo⋅H

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

C′(w)=CurrentLayerError⋅CurrentLayerInput

Примечание: вход относится к активации с предыдущего слоя, а не к взвешенному входу, Z.

Подводя итог

Вот последние 3 уравнения, которые вместе образуют основу обратного распространения.

Вот процесс, визуализированный с использованием нашего примера нейронной сети выше:

Обратное распространение: пример кода

def relu_prime(z):
if z > 0:
return 1
return 0

def cost(yHat, y):
return 0.5 * (yHat - y)**2

def cost_prime(yHat, y):
return yHat - y

def backprop(x, y, Wh, Wo, lr):
yHat = feed_forward(x, Wh, Wo)

# Layer Error
Eo = (yHat - y) * relu_prime(Zo)
Eh = Eo * Wo * relu_prime(Zh)

# Cost derivative for weights
dWo = Eo * H
dWh = Eh * x

# Update weights
Wh -= lr * dWh
Wo -= lr * dWo

Обучение нейронной сети. Алгоритм обратного распространения ошибки.

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

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

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

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

Дельта правило (правило Видроу-Хоффа).

Определим ошибку \delta:

\delta = y_0\medspace-\medspace y

Здесь у нас y_0 – это ожидаемый (истинный) вывод сети, а y – это реальный вывод (активность) выходного элемента. Помимо выходного элемента ошибки можно определить и для всех элементов скрытого слоя нейронной сети, об этом мы поговорим чуть позже.

Дельта-правило заключается в следующем – изменение величины весового коэффициента должно быть равно:

\Delta w_{jk} = \eta\medspace\delta_k\medspace x_j

Где \eta – норма обучения. Это число мы сами задаем перед началом обучения. x_j – это сигнал, приходящий к элементу k от элемента j. А \delta_k – ошибка элемента k.

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

С корректировкой весов все понятно, осталось определить, каким именно образом и по какому алгоритму будут происходить расчеты при обучении сети. Давайте рассмотрим обучение по алгоритму обратного распространения ошибки.

Алгоритм обратного распространения ошибки.

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

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

Я, пожалуй, не буду приводить математические выводы и расчеты (несмотря на мою любовь к математике 🙂 ), чтобы не перегружать статью, ограничимся только итоговыми результатами:

\delta_j = f{\Large{\prime}}(net_j)\medspace\cdot\medspace \sum_{k}{}{\delta_k\medspace w_{jk}}

Функция f(x) – это функция активности элемента. Давайте использовать логистическую функцию, для нее:

f{\Large{\prime}}(net_j) = f(net_j)\medspace (1\medspace-\medspace f(net_j))

Подставляем в предыдущую формулу и получаем величину ошибки:

\delta_j = f(net_j)\medspace (1\medspace-\medspace f(net_j))\medspace \sum_{k}{}{\delta_k\medspace w_{kj}}

В этой формуле:

  • \delta_j – ошибка элемента с индексом j
  • k – индекс, соответствующий слою, который посылает ошибку “обратно”
  • net_j – комбинированный ввод элемента
  • f(net_j) – активность элемента

Наверняка сейчас еще все это кажется не совсем понятным, но не переживайте, при рассмотрении практического примера все встанет на свои места! Собственно, давайте к нему и перейдем.

Обучение нейронной сети, практический пример.

Перед обучением сети необходимо задать начальные значения весов – обычно они инициализируются небольшими по величине случайными значениями, к примеру из интервала (-0.5, 0.5). Но для нашего примера возьмем для удобства целые числа.

Рассмотрим нейронную сеть  и вручную проведем расчеты для прямого и обратного “потоков” в сети.

На вход мы должны подать образец, пусть это будет (0.2, 0.5). Ожидаемый выход сети – 0.4. Норма обучения пусть будет равна 0.85. Давайте проведем все расчеты поэтапно. Кстати, совсем забыл, в качестве функции активности мы будем использовать логистическую функцию:

f(x) = \frac{1}{1 + e^{-x}}

Итак, приступаем! Вычислим комбинированный ввод элементов 2, 3 и 4:

net_2 = (-1)\cdot 0.2 + 2\cdot0.5 = 0.8

net_3 = 1\cdot 0.2 + 1\cdot 0.5 = 0.7

net_4 = (-2)\cdot 0.5 + 3\cdot 0.2 = -0.4

Активность этих элементов равна:

f(net_2) = 0.69

f(net_3) = 0.67

f(net_4) = 0.40

Комбинированный ввод пятого элемента:

net_5 = 0.69 + 0.67\cdot 2 + 0.4\cdot 4 = 3.63

Активность пятого элемента и в то же время вывод нейронной сети равен:

f(net_5) = 0.974

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

\delta_5 = (0.4\medspace-\medspace 0.974)\cdot f(net_5)\cdot (1\medspace-\medspace f(net_5))

\delta_5 = (0.4\medspace-\medspace 0.974)\cdot 0.974\cdot (1\medspace-\medspace 0.974)

\delta_5 = -0.014

Тогда ошибки для элементов 2, 3 и 4 равны соответственно:

\delta_j = \sum_{k}{}{\delta_k\medspace w_{jk}}\medspace f(net_j)\medspace (1\medspace-\medspace f(net_j))

\delta_2 = -0.014\cdot 0.69\medspace (1\medspace-\medspace 0.69) = -0.0029

\delta_3 = -0.028\cdot 0.67\medspace (1\medspace-\medspace 0.67) = -0.0061

\delta_4 = -0.056\cdot 0.40\medspace (1\medspace-\medspace 0.40) = -0.0134

Здесь значения -0.014, -0.028 и -0.056 получаются в результате прохода ошибки выходного элемента -0.014 по взвешенным связям в направлении к элементам 2, 3 и 4 соответственно.

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

\Delta w_{02} = 0.2\cdot (-0.0029)\cdot\medspace0.85

Аналогичным образом производим расчеты и для остальных элементов:

\Delta w_{03} = 0.2\cdot (-0.0061)\cdot\medspace 0.85

\Delta w_{04} = 0.2\cdot (-0.0134)\cdot\medspace 0.85

\Delta w_{12} = 0.5\cdot (-0.0029)\cdot\medspace 0.85

\Delta w_{13} = 0.5\cdot (-0.0061)\cdot\medspace 0.85

\Delta w_{14} = 0.5\cdot (-0.0134)\cdot\medspace 0.85

\Delta w_{25} = 0.69\cdot (-0.014)\cdot\medspace 0.85

\Delta w_{35} = 0.67\cdot (-0.014)\cdot\medspace 0.85

\Delta w_{45} = 0.40\cdot (-0.014)\cdot\medspace 0.85

Теперь новые весовые коэффициенты будут равны сумме предыдущего значения и величины поправки.

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

По просьбе читателей блога я решил добавить краткий пример обучения сети с двумя скрытыми слоями:

Итак, добавляем в нашу сеть два новых элемента (X и Y), которые теперь будут выполнять роль входных. На вход также подаем образец (0.2, 0.5). Рассмотрим алгоритм в данном случае:

1. Прямой проход сети. Здесь все точно также как и для сети с одним скрытым слоем. Результатом будет значение f(net_5).

2. Вычисляем ошибку выходного элемента:

\delta_5 = (0.4\medspace-\medspace f(net_5))\medspace f(net_5)\medspace (1\medspace-\medspace f(net_5))

3. Теперь нам нужно вычислить ошибки элементов 2, 3 и 4:

\delta_2 = \delta_5 \cdot 1 \cdot f(net_2) \cdot\medspace (1\medspace-\medspace f(net_2))

\delta_3 = \delta_5 \cdot 2 \cdot f(net_3) \cdot\medspace (1\medspace-\medspace f(net_3))

\delta_4 = \delta_5 \cdot 4 \cdot f(net_4) \cdot\medspace (1\medspace-\medspace f(net_4))

4. Давайте рассчитаем величину корректировки весов связей:

\Delta w_{25} = f(net_2)\cdot \delta_5 \cdot 0.85

\Delta w_{35} = f(net_3) \cdot \delta_5 \cdot 0.85

\Delta w_{45} = f(net_4) \cdot \delta_5 \cdot 0.85

В принципе, пункты 3 и 4 можно поменять местами, поскольку ошибки, рассчитанные на шаге 3 нам не потребовались для расчета величин корректировки весов.

5. Определяем ошибки элементов первого скрытого слоя (0 и 1):

\delta_0 = (\delta_2 \cdot (-1) + \delta_3 \cdot 1 + \delta_4 \cdot 3)\cdot f(net_0) \cdot\medspace (1\medspace-\medspace f(net_0))

\delta_1 = (\delta_2 \cdot 2 + \delta_3 \cdot 1 + \delta_4 \cdot (-2)) \cdot f(net_1) \cdot\medspace (1\medspace-\medspace f(net_1))

Здесь отличие заключается в том, что нам нужно просуммировать ошибки элементов 2, 3 и 4, которые “возвращаются” к элементам 0 и 1, с учетом связей между элементами.

6. Корректируем веса связей:

\Delta w_{02} = f(net_0) \cdot \delta_2 \cdot 0.85

\Delta w_{03} = f(net_0) \cdot \delta_3 \cdot 0.85

\Delta w_{04} = f(net_0) \cdot \delta_4 \cdot 0.85

\Delta w_{12} = f(net_1) \cdot\medspace \delta_2 \cdot 0.85

\Delta w_{13} = f(net_1) \cdot \delta_3 \cdot 0.85

\Delta w_{14} = f(net_1) \cdot \delta_4 \cdot 0.85

Здесь снова величины, рассчитанные на шаге 5 не фигурируют, они нам понадобятся чуть позже, а именно на шаге 7.

7. Определяем величины корректировки оставшихся весов:

\Delta w_{X0} = 0.2 \cdot \delta_0 \cdot 0.85

\Delta w_{X1} = 0.2 \cdot \delta_1 \cdot 0.85

\Delta w_{Y0} = 0.5 \cdot \delta_0 \cdot 0.85

\Delta w_{Y1} = 0.5 \cdot \delta_1 \cdot 0.85

Поскольку элементы X и Y – входные, здесь мы используем значения 0.2 и 0.5, которые соответствуют подаваемому на вход образцу.

8. Собственно, на этом обратный проход завершен! 🙂

На этом сегодня мы закончим, до скорых встреч!

Знакомимся с методом обратного распространения ошибки

Всем привет! Новогодние праздники подошли к концу, а это значит, что мы вновь готовы делиться с вами полезным материалом. Перевод данной статьи подготовлен в преддверии запуска нового потока по курсу «Алгоритмы для разработчиков».

Поехали!


Метод обратного распространения ошибки – вероятно самая фундаментальная составляющая нейронной сети. Впервые он был описан в 1960-е и почти 30 лет спустя его популяризировали Румельхарт, Хинтон и Уильямс в статье под названием «Learning representations by back-propagating errors».

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

В этой статья я хотел бы подробно рассмотреть с точки зрения математики процесс обучения и оптимизации простой 4-х слойной нейронной сети. Я считаю, что это поможет читателю понять, как работает обратное распространение, а также осознать его значимость.

Определяем модель нейронной сети

Четырехслойная нейронная сеть состоит из четырех нейронов входного слоя, четырех нейронов на скрытых слоях и 1 нейрона на выходном слое.

Простое изображение четырехслойной нейронной сети.

Входной слой

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

Уравнение, описывающее входы xi.

Первый набор активаций (а) равен входным значениям. «Активация» — это значение нейрона после применения функции активации. Подробнее смотрите ниже.

Скрытые слои

Конечные значения в скрытых нейронах (на рисунке зеленого цвета) вычисляются с использованием zl – взвешенных входов в слое I и aI активаций в слое L. Для слоев 2 и 3 уравнения будут следующими:

Для l = 2:

Для l = 3:

W2 и W3 – это веса на слоях 2 и 3, а b2 и b3 – смещения на этих слоях.

Активации a2 и a3 вычисляются с помощью функции активации f. Например, эта функция f является нелинейной (как сигмоид, ReLU и гиперболический тангенс) и позволяет сети изучать сложные паттерны в данных. Мы не будем подробно останавливаться на том, как работают функции активации, но, если вам интересно, я настоятельно рекомендую прочитать эту замечательную статью.

Присмотревшись внимательно, вы увидите, что все x, z2, a2, z3, a3, W1, W2, b1 и b2 не имеют нижних индексов, представленных на рисунке четырехслойной нейронной сети. Дело в том, что мы объединили все значения параметров в матрицы, сгруппированные по слоям. Это стандартный способ работы с нейронными сетями, и он довольно комфортный. Однако я пройдусь по уравнениям, чтобы не возникло путаницы.

Давайте возьмем слой 2 и его параметры в качестве примера. Те же самые операции можно применить к любому слою нейронной сети.

W1 – это матрица весов размерности (n, m), где n – это количество выходных нейронов (нейронов на следующем слое), а m – число входных нейронов (нейронов в предыдущем слое). В нашем случае n = 2 и m = 4.

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

x – входной вектор размерностью (m, 1), где m – число входных нейронов. В нашем случае m = 4.

b1 – это вектор смещения размерности (n, 1), где n – число нейронов на текущем слое. В нашем случае n = 2.

Следуя уравнению для z2 мы можем использовать приведенные выше определения W1, x и b1 для получения уравнения z2:

Теперь внимательно посмотрите на иллюстрацию нейронной сети выше:

Как видите, z2 можно выразить через z12 и z22, где z12 и z22 – суммы произведений каждого входного значения xi на соответствующий вес Wij1.

Это приводит к тому же самому уравнению для z2 и доказывает, что матричные представления z2, a2, z3 и a3 – верны.

Выходной слой

Последняя часть нейронной сети – это выходной слой, который выдает прогнозируемое значение. В нашем простом примере он представлен в виде одного нейрона, окрашенного в синий цвет и рассчитываемого следующим образом:

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

Прямое распространение и оценка

Приведенные выше уравнения формируют прямое распространение по нейронной сети. Вот краткий обзор:

(1) – входной слой

(2) – значение нейрона на первом скрытом слое

(3) – значение активации на первом скрытом слое

(4) – значение нейрона на втором скрытом слое

(5) – значение активации на втором скрытом уровне

(6) – выходной слой

Заключительным шагом в прямом проходе является оценка прогнозируемого выходного значения s относительно ожидаемого выходного значения y.

Выходные данные y являются частью обучающего набора данных (x, y), где x – входные данные (как мы помним из предыдущего раздела).

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

Мы назовем эту функцию потерь С и обозначим ее следующим образом:

Где cost может равняться среднеквадратичной ошибке, перекрестной энтропии или любой другой функции потерь.

Основываясь на значении С, модель «знает», насколько нужно скорректировать ее параметры, чтобы приблизиться к ожидаемому выходному значению y. Это происходит с помощью метода обратного распространения ошибки.

Обратное распространение ошибки и вычисление градиентов

Опираясь на статью 1989 года, метод обратного распространения ошибки:

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

и
…дает возможность создавать полезные новые функции, что отличает обратное распространение от более ранних и простых методов…

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

Возникает один вопрос: Зачем вычислять градиенты?

Чтобы ответить на этот вопрос, нам сначала нужно пересмотреть некоторые понятия вычислений:

Градиентом функции С(x1, x2, …, xm) в точке x называется вектор частных производных С по x.

Производная функции С отражает чувствительность к изменению значения функции (выходного значения) относительно изменения ее аргумента х (входного значения). Другими словами, производная говорит нам в каком направлении движется С.

Градиент показывает, насколько необходимо изменить параметр x (в положительную или отрицательную сторону), чтобы минимизировать С.

Вычисление этих градиентов происходит с помощью метода, называемого цепным правилом.

Для одного веса (wjk)l градиент равен:

(1) Цепное правило

(2) По определению m – количество нейронов на l – 1 слое

(3) Вычисление производной

(4) Окончательное значение

Аналогичный набор уравнений можно применить к (bj)l
:

(1) Цепное правило

(2) Вычисление производной

(3) Окончательное значение


Общая часть в обоих уравнениях часто называется «локальным градиентом» и выражается следующим образом:

«Локальный градиент» можно легко определить с помощью правила цепи. Этот процесс я не буду сейчас расписывать.

Градиенты позволяют оптимизировать параметры модели:

Пока не будет достигнут критерий остановки выполняется следующее:

Алгоритм оптимизации весов и смещений (также называемый градиентным спуском)

  • Начальные значения w и b выбираются случайным образом.
  • Эпсилон (e) – это скорость обучения. Он определяет влияние градиента.
  • w и b – матричные представления весов и смещений.
  • Производная C по w или b может быть вычислена с использованием частных производных С по отдельным весам или смещениям.
  • Условие завершение выполняется, как только функция потерь минимизируется.

Заключительную часть этого раздела я хочу посвятить простому примеру, в котором мы рассчитаем градиент С относительно одного веса (w22)2.

Давайте увеличим масштаб нижней части вышеупомянутой нейронной сети:

Визуальное представление обратного распространения в нейронной сети

Вес (w22)2 соединяет (a2)2 и (z2)2, поэтому вычисление градиента требует применения цепного правила на (z2)3 и (a2)3:

Вычисление конечного значения производной С по (a2)3 требует знания функции С. Поскольку С зависит от (a2)3, вычисление производной должно быть простым.

Я надеюсь, что этот пример сумел пролить немного света на математику, стоящую за вычислением градиентов. Если захотите узнать больше, я настоятельно рекомендую вам посмотреть Стэндфордскую серию статей по NLP, где Ричард Сочер дает 4 замечательных объяснения обратного распространения.

Заключительное замечание

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

На этом все. Приглашаем всех на бесплатный вебинар по теме «Дерево отрезков: просто и быстро».

Алгоритм обратного распространения ошибки · Loginom Wiki

Синонимы: Алгоритм BackProp, Алгоритм Back Propagation, BackProp

Разделы: Алгоритмы

Loginom: Нейросеть (классификация) (обработчик), Нейросеть (регрессия) (обработчик)

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

В основе идеи алгоритма лежит использование выходной ошибки нейронной сети

E=12k∑i=1(y−y′)2

для вычисления величин коррекции весов нейронов в ее скрытых слоях, где k — число выходных нейронов сети, y — целевое значение, y′ — фактическое выходное значение. Алгоритм является итеративным и использует принцип обучения «по шагам» (обучение в режиме on-line), когда веса нейронов сети корректируются после подачи на ее вход одного обучающего примера.

На каждой итерации происходит два прохода сети — прямой и обратный. На прямом входной вектор распространяется от входов сети к ее выходам и формирует некоторый выходной вектор, соответствующий текущему (фактическому) состоянию весов. Затем вычисляется ошибка нейронной сети как разность между фактическим и целевым значениями. На обратном проходе эта ошибка распространяется от выхода сети к ее входам, и производится коррекция весов нейронов в соответствии с правилом:

Δwj,i(n)=−η∂Eav∂wij, (1)

где wj,i — вес i-й связи j-го нейрона, η — параметр скорости обучения, который позволяет дополнительно управлять величиной шага коррекции Δwj,i с целью более точной настройки на минимум ошибки и подбирается экспериментально в процессе обучения (изменяется в интервале от 0 до 1).

Учитывая, что выходная сумма j-го нейрона равна

Sj=n∑i=1wijxi,

можно показать, что

∂E∂wij=∂E∂Sj∂Sj∂wij=xi∂E∂Sj.

Из последнего выражения следует, что дифференциал ∂Sj активационной функции нейронов сети f(s) должен существовать и не быть равным нулю в любой точке, т.е. активационная функция должна быть дефференцируема на всей числовой оси. Поэтому для применения метода обратного распространения используют сигмоидальные активационные функции, например, логистическую или гиперболический тангенс.

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

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

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

Обучение «по эпохам» является более устойчивым к выбросам и аномальным значениям целевой переменной за счет усреднения ошибки по многим примерам. Но при этом повышается вероятность «застревания» алгоритма в локальных минимумах. Вероятность этого для обучения «по шагам» меньше, поскольку использование отдельных примеров создает «шум», который «выталкивает» алгоритм из ям градиентного рельефа.

К преимуществам алгоритма обратного распространения ошибки относятся простота реализации и устойчивость к аномалиям и выбросам в данных. К недостаткам можно отнести:

  • неопределенно долгий процесс обучения;
  • возможность «паралича сети», когда при больших значениях рабочая точка активационной функции оказывается в области насыщения сигмоиды и производная в выражении (1) становится близкой к 0, а коррекции весов практически не происходит и процесс обучения «замирает»;
  • уязвимость алгоритма к попаданию в локальные минимумы функции ошибки.

Впервые алгоритм был описан в 1974 г. А.И. Галушкиным, а также, независимо и одновременно, Полом Дж. Вербосом. Далее существенно развит в 1986 г. Дэвидом И. Румельхартом.

Алгоритм обратного распространения ошибки

Алгоритм обратного распространения ошибки является одним из методов обучения многослойных нейронных сетей прямого распространения, называемых также многослойными персептронами. Многослойные персептроны успешно применяются для решения многих сложных задач.

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

Рассмотрим работу алгоритма подробней. Допустим необходимо обучить следующую нейронную сеть, применив алгоритм обратного распространения ошибки:

На приведенном рисунке использованы следующие условные обозначения:

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

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

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

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

Алгоритм обратного распространения ошибки следующий:

  1. Инициализировать синаптические веса маленькими случайными значениями.
  2. Выбрать очередную обучающую пару из обучающего множества; подать входной вектор на вход сети.
  3. Вычислить выход сети.
  4. Вычислить разность между выходом сети и требуемым выходом (целевым вектором обучающей пары).
  5. Подкорректировать веса сети для минимизации ошибки (как см. ниже).
  6. Повторять шаги с 2 по 5 для каждого вектора обучающего множества до тех пор, пока ошибка на всем множестве не достигнет приемлемого уровня.

Операции, выполняемые шагами 2 и 3, сходны с теми, которые выполняются при функционировании уже обученной сети, т.е. подается входной вектор и вычисляется получающийся выход. Вычисления выполняются послойно. На рис. 1 сначала вычисляются выходы нейронов слоя (слой входной, а значит никаких вычислений в нем не происходит), затем они используются в качестве входов слоя , вычисляются выходы нейронов слоя , которые и образуют выходной вектор сети . Шаги 2 и 3 образуют так называемый «проход вперед», так как сигнал распространяется по сети от входа к выходу.

Шаги 4 и 5 составляют «обратный проход», здесь вычисляемый сигнал ошибки распространяется обратно по сети и используется для подстройки весов.

Рассмотрим подробней 5 шаг – корректировка весов сети. Здесь следует выделить два нижеописанных случая.

Случай 1. Корректировка синаптических весов выходного слоя

Например, для модели нейронной сети на рис. 1, это будут веса имеющие следующие обозначения: и . Определимся, что индексом будем обозначать нейрон, из которого выходит синаптический вес, а – нейрон в который входит:

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

Тогда, веса выходного слоя после коррекции будут равны:

где:

Приведем пример вычислений для синаптического веса :

Случай 2. Корректировка синаптических весов скрытого слоя

Для модели нейронной сети на рис. 1, это будут веса соответствующие слоям и . Определимся, что индексом будем обозначать нейрон из которого выходит синаптический вес, а – нейрон в который входит (обратите внимание на появление новой переменной ):

Введем величину , которая равна:

где:

  • – сумма от по .

Тогда, веса скрытых слоев после коррекции будут равны:

Приведем пример вычислений для синаптического веса :

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

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

Нейронные сети обратного распространения ошибки Текст научной статьи по специальности «Математика»

Нейронные сети обратного распространения ошибки

Д.Е. Романов

Южный федеральный Университет (РГУ), г. Ростов-на-Дону

Идея искусственных нейронных сетей (ИНС) возникла, как попытка описать процессы восприятия информации, происходящие в мозге человека. Как и мозг человека, ИНС состоит из множества соединенных друг с другом элементов — нейронов, которые имитируют нейроны головного мозга.

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

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

Тело

Входы Синапсы не^р0на Аксон Выход

Ч О-.

{ ) о

Рис. 1. Схема нейрона.

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

Таким образом, выход нейрона имеет следующий вид:

°=/ (Е )

7 5

где f(х) — т.н. активационная функция,

— вес 1 -го синапса,

а 1] — значение J -го входа нейрона.

Наиболее часто в качестве активационной функции используется сигмоид, который имеет следующий вид:

I ( х) = —1—

Основное достоинство этой функции в том, что она дифференцируема на всей оси абсцисс и имеет очень простую производную:

1′(х) = а/(х)(1 -1 (х))

При уменьшении параметра а сигмоид становится более пологим, вырождаясь в горизонтальную линию на уровне 0,5 при а = 0 . При увеличении а сигмоид все больше приближается к функции единичного скачка [1].

Как уже было сказано, здесь будут рассматриваться только многослойные нейросети. Такая сеть строится из нескольких слоев нейронов. В пределах слоя нейроны не связаны, однако между соседними слоями нейроны соединяются по принципу «каждый с каждым» так, что выходы предыдущего слоя являются входами следующего. Если же нужно подчеркнуть отсутствие связи между какими-либо нейронами, то просто полагают вес данного синапса равным нулю.

Рис. 2. Многослойная нейросеть.

Следует остановиться на том, что понимают под слоем сети. В результате неразвитой терминологии нейронных сетей прошлых лет, резкой критики и непонимания задач исследования нейросетей, а иногда и ложного освещения прессой, изначальный смысл этого понятия исказился. В разных трактовках одна и та же сеть может называться и однослойной, и многослойной [2]. Здесь стоит вспомнить, что входной слой состоит, по сути, из нейронов-рецепторов, а однослойная сеть, состоящая лишь из таких нейронов, будет бесполезна. Поэтому следует рассматривать сети, состоящие как минимум из двух слоев — клеток-рецепторов и нейронов выходного слоя.

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

Для того чтобы сеть могла функционировать, ее необходимо обучить. Одним из алгоритмов обучения сетей является метод обратного распространения ошибки. Впервые этот метод был описан в 1974 г. А.И. Галушкиным, а также независимо и одновременно Полем Дж. Вербосом. Далее существенно развит в 1986 г. Дэвидом И. Румельхартом, Дж. Е. Хинтоном и Рональдом Дж. Вильямсом и независимо и одновременно С. И. Барцевым

и В.А. Охониным (Красноярская группа). Это итеративный градиентный алгоритм, который используется с целью минимизации ошибки работы нейронной сети и получения желаемого выхода [3].

Существенным условием применимости метода является дифференцируемость активационной функции.

По сути, задача обучения НС сводится к нахождению некой функциональной зависимости 0 = Р (I) , где 1 — входной, а 0 — выходной векторы. В общем случае такая задача при ограниченном наборе входных данных имеет бесконечное множество решений

[1]. Для ограничения пространства поиска при обучении ставится задача минимизации целевой функции ошибки НС, которая находится, к примеру, по методу наименьших квадратов:

Е = 21« — °П )2

2 к

где

п 1

ок — значение к -го выхода нейросети,

¡к — целевое значение к -го выхода, п — номер последнего слоя.

Обучение нейросети производится методом градиентного спуска [4, с. 108], т.е. на каждой итерации изменение веса производится по формуле

к к п дЕ

1 1 + 9—г-

1,1 1,1 , >

где

9 — параметр, определяющий скорость обучения, к = 1..п — номер слоя.

дЕ = 1

Последняя задача сводится к вычислению частных производных ^к , п . Это

,1

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

дЕ д С1 ^

д 1 х (<: — °п )2

V2 к

Т. к. по определению

0п = I(ЖП0П-1 ) °» = 1 (Х ‘№»,к0к — )

к

пп

ЛАТ + у-к .

то 1 входит как множитель только в выражение 11 ~°1 . Это можно видеть из рис. 3.

о

о

Рис. 3.

д (2« — о;)21 = О при к * і

Тогда очевидно, что ^п

1,1

Остается рассмотреть лишь случай к =1.

V- °)2 ) = К — °п) ^ (п )=

дм;, У2

1->з

о; — о; )-А- (/£ <кОГ‘)1=« — о; х-а)о; (і — о; )о

і,к к к У

к 1 л

Напомним также, что все ° , к = 1 п нам известны (они получены при предъявлении обучаемого образа). Если сеть однослойная, то остается лишь скорректировать веса

п = п 9 дЕ

согласно формуле ^г’,1 =,1 + ^п .В противном случае необходимо продолжить

вычисление

дЕ

дЖк

Для этого воспользуемся полученными выше результатами. Обозначим через °

дЕ

вектор с координатами ° = (‘і — оі )(-а)оі (і — оі ). Тогда, к примеру, дм»

__ с ,-¡»-1

= °і0І , или в

векторном виде

-дЕ- = °(оп-1)т дЖ;

Вычислим

дЕ

(1)

дм.

п-1

^ І

У

Аналогично раскроем производную сложной функции

дн

д ’21 (•: — °п )21=1 к — о»> )т-д

2 ^ і к дн

п-1

п—1 0к і. ]

д

дн

П

ок =-

д

—і” к

г. 1

дн

п-1 г. 1′

/ (I

п

нк,1о1

п-1

-К (1 — окп)

дн

п-1 г. 1′

X ‘ п п-1 п/і п\Х ‘

I нк.і оі = -аок (1 — ок )1

^ ) і

Л’

к.і

Законность изменения порядка суммирования и дифференцирования непосредственно следует из линейности оператора дифференцирования. В итоге:

д

днп

г. і

Л

К — о; )(-а)оп (1 — о; Ц

к .і д^п- і

V г.1 )

=1

¿к I

н,,

-1

дн

Легко заметить. что

д

п-1 о1 = ‘

\-оюп1-1(1 — оп-1)оп-2, і = і

дн.

‘и

поэтому

дЕ

¿к I

д

п-1

к ,1 дні 1

= 1 <А (-а)оп-1 (1 — оп)о

’»і

или в векторной записи

дЕ

дЖп

т = [ )т £ * (-а)оп-1 * (1 — оп-1)]о” -2.

(2)

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

дЕ

дЖк’

к = п- 2..1

Объединяя формулы (1) и (2), легко получить рекурсивную процедуру вычисления

дЕ

всех -д^Т (однако, как легко заметить, никакого «обратного распространения ошибки» не

происходит, а название метода связано лишь с тем, что коррекцию весов матриц на каждом уровне удобнее производить, двигаясь от самого последнего уровня).

Стоит отметить, что эта процедура позволяет выполнить лишь один шаг алгоритма градиентного спуска. Выбор параметра скорости обучения на каждом шаге можно осуществлять различными способами, например, из условия максимального убывания функции ошибки, или же считать постоянным, а шаги градиентного спуска выполнять до достижения некоторой степени точности решения одного примера. Но, вообще говоря, задача выбора размера шага является сложной и нетривиальной. Например, если размер шага фиксирован и очень мал, то сходимость будет слишком медленная; если же он фиксирован и слишком велик, то может возникнуть т.н. паралич сети (т.е. состояние, когда сеть теряет способность к обучению) или постоянная неустойчивость. В теоретическом отношении эта проблема изучена достаточно плохо [3]. Поэтому, как правило, параметры обучения сети подбираются экспериментально до достижения приемлемого результата распознавания образов.

)

д

д

п

д

п

к

Литература.

[1] http://www.basegroup.ru/library/analysis/neural/math/

[2] http://ru.wikipedia.org/wiki/Персептрон

[3] http://ru.wikipedia.org/wiki/Метод_обратного_распространения_ошибки

[4] Лесин В.В., Лисовец Ю.П. Основы методов оптимизации.-М.: Изд-во МАИ, 1998.-344с. с ил.

Нейронная сеть — обучение ИНС с помощью алгоритма обратного распространения / Программирование / RoboCraft. Роботы? Это просто!

Нейронная сеть — введение
Принцип обучения многослойной нейронной сети с помощью алгоритма обратного распространения

Рассмотрим процесс обучения нейронной сети с использованием алгоритма обратного распространения ошибки (backpropagation).

Для иллюстрации этого процесса используем нейронную сеть состоящую из трёх слоёв и имеющую два входа и один выход:

здесь, автор считает слои по-другому и не учитывает «2 нейрона» входного слоя

Каждый нейрон состоит из двух элементов.
Первый элемент – дендриты — добавляют весовые коэффициенты ко входным сигналам.
Второй элемент – тело — реализует нелинейную функцию, т.н. функцию активации нейрона.
Сигнал е – это взвешенная сумма входных сигналов

у = f (е)

— выходной сигнал нейрона.

Чтобы обучить нейронную сеть мы должны подготовить обучающие данные(примеры).

В нашем случае, тренировочные данные состоят из входных сигналов (х1 и х2) и желаемого результата z.

Обучение – это последовательность итераций (повторений).

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

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

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

Иллюстрации ниже показывают, как сигнал распространяется по сети.

Символы W(Xm)n представляют вес связи между сетевым входом Xm и нейрона n во входном слое.

Символы y(n) представляют выходной сигнал нейрона n.

Распространение сигнала через скрытый слой.

Символы Wmn представляют весовые множители связей между выходом нейрона m и входом нейрона n в следующем слое.


Распространение сигнала через выходной слой


На следующем шаге алгоритма, выходной сигнала сети y сравнивается с желаемым выходным сигналом z, который хранится в тренировочных данных.

Разница между этими двумя сигналами называется ошибкой d выходного слоя сети.

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

На протяжении многих лет был неизвестен эффективный метод для обучения многослойной сети.

Только в середине восьмидесятых годов был разработан алгоритм обратного распространения ошибки.

Идея заключается в распространении сигнала ошибки d (вычисленного в шаге обучения) обратно на все нейроны, чьи выходные сигналы были входящими для последнего нейрона.


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

Этот процесс повторяется для всех слоёв сети. Если ошибка пришла от нескольких нейронов — она суммируются:


Когда вычисляется величина ошибки сигнала для каждого нейрона – можно скорректировать весовые коэффициенты каждого узла ввода(дендрита) нейрона.

В формулах ниже df(e)/de — является производной от функции активации нейрона (чьи весовые коэффициенты корректируются).

как помним, для активационной функции типа сигмоид


           1
S(x) = -----------
       1 + exp(-x)

производная выражается через саму функцию:

S'(x) = S(x)*(1 - S(x))

, что позволяет существенно сократить вычислительную сложность метода обратного распространения ошибки.

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

Коэффициент h влияет на скорость обучения сети.

Есть несколько методов для выбора этого параметра.

Первый способ — начать учебный процесс с большим значением параметра h. Во время коррекции весовых коэффициентов, параметр постепенно уменьшают.

Второй — более сложный метод обучения, начинается с малым значением параметра h. В процессе обучения параметр увеличивается, а затем вновь уменьшается на завершающей стадии обучения.

Начало учебного процесса с низким значением параметра h позволяет определить знак весовых коэффициентов.

продолжение следует…

Ссылки
Оригинал статьи (на английском)
http://ru.wikipedia.org/wiki/Метод_обратного_распространения_ошибки
en.wikipedia.org/wiki/Backpropagation
Нейросеть в 11 строчек на Python
An overview of gradient descent optimization algorithms

По теме
Нейронная сеть — введение
Пример работы самоорганизующейся инкрементной нейронной сети SOINN

python — обратное распространение для нейронной сети (ошибка в фигурах)

Переполнение стека

  1. Около
  2. Продукты

  3. Для команд
  1. Переполнение стека
    Общественные вопросы и ответы

  2. Переполнение стека для команд
    Где разработчики и технологи делятся частными знаниями с коллегами

  3. Вакансии
    Программирование и связанные с ним технические возможности карьерного роста

  4. Талант
    Нанимайте технических специалистов и создавайте свой бренд работодателя

  5. Реклама
    Обратитесь к разработчикам и технологам со всего мира

  6. О компании

.

нейронных сетей: объяснение прямого и обратного распространения

На пути к на самом деле понимание нейронных сетей. Одна из наиболее узнаваемых концепций глубокого обучения (подполе машинного обучения) — нейронные сети.

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

В дальнейшем все вышеизложенное будет основной мотивацией для всех остальных сообщений о глубоком обучении на этом веб-сайте.

  1. Обзор нейронных сетей

  2. Что такое нейронная сеть?

  3. Используемые детали, обозначения и математика

  4. Обратное распространение: оптимизация всех весов

  5. Оптимизация нейронной сети

  6. Шаги по созданию нейронных сетей

  7. Дополнительная литература (Рекомендуемые книги)

Обзор

Общая картина нейронных сетей — это то, как мы переходим от наличия некоторых данных к их использованию в алгоритмах и в надежде на лучшее.Но что происходит внутри этого алгоритма? На этот вопрос важно ответить по многим причинам; одно из того, что в противном случае вы могли бы просто рассматривать внутреннюю работу нейронных сетей как черный ящик.


Нейронные сети состоят из нейронов, связей между этими нейронами, называемых весами, и некоторых смещений, связанных с каждым нейроном. Мы различаем входной, скрытый и выходной уровни, и мы надеемся, что каждый слой поможет нам в решении нашей проблемы.

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

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

Для обновления сети мы вычисляем так называемые градиенты , которые представляют собой небольшие подталкивания (обновления) отдельных весов в каждом слое.{(L)}}
$$

Добавьте что-то, называемое мини-пакетами, где мы усредняем градиент некоторого количества определенных наблюдений на mini.batch, и тогда у вас есть базовая настройка нейронной сети.


Я подробно объясню каждую часть, если вы продолжите читать дальше. Обратитесь к оглавлению, если хотите прочитать что-то конкретное.

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

Что такое нейронная сеть?

Так много терминологии. Позвольте мне сделать это шаг за шагом, а затем вам нужно будет сидеть спокойно.

Нейронные сети — это алгоритм, созданный на основе нейронов нашего мозга. Он предназначен для распознавания шаблонов в сложных данных и часто лучше всего работает при распознавании шаблонов в аудио, изображениях или видео.

Нейроны — подключены

Нейронная сеть просто состоит из нейронов (также называемых узлами). Эти узлы каким-то образом связаны.Тогда каждый нейрон содержит число, а каждое соединение имеет вес.

Эти нейроны разделены между входным, скрытым и выходным слоями . На практике слоев много, и не существует общего наилучшего количества слоев.

Белые кружки соответствуют нейронам, а желтые стрелки — это соединений (с весом) от одного нейрона к другому нейрону. Белые прямоугольники выше показывают, какой слой к какому.

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

Входные данные — это просто ваш набор данных, где каждое наблюдение выполняется последовательно из $ x = 1, …, x = i $. Каждый нейрон имеет около активаций — значение от 0 до 1, где 1 — максимальная активация, а 0 — минимальная активация, которую может иметь нейрон. То есть, если мы используем функцию активации, называемую сигмоидом, описанную ниже. Таким образом, рекомендуется масштабировать данные до значений от 0 до 1 (например,г. с помощью MinMaxScaler от Scikit-Learn).

От входного слоя к скрытому

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

Запомните: каждый нейрон имеет активацию a , и каждый нейрон, который подключен к новому нейрону, имеет вес w .Активации обычно представляют собой число в диапазоне от 0 до 1, а вес — двойной, например 2,2, -1,2, 0,4 и т. Д.

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

(для объяснения веса см. Стохастический градиентный спуск)
Тогда .. можно умножить активации на веса и получить один нейрон на следующем слое, от первых весов и активаций $ w_1a_1 $ до $ w_na_n $:

$$
w_1a_1 + w_2a_2 +… + w_na_n = \ text {новый нейрон} $$

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

$$
1,1 \ раз 0,3 + 2,6 \ раз 1,0 = 2,93 $$

Процедура аналогична продвижению в сети нейронов, отсюда и название нейронная сеть прямого распространения.

Функции активации

Но … не все так просто. У нас также есть функция активации , чаще всего сигмовидная функция, которая просто снова масштабирует вывод, чтобы снова быть от 0 до 1 — так что это логистическая функция.{-x}} = \ text {число от 0 до 1}
$$

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

$$
\ sigma (w_1a_1 + w_2a_2 + … + w_na_n) = \ text {новый нейрон}
$$

Изображение сигмовидной функции. Взяв на вход x, мы получаем число от 0 до 1.

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

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

$$
\ sigma (w_1a_1 + w_2a_2 + … + w_na_n + b) = \ text {новый нейрон}
$$

Есть много типов функций активации, вот обзор:

Многие типы функций активации, объясненные в будущих публикациях. Отсюда.

Это все, что нужно для самой простой нейронной сети, нейронной сети прямого распространения.Но нам нужно ввести в смесь другие алгоритмы, чтобы познакомить вас с тем, как на самом деле обучается такая сеть.

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

Математика для нейронных сетей

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

Обозначение: линейная алгебра

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


Обозначения довольно аккуратные, но также могут быть громоздкими. Позвольте мне начать с нижней части окончательного уравнения, а затем объяснить свой путь к предыдущему уравнению:

$$
\ sigma (w_1a_1 + w_2a_2 +.{0} \\
\ end {bmatrix}

И все веса, связанные с каждым нейроном в следующем слое:

\ begin {bmatrix}
w_ {0,0} & w_ {0,1} & \ cdots & w_ {0, k} \\
w_ {1,0} & w_ {1,1} & \ cdots & w_ {1, k} \\
\ vdots & \ vdots & \ ddots & \ vdots \\
w_ {j, 0} & w_ {j, 1} & \ cdots & w_ {j, k} \\
\ end {bmatrix}

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

$
\ сигма \ влево (
\ begin {bmatrix}
w_ {0,0} & w_ {0,1} & \ cdots & w_ {0, k} \\
w_ {1,0} & w_ {1,1} & \ cdots & w_ {1, k} \\
\ vdots & \ vdots & \ ddots & \ vdots \\
w_ {j, 0} & w_ {j, 1} & \ cdots & w_ {j, k} \\
\ end {bmatrix}
\,
\ begin {bmatrix}
а_0 ^ {0} \\
а_1 ^ {0} \\
\ vdots \\
а_н ^ {0} \\
\ end {bmatrix}
+
\ begin {bmatrix}
b_0 \\
b_1 \\
\ vdots \\
б_н \\
\ end {bmatrix}
\право)
$

ЭТО последнее выражение, одно изящное и, возможно, громоздкое, если вы не выполнили его.{0}} $, выполните матричное умножение со всеми весами, соединяющими каждый нейрон от первого до второго уровня $ \ boldsymbol {W} $, добавьте матрицу смещения и, наконец, примените сигмоидальную функцию $ \ sigma $ к результату . Отсюда мы получаем матрицу всех активаций второго слоя.

Calculus Knowledge

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

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

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


Подводя итог , вы должны понимать, что означают эти термины, или уметь выполнять вычисления для:

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

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

Обратное распространение

Обратное распространение — это сердце каждой нейронной сети.Во-первых, нам нужно провести различие между обратным распространением и оптимизаторами (которые будут рассмотрены позже).

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

ТАК .. Эээ, а как нам вернуться назад?

Мы всегда начинаем с выходного слоя и продвигаемся назад, обновляя веса и смещения для каждого слоя.

Идея проста: отрегулируйте веса и смещения по всей сети, чтобы мы получили желаемый результат в выходном слое. Скажем, мы хотим, чтобы выходной нейрон был равным 1.0, тогда нам нужно было бы подтолкнуть веса и смещения, чтобы мы получили выходной сигнал ближе к 1.0.

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

Вычислительные градиенты

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

ПОЖАЛУЙСТА! Обратите внимание на обозначения, используемые между L, L-1 и l . Я намеренно смешиваю их, чтобы вы могли понять, как они работают.

Шпаргалка меньшего размера со всеми обозначениями, используемыми в этом посте

Во-первых, давайте начнем с определения соответствующих уравнений.2
$$

Подробнее о функции стоимости позже в разделе функции стоимости.

Мы можем узнать, как вычислять градиенты в алгоритме обратного распространения ошибки, размышляя над этим вопросом:

Как мы можем измерить изменение функции затрат по отношению к определенному весу, смещению или активации?

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

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

Три уравнения для вычисления градиента

Нам нужно вернуться в сеть и обновить веса и смещения. Давайте познакомимся с тем, как это сделать с помощью математики.{(L-1)}}
$$

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

Каждая частная производная от весов и смещений сохраняется в векторе градиента , который имеет столько измерений, сколько у вас есть весов и смещений. Градиент — это символ треугольника $ \ nabla $, а n — количество весов и смещений:

$$
— \ nabla C (w_1, b_1 ,…, w_n, b_n)
знак равно
\ begin {bmatrix}
\ frac {\ partial C} {\ partial w_1} \\
\ frac {\ partial C} {\ partial b_1} \\
\ vdots \\
\ frac {\ partial C} {\ partial w_n} \\
\ frac {\ partial C} {\ partial b_n}
\ end {bmatrix}
$$

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

Вы вычисляете градиент в соответствии с мини-пакетом (часто 16 или 32 лучше) ваших данных, то есть вы делите свои наблюдения на пакеты. Для каждого наблюдения в вашей мини-партии вы усредняете результат для каждого веса и смещения. Затем среднее значение этих весов и смещений становится результатом градиента, который создает шаг в лучшем среднем направлении по размеру мини-пакета.

Затем вы должны обновлять веса и смещения после каждой мини-партии.{(l)}}
$$

Скорость обучения обычно записывается как альфа $ \ alpha $ или эта $ \ eta $.

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

Пример: Углубление

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

Если мы посмотрим на скрытый слой в предыдущем примере, нам придется использовать предыдущие частные производные, а также две недавно вычисленные частные производные. Чтобы понять причину, вам следует взглянуть на приведенный ниже график зависимостей, поскольку он помогает объяснить зависимости каждого уровня от предыдущих весов и смещений.

Зависимости для расчета градиентов. Уровень 1 полагается на уровень 2, поскольку он повторно использует вычисления градиентов из слоя 2

Обновление весов и смещений в слое 2 (или $ L $) зависит только от функции стоимости, а также весов и смещений, связанных со слоем 2.Точно так же для обновления уровня 1 (или $ L-1 $) зависимости зависят от вычислений на уровне 2, а также от весов и смещений на уровне 1. Это привело бы к сумме, если бы у нас было больше слоев, было бы больше зависимостей. Как вы могли догадаться, именно поэтому мы называем это «обратным распространением».


Как показано на приведенном выше графике, для вычисления весов, связанных со скрытым слоем, нам придется повторно использовать предыдущие вычисления для выходного слоя (L или слоя 2). Напомню:

$$
\ frac {\ partial C} {\ partial w ^ {(2)}}
знак равно
\ frac {\ partial C} {\ partial a ^ {(2)}}
\ frac {\ partial a ^ {(2)}} {\ partial z ^ {(2)}}
\ frac {\ partial z ^ {(2)}} {\ partial w ^ {(2)}}
$$

$$
\ frac {\ partial C} {\ partial b ^ {(2)}}
знак равно
\ frac {\ partial C} {\ partial a ^ {(2)}}
\ frac {\ partial a ^ {(2)}} {\ partial z ^ {(2)}}
\ frac {\ partial z ^ {(2)}} {\ partial b ^ {(2)}}
$$

Если бы мы хотели вычислить обновления для весов и смещений, связанных со скрытым слоем (L-1 или слой 1), нам пришлось бы повторно использовать некоторые из предыдущих вычислений.{(1)} $).

Если вы посмотрите на приведенный выше график зависимостей, вы можете связать эти последние два уравнения с большой фигурной скобкой, которая говорит «Зависимости уровня 1» слева. Попытайтесь понять используемые обозначения, указав, какой слой L-1 находится на графике. Это должно прояснить ситуацию, и если вы сомневаетесь, просто оставьте комментарий.

Небольшая деталь, оставленная здесь, заключается в том, что если вы сначала рассчитываете веса, вы можете повторно использовать 4 первых частных производных, поскольку они одинаковы при вычислении обновлений для смещения.{(1)}}
$$

Продолжайте добавлять частные производные для каждого дополнительного слоя таким же образом, как это сделано здесь.

  • Повторить для каждого наблюдения / выборки (или мини-пакетов размером менее 32)

Оптимизаторы

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

На производительность модели влияет множество факторов. Как это может быть очевидно для некоторых, мы измеряем производительность с помощью функции стоимости.2
$$

Где $ y $ — это то, что нам нужно на выходе, а $ \ hat {y} $ — это фактический прогнозируемый вывод нейронной сети. По сути, для каждого образца $ n $ мы начинаем суммирование с первого примера $ i = 1 $ и по всем квадратам разностей между выходом, который нам нужен $ y $, и прогнозируемым выходом $ \ hat {y} $ для каждого наблюдение.

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

Стохастический градиентный спуск

В стохастическом градиентном спуске мы берем мини-пакет случайной выборки и выполняем обновление весов и смещений на основе среднего градиента из мини-пакета. Веса для каждой мини-партии случайным образом инициализируются небольшим значением, например 0,1. Смещения инициализируются разными способами; самый простой инициализируется значением 0.

  1. Определите функцию стоимости с вектором в качестве входных данных (вектор веса или смещения).
  2. Начните с произвольной точки вдоль оси x и сделайте шаг в любом направлении.
    Спросите, какой путь мы должны сделать, чтобы уменьшить функцию затрат наиболее быстро?
  3. Рассчитайте градиент с использованием обратного распространения, как объяснялось ранее.
  4. Шаг в направлении, противоположном градиенту — мы вычисляем градиентный подъем, поэтому мы просто ставим минус перед уравнением или перемещаемся в противоположном направлении, чтобы сделать его градиентным спуском. .

Получить хорошее представление о том, как выглядит стохастический градиентный спуск, довольно легко из GIF ниже. Каждый шаг, который вы видите на графике, — это шаг градиентного спуска, то есть мы вычислили градиент с обратным распространением для некоторого количества выборок, чтобы двигаться в нужном направлении.

Если градиент частных производных положительный, мы делаем шаг влево, иначе — вправо, когда отрицательный. Создан GIF из видео 3blue1brown и добавлены подписи.

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

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

Ввод нейронных сетей в этапы

Здесь я кратко разделю то, что делают нейронные сети, на более мелкие этапы.

Повторите для каждой мини-партии:

  1. Инициализируйте веса маленьким случайным числом и позвольте всем смещениям быть 0
  2. Начните прямой проход для следующей выборки в мини-партии и выполните прямой проход с уравнением для расчета активаций
    $ a ^ {(l)} = \ sigma \ left (\ boldsymbol {W} \ boldsymbol {a} ^ {l-1} + \ boldsymbol {b} \ right) $
  3. Вычислить градиенты и обновить вектор градиента (среднее значение обновления из мини-пакета) путем итеративного распространения в обратном направлении по нейронной сети.{(1)}} $
  4. Поставьте минус перед вектором градиента и обновите веса и смещения на основе вектора градиента, вычисленного на основе усреднения по подталкиваниям мини-пакета.

Вы закончили читать статью? Прочтите объяснения оптимизаторов!

Объяснение оптимизаторов

— Adam, моментум и стохастический градиентный спуск

Выбор правильного оптимизатора с правильными параметрами может помочь вам выжать последний бит точности из вашей модели нейронной сети.

Дополнительная литература

Самая рекомендуемая книга — это первый маркер.Он проведет вас через самые последние и лучшие, объясняя концепции очень подробно, сохраняя при этом практичность. Наверное, лучшая книга для начала обучения, если вы новичок или полу-новичок.


Есть вопросы? Оставьте комментарий ниже. Я здесь, чтобы что-нибудь ответить или уточнить.

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *