В моделях машинного обучения для классификации изображений часто используются сверточные нейронные сети (CNN) для извлечения функций из изображений при использовании слоев max-pooling для уменьшения размерности. Цель состоит в том, чтобы извлекать все более высокоуровневые функции из областей изображения, чтобы в конечном итоге сделать какой-то прогноз, такой как классификация изображения.

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

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

Проблема исчезающего градиента

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

Остаточные сети спешат на помощь

Популярным методом решения этой проблемы является включение остаточных блоков, которые вместе образуют остаточную сеть (ResNet). Остаточный блок решает эту проблему, вводя архитектурный паттерн, в котором более ранние уровни пропускаются через будущие слои. Эти «пропускающие соединения» обычно реализуются с помощью операции сложения, посредством которой функции из более ранней сети добавляются к вновь вычисленным характеристикам после некоторых сверточных слоев, как показано здесь:

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

Остаточный блок работает следующим образом:

  • входной тензор X переходит в блок ResNet и проходит по двум путям.
  • X проходит по основному пути через слои свертки (представленные на рис. 1 весовые слои), как и в обычной CNN, и это часто называют блоком свертки. Полученный результат приближается к функции F (x).
  • X также проходит через пропускаемое соединение, также известное как identity block, потому что он просто пересылает X, сохраняя при этом свою размерность.
  • Затем F (x) и X складываются перед отправкой в ​​функцию активации (в данном примере ReLU).

Остаточные блоки обычно связаны вместе, как показано на Рис. 2 ниже, чтобы сформировать ResNets. Выходные данные последнего остаточного блока вместе с выходными данными из окончательного соединения пропуска объединяются и затем передаются в другие типы слоев (например, средний пул и полностью связанные слои) для классификации:

В типичной CNN для классификации изображений более ранние уровни обычно изучают абстракции более низкого уровня (например, линии, углы и т. Д.), В то время как последующие уровни изучают абстракции более высокого уровня (например, группы фигур и т. Д.). Используя пропускаемые соединения, мы позволяем градиентам проходить через сеть без необходимости проходить через функции активации. Это помогает сети передавать информацию на более поздние уровни в сети, позволяя им изучать сложные функции без риска исчезновения градиентов.

На рис. 3 показано применение блока ResNet к модели классификации изображений:

Обратите внимание, что в некоторых случаях блок identity можно заменить блоком свертки, например, когда входные и выходные размеры различаются:

Благодаря остаточным блокам градиенты теперь могут течь обратно по сети во время обратного распространения по двум путям:

Когда градиент течет обратно через Gradient Pathway-2, уровни весов в остаточном блоке (представленном как F (x) на рис. 5) обновляются, и вычисляются новые значения градиента. По мере того, как градиент продолжает проходить через более ранние остаточные блоки, он будет продолжать уменьшаться (т. Е. Стремиться к 0). Однако градиент также течет обратно через пропускные соединения, тем самым полностью избегая весовых уровней в остаточных блоках и, следовательно, сохраняя свое значение. Это позволяет значению градиента, которое было сохранено неизменным, распространяться обратно на более ранние слои, позволяя им изучать активации и, таким образом, избегать проблемы исчезающего градиента.

Применение ResNets в промышленных приложениях Интернета вещей

Методы классификации изображений особенно полезны для решения проблем компьютерного зрения, например, тех, которые встречаются в промышленном IoT (например, в производстве).

Чтобы проиллюстрировать это, мы создали проект Классификация текстиля на GitHub. Этот проект принимает в качестве входных данных 72000 крупным планом изображений текстильных волокон, каждое из которых содержит одну из шести возможных производственных классификаций (например, проблемы с цветом, порезы в ткани и т. Д.), А также соответствующие классификации для каждого изображения:

Пример модели PerceptiLabs в проекте включает три блока ResNet, каждый из которых сворачивает изображение для извлечения функций и включает пропускаемые соединения, которые напрямую пересылают входные данные каждого блока как есть (то есть как блок идентификации). Он добавляется к выходным данным блока с помощью компонента Merge, настроенного для применения операции сложения:

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

Что наиболее важно, этот проект демонстрирует, насколько легко создавать блоки ResNet в PerceptiLabs.

Заключение

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

Блоки ResNet - отличное решение проблемы, потому что они позволяют использовать большое количество слоев и, что самое главное, их легко построить в PerceptiLabs.

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