Продолжаю рассказывать про жизнь Inception architecture — архитеткуры Гугла для convnets.
(первая часть — вот тут)
Итак, проходит год, мужики публикуют успехи развития со времени GoogLeNet.
Вот страшная картинка как выглядит финальная сеть:
image
Что же за ужас там происходит?


Disclaimer: пост написан на основе отредактированных логов чата closedcircles.com, отсюда и стиль изложения, и уточняющие вопросы.


В этот раз авторы пытаются сформулировать какие-то основные принципы построения архитектуры эффективных сетей (собственно статья — http://arxiv.org/abs/1512.00567).
(напомню, цель Inception architecture — быть прежде всего эффективной в вычислениях и количестве параметров для реальных приложений, за то и любим)
Принципы они формулируют следующие:


  • Очень много сигналов близки друг к другу в пространстве (т.е. в соседних "пикселах"), и этим можно пользоваться, чтобы делать convolution меньшего размера.
    Мол, раз соседние сигналы часто скоррелированы, то можно уменьшить размерность перед convolution без потери информации.
  • Для эффективного использования ресурсов нужно увеличивать и ширину, и глубину сети. Т.е. если ресурсов стало например в два раза больше, эффективнее всего и сделать слои шире, и сеть глубже. Если сделать только глубже, будет неэффективно.
  • Плохо иметь резкие bottlenecks, то есть леер с резким уменьшением параметров, особенно в начале.
  • "Широкие" слои быстрее обучаются, что особенно важно на высоких уровнях (но локально, т.е. вполне можно после них уменьшать размерность)

Напомню, прошлая версия кирпичика построения сети выглядела вот так:



Какие они делают в нем модификации


  • Во-первых, замечаем, что можно заменить большой и жирный 5x5 convolution на два последовательных по 3x3, и мол так как сигналы скоррелированы, немного потеряем. Экспериментально оказывается, что делать между этими 3x3 нелинейность лучше, чем не делать.


  • Во-вторых, раз уж такая пьянка, давайте заменим 3x3 на 3x1 + 1x3.

image


Тут мы обнаруживаем, что свертки-то делать становится дешево, и тогда почему бы вообще делать не 3x1 + 1x3, а сразу nx1 + 1xn!
И делают, аж на 7, правда не в начале сетки. Со всеми этими апгрейдами основной кирпич становится таким:



  • В-третьих, следуя завету "не создавай боттлнеков", думают про пулинг.
    С пулингом какая проблема… Вот пускай пул уменьшит картинку в два раза, а количество фич после пула в два раза больше.
    Можно сделать пул, а потом convolution в меньшем разрешении, а можно сначала convolution, а потом пул.
    Вот эти варианты на картинке:


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


Посему они предлагают гибридную схему — давайте сделаем на половину фич пул, а на половину — convolution.



И так как после пула количество фич типично раза в два увеличивается, боттлнека не будет. Пул сожмет предыдущий не уменьшая количество фич, некоторые convolutions будут прогнаны в полном разрешении, но с количеством фич поменьше. Нетворк научится разделять, что требует полного разрешения, а для чего достаточно пула.


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

И вот сеть — это несколько ранних convolutions, а потом вот такие кирпичики, перемежающиеся пулом. Всего в сети 11 inception layers.
Отсюда и тот ужас на первом рисунке.


Еще они обнаружили, что дополнительные классификаторы по бокам не сильно-то ускоряют тренировку, а скорее помогают, потому что работают как регуляризаторы — когда они к ним подключили Batch Normalization, сеть стала предсказывать лучше.


Что еще...


Они предлагают еще один трюк для дополнительной регуляризации — так называемый label smoothing.
Идея вкратце такая: обычно target label для конкретного сэмпла это 1 там где класс правильный, и 0 где класс неправильный.
Это означает, что если нетворк уже очень уверен в правильности класса, градиент все равно будет толкать в увеличение и увеличение этой уверенности, потому что 1 наступает только на бесконечности из-за softmax, что ведет к оверфиттингу.


Они предлагают смешивать one-off target с распределением пропорциональным тупо распределению классов по датасету, чтобы в других классах были не нули, а какие-то маленькие значения. Это дает выиграть еще процентик чтоли, то есть немало.


Итого


И вот вся эта машинерия жрет в 2.5 раз больше вычислительных ресурсов, чем Inception-v1 и достигает значительно лучших результатов.
Они называют основную архитектуру Inception-v2, а версию, где дополнительные классификаторы работают с BN — Inception-v3.
Вот эта Inception-v3 достигает 4.2% top5 classification error на Imagenet, а ансамбль из четырех моделей — 3.58%.


И вот с этим добром мужики из Гугла собрались выиграть Imagenet в 2015-м.
Однако, случились ResNets и выиграли Kaiming He сотоварищи из Microsoft Research Asia с результатом… 3.57%!!!
(надо отметить, что в object localization результат у них принципиально лучше)
Но про ResNets я видимо в другой раз расскажу.


интересно средний хомо сапиенс какую ошибку покажет на этих картинках.
Единственный широко обсуждающийся эксперимент был проведен Andrey "наше все" Karpathy.
http://karpathy.github.io/2014/09/02/what-i-learned-from-competing-against-a-convnet-on-imagenet/
Он протестировал себя на какой-то части датасета и у него получилось 5.1%.
Это тоже top5, но может человеку сложнее top5 выбирать.
Кстати можно самому провериться — http://cs.stanford.edu/people/karpathy/ilsvrc/
И это реально сложно. Покажут тебе какой-то подвид средиземноморского зяблика и гадай.
Поделиться с друзьями
-->

Комментарии (9)


  1. sergehog
    31.05.2016 12:02
    +1

    Видно что научная область еще не зрелая. Танцы с бубнами и перетасовки разных приемчиков. Большая картина еще не сложилась. Лет через 5 будем иметь стандартную архитектуру сети в которой все учтено а еще через 5 поймем что все делали не правильно и надо по другому. Но тогда уже интерес к нейро-сетям угаснет :)


    1. sim0nsays
      31.05.2016 19:30

      Хорошо бы через 5… За последние 4 прогресс в понимании большой картины так себе.


  1. BelBES
    31.05.2016 14:39
    +2

    И вот вся эта машинерия жрет в 2.5 раз больше вычислительных ресурсов, чем Inception-v1 и достигает значительно лучших результатов.

    так получается, что GoogLeNet в любом случае при сравнимом качестве с ResNet (0.01% — это не принципиальный проигрыш) работает существенно быстрее, т.к. сложность для ResNet-152 ~12 GFLOP, а для GoogLeNet ~3GFLOP (если считать 2x от Inception v1).


    1. sim0nsays
      31.05.2016 19:30

      Там 2.5x, но да, все так.


      1. BelBES
        31.05.2016 20:56

        Интересно, насколько можно повысить качество этого гугленета, если прокинуть residual-связи вокруг inception'ов… по идее должно хватить для того, чтобы стать top-1


        1. sim0nsays
          31.05.2016 21:12

          Ждите следующей части, все будет!


    1. Dark_Daiver
      31.05.2016 21:53

      Я безумно извиняюсь за некоторый оффтоп, но не могу не задать вопрос
      Есть ли какое-нить доступное объяснение, почему «классические» (не residual) глубокие сети с ростом числа уровней начали давать худший training error?


      1. BelBES
        31.05.2016 22:10
        +1

        Ну, во первых, при тренировке достаточно глубоких сетей возникает пробелма с исчезающими градиентами. Но эту проблему вроде бы достаточно эффективно побеждают за счет использования Batch Normalization. И в статье про ResNet авторы предположили иную природу такого поведения, а именно то, что при увеличении глубины сети, экспоненциально убывает скорость сходимости, соответственно тупо не получается дождаться сходимости процесса обучения. А residual connections позволяют усиливать активацию на каждом слое, тем самым более эффективно тренирую глубокие слои. Но, даже для таких сетей авторы уткнулись в то, что с некоторого момента возникает проблема с тем, что в датасетах недостаточно данных, чтобы обобщиться с еще большим качеством (насколько я помню, даже для 1000-слойного резнета они уже пришли к выводу, что он мог бы и лучше результаты показать, но данных не достаточно).


        1. Dark_Daiver
          01.06.2016 14:13

          Ага, понял, спасибо)
          Про 1200-слойную сеть я помню, в статье вроде писали что у них наступило переобучение