머신 러닝의 흐름

본 문서는 [케라스 창시자에게 배우는 딥러닝] 책을 기반으로 하고 있으며, subinium(본인)이 정리하고 추가한 내용입니다. 생략된 부분과 추가된 부분이 있으니 추가/수정하면 좋을 것 같은 부분은 댓글로 이야기해주시면 감사하겠습니다.

이 장에서는 개념 정립과 해결하기 위한 단계를 정리합니다. 이번 장에서는 예시를 진행하지 않고, 이론적인 부분만 정리할 예정입니다.

4.1 머신 러닝의 네 가지 분류

3장에서는 3가지 머신 러닝 문제를 다뤘습니다. 이 셋은 모두 지도 학습(supervised learning) 의 예입니다. 지도 학습의 목표는 훈련 데이터의 입력과 타깃 사이의 관계를 학습하는 것 입니다.

머신 러닝 알고리즘은 지도 학습을 포함하여, 크게 총 4가지 범주에 대부분 속합니다.

4.1.1 지도 학습

가장 흔한 경우입니다. 샘플 데이터와 타깃을 통해 매핑 하는 방법을 학습합니다. 지금까지 본 문제는 모두 지도 학습의 고전적 예시입니다.

광학 문자 판독, 음성 인식, 이미지 분류, 언어 번역 같은 딥러닝의 거의 모든 애플리케이션이 이 범주에 속합니다. 대부분 분류와 회귀로 구성되나 다음과 같은 변종도 있습니다.

  • 시퀀스 생성 : 사진이 주어지면 이를 설명하는 캡션을 생성합니다.
  • 구문 트리 예측 : 문장이 주어지면 분해된 구문 트리를 예측합니다.
  • 물체 감지 : 사진이 주어지면 특정 물체 주위에 경계 상자를 그립니다.
  • 이미지 분할 : 사진이 주어졌을 때 픽셀 단위로 특정 물체에 마스킹을 합니다.

4.1.2 비지도 학습

어떤 타깃도 사용하지 않고 입력 데이터에 흥비로운 변환을 찾습니다. 데이터 시각화, 데이터 압축, 데이터 노이즈 제거 또는 데이터에 있는 상관관계를 더 잘 이해하기 위해 사용합니다.

비지도 학습(unsupervised learning) 데이터 분석에 빼놓을 수 없는 요소이며, 지도 학습 문제를 풀기 전 경향성을 확인하기 위해 필수적으로 거치는 단계입니다.

차원 축소군집 이 비지도 학습에서 잘 알려진 범주입니다.

4.1.3 자기 지도 학습

자기 지도 학습(self-supervised learning) 은 지도 학습의 특수 케이스이지만, 다릅니다. 사람이 만든 레이블을 사용하지 않고 경험적인 알고리즘을 사용해서 입력 데이터로부터 레이블을 생성합니다.

범주에 명확한 경계가 없기 때문에 학습 메커니즘과 애플리케이션 측면에서 중점을 두는 것에 따라 지도 학습 또는 비지도 학습으로 재해석될 수 있습니다.

4.1.4 강화 학습

강화 학습(reinforcement learning) 에서 에이전트(agent) 는 환경에 대한 정보를 받아 보상을 최대화하는 행동을 선택하도록 학습됩니다. 게임 이외에 실제적인 성공사례는 아직 없다고 합니다.

강화 학습 분야가 확대되면 자율 주행 자동차, 자원 관리, 교육 등에서 적용될 것입니다.

4.2 머신 러닝 모델 평가

머신 러닝의 목표는 처음 본 데이터에 대해 잘 작동하는 일반화된 모델을 얻는 것입니다. 이번 절에서는 일반화, 즉 머신러닝 모델의 성능을 어떻게 측정하는지에 집중합니다.

4.2.1 훈련, 검증, 테스트 세트

모델 평가의 핵심은 가용한 데이터를 항상 훈련, 검증, 테스트 3개로 나누는 것입니다.

  • 훈련 세트에서 모델을 훈련하고
  • 검증 세트에서 모델을 평가하고
  • 테스트 세트에서 한 번 모델을 테스트합니다.

검증 세트는 반드시 필요합니다. 그 이유는 모델을 개발할 때는 항상 모델의 설정을 튜닝하기 때문입니다. 예를 들어 층 수, 층의 유닛 수(네트워크 가중치와 구별을 위해 하이퍼파라미터(hyperparameter) 이란 단어를 사용합니다.)를 선택해야합니다. 검증 세트에서는 모델의 성능을 평가하여 이런 튜닝을 수행합니다.

물론 검증 세트도 어떤 파라미터 공간에서 좋은 설정을 찾는 학습이기에 훈련 세트와 상관없는 검증 세트이지만 검증 세트에 오버피팅될 수 있습니다.

이 현상의 핵심은 정보 누설(information leak 개념에 있습니다. 검증 세트의 모델 성능에 기반하여 모델의 하이퍼파라미터를 조정할 때마다 검증 데이터에 관한 정보가 모델로 새는 것 입니다. 즉 검증 데이터에 맞추어 최적화했기 때문에 검증 데이터에 의도적으로 잘 수행되는 모델이 만들어집니다.

그렇기에 테스트 세트는 모델을 만드는 과정에서 어떠한 연관성도 있어서는 안됩니다. 테스트 세트는 학습된 결과를 확인하는 과정이므로 그에 따른 최적화 과정이 없었어야 한다는 것입니다.

다음은 데이터가 적을 때 사용하는 세 가지 평가 방법입니다.

단순 홀드아웃 검증

  • 데이터의 일정량을 테스트 세트로 떼어 놓습니다.
  • 남은 데이터에서 훈련하고 테스트 세트로 평가합니다.

이 검증의 단점은 데이터가 적을 때는 검증 세트와 테스트 세트의 샘플이 너무 적어 주어진 전체 데이터를 통계적으로 대표하지 못할 수 있습니다. 다른 난수 초깃값으로 셔플링해서 데이터를 나누었을 때 차이를 확인하여 이런 문제가 발생하는지 확인할 수 있습니다.

K-겹 교차 검증

  • 데이터를 동일한 K개 분할로 나눕니다.
  • 각 분할 i에 대해 남은 K-1개의 분할로 모델을 훈련
  • 분할 i에서 모델을 평가
  • K개 점수 평균으로 최종 점수

이 방법은 데이터 분할에 따라 편차가 클 때 도움이 됩니다. 단순 홀드아웃 검증처럼 이 방법은 모델의 튜닝에 별개의 검증 세트를 사용합니다.

셔플링을 사용한 반복 K-겹 교차 검증

이 방법은 비교적 가용 데이터가 적고 가능한 정확한 모델 평가를 위해 사용합니다. 캐글 경연에서 유용하다고 합니다.

  • K-겹 교차 검증을 여러 번 적용하되
  • K개의 분할로 나누기 전에 매번 무작위 셔플
  • 총 반복횟수 * K번의 훈련 및 평가가 이뤄져 비용이 많이 듬

4.2.2 기억해야 할 것

평가 방식의 선택은 다음과 같은 사항에 유념해야 합니다.

  • 대표성 있는 데이터 : 훈련 세트와 테스트 세트가 주어진 데이터에 대한 대표성이 있어야 합니다.
  • 시간의 방향 : 과거로부터 미래를 예측할 때는 훈련 세트는 테스트 세트보다 과거 데이터여야 합니다.
  • 데이터 중복 : 데이터 포인터의 중복은 훈련 세트와 테스트 세트의 중첩으로 이어질 수 있습니다.

4.3 데이터 전처리, 특성 공학, 특성 학습

데이터 처리에 대해 알아봅시다.

4.3.1 신경망을 위한 데이터 전처리

데이터 전처리 목적은 원본 데이터를 신경망에 적용하기 쉽도록 만드는 것입니다.

벡터화

신경망에서 모든 입력과 타깃은 부동 소수 데이터로 이루어진 텐서(특정 경우 정수 텐서)여야 합니다. 어떤 데이터도 신경망에 넣기 위해서는 텐서로 변환이 필요합니다. 이 단계를 데이터 벡터화(data vectorization) 라고 합니다.

값 정규화

네트워크를 쉽게 학습시키기 위해 데이터는 다음과 같은 특징을 가져야합니다.

  • 작은 값. 일반적으로 0~1 사이
  • 균일. 모든 특성이 대체로 비슷한 범위를 가져야합니다.

그렇기에 서로 다른 스케일의 데이터는 정규화를 진행해야 합니다.

누락된 값 다루기

특성에 따라 테스트 케이스에 포함안되는 정보가 있을 수 있기에, 후에 누락될 가능성이 있는 데이터는 제외시켜야합니다.

4.3.2 특성 공학

특성 공학은 데이터와 머신 러닝 알고리즘에 관한 지식을 사용하는 단계입니다. 모델에 데이터를 주입하기 전에 하드코딩된 변환을 적용하여 알고리즘이 더 잘 수행되도록 만들어줍니다.

예시로 시계를 입력으로 받는다면 다음과 같은 데이터로 처리할 수 있습니다.

  1. 이미지
  2. 시침 분침의 직교좌표
  3. 시침 분침의 극좌표

데이터에 대한 이해도가 높을수록 데이터에 대한 전처리가 쉬워질 것입니다. 특성 공학은 더 간단한 방식으로 표현하여 문제를 쉽게 만듭니다.

최근 딥러닝은 대부분 특성 공학이 필요하지 않습니다. 신경망이 자동으로 원본 데이터에서 유용한 특성을 추출할 수 있기 때문입니다. 그러나 특성 공학은 필요합니다.

  • 좋은 특성은 적은 자원을 사용하여 문제를 더 멋지게 풀 수 있음
  • 좋은 특성은 더 적은 데이터로 문제를 풀 수 있음

4.4 과대적합과 과소적합

머신 러닝의 근본적인 이슈는 최적화와 일반화 사이의 줄다리기입니다.

최적화(optimization) 는 가능한 훈련 데이터에서 최고의 성능을 얻기 위해 모델을 조정하는 과정입니다. 반면 일반화(generalization) 는 훈련된 모델이 이전에 본 적 없는 데이터에서 얼마나 잘 수행되는지 의미합니다. 일반화 성능은 제어할 수 없습니다. 훈련데이터를 기반으로 모델을 조정할 수만 있습니다.

훈련 초기에 최적화와 일반화는 상호 연관되어 있습니다. 훈련 데이터의 손실이 낮을수록 테스트 데이터의 손실이 낮습니다. 이런 상황을 underfitting되었다고 말합니다. 아직 모델의 성능이 개선될 여지가 많습니다.

훈련 데이터를 반복하다보면 검증 세트에 대한 일반화 성능이 더 이상 높아지지 않고 감소됩니다. 이는 모델이 훈련 데이터에 특화된 패턴을 학습하기 시작했다는 의미입니다. 이를 overfitting이라고 합니다.

이런 현상을 막기 위한 최고의 방법은 훈련 데이터를 많이 모으는 것입니다. 차선책으로 모델이 수용할 수 있는 정보의 양을 조절하거나 저장할 수 있는 정보에 제약을 가하는 것입니다. 그럼 모델은 최적화 과정에서 가장 중요한 패턴에 집중하게 됩니다. 이런 방식을 규제(regularization) 이라고 합니다.

4.4.1 네트워크 크기 축소

과대적합을 막는 가장 단순한 방법은 모델의 크기, 즉 모델에 있는 학습 파라미터 수를 줄이는 것입니다. 파라미터의 수는 층의 수와 각 층의 유닛 수에 의해 결정됩니다. 딥러닝에서 모델에 있는 학습 파라미터의 수를 종종 모델의 capacity라고 합니다.

파라미터가 많다면, 훈련 샘플과 타깃 사이를 일대일 매핑으로 완변하게 학습할 수 있으나, 이는 일반화 능력이 없습니다. 파라미터가 적다면, 과소적합이 일어나게 됩니다. 그렇기에 머신 러닝에 있어서는 너무 많은 용량과 충분하지 않은 용량 사이의 절충점을 찾아야 합니다.

이에 대한 공식은 없습니다. 각기 다른 구조로 테스트하며 절충점을 찾아야합니다.

4.4.2 가중치 규제 추가

오캄의 면도날 : 어떤 것에 대한 두 가지의 설명이 있다면 더 적은 가정이 필요한 간단한 설명이 옳을 것이라는 이론

신경망에서도 위의 이론은 적용됩니다. 간단한 모델이 복잡한 모델보다 과대적합 될 가능성이 적습니다. 여기서 간단한 모델이란 파라미터 값 분포의 엔트로피가 작은 모델입니다. 그러므로 과대적합을 완화하기 위한 일반적인 방법은 네트워크의 복잡도에 제한을 두어 가중치가 작은 값을 가지도록 강제하는 것입니다.

이렇게 가중치의 분포를 균일하게 하는 것을 가중치 규제(weight regularization) 라고 하며, 네트워크의 손실 함수에 큰 가중치에 연관된 비용을 추가합니다. 두 가지 형태의 비용이 있습니다.

  1. L1 규제 : 가중치의 절댓값에 비례하는 비용이 추가됩니다. L1 norm
  2. L2 규제 : 가중치의 제곱에 비례하는 비용이 추가됩니다. 신경망에서 가중치의 감쇠라고도 부릅니다. L2 norm

4.4.3 드롭아웃 추가

드롭아웃(dropout) 은 신경망을 위해 사용되는 규제 기법 중에서 가장 효과적이고 널리 사용되는 방법 중 하나입니다. 네트워크 층에 드롭아웃을 적용하면 훈련하는 동안 무작위로 층의 일부 출력 특성을 제외시킵니다.

드롭아웃 비율은 0이 될 특성의 비율입니다. 보통 0.2에서 0.5 사이로 지정됩니다. 테스트 단계에서는 어떤 유닛도 드롭아웃되지 않습니다. 그 대신 층의 출력을 드롭아웃 비율에 비례하여 줄여줍니다. 다음과 같이 코드를 작성할 수 있습니다.

layer_output *= np.random.randint(0, high=2, size=layer_output.shape)

테스트 단계에는 드랍아웃 비율로 출력을 낮추어 주어야 합니다.

layer_output *= 0.5

이 방법은 층의 출력 값에 노이즈를 추가하여 중요하지 않은 패턴을 깨뜨리는 것이 핵심입니다.

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

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

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

  • 입력 데이터, 예측하는 정보 : 가용 훈련 데이터의 유무
  • 문제의 유형 : 이진 분류, 다중 분류, 스칼라 회귀 등등

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

  • 주어진 입력으로 출력을 예측할 수 있다고 가설을 세웁니다.
  • 가용한 데이터에 입력과 출력 사이의 관계를 학습하는 데 충분한 정보가 있다고 가설을 세웁니다.

위 가설은 말 그대로 가설일 뿐이기에 검증이 필요합니다. 예를 들면, 시간에 따른 데이터의 경우에는 미래가 과거와 같이 진행할 것이라는 가정이 전제되어 있습니다. 하지만 현실은 그렇지 않기에 어려운 것입니다.

4.5.2 성공 지표 선택

어떤 것을 제어하기 위해서는 관측을 할 수 있어야 합니다. 성공하기 위해서는 성공을 정의해야 합니다. 이런 성공의 지표가 손실 함수를 선택하는 기준이 됩니다.

  • 클래스 분포가 균일한 분류 문제에서는 정확도와 ROC AUC가 일반적인 지표입니다.
  • 클래스 분포가 균일하지 않은 문제에서는 정밀도와 재현율을 사용할 수 있고
  • 랭킹 문제나 다중 레이블 문제에는 평균 정밀도를 사용할 수 있습니다.

이렇게 문제에 따라 지표는 매우 많습니다. 다양한 지표는 kaggle 등 경연 대회를 살펴보는 것이 좋습니다.

4.5.3 평가 방법 선택

평가 방식은 전에 말한 홀드아웃 검증 세트 분리, K-겹 교차 검증, 반복 K-겹 교차 검증 등을 이용하면 됩니다.

4.5.4 데이터 준비

위에 내용을 정했다면 모델을 훈련시킬 준비가 거의 완료되었습니다. 하지만 머신 러닝 모델에 주입할 데이터를 구성해야 합니다. 이 부분은 4.3장을 참고하면 될 것 같습니다.

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

이 단계의 목표는 통계적 검정력(statistical power) 을 달성하는 것입니다. 검정력이란 우리가 세운 가설이 참일 때 이를 채택할 확률을 말합니다.

아주 단순한 모델보다 나은 수준의 작은 모델을 개발합니다. 분류 문제에서는 랜덤으로 분류한 것 보다는 나은 분류를 해야한다는 것입니다. 항상 검정력을 가지지는 않습니다. 그 이유는 처음 세운 가설인 입력과 출력의 관계가 있다는 점이 거짓이기 때문입니다. 이때는 처음부터 다시 시작해야 합니다.

검정력을 가지는 모델이라면 세 가지 중요한 선택을 해야합니다.

  • 마지막 층의 활성화 함수 : 네트워크의 출력에 필요한 제한을 가합니다.
  • 손실 함수: 풀려고 하는 문제의 종류에 적합해야 합니다.
  • 최적화 설정 : 옵티마이저와 학습률을 확인해야 합니다.

성공 지표는 직접 최적화하는 방법이 없기 때문에 설정을 잘 해야합니다. 손실 함수는 미니 배치 데이터에서 계산 가능해야 하고, 미분 가능해야 합니다.

4.5.6 몸집 키우기: 과대적합 모델 구축

이 모델에서 성능을 체크해야 합니다. 충분한 층과 파라미터가 있는지 체크해야 합니다. 이상적인 모델을 찾기 위해서는 최적화와 일반화의 경계를 찾는 것입니다. 그렇기에 과대적합된 모델을 만들어야 합니다. 과대적합된 모델은 다음과 같이 만들 수 있습니다.

  • 층 추가
  • 층 크기 키우기
  • 더 많은 epoch 동안 훈련

훈련과 검증 지표, 훈련 손실과 검증 손실의 모니터를 통해 과대적합 시점을 찾습니다.

4.5.7 모델 규제와 하이퍼파라미터 튜닝

반복적으로 모델을 수정하고 훈련하고 검증 데이터에서 평가합니다. 보통 이 단계에서 대부분 시간을 차지합니다. 다음과 같은 시도를 해볼 수 있습니다.

  • 드롭아웃 추가
  • 층 추가 또는 제거를 통한 여러 구조 시도
  • L1이나 L2 또는 두 가지 모두 추가
  • 하이퍼파라미터를 바꾸어 시도
  • 특성 공학 시도

4.6 요약

  • 주어진 문제와 훈련 데이터 정의. 수집과 필요에 따라 태깅
  • 성공 지표 선정, 모니터링할 지표 선정
  • 평가 방법 결정
  • 통계력 검정력 있는 첫 번째 모델 만들기
  • 과대적합된 모델 만들기
  • 모델 규제와 하이퍼파라미터 튜닝

Leave a Comment