Предыдущая часть здесь — https://habrahabr.ru/post/302242/.
Мы остановились на том, Inception-v3 не выиграл Imagenet Recognition Challange в 2015-м, потому что появились ResNets (Residual Networks).
Что такое вообще ResNets?
Disclaimer: пост написан на основе отредактированных логов чата closedcircles.com, отсюда и стиль изложения, и уточняющие вопросы.
Это результат работы людей в Microsoft Research Asia над проблемой тренировки очень глубоких сетей (http://arxiv.org/abs/1512.03385).
Известно, что если тупо увеличивать количество уровней в каком-нибудь VGG — он начнет тренироваться все хуже и хуже, и в смысле точности на тренировочном сете, и на validation.
Что в некотором смысле странно — более глубокая сеть обладает строго большим representational power.
И, вообще говоря, можно тривиально получить более глубокую модель, которая не хуже менее глубокой, тупо добавив несколько identity layers, то есть уровней, которые просто пропускают сигнал дальше без изменений. Однако, дотренировать обычным способом до такой точности глубокие модели не получается.
Вот это наблюдение, что всегда можно сделать не хуже identity, и есть основная мысль ResNets.
Давайте сформулируем задачу так, чтобы более глубокие уровни предсказывали разницу между тем, что выдают предыдущие лееры и таргетом, то есть всегда могли увести веса в 0 и просто пропустить сигнал.
Отсюда название — Deep Residual Learning, то есть обучаемся предсказывать отклонения от прошлых лееров.
Более конкретно это выглядит следующим образом.
Основной building block сети — вот такая конструкция:
Два слоя с весами (могут быть convolution, могут быть нет), и shortcut connection, который тупо identity. Результат после двух лееров добавляется к этому identity. Почему каждые два уровня, а не каждый первый? Объяснений нет, видимо на практике заработало вот так.
Поэтому если в весах некого уровня будет везде 0, он просто пропустит дальше чистый сигнал.
И вот сначала они строят версию VGG на 34 леера, в которой вставлены такие блоки и все лееры сделаны поменьше, чтобы не раздувать количество параметров.
Оказывается, тренируется хорошо и показывает результаты лучше, чем VGG!
Как развить успех?
MOAR LAYERS!!!
Чтобы получилось больше лееров, надо делать их полегче — есть идея вместо двух convolutions делать например один и меньшей толщины:
Было как слева, сделаем как справа. Количество и вычислений, и параметров уменьшается радикально.
И вот тут пацанам начинает переть и они начинают тренировать версию на 101 и 152(!) леера. Причем даже у таких сверх-глубоких сетей количество параметров меньше, чем у толстых версий VGG.
Финальный результат на ансамбле, как было упомянуто раньше — 3.57% top5 на Imagenet.
Разве там главная идея была не в том, что в очень глубоких сетях остро стоит проблема Vanishing Gradients, а Residual архитектура позволяет ее кое-как решить?
Это хороший вопрос!
Авторы ResNets исследуют этот вопрос в меру сил, и им кажется, что проблема vanishing gradients хорошо решается разумной инициализацией и Batch Normalization. Они смотрят на величину градиентов, которые попадают в нижние слои, она в целом разумная и не затухает.
Их теория в том, что более глубокие сетки просто экспоненциально медленнее сходятся в процессе тренировки, и поэтому такой же точности мы просто не успеваем дождаться с теми же вычислительными ресурсами.
вопрос — как работает back propagation c identity link?
Передает единицу, обычная производная.
Отдельно нужно сказать, что в области идет активное развитие и обсуждение механизмов ResNets, соединять результаты слоев арифметическими операциями оказалось благодатной идеей.
Вот только несколько примеров:
http://torch.ch/blog/2016/02/04/resnets.html — мужики в Facebook исследуют, где лучше вставлять residual connections.
https://arxiv.org/abs/1605.06431 — теория о том, что ResNets представляют собой огромный ансамбль вложенных сетей.
https://arxiv.org/abs/1605.07146 — применение идей ResNets для тренировки очень широких, а не глубоких сетей. Кстати, топовый результат на CIFAR-10, for what it's worth.
https://arxiv.org/abs/1605.07648 — попытка конструировать и тренировать глубокие сети без residual connections в чистом виде, но все же с арифметикой между выходами слоев.
Ну так вот, мужики в Гугле смотрят на этот мир и продолжают работать
Результат работы — Inception-v4 и Inception-Resnet (http://arxiv.org/abs/1602.07261)
Кроме ResNets, основное что изменилось — это появление TensorFlow.
В статье рассказывается, что до TensorFlow модель Inception не влезала в память одной машины, и приходилось ее тренировать распределенно, что ограничивает возможности оптимизации. А вот теперь можно не сдерживать креатив.
(я не очень понимаю, как конкретно это происходило, вот обсуждение догадок — https://closedcircles.com/chat?circle=14&msg=6207386)
После этой фразы пацаны перестают объяснять, чем были вызваны изменения в архитектуре, и тупо постят три страницы полные вот таких картинок:
И есть у меня ощущение, что много там автоматики в построении архитектуры, но они пока не палятся.
В общем, у них есть Inception-v4, в которой нет Residual connections, и Inception-ResNet-2, у которой сравнимое количество параметров, но есть residual connections. На уровне одной модели результаты у них очень близкие, ResNet выигрывает чуть-чуть.
А вот ансамбль из одной v4 и трех ResNet-2 показывает новый рекорд на Imagenet — 3.08%.
Напомню прошлые вехи. Первая сетка, которая победила в Imagenet Recongition challenge, сделала это с ошибкой 15% в 2012. В конце 2015 допилили до 3.08%. Разумная оценка среднего результата человека — ~5%. Прогресс, как мне кажется, впечатляет.
В целом, Inception — это пример прикладного R&D в мире deep learning
Изначально очень простая архитектура с набором convolution layers, после которых следуют несколько fully connected layers, с каждым годом становится все более и более монструозной ради эффективности. И возможно есть один человек, который понимает все детали архитектурных микрорешений. А может и нет уже.
Полную архитектуру Inception-ResNet на одной картинке я уже сходу не нашел. Похоже, никому не пришло в голову ее нарисовать.
Полная схема на странице 7, рис 15, только там все слои не разрисованы целиком, а просто блоками обозначены. Думаю иначе только на ватман пришлось бы печатать, а особо понимания не добавило бы.
Я имел ввиду, что полная с точностью до финальных блоков. Для прошлых версий я такие картинки постил.
Тут раза в три шире получится картинка :)
Дада.
Забавная несвязанная с остальным деталь — они часто делают non-padded convolutions, то есть convolution layers, которые уменьшают размер картинки на 2 пикcеля с каждой стороны. Оптимизируют байты, практически!
ты сравниваешь странные вещи. человеческий результат — это топ1, а компутерный — это топ5, когда выбираются 5 подходящих категорий. в топ1 у компутеров результаты до сих пор где-то в районе double digits...
Не, человеческий — это тоже top5. Top1 человеку на imagenet тоже нечего делать, слишком большая неопределённость.
Вот как пример —
Какой класс у этой картинки? Например, есть классы "horse" и "woman's clothing".
Но правильный ответ, конечно, "hay".
good luck with top1.
разумеется. сена-то вон сколько. а бабы с конем еле-еле!
Комментарии (16)
supersonic_snail
14.06.2016 15:19+5> И есть у меня ощущение, что много там автоматики в построении архитектуры, но они пока не палятся.
Согласен. Вот что они пишут в первой статье про Inception: «This suggest promising future work towards creating sparser and more refined structures in automated ways».
Больше всего печалит, что Imagenet challenge сейчас доступен только для компаний типа гугла. Побеждающие алгоритмы — усреднения по 10-20 разным сетям, каждая из которых обучалась с неделю на распределенном кластере из десятков машин. Ну и как с этим соперничать какой-нибудь университетской лабе? Как мне кажется, единственный вариант тут — это что-то принципиально новое. Любопытно выглядит recurrent visual attention, что-то вроде [1]. В теории, можно очень сильно уменьшить количество вычислений. На практике все как обычно. Я сейчас как раз над этим работаю, если интересно — запилю пост, как будут какие-то вменяемые результаты на imagenet-е.supersonic_snail
14.06.2016 15:34+2Пардон, забыл добавить ссылку.
[1] https://arxiv.org/abs/1502.04623
BelBES
14.06.2016 23:31Насчет ImageNet да, чего-то прорывного и быстросходящегося пока не придумали… но, например, для физиономий пацаны из Google/Facebook тренировались десяткаях и сотнях миллионов картинок, а потом до задачи идентификации лиц дотунялись руки у Андрея Зисермана и он уделал всех, натренировавшись на базе всего из ~1 миллиона изображений лиц…
supersonic_snail
15.06.2016 10:34Это вы про какую работу? Последнее, что я читал из face recognition — DeepFace от фейсбука. Подозреваю, что за два года там много чего поменялось.
BelBES
15.06.2016 10:52Про Deep Face Recognition от чуваков из VGG. Работа уже старенькая, но результаты впечатляют, учитывая разницу в размере датасетов. Наглядный пример того, как университетская исследовательская группа уделала IT-гигантов… хотя, это скорей исключение из правил)
leshabirukov
15.06.2016 15:51У Джеффа Хокинса в «Об Интеллекте» есть такая мысль, что в процессе обучения высокоуровневая функция, типа распознавания слов может сместиться из более высокого слоя сети в более низкий. Это как учимся читать сначала по буквам, складывая буквы в слова, а с накоплением опыта начинаем читать слово сразу.
Возможно, как дополнительный бонус, identity-слои сделают возможным такое поведение, «дав функциям пространство для манёвра», когда один слой склеивается с другим, оставляя на своём прежнем месте identity. Впрочем, механизм такого перемещения я себе не представляю.
AlexeyAB
19.06.2016 01:23А какие перспективы у ResNet-1001 и выше относительно Inception-v4 и Inception-ResNet-2?
ResNet-1001 на https://arxiv.org/abs/1603.05027
Современные сети типа Inception-v4 и Inception-ResNet-2 как-то учитывают, что большинство объектов могут изменяться не сильнее, чем эластичная трансформация (перспективная трансформация + изгибы ...) или даже чем жесткая перспективная трансформация (повороты, сдвиги, изменение масштаба и изменение перспективы) — то что активно использовалось в Feature-based алгоритмах для Representation Learning?
Например, насколько разными для сети будут эти 2 изображения, на которых все features повернуты и наклонены, и взаимное расположение этих features повернуто и наклонено?
sim0nsays
19.06.2016 08:49Сверх-глубокие сети на 1000+ слоев пока не получается тренировать на картинках разрешения тех, что в ImageNet (тупо не тянет железо), поэтому сравнивать их с описанными решениями тяжело. Их тренируют на CIFAR-10 и CIFAR-100, где картинки 32x32.
Про трансформации — непосредственно в архитектурах зашита только устойчивость к сдвигу (из-за того как работают convolution layers), устойчивости к остальным трансформациями люди добиваются так называемым augmentation — т.е. создают новые тренировочные картинки из старых и учат сеть на них тоже. Чем меньше данных для обучения, тем более важным становится augmentation.BelBES
19.06.2016 13:37Сверх-глубокие сети на 1000+ слоев пока не получается тренировать на картинках разрешения тех, что в ImageNet (тупо не тянет железо), поэтому сравнивать их с описанными решениями тяжело. Их тренируют на CIFAR-10 и CIFAR-100, где картинки 32x32.
Хм, а в чем там проблема? Неужели даже 1 картинка не влазит в память для прямого/обратного прохода? А под батч >1 картинки масштабировать за счет кучи GPU устройств. Вроде бы в статьях обычно пишут аля "на ImageNet мы еще не успели посчитаться, да и лень нам, т.ч. вот результаты на CIFAR", при этом вроде бы железо теоретически позволяет параллелить:)AlexeyAB
19.06.2016 14:40Предполагаю, что Inception-сети оптимальнее по соотношению скорость/качество, чем MSRA ResNet. Т.е. если есть достаточно вычислительных мощностей, то добивая ещё слоев в Inception-сеть и сравняв по скорости с ResNet-1001 мы получим меньше ошибок на Inception.
Ещё помимо времени обучения есть time limit в процессе самого распознования. Например Amax, которая тоже победила в нескольких категориях на ImageNet 2015, пишет следующее в категории «Task 3b: Object detection from video with additional training data»:
only half of the videos are tracked due to deadline limits, others are only detected by Faster RCNN (VGG16) without tempor smooth.
http://image-net.org/challenges/LSVRC/2015/results#vid
Можно параллелить батчи при обучении на множество GPU.
Например, на nVidia DGX-1 из 8 x P100 можно обучить AlexNet примерно в 4 раза быстрее, чем на 1 x P100.
Но DGX-1 вышел только месяц назад и в нем впервые для лучшей масштабируемости используется nvLink со скоростью обмена на 1 чип до 80 GB/s, что в 5 раз быстрее, чем 16 GB/s (PCIe 3.0 16x). Плюс сам P100 быстрее на 40%, чем предыдущая GPU M40.
Интересно за сколько на DGX-1 обучиться сеть на ResNet-1001 для FasterRCNN обнаружения объектов?
JustRoo
Очень крутые посты, спасибо большое.