5 Нейросеть Matt Mazur
Сделал, наконец, рабочий пример нейросети (НС). Сначала прочитал теорию – объяснение механизма back propagation из русской вики. Вроде все понятно. За вечер написал программу для анализа цифр 0..9 из базы MNIST. Программа запускается, веса обновляются, работа кипит. У любого программиста есть вера в чудо. Что программа, которая компилируется при первом запуске сразу сработает корректно. Да, но нет, девочки. На выходе – 10% распознанных цифр. Ерунда, короче. Как если бы цифра определялась случайным образом.
Стал разбираться. Выяснилось, что в русской вики алгоритм описан сложно, неточно, замылено и недостаточно понятно для реализации без PhD в математике:
1) При изменении весов ребер НС их нужно умножать на коэффициент обучения. Иначе, метод градиентного спуска может застрять в локальном минимуме, так и не попав в глобальный минимум. Но не сказано, как подбирать этот коэффициент.
2) Не сказано, что после подсчета дельт для изменения весов на каждом слое, обновлять веса ребер нужно один раз для всех слоев сразу, а не сразу после подсчета каждой дельты.
3) Для скрытых слоев в правиле подсчета дельт сказано, что нужно умножить на веса исходящих ребер на их дельты. Это не так. Не дельты, а 3 из 4-х множителей в дельте. Т.е. из дельт нужно исключить сигнал на предыдущем узле. Т.е. умножить на: (Tj-Oj)*Oj*(1-Oj), а не на (Tj-Oj)*Oj*(1-Oj)*On, где n=j-1
4) Ничего не сказано про архитектуру слоев и ребер. Должны ли они быть Full-connected [FC] (каждый узел соединен с каждым следующим) и как изменить алгоритм если у нас не FC-слои.
5) Пишут про функцию ошибки НС, но никак в финальных расчетах алгоритма ее не используют (хотя из нее через производные выводят формулы подсчета).
6) Полно туманных разъяснений вида "ну, тут очевидно – надо взять частную производную dE/dw". Ага, очевидно. Целыми днями только этим и занимаюсь.
7) Нет нормального примера простой НС с проставленными числами для каждого сигнала, веса, узла и расчета как это считается хотя бы на одной итерации.
8) Неясно, нужно ли нормализовать входные сигналы (из 0..255, например, делать числа в интервале 0..1).
9) Говорят, в начале нужно выставить маленькие значения весов ребер. Неясно, насколько малые. 0..1 или 0..0,001?
Правильно говорят, нужна своя, православная вики за 2 млрд руб!
Надо бы залить на вики свой алгоритм работы НС с примером подсчета. Не знаю, почему так ужасно объясняют на русской вики. Возможно это диверсия. Т.е. админы все написали понятно, но каждую ночь на страницу заходят враги отечества из-за границы (и не только) и запутывают описание алгоритма.
Есть такая теория заговора, что в школах и университетах СССР специально так ужасно преподают английский, чтобы народ не разбежался по заграницам сразу после выпуска. Федеральная программа по противодействию утечке мозгов. Или как-то так. Товарищ майор, если я случайно раскрыл гос. тайну, подайте знак.
В итоге, я сделал все ошибки из возможных, поэтому считался мусор. После гугления и изучения многих примеров НС, нашел, наконец, отличный пример простой реализации НС. С формулами и числовым расчетом. Все понятно, хоть и на английском.
Ссылка: A Step by Step Backpropagation Eхample by Matt Mazur
https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/
Сделал реализацию по статье и вуаля! Все работает! См. код в конце статьи и на скринах.
Заметил, что когда нужно разобраться в какой-либо айтишной теме, то на английском