1. 도입
선형 분류(Linear Classifier)는 선형 회귀에 있던 것처럼 Wx+b의 선형 방정식 형태로 데이터를 분류하는 것을 말합니다. W를 바꾸게 되면 결정할 수 있는 기준(결정 경계)가 회전하게 되고, b를 조정하게 되면 결정 경계가 위/아래로 이동하게 됩니다. 비교적 단순하게 가중치 W와 편향 b만으로 데이터를 구분할 수 있습니다. 선형 기준(2차원에서는 직선, 3차원에서는 평면)에 따라 나뉘기 때문에 2가지 유형으로 분류가 가능합니다. (Binary Classifier) 하지만, 이 방법의 한계는 결정 경계를 기준으로 구분만 할 뿐 추가적으로 해석할 내용이 없습니다.
2. 로지스틱 회귀
로지스틱 회귀(Logistic Regression 또는 Logit Regression)는 데이터가 어떤 클래스에 속할지에 대한 확률을 계산해줍니다. 그리고 추정 확률이 50%가 넘을 경우 해당 데이터가 클래스에 속한다고 예측하는 모델입니다. 방법은 아래와 같이 진행합니다. [1]
1) 선형식에 대한 계산
2) 시그모이드 함수를 통해 계산값을 0~1 사이의 확률로 변환
3) 변환된 확률이 0.5를 기준으로 이상이면 1, 아니면 0으로 정의
위 방법에서 시그모이드 함수부터 살펴보겠습니다.
2.1. 시그모이드 함수
시그모이드 함수는 S자형 곡선(시그모이드 곡선)을 갖는 함수로, 실수 전체를 정의역으로 갖고 함수값은 단조증가(감소)하는 형태를 갖습니다. 대표적인 시그모이드 함수는 로지스틱 함수, 쌍곡탄젠트 함수, 아크탄젠트 함수 등이 있습니다. [2]
로지스틱 함수에 대해 조금 더 살펴보자면, 소프트맥스 함수의 특수한 상황이기도 합니다. 즉, 0/1로 이진 분류하는 경우에는 로지스틱 함수를 쓸 수 있지만 클래스가 더 많은 경우로 일반화하면 소프트맥스 함수를 생각해볼 수 있을 것 입니다.
2.2. 로지스틱 함수의 손실 함수
여러 시그모이드 함수 중 로지스틱 회귀에서 사용할 로지스틱 함수의 손실 함수에 대해 살펴보겠습니다. (머신러닝을 활용하려면 손실 함수가 필요함을 얘기한 적 있습니다 [4])
머신러닝 과정에서 손실함수와 최적화가 필요한 이유
1. 머신러닝 개요와 모델 기반 학습 머신러닝은 데이터로부터 학습할 수 있도록 컴퓨터를 프로그래밍하는 것을 말합니다. 잘 설계된 머신러닝의 프로세스는 다음과 같이 정의할 수 있습니다.
seanpark11.tistory.com
로지스틱 함수의 손실함수로 사용될 수 있는 Binary Cross Entropy (BCE) 함수는 아래와 같이 유도될 수 있다. (좀 더 자세한 설명은 그 아래 링크의 블로그 글을 참고)
[손실함수] Binary Cross Entropy
확률, 정보이론 관점에서 살펴보는 Binary Cross Entropy 함수
curt-park.github.io
3. 파이토치로 모델 구축
이전에 만들었던 선형회귀 모델[4]에서 손실함수와 모델에 시그모이드가 추가된 사실을 제외하면 거의 유사합니다. 이중에서 조금 다른 부분인 Sigmoid에 대해서만 살펴보고자 합니다.
3.1. Sigmoid in PyTorch
파이토치에서 sigmoid는 요소마다 로지스틱 함수를 적용하는 형태로 제공하고 있습니다. torch.nn.Sigmoid 클래스, torch.nn.functional.sigmoid 함수로 사용 가능합니다.
import torch
import torch.nn as nn
sigmoid = nn.Sigmoid()
input = torch.randn(2)
output = sigmoid(input)
3.2. 최종 모델
입력 데이터(x)와 레이블(y)을 제외하고는 아래와 같이 구현할 수 있습니다.
import torch.nn as nn
import torch.optim as optim
# 선형 회귀 모델 클래스
class BinaryClassification(nn.Module):
def __init__(self, input_dim, output_dim):
super(BinaryClassification, self).__init__()
self.layer_1 = nn.Linear(input_dim, output_dim)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
y = self.layer_1(x)
z = self.sigmoid(y)
return z
model = BinaryClassificationRegression(1, 1)
# 손실함수
criterion = nn.BCELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 모델 학습
# x,y 는 실제값으로 입력되어 있다고 가정
epochs = 100
for epoch in range(epochs):
y_hat = model(x)
loss = criterion(y_hat, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
4. 참고자료
[1] 오렐리앙 제롱, 『핸즈온 머신러닝 (2판)』
[2] Wikipedia. (2024). "시그모이드 함수". https://ko.wikipedia.org/wiki/%EC%8B%9C%EA%B7%B8%EB%AA%A8%EC%9D%B4%EB%93%9C_%ED%95%A8%EC%88%98
[3] Wikipedia. (2024). "Softmax function" https://en.wikipedia.org/wiki/Softmax_function
[4] https://seanpark11.tistory.com/109
'Python > Data Analysis' 카테고리의 다른 글
PIL을 활용한 이미지 특징(Image attributes) 추출하기 | 이미지 데이터 EDA (0) | 2024.09.25 |
---|---|
인공신경망에서 그래디언트 손실 및 폭주 문제 해결 | 활성화 함수, 가중치 초기화 (2) | 2024.08.31 |
PyTorch를 통해 Linear Regression 구현하기 (0) | 2024.08.19 |
머신러닝 과정에서 손실함수와 최적화가 필요한 이유 (1) | 2024.08.17 |
[PyTorch] 파이토치 메서드로 텐서의 연산 수행하기 (0) | 2024.08.16 |