๊ณผํ๊ธฐ์ ๋ถ์ผ BERT ์ฌ์ ํ์ต ๋ชจ๋ธ (KorSci BERT)
๋ณธ KorSci BERT ์ธ์ด๋ชจ๋ธ์ ํ๊ตญ๊ณผํ๊ธฐ์ ์ ๋ณด์ฐ๊ตฌ์๊ณผ ํ๊ตญํนํ์ ๋ณด์์ด ๊ณต๋์ผ๋ก ์ฐ๊ตฌํ ๊ณผ์ ์ ๊ฒฐ๊ณผ๋ฌผ ์ค ํ๋๋ก, ๊ธฐ์กด Google BERT base ๋ชจ๋ธ์ ์ํคํ ์ณ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก, ํ๊ตญ ๋ ผ๋ฌธ & ํนํ ์ฝํผ์ค ์ด 97G (์ฝ 3์ต 8์ฒ๋ง ๋ฌธ์ฅ)๋ฅผ ์ฌ์ ํ์ตํ ๋ชจ๋ธ์ด๋ค.
Train dataset
Type | Corpus | Sentences | Avg sent length |
---|---|---|---|
๋ ผ๋ฌธ | 15G | 72,735,757 | 122.11 |
ํนํ | 82G | 316,239,927 | 120.91 |
ํฉ๊ณ | 97G | 388,975,684 | 121.13 |
Model architecture
- attention_probs_dropout_prob:0.1
- directionality:"bidi"
- hidden_act:"gelu"
- hidden_dropout_prob:0.1
- hidden_size:768
- initializer_range:0.02
- intermediate_size:3072
- max_position_embeddings:512
- num_attention_heads:12
- num_hidden_layers:12
- pooler_fc_size:768
- pooler_num_attention_heads:12
- pooler_num_fc_layers:3
- pooler_size_per_head:128
- pooler_type:"first_token_transform"
- type_vocab_size:2
- vocab_size:15330
Vocabulary
- Total 15,330 words
- Included special tokens ( [PAD], [UNK], [CLS], [SEP], [MASK] )
- File name : vocab_kisti.txt
Language model
- Model file : model.ckpt-262500 (Tensorflow ckpt file)
Pre training
- Trained 128 Seq length 1,600,000 + 512 Seq length 500,000 ์คํ ํ์ต
- ๋ ผ๋ฌธ+ํนํ (97 GB) ๋ง๋ญ์น์ 3์ต 8์ฒ๋ง ๋ฌธ์ฅ ๋ฐ์ดํฐ ํ์ต
- NVIDIA V100 32G 8EA GPU ๋ถ์ฐํ์ต with Horovod Lib
- NVIDIA Automixed Mixed Precision ๋ฐฉ์ ์ฌ์ฉ
Downstream task evaluation
๋ณธ ์ธ์ด๋ชจ๋ธ์ ์ฑ๋ฅํ๊ฐ๋ ๊ณผํ๊ธฐ์ ํ์ค๋ถ๋ฅ ๋ฐ ํนํ ์ ์งํนํ๋ถ๋ฅ(CPC) 2๊ฐ์ง์ ํ์คํฌ๋ฅผ ํ์ธํ๋ํ์ฌ ํ๊ฐํ๋ ๋ฐฉ์์ ์ฌ์ฉํ์์ผ๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
Type | Classes | Train | Test | Metric | Train result | Test result |
---|---|---|---|---|---|---|
๊ณผํ๊ธฐ์ ํ์ค๋ถ๋ฅ | 86 | 130,515 | 14,502 | Accuracy | 68.21 | 70.31 |
ํนํCPC๋ถ๋ฅ | 144 | 390,540 | 16,315 | Accuracy | 86.87 | 76.25 |
๊ณผํ๊ธฐ์ ๋ถ์ผ ํ ํฌ๋์ด์ (KorSci Tokenizer)
๋ณธ ํ ํฌ๋์ด์ ๋ ํ๊ตญ๊ณผํ๊ธฐ์ ์ ๋ณด์ฐ๊ตฌ์๊ณผ ํ๊ตญํนํ์ ๋ณด์์ด ๊ณต๋์ผ๋ก ์ฐ๊ตฌํ ๊ณผ์ ์ ๊ฒฐ๊ณผ๋ฌผ ์ค ํ๋์ด๋ค. ๊ทธ๋ฆฌ๊ณ , ์ ์ฌ์ ํ์ต ๋ชจ๋ธ์์ ์ฌ์ฉ๋ ์ฝํผ์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ช ์ฌ ๋ฐ ๋ณตํฉ๋ช ์ฌ ์ฝ 600๋ง๊ฐ์ ์ฌ์ฉ์์ฌ์ ์ด ์ถ๊ฐ๋ Mecab-ko Tokenizer์ ๊ธฐ์กด BERT WordPiece Tokenizer๊ฐ ๋ณํฉ๋์ด์ง ํ ํฌ๋์ด์ ์ด๋ค.
๋ชจ๋ธ ๋ค์ด๋ก๋
์๊ตฌ์ฌํญ
์์ ํ๋ข Mecab ์ค์น & ์ฌ์ฉ์์ฌ์ ์ถ๊ฐ
Installation URL: https://bitbucket.org/eunjeon/mecab-ko-dic/src/master/
mecab-ko > 0.996-ko-0.9.2
mecab-ko-dic > 2.1.1
mecab-python > 0.996-ko-0.9.2
๋ ผ๋ฌธ & ํนํ ์ฌ์ฉ์ ์ฌ์
- ๋ ผ๋ฌธ ์ฌ์ฉ์ ์ฌ์ : pap_all_mecab_dic.csv (1,001,328 words)
- ํนํ ์ฌ์ฉ์ ์ฌ์ : pat_all_mecab_dic.csv (5,000,000 words)
konlpy ์ค์น
pip install konlpy
konlpy > 0.5.2
์ฌ์ฉ๋ฐฉ๋ฒ
import tokenization_kisti as tokenization
vocab_file = "./vocab_kisti.txt"
tokenizer = tokenization.FullTokenizer(
vocab_file=vocab_file,
do_lower_case=False,
tokenizer_type="Mecab"
)
example = "๋ณธ ๊ณ ์์ ์ฃผ๋ก ์ผํ์ฉ ํฉ์ฑ์ธ์ ์ก์ ์ง์ด๋ฃ์ด ๋ฐ๋ดํ๋ ์ธ์ ์กํฌ์ ๋ด๋ถ๋ฅผ ์ํธ์์ผ๋ก ์ด์ค์ฐฉํ๋ ์ธ์ ์ก์ด ๋ฐฐ์ถ๋๋ ์ ๋จ๋ถ ์ชฝ์ผ๋ก ๋ด๋ฒฝ์ ํ์ํ๊ฒ ํ์ฑํ์ฌ์ ๋ด๋ถ์ ๋ค์ด์๋ ์ธ์ ์ก์ ์์ง์ง ์ ์๋๋ก ํ๋ ํฉ์ฑ์ธ์ ์กํฌ์ ๊ดํ ๊ฒ์ด๋ค."
tokens = tokenizer.tokenize(example)
encoded_tokens = tokenizer.convert_tokens_to_ids(tokens)
decoded_tokens = tokenizer.convert_ids_to_tokens(encoded_tokens)
print("Input example ===>", example)
print("Tokenized example ===>", tokens)
print("Converted example to IDs ===>", encoded_tokens)
print("Converted IDs to example ===>", decoded_tokens)
============ Result ================
Input example ===> ๋ณธ ๊ณ ์์ ์ฃผ๋ก ์ผํ์ฉ ํฉ์ฑ์ธ์ ์ก์ ์ง์ด๋ฃ์ด ๋ฐ๋ดํ๋ ์ธ์ ์กํฌ์ ๋ด๋ถ๋ฅผ ์ํธ์์ผ๋ก ์ด์ค์ฐฉํ๋ ์ธ์ ์ก์ด ๋ฐฐ์ถ๋๋ ์ ๋จ๋ถ ์ชฝ์ผ๋ก ๋ด๋ฒฝ์ ํ์ํ๊ฒ ํ์ฑํ์ฌ์ ๋ด๋ถ์ ๋ค์ด์๋ ์ธ์ ์ก์ ์์ง์ง ์ ์๋๋ก ํ๋ ํฉ์ฑ์ธ์ ์กํฌ์ ๊ดํ ๊ฒ์ด๋ค.
Tokenized example ===> ['๋ณธ', '๊ณ ์', '์', '์ฃผ๋ก', '์ผํ์ฉ', 'ํฉ์ฑ', '##์ธ', '##์ ', '##์ก', '์', '์ง', '##์ด', '##๋ฃ', '์ด', '๋ฐ๋ด', 'ํ', '๋', '์ธ์ ', '##์ก', '##ํฌ', '์', '๋ด๋ถ', '๋ฅผ', '์ํธ', '์', '์ผ๋ก', '์ด', '##์ค', '์ฐฉ', '##ํ', '๋', '์ธ์ ', '##์ก', '์ด', '๋ฐฐ์ถ', '๋', '๋', '์ ๋จ๋ถ', '์ชฝ', '์ผ๋ก', '๋ด๋ฒฝ', '์', 'ํ', '##์', 'ํ', '๊ฒ', 'ํ์ฑ', 'ํ', '์ฌ์', '๋ด๋ถ', '์', '๋ค', '์ด', '์', '๋', '์ธ์ ', '##์ก', '์', '์', '์ง', '์ง', '์', '์', '๋๋ก', 'ํ', '๋', 'ํฉ์ฑ', '##์ธ', '##์ ', '์ก', '##ํฌ', '์', '๊ดํ', '๊ฒ', '์ด', '๋ค', '.']
Converted example to IDs ===> [59, 619, 30, 2336, 8268, 819, 14100, 13986, 14198, 15, 732, 13994, 14615, 39, 1964, 12, 11, 6174, 14198, 14061, 9, 366, 16, 7267, 18, 32, 307, 14072, 891, 13967, 27, 6174, 14198, 14, 698, 27, 11, 12920, 1972, 32, 4482, 15, 2228, 14053, 12, 65, 117, 12, 4477, 366, 10, 56, 39, 26, 11, 6174, 14198, 15, 1637, 13709, 398, 25, 26, 140, 12, 11, 819, 14100, 13986, 377, 14061, 10, 487, 55, 14, 17, 13]
Converted IDs to example ===> ['๋ณธ', '๊ณ ์', '์', '์ฃผ๋ก', '์ผํ์ฉ', 'ํฉ์ฑ', '##์ธ', '##์ ', '##์ก', '์', '์ง', '##์ด', '##๋ฃ', '์ด', '๋ฐ๋ด', 'ํ', '๋', '์ธ์ ', '##์ก', '##ํฌ', '์', '๋ด๋ถ', '๋ฅผ', '์ํธ', '์', '์ผ๋ก', '์ด', '##์ค', '์ฐฉ', '##ํ', '๋', '์ธ์ ', '##์ก', '์ด', '๋ฐฐ์ถ', '๋', '๋', '์ ๋จ๋ถ', '์ชฝ', '์ผ๋ก', '๋ด๋ฒฝ', '์', 'ํ', '##์', 'ํ', '๊ฒ', 'ํ์ฑ', 'ํ', '์ฌ์', '๋ด๋ถ', '์', '๋ค', '์ด', '์', '๋', '์ธ์ ', '##์ก', '์', '์', '์ง', '์ง', '์', '์', '๋๋ก', 'ํ', '๋', 'ํฉ์ฑ', '##์ธ', '##์ ', '์ก', '##ํฌ', '์', '๊ดํ', '๊ฒ', '์ด', '๋ค', '.']
Fine-tuning with KorSci-Bert
- Google Bert์ Fine-tuning ๋ฐฉ๋ฒ ์ฐธ๊ณ
- Sentence (and sentence-pair) classification tasks: "run_classifier.py" ์ฝ๋ ํ์ฉ
- MRC(Machine Reading Comprehension) tasks: "run_squad.py" ์ฝ๋ ํ์ฉ