Deep learning/이론(hands on machine learning)

12. 배치 정규화

jwjwvison 2021. 6. 3. 22:06

 그레이디언트 소실과 폭주 문제를 해결하기 위한 배치 정규화(BN) 기법은 각 층에서 활성화 함수를 통과하기 전이나 후에 모델에 연산을 하나 추가한다. 이 연산은 단순하게 입력을 원점에 맞추고 정규화한 다음, 각 층에서 두 개의 새로운 파라미터로 결괏값의 스케일을 조정하고 이동시킨다. 하나는 스케일 조정에, 다른 하나는 이동에 사용한다.

 

 많은 경우 신경망의 첫 번째 층으로 배치 정규화를 추가하면 훈련 세트를 (예를 들면 StandardScaler를 사용하여) 표준화할 필요가 없다. 배치 정규화 층이 이런 역할을 대신한다.

 

 입력 데이터를 원점에 맞추고 정규화하려면 알고리즘은 평균과 표준편차를 추정해야 한다. 이를 위해 현재 미니배치에서 입력의 평균과 표준편차를 평가한다.

 배치 정규화 층마다 네 개의 파라미터 벡터가 학습된다. 

 

 배치 정규화를 통해 그레이디언트 소실 문제가 크게 감소하여 하이퍼볼릭 탄젠트나 로지스틱 활성화 함수 같은 수렴성을 가진 활성화 함수를 사용할 수 있다. 또 가중치 초기화에 네트워크가 훨씬 덜 민감해진다. 훨씬 큰 학습률을 사용하여 학습 과정의 속도를 크게 높일 수 있었다. 마지막으로 규제와 같은 역할을 하여 다른 규제 기법의 필요성을 줄여준다.

 

 다른 케라스 코드와 마찬가지로 배치 정규화 층도 간단하다. 은닉층의 활서오하 함수 전이나 후에 (BatchNormalization 층을 추가하면 된다). 모델의 첫 번째 층으로 배치 정규화 층을 추가할 수도 있다.

from tensorflow import keras

model=keras.models.Sequential([
                               keras.layers.Flatten(input_shape=[28,28]),
                               keras.layers.BatchNormalization(),
                               keras.layers.Dense(300,activation='elu',kernel_initializer='he_normal'),
                               keras.layers.BatchNormalization(),
                               keras.layers.Dense(100,activation='elu',kernel_initializer='he_normal'),
                               keras.layers.BatchNormalization(),
                               keras.layers.Dense(10,activation='softmax')
])
model.summary()

 

 배치 정규화 논문의 저자들은 (위 예제 처럼 )활성화 함수 이후보다 활성화 함수 이전에 배치 정규화 층을 추가하는 것이 좋다고 조언한다. 하지만 작업에 따라 선호되는 방식이 다르다. 활성화 함수 전에 배치 정규화 층을 추가하려면 은닉층에서 활성화 함수를 지정하지 말고 배치 정규화 층 뒤에 별도의 층으로 추가해야 한다. 또한 배치 정규화 층은 입력마다 이동 파라미터를 포함하기 때문에 이전 층에서 편향을 뺄 수 있다(층을 만들 때 use_bias=False로 설정한다).

 

 BatchNormalization 클래스는 조정할 하이퍼파라미터가 적다. 보통 기본값이 잘 동작한다.