Course
Более глубокие нейронные сети теоретически должны работать лучше. Но на практике это далеко не всегда так.
После определённой глубины точность может даже начать снижаться. Причина не в переобучении — ломается сам процесс обучения. Градиенты стремятся к нулю, прежде чем достигают ранних слоёв, и эти слои перестают учиться. Кажется логичным, что добавление слоёв поможет, но часто это лишь усугубляет ситуацию.
ResNet решила проблему благодаря ключевой идее пропускающих соединений. Вместо того чтобы заставлять каждый слой учиться с нуля, сеть может «перепрыгивать» через слои и добавлять вход напрямую к выходу.
В этой статье я расскажу, как работает ResNet, как выглядит её архитектура и почему это по‑прежнему один из основных алгоритмов современного дип‑обучения.
Хотите увидеть ResNet на практике? Выполните упражнение по классификации изображений с ResNet в рамках курса Deep Learning for Images with PyTorch.
Что такое архитектура ResNet?
ResNet — сокращение от Residual Network — это архитектура нейронной сети, созданная для практичного обучения глубоких сетей.
Идея была предложена Microsoft Research ещё в 2015 году. Алгоритм использует остаточные соединения, чтобы обойти проблемы обучения, которые тогда ограничивали глубину сетей. Идея проста, но после её появления стало возможно надёжно обучать сети на 50, 101 и даже 152 слоя — без деградации производительности.
До ResNet уходить так глубоко попросту было невозможно.
Почему глубокие сети трудно обучать
Больше слоёв — значит больше возможностей для обучения. На практике после определённой глубины всё начинает рушиться.
Здесь играют роль две проблемы.
Первая — это затухание градиента. Нейросети обучаются, передавая сигналы ошибки назад по сети — процесс называется обратным распространением ошибки. Каждый слой корректирует веса на основе этого сигнала. Но по мере прохождения через множество слоёв сигнал многократно умножается на малые значения и сжимается. К моменту, когда он достигает ранних слоёв, почти ничего не остаётся. Эти слои перестают обновляться, а значит — перестают учиться.
Вторая — это проблема деградации. Она противоречит интуиции. Ожидаешь, что сеть из 56 слоёв будет как минимум не хуже 20‑слойной — ведь у неё больше ёмкость. Но оказалось наоборот. Более глубокая сеть показывала худшие результаты даже на обучающих данных. Это исключает переобучение как причину: модель не запоминает «слишком много». Ей просто трудно оптимизироваться.
Это ключевое различие. Это не проблемы обобщения, которые лечатся dropout или регуляризацией. Это проблемы оптимизации — сеть изначально не может найти хорошие веса.
ResNet была создана, чтобы решить эти две проблемы. Покажу как.
Ключевая идея: остаточное обучение
Традиционные нейросети пытаются выучить прямое отображение «вход → выход». Каждый слой смотрит на вход и пытается понять, каким должен быть выход. Для неглубоких сетей это работает. Но по мере увеличения глубины вы сталкиваетесь с двумя описанными выше проблемами.
В ResNet вместо того, чтобы требовать от каждого блока полное отображение, задаётся более простой вопрос: что нужно добавить к входу, чтобы получить правильный выход?
Эта разница и называется остатком.
То есть вместо обучения:

Residual learning (1)
Сеть учится следующему:

Residual learning (2)
Где F(input) — это остаток, то есть небольшая коррекция, которую нужно внести. Если слою нечего менять, он может свести F(input) к нулю и пропустить вход без изменений.
Звучит как небольшая доработка, но это меняет задачу обучения. Учиться небольшой коррекции проще, чем учиться полной трансформации с нуля — и именно это делает глубокие сети обучаемыми.
Что такое пропускающие соединения в ResNet?
Пропускающее соединение — это прямой путь, который обходит один или несколько слоёв и подаёт вход на более поздний этап сети.
В традиционной сети данные проходят по слоям последовательно. Каждый слой преобразует вход и передаёт результат дальше. Пропускающие соединения берут исходный вход и добавляют его напрямую к выходу слоя ниже по блоку.
Визуализировать это можно так:

Skip connection graph example
Вход x идёт сразу по двум путям. Один проходит через сверточные слои и учит остаток F(x). Другой пропускает эти слои и подключается на этапе сложения. Итоговый выход — F(x) + x.
Этот шорткат важен для обучения. При обратном распространении градиенты могут идти назад по пропускающему соединению, минуя промежуточные слои. Это даёт ранним слоям более чистый и сильный сигнал — именно того не хватало глубоким сетям до ResNet.
Структура блока ResNet
Остаточный блок — это повторяющаяся единица, из которой строится ResNet. Поймите один блок — и вы поймёте всю сеть.
Что происходит внутри одного блока:
-
Вход
xпопадает в блок и делится на два пути -
Один путь проходит через два сверточных слоя, каждый с batch normalization и активацией ReLU
-
Другой путь пропускает эти слои — это и есть пропускающее соединение
-
Оба пути сходятся на этапе сложения, где исходный вход суммируется с выходом сверточных слоёв
-
К результату применяется финальная активация ReLU
Или в виде схемы:

ResNet block diagram
Здесь пропускающее соединение называется тождественным отображением — вход проходит без изменений и напрямую прибавляется к изученному выходу. Это самый простой шорткат: без преобразований и без дополнительных параметров.
Но чтобы сложение работало, оба пути должны выдавать тензоры одинаковой формы. Если сверточные слои меняют пространственные размеры или число каналов, вход x сложить нельзя. В таких случаях ResNet использует проекционный шорткат — свёртку 1×1 на пропускающем пути, чтобы привести x к нужной форме.
Большинство блоков в ResNet используют тождественные шорткаты. Проекционные появляются лишь при смене размеров — обычно при переходе между стадиями сети.
Виды архитектур ResNet
ResNet выпускается в нескольких стандартных вариантах, названия которых соответствуют общему числу слоёв. Выбор зависит от ваших приоритетов — скорость, точность или баланс между ними.

ResNet architecture comparison
ResNet‑18 и ResNet‑34 используют базовый блок — две свёртки 3×3 с пропускающим соединением. Они быстрые и недорогие в запуске, подходят для прототипирования и при ограниченном железе.
Начиная с ResNet‑50 применяется другой дизайн — bottleneck‑блок с тремя слоями вместо двух. Это упрощает обучение более глубоких сетей без пропорционального роста вычислительных затрат. Подробнее — в следующем разделе.
ResNet‑101 и ResNet‑152 идут ещё дальше ценой более длительного обучения и большего потребления памяти. Их часто используют в исследованиях и продакшене, где точность важнее скорости.
В большинстве практических задач стартовой точкой служит ResNet‑50. Он хорошо балансирует глубину и стоимость и поддерживается всеми основными фреймворками дип‑обучения.
Bottleneck‑архитектура ResNet
Более глубокие ResNet не используют тот же блок, что и мелкие. Начиная с ResNet‑50, архитектура переходит на bottleneck‑блок — трёхслойный дизайн, который сдерживает вычисления по мере роста глубины.
Блок использует три свёртки подряд:
- Свёртка 1×1 — уменьшает число каналов, сжимая вход
- Свёртка 3×3 — выполняет собственно извлечение признаков на уменьшенном представлении
- Свёртка 1×1 — расширяет число каналов обратно до исходного размера
Первая и последняя свёртки 1×1 образуют «бутылочное горлышко» — отсюда и название. Они сжимают данные перед более дорогой свёрткой 3×3, а затем восстанавливают размер.
Свёртка 3×3 на входе с большим числом каналов вычислительно тяжела. Сократив сначала каналы, bottleneck‑блок позволяет слою 3×3 работать с куда меньшим входом. В итоге блок становится глубже без пропорционального роста вычислительных затрат.
Пропускающее соединение работает так же, как в базовом блоке: вход прибавляется к выходу перед финальной активацией. Единственное отличие — здесь почти всегда нужен проекционный шорткат, поскольку внутри блока меняется размерность каналов.
Как ResNet решает проблему затухания градиента
Проблема затухания градиента — это вопрос расстояния. Чем дальше градиенту идти по сети, тем сильнее он сжимается — и к ранним слоям доходит слишком слабым, чтобы чему-то научить.
Пропускающие соединения дают градиентам более короткий путь.
Во время обратного распространения градиенту не нужно проходить все слои по порядку. Он может идти по шорткату напрямую, полностью обходя сверточные слои. Такой путь сохраняет градиент достаточно большим, чтобы обновлять ранние слои.
Это также меняет задачу для каждого блока: вместо полной трансформации с нуля сеть учится лишь небольшой поправке поверх входа. Это значительно проще с точки зрения оптимизации и позволяет углублять сеть без нестабильности обучения.
Итог: сети, которые ранее было невозможно надёжно обучить из‑за глубины, становятся обучаемыми.
ResNet против традиционных архитектур CNN
Традиционные CNN и ResNet обе учатся извлекать признаки из изображений, но делают это по‑разному.
В традиционной CNN данные идут по прямой: каждый слой берёт выход предыдущего, применяет преобразование и передаёт дальше. Это работает до определённой глубины. Потом последовательная структура даёт сбой при обратном распространении — градиенты сжимаются, ранние слои перестают учиться, и точность падает.
ResNet не идёт по прямой. Пропускающие соединения позволяют входу обходить один или несколько слоёв и прибавляться к выходу ниже по блоку. Сеть по‑прежнему учится преобразованиям, но у неё есть прямой путь как для данных, так и для градиентов.
Сравнение подходов:

ResNet versus traditional CNN
Пропускающие соединения одновременно помогают градиентам и сглаживают оптимизацию, благодаря чему сеть быстрее и надёжнее находит хорошие веса.
Применения архитектуры ResNet
Архитектура ResNet используется в самых разных реальных задачах.
Классификация изображений — с этого всё началось. ResNet выиграла ImageNet Large Scale Visual Recognition Challenge в 2015 году и до сих пор часто используется для отнесения изображений к категориям — от медицинских снимков до спутниковых и товарных фото.
Обнаружение объектов часто опирается на ResNet. Фреймворки вроде Faster R‑CNN и Mask R‑CNN комбинируют ResNet с «головой» детектора, которая находит и локализует объекты на изображении. ResNet извлекает признаки, детектор делает остальное.
Трансферное обучение — здесь ResNet особенно полезна для большинства дата‑саентистов. Вместо обучения с нуля — которое требует дней и много данных — вы загружаете ResNet с предобучением на ImageNet и дообучаете на своём датасете. Предобученные веса уже кодируют полезные низкоуровневые признаки — края, текстуры, формы — так что вы стартуете с гораздо лучшей точки.
Извлечение признаков — схожий подход. Вы прогоняете изображения через предобученную ResNet и берёте выход одного из поздних слоёв. Эти выходы — плотные, информативные представления, которые можно подать на вход более простому классификатору или алгоритму кластеризации.
Во всех этих сценариях ResNet — это предобученная отправная точка. Большинство фреймворков дип‑обучения сразу поставляются с предобученными весами ResNet, поэтому начать с неё проще всего.
Преимущества и ограничения ResNet
ResNet стала реальным прорывом в дип‑обучении, но, как и любая архитектура, имеет компромиссы. Кратко о плюсах и минусах.
Преимущества
Самое очевидное — это глубина. Пропускающие соединения позволяют обучать сети с 50, 100 и даже 150+ слоями без проблемы деградации. Раньше это было ненадёжно.
Обучение также становится более стабильным. Шорткаты дают градиентам чистый маршрут назад по сети — меньше тонкой настройки, меньше сбоев и более предсказуемые результаты на разных задачах и датасетах.
И, конечно, производительность. Варианты ResNet стабильно показывают высокие места в бенчмарках по изображениям, а предобученные модели хорошо переносятся на новые домены — поэтому ResNet остаётся дефолтной отправной точкой для многих проектов компьютерного зрения.
Ограничения
ResNet вычислительно тяжела. Глубокие варианты вроде ResNet‑101 и ResNet‑152 требуют много памяти и вычислительных ресурсов, что ограничивает использование при скромном железе или требованиях к быстрой инференции.
Это также не лучший выбор для каждой задачи. Для малых датасетов или простых проблем более лёгкая архитектура часто даёт те же результаты при куда меньшей цене. Выбор ResNet‑50 «по умолчанию» не всегда оправдан.
И в ряде областей ResNet вытеснили альтернативы. Например, EfficientNet достигает лучшей точности на параметр в задачах по изображениям, а трансформеры доминируют в других. ResNet всё ещё широко используется, но это уже не единственный серьёзный вариант.
ResNet в современном дип‑обучении
Спустя одиннадцать лет после появления архитектура ResNet по‑прежнему держится уверенно. Для дип‑обучения это редкость.
Большинство практиков всё ещё выбирают ResNet, когда нужен надёжный базовый ориентир для задачи компьютерного зрения. Она хорошо изучена, поддерживается всеми крупными фреймворками, а предобученные веса есть в каждой крупной библиотеке. Так что когда нужно «чтобы работало» без долгих экспериментов, ResNet — обычно первый выбор.
Но её влияние шире собственных вариантов.
Ключевая идея ResNet — добавление шортката вокруг слоёв для облегчения потока информации и градиентов — оказалась универсально полезной. DenseNet развил её, соединив каждый слой с каждым, а не пропуская один‑два. И хотя у трансформеров другая архитектура, остаточные соединения внутри каждого блока трансформера следуют тому же принципу, что и в ResNet.
Новые архитектуры — EfficientNet, ConvNeXt, vision‑трансформеры — продвинули качество в отдельных областях. Но они не столько заменили ResNet, сколько опираются на заложенные ею принципы.
Заключение
Архитектура ResNet строится вокруг одной идеи: пропускающих соединений. Она решила две проблемы, мешавшие глубоким сетям — затухание градиентов и деградацию — и сделала практичным обучение сетей такой глубины, какая раньше была недостижима.
Идея добавления шорткатов между слоями стала стандартным строительным блоком современного дип‑обучения — от DenseNet до трансформеров и большинства архитектур после 2015 года.
Если вы сегодня решаете задачу компьютерного зрения, ResNet по‑прежнему — надёжная отправная точка. Это уже не самый новый вариант, но один из самых проверенных. Используйте её как базовый ориентир — вы удивитесь, как она всё ещё способна обойти конкурентов в 2026 году.
Если вы новичок в дип‑обучении, но знаете основы Python, изучите наш курс Introduction to TensorFlow in Python — он поможет за выходные освоить темы вроде ResNet.
FAQs
Что такое ResNet и почему это важно?
ResNet (Residual Network) — это архитектура дип‑обучения, предложенная Microsoft Research в 2015 году. Она решила две проблемы, мешавшие обучению глубоких сетей: затухание градиентов и деградацию. Механизм пропускающих соединений впервые позволил надёжно обучать сети с 50, 100 и даже 150+ слоями.
Что такое пропускающие соединения в нейросети?
Пропускающее соединение — это прямой путь, который обходит один или несколько слоёв и добавляет вход непосредственно к выходу более позднего слоя. Так и данные, и градиенты получают «ярлык» через сеть, что сохраняет сигнал градиента достаточно сильным для обновления ранних слоёв во время обучения.
Что такое проблема затухания градиента?
Проблема затухания градиента возникает, когда градиенты уменьшаются по мере прохождения назад через глубокую сеть. К моменту, когда сигнал достигает ранних слоёв, он слишком мал, чтобы их обновлять — слои перестают учиться. ResNet решает это, позволяя градиентам течь назад через пропускающие соединения, минуя промежуточные слои.
В чём разница между базовым и bottleneck‑блоком в ResNet?
Базовый блок использует две свёртки 3×3 и применяется в мелких вариантах, таких как ResNet‑18 и ResNet‑34. Bottleneck‑блок в ResNet‑50 и глубже использует последовательность свёрток 1×1 – 3×3 – 1×1, сокращая вычисления за счёт сжатия каналов перед «дорогой» свёрткой 3×3.
Как выбрать подходящий вариант ResNet для проекта?
В большинстве практических случаев хорошим выбором по умолчанию является ResNet‑50 — он удачно балансирует глубину, точность и вычислительную стоимость. ResNet‑18 и ResNet‑34 быстрее при ограниченном железе, а ResNet‑101 и ResNet‑152 уместны, когда важнее точность, а вычислительные ресурсы не ограничены.