ch.6 학습 관련 기술들 (2)

pasongtak·2024년 5월 16일

딥러닝

목록 보기
8/11

배치 정규화

배치 정규화 알고리즘

각 층에서 활성화값이 적당히 분포되도록 조정하는 방법이 배치 정규화이다.

  • 배치 정규화의 이점

    • 학습 속도 개선
    • 초깃값에 크게 의존하지 않는다
    • 오버피팅을 억제한다
  • 배치 정규화를 사용한 신경망

  • 배치 정규화는 학습 시 미니배치를 단위로 정규화한다. 데이터 분포가 평균이 0, 분산이 1이 되도록 정규화한다.

    이 처리를 활성화 함수의 앞, 뒤에 삽임함으로써 데이터 분포가 덜 치우치게 할 수 있다.

  • 배치 정규화 계층마다 이 정규화된 데이터에 고유한 확대와 이동 변환을 수행한다.

    γ\gamma가 확대, β\beta가 이동을 담당한다. γ=1\gamma=1, β=0\beta=0부터 시작하고, 학습하면서 적합한 값으로 조정해간다.

배치 정규화의 효과

배치 정규화를 사용할 때 대체적으로 학습 진도가 빠르다.

바른 학습을 위해

오버피팅

오버피팅이란 신경망이 훈련 데이터에만 지나치게 적응 되어 그 외의 데이터에는 제대로 대응하지 못하는 상태이다.

  • 오버피팅이 일어나는 경우
  • 매개변수가 많고 표현력이 높은 모델
  • 훈련 데이터가 적음

가중치 감소

가중치 감소는 학습 과정에서 큰 가중치에 대해서는 그에 상응하는 큰 페널티를 부과하여 오버피팅을 억제하는 방법이다.

  • 손실 함수에 가중치의 제곱 노름(L2 노름)을 더하면 가중치가 커지는 것을 억제할 수 있다.
  • 가중치 감소는 모든 가중치 각각의 손실 함수에 1/2λ1/2\lambdaW2W^2를 더한다.
  • 가중치의 기울기를 구하는 계산에서는 그동안의 오차역전파법에 따른 결과에 정규화 항을 미분한 λ\lambdaW를 더한다.
  • λ\lambda는 정규화의 세기를 조절하는 하이퍼파라미터이다.
  • 가중치 감소를 이용한 훈련데이터와 시험 데이터에 대한 정확도 추이

드롭아웃

드롭아웃은 뉴런을 임의로 삭제하면서 학습하는 방법이다.

  • 훈련 때는 은닉층의 뉴런을 무작위로 골라 삭제하고, 시험 때는 모든 뉴런에 신호를 전달한다. 단, 시험 때는 각 뉴런의 출력에 훈련 때 삭제 안 한 비율을 곱하여 출력한다.
  • 드롭아웃 구현하기
class Dropout:
	def __init__(self, dropout_ratio=0.5):
    	self.dropout_ratio = dropout_ratio
        self.mask = None
    def forward(self, x, train_flg=True):
    	if train_flg:
        	self.mask = np.random.rand(*x.shape) > self.dropout_ratio
            return x * self.mask
        else:
        	return x * (1.0 - self.dropout_ratio)
            
    def backward(self, dout):
    	return dout * self.mask

순전파 때 신호를 통과시키는 뉴런은 역전파 때도 신호를 그대로 통과시키고, 순전파 때 통과시키지 않은 뉴런은 역전파 때도 신호를 차단한다.

  • 앙상블 학습은 개별적으로 학습시킨 여러 모델의 출력을 평균 내어 추론하는 방식이다. 드롭아웃은 추론 때 뉴런의 출력에 삭제한 비율을 곱하는 것이 앙상블 학습에서 여러 모델의 평균을 내는 것과 같은 효과를 얻을 수 있다.

적절한 하이퍼파라미터 값 찾기

검증 데이터

  • 시험 데이터를 사용하여 하이퍼파라미터를 조정하면 하이퍼파라미터 값이 시험 데이터에 오버피팅 된다.
  • 하이퍼파라미터의 적절성을 평가하는 데이터를 검증 데이터라고 부른다.
    • 훈련데이터: 매개변수 학습
    • 검증 데이터: 하이퍼파라미터 성능 평가
    • 시험 데이터: 신경망의 범용 성능 평가
  • MNIST 데이터셋에서 검증 데이터를 얻음
(x_train, t_train), (x_test, t_test) = load_mnist()

x_train, t_train = shuffle_dataset(x_train, t_train)
validation_rate = 0.20
validation_num = int(x_train.shape[0] * validation_rate)

x_val = x_train[:validation_num]
t_val = t_train[:validation_num]
x_train = x_train[validation_num:]
t_train = t_train[validation_num:]

shuffle_dataset 함수는 np.random.shuffle을 이용해 훈련 데이터를 분리하기 전에 입력 데이터와 정답 레이블을 뒤섞는다.

하이퍼파라미터 최적화

  • 하이퍼파라미터를 최적화할 때의 핵심은 하이퍼파라미터의 최적 값이 존재하는 범위를 조금씩 줄여간다는 것이다.
    1. 하이퍼파라미터 값의 범위 설정한다.
    2. 설정된 범위에서 하이퍼파라미터의 값을 무작위로 추출한다.
    3. 1단계에서 샘플링한 하이퍼파라미터 값을 사용하여 학습하고, 검증 데이터로 정확도를 평가한다.(에폭은 작게 설정)
    4. 1단계와 2단계를 특정 횟수 반복하며, 그 정확도의 결과를 보고 하이퍼파라미터의 범위를 좁힌다.
    5. 이 과정을 반복하여 하이퍼파라미터의 범위를 좁히고, 그 압축한 범위에서 값을 하나 골라낸다.

하이퍼파라미터 최적화 구현하기

  • 하이퍼파라미터의 무작위 추출 코드
    weight_decay = 10 ** np.random.uniform(-8, -4)
    lr = 10 ** np.random.uniform(-6, -2)
  • 가중치 감소 계수의 범위: 108 10410^{-8}~10^{-4}, 학습률의 범위: 106 10210^{-6}~10^{-2}

    학습이 잘 진행될 때의 학습률: 0.001~0.01, 가중치 감소 계수: 108 10610^{-8}~10^{-6}

0개의 댓글