관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

텍스트를 위한 인공 신경망 4 - 순환 신경망으로 IMDB 리뷰 분류하기 2 : 순환 신경망 만들고 훈련하기 <코드 오류 수정하기> 본문

인공지능/딥러닝

텍스트를 위한 인공 신경망 4 - 순환 신경망으로 IMDB 리뷰 분류하기 2 : 순환 신경망 만들고 훈련하기 <코드 오류 수정하기>

huenuri 2024. 12. 18. 09:40

순환 신경망을 훈련하는 내용을 학습해 보겠다. 


 

 

 

 

순환 신경망 만들기

책에 있는 코드 오류가 너무 많아서 다시 이전의 학습했던 코드를 수정하고 다시 만들어보기로 했다.

 

 

 

 

 

 

이제 드디어 출력이 잘 되었다.


 

 

 

 

순환 신경망 훈련하기

 

 

 

에러 메시지 "ValueError: The filepath provided must end in .keras (Keras model format). Received: filepath=best-simplernn-model.h5"는 ModelCheckpoint 콜백에 제공된 filepath 인자가 올바른 형식이 아님을 나타낸다. Keras는 전체 모델을 저장할 때 파일 경로가 '.keras'로 끝나기를 기대한다. 사용자 코드에서 파일 경로는 'best-simplernn-model.h5'이며 '.h5'로 끝나므로 오류가 발생한다.

 


 

 

 

코드 수정하기

이 코드가 실행이 안되고 세션이 계속 다운이 되어 몇 시간을 고민하며 수십 번 도전했는지 모른다. 이제 해결이 되어서 해결 방법과 함께 코드를 붙여본다.

 

세션이 종료되는 문제는 보통 메모리 부족(Out of Memory, OOM) 때문에 발생한다. 특히 원-핫 인코딩 된 데이터인 train_oh와 val_oh가 너무 커서 GPU나 RAM 메모리를 초과할 가능성이 크다.

 

문제 원인

  1. 원-핫 인코딩 사용
    train_oh와 val_oh는 원-핫 인코딩된 데이터로, IMDB 데이터셋에서 단어 수(num_words=500)를 기준으로 각 단어가 500 차원의 벡터로 변환된다.
    따라서 데이터셋의 크기가 (samples, 100, 500) 형태가 되어 매우 커진다.
    • 예: 10,000개의 샘플 → 약 500MB 이상의 메모리를 차지할 수 있다.
  2. RNN 레이어 특성
    SimpleRNN은 시간 단계가 길수록 메모리 사용량이 증가한다. 원-핫 인코딩과 함께 사용하면 부담이 커져서 세션이 종료될 수 있다.

 

해결 방법

원-핫 인코딩 대신 정수 인코딩 사용

원-핫 인코딩 대신 단어의 정수 인덱스를 그대로 사용할 수 있다. 이렇게 하면 메모리 사용량이 대폭 줄어든다.

 

 

 

 

 

 

처음으로 모델 훈련이 되었다. 이 훈련은 10번 만에 조기 종료되었다. 책에서는 38번째에 에포크까지 진행되었다. 검증 세트에 대한 정확도는 약 80%로 정도이다. 매우 뛰어난 성능은 아니지만 감상평을 분류하는데 어느 정도 성과를 내고 있다고 판단할 수 있다.

 

 

 

이제 훈련 손실과 검증 손실을 그래프로 그려 살펴보겠다.

 

훈련 손실은 꾸준히 감소하고 있지만 거증 손실은 감소가 점차 둔해진다. 여기서 한 가지 생각할 점이 있다. 이 작업을 하기 위해 입력 데이터를 원-핫 인코딩으로 변환했다. 원-핫 인코딩의 단점은 입력 데이터가 엄청 커진다는 것이다.

 

토큰 크기를 300차원으로 늘렸기 때문에 대략 300배가 커진다. 이른 좋은 방법이 아니다.


 

 

 

 

 

학습을 마치고

이 문제를 해결하는데 얼마나 힘들었는지 모른다. 정말 포기하려고 했었고 RNN 공부는 여기서 마쳐야 되나 했었다. 하지만 문제를 끈질기게 물고 늘어지면서 내가 포기하지 않자 마침내 해결할 수 있었다.

공부는 이렇게 하는 것 같다. 그러면서 많이 배웠다.