Содержание

- Теория
Знакомство с перцептроном
Обратное распространение
Обзор алгоритма
Визуализация обратного распространения
Пример кода< br /> - Справочники

Это 2 часть серии.
См. часть 1 для объяснения простейшей возможной нейронной сети

Теория

Знакомство с персептроном

Персептрон — это процессор, который принимает входные данные x, преобразует их с помощью функции активации f и выводит результат y.

В нейронной сети ее входные данные представляют собой сумму выходных данных узла предыдущего слоя, умноженных на их соответствующий вес, плюс смещение предыдущего слоя:

Если рассматривать смещение как дополнительный узел в слое с постоянным значением -1, то можно упростить уравнение:

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

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

Функция активации живет внутри персептрона и применяется к его выходу. Если x = ∑xw⃗⃗ (сумма входных к персептрону, умноженному на веса соответствующих соединений), то типичные функции активации:

  • Сигмоид:

  • РеЛУ:

  • Тан:

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

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

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

Обозначение

Дана сеть с тремя слоями, входным I, скрытым J и выходным Kслоями:

  • xᵢ, xⱼ, xₖ, являются входными данными для узла для слоев I, J, K соответственно.
  • y, y, y — выходные данные узла для слоев I, J, K соответственно.
  • y′ — ожидаемый результат узла выходного слоя K.
  • wᵢⱼ, wⱼₖвеса ​​узловых соединений от уровня Iдо Jи от уровня J до K соответственно.
  • t — это текущая ассоциация из T ассоциаций, где ассоциация — это набор входных и ожидаемых выходных данных, которые мы передаем в сеть.

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

  • входной слой I — функция идентификации
  • скрытый слой J — сигмовидная функция
  • выходной слой K — функция идентификации

Функция идентификации просто означает, что это сквозная функция, которая ничего не преобразует y = f(x).

Проход вперед

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

Входные данные для каждого узла скрытого слоя xⱼ представляют собой сумму выходных данных всех узлов входного слоя, умноженных на их соответствующие веса:

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

Таким же образом входные данные для узлов выходного слоя

и их вывод такой же, так как мы назначили им функцию активации личности.

После того, как входные данные были распространены по сети, мы можем вычислить ошибку функции среднего квадрата стоимости (см. часть 1). Если у нас есть несколько ассоциаций, мы просто суммируем ошибки каждой ассоциации.

Обратный проход

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

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

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

Следовательно, изменение веса равно ∇wⱼₖ = -ϵδₖyⱼ

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

Точно так же для веса между скрытыми слоями, в нашем случае между входным слоем и нашим скрытым слоем, мы имеем

Здесь расчеты немного сложнее. Давайте проанализируем дельта-член δⱼи поймем, как мы к нему пришли.
Мы начнем с вычисления частной производной xⱼотносительно ошибки с помощью цепного правила

Помните, что наша функция активации f является сигмовидной функцией, а ее производная равна f(x)(1-f(x))

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

Краткое описание алгоритма

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

  • для каждой ассоциации распространяйте сеть вперед и получайте выходные данные
    — вычисляйте δчлен для каждого узла выходного слоя (δₖ = yₖ -y′ₖ)< br /> — накапливать градиент для каждого выходного веса (∇wⱼₖE = δₖyⱼ)
    — вычислять член δ для каждого узла скрытого слоя (δⱼ = yⱼ(1-yⱼ) ∑ δₖwⱼₖ)
    — суммировать градиент для каждого веса скрытого слоя (∇wᵢⱼE = δⱼyᵢ)
  • обновить все веса и сбросить накопленные градиенты (w = w -ϵ∇E)

Визуализация обратного распространения

В этом примере мы будем использовать фактические числа для отслеживания каждого шага сети. Мы снабдим нашу сеть 2x2x1 входными данными [1.0, 1.0] и ожидаем на выходе [0.5]. Чтобы упростить задачу, мы инициализируем все наши веса одним и тем же значением 0,5. Однако имейте в виду, что обычно веса инициализируются с использованием случайных чисел (нюансы инициализации весов будут объяснены в части 3). Мы также разработаем сеть с сигмовидной функцией активации для скрытого слоя и функцией идентичности для входного и выходного слоев и будем использовать ϵ = 0,01 в качестве скорости обучения.

Проход вперед

Мы начинаем с установки всех узлов входного слоя с входными значениями; x₁ = 1,0, x₂ = 1,0.
Поскольку узлы входного слоя имеют функцию активации идентификации, тогда yᵢ = xᵢ = 1,0.

Затем мы распространяем сеть вперед, устанавливая входы узла J (xⱼ) с суммой всех выходов узла предыдущего слоя, умноженной на их соответствующие веса:

Затем мы активируем узлы слоя J, передавая его входные данные сигмовидной функции f(x) = 1/(1 + e^(-x))

И мы распространяем эти результаты на последний слой xₖ = 0,731 * 0,5 + 0,731 * 0,5 = 0,731
Поскольку функция активации наших выходных узлов является тождественной, то yₖ = xₖ = 0,731

Обратный проход

На обратном пути мы сначала вычисляем член δ для выходного узла, δₖ = yₖ -y′ₖ = 0,731–0,5 = 0,231

И, используя термин δ, мы вычисляем градиент для каждого веса между узлами слоя J и K: ∇wⱼₖE = δₖyⱼ = 0,231 * 0,731 = 0,168861

Затем мы делаем то же самое для каждого скрытого слоя (в нашем случае только для одного): δⱼ = yⱼ(1 -yⱼ) ∑ δₖwⱼₖ = 0,731 * (1–0,731) * (0,5 * 0,231) ≈ 0,0227

И вычислить градиент для каждого веса между узлами слоя I и J: ∇wᵢⱼE = δⱼyᵢ = 0,0227 * 1,0 = 0,0227

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

  • wᵢⱼ = wᵢⱼ -ϵ∇wᵢⱼE = 0.5 -0.01 * 0.0227 = 0.499773
  • wⱼₖ = wⱼₖ -ϵ∇wⱼₖE = 0.5 -0.01 * 0.168861 = 0.49831139

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

У нас было y₁ = 0,731 на нашей первой итерации, и мы получаем y₂ ≈ 0,7285 после изменения веса.
У нас было y₁-y′₁ = 0,231 и мы получаем y₂-y′₂ = 0,2285после изменения веса.

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

Пример кода

https://github.com/gokadin/ai-backpropagation

Пример обучает сеть 2x2x1 оператору XOR.

Где f — сигмовидная функция для узлов скрытого слоя.

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

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

Рекомендации