Transformer를 개선한 Reformer를 이용한 BERT (ver.pytorch)
2020년 트랜스포머를 개선한 리포머 발표. 리포머는 트랜스포머의 제한 사항들을 LSH, RevNet, Chunk을 통해 개선하였다. BERT나 GPT2와 같은 큰 모델들은 많은 컴퓨팅과 메모리를 필요로 하여, 고가의 장비 없이 직접 학습시키는데 많은 제한이 있었다. lucidrains/reformer-pytorch를 이용하여 리포머를 이용한 BERT를 만들고 colab을 통해 LM을 학습해 다양한 downstream task에 테스트.
한국어 위키피디아 데이터
지미 카터
제임스 얼 "지미" 카터 주니어(, 1924년 10월 1일 ~ )는 민주당 출신 미국 39번째 대통령 (1977년 ~ 1981년)이다.
지미 카터는 조지아주 섬터 카운티 플레인스 마을에서 태어났다. 조지아 공과대학교를 졸업하였다. 그 후 해군에 들어가 전함·원자력·잠수함의 승무원으로 일하였다. 1953년 미국 해군 대위로 예편하였고 이후 땅콩·면화 등을 가꿔 많은 돈을 벌었다. 그의 별명이 "땅콩 농부" (Peanut Farmer)로 알려졌다.
1962년 조지아 주 상원 의원 선거에서 낙선하나 그 선거가 부정선거 였음을 입증하게 되어 당선되고, 1966년 조지아 주 지사 선거에 낙선하지만 1970년 조지아 주 지사를 역임했다. 대통령이 되기 전 조지아주 상원의원을 두번 연임했으며, 1971년부터 1975년까지 조지아 지사로 근무했다. 조지아 주지사로 지내면서, 미국에 사는 흑인 등용법을 내세웠다.
...중략...
한국어 위키 덤프
- 위키 미러에서 덤프 다운로드
- sentencepiece를 이용해 8000개의 vocab 생성
- JSON 형태로 데이터 변환
{"tokens": ["[CLS]", "\uc6d4", "\u25811", "[MASK]", "\u2581~", "\u2581)", "\ub294", "\u2581\ubbfc\uc8fc", "\ub2f9", "\u2581\ucd9c\uc2e0", "\u2581\ubbf8\uad6d", "\u25813", "9", "\ubc88\uc9f8", "[MASK]", "\u2581(19", "7", "7", "\ub144", "\u2581~", "\u25811981", "\ub144", ")", "\uc774\ub2e4", ".", "\u2581\uc9c0", "\ubbf8", "\u2581\uce74", "\ud130", "\ub294", "\u2581\uc870\uc9c0", "\uc544", "\uc8fc", "\u2581\uc12c", "\ud130", "\u2581\uce74", "\uc6b4", "\ud2f0", "[MASK]", "[MASK]", "\uce69", "[MASK]", "\u2581\ub9c8\uc744", "\uc5d0\uc11c", "\u2581\ud0dc\uc5b4\ub0ac\ub2e4", ".", "\u2581\uc870\uc9c0", "\uc544", "\u2581\uacf5", "\uacfc", "\ub300\ud559\uad50", "\ub97c", "\u2581\uc878\uc5c5", "\ud558\uc600\ub2e4", ".", "\u2581\uadf8", "\u2581\ud6c4", "\u2581\ud574", "\uad70\uc5d0", "\u2581\uad00", "\u2581\uc804", "\ud568", "\u00b7", "\uc6d0", "\uc790", "\ub825", "\u00b7", "\uc7a0", "\uc218", "\ud568", "\uc758", "\u2581\uc2b9", "\ubb34", "\uc6d0\uc73c\ub85c", "\u2581\uc77c", "\ud558\uc600\ub2e4", ".", "\u2581195", "3", "\ub144", "\u2581\ubbf8\uad6d", "\u25811930", "\u2581\ub300", "\uc704\ub85c", "\u2581\uc608", "\ud3b8", "\ud558\uc600\uace0", "\u2581\uc774\ud6c4", "\u2581\ub545", "\ucf69", "\u00b7", "\uba74", "\ud654", "\u2581\ub4f1\uc744", "\u2581\uac00", "\uafd4", "\u2581\ub9ce\uc740", "\u2581\ub3c8", "\uc744", "\u2581\ubc8c", "\uc5c8\ub2e4", ".", "\u2581\uadf8\uc758", "\u2581\ubcc4", "\uba85\uc774", "\u2581\"", "\ub545", "\ucf69", "\u2581\ub18d", "\ubd80", "\"", "\u2581(", "P", "e", "an", "ut", "\u2581F", "ar", "m", "er", ")", "\ub85c", "[MASK]", "\uc84c\ub2e4", "[MASK]", "[MASK]", "[MASK]", "[MASK]", "\u2581\uc870\uc9c0", "[MASK]", "\u2581\uc8fc", "\u2581\uc0c1", "\uc6d0", "\u2581\uc758\uc6d0", "\u2581\uc120\uac70", "\uc5d0\uc11c", "[MASK]", "[MASK]", "\ud558\ub098", "\u2581\uadf8", "[MASK]", "[MASK]", "\u2581\ubd80\uc815", "\uc120\uac70", "[MASK]", "[MASK]", "[MASK]", "\u2581\uc785", "\uc99d", "\ud558\uac8c", "\u2581\ub418\uc5b4", "\u2581\ub2f9\uc120", "\ub418\uace0", ",", "\u2581196", "6", "\ub144", "\u2581\uc870\uc9c0", "\uc544", "\u2581\uc8fc", "\u2581\uc9c0", "\uc0ac", "\u2581\uc120\uac70", "\uc5d0", "\u2581\ub099", "\uc120", "\ud558\uc9c0\ub9cc", "\u25811970", "\ub144", "\u2581\uc870\uc9c0", "\uc544", "\u2581\uc8fc", "\u2581\uc9c0", "\uc0ac\ub97c", "\u2581\uc5ed\uc784", "\ud588\ub2e4", ".", "\u2581\ub300\ud1b5\ub839", "\uc774", "\u2581\ub418", "\uae30", "\u2581\uc804", "[MASK]", "[MASK]", "[MASK]", "\u2581\uc0c1", "\uc6d0\uc758", "\uc6d0\uc744", "\u2581\ub450", "\ubc88", "\u2581\uc5f0", "\uc784", "\ud588\uc73c\uba70", ",", "[MASK]", "[MASK]", "\u25811975", "\ub144\uae4c\uc9c0", "\u2581\uc870\uc9c0", "\uc544", "\u2581\uc9c0", "\uc0ac\ub85c", "\u2581\uadfc\ubb34", "\ud588\ub2e4", ".", "\u2581\uc870\uc9c0", "\uc544", "\u2581\uc8fc", "\uc9c0", "\uc0ac\ub85c", "\u2581\uc9c0", "\ub0b4", "\uba74\uc11c", ",", "\u2581\ubbf8\uad6d", "\uc5d0", "\u2581\uc0ac\ub294", "\u2581\ud751", "\uc778", "[MASK]", "[MASK]", "[MASK]", "\u2581\ub0b4", "\uc138", "\uc6e0\ub2e4", ".", "[SEP]", "\u25811976", "\ub144", "[MASK]", "\u2581\uc120\uac70", "\uc5d0", "\u2581\ubbfc\uc8fc", "\ub2f9", "\u2581\ud6c4\ubcf4", "\ub85c", "\u2581\ucd9c", "\ub9c8", "\ud558\uc5ec", "\u2581\ub3c4", "\ub355", "\uc8fc\uc758", "\u2581\uc815\ucc45", "\uc73c\ub85c", "\u2581\ub0b4", "\uc138", "\uc6cc", ",", "\u2581\ud3ec", "\ub4dc\ub97c", "[MASK]", "[MASK]", "\u2581\ub2f9\uc120", "\ub418\uc5c8\ub2e4", ".", "[SEP]"],
"segment": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
"is_next": 1,
"mask_idx": [2, 3, 14, 38, 39, 40, 41, 55, 59, 81, 122, 123, 124, 125, 126, 127, 128, 129, 136, 137, 138, 140, 141, 144, 145, 146, 182, 183, 184, 194, 195, 219, 220, 221, 229, 250, 251],
"mask_label": ["\u25811", "\uc77c", "\u2581\ub300\ud1b5\ub839", "\u2581\ud50c", "\ub808", "\uc778", "\uc2a4", "\u2581\uadf8", "\u2581\ub4e4\uc5b4\uac00", "\u2581\ud574\uad70", "\u2581\uc54c\ub824", "\uc84c\ub2e4", ".", "\u2581196", "2", "\ub144", "\u2581\uc870\uc9c0", "\uc544", "\u2581\ub099", "\uc120", "\ud558\ub098", "\u2581\uc120\uac70", "\uac00", "\u2581", "\uc600", "\uc74c\uc744", "\u2581\uc870\uc9c0", "\uc544", "\uc8fc", "\u25811971", "\ub144\ubd80\ud130", "\u2581\ub4f1", "\uc6a9", "\ubc95\uc744", "\u2581\ub300\ud1b5\ub839", "\u2581\ub204", "\ub974\uace0"]}
SentencePiece Tokenizer 및 위키로 만든 8007개의 Vocab
[PAD] 0
[UNK] 0
[BOS] 0
[EOS] 0
[SEP] 0
[CLS] 0
[MASK] 0
▁1 -0
▁이 -1
으로 -2
에서 -3
▁있 -4
▁2 -5
▁그 -6
▁대 -7
▁사 -8
이다 -9
었다 -10
...중략...
Reformer-pytorch의 Reformer 사용.
count = 10 # 학습 데이터 분할 크기 kowiki_bert_{}.json
learning_rate = 5e-5 # Learning Rate
n_epoch = 20 # Num of Epoch
batch_size = 128 # 배치 사이즈
device ="cpu" # cpu or cuda
vocab_size = 8007 # vocab 크기
max_seq_len = 512 # 최대 입력 길이
embedding_size = 768 # 임베딩 사이
batch_size = 128 # 학습 시 배치 크기
depth = 12 # reformer depth
heads = 8 # reformer heads
train_save_step = 100 # 학습 저장 주기
기본 BERT의 Masked Language Model과 Next Sentence Prediction을 사전학습에 사용.
- 학습 모델
Colab pro에서 P100을 이용해 학습을 진행해 보니 base 모델을 학습하는데, 많은 시간이 소요됨. 따라서BERT-Small
모델을 통해 학습을 다시 진행
H=128 | H=256 | H=512 | H=768 | |
---|---|---|---|---|
L=2 | [2/128 (BERT-Tiny)] | [2/256] | [2_512] | [2_768] |
L=4 | [4/128] | [4/256 (BERT-Mini)] | [4/512 (BERT-Small)] | [4/768] |
L=6 | [6/128] | [6/256] | [6/512] | [6/768] |
L=8 | [8/128] | [8/256] | [8/512 (BERT-Medium)] | [8/768] |
L=10 | [10/128] | [10/256] | [10/512] | [10/768] |
L=12 | [12/128] | [12/256] | [12/512] | [12/768 (BERT-Base)] |
Colab GPU 메모리 12G 이상.
12G 이하로는 학습 되지 않음.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
loss | 5.98 | 5.27 | 4.98 | 4.77 | 4.60 | 4.45 | 4.31 | 4.17 | 4.03 | 3.89 | 3.76 | 3.63 | 3.51 | 3.39 | 3.27 | 3.17 | 3.06 | 2.97 | 2.88 | 2.79 |
Size | NSMC (acc) |
Naver NER (F1) |
PAWS (acc) |
KorNLI (acc) |
KorSTS (spearman) |
Question Pair (acc) |
KorQuaD (Dev) (EM/F1) |
|
---|---|---|---|---|---|---|---|---|
ReforBERT |
MIT
Seonghwan Kim
일자 | 내용 | 비고 |
---|---|---|
20.04.25 | 시작 | |
20.05.08 | Pretrain 코드 테스트 | |
20.05.10 | Colab에서 Pretrain 테스트 | |
20.05.11 | Colab 학습 중지 후 재개 부분 추가 | |
2020.05.11~20.05.24 | BERT-base모델 Colab 학습 진행 | 학습시간이 오래 걸리는 문제로 BERT-small로 변경 |
20.7.12 | reforBERT-small모델 Colab 학습 진행 | |
20.7.27 | reforBERT-base모델 nipa 학습 진행 | |
20.8.16 | reforBERT-base모델 korquad 성능 측정 좋지 못함. |
lucidrains/reformer-pytorch
BERT(Bidirectional Encoder Representations from Transformers) 구현하기 (1/2)
SKTBrain/KoBERT
monologg/KoELECTRA