데이터를 기반으로

배치 정규화(Batch Normalization) 본문

데이터 분석(Python)/딥러닝(Deep Learning)

배치 정규화(Batch Normalization)

이노후 2022. 10. 4. 00:09
728x90
반응형

가중치 초기화보다도 더 오래 잡고 이해가 안돼서 계속 보던 개념을 드디어 이해하여, 정리해보고자 한다.

(약 2주 동안 보고 있었다...수 많은 why? 때문에...머리가 안 좋은 가...영어를 잘한다면 원본 논문을 보고 이해했을 텐데...얼른 영어공부를 해야겠다..)

 

먼저, 배치 정규화를 모색하게 된 배경부터 확인해보자.

 

이전 게시물에서 가중치 초기화에 대해 정리를 했었다. 

 

[ 배치 정규화(Batch Normalization)의 탄생 배경 ]

→ 가중치 초기화를 진행했음에도 훈련 도중 언제 어디서 가중치 소실/폭주 가 일어날 수 있다. 이를 예방하기 위해 신경망 학습을 진행하는 각 층에 입력되는 데이터를 평균과 분산으로 정규화하여 학습을 효율적으로 만든다.

 

배치 정규화를 이해하기 전 내부 공변량 변화(Internal Covariate Shift)에 대해 먼저 알아야 한다.

 

 

[ 내부 공변량 변화(Internal Covariate Shift) ]

→ 학습 과정에서 층 별로 입력 데이터 분포가 달라지는 현상을 말합니다.

 

이전 층들의 학습에 의해 이전 층의 가중치 값이 바뀌게 되면, 현재 층에 전달되는 입력 데이터의 분포가 현재 층이 학습했던 시점의 분포와 차이가 발생합니다. 

 

나는 처음에 위에 말이 무슨 말인지 1도 이해가 되지 않았다....약 블로그 글 몇 십개를 살펴보고난 후에 이해가 되었다.

바로 역전파 과정을 염두하고 해당 글을 읽으면 이해가 된다.

(신경망의 학습 과정 중 역전파는 필수인데 계속 순전파만 생각하며 이론을 접하는게 문제다.)

 

  • 공변량 변화는 훈련 데이터의 분포와 테스트 데이터의 분포가 다른 경우를 의미합니다.
  • 내부 공변량 변화는 신경망 층 사이에서 발생하는 입력 데이터의 분포 변화를 의미합니다.

[ 배치 정규화(Batch Normalization) 과정 ]

한 번에 들어오는 배치 단위로 정규화하는 것을 말합니다.

 배치 정규화는 각 층에서 활성화 함수를 통과하기 전에 수행됩니다. 

    (※ 배치 정규화를 활성화 함수 전 or 후에 취하는 방식이 각각 존재하는 것으로 보여지는데, 해당 부분은 추후 정리 예정)

 

 정규화 된 데이터에 대해서 스케일과 시프트를 수행합니다. 이때 두 개의 매개변수 γ와 β를 사용하는데,

 γ는 스케일을 위해 사용하고, β는 시프트를 하는 것에 사용하며 다음 레이어에 일정한 범위의 값들만 전달되게 합니다.

 

배치 정규화는 학습 시 배치 단위의 평균과 분산들을 차례대로 받아 이동 평균과 이동 분산을 저장해놓았다가 테스트 할 때는 해당 배치의 평균과 분산을 구하지 않고 구해놓았던 평균과 분산으로 정규화를 합니다.

  • 배치 정규화를 사용하면 시그모이드 함수나 하이퍼볼릭탄젠트 함수를 사용하더라도 기울기 소실 문제가 크게 개선됩니다.
  • 가중치 초기화에 훨씬 덜 민감해집니다.
  • 훨씬 큰 학습률을 사용할 수 있어 학습 속도를 개선시킵니다.
  • 미니 배치마다 평균과 표준편차를 계산하여 사용하므로 훈련 데이터에 일종의 잡음 주입의 부수 효과로 과적합을 방지하는 효과도 냅니다. 다시 말해, 마치 드롭아웃과 비슷한 효과를 냅니다. 물론, 드롭 아웃과 함께 사용하는 것이 좋습니다.
  • 배치 정규화는 모델을 복잡하게 하며, 추가 계산을 하는 것이므로 테스트 데이터에 대한 예측 시에 실행 시간이 느려집니다. 그래서 서비스 속도를 고려하는 관점에서는 배치 정규화가 꼭 필요한지 고민이 필요합니다.
  • 배치 정규화의 효과는 굉장하지만 내부 공변량 변화때문은 아니라는 논문도 있습니다. : https://arxiv.org/pdf/1805.11604.pdf

여기까지가 제가 보고 있던 교재의 내용입니다.

 

추가로 학습 과정에서 Mini-batch 가 나오는데 해당 개념이 조금 부족해 학습에서 나오는 단어 개념들을 정리해보았다.

 

- 가중치가 변경되는 시점은 역전파 뿐이다.

- Batch에서 mini-batch 1개씩 모든 학습을 진행 → 1 iteration 이라고 지칭

- 모든 mini-batch 수 = N → N iteration : 1 epoch

- batch size * iteration = 전체 데이터 수

- 1 iteration = mini-batch 1개의 전체 학습(순전파, 역전파 포함)

 

BN은 1개의 은닉층에 1개씩 존재.

 

이후, 정규화 방법에도 2가지가 존재한다.

Normalization : 평균 0, 표준편차 1

Whitening : 평균 0, 공분산을 단위행렬로 갖는 정규분포 형태로 변환하는 기법으로 Decorrelation + Standardization으로 볼 수 있다

 

 

이렇게 이해하고 정리를 마치며 총 3가지 의문점이 생겼다.

 

첫 번째 'Why?' 는 바로 아래와 같다.

 

1. 왜 이동평균 개념이 나오는 것인가?

→ 위 개념을 위해서는 추론에 대한 개념의 이해가 필요하다.

https://ds92.tistory.com/92

 

추론(Inference)

배치 정규화를 공부 중 추론이란 부분이 나왔다. 처음 듣는 단어이고 검색을 해보니 Prediction과는 다른 부분이었다. 우리가 흔히 아는 학습된 모델에 새로운 데이터를 넣고 결과를 보는 것이 보

ds92.tistory.com

이전 게시글에 내가 이해한 것을 토대로 추론에 대해 정리한 내용이다.

 

먼저 학습 과정과 추론 과정을 나누어서 설명을 해야한다.

 

- 학습

 여기서 γ 는 스케일링 역할을 하고 β 는 bias입니다. 물론 두 값 모두 backprpagation을 통하여 학습을 하게 됩니다.

→ 학습 단계의 BN을 구하기 위하여 사용된 평균과 분산을 구할 때에는 배치별로 계산되어야 의미가 있습니다. 그래야 각 배치들이 표준 정규 분포를 각각 따르게 되기 때문이지요. 따라서 평균과 분산을 구할때에도 나눠주는 값이 Batch size 입니다.

 

- 추론

→ 추론 단계에서는 BN에 적용할 평균과 분산에 고정값을 사용한다. 학습 단계에서는 데이터가 배치 단위로 들어오기 때문에 배치의 평균, 분산을 구하는 것이 가능하지만, 테스트 단계에서는 배치 단위로 평균/분산을 구하기가 어려워 학습 단계에서 배치 단위의 평균/분산을 저장해 놓고 테스트 시에는 평균/분산을 사용한다.

 

한마디로, 학습 단계에서는 Mini-batch 별로 평균, 분산을 구해서 직접 적용한다. 그러나, 추론은 고정된 값을 사용해야하기에 학습 단계에서 추출해둔 Mini-batch 의 이동 평균과 이동 분산을 구하여 해당 값으로 진행한다.

 

해당 부분의 이동 평균에서도 단순 이동 평균이 아닌, 지수 이동 평균을 사용한다고 한다.

 

여기서, 두 번째 'Why?'가 나타난다.

 

2. 왜 단순 이동 평균이 아닌 지수 이동 평균을 사용하는 것인가?

→ 단순이동평균을 사용하면 N개 이전의 평균과 분산은 미반영 되지만 지수이동평균을 사용하면 전체 데이터가 반영된다.

 

→ 단순 이동 평균은 구간변수 N인 경우 N개의 데이터만을 이용하여 계산하지만, 지수 이동 평균은 N과 무관하게 모든 과거의 데이터를 이용하고, N자체는 가중치에만 영향을 준다.

 

지수평균에 대한 이해가 조금 부족해 좀 더 서칭해본 결과

→ 단순 이동 평균은 m=6으로 주면 6일치에 대한 평균을 순차적으로 구해 이동평균을 구하는 반면,

지수 이동 평균은 과거 전체 데이터를 기준으로 산출하며 최근 데이터에 높은 가중치를 주며 구하는 방식이다.

 

3. 왜 BN layer의 위치에 따라 효과가 다른가?

 

이렇게 글을 마무리 하나 싶다가... 블로그 글을 보던 중 BN layer 위치에 대한 효과가 각각 다르다는 것을 보게 되었다.

(정확히 어떤 블로그였는지...기억은 안난다.)

 

하여, 해당 자료를 찾아보니 국내 블로그 or 잘 정리된 자료는 보이지 않아 어쩔 수 없이 영어로 검색을 진행해 좋은 블로그글을 찾았다.

 

https://towardsdatascience.com/batch-normalization-in-3-levels-of-understanding-14c2da90a338

 

Batch normalization in 3 levels of understanding

What do we know about it so far : from a 30 seconds digest to a comprehensive guide.

towardsdatascience.com

 

해당 글에서는 이렇게 이야기 한다.

 

배치 정규화 논문에서는 Activation Function 전에 사용하라고 안내되어 있으나, 실질적으로 모델을 돌릴 때는 뒤에 위치해야 더 좋은 성능을 보여준다고.

 

아직까지도 해당 BN layer의 위치는 논쟁거리로 이어지고 있다고 한다.

 

혹여나, 해당 논쟁에 대한 결론이 난 자료가 있다면 댓글로 부탁드린다.

728x90
반응형