한국어 BERT 굽기

다들 버트, 버트 하는데 BERT는 어떻게 구워질까요?

우리는 크게 7단계를 거쳐서 BERT를 굽고 있습니다.

그 과정에 대해 알아볼까요? ღ’ᴗ’ღ

첫 번째로 Corpus 수집!

대화만? 신문만? 아니에요.

블로그, 신문기사, 위키피디아, 기업 공시 정보, 특허 정보, 소설 등 다양한 출처로부터 수집했습니다!

처음엔 파일 형식도 PDF, XML 등 정말 다양했고, 한글 표현도 EUC-KR, UTF-8이 혼재되어 있었습니다.

문장이 끊겨 있기도 하고, 문장이라 보기 어려운 표와 목차도 꽤나 섞여 있었습니다.

2개월 동안 총 300G 수준의 원문 파일을 수집했습니다.(ง •̀_•́)ง

두 번째로는 Corpus 정제!

열심히 모은 Corpus를 이제는 정제해야 할 차례입니다.

일단 혼재되어있던 한글 코드를 UTF-8로 통일했습니다.

그 다음엔, 문서에서 문장부분만을 선택하고 문장이 아닌 제목, 리스트, 목차 등을 제거합니다.

끊겨진 문장도 있으니 제대로 합쳐야겠죠. 그렇게 정제해서 학습용 Corpus 형식으로 만들게 됩니다.

세 번째 순서는 한국어 분석입니다!

깨끗하게 정제한 문장을 한국어 형태소로 변환합니다.

TBai에서 가지고 있는 Moran이라는 형태소 분석기는 한 시간에 1.5G의 한국어를 분석할 수 있기 때문에, 여러 개의 Moran이 동시에 여러 개의 Corpus를 분석합니다.

하루 정도면 100G가 넘는 Corpus 분석 끝! ๑・̑◡・̑๑

네 번째는 Vocab 생성!

Vocab은 열심히 모으고 정제하고 분석한 Corpus를 BERT에 입력하기 위한 ‘필수템’입니다.

BERT 모델에서 Corpus를 읽을 때 Vocab을 기준으로 하니까 몹시 중요한 역할을 하죠.

한국어 분석에 불필요한 표제어는 필터링하고, [UNK]의 숫자를 최소화하기 위해서 검수 작업도 필수!

오픈소스로 나와있는 것을 쓰면, 조금 이상한 표제어들이 마구 포함되게 되더라구요.

이 과정에서 실수를 여러 번 해서 무려 세 번에 걸쳐 Vocab을 만들었습니다.

1) 파이썬 프로그램이 만든 것을 그대로 사용해 보았고

2) 아주 깔끔하게 필터링해서 만들어 보았습니다.

3) Corpus를 많이 늘리고, [UNK] 최소화 적용해보았습니다.

이렇게 만든 Vocab 성능의 비교결과 1) < 2) < 3) 의 순서로 성능을 확인할 수 있었어요.

역시 Vocab이 가장 중요합니다!

Vocab을 뽑기 위해 선별된 55억개의 어절 Corpus에서 다양한 크기의 Vocab을 생성했습니다.

수치로 보여드릴게요. ( •̀.̫•́)✧

Tbai가 주로 사용하는 것은 이렇습니다.

다섯 번째, Tensor 데이터 변환입니다!

Vocab과 Corpus를 가지고 BERT학습을 위한 데이터를 생성할 차례입니다.

우선, 26개의 작은 Corpus를 기본 재료로 사용합니다.

메모리를 많이 소비하기 때문에 최대 1G단위로 Corpus를 분리해서 130개 정도의 작은 Corpus들로 만들었어요.

이 때 조정이 가능한 것은

1) 코퍼스 선택 : 정형문서 Corpus, 특허문서 Corpus, 일반문서 Corpus, 일상문서 Corpus로 4가지로 분류합니다.

2) 중복 비율 : 26개의 Corpus에서 해당 성격에 따라서 몇 배로 중복을 할 것인지 선택합니다.

3) Vocab 선택 : 총 4가지의 Vocab을 용도에 따라서 선택합니다.

4) 모델크기 선택 : 학습 모델의 용도에 따라서 최대 1024개와 512개의 토큰을 입력받을 수 있는 크기로 생성합니다.

1G Corpus, 중복비율 5배의 경우에 메모리는 40G바이트, 변환 시간은 100분 정도 소요돼요.

하나의 Vocab, 하나의 입력 크기에 대해서 70G 정도의 Corpus로 학습용 데이터를 만드는 경우에 4일 정도 필요하지만, 동시에 2개씩 만들어서 2일 이내에 완료 가능합니다.

TBAI는 네 가지의 조합으로 총 8일 간 학습데이터를 만들었고 현재 네이버 클라우드 서버를 사용하고 있습니다.

여섯 번째로, TPU 학습!

TPU로 진행하는 학습이 빠르고 편리하기 때문에 구글의 Cloud 서비스를 사용 중입니다.

다섯번째 단계에서 준비된 데이터(약 1 테라바이트)를 구글 클라우드 스토리지로 먼저 옮깁니다.

TBai는 V3-8 TPU를 5개 빌려서 학습하고 있어요. (너무 비싸지만, 어쩔 수 없어요)

모델의 크기마다 학습에 소요되는 기간이 다르지만, 큰 모델은 약 20일, 작은 모델은 약 5일이 걸립니다.

첫번째는 조금 찝찝한 느낌으로 끝났구요, 두번째와 세번째 Vocab으로 학습은 계속 돌아가고 있는 중!

그래도 두번째 구워서 나온 결과가 나름 괜찮게 나오는 것 같아요. ٩( ‘ω’ )و





일곱 번째, 마지막 단계죠, 성능 평가!

열심히 돌리고 나면, 학습셋을 사용해서 Fine Tuning을 수행합니다.

네이버 영화평 DB를 사용해서 간단하게 성능평가가 가능하답니다!

해당 모델에 대한 Vocab을 사용해야 하고, 데이터셋에도 한국어 분석을 적용해서 학습셋을 다시 만들어야 합니다.

성능은 90.1 수준인데, 사용한 코퍼스에 따라서 5 epochs Task 학습으로 87 ~ 90 점 수준으로 다양합니다.

성능 차이는 적용한 Vocab과 코퍼스의 종류에 따라 달라요.

Vocab 보다는 Corpus의 종류가 더 큰 영향을 주고,

같은 Corpus의 경우에는 Vocab에 따라 성능의 차이가 납니다.

이제 다시 네번째 단계로 돌아가야 합니다. 하면 할 수록 문제가 보이고, 특히나 Vocab과 코퍼스 믹스에서 조절해보고 싶은 욕심이 생기죠.

Tbai는 이 일곱 단계를 두 번 반복했습니다! 두 번으로 끝내지도 않았구요.

과정 전체를 되돌아보고, Corpus의 정제, 선택, Vocab 제작도 다시해서

새로운 BERT 모델을 굽고 있어요.

이 집, 버트 맛집입니다.

현재 다 구운 모델들에 다양한 Task 데이터를 돌려서

성능과 모델 구성 요소의 연관관계를 파악하고 있어요.

TBAI의 BERT는 이렇게 노릇노릇 구워지고 있습니다. (〃・ิ‿・ิ)ゞ


Two Block AI


%d 블로거가 이것을 좋아합니다: