심층 신경망 훈련하기 - Gradient 소실과 폭주 문제 해결 방법

2020. 12. 29. 14:31ML&DL

본 글은 핸즈온 머신러닝 Part2-11장(심층 신경망 훈련하기)를 공부한 후 정리한 내용입니다.

 

✅ 보다 깊은 심층 신경망을 학습시켜 아주 복잡한 문제를 다룰 때 발생할 수 있는 문제들

  • Gradient 소실 or gradient 폭주 문제에 직면.
    • 심층 신경망의 아래쪽으로 갈수록 gradient가 점점 더 작아지거나 커지는 현상
    • 하위층을 학습하기 매우 어렵게 만듦.
  • 대규모 신경망을 위한 학습 데이터가 충분하지 않거나 레이블을 만드는 작업에 비용이 많이 들 수 있음.
  • 학습이 극단적으로 느려질 수 있음.
  • 수백만 개의 파라미터를 가진 모델은 학습 할 때 과대적합 될 위험이 큼.
    • 특히, 학습 샘플이 충분하지 않거나 잡음이 많은 경우

그 중 Gradient 소실 or gradient 폭주 문제를 해결하는 방법에 대해 알아보겠습니다.

🔸 Gradient 소실 or gradient 폭주?

  • 역전파 알고리즘에서 모든 파라미터에 대한 오차 함수의 그레디언트를 계산하면 경사 하강법 단계에서 이 gradient를 이용하여 각 파라미터를 수정하는데 이때 하위층으로 갈수록 gradient가 작아지는 것을 gradient 소실, 점점 값이 커지면서 여러 층이 비정상적으로 큰 가중치로 갱신되어 알고리즘이 발산되는 것을 gradient 폭주라고 함.
  • 불안정한 gradient는 층마다 학습 속도가 달라질 수 있기 때문에 학습을 어렵게 만듦.

🔸 원인?

  • 로지스틱 시그모이드 활성화 함수와 평균이 0이고 표준편차가 1인 정규분포를 이용한 가중치 초기화 방법의 조합 (by 2010년 세이비어 글로럿과 요슈아 벤지아가 발표한 논문)
  • 각 층에서 출력의 분산이 입력의 분산보다 더 크다.
    • 신경망의 위쪽으로 갈수록 층을 지날 때마다 분산이 계속 커져 가장 높은 층에서는 활성화 함수가 0이나 1로 수렴.

🚫 입력값이 양수나 음수로 커지면 0이나 1로 수렴

  • 기울기가 0에 가까워지기 때문에 역전파 시 전파할 gradient가 거의 없고 조금 남아 있는 gradient는 최상위층에서부터 역전파가 진행되면서 점차 약해지기 때문에 실제로 아래쪽 층에는 아무것도 도달하지 않게됨.

🔸 해결방안 1. 적절한 초기화

  • 예측을 할 때 정방향으로, gradient 를 역전파할 때는 역방향으로 양방향 신호가 적절하게 흐르기 위해 각 층의 출력에 대한 분산이 입력에 대한 분산과 같도록 만든다.
  • 역방향에서 층을 통과하기 전과 후의 gradient의 분산이 동일해야 한다고 주장. (by 글로럿과 벤지오 논문)
  • 글로럿 초기화: 로지스틱 활성화 함수를 사용할 대 층의 입력과 출력 연결 개수 합의 평균을 이용하여 가중치를 무작위로 초기화하는 방법
  • 르쿤 초기화: SELU 함수에 사용되는 초기화 방법으로 층의 연력 연결 수 만큼 나누는 방법
  • keras는 기본적으로 균등분포의 글로벌 초기화 사용
    image

🔸 해결방안 2. 적절한 활성화 함수 선택 (수렴하지 않는 활성화 함수)

  • 활성화 함수를 잘못 선택하면 gradient의 소실이나 폭주로 이어질 수 있음.

imageimage

  • ReLU
    • 특정 양숫값에 수렴하지 않고 계산이 빠르다는 장점이 있음.
    • 학습하는 동안 일부 뉴런이 0 이외의 값을 출력하지 않는다는 의미에서 죽은 ReLU라고 알려진 문제도 있음.
    • 학습률이 크면 신경망의 뉴런 절반이 죽어있기도함.
    • 뉴런의 가중치가 바뀌어 학습 세트에 있는 모든 샘플에 대해 입력의 가중치 합이 음수가 되면 ReLU함수의 gradient가 0이 되므로 경사하강법은 작동하지 않음.
    • ReLU 함수의 변종인 LeakyReLU를 이용하여 해결할 수 있음.
  • LReLU (Leaky Relu)
    • Leaky Relu로 새는 정도(Leaky)를 설정해주는 함수로 z<0 일 때, 𝛼는 함수의 기울기를 이용하여 새는 정도를 설정.
    • 〖𝐿𝑒𝑎𝑘𝑦𝑅𝑒𝐿𝑈〗_𝑎 (𝑧)=max⁡(𝑎𝑧, 𝑧)
    • 보통 𝑎는 0.01로 설정하고 항상 ReLU보다 더 좋은 성능을 보임.
    • 0.2로 설정하는 것이 더 나은 성능을 나타내는 것으로 보임.
  • PReLU (Parameter Leaky Relu)
    • 하이퍼파라미터가 아닌 역전파에 의해 𝑎가 학습되어 값이 변경되며 데이터를 학습하는 방법.
    • 대규모 이미지 데이터셋에서는 ReLU보다 좋은 성능을 보이지만, 소규모 데이터셋에서는 과대적합 우려.
  • RReLU (Randomized Leaky Relu)
    • 𝑎를 정해진 범위 내에서 무작위로 선택하고 테스트 시에는 평균 값을 사용하는 함수
      과대적합의 위험을 줄이는 규제 역할

image

  • ELU (Expotential Linear Unit)
    • 모든 변종의 ReLU함수보다 더 좋은 성능을 보이지만 지수함수를 사용하므로 ReLU함수나 그 변종들보다 느리다는 단점이 있음.
  • SELU (Scaled ELU)
    • ELU함수의 변종으로 𝑎값이 1외 다른 값으로 스케일링 된 함수
    • 완전 연결층만 쌓아서 신경망을 만들고 모든 은닉층이 SELU함수를 사용한다면 네트워크가 자기 정규화됨.
      • 자기 정규화가 일어나기 위한 조건
        • 입력의 특성이 반드시 표준화(평균 0, 표준편차 1)가 되어야함.
        • 모든 은닉층의 가중치는 르쿤 정규분포 초기화로 초기화되어야함.
        • 네트워크는 일렬로 쌓은 층으로 구성되어야함.
        • 순환신경망이나 스킵 연결(와이드 &딥 네트워크에서 건너뛰어 연결된 층)과 같은 순차적이지 않은 구조에서 사용하면 자기 정규화 보장 못함.
          • SELU가 다른 활성화 함수보다 더 좋지 못한 성능이 나타날 수 있음.
    • 학습하는 동안 각 층의 출력이 평균 0과 표준편차 1을 유지하는 경향이 존재하여 gradient 소실과 폭주 문제를 막아 줌.
    • 특히, 아주 깊은 네트워크에서 다른 활성화 함수보다 뛰어난 성능을 보임.

✔ 활성화 함수 선택하는 법

  • *SELU > ELU > Leaky ReLU(변종들) > ReLU > than > sigmoid *
  • 네트워크가 자기 정규화되지 못하는 구조라면 SELU보다 ELU가 더 좋은 성능을 보일 수 있음.
    • SELU함수는 z = 0 에서 불연속적인 값을 가지기 때문.
  • 실행속도가 중요하면 Leaky ReLU.
  • 시간과 컴퓨팅 파워가 충분하다면 교차 검증을 사용해 여러 활성화 함수를 평가.
  • 신경망이 과대적합되었다면 RReLU, 학습 데이터셋이 매우 크다면 PReLU.

🔸 해결방안 3. 배치 정규화

활성화 함수와 함께 He 초기화를 사용하면 학습 초기 단계에서 gradient의 소실이나 폭주 문제를 크게 감소.

but, 훈련하는 동안 다시 발생할 수도 있기 때문에 배치 정규화 필요.

? 배치 정규화 ?

  • 각 층에서 활성화 함수를 통과하기 전이나 후에 모델에 단순하게 입력을 원점에 맞추고 정규화한 다음, 각 층에서 두 개의 새로운 파라미터로 결괏값의 스케일을 조정하고 이동시키는 연산을 추가
  • 신경망의 첫 번째 층에 배치 정규화를 추가하면 학습 데이터에 Standard Scaler와 같은 표준화 작업을 하지 않아도 됨.
  • 입력 데이터를 원점에 맞추고 정규화 하기 위해서는 알고리즘은 평균과 표준편차를 추정해야함.
    • 미니 배치에서 입력의 평균과 표준편차를 구해서 정규화.(이름이 배치 정규화인 이유)

### 즉, 학습하는 동안 입력을 정규화한 다음 스케일을 조정하고 이동시킴.###

? test에 배치 정규화가 어떻게 작동하는가?

  • 샘플의 배치가 아니라 샘플 하나에 대한 예측을 만들어야 하기 때문에 입력의 평균과 표준편차를 계산할 방법이 없음.
    • test 시에는 새로운 데이터에 대해 예측을 하는 것처럼 샘플이 하나씩 주입된다고 가정하기 때문.
  • 학습이 끝난 후 전체 학습 데이터셋을 신경망에 통과시켜 배치 정규화 층의 각 입력에 대한 평균과 표준편차를 계산하여 예측할 때 배치 입력 평균과 표준편차로 대신 사용.
  • 대부분 배치 정규화 구현은 층의 입력 평균과 표준편차의 이동 평균을 사용해 학습하는 동안 최종 통계를 추정.
    • Keras의 BatchNormalization 층이 자동으로 수행
      • 정규화 층마다 4개의 파라미터 벡터가 학습됨.
        • 출력 스케일 벡터, 출력 이동 벡터가 역전파를 통해 학습됨.
        • 최종 입력 평균 벡터, 최종 입력 표준편차 벡터가 지수 이동 평균을 사용하여 추정됨.
        • 최종 입력 평균 벡터와 최종 입력 표준편차 벡터는 학습이 끝난 후에도 test 시에 사용됨.

즉, 정리하면 학습할 대는 mini batch의 평균과 분산으로 정규화하고 TEST할 때는 계산해놓은 이동 평균으로 정규화.

image

추가적으로 정규화에 대한 내용을 더 알고 싶다면 이곳을 참고하면 좋을 것 같습니다.

✅ 배치 정규화는 gradient 소실 문제를 크게 감소시키기 때문에 tahn, sigmoid 함수와 같은 수렴성을 가진 활성화 함수 사용 가능

✅ 드롭아웃과 같은 규제역할을 하기 때문에 다른 규제 기법의 필요성을 줄여줌.

  • 배치 정규화는 미니배치마다 평균과 표준편차를 계산하기 때문에 일종의 잡음을 넣어 과대적합을 방지.
  • 미니배치의 크기가 클수록 효과가 줄어듦.
  • 규제의 효과가 비교적 크지 않기 때문에 규제를 위해서는 드롭아웃과 같이 사용하는 것이 좋음.

✅ 배치 정규화를 사용할 때 에포크마다 학습 속도는 오래 걸리지만 수렴이 훨씬 빨라지므로 더 적은 에포크로 동일한 성능에 도달 할 수 있음.

🚫 배치 정규화는 입력 데이터를 정규화하는 것보다 모델의 복잡도를 키우고 층마다 추가되는 계산이 신경망의 예측을 느리게 함.

  • 이전 층의 가중치를 바꾸어 바로 스케일이 조정되고 이동된 출력을 만드는 방법으로 이전 층과 배치 정규화 층을 합쳐 실행 속도 저하를 피할 수 있음.
  • 이전 층의 가중치와 편향을 업데이트된 가중치와 편향으로 바꾸어 배치 정규화층을 제거하여 사용.

✅ 배치 정규화 논문의 저자들은 활성화 함수 이전에 배치 정규화 층을 추가하는 것이 좋다고 함.

  • 하지만 두 가지 방법 모두 실험해보고 어떤 것이 주어진 데이터셋에 가장 잘 맞는지 확인하는 것이 좋음.

🔸 해결방안 4. gradient clipping

  • gradient 폭주 문제를 완화할 때 사용하는 방법으로 일정 임곗값을 넘어서지 못하게 gradient를 잘라내는 방법
  • 순환 신경망은 배치 정규화를 적용하기 어렵기 때문에 gradient clipping을 사용하여 완화시킴.

 

참고

[1] (도서) 핸즈온 머신러닝

[2] ML&AI

[3] 갈아먹는 딥러닝 기초 [1] Activation Function(활성화 함수)

[4] Batch Normalization 설명 및 구현

728x90