Перейти к основному содержимому

Остаточный блок

Одним из самых популярных подходов, ускоряющих и упрощающих настройку нейросетей является внесение остаточных блоков (residual block) в архитектуру нейросети.

Эта архитектура стала широко известной после работы [1], в которой остаточные блоки были успешно применены в новой архитектуре ResNet для повышения качества классификации изображений. До этой работы для классификации изображений использовались сети, содержащие 10-20 слоёв, а она позволила решать задачи, используя очень глубокие сети, содержащие 100 слоёв и более.

Работа [1] является одной из самых цитируемой научных работ глубокого обучения!

Модель ResNet детально разобрана в разделе учебника, посвящённом классификации изображений.

Рассмотрим, в чём состоит идея остаточного блока.

Обычная нейросетевая архитектура преобразуют вход zz, применяя к нему некоторую нелинейную функцию F(z)F(z), применяя ко входу один или несколько слоёв сети:

В остаточном блоке предлагается пробросить тождественную связь (skip connection, identity connection), не изменяющую вход zz, начала к концу преобразования F(z)F(z), а выходом блока сделать сумма входа zz и нелинейного преобразования F(z)F(z):

Таким образом, нелинейный блок F(z)F(z) вычисляет остаток (residual) между желаемым выходом F(z)+zF(z)+z и входом zz.

Размерность входа и выхода

Как видим из определения остаточного блока, преобразование F(z)F(z) должно обеспечивать такое же число выходов, каким было число входов, чтобы мы их могли сложить.

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

Если нужно снизить выходную размерность, то тождественное преобразование заменяется на линейное преобразование WzWz (с настраиваемой матрицей весов WW), приводящее размерность входа к размерности нелинейного выхода F(z)F(z) перед суммированием:

y=F(z)+Wzy = F(z)+Wz
Расположение активаций

Активация ReLU всегда выдаёт неотрицательные значения, а LeakyReLU смещает распределение в сторону неотрицательных значений. Чтобы нелинейный блок F(z)F(z) мог как увеличивать, так и уменьшать вход zz, последним преобразованием нелинейного блока ставят линейный слой без функции активации, которую переносят в начало последующего нелинейного блока.

На практике используется не один, а сразу несколько подряд идущих остаточных блоков, как показано ниже:

что аналитически записывается как

z1=F1(z)+zy=F2(z1)+z1\begin{align*} z_1&=F_1(z)+z \\ y&=F_2(z_1)+z_1 \\ \end{align*}

Эквивалентно это можно записать как

y=F2(F1(z)+z)+F1(z)+zy = F_2(F_1(z)+z)+F_1(z)+z

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

Нейросети, использующие большое количество остаточных блоков, называются остаточными сетями (residual networks).

Преимущества остаточных сетей

Прогнозирование ансамблем

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

Естественная инициализация

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

  • Если для уменьшения потерь достаточно неглубокой сети, то веса так и останутся малыми.

  • Если потребуется большее число нелинейных преобразований, то оптимизатор может увеличить веса только для недостающих слоёв!

Более устойчивая настройка

В работе [2] визуализируются градиенты (a) однослойной сети (b) глубокой сети без остаточных блоков (c) остаточной сети, т.е. глубокой сети с использованием остаточных блоков:

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

В работе [3] предлагается схема визуализации ландшафта функции потерь, который становится более гладкими при использовании остаточных блоков [3]:

Гладкие потери проще минимизировать:

  • можно обучать сеть с более высоким шагом обучение (learning rate)

  • меньше риск остановить обучение в локальном не самом оптимальном минимуме.

Интуиция результатов

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

Литература

  1. He K. et al. Deep residual learning for image recognition //Proceedings of the IEEE conference on computer vision and pattern recognition. – 2016. – С. 770-778.
  2. Balduzzi D. et al. The shattered gradients problem: If resnets are the answer, then what is the question? //International conference on machine learning. – PMLR, 2017. – С. 342-350.
  3. Li H. et al. Visualizing the loss landscape of neural nets //Advances in neural information processing systems. – 2018. – Т. 31.