안 쓰던 블로그
머신 러닝의 기본 개념들 본문
머신 러닝의 네 가지 분류
1. 지도 학습
사람이 레이블링한 샘플 데이터가 주어지면 알고 있는 꼬리표(타깃)에 입력 데이터를 매핑한다.
가장 흔한 경우이며, 이진 분류, 다중 분류, 스칼라 회귀는 전부 지도 학습에 포함된다.
문자 판독, 음성 인식, 이미지 분류, 언어 번역 같은 딥러닝의 거의 모든 애플리케이션이 일반적으로 이 범주에 속한다.
대부분 분류와 회귀로 구성되지만 변종도 있다
변종의 예
-시퀀스 생성: 사진이 주어지면 이를 설명하는 캡션 생성
-구문 트리 예측: 문장이 주어지면 분해된 구문 트리를 예측
-물체 감지: 사진이 주어지면 사진 안의 특정 물체 주위에 경계 상자를 그린다. 상자를 분류하는 분류 문제나, 경계 상자의 좌표를 벡터 회귀로 예측하는 회귀와 분류과 결합된 문제로 표현할 수 있다.
-이미지 분할: 사진이 주어졌을 때 픽셀 단위로 특정 물체에 마스킹한다.
2. 비지도 학습
이 부류의 머신 러닝은 어떤 타깃도 사용하지 않고 입력 데이터에 대한 변환을 찾는다.
데이터 시각화, 데이터 압축, 데이터의 노이즈 제거, 데이터에 있는 상관관계 이해에서 사용한다.
종종 지도 학습 문제를 풀기 전에 데이터셋을 잘 이해하기 위해 필수적으로 거치는 단계
차원 축소와 군집이 잘 알려진 범주이다.
3. 자기 지도 학습
지도 학습이긴 하지만 사람이 만든 레이블을 사용하지 않는다. 즉, 학습 과정에 사람이 개입하지 않는 지도 학습이다.
학습이 무언가에 지도되어야 하므로 레이블은 여전히 필요하지만 보통 경험적인 알고리즘을 사용해서 입력 데이터로부터 생성한다.
예) 오토 인코더
생성된 타깃은 수정하지 않은 원본 입력이다. 지난 프레임이 주어졌을 때 비디오의 다음 프레임을 예측하거나, 이전 단어가 주어졌을 때 다음 단어를 예측하는 것 등이 예시이다.
--
지도 학습, 비지도 학습, 자기 지도 학습은 가끔 명확한 경계가 없고 연속적이다. 특히 자기 지도 학습은 학습 메커니즘과 애플리케이션 측면 중 어디에 중점을 두는지에 따라 지도 학습 또는 비지도 학습으로 재해석될 수 있다.
4. 강화 학습
강화 학습에서 에이전트는 환경에 대한 정보를 받아 보상을 최대화하는 행동을 선택한다.
자율 주행 자동차, 자원 관리, 교육 등의 애플리케이션 예시가 있다.
예) 강화 학습으로 훈련된 신경망: 비디오 게임 화면을 입력으로 받고 게임 점수를 최대화하기 위한 게임 내의 행동을 출력한다.
머신 러닝 모델 평가
모델 평가의 핵심은 가용한 데이터를 항상 훈련, 검증, 테스트 3개의 세트로 나누는 것이다.
훈련 세트에서 모델을 훈련하고 검증 세트에서 모델을 평가한다. 모델이 준비가 되면 테스트 세트에서 최종적으로 딱 한 번 모델을 테스트한다.
학습
검증 세트에서 모델의 성능을 평가하여 모델의 설정을 튜닝한다(예를 들어 층의 수나 유닛 수 선택). 이를 하이퍼파라미터라고 하며, 어떤 파라미터 공간에서 좋은 설정을 찾는 학습이다.
정보 누설
검증 세트의 모델 성능에 기반하여 모델의 하이퍼파라미터를 조정할 때마다 검증 데이터에 관한 정보가 모델로 새는 것이다. 이렇게 정보가 많이 새어버리면 이 데이터에 맞추어 최적화가 되며, 검증 데이터에 의도적으로 잘 수행되는 모델이 만들어져서 새로운 데이터에 대한 성능이 떨어진다. 그래서 데이터를 훈련, 검증, 테스트 세트로 나누는 것이며, 모델은 간접적으로라도 이후 과정의 데이터 세트에 대한 어떤 정보도 얻어서는 안 된다.
데이터가 적을 때는 훈련, 검증, 테스트 세트로 나누기 어렵다. 이럴 때는 아래 세 가지 고급 기법을 사용한다.
1. 단순 홀드아웃 검증
데이터의 일정량을 테스트 세트로 떼어 놓는다. 남은 데이터에서 훈련하고 테스트 세트로 평가한다.
데이터가 너무 적으면 나누어진 데이터 세트의 샘플이 너무 적어 주어진 전체 데이터를 통계적으로 대표하지 못할 수 있다.
계속해서 새로운 모델을 만들며 훈련-평가-튜닝을 반복한다.
최적의 하이퍼파라미터를 구한 후에 테스트 데이터를 제외한 모든 데이터(훈련, 검증)를 사용하여 다시 훈련한다.
2. K-겹 교차 검증
데이터를 동일한 크기를 가진 K개 분할로 나눈다. 각 분할 i에 대해 남은 K-1개의 분할로 모델을 훈련하고 분할 i에서 모델을 평가한다. 최종 점수는 이렇게 얻은 K개의 점수를 평균한 값이다.
모델의 성능이 데이터 분할에 따라 편차가 클 때 도움이 되는 방법이다.
홀드 아웃 검증처럼 모델의 튜닝에 별개의 검증 세트를 사용한다.
검증 데이터 부분을 선택하고, 리스트의 더하기 연산으로 나머지 데이터 리스트를 연결하여 학습-검증-튜닝을 한다.
3. 셔플링을 사용한 반복 K-겹 교차 검증
이 방법은 비교적 가용 데이터가 적고 가능한 정확하게 모델을 평가하고자 할 떄 사용한다.
K-겹 교차 검증을 여러 번 적용하되, K개의 분할로 나누기 전에 매번 데이터를 무작위로 섞는다.
최종 점수는 모든 K-겹 교차 검증을 실행해서 얻은 점수의 평균이다.
P(반복 횟수)*K의 모델을 훈련하고 평가하므로 비용이 매우 많이 든다.
사이킷런 0.19 버전에 추가된 RepeatedKFold(회귀)와 RepeatedStratifiedKFold(분류) 클래스를 cross_validate()함수에 적용하여 구현할 수 있다.
캐글 경연에서는 아주 유용하다.
신경망을 위한 데이터 전처리
1. 벡터화
신경망의 모든 입력과 타깃은 부동 소수 데이터로 이루어진 텐서여야 한다. (특정 경우에는 정수로 이루어진 텐서)
사운드, 이미지, 텍스트 등 처리해야 할 것이 무엇이든지 먼저 텐서로 변환해야 한다. = 이 단계를 데이터 벡터화 라고 한다.
이미 데이터가 벡터 형태로 주어졌으면 이 단계를 건너뛰어도 된다. 그렇지 않다면 정수 리스트로 변환하거나 원-핫 인코딩을 사용하여 float32 타입의 데이터로 이루어진 텐서로 바꾸는 등의 작업이 필요하다.
2. 정규화
비교적 큰 값(네트워크 가중치 초깃값보다 훨씬 큰 수)이나 균일하지 않은 데이터(한 특성은 0~1범위인데 다른 건 100~200범위이고 그런 거)를 신경망에 주입하는 것은 위험하다. 이러면 네트워크가 수렴하는 것을 방해한다. 쉽게 네트워크를 학습하기 위해서는 다음과 같은 특징을 따라야 한다.
-작은 값을 취해야 한다. 일반적으로 대부분의 값이 0~1사이어야 한다.
-균일해야 한다. 모든 특성이 대체로 비슷한 범위를 가져야 한다.
엄격한 정규화 방법이 필요하다면 몇 가지 특징이 추가된다.
-각 특성별로 평균이 0이 되도록 정규화한다.
-각 특성별로 표준 편차가 1이 되도록 정규화한다.
넘파이 배열에서는 mean값을 빼거나 std값을 나누는 식으로 할 수 있다.
3. 누락된 값 다루기
가끔 데이터에 값이 누락된 경우가 있다. 일반적으로 신경망에서 0이 사전에 정의된 의미 있는 값이 아니라면 누락된 값을 0으로 입력해도 괜찮다. 0이 누락된 데이터를 의미한다는 걸 네트워크가 학습을 하면 이 값은 의미 없는 값이라고 무시한다.
그런데 네트워크가 누락된 값이 없는 데이터에서 훈련되었다면 그 네트워크는 누락된 값을 무시하는 법을 알지 못한다. 이런 경우에는 누락된 값이 있는 훈련 샘플을 고의적으로 만들어야 한다. 훈련 샘플의 일부를 여러 벌 복사해서 테스트 데이터에서 빠질 것 같은 특성을 제거한다.
4. 특성 공학
특성 공학은 데이터와 머신 러닝 알고리즘(여기에서는 신경망)에 관한 지식을 사용하는 단계이다. 모델에 데이터를 주입하기 전에 (학습이 아닌) 하드코딩된 변환을 적용하여 알고리즘이 더 잘 수행되도록 만들어 준다.
즉, 모델이 수월하게 작업할 수 있는 어떤 방식으로 데이터를 표현하는 특성 추출 작업을 의미한다.
예를 들어 시계 이미지를 입력 받고 시간을 출력하는 모델이 있다고 하자
원본 데이터인 사진 자체를 보려면 어려운 머신 러닝 문제가 된다. 합성곱 신경망이 필요하고, 꽤 많은 컴퓨팅 자원도 필요하다.
그런데 시계 바늘의 검은색 픽셀을 따라 각 바늘 끝의 (x, y)좌표를 출력하는 파이썬 스크립트로 좌표를 알아냈다면, 더욱 쉽게 학습할 수 있을 것이다.
이보다 더 좋게 하려면 시계 바늘의 각도를 주면 된다. 좌표를 바꾸어 (x, y)포인트를 이미지 중심에 대한 극좌표로 나타낼 수 있다.
예전에는 이런 과정이 아주 중요했는데, 최근 딥러닝은 대부분 특성 공학이 필요하지 않다. 신경망이 자동으로 유용한 특성을 추출하기 때문이다. 그럼에도 다음과 같은 이유로 특성 공학은 중요하다.
-좋은 특성은 적은 자원을 사용하여 문제를 풀 수 있게 한다.
-좋은 특성은 더 적은 데이터로 문제를 풀 수 있게 한다. 딥러닝 모델이 스스로 특성을 학습하는 능력은 훈련 데이터가 많을 때 발휘된다. 샘플의 개수가 적다면 특성에 있는 정보가 더 중요해 진다.
보편적인 머신 러닝 작업 흐름
1. 문제 정의와 데이터셋 수집
문제 정의 과정이 제일 먼저 필요하다.
-입력 데이터는 무엇인가? 어떤 것을 예측하려고 하는 건가?
예: 영화 리뷰와 감성 레이블이 태깅되어 있어야 영화 리뷰의 감성 분류를 학습할 수 있다
-당면한 문제가 어떤 종류인가? 이진 분류? 다중 분류? 스칼라 회귀? 벡터 회귀? 그 외?
문제의 유형을 식별하면 모델의 구조와 손실 함수 등을 선택하는 데 도움이 된다.
머신 러닝은 훈련 데이터에 있는 패턴을 기억하기 위해서만 사용한다는 것을 유념한다. 이미 보았던 것만 인식할 수 있다. 미래를 예측하기 위해 과거 데이터에서 훈련한 머신 러닝을 사용하는 것은, 미래가 과거처럼 움직인다는 가정이 있어야 한다. 사실 많은 문제들이 그렇지 않다.
2. 성공 지표 선택
어떤 것을 제어하려면 관측할 수 있어야 한다. 성공하기 위해선 성공은 무엇인가를 정희해야 한다.
성공의 지표가 모델이 최적화할 손실 함수를 선택하는 기준이 된다.
클래스 분포가 균일한 분류 문제에서는 정확도와 ROC AUC가 일반적인 지표이다. 균일하지 않은 문제에서는 정밀도와 재현율을 사용할 수 있다.
랭킹 문제나 다중 레이블 문제에서는 평균 정밀도를 사용할 수 있다. (평균 정밀도: 정밀도에 대한 재현율의 곡선인 정밀도-재현율 곡선에서, 곡선의 아랫부분 면적)
캐글에서 굉장히 다양한 문제들과 측정 지표들을 볼 수 있다.
3. 평가 방법 선택
목표를 정했다면 현재의 진척 상황을 평가할 방법을 정해야 한다. 앞서 다룬 세 가지 평가 방식을 사용할 수 있다.
-홀드아웃 검증 세트 분리: 데이터가 풍부할 때 사용
-K-겹 교차 검증: 홀드아웃 검증을 사용하기에 샘플의 수가 너무 적을 때 사용
-반복 K-겹 교차 검증: 데이터가 적고 매우 정확한 모델 평가가 필요할 때 사용
보통 딥러닝을 사용할 때는 데이터가 풍부한 상황이므로 대체로 첫 번째로 충분할 것이다.
4. 데이터 준비
무엇을 훈련할지, 무엇을 최적화할지, 어떻게 평가할지를 골랐으니 머신 러닝 모델에 주입할 데이터를 구성해야 한다.
이 머신 러닝 모델을 심층 신경망이라고 가정하면 아래와 같은 특징이 있다.
-데이터는 텐서로 구성
-텐서에 있는 값은 일반적으로 작은 값으로 스케일 조정됨(예: [-1, 1]이나 [0, 1] 범위)
-특성마다 범위가 다르거나 여러 종류의 값으로 이루어진 데이터라면 정규화 필요
-특성 공학 수행 가능. 다만 데이터가 적을 때 가능
입력 데이터와 타깃 데이터의 텐서가 준비되면 훈련을 할 수 있다.
5. 기본보다 나은 모델 훈련하기
이 단계의 목표는 통계적 검정력을 달성하는 것이다.
즉, 아주 단순한 모델보다 나은 수준의 작은 모델을 개발한다.
항상 통계적 검정력을 달성하는 것이 가능하지는 않다. 무작위 예측 모델보다 낫지 않다면 입력 데이터에 존재하지 않는 것을 얻으려고 한다는 신호라고 생각할 수 있다. (기획부터 다시 해야 한다)
다음과 같은 세 가지 선택을 해야 한다.
-마지막 층의 활성화 함수: 네트워크 출력에 필요한 제한을 가한다.
-손실 함수: 풀려고 하는 문제의 종류에 적합해야 한다. 또한 주어진 미니 배치 데이터에서 계산 가능해야 하고, 미분 가능해야 한다.
-최적화 설정: 어떤 옵티마이저를 사용할지? 학습률은 얼마? 대부분의 경우 rmsprop과 기본 학습률을 사용하는 것이 무난하다.
문제 유형 | 마지막 층의 활성화 함수 | 손실 함수 |
이진 분류 | 시그모이드 | binary_crossentropy |
단일 레이블 다중 분류 | 소프트맥스 | categorical_crossentropy |
다중 레이블 다중 분류 | 시그모이드 | binary_crossentropy |
임의 값에 대한 회귀 | 없음 | mse |
0과 1 사이 값에 대한 회귀 | 시그모이드 | mse 또는 binary_crossentropy |
6. 몸집 키우기: 과대적합 모델 구축
통계적 검정력을 가진 모델을 얻었다면, 모델이 충분히 성능을 내는지 질문해 보아야 한다.
머신 러닝은 최적화와 일반화 사이의 줄다리기이다.
과소적합과 과대적합 사이, 즉 과소용량과 과대용량의 경계에 적절히 위치한 모델이 이상적이다.
주어진 문제를 적절히 모델링하기에 충분한 층과 파라미터가 있는가?
얼마나 큰 모델을 만들어야 할지 알기 위해서는 과대적합된 모델을 만들어 보면 된다.
1) 층을 추가한다.
2) 층의 크기를 키운다.
3) 더 많은 에포크 동안 훈련한다.
7. 모델 규제와 하이퍼파라미터 튜닝
반복적으로 모델을 수정하고 훈련하고 검증 데이터에서 평가한다. (테스트 데이터는 사용하지 않는다)
그리고 다시 수정하여 가능한 좋은 모델을 얻을 때까지 반복한다.
이 단계가 대부분의 시간을 차지한다.
다음과 같은 사항을 적용해 볼 수 있다.
-드롭아웃 추가
-층을 추가하거나 제거
-하이퍼파라미터 바꾸어 시도
-선택적으로 특성 공학을 시도
검증 과정에서 얻은 피드백을 사용하여 모델을 튜닝할 때마다 검증 과정에 대한 정보를 모델에 누설하고 있음을 유념하자. 몇 번 반복은 괜찮지만 여러번 반복하게 되면 모델이 검증 과정에 과대적합될 것이다.
만족할 만한 모델 설정을 얻었다면 가용한 모든 데이터(훈련 및 검증 데이터)를 사용해서 최종 모델을 훈련시킨다. 그리고 딱 한 번 마지막에 테스트 세트에서 평가한다.
테스트 세트의 성능이 검증 데이터에서 측정한 것보다 많이 나쁘면 검증 과정의 신뢰성이 떨어지거나 과대적합된 것이다. 좀 더 신뢰할 만한 평가 방법으로 바꾸는 것이 좋다.
[케라스 창시자에게 배우는 딥러닝]을 정리한 글입니다.
'머신러닝 > 머신러닝' 카테고리의 다른 글
소규모 데이터셋에서 CNN 훈련하기(Kaggle - Dogs vs. Cats) (1) | 2021.05.12 |
---|---|
CNN(convolutional neural network - 합성곱 신경망) (2) | 2021.04.08 |
회귀 문제: 케라스로 주택 가격 예측하기 (0) | 2021.04.05 |
다중 분류: 케라스로 뉴스 기사 분류하기 (0) | 2021.04.05 |
이진 분류: 케라스로 영화 리뷰 분류하기 (0) | 2021.04.04 |