728x90
반응형

👉이전글에서 이진분류의 대표 기술인 Logistic Regression에 대해 알아보았습니다.

이번엔 출력 값이 두 개가 아닌, 다수의 출력 값을 낼 수 있는 기술인 Softmax Regression에 대해 알아보겠습니다.
이번 글은 모두를 위한 딥러닝 강의를 수강한 후 작성하는 글입니다.

Multinomial Classification

성적에 따른 S~F등급 예측 등과 같은 다중 출력 모델은 기존 Logistic Classfication기술을 응용하여 만들 수 있습니다.

위 사진에서 나타낸 것처럼 출력 데이터(A, B, C)의 가지수를 3으로 가정해봅시다.
출력 데이터 A, B, C중 하나로 분류하기 위해 3개의 Hypothesis가 필요한데요.

3개의 Hypothesis를 활용하여 도출된 수식은 아래 사진과 같이 표현할 수 있습니다.

위 사진과 같이 출력 데이터(A, B, C)의 가지수 3에 맞게 크기 3의 W 1차원 벡터를 구성하고,
입력으로 들어온 입력 값을 위 W벡터에 각각 계산해주면
그에 맞게 도출된 출력 값에 따라 입력 값을 A, B, C중 하나로 분류하고 Hypothesis를 최적화할 수 있습니다.

그리고 w벡터들을 하나의 벡터로 표현하면 위 사진과 같은 형태의 수식이 탄생합니다.

Softmax Classifier

여러 가지수 중 하나로 예측하여 분류하기 위해서는 0과 1사이의 확률 값으로 변환할 필요가 있습니다.
위 사진은 Hypothesis의 출력 값을 Softmax분류기를 통해 0과 1사이의 확률 값으로 변환하는 도식입니다.

그리고 변환된 확률 값은 위 사진에서 보이는 것처럼 One-Hot Encoding과 같은 과정을 거쳐
분류를 위한 최종 벡터 값 설정을 진행합니다.

가장 간단한 방법은 가장 큰 확률 값은 1로 설정하고 나머지는 0으로 세팅하는 One-Hot Encoding이 있습니다.

Cost Function

Cost Function은 위 도식과 같은 형태로 표현할 수 있습니다.
Softmax에서는 Cross Entropy라고도 불립니다.

수식은 Logistic Regression의 Cost Fucntion과 비슷한 원리로,
예측값과 실제값에 차이가 있을 경우, 무한대로 수렴하는 Cost가 출력되고,
에측값과 실제값에 차이가 없을 경우, 0에 수렴하는 Cost가 출력되는 원리입니다.

그리고 아래 사진은 최종 형태입니다.

Softmax Regression in Tensorflow

아래 코드는 Softmax 예제 Tensorflow 코드입니다.

x_data = [[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_data = [[0, 0, 1], [0, 0, 1], [0, 0, 1], [0, 1, 0], [0, 1, 0], [1, 0, 0], [1, 0, 0]]

X = tf.placeholder("float", [None, 4])
Y = tf.placeholder("float", [None, 3])
nb_classes = 3

W = tf.Variable(tf.random_normal([4, nb_classes]), name='wieght')
b = tf.Variable(tf.random_normal([nb_classes]), name='bias')

hypothesis = tf.nn.softmax(tf.matmul(X, W) + b)

cost = tf.reduce_mean(-tf.reduce_sum(Y * tf.log(hypothesis), axis=1))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

    for step in range(2001):
        sess.run(optimizer, feed_dict=(X: x_data, Y: y_data))
        if step % 200 == 0:
            print(step, sess.run(cost, feed_dict=[X; x_data, Y: y_data]))
반응형

'개발 > AI' 카테고리의 다른 글

KT AI 해커톤 회고 (2)  (1) 2023.11.02
KT AI 해커톤 회고 (1)  (0) 2023.10.27
[NLP] Embedding  (0) 2023.09.23
[AI] Logistic Regression  (0) 2023.09.10
[AI] Regression  (0) 2023.01.22

+ Recent posts