본문 바로가기
  • 조금 느려도, 꾸준히
Artificial Intelligence/Machine Learning

핸즈온 머신러닝(5) - 로지스틱 회귀 2

by chan 2020. 1. 24.
반응형

# 소프트맥스 회귀

로지스틱 회귀 모델은 직접 다중 클래스를 지원하도록 일반화될 수 있다. 이를 소프트맥스 회귀(Softmax Regression) 또는 다항 로지스틱 회귀(Multinomial Logistic Regression) 라고 한다.

 

 

소프트맥스 회귀 모델은 샘플 $\mathrm{x}$ 가 주어졌을 때 각 클래스 $k$ 에 대한 점수 $s_k(\mathrm{x})$ 을 계산하고, 그 점수에 소프트맥스 함수(정규화된 지수 함수) 를 적용하여 각 클래스의 확률을 추정한다.

 

 

다음은 $s_k(\mathrm{x})$ 을 식으로 나타낸 것이다.

$$ s_k(\mathrm{x}) = \big(\theta^{(k)} \big)^T \cdot \mathrm{x} $$

 

 

각 클래스는 자신만의 파라미터 벡터 $\theta^{(i)}$ 가 있으며 이 벡터들을 파라미터 행렬(parameter matrix) $\Theta$에 행으로 저장된다.

 

 

샘플 $\mathrm{x}$ 에 대해 각 클래스의 점수가 계산되면 소프트맥스 함수를 통과시켜 클래스 $k$ 에 속할 확률 $\hat{p}_k$ 를 추정할 수 있다. 이 함수는 각 점수에 지수 함수를 적용한 후 정규화한다. 다음은 소프트맥스 함수의 식이다.

 

 

$$ \hat{p}_k = \sigma (s(\mathrm{x}))_k = \frac{e^{(s_k(\mathrm{x}))}}{\sum_{j=1}^{K} e^{(s_j(\mathrm{x}))}}$$

 

 

이때 $K$ 는 클래스의 수이며, $s(\mathrm{x})$ 는 샘플  $\mathrm{x}$ 에 대한 각 클래스의 점수를 담고 있는 벡터이다.

 

$\sigma(s(\mathrm{x}))_k$ 는 샘플 $\mathrm{x}$ 에 대한 각 클래스의 점수가 주어졌을 때 이 샘플이 클래스 $k$ 에 속할 추정 확률이다.

 

 

이렇게 추정 확률을 도출하면 소프트맥스 회귀 분류기는 추정 확률이 가장 높은 클래스(결국 가장 높은 점수를 가진 클래스)를 선택한다.

 

소프트맥스 회귀 분류기는 한 번에 하나의 클래스만 예측할 수 있다. 즉 다중 출력이 불가능 하므로 예를 들어 하나의 사진에서 여러 사람의 얼굴을 인식하는 데에는 사용할 수 없다. 

 

 

소프트맥스 회귀 모델의 훈련은 크로스 엔트로피(cross entropy) 비용 함수를 최소화함으로써 이루어진다. 크로스 엔트로피는 추정된 클래스의 확률이 타깃 클래스에 얼마나 잘 맞는지 측정하는 용도로 종종 사용된다.

 

다음은 크로스 엔트로피 비용 함수의 식이다.

 

$$ J(\Theta) = -\frac{1}{m} \sum_{i=1}^{m} \sum_{k=1}^{K} y_k^{(i)} log \big(\hat{p}_k^{(i)} \big) $$

 

위 식에서 첫번째 시그마의 범위는 샘플의 수이며 두번째 시그마의 범위는 클래스의 수이다. 

 

 

$y$ 는 실제 타깃 클래스를 나타내는 레이블이며, 가령 $i$ 번째 샘플에 대한 타깃 클래스가 $k$ 라면 $y_k^{(i)}$ 는 1이고, 그 외에는 모두 0이다.

 

 

즉 위의 크로스 엔트로피 비용 함수는 타킷 클래스에 대해 낮은 확률을 예측하는 모델을 억제하므로 훈련의 목적에 부합한다.

 

 

이 비용 함수의 $\theta^{(k)}$ 에 대한 그래디언트 백터는 다음과 같다.

$$ \bigtriangledown_{\theta^{(k)}} J(\Theta) = \frac{1}{m} \sum_{i=1}^{m} \big( \hat{p}_k^{(i)} - y_k^{(i)} \big) \mathrm{x}^{(i)} $$

 

 

각 클래스에 대한 그래디언트 벡터를 계산할 수 있으므로 비용 함수를 최소화하기 위한 파라미터 행렬 $\Theta$ 를 찾기 위해 경사 하강법을 사용할 수 있다.

 

 

 

소프트맥스 회귀를 이용해 iris 데이터셋의 붓꽃을 세 개의 클래스로 분류해 볼 수 있다. 사이킷런의 LogisticRegression 은 클래스가 둘 이상일 때 기본적으로 일대다(OvA) 전략을 사용한다. 이때 multi_class 매개변수를 'multinomial'로 바꾸면 소프트맥스 회귀를 사용할 수 있다.

 

 

소프트맥스 회귀를 사용하려면 solver 매개변수에 'lbfgs'와 같이 소프트맥스 회귀를 지원하는 알고리즘을 지정해야 한다. 또한 기본적으로 하이퍼파라미터 C를 사용하여 조절할 수 있는 $l_2$ 규제가 적용된다.

 

 bfgs 알고리즘은 Bryoden-Fletcher-Goldfarb-Shanno 알고리즘이라고도 부르는 의사 뉴턴 메서드(quasi-Newton Metod) 중 하나이다. L-BFGS(Limited-BFGS) 는 BFGS 알고리즘을 제한된 메모리 공간에서 구현한 것이다. 이 외에도 뉴턴 켤레 기울기법(Newton Conjugate Gradient)인 newton-cg, 확률적 경사 하강법인 sag 가 multinomial 매개변수를 지원한다. 이 세가지 알고리즘은 $l_1$ 규제를 지원하지 않으며 0.19 버전에 추가된 saga 가 multinomial 과 $l_1$, $l_2$ 규제를 지원하여 대규모 데이터셋에 가장 적합하다.

from sklearn.linear_model import LogisticRegression

X = iris['data'][:,(2,3)] # 꽃잎 길이, 꽃잎 너비
y = iris['target']

softmax_reg = LogisticRegression(multi_class='multinomial', solver='lbfgs', C=10)
softmax_reg.fit(X,y)

 

꽃잎의 길이가 5cm, 너비가 2cm 인 붓꽃을 발견했다고 가정하자. 훈련된 모델은 이 붓꽃의 품종을 94.2% 의 확률로 Iris-Virginica 라고 예측한다.

 

softmax_reg.predict([[5,2]])
# array([2])  <- 클래스 2, Iris-Virginica

softmax_reg.predict_proba([[5,2]])
# array([[6.38014896e-07, 5.74929995e-02, 9.42506362e-01]])

 

반응형

댓글