[딥러닝] 텍스트 분류 모델 학습 중 발생한 문제와 대응

timo·2022년 6월 1일
0

학부 4학년 캡스톤 디자인 과목 프로젝트 진행 과정, 고민 들을 기록했습니다.

금방 끝날 줄 알았던 AI 모델링 과정

과거 데이터 분석 연합동아리에서 DACON의 뉴스 토픽 분류 대회의 데이터셋을 이용하여 프로젝트를 진행한 적이 있다. 뉴스 제목이 주어지면 6개의 주제 중 하나로 분류하는 과제였다. 약 6만건의 데이터가 주어졌고, BERT를 활용한 모델이 약 0.8정도의 accuracy를 보였다.
이번 캡스톤 디자인 과목에서의 프로젝트에서 네이버 블로그들의 맛집 리뷰 포스팅들을 학습시켜야 했다. 뉴스 토픽 분류 대회 처럼 '분류'하는 것이 동일했고, 분류해야 하는 class가 2개로(광고인지 아닌지) 오히려 적었다. 그래서 이전에 사용했던 BERT를 사용했던 pytorch코드에 크롤링한 블로그 포스팅을 사용하면 빠르게 모델을 만들 수 있을 것이라 생각했다. 하지만, 실제 학습 과정은 예상처럼 수월하지 않았다..

첫 학습 과정

아래와 같은 train, test 분리, tokenize, labeling된 tsv데이터를 이용해 python 학습 코드를 실행시켰다.

하지만 코드는 계속해서 오류를 뿜어댔는데..

RuntimeError: The expanded size of the tensor (307) must match the existing size (300) at non-singleton dimension 1.  Target sizes: [16, 307].  Tensor sizes: [1, 300]

와 같은 에러나, RuntimeError: cuda runtime error 등을 발생시켰다. 학습시키는 소스 코드의 문제인가 싶어 살펴보았지만 오류를 찾을 수 없었다. 구글링 결과 원인은 다음과 같았다.

1. BERT의 최대 텍스트 길이

BERT의 최대 Sequence 길이는 512였다. 블로그 포스팅 텍스트를 tokenize할 경우, 512개보다 훨씬 긴 길이가 대부분이었고 이는 Error을 발생시켰다.

2. 가용 RAM 메모리의 부족

데이터를 학습시킬 컴퓨터는 GTX1060 6GB모델을 장착한 데스크탑이었다. 과거 뉴스 토픽 분류 프로젝트느 뉴스 기사가 짧기 때문에 수월하게 학습이 가능했다. 하지만 블로그 포스트의 경우 아래에서 서술하겠지만 포스트 텍스트를 많이 덜어내고 학습시켜도 계속해서 오류를 발생시켰다. batch size를 4 혹은 8까지 줄여보았더니 정상적인 학습이 가능했고, 하드웨어 사양이 부족해서 발생한 문제였다.

1. 2. 대응: Text Slice

원래의 계획은 맛집 리뷰의 전체적인 언어적 특성을 학습하는 것 이었다. 하지만 위와 같은 문제가 발생했다. 장문의 텍스트를 학습시키는 방법을 찾는 방향으로 대응 할 수 있었지만, 시간이 여유롭지 않다고 판단했다. 따라서 전체 블로그 텍스트의 전부가 아닌, 마지막 500자 부분의 언어적인 특성을 학습시켜 모델을 우선 완성하기로 했다.

프론트, 백 어플리케이션 등 전체적은 틀을 우선 완성 한 후 AI모델을 개선하는 방향으로 진행했다.

결국 텍스트를 덜어냄으로서 학습을 완료할 수 있었다.

profile
Backend Developer

0개의 댓글