소프트맥스 회귀(Softmax Regression)
이전 포스팅에서 다뤘던 로지스틱 회귀는 여러 개의 이진 분류기를 훈련시켜 연결하지 않고 직접 다중 클래스를 지원하도록 일반화 될 수 있다. 이를 소프트맥스 회귀(Softmax Regression) 혹은 다항 로지스틱 회귀(Multinominal logistic regression)라고 한다.
샘플 x가 주어지면, 먼저 소프트맥스 회귀 모델이 각 클래스 k에 대한 점수 s(x)를 계산하고 그 점수에 소프트맥스 함수(또는 정규화된 지수함수)를 적용하여 각 클래스의 확률을 추정한다.
각 클래스는 자신만의 파라미터 벡터 Wk 가 있다. 이 벡터들은 파라미터 행렬에 행으로 저장된다. 위 식에서 샘플 x에 대한 각 클래스의 점수가 계산되면 소프트맥스 함수를 통과시켜 클래스 k에 속할 확률 pk를 추정할 수 있다. 이 함수는 각 점수에 지수 함수를 적용한 후 정규화한다. 일반적으로 이 점수를 로짓 혹은 로그-오즈라고 부른다.
- k는 클래스 수
- s(x)는 샘플 x에 대한 각 클래스의 점수를 담은 벡터
- 𝜎(s(x))k는 샘플 x에 대한 각 클래스의 점수가 주어졌을 때 이 샘플이 클래스 k에 속할 추정 확률
위 함수식을 통해 구해진 각 클래스의 확률 중에서 가장 높은 확률을 갖는 클래스가 출력되는 것이 소프트맥스 회귀의 작동 방식이다.
모델의 훈련 방식은 모델이 타깃 클래스에 대해서는 높은 확률을(그리고 다른 클래스에 대해서는 낮은확률을) 추정하도록 만드는 것이 목적이다. 그 방법으로는 크로스 엔트로피(cross entropy) 비용 함수를 최소화 하는 것이 있다. 이는 타깃 클래스에 대해 낮은 확률을 예측하는 모델을 억제하므로 이 목적에 부합하다.
- 이 식에서 y(i)k 는 i번째 샘플이 클래스 k에 속할 타깃 확률이다. 일반적으로 샘플이 클래스에 속하는지 아닌지에 따라 1또는 0이 된다.
딱 두 개의 클래스가 있을 때(K=2) 이 비용 함수는 로지스틱 회귀의 비용함수와 같다. 이 손실함수에 대한 그레이디언트 벡터는 다음과 같다.
이제 각 클래스에 대한 그레이디언트 벡터를 계산할 수 있으므로 비용 함수를 최소화하기 위한 파라미터 행렬을 찾기 위해서 경사 하강법을 사용할 수 있다.
소프트맥스를 이용해 붓꽃을 세 개의 클래스로 분류해보자. 사이킷런의 로지스틱 회귀는 클래스가 둘 이상일 때 기본적으로 일대다(OvA) 전략을 사용하지만 multi_class 매개변수를 "multinomial"로 바꾸면 소프트맥스 회귀를 사용할 수 있다. 소프트맥스 회귀를 사용하려면 solver 매개변수에 "lbfgs"와 같이 소프트맥스 회귀를 지원하는 알고리즘을 지정해야 한다. 또한 하이퍼파라미터 C를 사용하여 조절할수 있는 ℓ2 규제가 적용된다.
위는 소프트맥스 회귀를 파이썬으로 구현한 코드이다. 만약 꽃잎의 길이가 5cm이고 너비가 2cm인 붓꽃을 발견했다고 가정하고 이 붓꽃의 품종이 무엇인지 모델에 질의해보자.
모델은 94.2% 확률로 Virginica(클래스 2)라고 출력한다.
위 그림은 만들어진 결정 경계를 배경색으로 구분하여 나타내고 있다. 클래스 사이의 모든 결정 경계가 선형이며, Iris-Versicolor 클래스에 대한 확률을 곡선으로 나타냈다. 모든 결정 경계가 만나는 지점은 모든 클래스가 동일하게 33%의 추정 확률을 가지므로, 특정한 샘플에는 모든 클래스에 대한 추정 확률이 50%보다 낮은 경우가 있다.