ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [DL for VS #7] 신경망 하이퍼파라미터 튜닝
    Machine Learning/Deep Learning for Vision Systems 2023. 4. 13. 23:02

    4.5.1 데이터 추가 수집 또는 하이퍼파라미터 튜닝

    • 훈련 데이터에 대한 기존 성능이 납득할만한 수준인지 확인한다.
    • 훈련 데이터 정확도(train_acc)와 검증 데이터 정확도(val_acc) 이렇게 두 가지 지표를 시각화해서 관찰한다.
    • 훈련 데이터에 대한 성능이 낮다면 과소적합의 가능성이 있다. 과소적합은 기존 데이터도 충분히 활용하지 못하는 상황이므로 데이터를 추가 수집할 필요가 없다. 하이퍼파라미터를 조정하거나 기존 훈련 데이터를 클린징(정화)해야 한다.
    • 훈련 데이터에 대한 성능은 괜찮은데 테스트 데이터에 대한 성능이 떨어진다면 일반화 성능이 떨어지는 과적합의 가능성이 있다. 데이터 추가 수집이 유효한 경우다.
    데이터 레이블링이 수동작업으로 이루어짐.이미지 한 장 한 장 사람이 직접 보고 레이블링 한다는 뜻(이를 휴먼 인 더 루프 human in the loop, HTL라고 한다.) 의료 이미지에 경우 분류 인력이 비싸다 

     

    4.5.2 파라미터와 하이퍼파라미터

    파라미터 : 가중치와 편향을 통틀어 이르는 말로, 역전파 계산을 통해 오차가 최소가 되는 값으로 최적화됨.(우리가 직접 값을 수정하지 않음)

    하이퍼파라미터 : 학습 전에 머신러닝 엔지니어가 값을 정하고 이후 학습 결과를 보며 조정하는 값.

     

    4.5.3 하이퍼파라미터  종류

    1.신경망 구조

    • 은닉층 수(신경망의 깊이)
    • 각 층의 뉴런 수(층의 폭)
    • 활성화 함수의 종류

    2.학습 및 최적화

    • 학습률과 학습률 감쇠유형
    • 미니배치 크기
    • 최적화 알고리즘의 종류
    • 에포크 수(조기 종료 적용 여부 포함)

    3.규제화 및 과적합 방지 기법

    • L2 규제화
    • 드롭아웃층
    • 데이터 강화

     

    4.5.4 하이퍼파라미터 1 - 신경망 구조

    • 신경망의 깊이와 폭

    신경망 설계시 신경망의 층수(깊이)와 각 층의 유닛수(폭)를 정해야 한다.

    일반적으로 검증 데이터의 오차가 더 이상 개선되지 않을 때까지 은닉층의 뉴런을 계속 추가해도 된다.

    -> 학습에 필요한 계산 비용 증가, 신경망의 유닛 수가 너무 적으면 과소적합이 발생하기 쉬움.

    -> 적절히 규제화(드롭아웃 등)를 적용한다면 뉴런을 추가해도 성능 저하는 발생하지 않는다.

     

    텐서플로 샌드박스에서 은닉층 및 은닉층의 유닛 수를 바꿔가며 신경망의 학습 과정 및 성능을 관찰해볼 수 있다.

    http://playground.tensorflow.org/

     

    Tensorflow — Neural Network Playground

    Tinker with a real neural network right here in your browser.

    playground.tensorflow.org

     

    • 활성화 함수의 종류

    비선형성을 도입하는 수단. ReLU, Leaky ReLU 등 분류문제를 위한 신경망의 출력층에는 분류 대상 클래스와 같은 수의 뉴런을 배치하고 소프트맥스 함수를 사용한다.

     

    *은닉층 수와 유닛 수를 결정할 때 신경망의 파라미터 수와 그에 따른 계산 복잡도를 함께 고려하면 도움이 된다.

     

    4.6 하이퍼파라미터 2 - 학습 및 최적화

    4.6.3 학습률 감쇠와 적응형 학습

    *학습률 감쇠(learning rate decay) : 고정된 학습률을 사용하지 않고 학습률이 일정 에포크마다 줄어듦

    • 계단형 감쇠(step decay) : 일정 비율로 학습률을 감소. e.g. 학습률을 5에포크마다  절반으로 감소
    • 지수 감쇠(exponential decay) : e.g. 8에포크마다 학습률에 0.1을 곱한다.

    *적응형 학습(adaptive learning 또는 적응형 학습률 adaptive learning rate) : 적응형 학습은 학습의 진행이 멈추는 시점에 학습률을 경험적으로 설정된 값만큼 자동으로 수정하는 방식. 

     

    4.6.4. 미니배치 크기

    배치 경사 하강법(Batch Gradient Descent, BGD) : 데이터셋 전체를 한 번에 신경망에 입력해서 순방향 계산, 오차 계산, 경사 계산을 거쳐 오차를 역전파시켜 가중치를 수정. 최적화 알고리즘이 전체 훈련 데이터를 대상으로 오차를 계산하므로 가중치 수정은 한 에포크에 한 번만 일어난다.

     

    확률적 경사 하강법(Stochastic Gradient Descent, SGD 또는 온라인 학습 Online Learning) : 훈련 데이터를 한 번에 하나씩 신경망에 입력해서 순방향 계산, 오차 계산, 경사 계산을 거쳐 오차를 역전파시켜 가중치를 수정한다. 

     

    BGD는 미니배치가 1개인 경우이고, SGD는 미니배치가 n(훈련 데이터셋 개수)개인 경우이다. 두 경우의 중간이 미니배치 경사 하강법(mini-batch gradient descent, MB-GD)이다.

     

     

    4.7 최적화 알고리즘

    4.7.1 모멘텀을 적용한 경사 하강법

    *모멘텀(momentum)

    • 확률적 경사 하강법에서 가중치 이동 방향의 진동을 감소시키기 위해 고안됨. 진동의 세로 방향으로는 학습을 느리게 하고, 가로 방향으로는 빠르게 진행한다.
    • 고전 물리학의 모멘텀과 비슷. 모멘텀 기법은 경사가 기존 이동 방향과 같으면 이동 폭을 증가시키고, 기존 이동 방향과 다른 방향의 경사에는 이동 폭을 감소시킨다.

     

    * 모멘텀의 수학적 원리
    모멘텀은 가중치를 수정하는 등식에 속도를 의미하는 항을 추가한 식을 따른다.

    위는 기존 가중치 수정식. 아래가 모멘텀식으로 속도항이 추가된 가중치 수정식이다.

     

    w_new = w_old - 학습률 X 경사 + 속도 

    속도항은 이전에 계산했던 경사의 가중 평균이다.

     

     

    4.7.2 Adam

    적응형 모멘트 예측(adaptive moment estimation). 모멘텀과 비슷하게 경사의 평균을 속도항으로 사용하지만 속도항이 지수적으로 감쇠된다는 차이가 있다. Adam은 무거운 공이 마찰력(friction)을 가진 바닥을 굴러 내려가며 모멘텀이 감소하는 것에 비유할 수 있다. Adam은 다른 최적화 알고리즘보다 학습 시간이 빠르다는 장점이 있다.

    keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, deca=0.0)
    Adam 작성자가 제안한 기본값
    - 학습률은 따로 조정이 필요하다
    - 모멘텀항 beta1은 0.9를 많이 사용한다.
    - RMSprop항 beta2는 0.999를 많이 사용한다.
    - epsilon은 10^(-8)으로 설정한다.

     

    4.7.3 에포크 수와 조기 종료 조건

    - 에포크(epoch)는 학습 진행 중 전체 훈련 데이터가 한번 모델에 노출된 횟수를 의미한다. 따라서 에포크 수는 신경망의 반복 학습 횟수가 된다. 훈련 오차와 검증 오차가 함께 개선되다가 검증 오차가 증가하면서 과적합의 징후가 나타나는데 그전에 학습을 종료할 방법이 필요하다. 이런 기법을 조기 종료(early stopping)라고 한다.(train_error는 감소하는데 val_error가 증가하기 시작했다면 과적합이 발생했따는 징후)

     

    4.7.4 조기 종료

    케라스 제공 조기 종료 함수

    EarlyStopping(monitor='val_loss', min_delta=0, patience=20)

    EarlyStopping 함수의 인수는 다음과 같다.

    • monitor: 학습 중 주시할 지표를 설정한다. 대개는 학습 중 모델의 성능을 나타내는 지표인 val_loss를 관찰한다. 검증 데이터에 대한 성능이 좋다면 대체로 테스트 데이터나 실제 데이터에도 비슷한 성능이 나온다.
    • min_delta: 주시 중인 지표가 개선 중인지에 대한 기준이 되는 상승폭을 지정한다. 이 변수에는 표준값이 없 다. min_delta 값을 정하려면 몇 에포크 동안 학습을 지켜보며 오차와 검증 데이터에 대한 정확도를 관찰한 다음 그 변화율을 기준으로 min_delta를 결정한다. 대부분의 경우 기본값 0도 잘 동작한다.
    • patience: 과적합이 발생했다고 판단하는 기준으로, 연속으로 주시 중인 지표가 개선되지 않는 에포크 수를 의미한다. 예를 들어 patience를 1로 설정했다면 지표가 개선되지 않았던 첫 번째 에포크에서 학습이 중단 된다. 하지만 patience는 약간 여유를 두는 편이 좋다. 손실값이 잠시 정체되거나 진동하다가 다시 개선되는 경우도 많기 때문이다. 10에포크 이상 지표에 개선이 없다면 학습을 중단해도 된다.

     

    4.8 과적합을 방지하기 위한 규제화 기법

    •  L2 규제화
    •  드롭아웃
    •  데이터 강화

     

    4.8.1 L2 규제화

    • 오차 함수에 규제화항(regulatization term)을 추가하는 것이다. 이에 따라 은닉칭 유닛의 가중치가 0에 가까워지고 모델의 표현력을 감소시키는 데 도움이 된다. 

     

    람다(lambda) = 규제화 파라미터

    m = 인스턴스 수

    w는 가중치

    • 가중치 수정시 아래 편미분값을 빼는데, 오차함수의 함숫값이 기존보다 커졌으므로 편미분값도 커지고 따라서 W_new는 규제항이 없을 때보다 작아진다.

    • L2 규제화는 가중치를 0을 향해 감소(0이 되지는 않는다)시키기 때문에 가중치 감쇠(weight decay)라고 하기도 한다.

     

    * 케라스에서 L2 규제화를 적용하기

    model.add(Dense(units=16, kernel_regularizer=regularizers.12(lamda), activation='relu'))
    # 신경망에 추가하는 은닉층에 kernel_regularizer 인수로 L2 규제화를 지정한다.

    lambda 값은 하이퍼파라미터로 직접 조정해야 하지만 대개의 경우 라이브러리의 기본값으로도 잘 작동한다. L2 규제화를 적용해도 과적합이 해소되지 않는다면 lambda 값을 증가시켜 모델의 복잡도를 더욱 낮춘다.

     

    4.8.2 드롭아웃층

    • 반복마다 전체 뉴런 중 미리 정해진 비율 p만큼의 뉴런을 해당 반복 회차 동안 비활성화(드롭아웃)하는 것.
    • p(드롭아웃 비율,dropout rate)는 0.3~0.5 로 설정한다.

    * L2 규제화와 드롭아웃층의 차이

    L2 규제화는 가중치를 통해 뉴런의 영향력을 억제하는 것이고, 드롭아웃은 특정 뉴런의 영향력을 완전히 비활성화하는 것.

     

    4.8.3 데이터 강화

    • 과적합을 방지하는 방법 중 하나는 학습 데이터를 추가하는 것인데, 기존 데이터에 약간의 변형을 가해 새로운 데이터를 만들어 추가하는 것이 데이터 강화이다.
    • 이미지 반전, 회전, 배율 조정, 밝기 조절 등 다양한 변환 방법을 데이터 강화에 사용할 수 있다.
    • 데이터 강화는 모델이 특징 학습 중 대상의 원래 모습에 대한 의존도를 낮춰준다는 의미에서 일종의 규제화 기법으로 취급되기도 한다.

     

    * 케라스를 사용하여 이미지 강화를 구현하기

    from keras.preprocessing.image import ImageDataGenerator	# 케라스의 ImageDataGenerator 클래스를 임포트한다.
    
    #새로운 이미지를 생성한다. ImageDataGenerator클래스는 이미지 변환 방식을 인수로 받는다.
    #여기서는 가로 반전과 세로 반전을 사용했다. 그 외의 변환 방식은 케라스 문서 참고.
    datagen = ImageDataGenerator(horizontal flip = True, vertical_flip = True)
    
    datagen.fit(training_set)	#훈련 데이터로부터 새로운 데이터를 생성하는 데이터 강화 실행

     

     

     

    댓글

Designed by Tistory.