페이지

2022년 7월 30일 토요일

4.5.5 기본보다 나은 모델 훈련하기

 이 단계의 목표는 통계적 검정력(statistial power)을 달성하는 것입니다. 즉 아주 단순한 모델보다 나은 수준의 작은 모델을 개발합니다. MNIST숫자 이미지 분류 예에서는 0.1보다 높은 정확도를 내는 모델이 통계적 검정력을 가졌다고 말할 수 있습니다. IMDB예에서는 0.5보다 높은 정확도를 갖는 것입니다. 

통계적 검정력을 달성하는 것이 항상 가능하지는 않습니다. 여러 개의 타당성 있는 네트워크 구조를 시도해 보고 무작위로 예측하는 모델보다 낫지 않다면 입력 데이터에 존재하지 않는 것을 얻으려고 한다는 신호일 것입니다. 2개의 가설이 있다는 것을 기억하세요.

1) 주어진 입력으로 출력을 예측할 수 있다고 가설을 세웁니다.

2) 가용한 데이터에 입력과 출력 사이의 관계를 학습하는 데 충분한 정보가 있다고 가설을 세웁니다.

이가설이 잘못된 것일 수 있습니다. 이때는 기획부터 다시 해야 합니다.

일이 잘 진행되다고 가정하면 첫 번째 모델을 만들기 위해 세가지 중요한 선택을 해야 합니다.

1) 마지막 층의 활성화 함수: 네트워크의 출력에 필요한 제한을 가합니다. 예를 들어 IMDB분류 예는 마지막 츠에 시그모이드 함수를 사용합니다. 회귀 예에서는 마지막 층에 활성화 함수를 사용하지 않습니다.

2) 손실 함수: 툴려고 하는 문제의 종류에 적합해야 합니다. 예를 들어 IMDB 예제는 binary_crossentrop를 사용하고, 회귀 예제는 mse를 사용하는 식입니다.

3) 최적화 설정: 어떤 옵티마이저를 사용하나요? 학습률은 얼마인가요? 대부분의 경우 rmsprop과 기본 학습률을 사용하는 것이 무난합니다.

손실 함수의 선택에 대ㅑ해서 언급할 것은 주어진 문제의 성고 지표를 직접 최적화하는 것이 항상 가능하지 않다는 점입니다. 때로는 이 지표를 손실 함수로 바꿀 수 있는 방법이 없습니다. 무엇보다도 손실 함수는 주어진 미니 배치 데이터에서 계산 가능해야 하고(이상적으로 손실 함수는 하나의 데이터 포인트에서 계산 가능해야 합니다), 미분 가능해야 합니다(그렇지 않으면 역전파 알고리즘을 사용하여 네트워크를 훈련 시킬수 없습니다). 예를 들어 널리 사용되는 분류 지표인 ROC AUC는 직접 최적화 될 수 없습니다. 그래서 분류 작업에는 크로스엔트로피처럼 ROC AUC를 대신할 지표를 최적홧하는 것이 보통입니다. 일반적으로 크로스엔트로피가 낮을수록 ROC AUC가 높다고 기대할 수 있습니다.

표 4-1 에 자주 등장하는 문제 유형에 따라 선택할 수 있는 마지막 츠의 활성화 함수와 손실 함수를 정리했습니다.

문제유형    마지막 층의 활성화 함수    손실함수

이진 분류    시그로이드    binary_crossentropy

단일 레이블 다중 분류    소프트맥스    categorical__crossentropy

다중 레이블 다중 분류    시그모이드     binary_crossentropy

임의 값에 대한 회귀    없음        mse

0과 1사이 값에 대한 회귀    시그모이드    mse또는 binary_crossentropy

4.5.4 데이터 준비

 무엇을 훈련할지와 무엇을 최적화할지, 그리고 어떻게 평가할지를 정했다면 거의 모델을 훈련시킬 준비가 되었습니다. 하지만 먼저 머신 러닝 모델에 주입할 데이터를 구성해야 합니다. 여기에서는 이 머신 러닝 모델을 심층 신경망이라고 가정합니다.

1) 앞서 보았듯이 텐서로 구성됩니다.

2) 이 텐서에 있는 값은 일반적으로 작은 값으로 스케일 조정되어 있습니다. 예를 들어 [-1,1]이나 [0,1] 범위입니다.

3) 특성마다 범위가 다르면(여러 종류의 값으로 이루어진 데이터라면) 정규화 해야 합니다.

4) 특성 공학을 수행할 수 있습니다. 특히 데이터가 적을 때입니다.

입력 데이터와 타깃 데이터의 텐서가 준비되면 모델을 훈련시킬 수 있습니다.

4.5.3 평가 방법 선택

 목표를 ㅅ정했다면 현재의 진척 상황을 평가할 방법을 정해야 합니다. 앞서 잘 알려진 세 가지의 평가 방식을 소개했습니다.

1) 홀드아웃 검증 세트 분리: 데이터가 풍부할 때 사용합니다.

2) K-겹 교차 검증: 홀드아웃 검증을 사용하기에 샘플의 수가 너무 적을 때 사용합니다.

3) 반복 K-겹 교차 검증: 데이터가 적고 매우 정확한 모델 평가가 필요할 때 사용합니다.

이 중에 하나를 선택하면 됩니다. 대부분의 경우 첫 번째로 충분할 것입니다.

4.5.2 성공 지표 선택

 어떤 것을 제어하려면 관측할 수 있어야 합니다. 성공하기 위해서는 성공은 무엇인가를 정의해야 합니다. 정확도일까요? 정밀도나 재현유일까요? 고객 재방문율일까요? 성공의 지표가 모델의 최적화활 손실 함수를 선택하는 기준이 됩니다. 비즈니스 성고처럼 고수준의 목표와 직접적으로 연결되어 있어야 합니다.

클래스 분포가 균일한 분류 문제에서는 정확도와 ROC AUC 가 일반적이 지표입니다. 클래스 분포가 균일하지 않은 문제에서는 정밀도와 재현율을 사용할 수 있습니다. 랭킹 문제나 다중 레이블 문제에는 평균 정밀도를 사용할 수 있습니다. 성공을 측정하기 위해 자신만의 지표를 정의하는 일은 일반적이지 않습니다. 머신 러닝의 다양한 성공 지표가 여러 가지 종류의 문제에 어떻게 관련되어 있는지 알고 싶다면 캐글(https://kaggle.com)의 데이터 과학 경연 대회를 살펴보는 것이 도움이 됩니다. 캐글에서 굉장이 다양한 문제들과 측정 지표들을 볼 수 있습니다.

4.5.1 문제 정의 와 데이터셋 수집

 먼저 주어진 문제를 정의 해야 합니다.

1) 입력 데이터는 무엇인가요? 어떤 것을 예측하려고 하나요? 가용한 휸련 데이터가 있어야 어떤 것을 예측하도록 학습할 수 있습니다. 예를 들어 영화 리뷰와 감성 레이블이 태깅되어 있어야 영화 리뷰의 감성 분류를 학습할 수 있습니다. 이런 식으로 보통 가용데이터의 유무는 이 단계에서 제한 요소가 됩니다(데이터를 수집할 비용이 없다면).

2) 당면한 문제가 어떤 종류인가요? 이진 분류인가요? 다중 분류인가요? 스칼라 회귀인가요? 베터 회귀인가요? 다중 레이블 다중 분류인가요? 아니면 군집, 생성 또는 강화 학습 같은 다른 문제 인가요? 문제의 유형을 식별하면 모델의 구조와 손실 함수등을 선택하는 데 도움이 됩니다.


입력과 출력이 무엇인지와 어떤 데이터를 사용할 것인지 알기 전까지는 다음 단계로 넘어갈 수 없습니다. 이 단계에서 가설을 세워야 합니다.

3) 주어진 입력으로 출력을 예측할 수 있다고 가설을 세웁니다.

4) 가용한 데이터에 입력과 출력 사이의 관계를 학습하는 데 충분한 정보가 있다고 4가설을 세웁니다.

모델이 작동하기 전까지 이는 가설에 불과합니다. 검증될지 아닐지 기다려 보아야 합니다. 모든 문제가 해결되지는 않습니다. 입력 X와 타깃 Y의 샘플을 수집했다고 X에 Y를 예측하기에 충분한 정보가 있는것은 아닙니다. 예를 들어 주식 시장의 최근 가격 변공 정보를 가지고 주가를 예측한다면 실패할 가능성이 높ㅊ습니다. 과거 가격 정보에는 예측에 활용할 정보가 많지 않기 때문입니다.

풀기 어려운 종류의 문제는 시간에 따라 변하는 문제(nonstationary problem)입니다. 옷을 위한 추천 엔진을 구축한다고 가정합시다. 한 달치(8월)의 데이터로 훈련하고 겨율에 이 추천 엔진을 사용하려고 합니다. 여기서 문제는 사람들이 계정에 따라 구매하려는 옷의 종류가 바뀐다는 것입니다. 의류 구매는 몇 달에 걸쳐 보면 시간에 따라 바뀌어 유동적입니다. 시간에 따라 모델을 바꾸기 위해 어떻게 해야 할까요? 이런 경우에 최근의 데이터로 주기적으로 모델을 다시 훈련하거나 시간 분포에 맞게 데이터를 수집하여 시간에 따라 변하지 않는 무넺로 바꿉니다. 의류 구매처럼 순환성이 있는 문제는 몇 년치의 데이터를 모으면 결정릐 변활르 감지하는 데 충분할 것입니다. 1년 중 언제인지 기록한 시간도 메델에 입력해야 한다는 것을 잊지 마세요!

머신 러닝은 훈련 데이터에 있는 패턴을 기억하기 위해서만 사용한다는 것을 유념하세요. 이미 보았던 것만 인식할 수 있습니다. 미래를 예ㅖ측하기 위해 과거 데이터에서 훈련한 머신러닝을 사용하는 것은 미래가 과거처럼 움직인다고 가정한 것입니다. 사실 대부분 그렇지는 않습니다.


4.5 보편적인 머신 러닝 작업 흐름

 이 절에서 머신 러닝 문제를 해결하기 위해 사용할 수 있는 보편적인 청사진을 제시하겠습니다. 이 청사진은 이장에서 배운 문제 정의, 평가, 특성 공학, 과대적합의 개념과 연결되어 있습니다.

4.4.3 드롭아웃 추가

 드럽아웃(dropout)은 토론토 대한의 제프리 힌튼과 그의 학생들이 개발했습니다. 신경망을 위해 사용되는 규제 기법 중에 가장 효과적이고 널리 사용되는 방법 중 하나입니다. 네트워크 층에 드롭아웃을 적용하면 훈련하는 동안 무작위로 층의 일부 출력 특성을 제외시킵니다(0으로 만든빈다). 한 층이 정상적으로 훈련하는 동안에는 어떤 입력 샘플에 대해 [0.2, 0.5, 1.3, 0.8, 1.1] 백터를 출력한다고 가정합시다. 드롭아웃을 적용하면 이 벡터의 일부가 무작위로 0으로 바뀝니다. 예를 들어 [0, 0.5, 1.3, 0, 1.1]이 됩니다. 드롭아웃 비율은 0이 될 특성의 비율입니다. 봍농 0.2에서 0.5 사이로 지정됩니다. 테스트 단계에선느 어떤 유닛도 드롭아웃되지 않습니다. 그 대신에 층의 출력을 드롭아웃 비율에 비례하여 줄여 줍니다. 훈련할 때보다 더 많은 유닛이 활성화되기 때문입니다.

크기가 (batch_size, features)인 한 층의 출력을 담고 있는 넘파이 행렬을 생각해 보겠습니다. 훈련할 때는 이 행렬 값의 일부가 랜덤하게 0이 됩니다.

layer_output *=  np.ramdom.randint(0, high=2, size=layer_output.shape)..훈련할 때 유닛의 출력중

                                                                                         50%를 버립니다.

테스트 할 때는 드롭아웃 비율로 출력을 낮추어 주어야 합니다. 여기에서는 0.5배만큼 스케일을 조정했습니다(앞에서 절반의 유닛을 드롭아웃했으므로).

layer_output *= 0.5 ....테스트 단계

훈련 단계에 이 두 연산을 포함시켜 테스트 단계에는 출력을 그대로 두도록 구현할 수 있습니다. 실제로 종종 이런 방식으로 구현합니다(그림 4-8 참고).

layer_output *= np.random.randint(0, high=2, size=layer_output.shape) ..훈련단계

layer_output /= 0.5 .........여기에서 스케일을 낮추는 대신 높입니다.

이 기업이 이상하고 무 계획으로 보일 수 있습니다. 왜 드롭아웃이 과대 적합을 줄이는 데 도움이 될까요? 힌튼은 은행에서 사용하는 부정 방지 매커니즘에서 착안했다고 합니다. 그의 말을 빌리면 "은행에 갔을 때 행원들이 계속 바뀌길래 왜 그런지를 물었습니다. 자신들도 이유는 모르지만 자주 업무가 바뀐다고 했습니다. 나는 은행에서 부정 행위를 하려면 직원들 사이의 유대가 필요하기 때문이라 판단했습니다. 각 샘플에 대해 뉴런의 일부를 무작위하게 제거하면 뉴런의 부정한 협업을 방지하고 결국 과대 적합을 감소시킨다는 것을 깨달았습니다." 핵심 아이디어는 층의 출력 값에 노이즈를 추가하여 중요하지 않은 우연한 패턴(힌튼이 이야기한 부정한 협업)을 깨뜨리는 것입니다. 노이즈가 없다면 네트워크가 이 패턴을 기억하기 시작할 것입니다.

케라스에서는 층의 출려 바로 뒤에 Dropout 층을 추가하여 네트워크에 드롭아웃을 적용할 수 있습니다.

model.add(layers.Dropout(0.5))

IMDB 네트워크에 2개의 Dropout 층을 추가하고 과대적합을 얼마나 줄여 주는지 확인해 보겠습니다.

    model = models.Sequential()

    model.add(layers.Dense(16, activation='relu', input_shape(1000, )))

    model.add(layers.Dropout(0.5))

    model.add(layers.Dense(16, activastion='relu'))

    model.add(layers.Dropout(0.5))

    model.add(layers.Dense(1, activation='sigmoid'))

정리하면 신경망에서 과대적합을 방지하기 위해 가장 널리 사용하는 방법은 다음과 같습니다.

1) 훈련 데이터를 더 모읍니다.

2) 네트워크의 용량을 감소시킵니다.

3) 가중치 규제를 추가합니다.

4) 드롭아웃을 추가합니다.