Pytorch로 시작하는 딥러닝 입문(05-02. 소프트맥스 회귀 이해하기)

2024. 3. 2. 21:13딥러닝 모델: 파이토치

로지스틱 회귀를 이용하여 두 개의 선택지 중 한 개를 고르는 이진분류를 해결했다. 이번에는 소프트맥스 회귀를 이용하여 3개 이상의 선택지 중 한 개를 고르는 다중 클래스 분류(Multi-Class Classification)를 실습한다. 

♣ 다중 클래스 분류(Multi-class Classification)

세 개 이상의 답 중 하나를 고르는 문제는 다중 클래스 분류라고 한다. 

아래 문제는 꽃받침 길이, 꽃받침 넓이, 꽃잎 길이, 꽃 넓이라는 4개의 특성으로부터 setosa, versicolor, virginica 라는 3개의 붓꽃 품종 중 어떤 품종인지를 예측하는 문제로, 전형적인 다중 클래스 분류 문제이다. 

 

입력은 X, 가중치는 W, 편향은 B, 출력은 Y로 가정한다. (Y는 예측값이라는 의미를 가지고 있으므로 가설식에서 H(X) 대신 사용되기도 한다. )

 

 

1. 로지스틱 회귀

로지스틱 회귀에서 시그모이드 함수는 예측값을 0과 1 사이의 값으로 만든다. 예를 들어 스팸 메일 분류기를 로지스틱 회귀로 구현했을 때 출력이 0.75라면 이는 이메일이 스팸일 확률이 75%라는 의미이다. 반대로 스팸 메일이 아닐 확률은 25% 이다. 두 확률의 총합은 1이 된다. 

 

2. 소프트맥스 회귀

소프트맥스 회귀는 확률의 총합이 1이 되는 아이디어를 다중클래스 분류 문제에 적용한다. 소프트맥스 회귀는 각 선택지마다 소수 확률을 할당한다. 이때 총 확률의 합은 1이 되어야 한다. 각 선택지가 정답일 확률을 표현하는 것이다. 

 

소프트맥스 회귀는 선택지의 개수만큼의 차원을 가지는 벡터를 만들고, 해당 벡터가 벡터의 모든 원소의 합이 1이 되도록 원소들의 값을 변환시키는 어떤 함수를 지나게 만들어야 한다. 위의 그림은 붓꽃 품종 분류하기 문제와 같이 선택지 개수가 3개일 때, 3차원 벡터가 어떤 함수 ? 를 지나 원소의 총합이 1이 되도록 원소들의 값이 변환되는 모습을 보여준다. 

이 함수가 바로 소프트맥스 함수이다. 

 

 

 

♣ 소프트맥스 함수(Softmax function)

소프트맥스 함수는 분류해야 하는 클래스의 총 개수를 k라고 할 때, k 차원의 벡터를 입력받아서 각 클래스에 대한 확률을 추정한다. 

 

1. 소프트맥스 함수의 이해

k차원의 벡터에서 i번째 원소를 zi, i번째 클래스가 정답일 확률을 pi로 나타낸다고 했을 때 소프트맥스 함수는 pi를 다음과 같이 정의한다. 

 

붓꽃 문제의 경우 k=3 이므로 3차원 벡터 z = [z1, z2, z3]의 입력을 받으면 소프트맥스 함수는 아래와 같은 출력을 리턴한다.

 

p1, p2, p3 각각은 1번 클래스가 정답일 확률, 2번 클래스가 정답일 확률, 3번 클래스가 정답일 확률을 나타내며 각각 0과 1 사이의 값으로 총합은 1이 된다. i가 1일 때는 virginica일 확률, 2일 때는 setosa일 확률, 3일 때는 versicolor일 확률을 지정한다고 하자. 그러면 위의 식을 아래와 같이 바꿀 수 있다. 

 

 

 

2. 그림을 통한 이해

 

샘플 데이터를 한 개씩 입력으로 받아 처리한다고 가정한다. 즉 배치 크기가 1이다. 

 

하나의 샘플 데이터는 4개의 독립변수 x를 가지는데, 이는 모델이 4차원 벡터를 입력으로 받는다는 것을 의미한다. 

그런데 소프트맥스 함수의 입력으로 사용되는 벡터는 벡터의 차원이 분류하고자 하는 클래스의 개수가 되어야 하므로(즉 독립변수 x가 4개인데 3가지 클래스로 분류해야 하므로 입력으로 사용되는 벡터가 3차원이 되어야 하는 것) 어떤 가중치 연산을 통해 3차원 벡터로 변환되어야 한다. 위의 그림에서는 소프트맥스 함수의 입력으로 사용되는 3차원 벡터를 z로 표현하였다. 

 

샘플 데이터 벡터를 소프트맥스 함수의 입력 벡터로 차원을 축소하는 방법은 간단하다. z의 차원 수만큼 결과값이 나오도록 가중치 곱을 진행한다. 위의 그림에서 화살표는 총 (4×3) 12개이며, 전부 다른 가중치를 가지고, 학습 과정에서 점차적으로 오차를 최소화하는 가중치로 값이 변경된다. 

 

소프트맥스 함수의 출력은 분류하고자 하는 클래스의 개수만큼 차원을 가지는 벡터로, 각 원소는 0과 1 사이의 값을 가진다. 각 원소는 특정 클래스가 정답일 확률을 나타낸다. 그렇다면 이 예측값과 비교할 수 있는 실제값의 표현 방법이 있어야 한다. 소프트맥스 회귀에서는 실제값을 원-핫 벡터로 표현한다. 

위의 그림은 소프트맥스 함수의 출력 벡터의 첫 번째 원소 p1가 virginica가 정답일 확률, 두 번째 원소 p2가 setosa가 정답일 확률, p3가 versicolor가 정답일 확률을 의미할 때 각 실제값의 정수 인코딩은 1, 2, 3이 되고 이에 원-핫 인코딩을 수행하여 실제값을 원-핫 벡터로 수치화한 것을 보여준다. 

샘플 데이터의 실제값이 setosa라면 setosa의 원-핫 벡터는 [0 1 0]이 된다. 이 경우, 예측값과 실제값의 오차가 0이 되는 경우는 소프트맥스 함수의 결과가 [0 1 0]이 되는 경우이다. 두 벡터의 오차를 계산하기 위해서 소프트맥스 회귀는 비용 함수로 크로스 엔트로피 함수를 사용한다. 

앞서 배운 선형회귀나 로지스틱 회귀와 마찬가지로 오차로부터 가중치와 편향을 업데이트한다. 

 

소프트맥스 회귀를 벡터와 행렬 연산으로 이해해보자. 입력을 특성(feature)의 수만큼의 차원을 가진 입력 벡터 x라고 하고, 가중치 행렬을 W, 편향을 b라고 했을 때 소프트맥스 회귀에서 예측값을 구하는 과정을 벡터와 행렬 연산으로 표현하면 아래와 같다. 

 

 

♣ 붓꽃 품종 분류하기 행렬 연산으로 이해하기 

예제의 데이터는 전체 샘플의 개수가 5개, 특성이 4개이므로 5×4 행렬 X로 정의한다. 

 

원소들을 변수로 표현할 수도 있다. 

이번 문제는 선택지가 총 3개인 문제이므로 가설의 예측값으로 얻는 행렬 Y의 열의 개수는 3개여야 한다. 그리고 각 행은 행렬 X의 각 행의 예측값이므로 행의 크기는 동일해야 한다. 결과적으로 행렬 Y의 크기는 5×3이다. 

샘플의 수가 5개니까 행이 5개, 각 샘플이 가지는 클래스의 확률이 3개니까 열은 3개

 

크기 5×3의 행렬 Y는 크기 5×4 입력 행렬 X와 가중치 행렬 W의 곱으로 얻어지는 행렬이므로 가중치 행렬 W의 크기는 4×3이다. 

편향 행렬 B는 예측값 행렬 Y와 크기가 동일해야 하므로 5×3 크기를 가진다. 

 

 

결과적으로 가설식은 다음과 같다.