심층신경망 훈련하기

sujineeda·2021년 3월 29일
0

🤯AI

목록 보기
5/7

심층 신경망 훈련시 나타나는 문제점 : 그레디언트 소실과 폭주

  • 그레디언트란 : 각 출력이 오차에 기여하는 정도
  • 경사하강법 : 가중치를 조정하여 그레디언트 감소를 통해 오차 감소

그레디언트 소실 및 폭주

역전파 알고리즘은 출력층에서 입력층으로 오차 그레디언트를 전파하면서 진행하는데 이때 하위층으로 진행될수록 좋은 솔루션으로 수렴되기 전에 그레디언트가 점점 작아지거나 커져 소실 혹은 발산하는 경우가 있다.

그레디언트를 완화하는 방법

  • 각 층의 출력에 대한 분산이 입력에 대한 분산과 같아야 한다
  • 역방향에서 층을 통과하기 전과 후의 그레디언트 분산이 동일해야 한다.

1) 가중치 초기화

fanin = 층의 입력 개수
fanout = 출력 연결 개수
fanavg = (fanin + fanout) / 2

  • 글로럿 초기화
    • 각 층의 연결 가중치를 다음과 같은 방식대로 무작위로 초기화
    • 평균이 0, 분산이 1/fanavg인 정규분포
keras.layers.Dense(10, activation = 'relu', kernel_initializer = 'he_normal')
  • 르쿤 초기화
    • 평균이 0, 분산이 1/fanin인 정규분포
kernel_initializer = 'lecun_normal'

2) 활성화 함수

  • Relu
    • 특정 양수값에 수렴하지 않는다는 장점이 있으나 일부 뉴런이 0이외의 값을 출력하지 않아 큰 학습률 사용할 경우, 죽은 relu 발생할 수 있음
    • 뉴런의 가중치가 바뀌어 훈련 세트에 있는 모든 샘플에 대해 입력의 가중치 합이 음수가 되면 뉴런이 죽게 되어 경사 하강법이 더이상 작동하지 않음
  • Leaky relu
    • dying relu 문제 해결
    • max(az, z) 로 정의되며 a가 이 함수의 leaky 정도를 결정
      이는 z<0일 때의 함수의 기울기며 뉴런이 혼수 상태에 있지만 다시 깨어날 가능성을 주는 것
    • 일반적으로 0.2(많이 통과) ~ 0.01 (조금 통과) 로 설정
    • RRelu : 주어진 범위에서 a를 무작위로 선택하고 테스트시에는 평균 사용
    • PRelu : a가 훈련하는 동안 학습되는 파라미터로 작용 (역전파에 의해 변경됨)
  • Elu
    • a(ez - 1) (z<0)
      z (z>=0)
    • z<0 일 때는 그레디언트 소실 문제 완화해주면서 0이 아니므로 죽은 뉴런 만들지 않음
    • a=1이면 z=0에서 급격히 변동하지 않아 모든 구간에서 매끄러워 경사 하강법의 속도 높여줌
    • 단점 : 계산이 느림
  • Selu
    • 스케일이 조정된 elu 함수
    • 각 층의 출력이 평균 0, 표준편차 1을 유지하는 경향을 갖는 자기 정규화
      이는 그레디언트 소실과 폭주 문제를 막아줌
    • 조건: 입력 특성이 반드시 표준화, 가중치 초기화 = 르쿤 초기화, 네트워크는 일렬로 쌓은 층으로 구성되어야 함 (완전연결층)

3) 배치정규화 (그레디언트 소실 문제 해결)

  • 그레디언트 소실과 폭주 문제 해결
    • 그레디언트 소실 문제가 크게 감소하여 수렴성 가진 활성화 함수 사용 가능
    • 가중치 초기화에 덜 민감해짐
    • 훨씬 큰 학습률 사용가능
    • 규제 역할을 하여 규제 기법 (e.g. dropout) 필요성 줄임
  • 입력을 (한번에 하나의 배치) 원점에 맞추고 정규화한 다음, 각 층에서 두개의 새로운 파라미터로 결괏값의 스케일 조정하고 이동시킨다.
  • 신경망의 첫번째 층으로 배치 정규화를 추가하면 훈련세트를 표준화할 필요 없음
  • 배치 정규화 층마다 네개의 파라미터 벡터 학습됨
    • 출력스케일 벡터, 출력 이동 벡터 : 역전파에 의해 학습됨
    • 최종 입력 평균 벡터, 최종 입력 표준편차벡터 :훈련이 끝난 후 사용됨
    • 모델의 복잡도 키움 --> 실행시간 손해 but 수렴이 훨씬 빨라져 적은 에포크로도 동일한 성능 도달 가능
  • 배치정규화 층은 활성화 함수 전/후 추가
    • 활성화 함수 전에 배치 정규화 층 추가시, 은닉층에서 활성화 함수 지정 말고 배치 정규화 층 뒤에 별도의 층 추가
      model = keras.models.Sequential([
      	keras.layers.Flaten(input_shape),
          keras.layers.BatchNormalization(),
          keras.layers.Dense(),
          keras.layers.BatchNormalization(),
          keras. layers.Activation(),
          keras.layers.Dense(),
          ..

4) 그래디언트 클리핑 (그레디언트 폭주 문제 해결)

  • 역전파될 때, 일정 임계값을 넘어가지 못하게 그레디언트 clipping
    • 옵티마이저를 만들 때, clipvalue, clipnorm 매개변수 지정
      optimizer = keras.optimizers.SGD(clipvalue = 1.0)
      model.compile(optimizer=optimizer)
    • clipvalue= 1.0 --> [0.9,100] => [0.9, 1.0]
      • 두축 사이 방향 바꿈
    • clipnorm= 1.0 --> [0.9,100] => [0.0089, 0.99]
      • 방향은 바꾸지 않음
profile
AD+AI Ph.D course

0개의 댓글