Notice
Recent Posts
Recent Comments
«   2024/09   »
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
Tags
more
Archives
Today
Total
관리 메뉴

No Limitation

[Pytorch] 다중 클래스 분류 회귀 본문

ML & DL & RL

[Pytorch] 다중 클래스 분류 회귀

yesungcho 2022. 2. 4. 17:41

참고 자료
https://wikidocs.net/53560
유원준 님의 Pytorch로 시작하는 딥러닝 입문 책 자료를 참고하였습니다. 

 

Binary가 아닌 Multi class인 경우는 softmax 확률 값을 근간으로 확률이 가장 높은 값에 labeling이 된다. 

이 때의 class label은 One-hot encoding을 통해 값이 저장됨을 알고 있다. 

 

이 때의 손실 함수는 다음 수식처럼 Cross Entropy의 개념을 사용한다. 

 

출처 : Pytorch로 시작하는 딥러닝 입문, 유원준 등

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

 

다음 그림을 보자

출처 : 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를 사용한다.