Немного о backpropagation и о том, что нужно знать ML-разработчику.

МЕНЮ


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

ТЕМЫ


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

Авторизация



RSS


RSS новости


Сейчас прохожу обучение в одной компании на должность ML-разработчика, подробнее можно прочитать про начала сего дела тут.

То самое следующее задание: реализовать многослойную нейросеть(кол-во слоев и кол-во нейронов в каждом слое, функция активации для каждого слоя задается пользователем), реализовать алгоритм backpropagation(самое сложное) и обучить данную сеть на распознавании рукописных цифр(MNIST — классика), затем составить аналогичную сеть на pytorch, сравнив результаты.

Как по мне, лучше всего о методе обратного распространения ошибки рассказано здесь. Но не все так просто!

Начнем сначала:

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

2 шаг — backward pass. Мы идем от выходов ко входам, тем самым «распространяя ошибку»(откуда и взялось название метода). Именно этот обратный проход позволяет нам вывести общую формулу для изменения весов сети. Общая формула такова: w_i = w_i — lr* d(L)/d(w_i), где
d(L)/d(w_i) — частная производная по i-му весу от нашей функции потерь. Если даже построить примитивную сеть с одним скрытым слоем, как на ресурсе, ссылку на который я оставил выше, то уже становится понятна одна простая вещь. Она заключается в том, что частные производные различаются для весов, находящихся между разными слоями. Расписав формулы для каждого веса сети можно заметить одну вещь: частная производная по весам, находящимся между двумя слоями, зависит только от этих двух слоев, но с небольшой оговоркой! Правый слой от текущих весов должен быть вычислен во время backward, а левый слой — во время forward. Тогда:
w_i = w_i — lr * forward * backward. Когда мы делали forward pass — мы сохраняли все слои как forward, когда мы делали backward — мы сохраняли все слои как backward(в отдельном списке, например). Этому есть весьма простое математическое обоснование — если будет непонятно, то напишите в комменты/в лс — расскажу.

3 шаг — weights update по нашей уже выведенной формуле. Тут ничего сложного.

Порог вхождения в задание:
ML база(функция активации, градиентный спуск(в частности — mini-batch), numpy, функция потерь, ну и понимание того — почему? это работает — можно тут почитать, уже писал).Линал(матрицы, умножения матриц, транспонирования матриц, СЛАУ).
Мат. анализ(частная производная сложной функции — chain rule).Мат. стат — опционально, для более глубокого погружения(в нем не шарю, но с помощью него строго доказывается опция выбора той или иной функции потерь для задач регрессии/классификации).

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

В целом обратная связь была двух характеров:

1 — по поводу решения(его нужно доделать):
Использовать confusion matrix
Считать loss после каждого образца(в конце — построить график)
Поменять функцию потерь на кросс-энтропию
Добавить ReLU
Добавить возможность задавать batch-size
Добавить возможность пользователем задавать функции активации для каждого слоя

2 — некие советы, напутствия по стезе ML(т.е. то, о чем нужно прочитать, то, что нужно знать):
Держать в голове возможности, понимать принципы weight init(т.е. методика начальной инициализации весов нейронной сети)
Прочитать про vanishing grdient, понимать что это
Понимать мат. обоснование выбора функций потерь для задач классификации и регрессии(какие где используются, а какие где — нет)
Понимать то, что почти все модели нейронных сетей основаны на функции максимального правдоподобия(разбираться что к чему) — самое простое :)

Всю эту кухню как только разберу — сразу детально все разжую здесь.

По поводу самого метода обратного распространения ошибки — как мне сказал куратор (ну или наставник, сложно классифицировать) — на практике очень часто бывает необходимость вручную реализовать этот метод. Полагаю, в виду того, что используются свои кастомные библиотеки, как минимум.
Резюме:
must have — основы ML + backpropagation (реализация руками) + линал + немножко матана и мат стата :)
Это пока только то, что выудил. Ну и полезная ссылочка — следить за трендами обязательно!!!


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

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