ELECTRA는 Replaced Token Detection
, 즉 generator에서 나온 token을 보고 discriminator에서 "real" token인지 "fake" token인지 판별하는 방법으로 학습을 합니다. 이 방법은 모든 input token에 대해 학습할 수 있다는 장점을 가지며, BERT 등과 비교했을 때 더 좋은 성능을 보였습니다.
KoELECTRA는 14GB의 한국어 text (96M sentences, 2.6B tokens)로 학습하였고, 이를 통해 나온 KoELECTRA-Base
와 KoELECTRA-Small
두 가지 모델을 배포하게 되었습니다.
또한 KoELECTRA는 Wordpiece 사용, 모델 s3 업로드 등을 통해 OS 상관없이 Transformers
라이브러리만 설치하면 곧바로 사용할 수 있습니다.
April 27, 2020 - 2개의 Subtask (KorSTS
, QuestionPair
)에 대해 추가적으로 finetuning을 진행하였고, 기존 5개의 Subtask에 대해서도 결과를 업데이트하였습니다.
Layers | Embedding Size | Hidden Size | # heads | Size | ||
---|---|---|---|---|---|---|
KoELECTRA-Base |
Discriminator | 12 | 768 | 768 | 12 | 423M |
Generator | 12 | 768 | 256 | 4 | 134M | |
KoELECTRA-Small |
Discriminator | 12 | 128 | 256 | 4 | 53M |
Generator | 12 | 128 | 256 | 4 | 53M |
이번 프로젝트의 가장 큰 목적은 Transformers 라이브러리만 있으면 모델을 곧바로 사용 가능하게 만드는 것이었고, 이에 Sentencepiece, Mecab을 사용하지 않고 원 논문과 코드에서 사용한 Wordpiece
를 사용하였습니다.
- Vocab의 사이즈는
32200
개로[unused]
토큰 200개를 추가하였습니다. - Cased (
do_lower_case=False
)로 처리하였습니다.
자세한 내용은 [Wordpiece Vocabulary] 참고
-
Data의 경우 전처리가 완료된 14G의 Corpus(2.6B tokens)를 사용하였습니다. (전처리 관련 내용은 [Preprocessing] 참고)
Model Batch Size Train Steps Learning Rate Max Seq Len Generator Size KoELECTRA-Base
256 700K 2e-4 512 0.33 KoELECTRA-Small
512 300K 5e-4 512 1.0 -
KoELECTRA-Small
모델의 경우 원 논문에서의ELECTRA-Small++
와 동일한 옵션을 사용하였습니다.- 이는 공식 ELECTRA에서 배포한 Small 모델과 설정이 동일합니다.
- 또한
KoELECTRA-Base
와는 달리, Generator와 Discriminator의 모델 사이즈(=generator_hidden_size
)가 동일합니다.
-
Batch size
와Train steps
을 제외하고는 원 논문의 Hyperparameter와 동일하게 가져갔습니다.- 다른 hyperparameter를 변경하여 돌려봤지만 원 논문과 동일하게 가져간 것이 성능이 가장 좋았습니다.
-
TPU v3-8을 이용하여 학습하였고, Base 모델은 약 7일, Small 모델은 약 3일이 소요되었습니다.
- GCP에서의 TPU 사용법은 [Using TPU for Pretraining]에 정리하였습니다.
-
Transformers v2.8.0
부터ElectraModel
을 공식 지원합니다. -
Huggingface S3에 모델이 이미 업로드되어 있어서, 모델을 직접 다운로드할 필요 없이 곧바로 사용할 수 있습니다.
-
ElectraModel
은pooled_output
을 리턴하지 않는 것을 제외하고BertModel
과 유사합니다. -
ELECTRA는 finetuning시에
discriminator
를 사용합니다.
from transformers import ElectraModel, ElectraTokenizer
# KoELECTRA-Base
model = ElectraModel.from_pretrained("monologg/koelectra-base-discriminator")
tokenizer = ElectraTokenizer.from_pretrained("monologg/koelectra-base-discriminator")
# KoELECTRA-Small
model = ElectraModel.from_pretrained("monologg/koelectra-small-discriminator")
tokenizer =