Layer normalization
Layer normalization (레이어놈)은 Batch normailzation (배치놈)의 단점을 극복하기 위해 고안된 방법이다. 2016년 발표된 논문으로 12000회 이상 인용되었고 Transformer 구조에도 포함된 정규화 방법이다. 매우 유명한 방법이라는 이야기이다.
배치놈은 Internal Covariate Shift 문제를 해결하기 위한 배치 단위의 정규화 방법이다. 모델을 학습할 때 입력 값은 가중치가 곱해지고 bias 더해진 뒤 활성화 함수를 거쳐 출력이 된다. 다음 층에서는 이전 층의 출력으로 다시 학습해야 하는데, 값이 계산되는 과정(입력->출력)을 거치면서 값들의 분포가 조금씩 달라지게 된다. 이러한 변화는 일종의 snowball로서 층이 깊다면 처음 입력에 비해 값들의 분포가 많이 달라지는 것이다. 배치놈은 입력값의 분포를 배치 단위로 정규화하고 그 값에 얼마나 곱하고 bias를 더할지를 학습시킨다.
이 방법의 단점으로는 배치 단위(batch)의 정규화이기 때문에 배치 크기가 1인경우 정규화가 의미가 없어져 배치 크기에 영향을 받는 다는 것과 입력의 길이가 다른 RNN같은 구조를 학습하기 어려운 문제가 있다. (문장을 구성하는 단어의 개수가 다르다면 정규화의 마지막 피쳐는 가장 긴 문장으로만 정규화가 되는 이치)
Layer normalization은 피쳐단위로 정규화를 하는 것이 아닌 층단위로 정규화 하여 이를 극복하는 방법이다. 정규화하는 수식은 배치놈과 같지만 그 대상이 달라진다. 아래 수식을 보면 정규화 할때 H(number of hidden units) H를 이용해 평균과 분산(표준편차)을 구하는 것을 알 수 있다.
배치 정규화는 이동평균(moving average)를 추론(inference)시에 정규화하는 텀으로 사용해 학습과 추론에 사용하는 방식이 다르다면 레이어 정규화는 데이터 단위로 정규화 하므로 학습과 추론시 정규화하는 방식이 같다. RNN에서는 히든 층을 공유하여 학습이 진행되기 때문에, 추론시에 별도의 이동평균을 구할 필요가 없다.
정규화 방식을 데이터 shape으로 이해해보려 한다. 나는 (N x D) 차원에서는 머리에서 이해가 쉽지만 그 이상의 차원이 되면 *가령 (N x H x W)* 이해가 어렵다.
N: 배치의 크기, D: 데이터의 차원 (1차원 데이터)
N: 배치의 크기, H: 데이터의 높이, W: 데이터의 너비 (2차원 데이터)
먼저 배치 크기가 10이고 데이터 피쳐 개수가 3인 1차원 데이터에 배치놈을 적용하는 경우에는 평균과 분산을 피쳐의 개수인 3개의 평균과 분산을 먼저 구해야 한다. 레이어놈인 경우에는 10개의 평균과 분산을 구해야한다.
만약 (N x H x W)라면 어떻게 될까? 내가 이해하기로는 육면체 도형을 상상해보면 배치놈을 적용하는 경우에는 각 피쳐마다의 평균과 분산을 구해야 한다. 즉, H x W개의 평균과 분산을 구한 뒤 정규화한다. 레이어놈의 경우에는 H x W를 하나의 층으로 계산해 N개의 평균과 분산을 구한뒤 정규화한다. (사실 정확히 맞는지 모르겠으므로 다른 자료를 살펴보고 추가가 필요하다.)
아래 표는 5.1 Invariance under weights and data transformations 부분에서 발췌했다. Weight matrix와 weight vector의 차이가 잘 구분이 안되었는데, weight matrix는 층과 층을 이어주는 가중치, 예를들어 100 -> 100개의 뉴론이라면 (100, 100)의 가중치 행렬 W가 학습에 사용되겠지, 를 의미한다. weight vector는 가중치에 대한 전체적인 파라미터 스케일링 상수나 바이어스에 대한 벡터를 의미한다. 이를 인지하고 아래 내용을 보면 이해가 편하다.
Reference
https://arxiv.org/abs/1607.06450