No Limitation
[Pytorch] 다중 클래스 분류 회귀 본문
참고 자료
https://wikidocs.net/53560
유원준 님의 Pytorch로 시작하는 딥러닝 입문 책 자료를 참고하였습니다.
Binary가 아닌 Multi class인 경우는 softmax 확률 값을 근간으로 확률이 가장 높은 값에 labeling이 된다.
이 때의 class label은 One-hot encoding을 통해 값이 저장됨을 알고 있다.
이 때의 손실 함수는 다음 수식처럼 Cross Entropy의 개념을 사용한다.
3개의 샘플에 대해 5개의 label이 존재한다는 문제를 가정해보자. 즉,
예를 들어 철수, 상우, 주성이 있으면 이 세 명이 각각 A, B, C, D, E 중 어떤 그룹에 속하냐 뭐 이런 문제를 가정할 수 있는 것이다.
다음과 같이 코드를 수행해보자
즉 아래의
hypothesis는 3개의 관측치에 대해서 5개의 label에 속하는 각각의 softmax 값을 나타내는 것이다.
예를 들면 첫 번째 관측치는 0.2645로 첫 번째 레이블에 가장 속할 확률이 높다.
그렇다면 이렇게 소프트맥스 값을 구했다면
이를 실제로 Labeling을 수행해주어야 하므로
각각의 label을 원핫 인코딩해주는 과정을 거친다.
다음과 같은 Label이 존재한다고 하면 [3개의 관측치가 속하는 클래스]
다음과 같이 원핫 인코딩을 시켜줄 수 있는데
조금 더 구체적으로 살펴보자.
우선, [0], [1], [2], [3], [4], [5] 같은 녀석들을 전부
[1, 0, 0, 0, 0]
[0, 1, 0, 0, 0] .. 과 같은 식으로 나타내기 위해서는
각 5개의 label에 대한 원 핫 벡터로 표현이 이루어져야 하는데
여기서는 문제 예시로
[ 0, 2, 1 ] 이 정답이라고 했으므로
각 3개의 관측치를 A, B, C라고 하면
A - 0
B - 2
C - 1
에 배정되는 것이다.
이를 원핫 인코딩으로 나타내주기 위해서 처음으로
torch.zeros_like()를 수행해주면
다음과 같이 0으로 세팅되고
scatter_를 통해 각 idx 별로 값을 대입해주는데 이게 뭔지 조금 더 구체적으로 살펴보자
참고 : https://aigong.tistory.com/35
다음 그림을 보자
여기서 중요한 특징은
.scatter_("행이냐열이냐", "값을 넣을 인덱스", "넣을 값")
이런 특징을 아는 것이다.
즉 여기서는
[ 0, 0, 0, 0, 0 ]
[ 0, 0, 0, 0, 0 ]
[ 0, 0, 0, 0, 0 ]에서
각각 [0], [2], [1]의 정보를 담기 위해
torch.zeros_like(hypothesis).scatter_(1, torch.FloatTensor( [[0],[2],[1]] ), 1)
과 같은 과정을 수행하는 것이다.
이를 조금 더 편리하게 나타내는 것은
기존에 y가
다음과 같이 구성이 되어 있었기에
이를 unsqueeze를 통해 reshape 시켜주어
다음과 같이 나타내주어 이를 idx 자리에 집어 넣어
최종으로
다음 수식이 구현되게 된다. 이렇게 y_one_hot을 구성한다.
이제 위의 cross entropy 수식을 구현하면 다음과 같이 구현할 수 있다.
이것도 조금 뜯어보면
우선
여기 수식으로 인해 각 idx에 맞는 소프트 맥스 확률 값이 부여되고
여기서
행 방향으로 합을 해준 다음에
평균을 구해 전체 비용을 계산할 수 있다.
하지만 이를 일일이 계산하기 조금 복잡해서 간단하게 Pytorch 내부적으로 내장되있는 모듈을 사용할 수 있다.
우선 다음과 같이 softmax값에 log를 취해주는 연산을 한꺼번에 해주는 log_softmax()가 있고
Cross Entropy도 간단하게 수행해주는
다음과 같이 one_hot_encoding 만들지 않고 바로 나타낼 수도 있다.
보다 간단하게 log_softmax도 필요 없이
이렇게 나타낼 수 있다. 보통 이 함수를 많이 사용한다고 한다.
그럼 이제 실제 분류를 수행하는 예시를 분석해보자
데이터는 다음과 같다.
[1] 직접 구현
[2] nn.Module 사용
[1] 직접 구현
- 원 핫 인코딩 수행
- 가중치와 편향값 초기화
- Gradient Descent
[2] nn.Module 사용
여기도 마찬가지로 nn.Linear를 사용한다.
'ML & DL & RL' 카테고리의 다른 글
[Pytorch] XOR Perceptron 구현하기 (0) | 2022.02.21 |
---|---|
[Pytorch] MNIST 데이터 분류하기 - 소프트맥스 회귀로 분류 (0) | 2022.02.11 |
[Pytorch] 로지스틱 회귀분석 (0) | 2022.02.04 |
[Pytorch] Custom Dataset (0) | 2022.02.03 |
[Pytorch] Mini Batch Size와 Data Loader (0) | 2022.02.03 |