• [3. 신경망 시작하기] 3-5. 뉴스 기사 분류 - 다중 분류 문제

    2021. 1. 9.

    by. 민영답게

     

    다중 분류 문제

     

     

    * 이진 분류와의 차이점 : 출력 클래스의 개수

     

     

    다중 분류의 종류

     

    -  단일 레이블 다중 분류  :  각 데이터 포인트가 하나의 클래스로 분류

     

    -  다중 레이블 다중 분류 :  각 데이터 포인트가 여러개의 클래스에 속함

     

     

     

    새롭게 알게 된 내용

     

      1. 레이블의 one hot encoding 방법

     

         데이터들을 벡터화 했던 것처럼, 직접 함수로 구현할 수도 있지만

         케라스의 to_categorical(train_labels) 를 통해 벡터로 변환시킬 수 있음

     

     

      2. 다중분류의 모델 층 구성방법

     

         이진분류와 다른 점 : 출력 클래스의 개수가 늘어남

         따라서, 중간층의 차원을 늘려주어야 함!

     

         기존에 16차원이었던 것을 64차원으로 증가시켜야 함

     

         그렇지 않으면, 정보의 병목 지점이 될 수 있음

     

         또한, 마지막 층의 크기는 클래스의 개수만큼 해주어야 함!

         (예를 들어, 클래스의 개수가 46개라면, 마지막 층은 46차원이어야 함)

     

         마지막 층은 활성화 함수로 softmax를 사용해야 함

     

         *  정보의 병목  :  Dense층에서는 이전 층의 출력에서 제공된 정보만 사용 가능.

                                        따라서, 일부 정보 누락하면 다시는 복원할 수 X

                                        ->  규모가 작은 층은 유용한 정보 잃게 됨

     

     

        3. 다중분류의 손실 함수

     

         이진분류에서는 binary_crossentropy를 사용하였지만,

         다중분류에서는 categorical_crossentropy를 사용해야 함

     

         ->  두 확률 분포 사이의 거리 측정하여 거리를 최소화하는 출력을 내도록 훈련시킴

     

     

        4. 레이블을 인코딩 하는 방법 中 정수 텐서로 변환하는 방법

     

         y_train = np.array(train_labels)

     

        위와 같이 정수 텐서로 변환함.

        이때에는 손실함수로 sparse_categorical_crossentropy를 사용해야 함

     

        categorical_crossentropy는 레이블이 범주형 인코딩되어있을 것으로 기대하기 때문에 사용할 수 X

      

        * 레이블을 인코딩하는 또다른 방법은 이진분류에서 다뤘던 one-hot-encoding!

     

         즉, 레이블을 인코딩할 때에는 다음의 두가지 방법 중 하나를 택하여 진행하면 됨

     

          1)  레이블을 one-hot-encoding 한 후, categorical_crossentropy 손실함수 사용

          2)  레이블을 정수로 인코딩 한 후, sparse_categorical_crossentropy 손실함수 사용

     

     

     

     

    실습  ( 직접 값 변경해보기 )

     

     1. 층의 크기 조정

     

         층의 크기를 64에서 128로 늘렸더니 정확도가 1% 향상되었다.

         그래서 256으로 더 늘려보았는데 정확도는 동일하였다.

     

         반대로, 층의 크기를 32로 줄였더니 정확도가 3% 떨어졌다.

         마지막 출력 클래스의 크기는 46인데 출력 클래스보다 중간층의 크기가 더 작아서

         책에 나온 정보 병목 현상이 발생한 것 같다.

        

     

     2. 층의 개수 조정

     

         기존에는 2개의 은닉층을 사용하였는데, 이를 1개로 줄여보았다.

         1개로 줄였을 때에는 정확도가 달라지지 않았다.

     

         그런데, 3개로 늘려보니 정확도가 떨어졌다.

     

         층의 개수가 많다고 좋은 것이 아니라는것을 한번 더 깨닫게 되었다.

     

     

     

     

     

    <케라스 창시자에게 배우는 딥러닝>(길벗, 2018)을 학습하고 개인 학습용으로 정리한 내용입니다.

    댓글