Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- es_java_home
- On-Premise
- dockercompose
- 소프티어
- bfs
- BFS
- s3
- 백엔드 개발
- MESSAGEBROKER
- jsonwebtoken
- 알고리즘
- sonarqube
- 카카오엔터프라이즈
- objectstorage
- 구름
- 정렬
- 코드트리
- 동전 퍼즐
- softeer
- bitmask
- CODETREE
- 완전탐색
- db
- 자바
- DP
- java
- 카카오클라우드
- DFS
- 함수 종속성
- 인가인증
Archives
- Today
- Total
wooing
소프트맥스 회귀(Softmax Regression) 본문
다중 클래스 분류(Multi-class Classification)
3개 이상의 선택지 중에서 하나로 분류하는 문제이다. 다중 클래스 분류 문제를 해결하는 방법 중 하나로 소프트맥스 회귀가 있다.
소프트맥스 회귀
X: 입력
W: 가중치
B: 편향
Y^ 또는 H(X) : 출력 결과
소프트맥스 회귀는 선택지의 갯수만큼의 원소를 가지는 벡터를 만들고 모든 원소의 합이 1이 되도록 하며 각 선택지마다 소수의 확률을 할당한다.
H(X) = softmax(WX + B)
소프트맥스 함수(Softmax function)
z_i : k차원의 벡터에서 i번째 원소
p_i: i번째 클래스가 정답일 확률
각 선택지에 대한 확률을 구하는 공식은 아래와 같다.
즉 softmax(WX+b)를 하게 되면 결과값으로 [특성 갯수, 입력 갯수]크기의 확률값이 들어간 행렬을 반환한다.
비용 함수(Cost function)
소프트맥스의 비용함수로는 크로스 엔트로피 함수를 사용한다.
크로스 엔트로피 함수
공식은 위와 같으며 전체 n개의 데이터에 대한 평균을 구하기 위해서는 아래와 같이 표현할 수 있다.
소스코드
#소프트맥스 회귀 구현
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
torch.manual_seed(1)
#훈련 데이터와 레이블 생성 (4개의 특성 8개의 샘플)
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)
# 모델 초기화
W = torch.zeros((4, 3), requires_grad=True)
b = torch.zeros(1, requires_grad=True)
# optimizer 설정
optimizer = optim.SGD([W, b], lr=0.1)
y_one_hot = torch.zeros(8, 3)
y_one_hot.scatter_(1, y_train.unsqueeze(1), 1)
nb_epochs = 1000
for epoch in range(nb_epochs + 1):
# Cost 계산
# # 가설
# hypothesis = F.softmax(x_train.matmul(W) + b, dim=1)
# # 비용 함수
# cost = (y_one_hot * -torch.log(hypothesis)).sum(dim=1).mean()
z = x_train.matmul(W) + b
cost = F.cross_entropy(z, y_train)
# cost로 H(x) 개선
optimizer.zero_grad()
cost.backward()
optimizer.step()
# 100번마다 로그 출력
if epoch % 100 == 0:
print('Epoch {:4d}/{} Cost: {:.6f}'.format(
epoch, nb_epochs, cost.item()
))
References:
'인공지능 > 머신러닝' 카테고리의 다른 글
과적합, 기울기 소실, 기울기 폭주 (1) | 2023.01.30 |
---|---|
퍼셉트론(Perceptron) (0) | 2023.01.29 |
정수 인코딩, 원-핫 인코딩(Integer Encoding, One-hot Encoding) (0) | 2023.01.19 |
로지스틱 회귀(Logistic Regression) (0) | 2022.10.26 |
선형 회귀(Linear Regression) (0) | 2022.10.25 |