hyeonzzz's Tech Blog

[Andrew Ng] 딥러닝 2단계 : 6. 배치 정규화 본문

Deep Learning/Basics

[Andrew Ng] 딥러닝 2단계 : 6. 배치 정규화

hyeonzzz 2024. 2. 1. 11:30

1. 배치 정규화

 
딥러닝이 떠오르면서 가장 중요한 아이디어 중 하나로 배치 정규화라는 알고리즘이 꼽힙니다.
Sergey IoffeChristian Szegedy가 만들었고, 배치 정규화는 하이퍼파라미터 탐색을 쉽게 만들어줄 뿐만 아니라 신경망과 하이퍼파라미터의 상관관계를 줄여주죠. 이는 더 많은 하이퍼파라미터가 잘 작동하는 데 도움이 됩니다. 아주 깊은 심층신경망이라도 아주 쉽게 학습할 수 있도록 도와줍니다.
어떻게 배치 정규화가 작동하는지 보겠습니다. 여러분이 로지스틱 회귀 등으로 모델을 학습시킬 때 입력 변수들을 정규화하면 학습이 빨라졌던 것을 기억하시나요? 평균을 계산할 때는 입력 변수의 평균을 뺐고, 분산을 계산할 때는 x(i)^2를 사용하죠? 이 값을 이용해 정규화해줍니다. 앞선 영상에서 이 방법이 어떻게 누워있는 학습 등고선을 경사하강법에 적합토록 더 둥근 형태로 바꾸는지 봤습니다. , 로지스틱 회귀 등 신경망의 입력 변수들을 정규화하면 저렇게 바뀌는 것이죠.
심층 신경망은 어떨까요? 여기서는 입력 변수 x뿐 아니라 이 층의 활성값 a^[1], 여기는 활성값 a^[2] 같은 것이 있죠. 만약 w^[3], b^[3]라는 파라미터를 학습시킨다면 a^[2]의 평균과 분산을 정규화하는 것이 더 효율적이지 않을까요? 로지스틱 회귀의 경우 x_1, x_2, x_3를 정규화하는 것이 어떻게 w, b 학습을 효율적으로 하는지 봤습니다. 여기서 질문은 은닉층에 대해 w^[3]b^[3]를 빠르게 학습시킬 수 있도록 이 예시의 a^[2] 같은 값을 정규화할 수 있냐는 거죠. 왜냐하면 다음 층 입력값인 a^[2]w^[3]b^[3] 학습에 영향을 주니까요. 이 질문이 배치 정규화가 하는 일을 나타내고 있습니다. 사실 a^[2]가 아니라 z^[2]를 정규화하는 것이죠. 사실 논쟁이 있습니다 활성 함수 이전의 값인 z^[2]를 정규화할 건지 활성 함수 이후의 값인 a^[2]를 정규화할 건지 사이에서 말이죠. 실제로는 z^[2]를 정규화하는 것이 더 자주 쓰입니다. 이 방법을 계속 쓸거고 여러분께도 추천드립니다.
 

배치 정규화 구현
신경망에서 사잇값들이 주어졌다고 할 때 은닉 유닛의 값 z^(1)부터 z^(m)까지 있다고 합시다. 이 값들은 은닉 유닛의 값들입니다. 더 정확하게 쓰자면 z^[l](i)라고 써야겠죠. i는 1부터 m까지고요. 하지만 간편하게 쓰기 위해서 [l]을 생략합니다. 이 값들에 대해서 우리는 평균을 계산하고요. 다시 말씀드리지만 어떤 층 l에 관한 내용입니다. [l]을 생략했어요. 그리고 여러분이 아시는 것처럼 분산을 계산합니다. 그리고 각 z^(i)에 대해서 정규화를 하여 z^(i)_norm을 얻습니다. 평균을 뺀 뒤에 표준편차로 나누면 되겠죠. 수학적 안정성을 위해서 분모에 ε을 추가합니다. 혹시 표준편차가 0인 경우를 대비해서요. 이렇게 z 값에 대해서 정규화를 거쳐 모든 z들이 평균이 0이고 표준편차가 1이 되도록 만들었습니다.
 
하지만 은닉 유닛이 항상 평균 0 표준편차 1을 갖는 것이 좋지만은 않습니다. 말은 될 지 모르지만 은닉 유닛은 다양한 분포를 가져야하니까요. 그래서 대신 z~를 계산하는데요. 이건 γ*z^(i)_norm + β와 같고요. 여기서 γ와 β는 모델에서 학습시킬 수 있는 변수입니다. 즉 여기에서 경사하강법을 이용해서 아니면 모멘텀, RMSprop, Adam을 이용한 경사하강법 등 다양한 알고리즘을 이용해서 γ와 β를 학습시킬 수 있습니다. 신경망에서 계수들을 찾았던 것처럼 말이죠.

γ와 β를 이용하면 z~의 평균을 원하는 대로 설정할 수 있습니다. 예를 들어 γ=√σ²+ε로써 분모와 같고 β가 μ와 같다면 여기 있는 것처럼 말이죠. 그러면 γz^(i)_norm + β는 이 식을 거꾸로 뒤집은 것과 같은 효과를 낼 겁니다. 만약 이 식이 성립한다면 z~^(i)는 z^(i)와 같겠죠. 이렇게 적절히 γ와 β를 설정해서 이 네 개의 식으로 이뤄진 정규화 과정은 항등함수를 만드는 것과 똑같은 효과를 낸 것이지요. 하지만 다른 γ와 β 값을 정한다면 은닉 유닛의 값들이 서로 다른 평균이나 분산 값을 만들게 할 수 있습니다.
이제 이걸 신경망에 적용시켜 볼까요? 이전에는 여기 z^(1) 등의 값을 썼다면 이제는 z~^(i)를 z^(i) 대신 신경망에 사용하는 겁니다. 그리고 어떤 층인지 알 수 있도록 다시 [l]을 써넣을 수 있겠죠. 여기서 여러분이 얻었으면 하는 직관은 우리가 X를 정규화하는 것이 신경망 학습을 도울 수 있는 것을 봤듯이 배치 정규화는 입력층에만 정규화를 하는 것이 아니라 신경망 안 깊이 있는 은닉층의 값들까지도 정규화하는 것입니다. 이런 정규화를 사용해서 은닉 유닛 z의 평균과 분산을 정규화하는 거죠. 하지만 입력층와 은닉 유닛을 학습시킬 때 차이점은 은닉 유닛 값의 평균과 분산이 0, 1로 고정되기를 원치 않는다는 것입니다. 예를 들어 시그모이드 활성 함수가 있을 때 값들이 모여있는 것을 원치는 않죠. 더 넓은 영역에 걸쳐 퍼져있거나 시그모이드의 비선형성을 살릴 수 있도록 평균이 0이 아닌 다른 값을 갖게 하는 것이 좋습니다.
 
이것이 γ와 β를 이용하여 원하는 범위의 값을 만들어내는 이유입니다. 즉, 은닉 유닛이 표준화된 평균과 분산을 갖되 평균과 분산은 학습 알고리즘에서 설정할 수 있는 두 변수 γ와 β에 의해 조절되는 것입니다. 다시 말하자면 은닉 유닛 값 z^(i)의 평균과 표준편차를 특정한 평균과 분산을 갖도록 정규화하는 것입니다. 이것은 0이나 1이 될 수도 있고 또다른 값이 될 수도 있죠. γ와 β의 조절에 따라서 결정됩니다. 이 강의를 통해서 배치 정규화가 적어도 신경망의 한 층에 대해서 어떻게 작동하고 구현되는지 감을 잡으셨으면 좋겠습니다.

적용 방법
1. 한 층의 모든 은닉 유닛에 대해 동일한 방식으로 적용된다.
2. 각 은닉 유닛마다 독립적으로 정규화한다.

예시
예를 들어, 한 층에 3개의 은닉 유닛이 있고, 미니 배치 크기가 4라고 가정하자.
각 은닉 유닛 ℎ1,ℎ2,ℎ3에 대해 각각 평균과 분산을 계산한다. ℎ1의 4개의 출력값이 [10, 20, 30, 40]이라면, 이 4개의 값에 대해 평균과 분산을 계산하여 정규화한다. ℎ2​와 ℎ3도 마찬가지로 각자의 출력값에 대해 평균과 분산을 계산하여 정규화한다.
이렇게 해서, 각 은닉 유닛은 독립적으로 정규화되지만, 한 층의 모든 은닉 유닛에 대해 동일한 과정이 적용된다는 의미이다.

 

2. 배치 정규화 적용시키기

하나의 은닉층에 배치 정규화를 구현하는 것에 관한 수식을 봤는데요. 심층 신경망 학습에 어떻게 적용될 수 있는지 봅시다.
이런 신경망이 있다고 해보죠. 제가 말씀드렸던 대로 은닉 유닛을 두 가지로 나눠볼 수 있습니다. z를 우선 계산하고 활성화 함수를 이용해서 a를 계산하는 거죠. 즉 원 하나하나가 두 단계의 계산을 나타낸다고 생각하면 됩니다. 다음 층에서도 비슷하게 z^[2]_1a^[2]_1이 되겠죠. 만약 배치 정규화를 쓰지 않는다면 입력값 x가 첫 번째 은닉층에 주어지겠죠? 그러면 w^[1]b^[1]에 따라 우선 z^[1]을 계산합니다. 그리고 활성화 함수에 z^[1]이 주어져서 a^[1]을 계산하는 거죠.

하지만 배치 정규화에서는 z^[1]을 받아서 배치 정규화를 적용합니다. BN으로 줄여쓸 수 있고요. 이 과정은 β^[1]Y^[1]의 영향을 받겠죠? 그러면 새로 정규화된 z^[1] 값을 얻게 됩니다. 그걸 활성화 함수에 줘서 a^[1]을 얻는 것이죠. g^[1]z~^[i]에 적용하는 겁니다. 이렇게 첫 번째 층에 대한 계산을 마쳤습니다. 배치 정규화가 za를 계산하는 사이에 이뤄졌죠.
다음으로 a^[1]을 가지고 z^[2]를 계산합니다. 이 과정 역시 w^[2], b^[2]의 영향을 받고요. 첫 번째 층에서 했던 것처럼 z^[2]에 대해 BN을 적용합니다. 이 과정은 배치 정규화의 변수인 β^[2]γ^[2]의 영향을 받을 겁니다. 그러면 z~^[2]를 얻게 되고 이제 활성화 함수를 적용해서 a^[2]를 얻게 됩니다. 이 과정이 계속 되죠. 마찬가지로 배치 정규화가 z 계산과 a 계산 사이에 이뤄집니다.
여기서 비정규화된 z 값 대신 정규화된 값 z를 사용하는 것이죠. 첫 번째 층에서 그렇게 했고 두 번째 층도 마찬가지입니다. 비정규화된 z^[2] 대신 평균과 분산으로 정규화된 z^[2]를 사용합니다. 즉 신경망에서 변수들이 w^[1]b^[1]이 있겠죠? 다음 슬라이드에서 b^[1]이 없어지는 걸 볼 겁니다. 하지만 지금은 일반적인 경우를 생각하고요.
w^[1], b^[1] 부터 w^[l], b^[l]까지 있겠죠? 그리고 추가로 β^[1], Y^[1] β^[2], Y^[2] 등이 있을 겁니다. 각 층에 배치 정규화를 할 때 사용되죠. Adam 논문에서도 하이퍼파라미터를 나타내기 위해 β를 썼고 배치 정규화 논문에서도 β를 썼지만 두 β는 완전히 다릅니다. 물론 논문을 읽을 때 β가 어떻게 쓰이는지 따로 알아둬야겠지만 배치 정규화에서 사용되는 β^[1], β^[2]는 모멘텀이나 단일, RMSprop 알고리즘에 쓰이는 하이퍼파라미터 β와 다릅니다. 이 변수들이 알고리즘에 쓰입니다. 이제 변수를 찾기 위해 경사 하강법 등 어떤 최적화를 쓸지 고민할 차례입니다. 예컨대 어떤 층에서 dβ^[l]을 계산했다고 칩시다. 그리고 ββ-(학습 속도)*dβ^[l]로 수정했다 합시다. 물론 Adam, RMSprop, 모멘텀 등을 써서 β나 γ를 업데이트할 수도 있어요 경사하강법만 있는 것이 아닙니다.

tf.batch_normalization

 

또 이전 영상에서 배치 정규화를 위해 평균과 분산을 빼고 나누는 방식을 설명했지만 딥러닝 프로그래밍 프레임워크를 사용하면 배치 정규화를 따로 구현할 필요가 없습니다. 단 한 줄의 코드로 구현이 가능하죠. 예를 들어 텐서플로 프레임워크에서는 이 함수를 이용해서 배치 정규화를 구현할 수 있습니다. 물론 프로그래밍 프레임워크에 대해서는 나중에도 다루겠지만 실제로 모든 사항을 하나하나 구현할 필요가 없다는 것을 알려드립니다. 하지만 코드가 뭘 하는지 알기 위해 이 과정이 어떻게 작동하는지 알아두는 것이 좋습니다.
 

실제로는 배치 정규화가 훈련 집합의 미니 배치에 적용됩니다.
즉 첫 번째 미니배치에 대해서 이전 슬라이드에서 했던 것처럼 z^[1]을 계산합니다. w^[1]과 b^[1]을 이용해서요. 그리고 이 미니 배치 안에서 z^[1]의 평균과 분산을 계산한 뒤에 평균을 빼고 표준편차로 나눠 배치 정규화를 진행합니다. 물론 β^[1]와 γ^[1]을 이용해서 값을 조정해줘야 합니다. 이 과정을 통해 첫 번째 미니 배치에서 z~^[1]을 얻게 되고 활성화 함수를 적용해 a^[1]을 얻는 것이죠. 그리고 z^[2]를 w^[2]와 b^[2]를 이용해 계산해냅니다. 이 과정의 반복이죠.
이렇게 첫 번째 미니 배치에 대해 경사하강법을 이용해서 과정을 마쳤으면 두 번째 미니 배치 X^{2}로 이동합니다. 그리고 X^{2}에 대해 비슷한 방법으로 z^[1]을 계산하고요. 그리고 배치 정규화를 써서 z~^[1]을 계산합니다. 이 정규화에서는 두 번째 미니배치에 있는 데이터만을 이용해서 진행합니다. 두 번째 미니배치만 이용해서 평균과 분산을 계산하는 것이지요. 그리고 β와 γ로 보정해서 z 얻습니다. 이 과정의 반복이죠. 마찬가지로 세 번째 미니 배치에 대해서도 해 줍니다.
이제 매개변수화 과정에서 제가 한 가지 말씀드리고 싶은 것이 있는데요. 제가 방금 각 층에 대해 w^[l]과 b^[l], 그리고 β^[l]와 γ^[l]의 변수가 있다고 말씀드렸죠. 여기서 z^[l]은 w^[l]*a^[l-1] + b^[l]로 계산됩니다. 여기서 배치 정규화는 미니 배치를 보고 z^[l]이 평균 0, 분산 1을 갖도록 정규화한 뒤 β와 γ를 이용하여 값을 조정해주는 것입니다. 여기서 b^[l]은 값이 무엇이든지 간에 없어집니다. 왜냐하면 배치 정규화의 정규화 과정에서 z의 평균을 계산한 뒤에 빼주기 때문입니다. 즉 미니 배치의 모든 예시에 상수를 더해줘도 결국 평균을 빼주면서 사라지기 때문에 아무런 영향을 끼치지 않습니다. 즉 배치 정규화를 쓴다면 이 변수를 없앨 수 있습니다. 아니면 저 변수를 항상 0으로 둔다고 생각해도 좋습니다. z^[l] = w^[l]*a^[l-1]이 되는 것이죠. 그리고 z^[l]_norm를 계산하고 z = γ^[l]*z^[l]_norm + β^[l]. 여기서 다음 층에 전달되는 z~의 평균을 정하기 위해 β^[l]은 써줘야 합니다. 다시 말하자면 배치 정규화가 z^[l]의 평균을 0으로 만들기 때문에 b^[l]이라는 변수가 필요 없습니다. 그걸 없애는 대신 β^[l]이 그 역할을 차지하는 것이죠. 결과적으로 편향 변수를 결정하니까요.
 
끝으로 z^[l]의 차원이 (n^[l], 1)이었던 것 기억하시나요? 즉 b^[l]은 (n^[l], 1) 차원일 겁니다. 여기서 n^[l]은 층 l에서의 은닉 유닛 숫자고요. 따라서 β^[l]과 γ^[l]의 차원도 (n^[l], 1)이 됩니다. 왜냐하면 어떤 신경망이든지 간에 n^[l]개의 은닉 유닛을 갖고 있을 때 β^[l]과 γ^[l]이 각 은닉 유닛의 값을 조정하는 데 쓰이기 때문이죠.
 

이제 모든 걸 합쳐서 배치 정규화를 사용하여 경사하강법을 구현하는 법을 살펴봅시다.
미니 배치 경사하강법을 사용한다고 해보죠. t가 1부터 미니 배치의 숫자까지 바뀐다고 합시다. 순방향 전파를 사용한다고 하죠. 미니 배치 X^{t}에 대해서요. 각 은닉층에서 z^[l]을 z~^[l]으로 바꾸기 위해서 말입니다. 이 과정을 거치면 미니배치의 평균과 표준편차를 이용해서 z^[l]을 z~^[l]으로 바꾸어주는 것이지요.

그리고 역방향 전파를 이용해서 층의 모든 변수에 대해 dw, db, dβ, dγ를 계산합니다. 방금 전에 b는 없앴으니 생각하지 맙시다. 그리고 각 변수들을 업데이트 합니다. w는 w-α*dw가 되겠고요. β는 β-α*로 업데이트 됩니다. γ도 마찬가지이고요. 이렇게 차이를 계산하면 적은 것처럼 경사하강법을 이용할 수 있는 것이죠. 물론 모멘텀, RMSprop, Adam을 사용하는 경사하강법에도 쓸 수 있습니다. 이렇게 경사하강법을 이용해서 업데이트를 하지 않고 제가 적은 알고리즘을 이용해서 업데이트를 할 수도 있는 것이지요. 지난 주의 영상에서 살펴봤던 내용입니다. 이런 다양한 알고리즘을 이용해서 β나 γ 같이 배치 정규화에 쓰이는 변수를 업데이트할 수 있습니다.
이 영상을 통해 배치 정규화의 구현 방법에 대해 감을 좀 잡으셨으면 좋겠고요. 나중에 다루겠지만 딥러닝 프로그램 프레임워크를 사용하면 프레임워크에서 누군가가 만들어놓은 코드를 써서 쉽게 배치 정규화를 쓸 수 있습니다.
 
 

3. 배치 정규화가 잘 작동하는 이유는 무엇일까요?

어떻게 배치 정규화가 작동하는 걸까요.
첫 번째 이유입니다. 입력 특성 X를 평균 0, 분산 1로 정규화하는 것이 학습 속도를 올리는 것을 보았습니다. 어떤 특성은 0에서 1까지 어떤 특성은 1에서 1,000까지인 것을 입력 특성 X에 대해 비슷한 범위를 갖도록 정규화하여 학습 속도를 높이는 것이지요. 그래서 우리는 배치 정규화가 작동하는 이유가 비슷한 일을 하기 때문이라는 직관을 얻었습니다. 은닉 유닛과 입력층 모두에서 말이죠. 하지만 이건 부분적인 그림에 불과합니다.

입력 특성을 정규화했을 때 장점

-그라디언트 계산의 안정성 증가
-더 빠른 학습 속도와 수렴
-균일한 학습 속도 유지
-더 나은 초기화 상태
-배치 정규화의 효과 강화


배치정규화가 작동하는 두 번째 이유는 신경망에서 깊은, 예컨대 10번 층의 가중치가 1번 층처럼 앞쪽 층의 가중치의 변화에 영향을 덜 받는다는 것입니다.

제 말을 쉽게 이해할 수 있도록 예시를 준비했습니다. 고양이 분류를 위해 신경망을 학습한다고 합시다. 로지스틱 회귀처럼 얕거나 깊을 수도 있겠죠. 그리고 검정 고양이의 이미지만 써서 학습시켰다고 합시다. 그리고 이 신경망을 다양한 색깔의 고양이에 적용해봅시다. 왼쪽처럼 검정 고양이가 아니라 오른쪽에 있는 유색 고양이가 정답인 경우 신경망이 좋은 성능을 못 낼 겁니다. 여기를 보시면요. 정답과 오답이 이렇게 분포되어있다고 합시다. 그리고 이걸 일반화해서 이런 정답, 오답 분포에도 적용하는 걸 생각해보면 왼쪽 데이터로 학습시킨 모델이 오른쪽 데이터에서 좋은 성능을 못 낼 것이라고 추측할 수 있습니다. 사실 두 함수는 이렇게 동일하지만 왼쪽 데이터에만 학습 알고리즘을 적용해서 얻은 초록색 결정 기준에 좋은 성능을 기대하기는 어렵습니다.
이처럼 데이터 분포가 변화하는 것을 좀 어려운 말로 공변량 변화라고 부릅니다. 이 아이디어는 X, Y 간의 대응을 학습시킬 때 X의 분포가 바뀐다면 학습 알고리즘을 다시 학습해야한다는 겁니다. 이 예시의 고양이 구분하기처럼 X에서 Y로 대응하는 관측 함수가 바뀌지 않더라도 말이죠. 여러분이 새롭게 함수를 학습시킨다면 더 정확해지거나 관측 함수가 함께 움직여서 더 나빠질 수도 있습니다.
 

공변량 변화가 신경망에 어떻게 적용될 수 있을까요?
이런 심층신경망을 생각해봅시다. 그리고 이 세 번째 은닉층의 관점에서 학습 과정을 살펴봅시다. 이 신경망은 w^[3]와 b^[3]를 학습시키고 있습니다. 세 번째 은닉층은 앞선 층에서 값들을 받아오고요. 그리고 관측값인 Y와 가까운 ŷ 과 관련 있는 일을 할 겁니다.
잠시 왼쪽 부분을 가려볼게요. 세 번째 층이 값들을 받아오겠죠? 그것들을 a_1^[2], a_2^[2], a_3^[2], a_4^[2]라고 합시다. 특성 값인 x_1, x_2, x_3, x_4가 될 수도 있겠죠. 이 세 번째 층이 할 일은 값을 받아와서 ŷ으로 대응시키는 것입니다. 경사하강법을 써서 w^[3]와 b^[3]나 w^[4]와 b^[4] 나아가 w^[5]와 b^[5]를 신경망이 좋은 성능을 내도록 학습시키는 거죠. 왼쪽에 가려져 있는 값들로부터 출력값인 ŷ을 만들어내는 겁니다.
이제 신경망의 왼쪽을 다시 벗깁시다. 신경망은 매개변수 w^[2], b^[2]와 w^[1], b^[1]도 학습시키고 있습니다. 이 매개변수의 값이 바뀌면 여기 a^[2] 값들도 바뀌겠죠. 따라서 세 번째 은닉층의 관점에서 이 은닉층의 값들이 계속 바뀌고 있습니다. 따라서 앞서 살펴봤던 공변량 변화의 문제를 계속 겪게 되는 것이죠.
 
여기에서 배치 정규화는 은닉층 값들의 분포가 변화하는 양을 줄여줍니다. 만약 이 은닉층들의 값의 분포를 그린다면 여기서는 재정규화된 z인 z_1^[2]z_2^[2]를 씁시다. 값 네 개 대신 두 개를 사용해서 2차원에 나타낼 수 있겠죠. 여기서 배치 정규화가 말하고자하는 것은 z_1^[2]과 z_2^[2]가 바뀔 수 있을 거고 신경망이 앞선 층의 매개변수를 새로 고치면서 아마 바뀔 겁니다.

여기서 배치 정규화는 얼마나 바뀌든지 간에 z_1^[2]과 z_2^[2]의 평균과 분산이 동일하게 유지될 거라는 것을 말합니다. 즉 z_1^[2]z_2^[2]의 값이 바뀌더라도 적어도 평균과 분산은 0과 1처럼 유지될 거라는 거죠. 굳이 0과 1이 아니더라도 β^[2]나 γ^[2]와 같은 값도 가능합니다. 즉 배치 정규화가 하는 일은 앞선 층에서의 매개변수가 바뀌었을 때 세 번째 층의 값이 받아들여서 학습하게 될 값의 분포를 제한하는 것입니다. 즉 배치 정규화는 입력값이 바뀌어서 발생하는 문제를 더욱 안정화시키는 것이지요. 뒤쪽 층은 당연히 더 쉽게 학습할 수 있을 겁니다. 입력 값의 분포가 조금 바뀌더라도 조금만 바뀌는 것이죠. 즉 앞쪽 층이 계속 학습하면서 값을 바꾸더라도 뒤쪽 층이 그것 때문에 겪는 부담을 줄이는 것입니다. 그리고 이것은 또 앞쪽 층의 매개변수와 뒤쪽 층의 매개변수 간의 관계를 약화시킵니다. 따라서 신경망의 각 층이 스스로 배울 수 있게 되죠. 다른 층과 상관 없이 말이죠. 이것을 통해서 전체 신경망의 학습 속도를 상승시킬 수 있습니다.

반드시 알아두어야 할 것은 배치 정규화에 의해 신경망에서 뒤쪽에 있는 층의 관점에서 앞선 층이 너무 많이 변화하지 않는다는 것입니다. 왜냐하면 평균과 분산이 일정하도록 제한받았으니까요. 이를 통해 뒤쪽 층의 학습이 더욱 용이합니다.
 

그리고 배치 정규화의 두 번째 효과가 있습니다. 규제 효과인데요. 배치 정규화에서 다소 비직관적이죠. 각각의 미니 배치 X^{t}가 가진 z^[l]에 대해서 그 미니 배치의 평균과 분산에 따라 값을 조정할 것입니다. 여기서 미니 배치에서 계산한 평균과 분산은 전체 데이터로부터 계산한 것에 비해 다소 잡음을 갖고 있습니다. 왜냐하면 64, 128, 256 내지는 더 큰 크기의 훈련 예시를 지닌 미니 배치에 대해 상대적으로 작은 데이터에 대해서 추정한 것이니까요. 여기서 z^[l]에서 z~[l]으로 조정하는 과정 역시 잡음이 끼어있겠죠. 왜냐하면 잡음이 끼어있는 평균과 분산으로 계산하니까요. 즉 드롭아웃처럼 은닉층의 활성 함수에 잡음이 끼어 있습니다.
드롭아웃에서는 은닉층을 가져와서 확률에 따라 0을 곱하거나 확률에 따라 1을 곱했지요? 따라서 드롭아웃은 곱셈 잡음을 갖고 있습니다. 0이나 1을 곱하니까요.
반면에 배치 정규화는 표준편차로 나누니 곱셈 잡음도 있고 평균을 빼니 덧셈 잡음도 있습니다. 여기서 평균과 표준편차의 추정치에는 잡음이 다소 끼어있고요. 따라서 드롭아웃처럼 배치 정규화는 약간의 일반화 효과를 갖고 있습니다. 왜냐하면 은닉층에 잡음을 추가하는 것은 이후의 은닉층이 하나의 은닉층에 너무 의존하지 않도록 하거든요. 따라서 드롭아웃처럼 은닉층에 잡음을 추가해서 아주 약간의 일반화 효과를 보여줍니다. 여기서 잡음이 아주 작다보니 일반화 효과가 그리 크지는 않습니다. 그래서 배치 정규화와 드롭아웃을 함께 사용할 수도 있겠죠. 더욱 강력한 일반화를 원한다면 말이죠.
 
그리고 다른 비직관적인 효과를 봅시다. 여러분이 큰 미니 배치를 사용한다고 해보죠. 64 대신 512 크기를 사용한다고 해봅시다. 큰 미니배치를 사용하면 잡음이 줄어들고 따라서 일반화 효과도 줄어들 것입니다. 드롭아웃의 이상한 특징인데요. 큰 미니배치를 사용하면 일반화 효과가 줄어드는 것이죠. 따라서 저는 배치 정규화를 일반화를 목적으로 사용하지는 않습니다. 배치 정규화는 그걸 목적으로 만들어진 게 아니에요. 은닉층의 활성 함수를 정규화해서 학습 속도를 올리는 용도로 사용하세요.


이 영상을 통해 배치 정규화가 뭘 하는 건지 직관을 얻었기를 바랍니다. 배치 정규화에 대한 논의를 맺기 전에 한 가지 더 알아두어야 할 게 있습니다. 배치 정규화는 한 번에 미니배치 하나의 데이터를 다룹니다. 미니 배치의 평균과 분산을 계산하죠. 테스트 과정에서는 예측을 해서 신경망을 평가합니다. 예시의 미니 배치가 없지요. 한 번에 예시 하나씩을 처리하는 겁니다. 따라서 테스트 과정에서는 예측이 잘 맞도록 조금 다른 접근을 해야 합니다.