• 카테고리

    질문 & 답변
  • 세부 분야

    컴퓨터 비전

  • 해결 여부

    미해결

Internal Covariate Shift 관련 질문 드립니다.

22.03.28 04:27 작성 조회수 726

0

선생님 안녕하세요, 공부를 하던 중 Internal Covariate Shift가 정확히 왜 개선 되어야 하는 문제인지 잘 모르겠어서 이렇게 질문을 남깁니다.

우선 제가 이해한 바로는 Covariate Shift란, 실제 데이터가 True function이라는 분포를 따른다고 할 때 아래와 같은 경우에서 발생한다고 이해했습니다.  우리가 train data를 샘플링 할 때 true function의 큰 틀은 따르지만 조금 다른 분포에서 샘플링을 하고 이를 사용해서 모델을 훈련시킬 경우, 학습 모델은 True function과 전적으로 겹칠 수 없게 됩니다. 따라서 test data를 train data가 커버하고 있지 않는 true function 영역에서 추출하게 된다면 학습시킨 모델은 잘 맞지 않게 될 것이고, 이는 학습용 데이터와 테스트 데이터의 분포가 서로 달랐기 때문에 발생한 문제라고 이해했습니다.

 

Internal Covariate Shift란, 위와 같은 문제가 어떤 레이어의 출력이 다음 레이어의 입력으로 들어갈 때 일어나는걸로 이해했습니다. 딥러닝 특성상 한 레이어당 많은 파라미터가 존재하고 비선형적인 활성화 함수를 사용하기 때문에 A 레이어에 입력이 Z-mean scaling된 데이터가 들어온다고 해도, weighted sum과 활성화 함수를 거쳐서 B 레이어의 입력으로 들어가는 값들은 A 레이어의 정규화된 입력 분포와는 다른 분포를 가지고 있게 될 것입니다.

 

제가 생각하는 Internal Covariate Shift의 단점은 훈련 속도가 느려진다는 부분입니다. B 레이어의 입장에서는 A 레이어의 가중치 값이 바뀔 때마다 들어오는 입력의 분포가 달라지기 때문에 지속적으로 적응(마땅한 표현이 떠오르지 않네요 ㅠ) 해나가야 해서 결국 최적해를 찾기까지는 오랜 시간이 걸릴 것 같습니다.

이러한 문제는 네트워크가 깊어질수록 입력층에 가까운 레이어와 출력층의 가까운 레이어가 받아보는 분포의 차이는 더 크게 될 것이고, 때문에 입력층에 가까운 레이어의 가중치에서 미세한 조정이 발생해도 출력층에 가까운 레이어의 가중치에서는 상당한 임팩트의 영향력을 끼칠 수 있다고 생각이 되어 네트워크가 안정적으로 수렴하기에 어렵다고 생각됩니다.

 

Training 과정에서는 위와 같은 부분이 문제라고 생각되는데 혹시 제가 잘못 이해한 부분이 있다면 지적 부탁드리겠습니다 선생님.

 

그리고 문서들을 쭉 찾아보니까 test시에도 training 과정에서 사용했던 분포와 test 할 때 사용하는 이미지 데이터의 분포가 다르기 때문에 성능 차이가 발생한다고 하는데 이 부분이 잘 이해가 안갑니다. 어차피 테스트 할 경우에는 training 할 경우와 세부적으론 다르지만 큰 틀에서는 비슷한 분포의 데이터를 사용하는데,  이러한 gap을 줄여주기 위해 training을 돌리는게 아닌가요? 

 

항상 감사드립니다 선생님.

 

이와 겹치는 부분이 있지만 결국에는 다른 

답변 1

답변을 작성해보세요.

0

안녕하십니다. 

오, 딥러닝 기반 지식이 탄탄하시군요. 

전반적인 머신러닝 모델 관점에서 보면 딥러닝은 좀 특이한 모델입니다. 

가중치(Weight)를 가진 Layer가 있고, 이를 활성함수로 다시 가공하고, 이런 방식으로 가중치를 가진 Layer가 여러개가 연결된 모델은 너무나 많은 가중치값을 가지게 됩니다. 

보통 이런 방식으로 많은 가중치를 가지게 되면 학습 데이터에만 충실하게 예측되는 오버피팅이 되기 쉽습니다.특히 많은 가중치들이 있을때에 학습데이터의 loss만 줄이는 방식으로 가중치를 update하다보니, 가중치값이 서로 들쑥날쑥 할 수 있습니다.  여기에 여러개의 Layer를 가지는 특성 때문에 가중치가 적용된 입력값을 기반으로 한 출력값은 Layer를 거칠때마다 더욱 들쑥날쑥 해집니다.

이 중 학습 시  Layer를 통과하여 출력되는 즉 다른 Layer로 입력되는 입력값을  Normalization을 적용하는 것이 Batch Normalization입니다. 

1. 우선 제가 이해한 바로는 Covariate Shift란, 실제 데이터가 True function이라는 분포를 따른다고 할 때 아래와 같은 경우에서 발생한다고 이해했습니다.  우리가 train data를 샘플링 할 때 true function의 큰 틀은 따르지만 조금 다른 분포에서 샘플링을 하고 이를 사용해서 모델을 훈련시킬 경우, 학습 모델은 True function과 전적으로 겹칠 수 없게 됩니다. 따라서 test data를 train data가 커버하고 있지 않는 true function 영역에서 추출하게 된다면 학습시킨 모델은 잘 맞지 않게 될 것이고, 이는 학습용 데이터와 테스트 데이터의 분포가 서로 달랐기 때문에 발생한 문제라고 이해했습니다.

=> 음, 말씀하신게 틀린것은 아닌데, 이게 Covariate shift가 근본적으로 발생하는 이유라고 말하기는 좀 애매해 보입니다. 원래 머신 러닝 모델은 학습용 데이터와 테스트 데이터의 분포가 달라지는 것을 해결해야 하는 것이 주 목표입니다. 같다면 오버피팅 같은 문제는 큰 문제가 아닐것입니다. 

그러니까 Covariate shift가 기본적으로는 어떤 데이터 세트에서도 발생할 수 있는 것이지만 딥러닝 모델에서는 Layer를 통과하면서 출력과 입력이 반복 되기 때문에 더 심하다고 볼 수 있습니다. 

2. Internal Covariate Shift란, 위와 같은 문제가 어떤 레이어의 출력이 다음 레이어의 입력으로 들어갈 때 일어나는걸로 이해했습니다. 딥러닝 특성상 한 레이어당 많은 파라미터가 존재하고 비선형적인 활성화 함수를 사용하기 때문에 A 레이어에 입력이 Z-mean scaling된 데이터가 들어온다고 해도, weighted sum과 활성화 함수를 거쳐서 B 레이어의 입력으로 들어가는 값들은 A 레이어의 정규화된 입력 분포와는 다른 분포를 가지고 있게 될 것입니다. 

==> 네 맞습니다. 

3. 제가 생각하는 Internal Covariate Shift의 단점은 훈련 속도가 느려진다는 부분입니다. B 레이어의 입장에서는 A 레이어의 가중치 값이 바뀔 때마다 들어오는 입력의 분포가 달라지기 때문에 지속적으로 적응(마땅한 표현이 떠오르지 않네요 ㅠ) 해나가야 해서 결국 최적해를 찾기까지는 오랜 시간이 걸릴 것 같습니다.

 

=> Internal Covariate Shift로 훈련 속도가 느려지는게 단점이라고 하셨는데, 말씀하신걸 더 읽어보면 최적해를 찾기까지 오랜 시간이 걸리고,  이때문에 안정적으로 수렴하지 못한다고 하셨는데 어떤 것을 의미하는지 잘 모르겠습니다.

일단 학습 속도가 느리다는 의미가 어떤건지 잘 모르겠습니다. 느리다는 의미가 배치 단위 가중치 update가 느리다면, normalization을 적용해야 하기때문에 오히려 batch normalization이 더 느립니다. 최적해를 찾기까지 느리다는 의미면 당연히 올바르게 가중치가 학습이 되지 않으므로 최적해를 찾기까지 느립니다.