Заметки на полях из истории развития свёрточных нейросетей

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Эти заметки отражают лишь небольшую часть истории развития сверточных нейронных сетей, и каждый из этих моментов играл важную роль в улучшении производительности и эффективности нейронных сетей в области компьютерного зрения.

Ключевые элементы:

  • Convolution Layer (сверточный слой) - наложение фильтров (ядер) на разные кусочки изображения (окна). На выходе получается карта активаций, которая говорит о том насколько фильтр оказался похож на кусочек изображения к которому был приложен. Находится скалярным произведением.

  • Pooling (слой подвыборки) объединяет информацию из соседних нейронов. MaxPool - выбор максимального значения окна, AvgPool - вычисление среднего из окна. Обычно применяется после сверточного слоя.

  • Activation function (функция активации) привносит нелинейность в нейронную сеть. Известные функции: Sigmoid, Tanh, ReLU, ELU и другие. Применяется поэлементно.

  • Flatten преобразует многомерный массив в вектор построчно.

  • Fully Connected Layer (полносвязный слой) - самый обычный нейронный слой: на вход подаются все значения из предыдущего слоя и скалярно перемножаются на веса.

  • SoftMax преобразует вектор чисел в вектор вероятностей. В выходном векторе сумма всех элементов равна 1.

Архитектуры:

  1. LeNet

  2. AlexNet

  3. VGG - Visual Geometry Group

  4. GoogLeNet

  5. ResNet

1. LeNet (1998)

Архитектура LeNet была предложена Яном Лекуном для решения задачи распознавания рукописных цифр от 0 до 9 из датасета MNIST. Датасет состоит из 60k обучающих и 1k тестовых примеров размером 28 × 28 (одноканальные).

LeNet пропускает изображения через два набора свёрток, затем распрямляет вектор, и применяет полносвязные слои. На выходе получается вектор из 10 цифр - вероятностей классов. В качестве функции активации используется сигмоида или гиперболический тангенс, но в современных реализациях предпочтение отдаётся ReLU и его вариациям.

Архитектура LeNet имела огромное значение для развития области компьютерного зрения и глубокого обучения, показав, что сверточные нейронные сети могут эффективно применяться для задач распознавания изображений.

2. AlexNet (2012)

Задача MNIST - несколько игрушечная. Современные нейронные сети соревнуются в решении ImageNet 1000: задачи о разбиении 15 миллионов изображений на тысячу классов (автомобили, породы собак, какие-то канцелярские принадлежности и т.д.). Причем, хороших изображений (которые действительно относятся к этой тысяче классов) около 1.5 миллиона. Первая нейронная сеть, которая научилась решать эту задачу - AlexNet.

На вход принимается трехканальные изображение размером 224 × 224. AlexNet содержит восемь слоев: первые пять - сверточные (за некоторыми из них следуют MaxPooling слои), а последние три - полносвязные.

Из "трюков": MaxPooling используется после каскада сверток (нескольких сверток подряд), а проблему затухающего градиента решается с помощью функции активации ReLU.

3. VGG - Visual Geometry Group (2014)

Большое количество функций активаций все равно приведет к затуханию градиента. При этом, VGG, в своем финальном варианте содержит аж 19 слоев и показало хорошие результаты благодаря своему особому способу обучения:

  • Сначала обучаются лишь 11 слоёв (8 сверток и 3 полносвязных слоя).

  • Затем, к сети добавляются еще два сверточных слоя на глубоких слоях (после первой и второй свертки). В результате, добавленные слои дообучаются чуть быстрее, чем если бы сразу делалась такая сеть.

  • После, добавляются ещё три слоя (свертки 1 × 1 после 6, 8 и 10 слоев) и дообучается сеть. Так она адаптируется под дополнительные элементы.

  • Затем выбрасываются свёртки 1 × 1 и добавляются на их место свёртки размером 3 × 3, и дообучаются.

  • После, добавляются еще три свёрточных слоя после 7, 10 и 13 слоев и дообучаются.

Построенный таким образом процесс обучения приводит к достаточно сложной, но хорошо обученной нейронной сети, в которой и первые слои и последние слои обучены достаточно хорошо.

VGG - достаточно мощная сеть с большим количеством параметров. Она может использоваться в качестве backbone для более сложных архитектур.

Backbone значит что можно убрать последние полносвязные слои из VGG, «заморозив» все предыдущие сверточные (не обучать, оставить параметры как есть), добавить свои новые сверточные и полносвязные слои и обучить новую сеть под свою задачу.

4. GoogLeNet

Более сложная архитектура, решившая задачу ImageNet 1000 с использованием трюка под названием Inception Block: одновременное применение нескольких разных сверток или pooling-ов, с последующей поканальной конкатенацией результатов (выходные изображения должны быть одинакового размера).

Inception Block
Inception Block

BottleNeck (бутылочное горлышко) - свертки 1 × 1 для уменьшения или увеличения количества каналов.

GoogLeNet - огромная сеть с 22 слоями, состоящая преимущественно из inception блоков.

Проблему затухающего градиента они решили с помощью вспомогательных функций потерь. Идя такая: если при обратном распространении ошибки на слой приходит маленький градиент, то основная функция потерь заменяется на вспомогательную и вглубь начинает распространяться новый градиент, достаточно большой. Такие вспомогательные функции можно было поставить в каждом Inception блоке, но в GoogLeNet их всего две.

GoogLeNet
GoogLeNet

5. ResNet, Residual neural network (Microsoft, 2015)

Свое название архитектура получила благодаря трюку под названием Residual Block. Основная идея в том что входные данные передаются через блоки (слои) без изменений и соединяются с выходным данным блока. Таким образом была решена проблема затухания градиента при обучении очень глубоких нейронных сетей.

Residual Block
Residual Block

Сеть ResNet состоит из Residual Block-ов следующих друг за другом. При этом, вариантов ResNet несколько: ResNet18 (состоящий из 18 слоев), ResNet32 и даже ResNet1024.

ResNet
ResNet

Так же, в ResNet отсутствуют полносвязные слои. Вместо этого, с помощью AvgPooling, тензор масштабируется до размера полносвязного слоя. После пропускается через один полносвязный слой (чтобы на выходе был вектор 1 × 1000) и применятся SoftMax. За счет этого ResNet неважно, сколько пикселей во входном изображении, но, желательно, чтобы размер был кратен 32, т.к. в сети происходит 5 раз уменьшение изображения в 2 раза.

ResNet довольно часто используется как backbone. Например, она используется при прогнозировании последствий извержения вулканов на Камчатке.

Источник: https://habr.com/ru/articles/800077/


Интересные статьи

Интересные статьи

Если вдруг у кого-то не хватает мотивации, или кажется, что для поиска хорошей работы нужно приложить невероятных усилий. Собрали для вас три истории людей — QA, дизайнера и девелопера, &md...
Android установлен примерно на 2,5 миллиардах активных устройств. С чего он начинался? Давайте проверим и разберёмся. Мы протестируем все версии Android, с 1.0 по 9.0, и посмотрим, как ме...
Python-девелопер и писатель Рики Уайт взял интервью у Себастьяна Рамиреса, разработчика из Explosion AI. Но Себастьян не просто разработчик, это заметная фигура в open source сообщест...
СМЫВАТЕЛЬ для инсталляций Читать далее
Довольно часто сталкиваюсь с одним вопросом касательно кода: "Почему написано именно так, а не так?". И я объясняю чем это обусловлено, после чего слушаю мнение оппонента, вследствие чего...