요즘 머신러닝, 딥러닝 분야를 학습하다 보면 물론 수학적인 수식이나 공식이 어렵기도 하지만
한국어로 풀어쓴 설명에서 막히는 원인이 용어에 대한 개념숙지가 안되어 있는게 문제라고 생각한다.
따라서 용어를 순차적으로 학습해나가고 숙지하는 것이 또 하나의 숙제가 될 것 같다.
먼저 머신러닝의 개념과 난제부터 살펴보자.
머신러닝이라는 기법을 통해서 학습데이터로부터 모델을 찾아내고 실제 현장의 데이터를 그 모델에
input으로 넣었을 때 output을 찾는 것을 추론(inference) 라고 한다.
이렇게 학습 데이터로부터 열심히 머신러닝 모델을 구하고 실제 데이터를 입력했을 때 제대로 된 결과가 나오지 않을 수 있다. 그 이유는 학습데이터는 실제데이터의 부분집합이기 때문이다. 머신러닝과 딥러닝의 문제는 여기에서 출발한다.
머신러닝 기법을 사용할 때는 실제 데이터의 특성이 잘 반영되어 있고 편향되지 않은 학습 데이터를 확보하는 게 아주
중요하다! 따라서 일반화 (= 학습데이터와 입력데이터가 달라져도 성능 차이가 나지 않게 하는 것)가 중요하다!
<과적합(Overfitting)>
그런데 과적합(overfitting) 이라는 것은 일반화를 떨어뜨린다! 여기서 과적합=학습데이터를 너무나도 학습을 잘해서 과한 느낌이라고 보면 된다. 일반적으로는 학습데이터는 실제 데이터의 부분집합인 경우가 대부분이다. 따라서, 아래의 그래프처럼 학습 데이터에 대해서는 오차가 감소하지만, 실제 데이터에 대해서는 오차가 증가하는 지점이 존재할 수 있다.
과적합을 이러한 관점에서 본다면 과적합은 학습 데이터에 대해 과하게 학습하여 실제 데이터에 대한 오차가 증가하는 현상이다. ex) 과적합에 대한 대표적인 예는 노랑색 고양이를 보며 고양이의 특성을 학습한 기계가 검은색이나 다른 색깔의 고양이를 구분하지 못하는 것과 비슷하다고 생각하면 된다.
<과적합을 해결하기 위한 방법들>
● 많은 training data
● 입력으로 들어오는 변수(feature, x)의 갯수를 줄여라
● Regularization
여기서 우린 마지막 정직화(Regularization)에 대해 살펴보겠다. 정직화는 간단히 말해 모델의 형태를 단순화시키는 것이다. 모델이 복잡할수록 학습데이터에만 맞춰지기 때문에 새로운 낯선 데이터가 들어왔을 때 오차가 생길 수 있기 떄문이다. 그래서 이러한 한계를 해결하기 위해서 모델을 단순화하여 전체 경향만 잘 반영하자는 것이다. 즉, 모델에 대한 성능을 약간 감소시키더라도 최대한 단순화시켜 과적합에 빠지지 않도록 하는 것이다!
모델 구축시, 위와 같은 3가지로 분류되는데 Underfitting은 너무 대충하여 error가 많이 발생하는 경우다.
반면에 overfitting은 너무나도 학습데이터에 잘 맞춰져 있어서 오히려 실제 데이터가 input으로 입력되었을 때
오차가 발생한다는 것이다.
W가 크면 예측하려는 값(y hat)이 정상적인 규칙으로부터 벗어나 있는 경우에도 예측이 가능합니다. 그러나, 비정상적이거나 애매한 위치에 있는 데이터를 올바르게 예측하는 것을 '맞았다'라고 얘기할 수는 없습니다. 정상적이지 안흔 데이터를 예측했기 때문이죠. 그래서 오히려 '틀렸다'라고 얘기하는 것이 더욱 좋을 수 있습니다. 이럴 경우 training dataset에 특화된 overfitting 현상이 발생합니다. 가장 이상적인 경우는 최소한의 에러를 인정하는 'Just right'입니다.
Regularization을 구현하는 것은 매우 쉽습니다. cost 함수가 틀렸을 때 높은 비용이 발생할 수 있도록 벌점(penalty)을 부과하는 것처럼 W에 대한 값이 클 경우에 penalty를 부여하면 됩니다.
W에 대해 제곱을 한 합계를 cost 함수에 더하는 것이 전부입니다. 다만 합계를 어느 정도로 반영할지 결정할 수 있어야, 사용하는 시점에서 다양한 적용이 가능합니다. 람다(λ)라고 부르는 값을 사용해서 얼마나 penalty를 부여할 것인지 결정할 수 있습니다.
<검증(Validation)>
검증은 학습 데이터의 일부를 따로 떼어 내서 학습에는 사용하지 않고 모델의 성능 검증용으로 사용하는 기법을 말합니다. 즉, 모델을 학습시킨 학습데이터들은 모델의 과적합 여부를 판단하기 불가능하기 때문에 일부러 학습시키지 않은 데이터를 모델의 성능을 검증하여 과적합 여부를 판단합니다. 이러한 검증용 데이터를 인풋으로 넣었을 때 성능 저하가 심하면 과적합으로 판단하고 모델을 수정하기 시작해야 합니다.
(제가 얼마 전 연습용으로 썼던 타이타닉 데이터에서도 train/test 데이터로 두가지로 나눈 것도 이러한 이유 때문인 것 같습니다!)
<교차 검증(Cross validation)>
검증을 약간 변형한 기법으로, 학습데이터 = 학습용 + 검증용 데이터로 나눈것은 같지만 두 데이터를 고정하지 않고 계속 바꿔준다는 것이 기존의 검증과는 다른 점입니다. 왜냐하면 검증용 데이터를 고정해 놓으면 또한 모델이 검증용 데이터에도 고적합될 여지가 있기 때문입니다.
따라서, 검증용 데이터를 고정시키지 않고 무작위로 바꿔서 과적합 여부를 더 잘 판단하도록 하는 게 포인트 입니다!
<온라인 검증>
데이터가 너무 많을 때 사용하는 기법으로 한번에 처리하지 않고 조금씩 나누는 것을 말합니다.
또 신규데이터가 지속적으로 유입되는 상황에서 사용되는 모델이기도 합니다.
'Data Science > Machine Learning' 카테고리의 다른 글
[ML] Softmax Regression(다중분류모델) (0) | 2020.03.11 |
---|---|
[ML] Logistic Regression for Classification (0) | 2020.03.11 |
[ML] Linear Regression(선형회귀분석) (0) | 2020.02.24 |
[ML] 머신러닝 모델: Decision Tree(의사결정나무) (0) | 2019.11.24 |
[Neural Network] ANN(인공신경망) (0) | 2019.11.18 |