Нейронная сеть без фреймворков глубокого обучения.

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


Я полностью закончил написание своего второго тестового задания.

Само задание можно найти тут.

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

Профессионал от дилетанта отличается познанием деталей. Так приступим же к ним :)

Часть кода с функциями активаций, их производными весьма понятна. Остановлюсь лишь на функции потерь. В моем решении — это CrossEntropyLoss, как и в реализации pytorch, но лишь с одним исключением. В реализации на pytorch — функция применяет softmax на выходной слой в неявном виде, в моей же реализации — я явно применяю softmax к выходному слою. Параметр класс может выступать в качестве one hot encoded вектора.

Насчет класса Layer — его объекты мы будем создавать при инициализации класса Network исходя из тех параметров, что задаст пользователь.

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

1 — мы идем от входа к выходу(матричные умножения). Сначала то, что входит(картинка 28*28 пикселей = 784 нейрона во входном слое), это умножается на матрицу весов ? получается новый слой с неким кол-вом нейронов и так далее. Это называют forward pass'ом.

2 — считаем ошибку на батче.

3 — теперь нам нужно обновить все веса нашей нейронной сети для того, чтобы минимизировать эту ошибку(функцию, зависящую от весов сети). Для этого есть универсальная формула: w_i = w_i — lr * d(L)/d(w_i). И тут понятно, что веса находятся между разными слоями ? имеют разные частные производные по функции ошибок. Для того, чтобы обобщить эту формулу мы и делаем 4-й шаг.

4 — backward pass. Идем от выходов ко входу, распространяя ошибку сети, параллельно вычисляя производные на каждом слое(потому что частная производная для весов, находящихся до i-го слоя, зависит от i-го слоя.

График loss'а на обучающей выборке весьма ясно показывает тот факт, что значение функции потерь уменьшалось до какого-то момента, чего мы и добивались.

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

Confusion matrix позволяет определить проблемные места в работе нейросети(например, показать какие цифры от каких она отличает хуже всего). Более подробно и наглядно — в ноутбуке.

Метрика accuracy использована, так как классы распределены равномерно на тестовой выборке(в чём можно весьма просто убедиться, пробежавшись по меткам тестовой выборки).

Если остались какие-то вопросы, то задавайте в комментариях — постараюсь ответить на все :)


Источник: m.vk.com

Комментарии: