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

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

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

  • 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. Например, вот недавнее упоминание в статье о прогнозировании последствий извержения вулканов на Камчатке.

© Habrahabr.ru