DistilKoBERT
Distillation of KoBERT (SKTBrain KoBERT
๊ฒฝ๋ํ)
January 27th, 2020 - Update: 10GB์ Corpus๋ฅผ ๊ฐ์ง๊ณ ์๋ก ํ์ตํ์์ต๋๋ค. Subtask์์ ์ฑ๋ฅ์ด ์ํญ ์์นํ์ต๋๋ค.
May 14th, 2020 - Update: ๊ธฐ์กด Transformers์ padding_idx
์ด์๋ฅผ ํด๊ฒฐํ์์ต๋๋ค. ์์ธํ ์ฌํญ์ KoBERT-Transformers๋ฅผ ์ฐธ๊ณ ํ์๋ฉด ๋ฉ๋๋ค.
Pretraining DistilKoBERT
- ๊ธฐ์กด์ 12 layer๋ฅผ 3 layer๋ก ์ค์์ผ๋ฉฐ, ๊ธฐํ configuration์ kobert๋ฅผ ๊ทธ๋๋ก ๋ฐ๋์ต๋๋ค.
- ์ ๋ ผ๋ฌธ์ 6 layer๋ฅผ ์ฑํํ์์ต๋๋ค.
- Layer ์ด๊ธฐํ์ ๊ฒฝ์ฐ ๊ธฐ์กด KoBERT์ 1, 5, 9๋ฒ์งธ layer ๊ฐ์ ๊ทธ๋๋ก ์ฌ์ฉํ์์ต๋๋ค.
- Pretraining Corpus๋ ํ๊ตญ์ด ์ํค, ๋๋ฌด์ํค, ๋ด์ค ๋ฑ ์ฝ 10GB์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ผ๋ฉฐ, 3 epoch ํ์ตํ์์ต๋๋ค.
KoBERT / DistilKoBERT for transformers library
- ๊ธฐ์กด์ KoBERT๋ฅผ transformers ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ณง๋ฐ๋ก ์ฌ์ฉํ ์ ์๋๋ก ๋ง์ท์ต๋๋ค.
- transformers v2.2.2๋ถํฐ ๊ฐ์ธ์ด ๋ง๋ ๋ชจ๋ธ์ transformers๋ฅผ ํตํด ์ง์ ์ ๋ก๋/๋ค์ด๋ก๋ํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค
- DistilKoBERT ์ญ์ transformers ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ณง๋ฐ๋ก ๋ค์ด ๋ฐ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Dependencies
- torch==1.1.0
- transformers==2.9.1
How to Use
>>> from transformers import BertModel, DistilBertModel
>>> bert_model = BertModel.from_pretrained('monologg/kobert')
>>> distilbert_model = DistilBertModel.from_pretrained('monologg/distilkobert')
- Tokenizer๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด, ๋ฃจํธ ๋๋ ํ ๋ฆฌ์
tokenization_kobert.py
ํ์ผ์ ๋ณต์ฌํ ํ,KoBertTokenizer
๋ฅผ ์ํฌํธํ๋ฉด ๋ฉ๋๋ค.- KoBERT์ DistilKoBERT ๋ชจ๋ ๋์ผํ ํ ํฌ๋์ด์ ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๊ธฐ์กด KoBERT์ ๊ฒฝ์ฐ Special Token์ด ์ ๋๋ก ๋ถ๋ฆฌ๋์ง ์๋ ์ด์๊ฐ ์์ด์ ํด๋น ๋ถ๋ถ์ ์์ ํ์ฌ ๋ฐ์ํ์์ต๋๋ค. (Issue link)
>>> from tokenization_kobert import KoBertTokenizer
>>> tokenizer = KoBertTokenizer.from_pretrained('monologg/kobert') # monologg/distilkobert๋ ๋์ผ
>>> tokenizer.tokenize("[CLS] ํ๊ตญ์ด ๋ชจ๋ธ์ ๊ณต์ ํฉ๋๋ค. [SEP]")
['[CLS]', 'โํ๊ตญ', '์ด', 'โ๋ชจ๋ธ', '์', 'โ๊ณต์ ', 'ํฉ๋๋ค', '.', '[SEP]']
>>> tokenizer.convert_tokens_to_ids(['[CLS]', 'โํ๊ตญ', '์ด', 'โ๋ชจ๋ธ', '์', 'โ๊ณต์ ', 'ํฉ๋๋ค', '.', '[SEP]'])
[2, 4958, 6855, 2046, 7088, 1050, 7843, 54, 3]
What is different between BERT and DistilBERT
-
DistilBert๋ ๊ธฐ์กด์ Bert์ ๋ฌ๋ฆฌ token-type embedding์ ์ฌ์ฉํ์ง ์์ต๋๋ค.
- Transformers ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ DistilBertModel์ ์ฌ์ฉํ ๋ ๊ธฐ์กด BertModel ๊ณผ ๋ฌ๋ฆฌ
token_type_ids
๋ฅผ ๋ฃ์ ํ์๊ฐ ์์ต๋๋ค.
- Transformers ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ DistilBertModel์ ์ฌ์ฉํ ๋ ๊ธฐ์กด BertModel ๊ณผ ๋ฌ๋ฆฌ
-
๋ํ DistilBert๋ pooler๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค.
- ๊ณ ๋ก ๊ธฐ์กด BertModel์ ๊ฒฝ์ฐ forward์ return ๊ฐ์ผ๋ก
sequence_output, pooled_output, (hidden_states), (attentions)
์ ๋ฝ์๋ด์ง๋ง, DistilBertModel์ ๊ฒฝ์ฐsequence_output, (hidden_states), (attentions)
๋ฅผ ๋ฝ์๋ ๋๋ค. - DistilBert์์
[CLS]
ํ ํฐ์ ๋ฝ์๋ด๋ ค๋ฉดsequence_output[0][:, 0]
๋ฅผ ์ ์ฉํด์ผ ํฉ๋๋ค.
- ๊ณ ๋ก ๊ธฐ์กด BertModel์ ๊ฒฝ์ฐ forward์ return ๊ฐ์ผ๋ก
Result on Sub-task
KoBERT | DistilKoBERT | Bert-multilingual | |
---|---|---|---|
Model Size (MB) | 351 | 108 | 681 |
NSMC (acc) | 89.63 | 88.41 | 87.07 |
Naver NER (F1) | 86.11 | 84.13 | 84.20 |
KorQuAD (Dev) (EM/F1) | 52.81/80.27 | 54.12/77.80 | 77.04/87.85 |
- NSMC (Naver Sentiment Movie Corpus) (Implementation of KoBERT-nsmc)
- Naver NER (NER task on Naver NLP Challenge 2018) (Implementation of KoBERT-NER)
- KorQuAD (The Korean Question Answering Dataset) (Implementation of KoBERT-KorQuAD)
Citation
์ด ์ฝ๋๋ฅผ ์ฐ๊ตฌ์ฉ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ์ธ์ฉํด์ฃผ์ธ์.
@misc{park2019distilkobert,
author = {Park, Jangwon},
title = {DistilKoBERT: Distillation of KoBERT},
year = {2019},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/monologg/DistilKoBERT}}
}