본문 바로가기
A·I

[Keras] 뉴스 기사 토픽 분류로 보는 다중 분류(multi-classification)

by 방구석 몽상가 2018. 12. 26.
2018-12-26-reuter-dataset

1986년에 공개된 로이터(Reuter) 데이터셋은 짧은 뉴스 기사와 토픽의 집합으로 이루어져 있다. 알다시피 뉴스 기사는 텍스트 데이터이며, 단어 순서가 유지되어야 하는 시퀀스 데이터다. 총 46개의 토픽이 있으며, 각 토픽마다 기사 데이터 수가 일정하지는 않다.


1. 데이터 준비하기

로이터 데이터셋도 IMDB 데이터셋과 마찬가지로 Keras에 포함되어 있으며, 같은 형태를 취하고 있다. 학습 데이터는 정의된 단어 사전 내 해당 단어의 인덱스를 저장한 리스트 형태다.

딥러닝 모델에 주입하기 위해 원-핫 인코딩을 통해 리스트를 벡터로 변환하였다.

 

2. 모델 구성하기

10000차원 텐서를 주입하기 때문에 input_shape를 (10000,)으로 설정해놓는다. 만약 데이터셋의 형태가 (samples, d1, d2, ...) 이라면 samples를 제외한 (d1, d2, ...)를 input_shape로 설정하면 된다. 활성화(activation) 함수는 relu를 사용하고 46개의 토픽으로 다중 분류하는 것이므로 softmax를 마지막 활성화 함수로 설정하고 output은 46으로 설정한다. 그러면 softmax의 46개 output 중 가장 큰 값이 예측 값이 되게 된다.

여기서 중요한 점은 최종 출력이 46으로 크기 때문에 앞의 layer의 출력 크기는 그보다 충분히 커야 한다. 이미지를 예로 들어보자. 512x512 이미지를 256x256 크기로 reduction하고나서 다시 512x512로 회복하면 정상적으로는 보이겠지만 값은 약간 손실된다. 마찬가지로, layer의 출력이 작게 하면 그만큼 데이터의 특징이 손실되어 제대로 된 결과를 얻을 수 없을지도 모른다. 이러한 현상을 정보 병목이라고도 한다.

실제로 하나의 hiddle layer의 출력 크기를 32로 했을 때 테스트 데이터에 대한 정확도는 77.2%, 64로 했을 때는 77.8%, 128로 늘렸을 때는 79.6%가 나왔다.

 

3. 모델 컴파일하기

모델을 구성을 마쳤으면, 딥러닝 시 사용될 함수들을 지정해주어야 한다. 여기선 optimizer는 RMSprop, loss 함수는 categorical cross entropy 함수를 사용했다. 세부적으로 하이퍼파라미터를 정하기 위해 인수로 다음과 같이 함수를 전달할 수도 있다.

 

4. 모델 훈련하기

훈련하기에 앞서 앞쪽에 있는 1000개의 데이터를 검증 데이터로 분리한다. 그런 다음 하이퍼파라메터를 결정하여 훈련시킨다.

 

5. 모델 평가하기

이제 학습된 모델로 테스트 데이터를 평가한다.

훈련데이터에 대한 정확도는 약 96.1%, 검증 데이터에 대한 정확도는 약 78.9%, 테스트 데이터에 대한 정확도는 77.6%가 나왔다. 분명 훈련 데이터에 대한 정확도는 높은데 다른 데이터에 대해서는 정확도가 높지 못 하다. 그 이유는 바로 학습 모델이 훈련 데이터에 overfitting(과적합) 되었기 때문이다. 이를 해결하기 위해선 하이퍼파라미터를 조정하거나 다른 여러 방법들이 필요하다. 여기선 순수하게 하이퍼파라미터를 조정해서 정확도를 높여보자.

 

6. 하이퍼 파라미터 수정

먼저, optimizer를 바꿔보자. Adam 함수는 흔하게 쓰이며 좋은 결과를 내는 최적화 함수 중 하나다.

결과

다음으로, input layer와 hidden layer 출력 수를 128로 설정하고, 과적합을 피하기 위해 epoch을 10으로 설정해보자.

결과

이런식으로 사용한 함수, 레이어 수를 바꿔보거나 하이퍼파라미터를 조정하여 정확도를 높일 수 있다. 하지만 과적합을 피해서 정확도를 높이기에는 한계가 있다. 이를 위해 dropout과 같은 기법이 요구된다.

 

7. 훈련 결과 그래프 그리기

훈련이 잘 되었는지 수치 상으로도 확인할 수 있지만 epoch 수가 많아지면 그런 식으로 확인하는 건 힘들어지게 된다. 그래서 matplotlib를 이용해 그래프를 그려 한 눈에 학습 과정을 보는 것이 좋다.


Training loss를 보면 훈련 데이터에 대해서는 잘 학습되고 있다는 것을 알 수 있지만, Validation loss를 보면 검증 데이터에 대해서는 2 epoch 이후에는 거의 학습이 안 되는 것을 볼 수 있다.

댓글