Softmax Regression

Uomnf97·2021년 5월 3일
0
post-custom-banner

softmax regression이란 : 함수를 통해 분류해야 되는 정답지(클래스)의 총 개수를 k라고 할 때, k차원의 벡터를 입력 받아서, 각 클래스에 대한 확률을 추정하는 회귀방식.

Softmax Regression를 활용할 수 있는 상황

1. binary classification VS K - classification

  • binary classification: 두가지 경우, 0과 1로 나타낼 수 있는 경우에 대해서 확률 모형을 만들어 예측하는 경우 사용되고, 이 경우에는 logistic regression함수를 쓰는게 맞으며, binary cross entropy/binary cross entropy loss, sigmoid함수를 활용함.
  • K- classification: k 개의 분류군이 있을 때, 그리고 k개의 분류군을 이산 확률 분포(Discrete Probability Distribution)으로 표현 할 수 있는 경우, Softmax를 활용할 수 있음. 확률을 통해서, 각 분류군의 값을 예측함. 패턴을 알아내는 일 등에 활용함. softmax layer와 cross entropy를 이용하여 구현.

구현

  • 필요한 라이브러리 : torch, torch.nn, torch.nn.functional, torch.optim
  • seed를 주어서 학습 할때마다, 일관된 결과값을 도출할 수 있도록 만들어줌.
  • 아래와 같은 식을,torch.nn.functional라이브러리의 인플레이스 함수인 softmax function을 이용(F.softmax(변수명, dim=차원수)를 통해서 구현함.
  • Cross Entropy : Cross Entropy란 두개의 확률분포가 있을때, 얼마나 유사한지 보여주는 확률값으로, 경사하강법을 이용해서 근사화하는 방법을 의미함. 구현을 할 때, 변수값이 이산 확률 변수임으로, one_hot_vector와, scatter를 활용하여 값을 바꿔줌. 그리고 log함수, scatter등을 활용해서 식을 그대로 구현함.
  • 쉽게 Corss-entropy 함수 구현하기:
    torch.nn.functional라이브러리 활용: F.cros_entropy(), F.log_softmax(),F.nll_loss()등을 활용해서 식을 간소화해서 나타내 줄 수 도 있음. 경우에 따라 직접구현 하는 경우, 혹은 함수를 활용해야 하는 경우가 다르니 유의할 것.

  • 코드 예시

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim

# For reproducibility
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)

class SoftmaxClassifierModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Linear(4, 3) # Output이 3!

    def forward(self, x):
        return self.linear(x)
        
model = SoftmaxClassifierModel()

# optimizer 설정
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 계산
    cost = F.cross_entropy(prediction, y_train)

    # cost로 H(x) 개선
    optimizer.zero_grad()
    cost.backward()
    optimizer.step()
    
    # 20번마다 로그 출력
    if epoch % 100 == 0:
        print('Epoch {:4d}/{} Cost: {:.6f}'.format(
            epoch, nb_epochs, cost.item()
        ))
profile
사회적 가치를 실현하는 프로그래머
post-custom-banner

0개의 댓글