Лабораторная работa №1
Реализация метода обратного распространения ошибки для двуслойной полностью связанной нейронной сети
Вывод математических формул
вывод формул, подробнее рукой написано
А каждом слое есть веса данные матрицой где s обазначивает слой.
На изображении не показаны узлы и веса смешения, потому что всё проще если добавлять единицу в входные векторы. В конце из всех формул легко выделяем части связанные с смещением, а это понадобится для программной реализации.
Е представляет функцию ошибки, целевую функцию, которую хотим минимизировать.
Продолжая выводить формулы для последовательных слоев, получаем общую формулу.
Если использовать softmax функцию активации и кросс-энтропийную функцию ошибки, получаем следующие формулы: Softmax активация:
Softmax это апостериорная вероятность того, что пример тренировочной выборки принадлежит данному классу.
Максимизация функции правдоподобия может быть сведена к минимизации логарифма.
Теперь, чтобы запрограммировать обратное распространение ошибки, нужно ещё только производную функции ReLU (ReLU(x) = max(x, 0))
, которую мы будем использовать.
ReLU'(x) = I(x > 0) = 1{x > 0}
Псевдокод алгоритма
(Скорость обучения и полученный результат много зависят от инициализации весов.)
Инициализировать веса w.
Пока не выполнены условия остановки:
Для каждой пачки тренировочных примеров:
Для каждого тренировочного примера:
Вычисляем функцию ошибки по формуле
Промежуточные результаты используем чтобы вычислить градиенты.
Вычисляем градиент по всей пачке
Используя градиентный спуск обновляем веса
Повтаряем
Описание реализации
Код распределён на несколько файлов. Вспомогательные функции в utils.py и data_loader.py (загрузка данных). Алгоритм нейронной сети запрограммирован в dnn.py. Он представлен классом Classifier, объекты которого можно настроить различными слоями (файл layers.py), функциями активации (activations.py) и функциями ошибки (cost.py). Слой SoftmaxCrossEntropyLayer должен использоваться в конце сети вместе с функцией ошибки softmax_cross_entropy.
Как запустить
Сначала рекомендуется установить python3, и питоновские пакеты numpy и необязательно matplotlib. Для этого удобно запустить configure.sh
, если пользуетесь линуксом на базе Debian (Debian, Ubuntu, Mint,...).
Kоманда ./main.py -h
показывает возможные настройки через командную строку:
usage: main.py [-h] [-d DATADIR] [-s SIZES] [-l LEARNING_RATE] [-m MAX_ITER]
[-b BATCH_SIZE] [-c]
optional arguments:
-h, --help show this help message and exit
-d DATADIR, --dir DATADIR
path to directory containing data
-s SIZES, --hidden-layer-sizes SIZES
sizes of hidden layers separated by commas, e.g.
'128,256'
-l LEARNING_RATE, --learning-rate LEARNING_RATE
learning rate
-m MAX_ITER, --max-iter MAX_ITER
maximum number of iterations
-b BATCH_SIZE, --batch-size BATCH_SIZE
batch size
-c, --save-learning-curve
dumps learning curve graph to learning_curve.png
Kоманда ./main.py -m 50 -s 96 -l 0.1 -b 200 -d ../datasets/mnist/ -c
обозначает что мы хотим натренировать сеть с одним скрытым слоем и 96 нейронов в этом слое, при этом используются максимально 50 итераций, скорость обучения 0.1 и пачки по 200 примеров, а данные находятся в папке ../datasets/mnist. Чтобы сохранить граф кривой обучения используются -c.
Такая команда даст нам следующие результаты/точности:
на тренировочной выборке | на тестовой выборке |
---|---|
99.28% | 97.58% |
с такой кривой обучения: