본문 바로가기

Data Science

Softmax Regression 기본 개념 파악 및 실습하기 | sTricky

Softmax Regression 기본 개념 파악 및 실습하기 | sTricky

Softmax Regression 기본 개념 파악 및 실습하기 sTricky

안녕하세요. 이번 딥러닝 시간은 Softmax Regression에 대해서 알아보고 실습해보는 시간을 가져 보겠습니다. 사실 이전에 함께 공부했던 Logistic regression은 H(x) = Wx의 수식을 가지고 있는데, 이는 출력하는값이 실수를 가지기 때문에 때론 200, 300, 1000이 나올 수 있구요, 0, -1 등의 값이 나올수도 있습니다. 그렇다보니 어떤 패턴을 압축해서 찾는데에서 문제점을 나타내기도 합니다. 그래서 나온것이 바로 이 Softmax Regression입니다.

Softmax Regression는 Multinomaial classification의 일종입니다. 그렇다면 먼저 Multinomaial classification에 대해서 알아보아야 하겠네요.

##본 포스트의 모든 내용은 유튜브 <모두의 딥러닝>을 기반으로 학습하며 작성된것임을 밝혀둡니다!

Multinomaial classification 이란 무엇인가?

Softmax Regression 의 결과값은 0 ~ 1사이로 제한되고 있습니다. 그렇기 때문에 어떤 패턴을 찾는다거나 결과값을 압축하여 보여주기때문에 파악하기 쉽다는 장점이 있습니다. 그렇게 모여서 Multinomaial classification이 되는데, 아래 그림을 보도록 하겠습니다.

Multinomaial classification

세가지 classification이 있는데, 왼쪽부터 빨간선은 C or not, 가운데 그래프는 B or not, 마지막 그래프는 A or not을 분류하게 됩니다. 이때, A 부터 분류를 해나가면 되겠죠. 

자, 여기서 Hypothesis를 구하기 위해서는 아래와 같은 로직을 거치게 됩니다. 세개의 classification을 모두 합쳐서 아래와 같이 배열을 만들어서 계산을 하게 됩니다.

Multinomaial classification

이렇게 계산하면 값이 나오게 됩니다. 정수가 출력되게 되는데, 이 값들을 이용해서 sigmoid를 구해야 합니다. sigmoid는 위에서 설명 드린것 처럼 정수로 출력되는 값들을 0 ~ 1 사이의 실수로 출력 되도록 하는 로직 입니다. 위 그림에서 오른쪽에 초록색으로도 된 S 를 말합니다. 아래 그림을 보시면 이해가 되시리라 생각 합니다.

 

 

 

sigmoid

바로 이렇게 하기위한것이 Softmax라는 함수 입니다.

Softmax 함수란?

먼저 아래 그림을 보시기 바랍니다.

Softmax 함수

위 그림에서 빨간 Y는 위에서 Hypothesis를 구한 출력 값 입니다. 이것을 score라고 한다면 이 결과를 Softmax 함수를 통하여 출력하게 되면 Probabilities라는 값이 나오게 되죠. 0에서 1사이의 실수 이며, 모든 출력 값을 더하면 1이 되는것이죠. 각각의 값은 확률을 이야기 하게 됩니다. 전체(1)에서 가지는 비중을 뜻하기 때문이죠.

그다음은, one-hot encoding 기법에 대한 내용 인데요, 이건 간단 합니다. Softmax 함수를 통해서 나온 값중에 가장 큰 값을 1로 출력하고 나머지는 0을 나오게 하는것 이죠. 확률이 아니라 어느 하나의 결과를 출력해야 할때 사용 해야 하는것 이죠. 예를 들어 10시간 공부하고, 5번 수업에 출석한 사람의 학점이 A가 나올 확률이 0.7이고 나머지는 0.2, 0.1 일때 이 사람의 최종 학점은 A일 가능성이 높다는 의미인것 이죠.

one-hot encoding

이젠 Cost 함수를 구해야 하겠죠.  one-hot encoding 기법을 통해서 나온 결과를 Cost Function을 통해서 아래와 같이 구할 수 있습니다. 이 부분은 설명이 좀 길고 복잡하여.. <모두의 딥러닝> 유튜브 영상을 참고하시는게 좋을것 같습니다.

 

 

 

Cost Function

Softmax Regression 실습

다시한번 정리하고 넘어가도록 하겠습니다. Softmax Regression이란 어떤 값(X)가 들어올때 그 값들을 가지고 여러개의 클래스로 예측을 할때 유리합니다. 아래와 같이 말이죠.

학점을 예측하는 Softmax Function

어떤값을 받아서 어떤 학점이 나올 확률을 구하고, 이를 one-hot encoding 기법을 통하여 Cost Function을 통과하게 되면 나올 확률이 가장 높은 학점이 나오게 되는것 입니다. 이것이 바로 Softmax Regression 이라고 할 수 있겠죠.

 

 

 

Tensorflow 소스 코드는 아래와 같습니다. tensorflow의 softmax 함수를 사용하면 쉽게 구할 수 있습니다.

# Lab 6 Softmax Classifier
import tensorflow as tf
import numpy as np

x_raw = [[1, 2, 1, 1],
          [2, 1, 3, 2],
          [3, 1, 3, 4],
          [4, 1, 5, 5],
          [1, 7, 5, 5],
          [1, 2, 5, 6],
          [1, 6, 6, 6],
          [1, 7, 7, 7]]
y_raw = [[0, 0, 1],
          [0, 0, 1],
          [0, 0, 1],
          [0, 1, 0],
          [0, 1, 0],
          [0, 1, 0],
          [1, 0, 0],
          [1, 0, 0]]

x_data = np.array(x_raw, dtype=np.float32)
y_data = np.array(y_raw, dtype=np.float32)

nb_classes = 3

tf.model = tf.keras.Sequential()
tf.model.add(tf.keras.layers.Dense(input_dim=4, units=nb_classes, use_bias=True))  # use_bias is True, by default

# use softmax activations: softmax = exp(logits) / reduce_sum(exp(logits), dim)
tf.model.add(tf.keras.layers.Activation('softmax'))

# use loss == categorical_crossentropy
tf.model.compile(loss='categorical_crossentropy', optimizer=tf.keras.optimizers.SGD(lr=0.1), metrics=['accuracy'])
tf.model.summary()

history = tf.model.fit(x_data, y_data, epochs=2000)

print('--------------')
# Testing & One-hot encoding
a = tf.model.predict(np.array([[1, 11, 7, 9]]))
print(a, tf.keras.backend.eval(tf.argmax(a, axis=1)))

print('--------------')
b = tf.model.predict(np.array([[1, 3, 4, 3]]))
print(b, tf.keras.backend.eval(tf.argmax(b, axis=1)))

print('--------------')
# or use argmax embedded method, predict_classes
c = tf.model.predict(np.array([[1, 1, 0, 1]]))
c_onehot = tf.model.predict_classes(np.array([[1, 1, 0, 1]]))
print(c, c_onehot)

print('--------------')
all = tf.model.predict(np.array([[1, 11, 7, 9], [1, 3, 4, 3], [1, 1, 0, 1]]))
all_onehot = tf.model.predict_classes(np.array([[1, 11, 7, 9], [1, 3, 4, 3], [1, 1, 0, 1]]))
print(all, all_onehot)

저의 결과 값은 아래와 같습니다.

tensorflow의 softmax 함수 결과

오늘도 어려운 공부 함께 하시느라 고생하셨습니다.

감사합니다.

##관련포스팅##

2021/01/31 - [Data Science] - Logistic classification 모두의 딥러닝 실습 및 개념 파악 하기 | sTricky

 

Logistic classification 모두의 딥러닝 실습 및 개념 파악 하기 | sTricky

Logistic classification 모두의 딥러닝 실습 및 개념 파악 하기 | sTricky 우선, Binary Classification에 대해서 알아 보도록 하겠습니다. 여기에서 classification 이란 아래 그림을 보시면서 이야기 해보도록..

stricky.tistory.com

2021/01/24 - [Data Science] - Multivariable linear regression 딥러닝 예제 개념 및 실습 | sTricky

 

Multivariable linear regression 딥러닝 예제 개념 및 실습 | sTricky

Multivariable linear regression 딥러닝 예제 개념 및 실습 | sTricky 안녕하세요. 딥러닝 시간 3번째 시간 입니다. 지난 딥러닝 강의 및 예제를 보고 싶으신 분들은 아래 포스트를 참고 해주시면 됩니다. 참

stricky.tistory.com

by.sTricky