본문 바로가기

TECH

[2021.09.18] TUNiB-Electra 공개

TUNiB-Electra

안녕하세요. TUNiB AI 엔지니어 김수환입니다. 이번에 TUNiB에서 [TUNiB-Electra](<https://github.com/tunib-ai/tunib-electra>) 모델을 공개했습니다. 🎉 🎉 이번 공개에서는 한-영 bilingual 모델과 한국어 모델을 각각 Small/Base 사이즈로 공개했으며, Hugging Face transformers 라이브러리로 쉽게 이용이 가능합니다. 해당 포스트 혹은 TUNiB-Electra에 대해 궁금한 부분이 있으시다면 언제든지 kaki.ai@tunib.ai 로 문의해주세요. 

GitHub Repo: <https://github.com/tunib-ai/tunib-electra>

 

TUNiB Electra의 등장 배경을 소개합니다.

TUNiB Electra를 제작하게 된 두 가지 동기가 있습니다.

첫 번째 동기는 현재 공개된 한국어 사전학습 인코더 모델들은 대부분 monolingual 모델이여서 한국어에 한정된 지식만을 가지고 있다는 점입니다. 이러한 한계점 극복을 위해 가장 널리 쓰이는 언어인 영어를 추가한 한-영 bilingual 모델을 제작하게 됐습니다.

두 번째 동기는 현재 공개된 한국어 사전학습 인코더 모델들보다 전반적으로 더 좋은 성능을 가지는 모델을 공개하고 싶었습니다. 그래서 저희는 블로그 게시물, 댓글, 뉴스, 웹소설 등의 다양한 형식의 데이터로 학습 데이터셋을 구성했으며, 충분히 많은 양의 데이터로 학습하기 위해 100GB에 달하는 한글 텍스트를 수집했습니다.

 

ELECTRA란?

[그림1] Electra's Replaced Token Detection

 

데이터 전처리

Pre-trained Language Model(PLM)의 성능에 데이터 전처리는 상당히 중요합니다. TUNiB Electra는 아래의 기준을 적용해서 데이터를 전처리했습니다.

  • HTML 태그 삭제
  • 한자, 일본어 비율이 높은 데이터 제거
  • 전체 문장 길이 대비 띄어쓰기의 비율이 너무 낮거나 높은 문장 제거
  • 전체 문장 길이 대비 특수문자 비율이 높은 문장 제거
  • 길이가 너무 짧은 데이터 제거
  • 일부 특수문자 대체 (&amp → &, &lt → <, &gt → >, &quot → \\\\)
  • 한자 및 일부 특수문자 제거

 

토크나이저

TUNiB Electra는 기존 ELECTRA에서 사용한 워드피스 토크나이저를 사용했습니다. 토크나이저 학습 데이터는 학습에 사용된 데이터셋들에서 같은 양을 샘플링해서 구성했으며, Hugging Face의 tokenizers 라이브러리를 사용해서 학습했습니다.

한국어와 영어 모두 vocab size를 32,000으로 세팅했으며, 한-영 모델의 경우 한글, 영어 데이터에 대해 토크나이저를 따로 만들고 vocab을 합치는 방식으로 제작했습니다. 결과적으로 한-영 모델의 경우 중복되는 2천개의 vocab을 제외해서 62,000 사이즈의 vocab으로 구성됐습니다.

 

실험

TUNiB Electra와 현재 공개된 모델들과의 성능 비교를 위해 한국어 다운스트림 태스크와 영어 다운스트림 태스크에 대한 결과도 함께 공개했습니다. NSMC, Naver NER, KorQuaD 등의 한국어 NLP 태스크와 영어 태스크에 대한 퍼포먼스 측정을 위해 GLUE Benchmark로 실험을 진행했습니다.

TUNiB-Electra-ko-en 모델은 한국어, 영어 태스크에 대해 전반적으로 준수한 정도의 성능을 보였으며, TUNiB-Electra-ko 모델은 base 모델 중 평균적으로 가장 좋은 성능을 기록했습니다. 🎉

 

Results on Korean downstream tasks

Small Models

  TUNiB-Electra-ko-small TUNiB-Electra-ko-en-small KoELECTRA-small-v3
#Params 14M 18M 14M
Avg. 81.29 81.44 82.58
NSMC (acc) 89.56 89.28 89.36
Naver NER (F1) 84.98 85.15 85.4
PAWS (acc) 72.85 75.75 77.45
KorNLI (acc) 77.08 77.06 78.6
KorSTS (spearman) 78.76 77.61 80.79
Question Pair (acc) 94.98 93.79 94.85
KorQuaD (Dev) (EM/F1) 61.17 / 87.64 80.55 / 89.77 82.11 / 91.13
Korean-Hate-Speech (Detection) 64.5 63.13 63.07

 

Base Models

  TUNiB-Electra-ko-small TUNiB-Electra-ko-en-small KoELECTRA-base-v3 KcELECTRA-base KoBERT-base KcBERT-base XLM-Roberta-base
#Params 110M 133M 110M 124M 90M 110M 280M
Avg. 85.99 84.74 85.92 84.75 81.92 79.79 83.03
NSMC (acc) 90.95 90.15 90.63 91.71 89.63 89.62 89.49
Naver NER (F1) 87.63 86.93 88.11 86.9 86.11 84.34 86.26
PAWS (acc) 84.65 83.05 84.45 74.8 80.65 66.95 82.95
KorNLI (acc) 82.27 79.7 82.24 81.65 79 74.85 79.92
KorSTS (spearman) 85 82.23 85.53 82.65 79.64 75.57 79.09
Question Pair (acc) 95.77 95.64 95.25 95.78 93.93 93.93 93.53
KorQuaD (Dev) (EM/F1) 64.01 / 90.32 83.61 / 92.37 84.83 / 93.45 70.60 / 90.11 52.81 / 80.27 60.25 / 84.39 64.70 / 88.94
Korean-Hate-Speech (Detection) 71.4 67.86 67.61 74.49 66.21 68.77 64.06

 

Results on English downstream tasks

Small Models

  TUNiB-Electra-ko-en-small ELECTRA-small BERT-small
#Params 18M 13M 13M
Avg. 80.44 79.71 74.06
CoLA (MCC) 56.76 55.6 27.8
SST (Acc) 88.76 91.1 89.7
MRPC (Acc) 88.73 84.9 83.4
STS (Spearman) 86.12 84.6 78.6
QQP (Acc) 88.66 88 87
MNLI (Acc) 79.03 81.6 77.6
QNLI (Acc) 87.26 88.3 86.4
RTE (Acc) 68.23 63.6 61.8

 

Base Models

  TUNiB-Electra-ko-en-small ELECTRA-base BERT-base
#Params 133M 110M 110M
Avg. 85.2 85.7 80.8
CoLA (MCC) 66.29 64.6 52.1
SST (Acc) 91.86 96 93.5
MRPC (Acc) 89.95 88.1 84.8
STS (Spearman) 89.67 90.2 85.8
QQP (Acc) 90.75 89.5 89.2
MNLI (Acc) 84.72 88.5 84.6
QNLI (Acc) 91.4 93.1 90.5
RTE (Acc) 76.9 75.2 66.4

 

TUNiB Electra 사용법

TUNiB Electra는 Hugging Face transformers 라이브러리로 쉽게 이용이 가능합니다.

from transformers import AutoModel, AutoTokenizer

# Small Model (Korean-English bilingual model)
tokenizer = AutoTokenizer.from_pretrained('tunib/electra-ko-en-small')
model = AutoModel.from_pretrained('tunib/electra-ko-en-small')

# Base Model (Korean-English bilingual model)
tokenizer = AutoTokenizer.from_pretrained('tunib/electra-ko-en-base')
model = AutoModel.from_pretrained('tunib/electra-ko-en-base')

# Small Model (Korean-only model)
tokenizer = AutoTokenizer.from_pretrained('tunib/electra-ko-small')
model = AutoModel.from_pretrained('tunib/electra-ko-small')

# Base Model (Korean-only model)
tokenizer = AutoTokenizer.from_pretrained('tunib/electra-ko-base')
model = AutoModel.from_pretrained('tunib/electra-ko-base')

Tokenizer example

>>> from transformers import AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained('tunib/electra-ko-en-base')
>>> tokenizer.tokenize("tunib is a natural language processing tech startup.")
['tun', '##ib', 'is', 'a', 'natural', 'language', 'processing', 'tech', 'startup', '.']
>>> tokenizer.tokenize("튜닙은 자연어처리 테크 스타트업입니다.")
['튜', '##닙', '##은', '자연', '##어', '##처리', '테크', '스타트업', '##입니다', '.']

 

마치며

데이터 수집부터 전처리, 모델 학습 및 실험까지 공들인 끝에 TUNiB Electra를 공개할 수 있었습니다. 공들인 만큼 많은 분들께 도움이 됐으면 좋겠습니다. 긴 글 읽어주셔서 감사합니다.