2026-11-02 · 머신러닝 · 학습과 추론 · 레이블 · 과적합 · Cursor
지난주에는 이미 학습된 모델에 업무를 보내 브리핑을 받았습니다. 이번에는 모델이 만들어지는 과정을 직접 봅니다. 꽃의 네 가지 측정값으로 품종을 학습하고, 정답을 일부러 틀리게 줬을 때 무엇이 달라지는지 비교합니다. 마지막에는 브라우저에서 토큰과 어텐션을 관찰합니다.
01 · 지난주에 우리는 학습시킨 걸까?
24주차의 JSON → 사내 LLM → 브리핑은 이미 학습된 모델을 사용하는 추론입니다. 프롬프트에 업무 목록을 넣는 것은 이번 요청의 참고 자료를 제공하는 것이며, 그 요청으로 모델 가중치를 직접 학습시키는 것과는 다릅니다.
| 표시 | 기존 자료 | 이번 연결 |
|---|---|---|
| 복습 | 24주차 요청 흐름, 토큰과 한도 | 추론과 학습, 모델마다 다른 토큰 |
| 복습 | 21주차 CSV·JSON·DB | 입력 데이터와 평가 결과를 파일로 확인 |
| 확장 | 5주차 Make 동작, 7주차 n8n 흐름 | 사람이 정한 조건으로 분기하는 규칙 기반 처리 |
| 확장 | 17주차 AI Builder | 사용자 지정 모델에 샘플·필드 정답을 제공하는 이유. 생성형 프롬프트 사용과 구별 |
| 확장 | 2주차 RAG, 6주차 LLM | 임베딩·다음 토큰 예측의 원리 |
| NEW | 이번 주 | 학습·평가 분리, 레이블 오류, 일반화·과적합 |
이번에는 LLM을 직접 학습시키지 않습니다. 숫자 네 개로 꽃 품종을 예측하는 결정트리를 CPU에서 학습합니다. API 키·웹캠·GPU가 필요하지 않습니다.
02 · 규칙을 쓰다가 규칙을 배우게 하다
스팸 필터에 ‘무료라는 말이 있으면 차단’이라고 쓰면 정상적인 무료 교육 안내도 막힐 수 있습니다. ‘무 료’처럼 띄어 쓴 변형은 놓칠 수 있습니다. 예외가 늘면 규칙 조합과 유지보수 부담이 커집니다. ‘귀가 뾰족하면 고양이’라는 규칙도 귀가 접힌 스코티시 폴드에는 맞지 않습니다. 한 특징만으로 복잡한 대상을 판단하기 어렵다는 예입니다.
규칙 기반이 쓸모없어진 것은 아닙니다. 결제 조건·권한 검사처럼 기준을 명확히 정할 수 있는 곳에서는 여전히 중요합니다. 자동화와 머신러닝도 함께 사용할 수 있습니다.
지도학습은 입출력을 뒤집어 생각하기
| 단계 | 넣는 것 | 나오는 것 |
|---|---|---|
| 사람이 규칙 작성 | 데이터 + 사람이 쓴 규칙 | 결과 |
| 지도학습 | 데이터의 특징 + 정답(레이블) + 학습 알고리즘 | 학습된 모델 |
| 학습 후 추론 | 새로운 데이터의 특징 + 학습된 모델 | 예측 |
‘데이터 + 정답 → 규칙’은 지도학습을 이해하기 위한 비유입니다. 알고리즘·설정·데이터 선택은 사람이 설계합니다. 모든 머신러닝에 사람이 붙인 정답이 필요한 것은 아니며, 비지도학습·자기지도학습처럼 다른 방식도 있습니다.
특징을 고르는 일도 설계다
Feature(특징)는 판단에 사용하는 입력입니다. Feature Engineering은 어떤 입력과 표현을 사용할지 설계하는 일입니다. Iris의 꽃받침·꽃잎 길이와 너비 네 개도 사람이 고른 특징입니다. 전통적 머신러닝도 이미지·음성을 다뤘지만 유용한 특징을 만드는 데 많은 노력이 필요했습니다.
딥러닝은 여러 층의 신경망으로 유용한 표현을 함께 학습합니다. 그렇다고 데이터 수집·정답 검수·모델 설계·평가가 자동으로 해결되지는 않습니다.
큰 흐름과 전환점
| 흐름·시점 | 해결하려는 문제와 변화 |
|---|---|
| 규칙 기반 | 사람이 판단 조건을 명시. 복잡한 예외를 모두 적는 부담 |
| 머신러닝 | 데이터에서 예측 패턴을 학습. 특징과 정답의 품질이 중요 |
| CUDA 공개 SDK 2007 | GPU를 범용 계산에 활용하는 도구가 확산. CUDA 아키텍처 발표 2006과 구별 |
| AlexNet 2012 | 대규모 레이블 이미지·GPU·학습 기법을 결합해 이미지 분류 성능 향상 |
| ResNet 2015 | 잔차 연결로 깊은 신경망의 최적화를 돕는 구조 제안 |
| 이후 도구 확산 | TensorFlow 2015 공개, PyTorch 2016 개발 시작·2017 이후 확산 |
| Transformer 2017 | 어텐션 중심 구조로 문맥 처리와 학습 병렬화에 기여 |
| LLM | 대규모 언어 데이터로 학습한 모델을 다양한 언어 작업에 활용 |
2012년의 성과는 ‘그때 TensorFlow·PyTorch가 생겨서’가 아닙니다. ImageNet의 대규모 레이블 데이터, GPU 계산, 신경망 구조와 학습 기법이 함께 작용했습니다. 두 프레임워크는 이후 확산을 가속했습니다. NVIDIA CUDA 자료 · TensorFlow 공개일 · PyTorch 개발 역사
레이블은 저절로 생긴 진리가 아닙니다. ImageNet처럼 사람이 확인·분류한 데이터가 있고, 수집·검수 비용과 판단 기준이 필요합니다. 이번에도 정답의 품질을 직접 바꿔 봅니다. 근거가 불명확한 라벨링 건당 단가는 제시하지 않습니다.
논문 숫자를 읽는 방법
| 사례 | 원문에 보고된 수치 | 읽을 때 주의 |
|---|---|---|
| AlexNet, ILSVRC 2012 | Top-5 오류율 15.3%, 다음 순위 26.2% | 정답이 상위 5개 후보 안에 없는 비율. 일반 정확도와 구별 |
| ResNet, ILSVRC 2015 | 앙상블 Top-5 오류율 3.57% | 특정 대회·데이터·앙상블 결과. 모든 시각 업무에서 인간을 넘었다는 뜻이 아님 |
03 · 학습과 평가를 나눠야 하는 이유
특징 + 레이블 → 학습 → 모델 → 처음 보는 특징 → 예측 → 정답과 비교
| 용어 | 꽃 감별사에서의 의미 |
|---|---|
| 특징 | 꽃받침 길이·너비, 꽃잎 길이·너비(cm) |
| 레이블 | setosa, versicolor, virginica 중 실제 품종 |
| 학습 | 측정값과 품종을 보고 분기 기준을 만드는 과정 |
| 모델 | 학습된 결정트리. 예: 특정 측정값을 기준으로 가지를 나눔 |
| 추론 | 새 측정값을 트리에 넣어 품종을 예측 |
| 정확도 | 맞힌 수 ÷ 평가한 전체 수 |
| 일반화 | 학습에서 보지 않은 데이터에서도 잘 작동하는 성질 |
학습 데이터를 시험지로 다시 쓰면 점수가 좋게 보일 수 있습니다. 먼저 학습용과 평가용을 나눕니다. 평가 정답은 점수를 계산할 때만 사용하고 학습에는 넣지 않습니다. 평가 데이터의 정보가 학습이나 설정 선택에 새어 들어가면 데이터 누수가 됩니다. scikit-learn 주의사항
과적합은 학습 데이터의 세부사항이나 잡음까지 따라가 새로운 데이터에 잘 대응하지 못하는 현상입니다. ‘시험 문제를 외운 학생’이라는 비유가 도움이 됩니다. 학습 점수와 평가 점수 차이가 단서지만, 차이 하나만으로 모든 실패 원인을 확정하지는 않습니다.
평가 결과를 반복해서 보며 최적 설정을 고르면 평가 데이터에도 맞추게 됩니다. 실제 모델 선택에는 별도 검증 데이터나 교차검증을 사용하고 최종 평가는 따로 남겨야 합니다. 이번 비교는 원리를 관찰하는 교육용 실험입니다.
04 · Cursor 실습: 꽃 이름 감별사
완성 실습 ZIP · 실행 전 예시 보고서 · README
Python 3.12 이상과 Cursor를 준비합니다. 패키지 설치에는 인터넷이 필요하지만 Iris는 scikit-learn에 포함되어 있어 별도 데이터·모델 다운로드나 API 호출은 없습니다. 꽃 사진을 인식하는 앱이 아니라 측정값 네 개를 분류합니다. Iris 데이터
ZIP을 풀고 train.py가 있는 learning-lab 폴더를 Cursor에서 엽니다. 학습용 105건·평가용 45건으로 나누며 품종 비율을 유지합니다. 분할·모델·오류 시드는 42입니다.
Cursor에 붙여넣을 프롬프트
Python 3.12+와 scikit-learn으로 Iris 꽃 품종 분류 실습을 만들어줘.
API·DB·웹 서버 없이 train.py 한 번 실행해 정적 HTML 보고서와 CSV·JSON을 생성해줘.
load_iris의 150행에 원본 row_id를 붙이고 test_size=0.3, stratify=y, random_state=42로 먼저 분리해줘.
같은 분할에서 시나리오 A는 원본 학습 정답, B는 학습 정답 일부만 다른 품종으로 바꿔줘.
--noise 기본 0.2, numpy default_rng(42)로 중복 없이 floor(학습 건수*비율)개 행을 고르고
각 행의 원래 품종을 제외한 나머지 두 품종 중 하나로 바꿔줘. 평가 정답은 바꾸지 마.
각 시나리오에서 DecisionTreeClassifier(max_depth=2 또는 None, random_state=42)를 학습해줘.
학습 점수(받은 정답 기준), 학습 점수(원본 기준), 평가 점수·오분류를 모두 표시해줘.
보고서는 네 모델 비교, 모델별·오분류 필터, 바뀐 레이블 목록과 실제값·예측값을 보여줘.
data.csv에 split·원본 정답·B 정답·오류 여부를, predictions.csv에 행별 평가 결과를 저장해줘.
results.json에 설정·버전·분할 ID·점수·입력·예측을 포함해줘.
--train-per-class 3 옵션과 별도 --output 폴더도 지원하고, README에 PowerShell 명령을 써줘.
점수는 직접 계산하고 어떤 모델이 반드시 이긴다고 정하지 마.
실행 명령
py -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
.\.venv\Scripts\python.exe train.py
Start-Process .\output\report.html
py가 없으면 python --version 확인 후 첫 명령의 py를 python으로 바꿉니다. 가상환경 활성화는 필요 없습니다. 보고서는 브라우저에서 열고 CSV·JSON은 Cursor에서 열어 봅니다. 실행이 끝나면 서버 없이 파일만 남습니다. 같은 출력 폴더로 다시 실행하면 이 실습이 만든 네 결과 파일을 덮어씁니다.
| 결과 파일 | 확인할 내용 |
|---|---|
| output/report.html | 네 모델 성능, 실제 품종·예측, 오분류 필터 |
| output/data.csv | 네 특징, split(train/test), 원본·B 정답, label_changed |
| output/predictions.csv | 같은 평가 45건에 대한 네 모델의 예측 180개 |
| output/results.json | 설정·라이브러리 버전·분할 행 ID·점수·입력·예측 |
05 · 원본과 틀린 정답을 비교하기
A: 정답을 그대로 주기
깊이 2 트리와 깊이 제한 없는 트리를 비교합니다. 이 데이터에서는 깊은 트리의 평가 점수가 더 좋을 수 있습니다. 복잡한 모델을 무조건 나쁘다고 결론내리지 않습니다.
B: 학습 정답 20%를 일부러 바꾸기
학습 105건 중 21건을 다른 품종으로 바꿉니다. 꽃 측정값과 평가 데이터 정답은 그대로입니다. default_rng(42)로 행을 중복 없이 선택하고, 선택한 각 정답을 나머지 두 품종 중 하나로 바꿉니다. 받은 정답에 얼마나 충실했는지와 원래 품종을 얼마나 잘 맞혔는지를 구별합니다.
| 시나리오 | 깊이 2 학습 / 평가 | 깊이 제한 없음 학습 / 평가 |
|---|---|---|
| A 원본 | 0.971 / 0.889 | 1.000 / 0.933 |
| B 레이블 20% 오류 | 0.790 / 0.933 | 0.990 / 0.756 |
실행 환경: scikit-learn 1.9.1 · NumPy 2.5.4. 학습 점수는 받은 정답 기준입니다.
위 표는 이 코드와 고정 환경에서 실제 계산한 값입니다. 사전 계획의 B 점수와 다를 수 있는 이유는 같은 시드 숫자라도 난수 생성기·오류 행 선정 방식에 따라 바뀐 레이블이 달라지기 때문입니다. 숫자를 맞추기 위해 결과를 수정하지 않습니다. 보고서와 JSON의 설정·버전을 함께 확인하세요.
B의 학습 점수는 잘못된 레이블도 정답으로 취급한 점수입니다. 따라서 학습 1.000에 가깝더라도 실제 품종을 잘 안다는 뜻이 아닙니다. 같은 네 특징을 가진 행에 서로 다른 레이블이 붙으면 깊이 제한을 없애도 모두 맞힐 수 없습니다.
확인 순서
- A의 두 모델에서 학습 점수와 평가 점수를 비교합니다.
- B의 ‘학습 점수(받은 정답)’와 ‘학습 점수(원본 정답)’를 비교합니다.
- 보고서의 모델 필터와 ‘오분류만 보기’를 사용해 틀린 품종과 행 ID를 찾습니다.
- data.csv에서 label_changed=True인 행이 train에만 있는지 확인합니다. test는 원본 정답을 유지합니다.
- predictions.csv의 정답 수를 세어 보고서 정확도와 맞는지 확인합니다.
‘데모는 완벽했는데 실전은 엉망’일 때 데이터 품질과 다양성은 중요한 점검 대상입니다. 다만 모든 실패를 과적합으로 단정하지 않습니다. 실제 입력 분포·평가 방식·운영 구현도 확인해야 합니다. 29주차의 데이터 오너십에서는 누가 정답 기준을 정하고 데이터를 검수·갱신할지로 이어갑니다.
선택 실험
.\.venv\Scripts\python.exe train.py --noise 0.3 --output output-noise30
.\.venv\Scripts\python.exe train.py --train-per-class 3 --output output-small
첫 명령은 학습 레이블 오류 비율을 늘립니다. 두 번째는 같은 평가 45건을 유지한 채 학습 자료를 품종별 3건, 총 9건으로 줄입니다. 선택되지 않은 학습 후보는 unused로 표시하고 평가에 합치지 않습니다. 소수점 이하는 버리므로 9건의 20%는 1건만 바꿉니다. 점수가 반드시 떨어진다고 가정하지 말고 실제 결과와 표본의 작음을 함께 읽습니다.
내 업무에서 ‘규칙을 적기 어려워 자동화하지 못한 일’을 한 문장으로 적어 둡니다. 30~31주차 발표의 출발점이 될 수 있습니다.
막혔을 때
| 증상 | 확인 |
|---|---|
| 패키지 설치 실패 | Python 3.12 이상인지, 네트워크와 .venv의 python.exe 사용 여부 |
| 보고서가 안 열림 | 명령의 마지막 출력 경로, output/report.html을 브라우저로 열었는지 |
| 점수가 다름 | 시드뿐 아니라 오류 적용 방식·학습 건수·버전도 비교 |
| CSV 저장 실패 | Excel 등에서 열려 있으면 닫고 출력 폴더 권한 확인 |
| 학습 100%인데 평가 실패 | 평가 누수 여부, 레이블 품질과 두 점수의 기준 확인 |
설치가 어려우면 먼저 제공된 예시 보고서를 열고 데이터·예측 파일을 비교합니다.
06 · 딥러닝에서는 무엇을 바꿀까?
이번 결정트리는 분기 기준을 학습합니다. 신경망은 여러 층의 계산에 쓰는 가중치 등을 학습합니다. 둘을 같은 알고리즘으로 설명하지 않습니다.
예측 → 손실 계산 → 역전파로 기울기 계산 → 최적화 알고리즘으로 가중치 갱신 → 반복
| 개념 | 뜻과 비유 |
|---|---|
| 가중치 | 입력이 계산에 미치는 영향, 조절하는 손잡이 |
| 편향(bias) | 계산의 기준을 이동시키는 학습 매개변수 |
| 활성화 함수 | 비선형 변환. 단순히 켜고 끄는 문이라고만 생각하지 않기 |
| 손실 함수 | 예측이 목표에서 얼마나 벗어났는지 재는 척도 |
| 역전파 | 손실에 대한 매개변수의 기울기를 뒤로 계산 |
| 경사하강법·학습률 | 기울기를 이용해 조정하는 방법과 한 번에 움직이는 크기 |
| 에포크 | 전체 학습 자료를 한 번 훑는 단위 |
이미지 신경망에서는 낮은 층의 경계·질감에서 더 복잡한 표현으로 이어지는 경향을 볼 수 있습니다. ‘선 → 귀·눈 → 얼굴’은 직관을 돕는 그림이지 모든 모델의 층에 정확히 같은 역할이 정해져 있다는 뜻은 아닙니다.
07 · 단어를 숫자로, 문맥을 연결하기
토큰 ID는 구별을 위한 번호입니다. 번호 차이가 곧 의미 차이는 아닙니다. 임베딩은 토큰 등을 여러 숫자로 표현한 벡터입니다. GPS가 위치를 좌표로 표현하듯 관계를 좌표로 표현한다고 비유할 수 있지만 실제 지도나 고정된 의미 사전은 아닙니다.
왕–여왕, 사과–배, 연차–휴가는 관계를 생각해 볼 예입니다. 유사도 순위나 수치는 모델·문맥·표현 방법에 따라 달라집니다. ‘배’가 과일인지 선박인지도 문맥이 필요합니다. 이번에는 임베딩 모델을 다운로드하거나 유사도를 계산하지 않고 RAG 주차로 넘깁니다.
어텐션은 현재 토큰의 표현을 만들 때 다른 위치의 정보를 얼마나 반영할지 계산하는 방식입니다.
| 기호 | 역할 | 비유 |
|---|---|---|
| Q(Query) | 어떤 정보와 연결할지 비교하는 표현 | 찾으려는 질문 |
| K(Key) | 비교 대상의 표현 | 색인 항목 |
| V(Value) | 가중합으로 가져올 정보의 표현 | 본문 내용 |
Q와 K로 관련 정도를 계산하고, 그 가중치로 V를 섞습니다. 실제 Q·K·V는 학습된 변환으로 만든 벡터입니다. 연결선이 굵다고 사람이 생각하는 이유를 완전히 설명하는 것은 아닙니다.
Transformer는 어텐션 중심 구조로 발전한 계열이며 2017년 원 논문은 번역을 다뤘습니다. 현재의 모든 LLM 동작이나 학습 방법이 그 논문 하나에서 동시에 완성된 것은 아닙니다. 생성형 모델은 앞의 토큰을 바탕으로 다음 토큰 후보 분포를 계산하고 선택한 토큰을 이어 갑니다. 학습 시 병렬화와 생성 시 순차 출력은 구별합니다. Transformer 원문
08 · 브라우저로 LLM 안을 관찰하기
OpenAI Tokenizer
토크나이저 열기. 코드 설치·API 키 없이 공개 예문을 넣어 토큰 경계와 개수를 관찰합니다. 모델·인코딩 선택이 있으면 선택값도 기록합니다.
| 넣어볼 내용 | 관찰 질문 |
|---|---|
| 안녕 | 몇 조각으로 나뉘는가? ‘항상 2개’라고 고정하지 않기 |
| 고양이가 의자 위에 앉아 있다. / The cat is sitting on the chair. | 같은 뜻의 한국어·영어에서 개수가 어떻게 다른가? |
| 본인 이름 또는 가상 이름 | 단어 하나가 여러 토큰으로 나뉘는가? |
토크나이저는 모델마다 다릅니다. 여기서 본 OpenAI 토큰 수를 24주차 사내 Claude 모델의 사용량이나 요금으로 그대로 적용하지 않습니다. 한국어가 항상 고정 배수로 더 많다는 규칙도 없습니다. 실제 업무 문서 대신 공개 예문을 사용합니다. OpenAI 공식 토큰 개념
Transformer Explainer
Transformer Explainer 열기. GPT-2 기반 교육 도구로, 이번 관찰은 영어 예문을 사용합니다. 이를 사내 Claude 모델의 실제 내부 화면으로 설명하지 않습니다.
The black cat sat on the deserted planet
- 예문을 입력하고 Generate로 다음 토큰 생성을 관찰합니다.
- 어텐션의 위치 간 연결과 가중치가 어떻게 다른지 확인합니다. black–cat 연결이 반드시 가장 굵다고 정답을 정하지 않습니다.
- 마지막 다음 토큰 후보와 확률 분포를 봅니다. 후보 확률은 ‘그 문장이 사실일 확률’이 아닙니다.
- 모델 규모와 구성은 이 도구의 GPT-2 예시이며 모든 GPT·LLM이 같은 층·헤드 수를 가진다고 일반화하지 않습니다.
공개 도구가 막히거나 모델 로딩이 오래 걸리면 강사 화면으로 관찰하고 예문·예상과 다른 점을 기록합니다. 이번 주에는 Temperature·Top-P를 비교 실험하지 않고 26주차로 연결합니다.
09 · 비유로 정리하고 다음 주로
| 개념 | 기억할 비유와 한계 |
|---|---|
| 규칙 기반 | 스팸 필터 예외 추가. 명확한 규칙은 여전히 유효 |
| 지도학습 | 문제와 정답을 보고 판단법을 배우기. 정답 검수가 필요 |
| 과적합 | 시험지를 외운 학생. 평가 실패 원인은 이것만이 아님 |
| 임베딩 | 의미 관계의 GPS. 실제 지리나 고정 의미 지도가 아님 |
| Q·K·V | 질문·색인·본문. 실제로는 학습된 수치 벡터 |
| 다음 토큰 | 후보마다 무게가 다른 주사위. 선택 방식에 따라 결과가 달라짐 |
완료 체크: 학습과 추론을 구별하고, 평가 정답을 학습에 쓰지 않은 이유를 설명할 수 있나요? B에서 높은 학습 점수가 왜 실제 품종을 잘 맞혔다는 뜻이 아닌지, 잘못된 레이블이 어느 행에 있는지 확인했나요?
다음 주는 이해에서 제어로 — Temperature·Top-P와 LLM의 한계입니다. 실행 환경은 26주차에서 안내하며 이번에는 API 키 발급·충전을 준비물로 요구하지 않습니다.