Как спроектировать нейронную сеть. Мы поговорим о том, как спроектировать нейронную сеть в 2020 году, и рассмотрим некоторые полезные методы, появившиеся или популяризировавшиеся в период с 2018 по 2020 год. видео, я также рассмотрю некоторые из наших недавних статей и объясню, как мы с коллегами проектировали нейронные сети для ограниченных сред. Хорошо, давайте начнем!

Мой первый совет остается прежним. Вам действительно не нужно тратить слишком много времени, пытаясь спроектировать нейронную сеть. Вы можете выбрать что-то, что помогло решить похожую проблему, и использовать это. Но что, если ваша модель должна обладать некоторыми особыми свойствами, которых нет у обычных моделей?

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

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

Например, в документе ShuffleNetV2 утверждается, что автоматически найденные сетевые архитектуры на практике намного медленнее, даже если для их выполнения требуется меньшее количество операций. В их статье сообщается, что MobileNetV2, разработанная вручную модель, намного быстрее, чем NasNet-A, которая стала результатом автоматизированного процесса поиска архитектуры сети. Это связано с тем, что скорость модели зависит не только от количества операций с плавающей запятой, но и от стоимости доступа к памяти и характеристик платформы.

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

Модели, в которых используются узкие места и модули расширения и сжатия, такие как SqueezeNet и MobileNet V2, нарушают это правило. Однако это не значит, что вы никогда не должны их использовать. Говоря о узких местах, я заметил, что чрезвычайно узкие места также снижают стабильность тренировки. Несколько мертвых нейронов, и вся модель рухнет. Итак, если вам действительно нужно использовать слои с очень небольшим количеством фильтров, например, 8 или меньше, использование линейной активации вместо ReLU в конце этих слоев, по крайней мере, предотвратит мертвые нейроны.

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

Алгоритмы поиска сетевой архитектуры могут привести к сильной фрагментации архитектур, когда точность и количество операций являются единственными критериями поиска. В документе также указывается, что поэлементные операции имеют незначительную стоимость. Точечные операции, такие как свертки ReLU и 1x1, имеют небольшое количество операций с плавающей запятой, но их стоимость доступа к памяти незначительна. Поэтому не следует считать их свободными при проектировании архитектуры модели.

Как вы, возможно, знаете, моя работа в основном сосредоточена на моделях, которые работают с данными изображений, и последние несколько лет я не работал над чем-либо, связанным с обработкой естественного языка. Однако трудно не заметить, насколько успешной оказалась модель Transformer в области обработки естественного языка. Этот новый тип архитектуры основан на так называемых «механизмах внимания».

На очень высоком уровне механизм внимания сообщает модели, куда смотреть; какие части входного сигнала более важны. Вы можете думать об этом как о модуле, который генерирует весовой вектор по запросу. Например, чтобы решить, к чему относится «это» в «Это видео очень интересное. Мне понравилось», то вектор внимания будет придавать больший вес словам «это» и «видео».

Этот тип механизма внимания называется самовниманием. Несложно увидеть, как помогают механизмы внимания в этом примере, но можем ли мы применить этот тип внимания к себе также и к моделям, имеющим дело с проблемами компьютерного зрения? Да мы можем.

У нас нет слов и предложений в изображениях, но мы, безусловно, можем разработать механизмы для переключения внимания на определенные пространственные местоположения или карты объектов. Например, в этой статье под названием «Сети сжатия и возбуждения» предлагается механизм самоконтроля, который присваивает веса картам признаков в зависимости от их релевантности для заданных входных данных. То, как они это делают, довольно просто.

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

Этот метод можно легко применить ко многим типам архитектур сверточных нейронных сетей, таким как ResNet. MobileNetV3 также использует аналогичные модули внимания, сочетая методы ручного проектирования с автоматизированным подходом к поиску сетевой архитектуры. Для многих задач компьютерного зрения представляется хорошей стратегией использовать механизмы внутреннего внимания в архитектурах сверточных нейронных сетей. В начале видео я упомянул, что во многих случаях будет достаточно использовать готовую известную архитектуру модели.

Но если вы пытаетесь решить проблему, которая имеет определенные требования или ограничения, вам может потребоваться сделать некоторые варианты дизайна для конкретной задачи, чтобы адаптировать вашу модель к целевому приложению. Рассмотрим два таких примера. Первая — это модель сегментации по пикселям, которую я разработал для обработки очень больших входных изображений. Цель состояла в том, чтобы создать карты поверхностных вод на основе спутниковых снимков.

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

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

Этот подход также имеет некоторые недостатки, но для этой конкретной задачи он работал очень хорошо. Совсем недавно я опубликовал статью об этом в IEEE Geoscience and Remote Sensing Letters. В газете много чего еще. Проверьте это, чтобы узнать больше об этом. Давайте перейдем ко второму примеру дизайна пользовательской модели, в котором наша цель состояла в том, чтобы свести к минимуму задержку и объем оборудования нашей модели.

Для этого мы использовали несколько трюков. Главным нововведением в нашей модели стало использование 3-полосных разделяемых КИХ-БИХ-фильтров в целях минимизации линейного буфера, и я объясню, что это значит. В концепции отделимых сверток нет ничего нового. Многие эффективные архитектуры моделей используют свертки с разделением по глубине.

Однако, как я упоминал в одной из своих предыдущих статей, 3-сторонние разделяемые свертки, имеющие вертикальные, горизонтальные и глубинные компоненты, встречаются довольно редко. Для этого есть причина. Сверточные нейронные сети обычно используют очень маленькие размеры ядра, например 3x3. Поэтому разбиение пространственной свертки на свертки столбца и строки на самом деле не очень много экономит.

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

Стоимость вертикальных сверток была непропорционально высокой из-за количества строк, которые необходимо буферизовать. Аппаратное обеспечение получало изображения построчно. Следовательно, свертка столбцов требует буферизации большего количества элементов. Например, свертка 5x1 потребует буферизации 4 строк данных, тогда как свертка 1x5 потребует буферизации только 4 элементов.

Мы решили эту проблему, заменив вертикальные свертки в 3-стороннем разделяемом слое свертки фильтрами с бесконечной импульсной характеристикой. Вы можете думать об этих БИХ-фильтрах как о рекуррентных модулях нейронной сети, которые суммируют пиксели в вертикальном направлении. В отличие от сверток с фиксированным окном, наши разделяемые КИХ-БИХ-фильтры начинают обрабатывать свои входные данные, как только поступают пиксели, без необходимости буферизации строк, которые были бы охвачены окном фиксированного размера.

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

Вещи меняются, наше понимание вещей меняется. Так что лучше быть открытым. Ладно, на сегодня все. Надеюсь, вам понравилось.

Полезные ссылки:

подробнее: https://myuniversalnk.com/

ссылка — Как спроектировать нейронную сеть