머신러닝의 원리
규칙을 손으로 적는 대신 예제에서 규칙을 찾게 하는 방법이 머신러닝이다. 손실을 줄이는 경사 하강, 과적합을 막는 검증, 결과를 재는 지표, 표 데이터에 강한 트리 앙상블까지 계산한 그림으로 따라간다.
목차 (10)
데이터에서 배운다는 것
AI·머신러닝·딥러닝의 관계는 AI 기초에 정리했다. 여기서는 그 가운데 머신러닝이 실제로 무엇을 하는지 본다. 재료는 네 가지다.
- 특징(feature): 예제 하나를 설명하는 값들. 집이라면 면적·방 수·역까지 거리.
- 정답(label): 맞히고 싶은 값. 집값, 스팸 여부.
- 모델: 특징을 받아 예측을 내는 함수. 안에 조절할 수 있는 수(가중치, 파라미터)가 들어 있다.
- 손실(loss): 예측이 정답과 얼마나 다른지를 수 하나로 잰 값. 학습은 이 값을 줄이는 쪽으로 가중치를 고치는 일이다.
예측 → 손실 → 가중치 수정을 수많은 예제로 되풀이하면, 사람이 규칙을 적지 않아도 모델이 특징과 정답 사이의 관계를 흉내 내게 된다. 단, 배운 것은 어디까지나 학습에 쓴 데이터의 경향이다. 데이터가 치우쳐 있으면 모델도 그대로 치우친다.
학습의 세 갈래: 지도 · 비지도 · 강화
- 지도 학습: 정답이 붙은 예제로 배운다. 연속값을 맞히면 회귀(집값), 부류를 고르면 분류(스팸인가)다. 실무 머신러닝의 대부분이 여기에 속한다.
- 비지도 학습: 정답 없이 데이터의 구조를 찾는다. 비슷한 것끼리 묶는 군집, 특징 수백 개를 몇 개로 줄이는 차원 축소(PCA 등)가 대표적이다. 정답을 붙이는 비용이 클 때 먼저 데이터를 훑어보는 데 쓴다.
- 강화 학습: 에이전트가 환경에서 행동하고 보상을 받으며, 앞으로 받을 보상의 합이 커지는 행동 방식을 배운다. 정답 대신 늦게 오는 보상만 있다는 점이 다르다. 게임, 로봇 제어, 그리고 LLM을 사람 선호에 맞추는 단계(RLHF)에도 쓰인다.
비지도 학습의 가장 단순한 예가 k-평균이다. 무리 개수 k를 정하고, ① 점마다 가장 가까운 중심에 배정 ② 중심을 자기 점들의 평균 자리로 이동을 되풀이한다. 두 단계 모두 "점과 중심 사이 거리 제곱의 합"을 늘리지 않으므로 언젠가 멈춘다. 다만 처음 중심을 어디 두느냐에 따라 나쁜 답에서 멈출 수 있어, 실제로는 여러 번 돌리거나 시작점을 고르게 흩는 방법(k-means++)을 쓴다.
중심 3개를 아무 데나 놓는다. 일부러 한쪽에 몰아 두었다.
손실과 경사 하강
가중치가 수백만 개라면 하나하나 바꿔 보며 손실을 재는 것은 불가능하다. 대신 손실을 가중치로 미분한 기울기(gradient)를 구한다. 기울기는 손실이 가장 빨리 커지는 방향이므로, 그 반대쪽으로 조금 움직이면 손실이 준다. 이것이 경사 하강이다.
w ← w − 학습률 × 기울기에서 학습률이 한 걸음의 크기다. 너무 작으면 바닥까지 오래 걸리고, 너무 크면 바닥을 건너뛰어 반대편 더 높은 곳에 떨어지며 발산한다. 실제 학습에서는 데이터 전체가 아니라 일부(미니배치)로 기울기를 어림해 빠르게 여러 번 움직이는데, 이를 확률적 경사 하강(SGD)이라 한다. 더 나은 최적화기는 딥러닝 노트에서 다룬다.
세 경로 모두 w = 0(손실 10)에서 출발한다. 기울기가 음수이니 w를 키우는 쪽이 내리막이다.
과적합과 편향–분산, 규제
목표는 학습 데이터를 외우는 것이 아니라 처음 보는 데이터에서 잘 맞히는 것(일반화)이다. 아래 그림은 sin 곡선에 잡음을 더한 점 8개에 다항식을 맞춘 결과다. 1차 직선은 학습 점조차 못 따라가는 과소적합, 7차 다항식은 점 8개를 모두 정확히 지나(학습 오차 0.000) 점 사이에서 크게 출렁이는 과적합이다. 검증 오차는 3차가 0.017로 가장 낮고, 7차는 0.218로 크게 나빠진다.
- 편향(bias): 모델이 너무 단순해서 생기는 체계적인 오차. 1차 직선은 데이터를 아무리 많이 줘도 곡선을 못 그린다.
- 분산(variance): 학습 데이터가 조금만 달라져도 결과가 크게 흔들리는 정도. 7차 다항식은 점 하나만 옮겨도 곡선 모양이 확 바뀐다.
- 복잡한 모델일수록 편향은 줄고 분산은 커진다. 그 사이의 균형점을 찾는 것이 편향–분산 트레이드오프다.
규제(regularization)는 복잡한 모델을 쓰되 가중치가 커지는 것에 벌점을 줘 분산을 누르는 방법이다. 손실에 가중치 제곱합을 더하면 L2(릿지), 절댓값 합을 더하면 L1(라소, 쓸모없는 특징의 가중치를 0으로 만든다)이다. 같은 7차 다항식에 작은 L2 벌점만 줘도 검증 오차가 0.036로 내려간다. 데이터를 더 모으는 것, 학습을 일찍 멈추는 것(early stopping)도 같은 효과를 낸다.
데이터 나누기와 교차 검증
과적합을 알아채려면 학습에 쓰지 않은 데이터로 재야 한다. 보통 셋으로 나눈다.
- 학습(train): 가중치를 맞추는 데 쓴다.
- 검증(validation): 모델 종류, 다항식 차수, 규제 세기 같은 설정(하이퍼파라미터)을 고르는 데 쓴다.
- 시험(test): 모든 선택이 끝난 뒤 한 번만 성능을 잰다. 시험 점수를 보고 설정을 다시 고치면 시험 데이터에도 과적합해 점수가 부풀려진다.
데이터가 적으면 검증 몫 하나로 고른 결과가 운에 좌우된다. k겹 교차 검증은 학습+검증 몫을 k조각으로 나눠, 조각마다 한 번씩 검증에 쓰고 나머지로 학습해 k개 점수의 평균을 본다. 시간 순서가 있는 데이터(주가, 로그)는 미래로 과거를 맞히지 않도록 시간 순으로 잘라야 하고, 같은 사람의 데이터가 학습과 검증에 함께 들어가지 않게 묶어서 나눠야 한다. 이런 누수(leakage)가 실무에서 흔한 실수다.
전처리도 누수의 통로다. 표준화의 평균·표준편차, 결측값을 채울 중앙값, 특징 선택을 데이터 전체로 구한 뒤 나누면 검증·시험 몫의 정보가 학습에 섞인다. 무작위 특징 1만 개로 정답과 무관한 데이터를 만들어도, 나누기 전에 특징을 고르면 정확도가 0.5가 아니라 0.76쯤으로 부풀려진다는 예가 scikit-learn 문서에 있다. 먼저 나누고, 통계는 학습 몫에서만 구해 나머지에 그대로 적용한다. 스케일링·인코딩 방법 자체는 빅데이터 노트의 전처리 절에 있다.
검증 몫으로 하이퍼파라미터를 고를 때 후보를 격자로 모두 시험하는 격자 탐색보다, 범위 안에서 무작위로 뽑는 무작위 탐색이 같은 횟수로 더 좋은 설정을 찾는 경우가 많다. Bergstra · Bengio(2012)는 대부분의 데이터에서 성능을 크게 좌우하는 하이퍼파라미터는 몇 개뿐이고, 격자는 덜 중요한 축에 시도를 낭비하는 반면 무작위 탐색은 중요한 축의 서로 다른 값을 더 많이 시험하기 때문이라고 설명했다. 앞선 결과를 보고 다음 후보를 고르는 베이즈 최적화도 널리 쓰인다.
평가 지표: 혼동 행렬, 정밀도·재현율, ROC-AUC
분류 모델은 보통 점수(확률)를 내고, 문턱을 넘으면 양성으로 판정한다. 결과를 네 칸으로 세면 혼동 행렬이 된다. 환자 12명(실제 환자 6명) 예에서 문턱 0.5로 판정하면 다음과 같다.
- 정확도 = 맞힌 수 / 전체 = 0.75. 양성이 1%뿐인 데이터라면 "전부 음성"이라고만 해도 0.99가 나오므로, 부류가 치우친 문제에서는 정확도만 보면 속는다.
- 정밀도(precision) = TP / (TP + FP) = 0.71. 양성이라고 한 것 중 진짜 양성의 비율. 헛경보가 비쌀 때(스팸 필터가 중요한 메일을 버리면 곤란) 중요하다.
- 재현율(recall) = TP / (TP + FN) = 0.83. 진짜 양성 중 찾아낸 비율. 놓치는 것이 비쌀 때(암 검진) 중요하다.
- F1 = 정밀도와 재현율의 조화 평균 = 0.77. 둘 중 하나가 낮으면 크게 깎인다.
문턱을 낮추면 재현율은 오르고 정밀도는 내려간다. 문턱을 끝에서 끝까지 움직이며 (거짓 양성률, 참 양성률)을 이은 것이 ROC 곡선이고, 그 아래 넓이가 AUC다. AUC는 "양성 하나와 음성 하나를 무작위로 뽑았을 때 양성 점수가 더 높을 확률"과 같아 문턱과 무관하게 순위 매기는 능력을 잰다. 이 예는 0.92이고, 무작위로 찍으면 0.5다. 양성이 아주 드물면 ROC가 실제보다 좋아 보이므로 정밀도–재현율 곡선을 함께 본다. 회귀는 평균 제곱 오차(MSE), 평균 절대 오차(MAE)를 주로 쓴다.
양성이 아주 드문 부류 불균형(사기 거래, 희귀 질환)에서는 모델이 다수 부류만 찍어도 손실이 작아 소수 부류를 무시하기 쉽다. 흔한 대응은 셋이다. 손실에서 소수 부류의 오차에 더 큰 가중치를 주고, 학습 몫에서만 소수 부류를 늘리거나 다수 부류를 줄여 다시 뽑고, 판정 문턱을 0.5에 고정하지 않고 검증 몫에서 비용에 맞게 다시 정한다. 어느 쪽이든 평가는 원래 비율 그대로인 데이터에서 정밀도·재현율로 한다.
결정 트리, 랜덤 포레스트, 그래디언트 부스팅
결정 트리는 "x < 4인가?" 같은 질문을 이어 붙여 예제를 나누는 모델이다(자료 구조로서의 트리는 알고리즘 노트에 있다). 매 마디에서 가능한 모든 질문을 시험해, 나눈 뒤 각 쪽이 가장 "한 부류만 남은" 상태가 되는 질문을 고른다. 섞인 정도는 지니 불순도(1 − Σ 비율²)나 엔트로피로 잰다. 결과를 사람이 그대로 읽을 수 있고 특징의 단위를 맞출 필요도 없지만, 깊게 키우면 학습 데이터를 외워 과적합하기 쉽다.
트리 하나는 불안정하니 여럿을 합친다(앙상블). 방법은 두 갈래다.
- 랜덤 포레스트(배깅): 데이터를 복원 추출한 여러 표본과, 마디마다 무작위로 고른 일부 특징으로 깊은 트리를 수백 그루 따로 키워 투표(평균)한다. 서로 다르게 틀리는 트리를 평균하니 분산이 준다. 설정을 별로 만지지 않아도 잘 돌아가는 튼튼한 기준선이다.
- 그래디언트 부스팅: 얕은 트리를 차례로 키운다. 다음 트리는 앞 트리들이 남긴 오차(정확히는 손실의 기울기)를 맞추고, 그 결과를 학습률만큼 줄여 더한다. 편향을 조금씩 깎는 방식이다. XGBoost는 여기에 규제 항, 결측값 처리, 병렬·대용량 처리를 더해 널리 퍼졌고, LightGBM·CatBoost가 뒤를 이었다.
처음 예측은 모든 점의 평균 2.85인 수평선이다. 평균 제곱 오차 2.09.
고전 머신러닝과 딥러닝: 언제 무엇을
이미지·소리·글처럼 원시 신호에 공간·시간 구조가 있고 데이터가 아주 많으면 딥러닝이 압도적이다. 특징을 사람이 설계하지 않아도 망이 직접 배우기 때문이다. 반면 열마다 뜻이 정해진 표 데이터(고객 정보, 거래 기록, 센서 집계)에서는 지금도 그래디언트 부스팅 트리가 신경망과 같거나 더 낫다는 비교 연구가 많고, 학습도 빠르고 설정도 덜 까다롭다.
- 데이터가 수백~수천 건뿐이고 결정 근거를 설명해야 한다면 선형·로지스틱 회귀나 작은 트리가 낫다. 계수와 분기를 그대로 보여 줄 수 있다.
- 글·이미지 문제라도 처음부터 학습하기보다 이미 학습된 큰 모델을 가져와 조금 더 학습시키는(미세 조정) 것이 보통이다. LLM과 생성 모델 노트가 그 이야기를 잇는다.
- 어떤 경우든 "가장 많은 부류로 찍기", "평균으로 찍기" 같은 단순한 기준선부터 세워, 복잡한 모델이 그보다 얼마나 나은지로 판단한다.
흔한 오해
- "정확도 99%면 좋은 모델이다" — 양성이 1%면 전부 음성이라고만 해도 99%다. 기준선과 비교하고, 부류별 정밀도·재현율을 함께 본다.
- "중요도가 높은 특징이 결과의 원인이다" — 특징 중요도는 예측에 많이 쓰였다는 뜻일 뿐 인과가 아니다. 원인과 함께 움직이는 다른 값을 대신 잡았을 수 있고, 그 값을 바꾼다고 결과가 바뀌지는 않는다.
- "데이터는 많을수록 무조건 낫다" — 정답이 틀린 예제, 실제 쓰임과 다른 분포의 데이터는 많아도 도움이 안 되거나 해가 된다. 양보다 깨끗한 정답과 실제와 닮은 분포가 먼저다.
- "시험 점수가 곧 배포 뒤 성능이다" — 시험 몫은 과거 데이터에서 뗀 것이다. 배포 뒤 사용자·계절·입력 장치가 바뀌면 분포가 옮겨 가(데이터 드리프트) 성능이 서서히 떨어지므로, 입력 분포와 성능을 계속 지켜보고 주기적으로 다시 학습한다.
- "딥러닝이 고전 머신러닝을 모두 대체했다" — 표 데이터에서는 지금도 트리 앙상블이 강하다(위 절).
핵심 논문
딥러닝 쪽 논문은 딥러닝 노트, 분야 전체의 흐름은 논문 노트에 있다.
| 논문 | 연도 | 요지 | 원문 |
|---|---|---|---|
| Support-Vector Networks (Cortes · Vapnik) | 1995 | 두 부류 사이 여백이 가장 넓은 경계를 찾고, 커널로 비선형 경계까지 다루는 SVM을 정리했다. 딥러닝 전까지 분류의 표준이었다. | Springer |
| Random Forests (Breiman) | 2001 | 복원 추출 표본과 무작위 특징 선택으로 키운 트리를 투표시키면 트리 하나보다 훨씬 안정적이라는 것을 보이고, 특징 중요도 측정법도 제안했다. | Springer |
| Greedy Function Approximation: A Gradient Boosting Machine (Friedman) | 2001 | 부스팅을 "함수 공간에서의 경사 하강"으로 보고, 아무 미분 가능한 손실에나 쓸 수 있는 그래디언트 부스팅의 틀을 세웠다. | Project Euclid |
| Human-level control through deep reinforcement learning (Mnih 외, DQN) | 2015 | 화면 픽셀과 점수만 보고 아타리 게임 수십 종을 사람 수준으로 하는 에이전트를 만들어, 신경망과 강화 학습의 결합을 대중화했다. | Nature |
| XGBoost: A Scalable Tree Boosting System (Chen · Guestrin) | 2016 | 규제 항을 넣은 목적 함수, 희소·결측값을 고려한 분할, 캐시와 병렬 처리를 묶어 그래디언트 부스팅을 대용량에서도 빠르게 돌렸다. | arXiv |
| Why do tree-based models still outperform deep learning on tabular data? (Grinsztajn 외) | 2022 | 여러 표 데이터 벤치마크에서 트리 앙상블이 신경망보다 나은 이유를 쓸모없는 특징, 불규칙한 함수 모양 등에서 찾았다. | arXiv |
- Cortes & Vapnik (1995) — Support-Vector Networks
- Breiman (2001) — Random Forests
- Friedman (2001) — Greedy Function Approximation: A Gradient Boosting Machine
- Chen & Guestrin (2016) — XGBoost: A Scalable Tree Boosting System
- Mnih et al. (2015) — Human-level control through deep reinforcement learning
- Grinsztajn et al. (2022) — Why do tree-based models still outperform deep learning on tabular data?
- scikit-learn — 사용자 안내서
- scikit-learn — 교차 검증
- scikit-learn — 흔한 함정과 권장 사례(전처리 누수)
- Bergstra & Bengio (2012) — Random Search for Hyper-Parameter Optimization
- XGBoost 문서
- Google — Machine Learning Crash Course
- Sutton & Barto — Reinforcement Learning: An Introduction (2판, 저자 공개본)