[Этот пост содержит резюме статей по машинному обучению, которые отражают основные достижения в технике сверточных сетей. Все еще любопытно, почему все эти сообщения связаны с днями месяца? Посмотрите это объяснение здесь]

День 12: ResNet

Или «Сеть ветвящихся путей»

В этом резюме основное внимание уделяется старому, но полезному в мире подходов к глубокому обучению (потому что, со скоростью движения области, статья, выпущенная в конце 2015 года, превращается в комфортный средний возраст). Честно говоря, немного стыдно просто небрежно упомянуть, что статья ResNet была выпущена в конце 2015 года, когда одно из самых известных достижений ResNet - победа в конкурсе ImageNet 2015, причем со значительным отрывом. Что еще более важно, по крайней мере, на мой взгляд, идея остаточных капсул, которые реализуют характерное пропускное соединение ResNet, получила широкое распространение как часть, смешанная и согласованная с другими сетями; Если вы посмотрите на статьи, которые я резюмировал за последние почти две недели, вы увидите, что в большом количестве из них есть остаточные блоки, идея, зародившаяся в этой статье. Итак, что такое ResNet?

Во-первых, «ResNet» означает «Остаточная сеть». На механическом уровне эта сеть работает, структурируя каждый уровень сети, изучая дополнительное улучшение входных данных. То есть: выход из слоя t + 1 - это значение активаций на уровне t, добавленное к функции t, созданной посредством применения весов t + 1. Почему такой подход был правдоподобным? Интуиция авторов ResNet началась с любопытного осознания того, что добавление слоев к существующей модели приведет к уменьшению ошибки обучения. Теперь разумным мгновенным ответом на это будет то, что более глубокие слои приводят к переобучению модели. Однако, если бы это было так, это проявилось бы как плохое обобщение в виде плохой производительности на тестовом наборе. Модель с переобучением почти по определению должна демонстрировать очень высокую производительность обучающего набора. В качестве простого мысленного эксперимента авторы утверждали, что, если бы более глубокая сеть была должным образом оптимизирована, более глубокий слой не мог бы работать хуже, чем более мелкая сеть, поскольку, если бы не было больше ценности из более глубоких слоев , сеть должна просто изучить сопоставление идентификаторов, чтобы значения, выходящие из уровня, были такими же, как и входящие. Авторы предположили, что это сопоставление идентификаторов на самом деле довольно сложно изучить, и что для сети трудно найти это потенциальное решение с помощью SGD. Поэтому они предложили: почему бы не сделать идентификацию самым легким для сети изучением по умолчанию? Поскольку обычно инициализируются сети с небольшими весами с центром на нуле, каждый уровень, как ожидается, будет начинаться с того, что ничего не добавит к активациям из уровня ниже, и будет отодвигаться от этой начальной точки только в том случае, если есть сильное улучшение потери, возникающие при вычислении определенной «функции невязки» поверх данного слоя.

Используя эту сеть, авторы ResNet смогли обучить сеть со 152 уровнями, что примерно на порядок больше, чем все, что было обучено до этого момента. С помощью этой модели они отметили улучшение прогресса ImageNet более чем на 30%.

И последний интересный лакомый кусочек: статья здесь, которая выдвигает другую теорию эффективности ResNets. Они утверждают, что вместо увеличения концептуальной глубины ценность ResNet проистекает из того факта, что пропускаемые соединения (проходящие вперед, если значение уровня, без какого-либо преобразования) создают множество путей через сеть с разными - длина пути. Авторы предполагают, что эти многочисленные пути, по сути, работают как ансамбль в окончательной производительности сети. Хорошо известный трюизм в машинном обучении заключается в том, что ансамблирование, по сути, всегда дает вам лучшую модель. В этом учете в ResNet важна не глубина, а большое количество путей по всей сети.

День 17: Начало

Ах, Google. К вам можно испытывать множество чувств, от смущения по поводу ваших многочисленных служебных привилегий до смутного беспокойства по поводу вашего доброжелательного, но всеобъемлющего присутствия в нашей цифровой жизни. Однако на данный момент мое самое сильное чувство по отношению к нашим друзьям из Маунтин-Вью - это глубокое чувство удовольствия от того, как они называют свои модели машинного обучения. Архитектура, к которой я обращаюсь в этом посте, имеет два названия, одно из которых представляет собой шутливый каламбур (GoogLeNet, в честь пионера глубокого обучения Яна ЛеКуна и его оригинальный LeNet), а другое - глупая интернет-шутка. (модель «Начало» в отношении стратегий по углублению их сети, названная в честь мема «мы должны идти глубже», взятого из одноименного фильма). [Кроме того, хотя я не уверен, что это модель машинного обучения, их механизм синтаксического анализа Parsey McParseface вызывает у меня глубокое восхищение].

Помимо забавных названий, Начальная архитектура - это документ, который сейчас находится в солидном, респектабельном среднем возрасте в мире литературы по машинному обучению (впервые участвовавший в конкурсе ImageNet в 2014 году, который он выиграл), но также и документ, который представил некоторые идеи, которые оставалась актуальной, и статьи на их основе еще выходили в 2016 и 2017 годах.

В то время как шутливое название этой статьи относится к углублению, и это правда, что эта статья была особенно глубокой, когда она вышла, ее основная инновация была меньше связана с глубиной (по крайней мере, в том смысле, в котором мы обычно думаем о глубине сети, поскольку количество слоев функциональной композиции) и многое другое, связанное с шириной. Поскольку возможно, что разные люди могут использовать здесь разную терминологию, под шириной я подразумеваю «количество фильтров». Проблема возникла из-за того, что команда Google хотела попробовать изучить несколько размеров сверточных фильтров на каждом уровне. Типичная свертка, о которой вы, возможно, слышали, берет некоторый входной слой, возможно, размером 100 x 100, и сканирует фильтр размером, часто 3x3, по этому изображению, по существу вычисляя сходство между шаблоном этого фильтра и значениями RGB в каждом скользящем окне. патча. Но что, если вы захотите использовать свертку 5x5 в дополнение к свертке 3x3? Проблема с выполнением этого заключается в том, что, поскольку эти фильтры являются двумерными, фиксированное увеличение ширины фильтра свертки приводит к полиномиальному увеличению количества параметров, необходимых для каждого фильтра: с 9 до 25.

Второй важный факт, который следует здесь иметь в виду, заключается в том, что по мере того, как сверточные сети переходят на более высокие уровни абстракции, они обычно увеличивают количество фильтров, используемых в каждом слое, даже когда пространственные размеры изображения уменьшаются, чтобы охватить еще больше. широкие области. Это означает, что на 3-м или 4-м уровне традиционная сеть может иметь 192 изученных фильтра. Если бы вы попытались применить к нему фильтр 5x5, каждый фильтр в пространстве 5x5 должен был бы иметь размер 5 x 5 x 192 (= 4800 параметров). Тогда, даже если вы хотите быть консервативным и вывести только эквивалентное количество фильтров, у вас будет 192 x 5 x 5 x 192, или 921 600 параметров, только для этого слоя и только для этого набора фильтров свертки. Вы можете увидеть, как это может стать огромным в спешке. Это проблематично для обучения, но также создает проблемы для развертывания модели: чем больше параметров вам нужно отслеживать, тем труднее вам будет пытаться использовать ее на меньшем устройстве, например на мобильном устройстве.

Решение, которое придумала команда Google, заключалось в следующем: что, если бы мы могли заставить сеть проводить какое-то уменьшение размерности между 192-слойным выходом нижнего уровня и сверткой 5x5, которую мы хотим применить поверх него? Чтобы понять эту интуицию, важно подумать о том, как работает свертка, и о двух разных видах задач, которые она выполняет. Во-первых, свертка «смешивает» или объединяет данные по пространственным измерениям, используя информацию со всей области фильтрации для построения выходных данных. Менее подчеркиваемый факт заключается в том, что он также делает то же самое по всем каналам: изучает веса, которые объединяют фильтры из более ранних слоев (начиная с R, G и B в самом раннем вводе) таким образом, чтобы сделать их более полезными в дальнейшем.

Выполняя уменьшение размерности (например, со 192 слоев до всего 16) перед нашей большой сверткой, мы, по сути, разделяем эти две функции свертки, выполняя большую часть нашего микширования каналов при этом начальном уменьшении размерности, а затем выполняя затем пространственное смешивание с использованием меньшего и более сжатого набора слоев. Конкретный вид уменьшения размерности, используемый этой сетью, называется сверткой 1x1, где для каждого фильтра, который мы хотим появиться в нашем слое уменьшения размерности (в данном случае 16), у нас есть свертка 1 x 1 x 192, которая мы применяем. Итак, мы изучаем 16 взвешенных комбинаций фильтров, применяемых на единичной основе. Затем мы применяем к этому большую свертку 5x5, но вместо наших предыдущих 480 000 параметров теперь у нас есть только (для уменьшения размерности и свертки вместе) 5 x 5 x 16 + 192 x 16 = 3470 параметров, что снижает его на более чем на два порядка.

В архитектуре Inception, используемой для ImageNet, этот подход использовался до сверток 3x3 и 5x5 на многоуровневых уровнях сети. Он также сопровождался сверткой 1x1 (без чего-либо еще) и слоем максимального объединения (который я сейчас опущу). В общем, каждая из этих параллельных дорожек выводит некоторое количество фильтров с одинаковым размером вывода, и все эти фильтры объединяются вместе для подачи в следующий «начальный блок», где этот процесс повторяется снова.

Одно интересное расширение этой работы появилось в 2017 году, когда появилась статья XCeption Франсуа Шоле. Здесь он проверяет, можете ли вы пойти еще дальше с этой идеей разделения микширования по каналам и по пространству, где, как и в оригинальном Inception, вы сначала выполняете свертку 1x1, чтобы уменьшить размерность, и, во-вторых, вы затем выполняете пространственное свертки * на каждом фильтре независимо *, без перекрестного микширования. Возможно, удивительно, что этот метод превзошел исходную структуру Inception, предполагая как то, что исходная модель была на чем-то основана, так и то, что ее первоначальная конструкция, возможно, не зашла достаточно далеко.

День 18: Обнаружение пневмонии с помощью DenseNet

Я начал это резюме с намерением сделать его просто примером глубокого обучения, применяемого в дикой природе для распознавания болезней с помощью рентгеновских лучей, но затем понял, что этот проект на самом деле не включает значимого объема специализации предметной области, а просто простая реализация хорошо известной архитектуры. Итак: я дам краткое введение в прикладную задачу, а затем погрузлюсь во внутреннюю механику этой архитектуры, называемой DenseNet.

Первоначальная статья, написанная группой авторов, из которых наиболее известен Эндрю Нг из компании Coursera, использует сверточную сеть, чтобы сделать рентгеновский снимок передней грудной клетки и дать прогноз наличия болезни и приступа течки. карта того, где на изображении присутствуют наиболее сильные визуальные свидетельства болезни. Они вытесняют из воды все предыдущие машинные решения и, что более важно, либо соответствуют, либо превосходят точность четырех экспертов-радиологов, которых они наняли для оценки своего испытательного набора. Что удивительного в этом подходе, так это то, насколько он прост. В сети, которую они использовали, чтобы победить обученных радиологов, не было ничего особенного или умного. Это было не так просто, как взять предварительно забронированную модель и применить ее к этому набору данных, поскольку, вероятно, все еще была необходима обширная настройка параметров, но довольно близко.

Модель, которую они использовали, называлась DenseNet, и она основана на наблюдении, первоначально использованном в ResNet: типичная архитектура машинного обучения вынуждает сеть использовать свои веса для отслеживания значений функций с более низких уровней в дополнение к изучению новых составных функций. . В ResNet они решают эту проблему, рассматривая вклад каждого слоя как аддитивный, и каждый слой просто обучается изучать аддитивное различие по сравнению с предыдущими функциями. Но проблема со структурой ResNet заключается в том, что она фактически не дает сети доступ к использованию функций более низкого уровня как таковых, отличных от функций более высокого уровня, к которым они добавляются. После того, как эта операция сложения будет выполнена, она не обратима. Это привело к интуиции, лежащей в основе DenseNet: вместо того, чтобы арифметически добавлять новые слои к предыдущим слоям, почему бы не объединить их в конец вектора? Итак, в конце первого слоя вы получаете на выходе все фильтры первого слоя; в конце второго уровня он выводит массив, содержащий как фильтры первого слоя, так и фильтры второго уровня, которые были изучены поверх первого слоя. Затем эти два набора функций вместе передаются на третий уровень в качестве входных данных и так далее. Одна интересная особенность этого заключается в том, что вы фактически можете использовать меньше параметров, потому что на каждом слое вы добавляете меньшее количество фильтров (поскольку, если какой-то слой имеет 100 фильтров на входе, а на выходе 12, следующий слой по-прежнему содержит все 112 фильтры в качестве входных).

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

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