성균관대 "AI로 글쓰기" 해커톤 - OpenAI GPT-2 한글 transfer learning 작업기 (1)
19.11.22 ~ 23일. 성균관대에서 진행한 딥러닝으로 글쓰기 해커톤 대회 참여 및 작업기.
교내 학부생 및 대학원생을 대상으로 처음 진행한 '딥러닝으로 글쓰기' 교내 해커톤이며.
마인즈랩 (https://mindslab.ai/kr) 에서 제공한 OpenAI GPT-2의 한글 pretrained 모델을 참여 팀에게 제공하고
교내 Tesla V100 GPU 1대씩 지원했다.
정원은 총 10팀이었으나 참여자가 많다는 이유로 추가 5팀을 받고, 5팀은 네이버 클라우드 쪽 회사의 서버를 이용할 수 있게 해 줬다.
본 행사를 시작하기 약 1주일 전부터 서버와 글 형식 (수필)을 공지했고,
일주일의 training 기간을 거쳐 행사 당일에 주제를 발표하는 방식이었다.
분량은 10,000자 이내. 주제는 '만약 (if)' 두 글자였다.
행사 시작 후 안내받기로는 마인즈랩에서 서비스하고 있는 '문장 생성' 서비스에서 사용하는 모델이라고 했다.
54개의 뉴스 카테고리, 총 1,000만 개의 뉴스 데이터로 GPT-2 모델을 학습시켰다고 하며, 해당 모델을 학생들에게 제공했다.
https://maum.ai/login/loginForm?lang=ko
작업했던 내용들은
https://github.com/inspirit941/gpt_hackathon
에서 확인할 수 있다. 단, 재연은 불가능하다. GPT-2 모델 업로드는 하지 않았기 때문.
작업 일대기
(1) 모델 사용방법 파악해보기
이 행사에 참여하면서, 딥러닝으로 자연어 처리를 진행해 문장을 이해하거나 / 문장을 생성하는 모델이 어디까지 진행됐는지 먼저 찾아봤다. 2018년 pycon에서 발표한 '딥러닝으로 소설 쓰기' 발표내용을 들으며 Attention과 transformer 라는 모델형식을 처음 알았고, transformer Encoder 모델을 활용한 BERT와 Decoder 모델을 활용한 GPT-2가 있다는 사실까지는 확인했다.
내가 간단히 이해한 GPT-2 알고리즘은
'단어 토큰이 주어지면,
attention을 토대로 그 다음에 등장할 수 있는 토큰 중 가장 개연성 높은 토큰을 확률적으로 배치하고,
다시 그 토큰을 기준으로 attention + 확률을 토대로 계속 단어를 배열해간다'였다.
transformer Decoder 모델을 완벽히 이해할 시간여유도 없고, 쓰인 언어도 덜 친숙한 tensorflow였지만
pretrained 모델을 transfer learning하는 게 목적이었기 때문에 굳이 모델 전체를 이해할 필요는 없다고 생각했다.
데이터 전처리를 어떻게 했는지 / 학습은 어떻게 진행하는지 / 결과물은 어떻게 만들어내는지만 알면 행사에 참여하는 데엔 무리 없었기 때문이다.
모델을 학습하는 법 / 학습 모델에서 데이터를 만들어내는 법은 주최측에서 미리 코드를 알려줬다.
그 코드를 실행할 수 있도록 데이터 세팅을 하는 게 제일 중요한 상황이었다.
깃허브에서, 소스코드 자체를 바꾼 건 거의 없다. 필요한 작업은 전부 "data" 디렉토리 안에서 해결했기 때문이다.
1. Tokenizer + Vocab
1,000만 개의 뉴스 데이터를 토대로 만든 Vocab은 Sentencepiece tokenizer를 사용했다고 한다. tokenizer.py 파일을 보니, sentencepiece로 한글 문장을 tokenize한 뒤, 각각의 토큰을 매칭되는 숫자로 변환하는 식으로 동작하고 있었다.
여기서는 작업할 부분이 하나뿐이었다. 1,000만 뉴스데이터로 토큰을 만들었지만,
학습에 사용하기 위해 새로운 텍스트 데이터를 tokenizer로 분할할 때
'사전에 없는 단어'가 발생하면 Exception이 발생하는 원래의 코드 구조를 변경해야 했다.
학습 시 발생할 수 있는 코드 오류는 이 부분뿐이었다.
2. hdf5 파일 형식 확인하기
마인즈랩 측에서 학습에 사용하는 sample을 제공했다. data/news_sample.hdf5가 해당 파일이다.
그동안 딥러닝으로 학습 데이터를 만들 때에는 이미지 데이터나 csv / tsv 파일을 pytorch의 dataloader 모듈을 써서 변환했는데,
hdf5 형태 파일은 처음이었다. tensorflow 코드를 뜯어서 학습 방식을 변경하기에는 시간이 부족하니,
수집한 데이터를 모델 쪽에서 인식할 수 있게 변환해 주는 작업이 필요했다.
python으로 hdf5파일을 확인하고 만드는 법은 아래 포스트를 참고했다.
https://hiseon.me/python/h5py-hdf5/
마치 파일 시스템의 folder -> file처럼 트리 형태로 구조화된 데이터 모습이었다.
news_sample.hdf5 파일을 분석한 결과
총 54개의 카테고리가 있고, 각 카테고리별로 2개의 단문이 있는 구조였다.
카테고리별로 정확히 어떤 형태의 텍스트가 들어가 있는지는 아래의 코드로 확인했다.
각 카테고리별로 id값이 있고,
이 값을 텍스트 토큰으로 변환시키는 작업을 수행한 결과물이다.
이 결과값으로 '어떤 데이터를 어떻게 만들어야 train에 활용할 수 있는지' 확인했다.
모델의 사용법을 확인했으니,
이제 모델에 사용할 데이터를 확보하고 tokenizer 함수로 변환하기만 하면 됐다.
어떤 텍스트 데이터를 어떻게 스크래핑했는지는 (2)에서 확인할 수 있다.