Этот пост можно скачать в формате PDF здесь.

Это часть серии руководств по архитектуре CNN.

Основная цель - дать представление о DenseNets и углубиться в DenseNet-121 для набора данных ImageNet.

  • Для DenseNets, примененного к CIFAR10, есть еще одно руководство здесь.

Индекс

  • Фон
  • Мотивация
  • Какие проблемы решает DenseNets?
  • Архитектура
  • Резюме

Фон

Плотно соединенные сверточные сети [1], DenseNets, являются следующим шагом на пути дальнейшего увеличения глубины глубоких сверточных сетей.

Мы видели, как мы перешли от LeNet с 5 слоями к VGG с 19 слоями и ResNets, превышающим 100 и даже 1000 слоев.

Мотивация

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

DenseNets упрощают схему подключения между уровнями, представленные в других архитектурах:

  • Сети автомагистралей [2]
  • Остаточные сети [3]
  • Фрактальные сети [4]

Авторы решают задачу, обеспечивающую максимальный информационный (и градиентный) поток. Для этого они просто соединяют каждый слой напрямую друг с другом.

Вместо того, чтобы черпать репрезентативную мощь из чрезвычайно глубоких или широких архитектур, DenseNets использует потенциал сети за счет повторного использования функций.

Какую проблему решает DenseNets?

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

Более того, некоторые варианты ResNets доказали, что многие слои практически не вносят вклад и могут быть отброшены. Фактически, количество параметров ResNets велико, потому что у каждого слоя есть свои веса, которые нужно изучить. Вместо этого слои DenseNets очень узкие (например, 12 фильтров), и они просто добавляют небольшой набор новых карт объектов .

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

Состав

Традиционные нейронные сети с прямой связью соединяют выходные данные слоя со следующим уровнем после применения композиции операций.

Мы уже видели, что обычно этот композит включает в себя операцию свертки или объединение слоев, пакетную нормализацию и функцию активации.

Уравнение для этого будет:

ResNets расширил это поведение, включая пропуск соединения, переформулировав это уравнение в:

Именно здесь DenseNets - это первое отличие от ResNets. DenseNets не суммирует выходные карты объектов слоя с входящими картами объектов, а объединяет их.

Следовательно, уравнение снова принимает форму:

С той же проблемой, с которой мы столкнулись при нашей работе над ResNets, такое группирование карт функций невозможно, если их размеры различаются. Независимо от того, является ли группировка добавлением или объединением. Поэтому так же, как мы использовали для ResNets, DenseNets делятся на DenseBlocks, где размеры функциональных карт остаются постоянными в пределах блока, но количество фильтров меняется между ними. Эти слои между ними называются переходными слоями и обеспечивают понижающую дискретизацию с применением пакетной нормализации, свертки 1x1 и слоев объединения 2x2.

Теперь мы готовы поговорить о скорости роста. Поскольку мы объединяем карты признаков, размер этого канала увеличивается на каждом слое. Если мы сделаем H_l для создания k карт объектов каждый раз, то мы сможем сделать обобщение для l-го слоя:

Этот гиперпараметр k - скорость роста. Скорость роста регулирует, сколько информации добавляется в сеть на каждом уровне. Как так?

Мы могли видеть карты функций как информацию о сети. Каждый слой имеет доступ к своим предыдущим картам объектов и, следовательно, к коллективным знаниям. Затем каждый слой добавляет новую информацию к этим коллективным знаниям в виде конкретных k карт характеристик информации.

DenseNets-B

DenseNets-B - это обычные сети DenseNets, которые используют преимущества свертки 1x1 для уменьшения размера карт функций до свертки 3x3 и повышения эффективности вычислений. Буква B идет после названия слоя Узкое место, с которым вы уже знакомы по работе над ResNets.

DenseNets-BC

DenseNets-C - еще один небольшой шаг вперед к DenseNets-B для случаев, когда мы хотели бы уменьшить количество выходных карт функций. Это уменьшение определяет коэффициент сжатия (тета). Вместо m карт объектов на определенном слое у нас будет theta * m. Конечно, находится в диапазоне [0–1]. Таким образом, DenseNets останется прежним, если theta = 1, и будет DenseNets-B в противном случае.

Чтобы соответствовать работе над ResNets, мы рассмотрим детали случая с набором данных ImageNet. Однако структура CIFAR-10 или SVHN проще, поскольку входные объемы меньше.

Как вы знаете из предыдущих работ над другими архитектурами, я предпочитаю наблюдать, как на самом деле объемы, проходящие через модель, меняют свои размеры. Таким образом легче понять механизм конкретной модели, чтобы иметь возможность адаптировать ее к нашим конкретным потребностям. Я постараюсь следовать обозначениям, близким к официальной реализации PyTorch, чтобы облегчить ее последующую реализацию на PyTorch.

Плотные и переходные блоки

Однако из-за очень плотного количества подключений в DenseNets визуализация становится немного сложнее, чем это было для VGG и ResNets. На рисунке 3 показана очень простая схема архитектуры DenseNet-121, которая будет DenseNet, на которой мы сосредоточимся в ходе этой работы. Это потому, что это самый простой DenseNet среди тех, что были разработаны на основе набора данных ImageNet.

Мы можем сравнить рисунок 3 с рисунком 2 на DenseNet-121. Меры под каждым томом представляют размеры ширины и глубины, тогда как числа вверху представляют размерность карты функций. Я включил, как они получены, чтобы помочь нам лучше понять входящие шаги.

Вам может быть интересно, где байпасные соединения по всей DenseNet, и вы правильно спрашиваете! Тем не менее, я просто хотел сначала нарисовать простейшую схему, которую можно понять, чтобы глубже изучить всю структуру DenseNet. Но для любопытных вы можете заметить, как первое число в добавлении для расчета карт характеристик каждого нового тома совпадает с размером карты характеристик предыдущего тома. Это объяснит обходное соединение, потому что это точно означает, что мы конкатенируем (конкатенация означает добавление измерения, но не добавление значений!) новую информацию к предыдущему тому, который в настоящее время повторно.

Обратите внимание, что 32 - это именно та скорость роста, о которой мы упоминали в начале этого раздела. Итак, что мы можем получить из картинки выше?

- Объем после каждого плотного блока увеличивается на скорость роста, умноженную на количество плотных слоев в этом плотном блоке.

На рисунке 4 мы углубимся и поймем, что на самом деле происходит внутри каждого блока.

Плотные слои

Теперь мы можем понять приведенное выше утверждение. Каждый слой добавляет к предыдущему тому 32 новые карты функций. Вот почему мы переходим от 64 к 256 после 6 слоев. Кроме того, переходный блок работает как свертка 1x1 со 128 фильтрами. с последующим объединением 2x2 с шагом 2, в результате чего размер тома и количество карт функций делятся пополам. Мы можем сделать новые утверждения из этого наблюдения за образцом.

- Объем в плотном блоке остается постоянным -

- Объем и карты функций уменьшаются вдвое после каждого блока перехода -

Однако мы все еще можем пойти на 1 уровень глубже! Нам нужно понимать, что происходит внутри каждого плотного слоя в каждом плотном блоке, поскольку это еще не тривиально. Тогда пойдем за полной картиной!

На новом более глубоком уровне, представляющем первый плотный слой в первом плотном блоке, мы можем увидеть, как на самом деле достигается это поведение добавления 32-кратного количества слоев. Мы выполняем так, как авторы предлагают свертку 1x1 со 128 фильтрами, чтобы уменьшить * размер карты признаков, и выполнить более дорогостоящую свертку 3x3 (не забудьте включить заполнение, чтобы размеры оставались постоянными) с этим выбранным числом 32 карт признаков роста. темп.

Затем входной объем и результат двух операций (которые одинаковы для каждого плотного слоя в каждом плотном блоке) объединяются в действие добавления новой информации к общему знанию сети.

Процитированные работы

[1] Дж. Хуанг, З. Лю и Л. ван дер Маатен, «Плотно связанные сверточные сети», 2018.

[2] Р. Кумар, К. Гредд и Дж. Шмидхубер, «Сети автомагистралей», 2015 г.

[3] К. Хе, Х. Чжан, С. Рен и Цзянь Сунь, «Глубокое остаточное обучение для распознавания изображений», 2015 г.

[4] Дж. Ларссон, М. Мэйр и Г. Шахнарович, «FractalNet: сверхглубокие нейронные сети без остатков», 2017.