Yet Never Lose Faith

- Good to Great , Jim Collins

How To Preprocess Image Data 자세히보기

Deep Learning/[Books] Do it! 정직하게 코딩하며 배우는 딥러닝 입문

다중분류 다층신경망 구현하기 - 상

Kellyyyy 2020. 10. 19. 08:00

 

이번 포스팅에서는 다중분류 다층신경망의 개념과 기본적인 구조에 대해서 알아본다.


Multiclass Classification

다중분류 다층신경망

 

다중분류는 말 그대로 여러 개의 클래스로 분류할 수 있는 모델을 의미한다. 이전 포스팅에서 다뤘던 이진분류모델과는 출력층의 개수만 다르다. 이진분류는 양성클래스에 대한 확률(y_hat)만 출력했기 때문에 출력층의 뉴런이 1개였지만 다중분류 신경망은 출력층에 분류할 클래스 개수만큼 뉴런을 배치한다.


Problem.

그런데 이진분류 모델에서 출력층의 개수만 늘려서 다중분류 모델로 사용하면 한 가지 문제가 생긴다. 아래의 두 그림은 사과, 귤, 포도의 이미지를 분류하는 다중분류신경망의 출력층만 나타낸 것이다. 왼쪽과 오른쪽의 신경망은 모두 자동차를 타깃 클래스로 예측하고 있다. 과연 어느 신경망이  더 정확하게 예측했다고 볼 수 있을까?

왼쪽 신경망은 사과 예측 확률은 높지만 다른 클래스의 확률과 유사하다. 반면 오른쪽 신경망은 사과 클래스 확률은 낮지만 다른 클래스에 비해서는 꽤 높은 수치이다. 이런 출력층의 활성화 값은 공정하게 비교하기가 어렵다는 문제점이 있다.

 

Solution.

이를 해결하기 위해서 소프트맥스 함수를 사용하여 출력층의 출력 강도를 정규화해준다. 출력 강도를 정규화한다는 것은 전체 출력값의 합을 1로 만든다는 의미이다. 

소프트맥스 함수

위의 수식에서 z_i는 출력층의 각 뉴런에서 계산된 선형 출력을 의미하고 e는 자연 상수를 의미한다. 자, 그럼 위의 출력층에 적용하여 정규화해보자. 소프트맥스 함수에서는 출력층에서 계산된 선형출력 (z_1, z_2, z_3)가 필요한데, 이 값은 시그모이드 함수를 이용하여 구할 수 있다.

선형출력 구하는 방법
선형출력 구하는 방법

이제 이 값을 소프트맥스 함수에 대입하여 출력강도를 정규화해보자.

정규화 과정

두 번째 신경망도 위와 같은 과정을 통해 확률을 정규화 한 뒤 이를 토대로 두 개의 신경망을 다시 그렸다.

이제 어느 신경망이 더 정확하게 예측한 것인지 확실히 알 수 있게 되었다. 두 번째 샘플이 74%로 가장 높은 확률로 예측되었다.


Cross Entropy Loss.

 

다중 분류모델에서 마지막으로 짚고 넘어가야 할 항목은 바로 손실함수이다. 다중분류모델은 크로스 엔트로피 손실함수를 사용한다. 크로스 엔트로피 손실함수는 로지스틱 손실함수와 아주 유사한데, 이는 로지스틱 손실함수가 크로스 엔트로피 손실함수의 이진분류 버전이기 때문이다.

크로스엔트로피손실함수
로지스틱 손실함수

 

크로스 엔트로피 손실함수의 시그마 기호 위의 값(c)은 전체 클래스 개수를 의미한다. 이때 c가 2이면 이진분류가 되는 것이고 이는 로지스틱 손실함수의 식이 된다. 시그마를 풀어 쓴 가운데 수식은 클래스마다 타깃과 활성화 출력의 로그값을 곱하여 더한 것이다. 분류문제에서 정답클래스의 타깃은 1이고 나머지 클래스의 타깃은 0이기 때문에 결국 정답 클래스를 제외한 나머지 클래스에 대한 손실항은 모두 소거되어 아래와 같이 정리할 수 있다. 

 

크로스엔트로피 손실함수

 

크로스 엔트로피 손실함수의 미분.

 

크로스 엔트로피 손실함수 미분결과

 

크로스 엔트로피 손실함수를 미분한 결과이다. 도출과정은 아래 더보기 버튼을 통해 확인할 수 있다. 미분 결과를 보면 결국 로지스틱 손실함수의 미분과 정확히 일치한다는 것을 확인할 수 있다. 다음 포스팅에서는 미분한 결과를 토대로 가중치를 업데이트 하는 소스를 작성해보고, 다중분류 모델을 구현해본다.

 

끝.

 

Reference.

 

도서 <Do it! 정직하게 코딩하며 배우는 딥러닝 입문> 이지스 퍼블리싱, 박해선 지음