# Normalization
Прежде чем рассказать, что такое Filter Responce Norm, следует прочитать (очень хорошо написан) блог пост [An Overview of Normalization Methods in Deep Learning](https://mlexplained.com/2018/11/30/an-overview-of-normalization-methods-in-deep-learning/).

Там хорошо рассказано про
* [Batch Norm (2015)](https://arxiv.org/abs/1502.03167) -- все использовали
* [Layer Norm (2016)](https://arxiv.org/abs/1607.06450) -- хорошо для RNN
* [Instance Norm (2016)](https://arxiv.org/abs/1607.08022) -- хорошо для style transfer
* [Group Norm (2018)](https://arxiv.org/abs/1803.08494) -- как батчнорм для маленьких батч сайзов
* [Weight Norm (2016)](https://papers.nips.cc/paper/6114-weight-normalization-a-simple-reparameterization-to-accelerate-training-of-deep-neural-networks) -- для рнн и классификации и много чего
* [Batch-Instance Norm (2018)](https://papers.nips.cc/paper/7522-batch-instance-normalization-for-adaptively-style-invariant-neural-networks) -- про то, как выучить нормализацию
* [Switch Norm (2018)](https://arxiv.org/abs/1806.10779) -- тоже про то, как выучить нормализацию
* [Spectral Norm (2017)](https://arxiv.org/abs/1705.10941) -- для ганов
* [Scale Norm](https://arxiv.org/abs/1910.05895) -- для трансформеров
## Filter Responce Norm
### Motivation
Немного мотивации, зачем вообще думать про батч норм и чем он плох. Бесспорно он добавляет стабильности и найти альтернативы сложно. В статье [Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour](https://arxiv.org/abs/1706.02677) заостряется внимание, что батч сайз это параметр батчнорма, а learning rate можно подобрать эталонный и потом отмасштабировать. Для SGD правило выбора learning rate линейное.
$$
C = k\times B / \eta,
$$
где $C$ -- константа, $k$ количество GPU, $B$ -- батч сайз для одной карточки, $\eta$ -- learning rate.
После этой статьи были и другие интересные работы, например [Don't decay learning rate, increase batch size](https://openreview.net/pdf?id=B1Yy1BxCZ). Они исследовали то, как надо шедулить снижение learning rate и надо ли менять именно его. Оказывается взамен learning rate можно увеличить батч сайз и станет лучше (на имаджнете). А простор карточек на DGX позволяет увеличивать батч сайз без снижения скорости обучения (немного, но этого достаточно).
Вот уже две статьи говорят, что батч сайз это важный параметр. Но он же (батч сайз *на карточку*) напрямую влияет на батч норм, если убрать эти зависимости, будет совсем хорошо.
### Method
А начнем мы с графика! На нем сравнивается обучение на имаджнете с разным батч сайзом.

В методе нет ничего сложного и слой иллюстрируется диаграмой ниже.

где $\mathbf{x} = X_{b, c, :, :}$ -- карта активаций одного из каналов. Формула очень напоминает инстанс норм. Вот что они про него говорят:
> IN was shown to be useful for style transfer applications, but was not successfully applied for recognition.
В отличие от инстанс норма, отсутствует центрирование и они упомяннули еще [Local Response Normalization](http://www.cs.toronto.edu/~fritz/absps/imagenet.pdf) из далекого 2016.
> **LRN** does normalization over adjacent channels **at the same spatial**
location, while **FRN** is a global normalization **over the spatial extent**.
Про центрирование они отдельно сказали, так как это было важно в батч норме, из-за связи внутри батча.
> We do not remove the mean prior to normalization. While mean subtraction was an important aspect of Batch Normalization, it is arbitrary and without real justification for normalization schemes that are batch independent.
Но вместо bias у них новая пороговая активация $TLU$ с обучаемым порогом.
$$\max(y, \tau) = \max(y-\tau, 0) + \tau = relu(y-\tau)+\tau$$
### Отдельно про $\varepsilon$
В формуле FRN можно увидеть эпсилон, и вот когда размерность картинки небольшая, эпсилон станочится важным параметром (он обучаем!). Без него дела были бы плохи:
$$
y = sign(x)
$$
С эпсилон такого не происходит.
```python=
def FRNLayer(x, tau, beta, gamma, eps=1e-6):
# x: Input tensor of shape [BxHxWxC].
# tau, beta, gamma: Variables of shape [1, 1, 1, C].
# eps: A scalar constant or learnable variable.
# Compute the mean norm of activations per channel.
nu2 = tf.reduce_mean(tf.square(x), axis=[1, 2],
keepdims=True)
# Perform FRN.
x = x * tf.rsqrt(nu2 + tf.abs(eps))
# Return after applying the Offset-ReLU non-linearity.
return tf.maximum(gamma * x + beta, tau)
```
## Tips and tricks
Кажется, стоит пересмотреть шедулинг и для обычных сеток, они тюнили бейзлайны
> We found that the more common
step decay learning rate (LR) schedule was not optimal for
FRN. Instead, continuous LR decay schedules such as cosine
decay (without restarts) **performed better for all methods** and
eliminated the need to tune step decay hyper parameters.
Начальный лернинг рейт важная штука
> Since FRN does not perform mean centering, we empirically found that certain architectures are more sensitive to the choice of initial LR.
Еще в [Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour](https://arxiv.org/abs/1706.02677) говорят о пользе warm up фазы, здесь они тоже используют warm up вместе с cosine annealing.
> We address this by using an initial warp-up phase where the LR is slowly increased from 0 to the peak value.
# Experiments

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