Input
$x : N \times D$
Learnable params
$\gamma, \ \beta : D$
Intermediates
$\mu , \ \sigma : D$
$\hat{x} : N \times D$
Output
$y : N \times D$
$$ \mu_j = {1\over N}\sum_{i = 1} ^ N x_{i, j} $$
$$ \sigma_j ^2 = {1\over N}\sum_{i = 1} ^ N (x_{i, j} - \mu _j)^2 $$
$$ \hat{x}{i, j} = {x{i, j} - \mu _j \over \sqrt{\sigma_j ^2 + \epsilon}} $$
$$ y_{i, j} = \gamma_j \hat{x}_{i, j} + \beta_j $$
N x D 의 크기를 가진 input x에 대해서 j번째 x에 대해 평균, 분산을 구하고 이를 이용해서 normalization을 수행하여 안정된 input으로 학습 진행
⇒ 초기화에 대한 부담을 줄이고 learning rate을 크게 해도 dead ReLU를 막을 수 있다
$\gamma , \beta$ 값을 학습을 통해 설정
batch normalization ⇒ 초기화의 문제, 학습 속도에서의 이점, regularization의 측면에서도 효과적
Batch Norm
각 channel에 대해서는 독립적으로 N x D batch에 대해서 normalization 수행
batch를 크게 할수록 normalization의 전체 분포를 잘 따를 수 있음 batch가 작을수록 오류 발생
(ex. batch가 1이면 전체 분포와는 다른 모습을 보임 ⇒ 문제점 발생)
Layer Norm
channel 별로 10개의 채널을 normalization
batch size가 작아졌을 때 생기는 문제 해결
Instance Norm
하나의 instance에 대해서
Group Norm
그룹별로
# vanilla Gradient Descent
While True:
weights_grad = evaluate_gradient(loss_fun, data, weights)
weights += - step_size * weights_grad # perform parameter update