Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

덕배의 블로그

소프트맥스(softmax) 회귀에 대해서 알아보고 파이토치로 실습 해보자 본문

인공지능

소프트맥스(softmax) 회귀에 대해서 알아보고 파이토치로 실습 해보자

김덕배_KDB 2023. 8. 21. 18:03
반응형

소프트맥스 회귀

소프트 맥스를 알기 전에 2개의 선택지 중에서 1개를 고르는 이진 분류에는 로지스틱 회귀를 통해 알아보았다.

근데 3개 이상의 선택지 중에서 1개를 고르는 다중 클래스 분류에서는 소프트맥스 회귀를 사용한다.

이번 글은 소프트맥스에 대해서 알아보고 간단하게 파이토치로 구현해보려 한다.

 

이진 분류와 로지스틱 회귀에 대해서 다중 클래스 분류, 소프트 맥스 회귀에 대해서 공부하는 게 좋을 듯하다.

밑에 링크를 통해 이진 분류와 로지스틱 회귀부터 알아보자

 

로지스틱 회귀(Logistic Regression), 시그모이드(sigmoid)에 대해 알고 파이토치로 실습해보자

로지스틱 회귀 이번 글은 로지스틱 회귀와 시그모이드 함수, 교차 엔트로피(크로스 엔트로피)에 대해서 알아보고 파이토치로 간단하게 실습까지 해보려 한다. 예를 들면 어떤 메일을 받았을 때

kdbeom.com

 

소프트맥스(softmax) 함수란?

벡터가 벡터의 모든 원소의 합이 1이 되도록 원소들의 값을 변환시키는 함수이 기계 학습 및 신경망에서 자주 사용 된다.

 

  • 입력값을 출력값으로 변환
  • 출력값은 각 클래스에 대한 확률로 표현
  • 출력값의 합은 1이다.

 

 

softmax 기능의 작동 방식에 대한 단계별 분석

  1. 입력 벡터의 각 요소에 대해 수학 상수 e를 사용해 지수 값 계산 
    • e를 사용하면 양수 보장(확률이기에 음수가 안되어야 함)
    • 입력 값이 증가하면 출력 값 증가
    • 확률의 상대적 순서를 유지
  2. 지수 값 합계
  3. 확률 계산
  4. 출력 확률의 합이 1이 되어야 한다.

 

 

소프트맥스 함수 특징

  1. 기계 학습, 다중 클래스 분류 작업에서 사용
  2. 신경망에서 소프트 맥스 함수는 종종 최종 계층에 적용되어 다양한 클래스에 대한 확률 분포를 생성

 

 

소프트맥스 회귀 파이토치 실습 코드

  • 비용 함수도 로지스틱 회귀와 같은 크로스 엔트로피이다.

크로스 엔트로피가 무엇인지 궁금하다면 알아보도록 하자.

 

 

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
torch.manual_seed(1)    #난수 발생 순서와 값을 동일하게 보장하는 특징

x_train = [[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_train = [2, 2, 2, 1, 1, 1, 0, 0]
x_train = torch.FloatTensor(x_train)
y_train = torch.LongTensor(y_train)

model = nn.Linear(4, 3)

optimizer = optim.SGD(model.parameters(), lr=0.1)

nb_epochs = 1000
for epoch in range(nb_epochs + 1):

    # H(x) 계산
    prediction = model(x_train)

    # cost 계산, F.log_softmax()와 F.nll_loss() 합친 게 F.cross_entropy
    cost = F.cross_entropy(prediction, y_train) 

    # cost로 H(x) 개선
    optimizer.zero_grad()  #기울기 0으로 초기화를 해야 이전에 계산된 기울기 값이 누적이 안됨
    cost.backward()        #w와 b에 대한 기울기 계산
    optimizer.step()       #lr을 곱하면서 업데이트

    # 20번마다 로그 출력
    if epoch % 100 == 0:
        print('Epoch {:4d}/{} Cost: {:.6f}'.format(
            epoch, nb_epochs, cost.item()
        ))

 

 

이렇게 소프트맥스 함수가 무엇인지 알아보았다.