article thumbnail image
Published 2022. 7. 12. 23:04

Normalizing Activations in a Network

*1주차에서 배웠던 normalizing inputs

$$\mu = \frac{1}{m} \sum_{i=1}^{m} x^{(i)}$$

$$x := x - \mu$$

$$\sigma^{2} = \frac{1}{m} \sum_{i=1}^{m} x^{(i)} \star \star 2$$

$$ x /= \sigma$$

- $\star \star 2$ : element-wise squaring

 

더 깊은 신경망이라면?

input features $X$뿐만 아니라, 레이어마다 활성화값이 있음

말하자면, $w^{[3]}$, $b^{[3]}$ 를 더 효율적으로(빠르게) 학습하기 위해 $a^{[2]}$를 normalize 하는 건 어떨까?

--> batch normalization

 

엄밀히 말하자면 $a^{[2]}$ 가 아닌 $z^{[2]}$를 normalize 하게 될 것임

- 활성화 함수 통과 전에? 통과 후에? -> 논란이 되지만 일반적으로는 $z^{[2]}$를 더 건드리는 편이다

 

[Implementing Batch Norm]

신경망에서 intermediate 값들이 있다고 칠 때 $z^{(2)},\ \ldots,\ z^{(m)}$ (특정 히든 레이어의 값이지만 $[l]$ 표기는 생략하기로)

 

$$\mu = \frac{1}{m} \sum_{i=1}^{m} z^{(i)}$$

$$\sigma^{2} = \frac{1}{m} \sum_{i=1}^{m} (x_{i} -\mu)^{2} $$

$$z^{(i)}_{norm} = \frac{z^{(i)} - \mu}{\sqrt{\sigma^{2}+\epsilon} }$$

- $\epsilon$ : $\sigma$가 $0$일 때 대비

- 평균 $0$, 분산 $1$(standard unit variance)

 

그런데 hidden unit이 항상 평균 0, 분산 1을 갖고 있길 바라는 것은 아님 - hidden unit들이 다른 distribution을 가지고 있는 것이 더 말이 됨

 

$$\tilde{z}^{(i)} = \gamma z^{(i)}_{norm} + \beta$$

 

- $\gamma$, $\beta$는 학습 가능한 파라미터(learnable parameters for our model) - 학습시 가중치 업데이트하듯이 업데이트하게 됨

 

만약에 $ \gamma = \sqrt{\sigma^{2}+\epsilon} $ 이고 $\beta = \mu$ 라면, $\tilde{z}^{(i)} = {z}^{(i)}$

 

"these four equations is just computing essentially the identity function"

감마와 베타에 따라 hidden unit들이 다른 평균과 분산값을 가지게 됨

 

이제는 ${z}^{(i)}$ 대신에 $\tilde{z}^{(i)} $ 를 사용하게 됨

 

input features X 를 normalizing 하는 것을 먼저 살펴봤다면, batch norm은 입력 레이어 뿐만 아니라 신경망의 hidden layer 의 값까지 대상으로 함

차이점은 hidden unit의 값들을 강제로 평균 0, 분산 1로 맞추지 않는다는 것

활성화 함수가 sigmoid 라고 쳤을 때 평균 0, 분산 1 로 고정되어 있으면 non-linear 영역의 혜택을 받지 못하게 됨

감마와 베타로써  ${z}^{(i)}$ 값들이 내가 원하는 범위의 값을 갖도록 할 수 있다

--> hidden unit들의 값을 nomalize 함으로써 고정된 평균과 분산값을 갖도록 함하는데, 0/1 일 수도 있고 아닐 수도 있음

 

 

Fitting Batch Norm into a Neural Network

지금까지 한 개의 hidden layer에 적용하는 것을 보았음. deep neural network에서는?

 

하나의 unit에서는 두 가지 연산, 즉 Z값을 구하는 연산과 A값을 구하는 연산이 이루어짐

batch norm 는 Z값 연산과 A값 연산 사이에서 이루어진다 즉,

 

$$X\xrightarrow{w^{[1]}, b^{[1]}}z^{[1]}\xrightarrow[BatchNorm]{\beta^{[1]}, \gamma^{[1]}}\tilde{z}^{[1]}  \longrightarrow a^{[1]}=g^{[1]}(\tilde{z}^{[1]})\xrightarrow{w^{[2]}, b^{[2]}} z^{[2]}\xrightarrow[BatchNorm]{\beta^{[2]}, \gamma^{[2]}}\tilde{z}^{[2]}\rightarrow \ldots$$

 

Parameters : $w^{[1]}$, $b^{[1]}$, $w^{[2]}$, $b^{[2]}$, ..., $w^{[L]}$, $b^{[L]}$, 그리고 $\beta^{[1]}$, $\gamma^{[1]}$, $\beta^{[2]}$, $\gamma^{[2]}$, ..., $\beta^{[L]}$, $\gamma^{[L]}$

*momentum, Adam에 쓰이는 파라미터 $\beta$와 관련 없음! 

 

gradient descent 와 같은 최적화 알고리즘 활용해서 업데이트 할 수 있음. AdamProp, momentum도 사용 가능.

$\beta^{[l]} = \beta^{[l]} - \alpha d\beta^{[l]}$

 

Batch Norm 을 구현하지 않아도 됨 - 딥러닝 프레임워크에서 제공 tf.nn.batch_normalization

 

 

[working with mini-batches]

 

첫번째 미치배치에 대해 수행

$$X^{\{1\}}\xrightarrow{w^{[1]}, b^{[1]}}z^{[1]}\xrightarrow[BatchNorm]{\beta^{[1]}, \gamma^{[1]}}\tilde{z}^{[1]}  \longrightarrow a^{[1]}=g^{[1]}(\tilde{z}^{[1]})\xrightarrow{w^{[2]}, b^{[2]}} z^{[2]}\xrightarrow[BatchNorm]{\beta^{[2]}, \gamma^{[2]}}\tilde{z}^{[2]}\rightarrow \ldots$$

 

두번째 미니배치에 대해 수행

$$X^{\{2\}}\xrightarrow{w^{[1]}, b^{[1]}}z^{[1]}\xrightarrow[BatchNorm]{\beta^{[1]}, \gamma^{[1]}}\tilde{z}^{[1]}  \longrightarrow a^{[1]}=g^{[1]}(\tilde{z}^{[1]})\xrightarrow{w^{[2]}, b^{[2]}} z^{[2]}\xrightarrow[BatchNorm]{\beta^{[2]}, \gamma^{[2]}}\tilde{z}^{[2]}\rightarrow \ldots$$

 

....

 

해당 미니배치의 데이터만을 이용해 z값을 normalize하게 됨

 

parameters : $w^{[l]}$, $b^{[l]}$, $\beta^{[l]}$, $\gamma^{[l]}$

 

z값은 $z^{[l]} = w^{[l]}a^{[l-1]} + b^{[l]}$ 으로 구하는데, 

batch norm을 하게 되면 해당 미니배치에서 $z^{[l]}$를 normalize 하여 평균 0, standard variance를 갖게 한 다음 $\beta$와 $\gamma$ 로 rescale 한다

이때 $b^{[l]}$는 그 값과 상관없이 빠지게 된다 - batch norm 하는 과정에서 $z^{[l]} $의 평균을 구해 그만큼을 빼기 때문

따라서 미니배치의 모든 샘플에 상수를 더하는 것은 큰 의미가 없음 (어차피 mean subtraction 과정에서 사라지게 되므로)

이에 batch norm 을 쓸 때 파라미터 $b^{[l]}$는 없애도 괜찮음

 

$$ z^{[l]} = w^{[l]}a^{[l-1]} $$

$$z^{[l]}_{norm}$$

$$\tilde{z}^{[l]} = \gamma^{[l]}z^{[l]}_{norm}+ \beta^{[l]} $$

 

삭제된 $b^{[l]}$를 $\beta^{[l]}$가 대신하는 셈 - affecting the shift or the biased terms

 

$z^{[l]}$의 차원은? 하나의 example에 대한 것이므로 $(n^{[l]}, 1)$

나머지 $\gamma^{[l]}$, $\beta^{[l]}$ 또한 $(n^{[l]}, 1)$차원

 

[Implementing gradient descent]

 

 

Why does Batch Norm work?

input feature 들을 비슷한 범위의 값으로 normalize 함으로써 더 빠른 학습이 가능했음

 

batch norm 이 작동하는 두번째 이유는, 뒤에 나올 가중치들이 초반의 가중치들의 변화에 robust 해진다는 것

 

검은고양이 이미지로 고양이 판별기를 훈련시켰다고 해보자. 이 신경망을 색깔고양이 이미지에 적용하려 한다면?

동그라미가 positive, 엑스가 negative

전자가 나의 학습셋 분포이고, 후자의 분포를 가진 데이터에 일반화하고자 하는 것 -> 잘 안 될 것임

이와 같은 데이터 분포의 변화를 covariance shift 라고 부름

X의 분포가 바뀌었다면 모델을 다시 훈련시켜야 함

 

세번째 레이어의 입장에서 생각해보기

- $w^{[3]}$, $b^{[3]}$ 를 훈련시켜야 함

- 이전 레이어로부터 값을 받아옴: $a^{[2]}_{1}$, $a^{[2]}_{2}$, $a^{[2]}_{3}$, $a^{[2]}_{4}$ 

- 이 값들을 가지고 $\hat{y}$와 맵핑할 방법을 찾음

- 이때, 앞 레이어들의 파라미터들($w^{[1]}$, $b^{[1]}$, ...)이 바뀌면 $a^{[2]}_{1}$, $a^{[2]}_{2}$, $a^{[2]}_{3}$, $a^{[2]}_{4}$ 도 바뀜

- 즉 세번째 레이어 입장에서 입력 값은 항상 변화함 --> covariance shift 문제

 

Batch norm reduces the amount that the distribution of these hidden unit values shifts around

 

batch norm 을 통해 업데이트를 거듭해도 값들의 평균과 분산을 동일하게 유지시켜줌 (값들 자체가 바뀌더라도)

레이어간 coupling 을 약화시켜서 각 레이어가 비교적 독립적으로 학습될 수 있도록 함 -> 속도 개선

 

부차적으로 regularization 효과도 있음

 

각 미니배치에 대해 계산되므로 normalize된 결과도 약간의 노이즈를 가지게 됨 -> 한가지 노드에만 의존하지 않음 -> 이것이 dropout과 비슷한 regularization 효과를 일으킴

 

미니배치 사이즈가 커지면 노이즈가 적어지므로 regularization 효과도 감소

그렇다고 batch norm을 regularizer 로 사용할 것은 아님

 

 

Batch Norm at Test Time

 

batch norm 은 한번에 하나의 미니배치에 대해 실시하는데, test시에는 미니배치 단위로 처리하지 않으니 방식을 다르게 해야 함.

 

batch norm -->

$$\mu = \frac{1}{m} \sum_{i=1}^{m} z^{(i)}$$

$$\sigma^{2} = \frac{1}{m} \sum_{i=1}^{m} (x_{i} -\mu)^{2} $$

$$z^{(i)}_{norm} = \frac{z^{(i)} - \mu}{\sqrt{\sigma^{2}+\epsilon} }$$

$$\tilde{z}^{(i)} = \gamma z^{(i)}_{norm} + \beta$$

 

여기서 m 은 전체 훈련셋 크기를 말하는 것이 아니라, 미니배치의 크기를 말하는 것임

 

test 시에는 다른 방식으로 $\mu$와 $\sigma$를 구해야 함 (미니배치 크기만큼 있지 않으므로)

 

 - $\mu$, $\sigma$ : estimate using exponentially weighted average across the mini-batches

 

좀더 구체적으로 보자면

$l$번째 레이어 입장에서 $t$번째 미니배치 $X^{\{t\}}$를 학습한다

--> $\mu^{\{t\}{[l]}}$ : $\mu^{\{1\}{[l]}}$, $\mu^{\{2\}{[l]}}$, $\mu^{\{3\}{[l]}}$, ...

exponentially weighted average 활용하여 $\mu$를 구하고, $\sigma^{2}$도 마찬가지다

 

이제 test를 하려 한다면, $z^{(i)}_{norm} = \frac{z^{(i)} - \mu}{\sqrt{\sigma^{2}+\epsilon} }$ 이 수식에서 $\mu$와 $\sigma$는 exponentially weighted average로 구한 값을 활용하고, 

$\tilde{z}^{(i)} = \gamma z^{(i)}_{norm} + \beta$ 이 수식은 훈련시 학습된 $\gamma$, $\beta$를 활용한다

'인공지능 > DLS' 카테고리의 다른 글

[2.3.] Introduction to Programming Frameworks  (0) 2022.07.13
[2.3.] Multi-class Classification  (0) 2022.07.13
[2.3.] Hyperparameter Tuning  (0) 2022.07.12
[2.2.] Optimization Algorithms(2)  (0) 2022.07.12
[2.2.] Optimization Algorithms(1)  (0) 2022.07.11
복사했습니다!