![]() |
![]() |
![]() |
|||||
![]() |
Обзор топологий глубоких сверточных нейронных сетей |
||||||
МЕНЮ Искусственный интеллект Поиск Регистрация на сайте Помощь проекту ТЕМЫ Новости ИИ Искусственный интеллект Разработка ИИГолосовой помощник Городские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Техническое зрение Чат-боты Авторизация |
2018-07-29 16:58 ![]() Это будет длиннопост. Я давно хотел написать этот обзор, но sim0nsays меня опередил, и я решил выждать момент, например как появятся результаты ImageNet’а. Вот момент настал, но имаджнет не преподнес никаких сюрпризов, кроме того, что на первом месте по классификации находятся китайские эфэсбэшники. Их модель в лучших традициях кэгла является ансамблем нескольких моделей (Inception, ResNet, Inception ResNet) и обгоняет победителей прошлого всего на полпроцента (кстати, публикации еще нет, и есть мизерный шанс, что там реально что-то новое). Кстати, как видите из результатов имаджнета, что-то пошло не так с добавлением слоев, о чем свидетельствует рост в ширину архитектуры итоговой модели. Может, из нейросетей уже выжали все что можно? Или NVidia слишком задрала цены на GPU и тем самым тормозит развитие ИИ? Зима близко? В общем, на эти вопросы я тут не отвечу. Зато под катом вас ждет много картинок, слоев и танцев с бубном. Подразумевается, что вы уже знакомы с алгоритмом обратного распространения ошибки и понимаете, как работают основные строительные блоки сверточных нейронных сетей: свертки и пулинг.
Переход от нейрофизиологии к компьютерному зрению
![]()
![]() Gradient-based learning applied to document recognition (1998) Спустя много лет настал 1998 год. Зима прошла. Ян ЛеКунн, который уже давно побывал постдоком одного из авторов статьи об алгоритме обратного распространения ошибки, публикует работу (в соавторстве с другими корифеями нейронных сетей), в которой смешивает идеи сверток и пулинга с бекпропом, в итоге получая первую работающую сверточную нейронную сеть. Ее внедрили в почту США для распознавания индексов. Эта архитектура была стандартным шаблоном для построения сверточных сетей вплоть до недавнего времени: свертка чередуется с пулингом несколько раз, затем несколько полносвязных слоев. Такая сеть состоит из 60 тысяч параметров. Основные строительные блоки — свертки 5 ? 5 со сдвигом 1 и пулинг 2 ? 2 со сдвигом 2. Как вы уже знаете, свертки играют роль детекторов признаков, а пулинг (или сабсемплинг) используют для уменьшения размерности, эксплуатируя тот факт, что изображения обладают свойством локальной скоррелированности пикселей — соседние пиксели, как правило, не сильно отличаются друг от друга. Таким образом, если из нескольких соседних получить какой-либо агрегат, то потери информации будут незначительными. ![]() ImageNet Classification with Deep Convolutional Neural Networks (2012) Прошло еще 14 лет. Алекс Крижевский из той же лаборатории, где был постдоком ЛеКун, добавил последние ингредиенты к формуле. Глубокое обучение = модель + теория обучения + большие данные + железо. GPU позволило значительно увеличить количество обучаемых параметров. Модель содержит 60 миллионов параметров, на три порядка больше, для обучения такой модели использовалось два графических ускорителя. ![]() Другие изображения AlexNet С точки зрения топологии сети это почти тот же LeNet, просто увеличенный в тысячу раз. Добавились еще несколько сверточных слоев, а размер ядер свертки уменьшается от входа сети к выходу. Это объясняется тем, что в начале пиксели сильно скоррелированы, и рецепторную область можно смело брать большую, мы все равно теряем мало информации. Далее мы применяем пулинг, тем самым увеличивая плотность некоррелированных участков. На следующем уровне логично взять чуть меньшую рецепторную область. В итоге у авторов получилась такая вот пирамида из сверток 11 ? 11 –> 5 ? 5 –> 3 ? 3… Обмен данными между GPU ![]() ![]() Также были применены другие трюки для избежания переобучения, и некоторые из них сегодня являются стандартными для глубоких сетей: DropOut (RIP), Data Augmentation и ReLu. Мы не будем заострять внимание на этих трюках, сосредоточимся на топологии модели. Добавлю только, что с 2012 года не нейросетевые модели больше не побеждали в имаджнете. ![]() Very Deep Convolutional Networks for Large-Scale Image Recognition (12 Apr 2014) В этом году вышли две интересные статьи, эта и Google Inception, которую мы рассмотрим ниже. Работа же Оксфордской лаборатории — это последняя работа, придерживающаяся паттерна топологии, заложенного ЛеКуном. Их модель VGG-19 состоит из 144 миллионов параметров и добавляет в архитектуру, помимо 84 миллионов параметров, еще одну простую идею. Возьмем для примера свертку 5 ? 5, это отображение ![]() Модели VGG-* ![]() Network in Network (4 Mar 2014) ![]() ![]() ![]() ![]() In Convolutional Nets, there is no such thing as «fully-connected layers». There are only convolution layers with 1 ? 1 convolution kernels and a full connection table. Жаль только, что авторы, придумавшие столько новых идей, не участвовали в имаджнете. Зато Google вовремя подсуетился и использовал эти идеи в следующей публикации. В итоге гугл разделил призовые места 2014 года с командой из Оксфорда. Going Deeper with Convolutions (17 Sep 2014) ![]() In this paper, we will focus on an efficient deep neural network architecture for computer vision, codenamed Inception, which derives its name from the Network in network paper by Lin et al [12] in conjunction with the famous “we need to go deeper” internet meme [1]. In our case, the word “deep” is used in two different meanings: first of all, in the sense that we introduce a new level of organization in the form of the “Inception module” and also in the more direct sense of increased network depth. In general, one can view the Inception model as a logical culmination of [12] while taking inspiration and guidance from the theoretical work by Arora et al [2]. Произвольное увеличение ширины (количество нейронов в слоях) и глубины (количество слоев) имеет ряд недостатков. Во-первых, увеличение количества параметров способствует переобучению, а увеличение количества слоев добавляет еще и проблему затухания градиента. Кстати, последнее утверждение разрешится ResNet’ом, о которой речь пойдет дальше. Во-вторых, увеличение количества сверток в слое приводит к квадратичному увеличению вычислений в этом слое. Если же новые параметры модели используются неэффективно, например многие из них становятся близки к нулю, тогда мы просто впустую тратим вычислительные мощности. Несмотря на эти проблемы, первый автор статьи хотел поэкспериментировать с глубокими сетями, но со значительно меньшим количеством параметров. Для этого он обратился к статье «Provable Bounds for Learning Some Deep Representations», в которой доказывают, что если вероятностное распределение данных можно представить в виде разреженной, глубокой и широкой нейронной сети, тогда можно построить оптимальную нейронную сеть для данного датасета, анализируя корреляции нейронов предыдущего слоя и объединяя коррелированные нейроны в группы, которые будут нейронами следующего слоя. Таким образом, нейроны поздних слоев «смотрят» на сильно пересекающиеся области исходного изображения. Напомню, как выглядят рецепторные области нейронов на разных уровнях и какие признаки они извлекают. рецепторная область слоя conv1_2 сети VGG-19 Да, вы почти ничего не видите, так как рецептивная область очень маленькая, это вторая свертка 3 ? 3, соответственно, общая область 5 ? 5. Но, увеличив, мы увидим, что фича — это просто детектор градиента. ![]() рецепторная область слоя conv3_3 сети VGG-19 ![]() рецепторная область слоя conv4_3 сети VGG-19 ![]() рецепторная область слоя conv5_3 сети VGG-19 ![]() рецепторная область слоя pool5 сети VGG-19 На ранних слоях (ближе к входу) коррелированные нейроны будут концентрироваться в локальных областях. Это значит, что если несколько нейронов в одной координате (w, h) на плашке могут выучить примерно одно и то же, то в тензоре после первого слоя их активации будут располагаться на небольшом регионе в районе некоторой точки (w, h), а распределены будут вдоль размерности банка фильтров — D. Примерно так: ![]() ![]() свертки 1 ? 1 ![]() свертки 3 ? 3 ![]() свертки 5 ? 5 После вычисления карт признаков для каждой свертки их необходимо каким-либо способом агрегировать, например конкатенировать фильтры. ![]() конкатенация признаков Кстати, для того чтобы не терять оригинальный образ из предыдущего слоя, помимо сверток добавляются еще пулинг-признаки (мы же помним, что операция пулинга не влечет больших потерь информации). Да и вообще, все юзают пулинг — нет причин от него отказываться. Вся группа из нескольких операций называется Inception block. ![]() Additionally, since pooling operations have been essential for the success in current state of the art convolutional networks, it suggests that adding an alternative parallel pooling path in each such stage should have additional beneficial effect, too. ![]()
Итоговая модель выглядит следующим образом: ![]() Rethinking the Inception Architecture for Computer Vision (11 Dec 2015) Спустя год гугл хорошо подготовился к имаджнету, переосмыслил архитектуру инсептрона, но проиграл совершенно новой модели, о которой пойдет речь в следующей части. В новой статье авторы исследовали на практике различные архитектуры и разработали четыре принципа построения глубоких сверточных нейронных сетей для компьютерного зрения:
Помните идею VGG в 2014 году, что свертки большего размера можно факторизовать в стек сверток 3 ? 3? Так вот, гугл пошел еще дальше и факторизовал все свертки в N ? 1 и 1 ? N. ![]() Модели Inception block Что же касается бутылочных горлышек, то предлагается следующая схема. Допустим, если входная размерность Первая оригинальная. ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Deep Residual Learning for Image Recognition (10 Dec 2015) Пришло время изучить работу китайского подразделения Microsoft Research, которому проиграл гугл в 2015 году. Давно было замечено, что если просто стекать больше слоев, то качество такой модели растет до некоторого предела (смотрите VGG-19), а затем начинает падать. Эту проблему называют degradation problem, а сети, полученные стеканием большего количества слоев, — plain, или плоские сети. Авторы смогли найти такую топологию, при которой качество модели растет при добавлении новых слоев. ![]() ![]() ![]() ![]() ![]() ![]() Пример преобразования плоской сети в остаточную сеть Детали построения ResNet-52 на theano/lasagne описаны тут, здесь же упомянем лишь то, что 1 ? 1 свертки эксплуатируются для увеличения и уменьшения размерности, как и завещал гугл. Сеть является fully convolution. ![]() ![]() ![]() ![]() Сравните глубину ResNet’ов и всех предыдущих сетей Еще один интересный слайд авторов показывает, что они сделали прорыв в глубине/качестве сетей. Модель, с которой они победили на имаджнете, содержит меньше параметров, чем 19-слойный VGG, при глубине 152 слоя. ![]() ![]() ![]()
Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning (23 Feb 2016) Спустя несколько месяцев гугл публикует статью, в которой задается вопросом, а будет ли лучше работать их модель Inception, если позаимствовать идеи ResNet’а. И внезапно оказывается, что да, если добавить тождественных связей, то и их модель улучшится. Далее в статье идет множество картинок, которые еще больше подтверждают то, что их модель строится в полуавтоматическом режиме. Результатом статьи становятся модели Inception V4 и Inception ResNet. Inception V4 Если же в общей схеме Inception V4 заменить Inception-блоки на аналогичные, но с shortcut-связью, то получится Inception ResNet. Общая схема сети. ![]() ![]() ![]() ![]() А так, в общем, в статье картинок больше, чем текста. ![]() Identity Mappings in Deep Residual Networks (12 Apr 2016) Если вы заглянули в детали реализации оригинального ResNet, то могли заметить, что нелинейность берется после агрегирования двух ветвей: остаточной функции и тождественной связи. Авторы заявляют, что это не совсем правильная техника и лучше вообще не брать нелинейность после агрегации. Лучше как бы сдвинуть все нелинейности на один шаг назад по остаточным ветвям. Таким образом выход из блока подается на тождественную связь следующего, где он неизмененным доходит до своего выхода; а также на остаточную сеть следующего, где над выходом текущего уже применяется нелинейность. Так удалось обучить сверхглубокую нейронную сеть, состоящую из 1001 слоя. Сравните, еще в 2014 году 19-слойная нейронная сеть считалась «very deep convolutional neural networks». ![]()
Тогда можно рассмотреть две ситуации, в первой ![]() ![]() ![]() ![]() На самом деле авторы исследовали различные конфигурации residual-блока и пришли к выводу, что именно предложенная простая конструкция, со сдвигом нелинейности на шаг назад, самая лучшая. Вариации остаточного блока Тут стоит упомянуть отца глубоких рекуррентных сетей — Юргена Шмидхубера (J?rgen Schmidhuber). Если вы знакомы с его LSTM-моделью, опубликованной еще в 1997 году, то вы легко заметите, что ResNet в предложенной версии — это не что иное, как развернутый LSTM, где скрытые состояния соединены друг с другом по оси времени фиксированной необучаемой связью с весом 1. И неудивительно, что Юрген работал в это же время над очень похожей моделью — Highway Network. Но, похоже, они переусложнили модель, добавив несколько вентилей (gate), и не смогли получить результатов лучше, чем вариант из текущей статьи. ![]() ![]() ![]() Bridging the Gaps Between Residual Learning, Recurrent Neural Networks and Visual Cortex (13 Apr 2016) На следующий день появляется статья, в которой авторы сравнивают ResNet и обычные RNN. Одну мысль из этой статьи считаю нужным упомянуть. Авторы утверждают, что успехи глубоких нейронных сетей объясняются тем, что глубокие сети аппроксимируют рекуррентные сети, которые, в свою очередь, аппроксимируют динамические системы и вообще ближе к тому, как работает мозг. The dark secret of Deep Networks: trying to imitate Recurrent Shallow Networks? Residual Networks are Exponential Ensembles of Relatively Shallow Networks (20 May 2016) Уверен, почти все из вас знакомы с DropOut, стратегией обучения, которая до недавнего времени являлась стандартом при обучении глубоких сетей. Было показано, что такая стратегия эквивалентна обучению экспоненциально большого числа моделей и усреднению результата прогнозирования. Получается построение ансамбля алгоритмом обучения. Авторы данной статьи показывают, что ResNet — это ансамбль по своей конструкции. Показывают они это серией интересных экспериментов. Для начала посмотрим на развернутый вариант ResNet, который получается, если считать два подряд идущих shortcut-соединения как одно ребро flowing graph’а. ![]() ![]() ![]() ![]() Результаты удивительные. В следующем эксперименте авторы строят распределение абсолютных значений градиента, полученных из подсетей разной длины. Оказывается, что для ResNet-50 эффективная длина подсети — от 5 до 17 слоев, на их долю приходится почти весь вклад в обучение всей модели, хотя они занимают всего 45 % от всех длин путей. ![]() Анализ распределения градиентов. ![]() Заключение ResNet продолжает активно развиваться, и различные группы как пробуют что-то новое, так и применяют проверенные паттерны из прошлого. Например, создают ResNet in ResNet.
Если вы прочитали что-то, не упомянутое в данном обзоре, расскажите в комментариях. Уследить за всем при таком потоке новых статей просто не реально. Пока данный пост проходил модерацию в блоге, я успел добавить в список еще две новых публикации. В одной гугл рассказывает про новую версию инсептрона — Xception, а во второй — пирамидальный ResNet. Если спросить у кого-либо, немного разбирающегося в нейронных сетях, какие виды сетей бывают, он скажет обычные (полносвязные и сверточные) и рекуррентные. Похоже, что вскоре появится теоретическая база, в рамках которой все типы нейросетей будут принадлежать к одному классу. Есть теорема универсальной аппроксимации, в которой говорится, что любую (почти) функцию можно приблизить нейросетью. В аналогичной теореме для RNN говорится, что любую динамическую систему можно приблизить рекуррентной сетью. А сейчас оказывается, что и RNN может быть приближена обычной сетью (осталось это доказать, правда). В общем, в интересное время живем. Будем посмотреть. ![]() Источник: habr.com ![]() Комментарии: |
||||||