모든 강의 자료와 영상은 공개된 해당 링크들을 통해서 학습하고 있다.
강의자료: https://cs229.stanford.edu/syllabus-spring2022.html
강의 영상: https://www.youtube.com/watch?v=goDDnBbJQ4g
5강 강의노트: https://cs229.stanford.edu/lectures-spring2022/main_notes.pdf
최근 구글 스터디잼 이라는 프로그램에서도 인공지능 관련 강의와 실습으로 익혀보고 있는데, 이해하기 쉽게 설명해줘서 (영상, 그림 등) 훨씬 용이해졌다.
요약
1. Generative Learning Algorithms
2. Discriminative vs. Generative Models
3. Gaussian Discriminant Analysis, GDA
4. Decision Boundary
Generative Learning Algorithms
이전 강의(로지스틱 회귀)는 $ p(y|x) $를 직접 모델링했다. 입력 x가 주어졌을 때 정답 y가 무엇인지 바로 예측하는 방식.
이런 방식을 판별 모델, discriminative model이라고 한다.
반대로 생성 모델은 바로 p(y|x)를 찾지 않는다. 대신 각 클래스가 데이터를 어떻게 만들어내는지 먼저 모델링한다.
예를 들어:
- $ p(x|y=0) $: 개 클래스의 특징 분포
- $ p(x|y=1) $: 코끼리 클래스의 특징 분포
- $ p(y) $: 각 클래스가 나올 사전 확률
을 학습한다.
그다음 새로운 데이터 x가 들어오면, 이 데이터가 개 모델에서 더 그럴듯한지, 코끼리 모델에서 더 그럴듯한지를 비교한다.
수식으로는 Bayes rule을 사용한다.
$ p(y|x)=\frac{p(x|y)p(y)}{p(x)} $
2가지 방식
continuous x → Gaussian Discriminant Analysis, GDA
Discrete x → Naive Bayes / Spam Filtering
GDA
입력 $ x $는 여러 feature로 이루어진 벡터라고 본다.
$ x \in \mathbb{R}^d $
즉, 하나의 데이터는 $ d $개의 feature를 가진 $ d $차원 벡터다.
GDA는 각 클래스의 조건부 분포 $ p(x|y) $를 다변량 가우시안 분포로 모델링한다.
따라서 먼저 다변량 가우시안 분포가 어떤 형태인지 정리해보자.
다변량 가우시안 분포에서 각 변수의 차원은 다음과 같다.
$ z \in \mathbb{R}^d $
$ \mu \in \mathbb{R}^d $
$ \Sigma \in \mathbb{R}^{d \times d} $
여기서 $ z $는 $ d $차원 데이터 벡터, $ \mu $는 $ d $차원 평균 벡터, $ \Sigma $는 $ d \times d $ 공분산 행렬이다.
확률변수 $ Z $가 평균 벡터 $ \mu $, 공분산 행렬 $ \Sigma $를 갖는 다변량 가우시안 분포를 따른다면 다음과 같이 쓴다.
$ Z \sim \mathcal{N}(\mu,\Sigma) $
이때 확률밀도함수는 다음과 같다.
$ p(z;\mu,\Sigma)=\frac{1}{(2\pi)^{d/2}|\Sigma|^{1/2}}\exp\left(-\frac{1}{2}(z-\mu)^T\Sigma^{-1}(z-\mu)\right) $
평균 벡터 $ \mu $는 분포의 중심을 나타낸다.
$ E[Z]=\mu $
공분산 행렬 $ \Sigma $는 데이터가 평균을 기준으로 어떤 방향으로 얼마나 퍼져 있는지를 나타낸다.
공분산은 다음과 같이 정의한다.
$ Cov(Z) \triangleq E[(Z-E[Z])(Z-E[Z])^T] $
여기서 $ \triangleq $는 “이렇게 정의한다”는 의미다.
그리고 $ Z \sim \mathcal{N}(\mu,\Sigma) $일 때,
$ Cov(Z)=\Sigma $
이다.
따라서 $ \mu $는 데이터가 모여 있는 중심을 나타내고, $ \Sigma $는 그 중심을 기준으로 데이터가 퍼지는 모양을 나타낸다.
이제 이를 GDA에 적용한다.
GDA는 $ y=0 $인 데이터와 $ y=1 $인 데이터가 각각 다른 평균을 갖는 가우시안 분포에서 나왔다고 가정한다.
$ x|y=0 \sim \mathcal{N}(\mu_0,\Sigma) $
$ x|y=1 \sim \mathcal{N}(\mu_1,\Sigma) $
즉, 두 클래스는 서로 다른 평균 $ \mu_0,\mu_1 $을 가지지만, 같은 공분산 행렬 $ \Sigma $를 공유한다고 가정한다.
쉽게 말하면 두 클래스의 데이터 구름은 중심은 다르지만, 퍼지는 모양은 같다고 보는 것이다.

위 그림은 공분산 행렬 $ \Sigma $에 따라 다변량 가우시안 분포의 모양이 어떻게 달라지는지를 보여준다.
공분산 행렬이 단위행렬에 가까우면, 모든 feature 방향으로 데이터가 비슷하게 퍼진다.
이 경우 밀도함수의 모양은 구형에 가까워진다.
반대로 특정 방향의 분산이 더 크면, 데이터는 그 방향으로 더 넓게 퍼지고 밀도함수는 납작한 타원체 모양이 된다.
또한 feature들 사이의 상관관계가 커질수록 타원체는 좌표축과 나란하지 않고 한쪽 방향으로 기울어진다.
즉, $ \Sigma $는 단순히 분산의 크기만 나타내는 것이 아니라, feature들 사이의 상관관계와 데이터가 퍼지는 방향까지 함께 나타낸다.
예시) 암 진단 분류

GDA를 암 진단 예시로 생각해보자.
각 환자에게는 여러 측정값이 있을 수 있다. 예를 들어 종양 크기, 혈압, 특정 검사 수치 등이 feature가 될 수 있다.
여기서는 이해를 쉽게 하기 위해 두 개의 feature만 사용한다고 하자.
$ x =
\begin{bmatrix}
x_1 \\
x_2
\end{bmatrix}
\in \mathbb{R}^2 $
여기서 $ x_1 $, $ x_2 $는 각각 환자의 측정값이다.
각 환자 데이터에는 레이블 $ y $가 함께 주어진다.
$ y \in \{0,1\} $
예를 들어 다음처럼 둘 수 있다.
$ y=0:\text{ benign } $ (양성)
$ y=1:\text{ malignant } $ (악성)
GDA는 각 클래스에서 데이터가 가우시안 분포를 따른다고 가정한다.
$ x|y=0 \sim \mathcal{N}(\mu_0,\Sigma) $
$ x|y=1 \sim \mathcal{N}(\mu_1,\Sigma) $
여기서 $ \mu_0 $는 양성 데이터의 평균 벡터이고, $ \mu_1 $은 악성 데이터의 평균 벡터이다.
두 클래스는 서로 다른 평균을 가지지만, 같은 공분산 행렬 $ \Sigma $를 공유한다고 가정한다.
또한 클래스 자체의 사전 확률은 다음과 같이 둔다.
$ p(y=1)=\phi $
$ p(y=0)=1-\phi $
따라서 GDA에서 학습해야 하는 파라미터는 다음과 같다.
$ \mu_0,\mu_1,\Sigma,\phi $
새로운 환자 데이터 $ x $가 들어오면, GDA는 다음 두 값을 비교한다.
$ p(x|y=0)p(y=0) $
$ p(x|y=1)p(y=1) $
즉, 이 환자 데이터가 양성 분포에서 더 그럴듯하게 나왔는지, 악성 분포에서 더 그럴듯하게 나왔는지를 비교해 최종 클래스를 결정한다.
GDA와 판별 모델의 MLE 차이
GDA는 생성적 모델이다.
따라서 $ p(y|x) $를 직접 모델링하지 않고, 데이터가 어떻게 생성되는지를 나타내는 결합분포를 모델링한다.
$ p(x,y)=p(x|y)p(y) $
즉, GDA는 클래스별 데이터 분포 $ p(x|y) $와 클래스 사전확률 $ p(y) $를 함께 학습한다.
GDA에서 학습해야 하는 파라미터는 다음과 같다.
$ \phi,\mu_0,\mu_1,\Sigma $
이 파라미터들은 전체 학습 데이터가 가장 그럴듯하게 생성되도록 maximum likelihood로 추정한다.
$ \max_{\phi,\mu_0,\mu_1,\Sigma}\prod_{i=1}^{n}p(x^{(i)},y^{(i)}) $
또는,
$ \max_{\phi,\mu_0,\mu_1,\Sigma}\prod_{i=1}^{n}p(x^{(i)}|y^{(i)})p(y^{(i)}) $
반면 로지스틱 회귀 같은 판별 모델은 $ x $의 분포를 모델링하지 않는다.
입력 $ x $는 이미 관측된 값으로 두고, 그때의 label $ y $를 직접 예측한다.
$ p(y|x) $
따라서 판별 모델은 조건부 우도를 최대화한다.
$ \max_\theta \prod_{i=1}^{n}p(y^{(i)}|x^{(i)};\theta) $
정리하면, GDA는 “각 클래스가 데이터를 어떻게 만들어내는가”를 학습하고, 판별 모델은 “주어진 데이터가 어느 클래스인가”를 직접 학습한다.
(질의응답)
생성 모델의 가정은 일반화에 악영향을 주지 않을까?
GDA는 각 클래스의 데이터 분포 \(p(x|y)\)가 가우시안 분포를 따른다고 가정한다.
그렇다면 이런 강한 가정이 새로운 데이터에 대한 일반화 성능을 오히려 떨어뜨릴 수도 있지 않을까?
답은 “가정이 실제 데이터와 얼마나 맞는지에 따라 다르다”이다.
만약 실제 데이터가 GDA의 가정과 잘 맞는다면, 즉 각 클래스의 데이터가 실제로 가우시안 분포에 가깝고 공분산 구조도 비슷하다면 GDA는 매우 효율적으로 학습할 수 있다. 적은 데이터만으로도 클래스별 분포를 잘 추정할 수 있기 때문이다.
반대로 실제 데이터가 가우시안 분포와 많이 다르다면, GDA의 강한 가정은 오히려 성능을 떨어뜨릴 수 있다. 모델이 실제 데이터 구조와 맞지 않는 방식으로 분포를 억지로 설명하려 하기 때문이다.
따라서 여기에는 trade-off가 있다.
너무 많은 가정을 두면, 틀릴 위험이 높아지게 되고,
반대로 너무 적은 가정을 두면, 데이터에 대해 알고 있는 유용한 사전 지식을 활용하지 못한다.
GDA의 MLE 학습 과정
GDA는 데이터를 다음과 같이 생성한다고 가정한다.
$ y \sim Bernoulli(\phi) $
$ x|y=0 \sim \mathcal{N}(\mu_0,\Sigma) $
$ x|y=1 \sim \mathcal{N}(\mu_1,\Sigma) $
따라서 GDA가 학습해야 하는 파라미터는 다음 네 가지다.
$ \phi,\mu_0,\mu_1,\Sigma $
GDA는 생성 모델이므로 각 데이터 쌍 $ (x^{(i)},y^{(i)}) $의 결합 확률을 최대화한다.
$ p(x^{(i)},y^{(i)})=p(x^{(i)}|y^{(i)})p(y^{(i)}) $
전체 데이터에 대한 likelihood는 다음과 같다.
$ L(\phi,\mu_0,\mu_1,\Sigma)=\prod_{i=1}^{n}p(x^{(i)}|y^{(i)};\mu_0,\mu_1,\Sigma)p(y^{(i)};\phi) $
실제로는 계산을 쉽게 하기 위해 log-likelihood를 최대화한다.
$ \ell(\phi,\mu_0,\mu_1,\Sigma)=\sum_{i=1}^{n}\log p(x^{(i)},y^{(i)};\phi,\mu_0,\mu_1,\Sigma) $
이 식을 각 파라미터에 대해 미분해 0이 되는 지점을 찾으면 MLE 추정값을 얻는다.
$ \phi=\frac{1}{n}\sum_{i=1}^{n}1\{y^{(i)}=1\} $
$ \mu_0=\frac{\sum_{i=1}^{n}1\{y^{(i)}=0\}x^{(i)}}{\sum_{i=1}^{n}1\{y^{(i)}=0\}} $
$ \mu_1=\frac{\sum_{i=1}^{n}1\{y^{(i)}=1\}x^{(i)}}{\sum_{i=1}^{n}1\{y^{(i)}=1\}} $
$ \Sigma=\frac{1}{n}\sum_{i=1}^{n}(x^{(i)}-\mu_{y^{(i)}})(x^{(i)}-\mu_{y^{(i)}})^T $
$ \phi $는 클래스 1의 비율이고, $ \mu_0,\mu_1 $은 각 클래스의 평균 벡터이다.
$ \Sigma $는 각 샘플이 자기 클래스 평균에서 얼마나 벗어나는지를 모아 계산한 shared covariance이다.
학습이 끝나면 새로운 데이터 $ x $에 대해 다음 값을 비교한다.
$ p(x|y=0)p(y=0) $
$ p(x|y=1)p(y=1) $
더 큰 값을 주는 클래스로 예측한다.
$ \hat{y}=\arg\max_{y\in\{0,1\}}p(x|y)p(y) $
GDA에서는 두 클래스가 같은 공분산 행렬 $ \Sigma $를 공유한다고 가정한다.
이 가정 때문에 결정 경계를 유도하면 $ x $에 대한 이차항이 상쇄되고, 최종 decision boundary는 선형 형태가 된다.
$ \theta^T x+\theta_0=0 $
즉, GDA는 생성 모델이지만 shared covariance 가정 아래에서는 로지스틱 회귀처럼 선형 decision boundary를 만든다.
Prediction
GDA 학습이 끝나면 다음 파라미터들이 정해져 있다.
$ \hat{\phi},\hat{\mu}_0,\hat{\mu}_1,\hat{\Sigma} $
여기서 MLE는 $ y $를 찾는 과정이 아니라, 학습 데이터가 가장 그럴듯하게 생성되도록 하는 파라미터를 찾는 과정이다.
$ \hat{\phi},\hat{\mu}_0,\hat{\mu}_1,\hat{\Sigma}
=
\arg\max_{\phi,\mu_0,\mu_1,\Sigma}
L(\phi,\mu_0,\mu_1,\Sigma) $
반면 예측 단계에서는 새로운 입력 $ x $가 주어졌을 때, 가능한 클래스 중 확률이 가장 큰 $ y $를 선택한다.
$ \hat{y}=\arg\max_{y\in\{0,1\}}p(y|x) $
GDA가 직접 학습한 것은 $ p(y|x) $가 아니라 $ p(x|y) $와 $ p(y) $이다.
따라서 예측할 때는 Bayes rule을 사용한다.
$ p(y|x)=\frac{p(x|y)p(y)}{p(x)} $
클래스를 비교할 때 분모 $ p(x) $는 모든 $ y $에 대해 동일하므로 생략할 수 있다.
$ \hat{y}=\arg\max_{y\in\{0,1\}}p(x|y)p(y) $
즉, 실제로는 다음 두 값을 비교한다.
$ p(x|y=0)p(y=0) $
$ p(x|y=1)p(y=1) $
더 큰 값을 주는 클래스로 예측한다.
이진 분류에서는 $ p(y=0|x)+p(y=1|x)=1 $이므로,
$ p(y=1|x)>0.5 \Rightarrow \hat{y}=1 $
$ p(y=1|x)<0.5 \Rightarrow \hat{y}=0 $
두 클래스의 posterior probability가 같아지는 지점이 decision boundary이다.
$ p(y=1|x)=p(y=0|x) $
또는 이진 분류에서는 다음과 같이 쓸 수 있다.
$ p(y=1|x)=0.5 $
GDA에서는 두 클래스가 같은 공분산 행렬 $ \Sigma $를 공유한다고 가정한다.
이 때문에 두 가우시안 확률을 비교할 때 $ x $에 대한 이차항이 상쇄되고, 최종 결정 경계는 선형 형태가 된다.
$ \theta^T x+\theta_0=0 $
GDA 정리
GDA는 생성적 학습 알고리즘의 대표적인 예시다.
로지스틱 회귀처럼 $ p(y|x) $를 직접 학습하는 것이 아니라, 클래스 prior $ p(y) $와 클래스별 데이터 분포 $ p(x|y) $를 먼저 학습한다.
$ p(x,y)=p(x|y)p(y) $
특히 GDA는 입력 $ x $가 연속형 변수일 때, 각 클래스의 조건부 분포 $ p(x|y) $가 다변량 가우시안 분포를 따른다고 가정한다.
$ x|y=0 \sim \mathcal{N}(\mu_0,\Sigma) $
$ x|y=1 \sim \mathcal{N}(\mu_1,\Sigma) $
학습 단계에서는 MLE를 통해 다음 파라미터를 추정한다.
$ \phi,\mu_0,\mu_1,\Sigma $
예측 단계에서는 Bayes rule을 사용해 $ p(y|x) $를 계산하고, 더 확률이 큰 클래스를 선택한다.
$ \hat{y}=\arg\max_{y\in\{0,1\}}p(x|y)p(y) $
또한 두 클래스가 같은 공분산 행렬 $ \Sigma $를 공유한다는 가정 아래에서 GDA의 posterior probability는 로지스틱 함수 형태로 정리된다.
$ p(y=1|x)=\frac{1}{1+\exp(-(\theta^T x+\theta_0))} $
따라서 decision boundary는 다음과 같은 선형식으로 표현된다.
$ \theta^T x+\theta_0=0 $
즉, GDA는 생성 모델이지만 shared covariance 가정 아래에서는 선형 결정 경계를 만든다.
2차원에서는 직선, 더 높은 차원에서는 초평면이 된다.




















