Всем привет! Продолжаем рассказывать про интересные #paper



Новый вид сверточного слоя



Мы давно привыкли к тому, как работает сверточный слой в нейронной сети: фильтр "скользит" по картинке и его элементы умножаются на соответствующие элементы изображения. Таким образом сверточный слой "реагирует" на определенные паттерны, которые есть на изображении. Эта идея свертки пришла из биологии: свёрточные слои задумывались как подобие особых нейронов в мозге человека, которые также реагируют на определенные паттерны картинки.



Но что если привычное нам устройство свертки — не единственно возможное? Авторы статьи AdderNet: Do We Really Need Multiplications in Deep Learning? предложили альтернативное устройство сверточных слоев. И сеть ResNet с этими слоями показывает лучшие результаты на задаче классификации CIFAR, чем обычные CNN!



В чем особенность свертки в AdderNet:



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



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



Однако есть проблема: В таком виде — просто заменив свертку на l1 расстояние — сеть будет работать плохо. Дело в том, что l1-расстояние — линейная неотрицательная функция, т.е. на выходе слоя Adder в карте активации будут только неотрицательные значения. И если использовать свертки Adder с функцией активации ReLU, то получившаяся модель будет композицией линейных функций и сможет аппроксимировать только линейные зависимости.



Для решения этой проблемы авторы предлагают использовать слой Adder вместе с batchnorm. Блогодаря batchnorm значения на выходе слоя снова могут стать отрицательными. А значит, модель сможет выучить нелинейные зависимости.



Есть и вторая проблема: обучение слоя Adder. Чтобы обучить AdderNet с помощью градиентного спуска, нужно считать градиент для l1. Производная модуля принимает всего два значения — ±1. Из-за этого значения градиента получаются очень разреженными, и с помощью них очень тяжело получить оптимальные значения параметров (*Sgn grad* на первой картинке).



Однако и эту проблему авторам статьи удалось побороть. Они предложили вместо реального градиента для l1 использовать обычную разность между фильтром и фрагментом изображения. Также предлагается обрезать слишком большие по модулю значения этого псевдоградиента для избежания взрыва градиентов(*Fp grad* на первой картинке).



Тут обнаружился еще один нюанс: описанные выше градиенты получаются сильно меньше, чем у обычной CNN (см. *ILR* на первой картинке). Поэтому для AdderNet используется адаптивный learning rate, который обратно пропорционален норме градиента (см. *ALR* на первой картинке).



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



Ссылка на статью тут.