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

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Folifolo/backprop

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

Практическая работа №1: Реализация метода обратного распространения ошибки для двухслойной полностью связанной нейронной сети

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

Модель нейрона описывается следующими уравнениями:

где – входной сигнал, – синаптический вес сигнала , – функция активации, – смещение

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

где – выход скрытого слоя, – функция активации скрытого слоя (relu), – вход сети, – выход сети, – функция активации выходного слоя (softmax),

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

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

Схема обратного распространения ошибки состоит из следующих этапов:

  1. Прямой проход по нейронной сети. На данном этапе вычисляются значения выходных сигналов каждого слоя, а так же производные их функций активации.
  2. Вычисление значений целевой функции и её производной. Целевая функция – кросс-энтропия, вычисляется как где – ожидаемый выход (метки) Производную целевой функции по весам можно вывести следующим образом:

Описание программной реализации

Содержит реализацию нейронной сети

Класс NN содержит данные и методы для работы с сетью

Поля класса NN:

_input_size – размер входного слоя

_hidden_size – размер скрытого слоя

_output_size – размер выходного слоя

_w1, _b1 – массивы для хранения весов и смещений первого слоя

_w2, _b2 – массивы для хранения весов и смещений второго слоя

Методы класса NN:

_forward(input) – прямой проход сети. Возвращает выходной сигнал первого и второго слоя

_calculate_dE(input, label, output1, output2) – вычисление градиента функции ошибки. Возвращает градиент функции по весам и биасам первого и второго слоёв

_backprop(learning_rate, size, dEb1, dEb2) – корректировка весов сети при помощи посчитанных градиентов

init_weights() – инициализация весов нормальным распределением с дисперсией 1/10

fit(input, label, validate_data = None, batch_size = 100, learning_rate = 0.1, epochs = 100) – пакетное обучение сети на epochs эпохах, скоростью обучения learning_rate, размером пакета batch_size. Выводит точность и значение целевой функции на каждой эпохе

predict(input) – получение предсказания сети

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

reluD(X) – производная функции relu

calcilate_E(predict, label) – подсчёт функции ошибки на основании предсказания сети и верной разметки

calculate_acc(prediction ,label) – посчёт точности на основании предсказания сети и верной разметки

Обучает сеть из класса NN на MNIST с параметрами из аргументов запуска. Измеряет время обучения.

  • —hidden – количество нейронов в скрытом слое
  • —epochs – количество эпох обучения
  • —lr – скорость обучения
  • —batch – размер пакета

Как вызывать:

 python main.py --hidden 30 --epochs 20 --lr 0,1 --batch 100 

(в примере указаны параметры по умолчанию)

Размер скрытого слоя: 30, эпох: 20, скорость обучения: 0,1, размер пакета: 100

train accuracy: 0.9729 train error: 0.0913 validate accuracy: 0.9613 validate error: 0.1238

Размер скрытого слоя: 10, эпох: 20, скорость обучения: 0,1, размер пакета: 100

train accuracy: 0.9469 train error: 0.1805 validate accuracy: 0.9404 validate error: 0.2013

Размер скрытого слоя: 10, эпох: 20, скорость обучения: 0,1, размер пакета: 100

train accuracy: 0.9874 train error: 0.0467 validate accuracy: 0.9721 validate error: 0.0878

Размер скрытого слоя: 30, эпох: 50, скорость обучения: 0,1, размер пакета: 100

train accuracy: 0.9875 train error: 0.0418 validate accuracy: 0.9678 validate error: 0.1216

Размер скрытого слоя: 30, эпох: 20, скорость обучения: 0,5, размер пакета: 100

train accuracy: 0.9766 train error: 0.0732 validate accuracy: 0.9622 validate error: 0.1614

Размер скрытого слоя: 30, эпох: 30, скорость обучения: 0,05, размер пакета: 100

train accuracy: 0.971 train error: 0.0998 validate accuracy: 0.9625 validate error: 0.1225

Размер скрытого слоя: 30, эпох: 20, скорость обучения: 0,1, размер пакета: 10

train accuracy: 0.9724 train error: 0.0928 validate accuracy: 0.9533 validate error: 0.2423

Размер скрытого слоя: 30, эпох: 20, скорость обучения: 0,1, размер пакета: 1000

train accuracy: 0.9268 train error: 0.2588 validate accuracy: 0.9264 validate error: 0.2576

Источник

Back propagation — алгоритм обучения по методу обратного распространения

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

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

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

Теперь, главный вопрос: как построить алгоритм, который бы наилучшим образом находил весовые коэффициенты. Наилучший – это значит, максимально быстро и с максимально близкими выходными значениями для требуемых откликов. В общем случае эта задача не решена. Нет универсального алгоритма обучения. Поэтому, лучшее, что мы можем сделать – это выбрать тот алгоритм, который хорошо себя зарекомендовал в прошлом. Основной «рабочей лошадкой» здесь является алгоритм back propagation (обратного распространения ошибки), который, в свою очередь, базируется на алгоритме градиентного спуска.

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

Чтобы все лучше понять, предположим, что у нас имеется вот такая полносвязная НС прямого распространения с весами связей, выбранными произвольным образом в диапазоне от [-0.5; 0,5]. Здесь верхний индекс показывает принадлежность к тому или иному слою сети. Также, каждый нейрон имеет некоторую активационную функцию :

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

и последнее выходное значение y:

Далее, мы знаем требуемый отклик d для текущего вектора , значит для него можно вычислить ошибку работы НС. Она будет равна:

На данный момент все должно быть понятно. Мы на первом занятии подробно рассматривали процесс распространения сигнала по НС. И вы это уже хорошо себе представляете. А вот дальше начинается самое главное – корректировка весов. Для этого делается обратный проход по НС: от последнего слоя – к первому.

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

Этот момент требует пояснения. Смотрите, ранее используемая пороговая функция:

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

или логистическую функцию:

Фактически, они отличаются только тем, что первая дает выходной интервал [-1; 1], а вторая – [0; 1]. И мы уже берем ту, которая нас больше устраивает в данной конкретной ситуации. Например, выберем логистическую функцию.

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

Именно его мы и запишем в нашу формулу вычисления локального градиента:

то локальный градиент последнего нейрона, равен:

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

Для второй связи все то же самое, только входной сигнал берется от второго нейрона:

Здесь у вас может возникнуть вопрос: что такое параметр λ и где его брать? Он подбирается самостоятельно, вручную самим разработчиком. В самом простом случае можно попробовать следующие значения:

(Мы подробно о нем говорили на занятии по алгоритму градиентного спуска):

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

А дальше действуем по такой же самой схеме, корректируем входные связи по той же формуле:

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

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

Ну и осталось выполнить коррекцию весов первого слоя все по той же формуле:

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

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

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

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

Источник

Читайте также:  Bitrix init php примеры
Оцените статью