당니의 개발자 스토리
More On Supervised Learning Beyond 본문

문제가 단순하면 모델도 단순해야 한다
요즘은 딥러닝이 유행이지만, 모든 문제에 딥러닝이 필요한 건 아니다
커다란 기계가 망치를 들고 못을 박고 있는 그림
사실 망치 하나만 있으면 되는 아주 쉬운 일인데 딥러닝을 과하게 쓰는 상황을 풍자한 것

실제로 간단한 문제에 딱 맞는 모델인 Naive Bayes
예를 들어 스팸 메일 필터링 같은 게 있다.
Naive Bayes는 이메일을 숫자 벡터로 바꿔서 처리한다.
메일 내용: "Buy cheap medicine"
단어 목록: [“a”, “aardvark”, ..., “buy”, ..., “zygmurgy”]
→ 그럼 이 메일은 “a”는 안 들어있고, “buy”는 들어있고...
→ 이런 식으로 0과 1로 표시된 벡터가 만들어짐 : x = [1, 0, 0, ..., 1, ..., 0]
Naive Bayes Assumption
x의 벡터들이 어떤 y가 주워졌을 때 독립이라는 가정.
다시 말해 y가 스팸메일이라고 하는 레이블이 주워졌다고 하면 각 단어가 등장하거나 등장하지 않을 확률이 전부 독립인 것.
즉 "buy"라는 단어가 들어 있는 것과 "cheap"이라는 단어가 들어 있는 건 관계 없다고 봄.
혹은 이메일이 스팸 메일이 아니라는 것이 주어져 있다고 한다면 각 단어가 등장할 확률이 기존과는 다르겠지만,
독립이라고 가정한다면 아주 간단하게 실제로 스팸 일 때 이 메일을 볼 확률을 각 확률의 곱으로 표현 할 수 있을 것임.
혹은 메일이 스팸이 아닐 때 이러한 단어 조합을 볼 확률도 이런 식으로 확률의 곱으로써 표현할 수 있다.

확률이라고 하는 것은 스팸일 때 이 단어가 등장하는 빈도, 확률, 혹은 스팸이 아닐 때 단어가 등장할 확률을
수많은 데이터로부터 계산하는 것은 어려운 일이 아님


Naive Bayes를 사용할 때 여러가지 문제가 발생할 수 있음.
예를 들어 첫번째로는 조건부 독립이라고 하는 가정이 현실과 맞지 않을 수도 있지만 늘 그런데도 합리적으로 작동 한다는 장점이 있고
그 다음에는 이 결과가 해석 가능하다는 장점이 있음.
그래서 이때 각 단어의 어떤 단어가 스팸메일임을 결정 하도록 하는 주요한 인자인지 하는 것을 우리가 나중에 이 모델을 해석 하는데 사용할 수 있다는 것도 장점이 된다.

그러면 한번도 나오지 않았던 단어가 나오면 우리는 어떤 판단을 내려야 될까?
예를 들어 "zygmurgy"라는 단어가 있는데,
이 단어는 학습 데이터에 한 번도 등장하지 않았다고 하자.
그럼 이 단어가 있는 메일을 보면 Naive Bayes는 이 단어의 확률을 0으로 줄 것임.
그런데 Naive Bayes는 단어들의 확률을 곱해서 전체 확률을 계산하는데,
어떤 단어의 확률이 0이 되면 곱 전체가 0이 되어버리는 문제가 생김.
→ 아무리 다른 단어들이 잘 맞아도 무조건 “스팸 아님”이라고 판단
그래서 이러한 '확률이 0이 나오는 문제'를 해결해야 한다 -> 해결법이 Laplace Smoothing

Laplace Smoothing의 핵심은 단어가 한 번도 안 나왔더라도 한 번은 나온 것처럼 간주하자는 것이다.
수식을 보면,
분자에 +1: "1번은 나왔다고 치자"
분모에 +2: "전체 경우의 수도 그만큼 늘었다고 보자"
단어 등장횟수 (스팸) 등장확률
| buy | 40번 | 40/100 = 0.4 |
| zygmurgy | 0번 | 0/100 = 0 |
이런 경우,
buy는 (1+40)/(2+100) = 41/102
zygmurgy는 (1+0)/(2+100) = 1/102
이렇게 계산하면 된다.
Laplace Smoothing의 기법을 사용하면 확률 0인 문제 없이 나이브 베이즈를 사용할 수 있다.
이제 Naive Bayes와 같은 확률 기반 모델과는 다른 종류의 모델인
Decision Tree (의사결정나무)에 대해서 소개하겠다.

Decision Tree는 마치 '질문 → 대답 → 또 질문' 식의 흐름도(플로우차트)이다.
각 질문은 어떤 조건을 검사하고, 그 조건에 따라 가지(branch)를 나누면서
최종적으로 결과(leaf)에 도달한다.
| Root Node | 시작 질문 (가장 위) | “털이 있나요?” |
| Internal Node | 중간 질문들 (결정 기준) | “알을 낳나요?” |
| Branch | 예/아니오 같은 결정 결과 방향 | “네” → 왼쪽 가지 / “아니오” → 오른쪽 가지 |
| Leaf Node | 최종 결과 (클래스 or 값) | “포유류입니다” 또는 “가격은 25만 달러입니다” |
예측과 같이 가을 추정해 내거나 하는 기법을 Decision Tree를 이용해서 구현할 수 있음.
Decision Tree는 어떤 면에서 강력 하냐면 우리가 해석 가능한 변수들을, 혹은 해석할 수 있는 변수들을 이용해서
우리가 이 모델을 해석할 수 있다는 장점이 있고
반면에 스스로 학습할 수 있는 능력이 조금 떨어지기 때문에 성능이 복잡한 과제에서는 떨어질 수 있다고 생각하면 된다.
의사 결정 나무는 말 그대로 나무를 그리게 되고, 중간 노드들은 결정을 의미 하게 되고,
그 다음에 뻗어 나가는 가지들은 해당 결정에서 어떤 결론을 내렸는가를 가지고 판단해서 어느 가지를 탈 것인가를 반복적으로 결정한다.
최종적으로 leaf node에 도달 하게 되면, leaf node 에 배정된 class label이라든지,
혹은 값이라고 한다면 그 값을 예측 문제에 적용하는 형태로 진행하게 된다.

동물이 포유류인지 아닌지 판단하기
단계별 질문으로 분류를 수행하는 게 Decision Tree의 핵심

분류(classification)뿐만이 아니라 숫자 예측(regression)도 할 수 있다.

분할 기준 (Splitting Criteria)
질문을 어디서 끊어야 할까? → 즉, 어떤 기준으로 가지를 나눌까?
| 분류(Classification) | 엔트로피(Entropy) | 데이터가 얼마나 섞여 있는지 측정 → 가장 깨끗하게 나뉘는 질문을 선택 |
| 회귀(Regression) | 분산(Variance) | 숫자 값들이 얼마나 퍼져 있는지를 기준으로 결정 |
복잡한 모델에는 적용이 어렵다는 단점
Decision Tree의 단점을 극복하기 위해 만들어진 방법들인 Bagging과 Random Forest를 설명할 것임.
가장 많이 사용되고 있는 이 tree의 응용 이라고 부를 수 있는 것이 Bagging 이라고 하는 과제

Decision Tree는 이해하기 쉽지만 너무 깊게 만들면 과적합(overfitting)이 발생
→ 훈련 데이터엔 잘 맞지만, 새 데이터엔 약함.
그래서 나온 것이 Bagging 이다.
Bagging 이라고 하는 과제는 이 tree를 여러개 활용해서, 종합적으로 앙상블 모델이 라고 하는 기법을 이용해서 평가하는 것이다.
* 앙상블 모델이란 여러 개의 모델을 결합해서 더 좋은 하나의 모델을 만드는 방법
Bagging은 여러 개의 다른 “훈련용 데이터 세트(Subset)”를 만들고,
그걸로 여러 개의 모델(여기서는 Tree)을 학습시킨다.
원래의 데이터셋이 있다고 하면, 여기서 무작위로 중복을 허용해서 작은 데이터셋 3개를 뽑는다.
그리고 각각 Tree를 따로 학습시킨다. 마지막으로 평균 or 투표로 최종 결정해요.
이렇게 하면 하나의 Tree가 데이터에 과하게 집착하는 걸 막을 수 있다.

Random Forest란?
Bagging보다 한 단계 더 간 평가 과제인데,
Bagging + 랜덤한 특성 조합으로 더 다양하고 강한 나무들 조합을 만들어낸다.
왼쪽 그림은 어떤 동물이 포유류인지 아닌지를 판단해야 할 때,
Tree 1: “포유류!”
Tree 2: “포유류 아님”
Tree 3: “포유류!”
다수결로 투표해서 포유류가 2표 > 포유류 아님이 1표 → 최종 결정: 포유류
→ 이건 Classification(분류) 문제 이다.
오른쪽 그림은 Regression(회귀) 인데
Tree 1: $250,000
Tree 2: $200,000
Tree 3: $300,000
→ 예측값 평균 = (250k + 200k + 300k) / 3 = $250,000
→ 이건 숫자를 예측하므로 회귀 문제이다.
그래서 Random Forest는 몇몇 tree들이 비정상적으로 잘못 판단을 내린다고 하더라도
대다수의 tree가 올바른 결정을 내리기만 한다면 성능이 올라가는 그러한 형태라고 생각하면 된다.

Adaptive Boosting (AdaBoost)는 Weak Learner(약한 모델)들을 순차적으로 연결해서,
점점 더 성능 좋은 모델을 만드는 방법이다.
즉, 처음 모델이 틀린 걸, 다음 모델이 고쳐나가도록 학습하는 방식
1단계: 첫 번째 약한 모델을 학습시킴
2단계: 틀린 샘플에 더 높은 가중치(weight)를 줌
3단계: 또 틀린 부분을 다음 모델이 학습
마지막: 여러 모델의 예측을 가중 평균으로 합침

| 방식 | 평행하게 학습시킴 (parallel) | 순차적으로 학습시킴 (sequential) |
| 목표 | 분산 감소 (overfitting 방지) | 편향 감소 (예측력 향상, 성능이 점차 좋아짐) |
| 종합 방식 | 투표/평균 | 가중 투표/가중 평균 |
| 예시 | Random Forest | AdaBoost, Gradient Boosting 등 |
부스팅도 bias가 줄어들면서 오류를 점점 더 잘 개선하게 되지만 지나치면 Bias-Variance Trade-off에서 봤던 것처럼 오류가 더 다른 방향으로 증가할 수 있다는 문제점이 있음.

다양한 지도학습 예시에 대해서 보겠다.
Supervised Learning – Super Resolution (초해상도)
흐릿한 저화질 이미지를 고화질로 복원하는 문제
여기에서 사용되는 모델들의 굉장히 복잡한 딥러닝, 그리고 일반적으로 CNN이나 Vision Transformer 부류의 모델들을 사용하게 될 것.
입력: 흐릿한 이미지 (low resolution)
정답: 선명한 이미지 (high resolution)
Loss 함수는?
MSE (Mean Squared Error): 실제 정답 이미지와 모델이 만들어낸 고해상도 이미지의 픽셀 간 차이
PSNR: 이미지 품질 평가 지표 (클수록 좋음)

Supervised Learning – Object Detection (객체 인식)
이미지 속에서 무엇이 어디에 있는지 알아내는 문제
학습 데이터는
입력: 이미지
정답: 사물의 위치(박스 좌표) + 클래스 이름 (예: “dog”, “person” 등)
박스를 이용해서 위치 정보까지 주고, 여러 개의 클래스(객체)가 존재하는 경우에도 탐지 할 수 있는 능력이 있는 신경망을 학습시키고 싶은 상황에는 입력 데이터는 이미지가 되겠고, 우리가 맞히고 싶은 정보는 위치 정보, 즉 박스의 좌표가 될 것이다.
그리고 박스에 대응되는 Label, 자동차라든지 강아지라든지 이런 것들을 우리가 벡터 형태로 입력과 출력으로 줄 수 있음.
-> 모델은 복잡한 과제를 수행하기 위해선 딥러닝 테크닉을 사용해야함.
CNN이나 Vision Transformer 부류의 비전 과제에 특화된 신경망을 사용하는 모델들을 우리가 모델 종류로 정의 할 수 있고,
이 모델이 언제 잘 하는지 어떻게 잘하는지 평가하는 Loss 함수로써는
이 모델이 친 박스랑 실제 정답 박스가 얼마나 비슷한지를 좌표 단위로 평가 하면 된다
그리고 각 박스의 분류가 잘 됐는지 안 됐는지를 Classification Loss 혹은 Cross Entropy Loss와 같은 형태로 평가할 수 있다.
-> 지도학습 프레임워크로 설명할 수 있다.
이제 간단하게 언어 모델들도 살펴 보도록 하자.

BERT라는 대표적인 자연어 처리(NLP) 모델의 지도학습(Supervised Learning) 예시이다.
문장에서 일부 단어를 마스킹 처리하고, 그 단어가 뭔지 맞추는 문제
이걸 Masked Language Modeling (MLM) 이라고 한다.
BERT는 저 [MASK] 부분을 보고, 원래 단어가 brown과 the였는지 맞춰야 함.
여기서 사용하는 모델은 트랜스포머 모델이다.
왜 이런 학습을 할까?
단어가 어떤 문맥에서 등장하는지를 이해하게 만드는 훈련
즉, BERT는 "문장의 빈칸 채우기" 훈련을 하면서 문장 전체 구조를 배운다.
각각 마스크 되어 있는 단어를 잘 표현했는지 잘못 표현했는지를 분류 문제라고 생각할 수 있기 때문에
Cross Entropy 부류의 Classification Loss 혹은 그와 유사한 Loss를 사용할 수 있다.

Next Sentence Prediction (NSP)
두 문장이 있을 때, "두 번째 문장이 첫 번째 문장 다음에 실제로 오는 문장인가?"를 맞추는 훈련
문장 A와 B를 보고 → YES/NO를 맞추기 이므로,
이건 이진 분류(binary classification) 문제이다
이것도 트랜스포머 기반의 언어 모델 이다.
그 다음에 우리가 이진 분류에 사용 했던 것처럼 Cross Entropy 를 활용해서 내 모델에 대한 성능 평가를 진행할 수 있다.

최근 들어서 스마트 팩토리 얘기가 많이 나오는데, 이상치 탐지를 생각해볼 수 있음.
예를 들어 공장에서 돌아가는 어떤 여러 기계, 혹은 여러개 단계로부터 센서값 입력을 받아서 이것이 현재 정상 상황인지,
혹은 곧 문제가 발생 하는 이상한 상황인지를 판단 하는 데이터를 기존의 레코드로부터 수집을 했다고 할 때
어떠한 특정 딥러닝 모델를 활용해서 이것을 학습 시켜서 나중에는 비슷한 상황이 발생했을 때 Unnormal 한 상황이니까 무엇인가 대비를 해야 된다. 라고 하는 것을 학습을 통해서 진행시킬 수 있다
우리가 특정 상황이라고 하는 센서 입력값들이 x 가 되겠고,
그 상황이 Unnormal한 상황이었는지 아니었는지를 판단하는 y 라고 하는 정답 레이블이 주어져 있다.
그 다음에 우리가 어떤 모델 종류를 딥러닝 모델을 사용하고 그 다음에 비정상적인 것을 잘 맞추는지 못 맞추는 지를 우리가 트레이닝 할 수 있기 때문에 역시 이 문제도 우리가 지도학습의 일부 라고 말할 수 있음.
지도학습 이외의 비지도 학습 같은 경우에는 1강에서 클러스터링에 대해 말했음.
일단 먼저 준 지도학습에 대해서 간단하게 말하고자 한다.

Semi-Supervised Learning -> 데이터의 부족을 극복하고자 하는 기법
Labeling은 비쌈
데이터를 다 수집해도, 사람이 하나하나 라벨(정답)을 붙이는 건 비용도 많이 들고 시간이 오래 걸린다.
예: 고양이/강아지 구분하는 모델을 학습시키려면, 사진 수천 장에 “이건 고양이”, “이건 강아지”라고 라벨을 달아야 함.
Unlabeled data를 활용해서 학습
라벨이 없는 데이터가 훨씬 많기 때문에, 이 데이터를 잘 활용하자는 것이 준 지도학습(Semi-Supervised Learning)의 핵심
1. Unlabeled Data → Task-agnostic Big CNN → Unsupervised Pretraining
먼저, 라벨 없는 데이터(파란 구름 모양)를 거대한 CNN 모델에 넣어서 비지도 학습(pretraining)을 한다.
여기선 라벨 없이도 패턴을 학습함.
예: "고양이는 보통 귀가 뾰족하다", "강아지는 코가 길다" 같은 기본적인 특성을 먼저 배우는 것임
2. Projection Head
특성을 뽑아내는 모듈. 이미지의 중요한 특징들을 추출해서 표현 벡터로 바꿔준다.
3. Small fraction of labeled data → Fine-tuning
라벨이 있는 데이터는 극히 일부만 사용한다. 이걸로 모델을 살짝 미세 조정(fine-tuning)함.
예: "이건 실제로 고양이였다", "이건 진짜 강아지였다" 같은 정답을 보고, 이미 학습된 특징들에 맞게 모델을 조정시킴.
4. Self-training / Distillation
이후, 학습된 모델(Task-specific CNN)을 가지고 다시 라벨 없는 데이터를 예측해보고, 그걸 스스로 학습에 사용함.
→ 이걸 자기지도학습(Self-training) 혹은 지식증류(Distillation) 라고 한다.

Unlabeld 데이터로부터 이미지 특성을 어떻게 배우냐? -> Distillation 기법을 사용해서 수행할 수 있음.
데이터 증강을 통한 학습 구조
데이터 한 장(x)을 여러 형태(x̃i, x̃j)로 변형해서 학습
같은 사진을 다르게 보이도록 바꿔서 (회전, 자르기, 색 왜곡 등) 두 개의 입력으로 만들고,
둘이 같은 의미를 가지도록 학습시킨다.
즉, "얘는 다른 모습이지만 같은 사진이야!"라는 걸 모델이 스스로 이해하게 만든다.
정리하면 라벨 없는 데이터를 증강해서, 서로 비슷한 의미를 가진 입력으로 만들고 그걸로도 학습하게 하는 기법이 Distillation 이다.
원본 이미지로부터 다양하게 증강되어 있는 이미지들은 동일한 특징을 가져야 한다고 하는 조건을 하습시키면 됨.
즉 강아지와 강아지를 확대한 사진 두 개의 특징을 뽑으면 비슷한 특징이 나와야 된다.
혹은 두 개의 다른 이미지로부터 특징을 뽑으면 다른 것이 나와야 된다 라고 하는 그런 조건을 가지고 학습 하게 된다면 이 이미지에 어떤 공통적인 특성들, 유의미한 특성들을 추려내게 될 수 있고 이렇게 Unlabeled된 데이터로부터 정보를 추려내서
우리가 이 특징들을 가지고 아주 적지만 레이블 되어 있는 소수의 데이터를 활용하면 효율적인 지도 학습이 가능하다라는 것이 준 지도 학습이라고 한다.

Generative Model (생성 모델)은 대표적인 비지도 학습.
Semi-Supervised Learning은 라벨이 적을 때 어떻게 학습할지였다면,
이제는 라벨이 아예 없어도 데이터를 학습하고 만들어낼 수 있는 생성 모델에 대해 배우자.
Generative Models (생성 모델)은 라벨이 없음 → 즉, “이건 고양이다”, “이건 자동차다” 같은 정답이 없다
대신, 이미지 데이터 x만 있음
목표: 데이터가 어떻게 생겼는지 확률적으로 학습함 (p(x))
예: “강아지 사진들이 이런 특징을 가지는구나”를 파악해서, 나중에 비슷한 스타일의 이미지들을 직접 생성할 수 있게 되는 모델
데이터가 많이 주어져 있을 때 이 데이터의 분포를 파악하는 문제다 라고 생각할 수 있음.
지금은 이제 Diffusion이 많이 사용되지만, 몇년 전에는 GAN 이라고 하는 GAN 기법이 많이 활용됐음.

GAN (Generative Adversarial Networks) 이라고 하는 것은 Generator 라고 하는 이미지를 생성하는 애와
그 다음에 생성된 이미지가 가짜인지 진짜인지 판별 하는 Discriminator 두 개의 파트가 서로 상호보완적으로 학습이 일어나면서
결국 Generator는 더욱더 정교한 가짜 이미지를 만들고 Discriminator는 점점 더 진짜와 가짜를 효과적으로 판단하고
이 과정을 반복적으로 학습을 수행 하면서 Generator의 성능을 끌어올리는 기법.
즉, 싸움 구조라고 보면 되는데 Generator는 Discriminator를 속이기 위해 점점 더 진짜 같은 이미지를 만든다.
Discriminator는 계속 속지 않으려고 더 똑똑해지는 것.
이렇게 서로 경쟁하며 발전하다 보면, Generator가 만든 가짜 이미지가 진짜처럼 보이게 된다.
실제로 이 전체 task는 전체 데이터만 주어져 있고 Label이 없는 비지도 학습이지만
Discriminator 관점에서는 이 이미지가 생성된 가짜 이미지인지, 실제 이미지 인지에 따라서
Label 0과 1이 주어져있는 것을 학습하는 일종의 지도학습 과제를 이 그림에 있는 전체 프레임워크 안에서 수행하고 있다고 보면됨.

Diffusion Model은 사람이 그린 건지 아닌지 구분이 불가능 할 정도로 정교한 이미지를 생성해 내는 생성 모델임.

이 디퓨전 모델은 결국에는 이미지에 노이즈를 추가해서 노이즈화 시키는 일련의 과정을 정방향 프로세스 라고 부르고,
정방향 프로세스로부터, 노이즈로부터 다시 원래 이미지를 복원해내는 것을 디노이징 과정을 거치는 역방향 프로세스가 존재함.
그래서 이 디퓨전 모델은 실제로 무엇을 학습 하냐면 각 단계에서 노이즈를 하나 줄이면 무슨 일이 벌어지는가?
이 노이즈를 어떻게 하면 줄일 수 있는가에 대한 학습을 수행 하게 된다.
그래서 처음에 우리에게 주어진 데이터 그 자체는 Label이 없는 데이터지만 우리가 이 이미지에 노이즈를 더 할 수는 있음.
그러면 이 이미지로부터 노이즈를 빼면 어떤 이미지가 나와야 하는지 우리가 정답 이미지를 알고 있다는 얘기다.
그럼 이걸 이용해서 일종의 지도학습처럼 내가 한 단계 디노이징을 하면 어떤 이미지가 나와야 되는지를 모델을 학습시킬 수 있고
이런 형태로 학습을 진행 해서 최종적으로 임의의 노이즈로부터 이미지를 생성해 내는 과정을 이러한 디퓨전 모델로 설명할 수 있다.
내부적으로 디노이징 하는 과정을 학습 하는 것을 일종의 지도 학습으로 볼 수 있다.
그래서 비지도 학습이지만 그 안에 어던 지도 학습의 특징을 갖고 있는 task에 대해서도 몇 가지 소개했다.
'LG Aimers > AI Essential Course' 카테고리의 다른 글
| AWSKRUG 14번째 모임 (0) | 2025.07.31 |
|---|---|
| MDP and Planning (0) | 2025.07.30 |
| Logistic Regression (0) | 2025.07.28 |
| Classification (0) | 2025.07.27 |
| Gradient Descent (0) | 2025.07.27 |