При обучении нейрона с учителем мы подаём обучающие сигналы и получаем на выходе результаты. Но при каждом сигнале, входном и выходном, мы получаем результат о степени ошибки в предсказании. Когда мы прошли все обучающие сигналы, мы получили набор (вектор) ошибок, который может быть представлен в виде функции ошибок. Эта функция ошибок зависит от входных параметров (весов) и нам нужно найти веса, при которых эта функция ошибок становится минимальной. Для определения этих весов применяется алгоритм Градиентного спуска, суть которого заключается в постепенном движении к локальному минимуму, а направление движения определяется производной от этой функции и функции активации. В качестве функции активации обычно выбирают сигмойду для обычных сетей или усечённую ReLU для глубоких сетей. Сигмойда на выходе даёт диапазон от нуля до единицы всегда. Усечённая ReLU всё же позволяет при очень больших числах (очень важной информации) на входе передать больше единицы на выход, и тем самым повлиять на слои, идущие после непосредственно следующих. К примеру, точка над чёрточкой отделяет букву L от буквы i, а информация одного пикселя влияет на принятия решения на выходе, поэтому важно не потерять этот признак и передать его на последний уровень. Разновидностей функций активации не так много – их ограничивает требование к простоте обучения, когда требуется взять производную. Так сигмойда f после произвольно превращается в f(1–f), что эффективно. С Leaky ReLu (усечённая ReLu c утечкой) ещё проще, так как она при "x < 0" принимает значение 0, то её проводная на этом участке тоже равна 0, а при "x >=0" она принимает 0,01*x, что при производной будет 0,01, а при x > 1 принимает 1+0,01*x, что для производной даёт 0,01. Вычисление тут вообще не требуется, поэтому обучение происходит намного быстрее, обычно, в пять раз. До сигмойды ещё использовался тангенс, но, он был вытеснен сигмойдой.
Так как на вход функции активации мы подаём сумму произведений сигналов на их веса, то зачастую, нам нужен другой пороговый уровень, отличный от 0,5. Мы можем сместить его на константу, прибавляя её к сумме на входе в функцию активации, используя нейрон смещения для её запоминания. Он не имеет входов и выдаёт всегда единицу, а само смещение задаётся весом связи с ним. Но, для многонейронных сетей он не требуется, так как сами веса предыдущим слоями подгоняются такого размера (меньшими или отрицательными), чтобы использовать стандартный пороговый уровень – это даёт стандартизацию, но требует большего количества нейронов.
При обучении нейрона нам известна ошибка самой сети, то есть на входных нейронах. На их основе можно рассчитать ошибку в предыдущем слое и так далее до входных – что носит название метода обратного распространения ошибки.
Сам же процесс обучения можно разделить на этапы: инициализация, само обучение и предсказание.
Если же у нас цифра может быть различного размера, то применяется pooling слои, которые масштабируют изображение в меньшую сторону. По какому алгоритму будет вычисляться то, что будет записано при объединении, зависит от алгоритма, обычно это функция “max” для алгоритма «max pooling» или «avg» (среднеквадратичные значение соседних ячеек матрицы) – average pooling.
У нас уже появилось несколько слоёв. Но в применяемых на практике нейронных сетях их может быть очень много. Сети с количеством слоёв больше четырёх слоёв принято называть глубокими нейронными сетями (DML, Deep ML). Их может быть очень много, что приводит к сложности. С улучшением архитектур, позволяющих уменьшить или обойти такие ограничения, появляются сети с сотнями слоёв. Например, блоки Residual Connect, позволяющие сохранить градиенты и ставшие стандартом для глубоких сетей, появились впервые в ResNet с количеством слоёв 152 штуки и это далеко не самая глубокая сеть. Но, как вы уже заметили, количество слоёв не берётся, по принципу, чем больше, тем лучше, а прототипируется. Излишнее количество ухудшает качество за счёт затухания, если для этого не применять определённые решения, такие как проброс данных с последующим суммированием. Примерами архитектур нейронных сетей могут быть ResNeXt, SENet, DenseNet, Inception–Res Net–V2, Inception–V4, Xception, NASNet, MobileNet V2, Shuffle Net и Squeeze Net. Большинство из этих сетей предназначены для анализа изображений и именно изображения, зачастую, содержат наибольшее количество деталей, и на эти сети возлагается наибольшее количество операций, чем и обуславливается их глубина. Одну из подобных архитектур мы рассмотрим при создании сети классификации цифр – LeNet–5, созданную в 1998.