일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Operation function
- 가능도
- Comparisons
- type hints
- 최대가능도 추정법
- Array operations
- Numpy data I/O
- Python
- scatter
- subplot
- 카테고리분포 MLE
- namedtuple
- groupby
- boolean & fancy index
- seaborn
- Python 유래
- unstack
- 부스트캠프 AI테크
- 딥러닝
- Numpy
- ndarray
- BOXPLOT
- dtype
- pivot table
- 표집분포
- Python 특징
- python 문법
- VSCode
- linalg
- 정규분포 MLE
- Today
- Total
또르르's 개발 Story
[Stage 2 - 06] xlm-roberta-large 사용하기 본문
1️⃣ Goal
[BaseLine 작성] (추가 : 4/12, 새로운 Baseline code)- [Data Processing]
- Exploratory Data Analysis (추가 : 4/12, 기간 : 4/12 ~ )
- Cross-validation 사용 (추가 : 4/12)
- 데이터 불균형 해소 (추가 : 4/12)
-한국어 전처리 (추가 : 4/13, 기간 : 4/13 ~ 4/13 )
- 새로운 tokenizer 사용 (추가 : 4/12, 기간 : 4/13 ~ )
- 형태소 분류기 -> BERT wordpiece (추가 : 4/13)
- [ENT][/ENT] tag를 추가해서 train 돌리기 (추가 : 4/14, 기간 : 4/20 ~ )
-Pororo 사용해보기 (추가 : 4/20, 기간 : 4/20 ~ 4/21) - [Model]
-BERT 모델 사용 (추가 : 4/12, 기간 : 4/14 ~ 4/20 )
- Roberta 모델 사용 (추가 : 4/20, 기간 : 4/20 ~ )
- xlm-roberta 모델 사용 (추가 : 4/20, 기간 : 4/21 ~ )
-GPT 모델 사용 (추가 : 4/12, 취소 : 생성모델이라 대회 목적과 다름)
- ELECTRA 모델 사용 (추가 : 4/12)
-KoBERT 모델 사용 (추가 : 4/12, 기간 : 4/14 ~ 4/16 ) - [Training]
- 앙상블 시도 (추가 : 4/12)
- Hyperparameter 변경 (추가 : 4/12, 기간 : 4/21 ~ )
- Learning Schedular 사용 (추가 : 4/12)
-좋은 위치에서 Checkpoint 만들기 (추가 : 4/12, huggingface trainer 사용)
- Wandb (Auto ML) 사용 (추가 : 4/12) - [Deploy]
-Python 모듈화 (추가 : 4/12, baseline code)
2️⃣ Learning
1) GPT 언어 모델
[Stage 2 - 이론] GPT 언어 모델
GPT 언어 모델은 BERT와 다르게 단방향 모델입니다. 또한, BERT는 Transformer의 Encoder를 사용했고, GPT는 Transforemer의 Decoder를 사용했습니다. GPT는 현재 token을 토대로 다음에 나올 token을 예측하고,..
dororo21.tistory.com
2) 한국어 GPT-2 모델 학습하기
[Stage 2 - 이론] 한국어 GPT-2 모델 학습하기
또르르's 개발 Story [Stage 2 - 이론] 한국어 GPT-2 모델 학습하기 본문 [P Stage 2] KLUE/이론 [Stage 2 - 이론] 한국어 GPT-2 모델 학습하기 또르르21 또르르21 2021. 4. 21. 11:23 Prev 1 2 3 4 5 ··· 144 Next
dororo21.tistory.com
3️⃣ Main Task
1) xlm-roberta-large 사용
transformer에서 xlm-roberta 관련 값들을 가지고 옵니다.
from transformers import XLMRobertaTokenizer, XLMRobertaForSequenceClassification, XLMRobertaTokenizerFast
XLMRobertaTokenizer는 Tokenizer와 TokenizerFast가 있는데 이 두 개의 차이점은 SentencePiece와 BPE 방식입니다.
두 개 모두 사용해보려고 합니다.
tokenizer = XLMRobertaTokenizer.from_pretrained(MODEL_NAME)
tokenizer = XLMRobertaTokenizerFast.from_pretrained(MODEL_NAME)
모델은 다음과 같이 불러올 수 있습니다.
단일 분류인 XLMRobertaForSequenceClassification을 사용하겠습니다.
bert_config = XLMRobertaConfig.from_pretrained(MODEL_NAME)
model = XLMRobertaForSequenceClassification.from_pretrained(MODEL_NAME, config=bert_config)
- (기존방식) Bert 모델 + BertTokenizer
- 하이퍼파라미터 : epoch-5, checkpoint-1500, batch_size-16, Model-"bert-base-multilingual-cased"
- tokenized_sentence : "# \ entity01개체명 \ entity01 # [SEP] @ ^ entity02 개체명 ^ entity02 @" + "#,@,\,^ 전체 문장"
- (시도 1) xlm-roberta 모델 + xlmrobertaTokenizer
- 하이퍼파라미터 : epoch-5, checkpoint-1500, batch_size-16, Model-"xlm-roberta-large"
- tokenized_sentence : "entity01[SEP]entity02"+ "전체 문장"
- tokenized_sentence를 다시 원래대로 바꾸니 전체적인 성능이 약간밖에 안올랐습니다.
- (시도 2) xlm-roberta 모델 + xlmrobertaTokenizer + tokenized_sentence 변경
- 하이퍼파라미터 : epoch-10, checkpoint-2400, batch_size-32, label_smoothing_factor : 0.5, Model-"xlm-roberta-large"
- tokenized_sentence : "# \ entity01개체명 \ entity01 # [SEP] @ ^ entity02 개체명 ^ entity02 @" + "#,@,\,^ 전체 문장"
- tokenized_sentence를 바꾸고 조금 더 많은 epoch을 돌리니 Accuracy가 2%정도 향상되었습니다.
- (시도 3) xlm-roberta 모델 + xlmrobertaTokenizer + 하이퍼파라미터 변경
- 하이퍼파라미터 : epoch-10, checkpoint-2000, batch_size : 16, label_smoothing_factor : 0.3, Model-"xlm-roberta-large"
- tokenized_sentence : "# \ entity01개체명 \ entity01 # [SEP] @ ^ entity02 개체명 ^ entity02 @" + "#,@,\,^ 전체 문장"
- batch_size를 16으로 줄이고 checkpoint 2000에서 가장 좋은 eval 성능이 나왔길래 해당 값을 사용했습니다.
- (시도 4) xlm-roberta 모델 + xlmrobertaTokenizerFast (BPE)
- 하이퍼파라미터 : epoch-10, checkpoint-2200, batch_size-32, label_smoothing_factor: 0.3, Model-"xlm-roberta-large"
- tokenized_sentence : "# \ entity01개체명 \ entity01 # [SEP] @ ^ entity02 개체명 ^ entity02 @" + "#,@,\,^ 전체 문장"
- PB에 제출은 안했지만 일반 Tokenizer보다 좋지 않은 성능을 보여 취소.
- (시도 5) xlm-roberta 모델 + xlmrobertaTokenizer + 하이퍼파라미터 변경
- 하이퍼파라미터 : epoch-10, checkpoint-2600, batch_size-20, label_smoothing_factor: 0.4, Model-"xlm-roberta-large"
- tokenized_sentence : "# \ entity01개체명 \ entity01 # [SEP] @ ^ entity02 개체명 ^ entity02 @" + "#,@,\,^ 전체 문장"
- eval accuracy가 가장 좋은 checkpoint를 inference하니 성능이 좋게 나왔습니다.
2) entity layer 추가 (대회 끝난 후)
model.bert.BertEmbeddings.set_entity_embeddings(entity) # 여기 이렇게 수정해보기
4️⃣ Sub Task
없음.
5️⃣ Evaluation
날짜 | Data processing & Tokenizer |
Model | Training | Time | Accuracy |
4/13 | - EDA - |
1h | - | ||
" | - new baseline code - |
30m | 59.3000% | ||
4/14 | " | - KoBERT - |
- epoch : 20 max_len : 128 batch_size : 32 - |
23m | 72.0000% |
4/17 | " | - "bert-base-multilingual-cased" BERT - |
- epoch : 4 batch_size : 16 - |
14m | 72.8000% |
4/19 | - "entity01[SEP]entity02" + "[ENT]가 들어간 전체 문장" - |
" | " | 16m | 71.2000% |
- "[ENT]가 들어간 전체 문장" - |
" | " | 17m | 52.5000% | |
4/20 | - pororo NER - "#,@,\,^를 사용해서 구분한 전체 문장" - |
" | - epoch : 10 checkpoint : 5000 - |
50m | 70.8000% |
- "#entity01 # [SEP] @entity02 @" + "#,@,\,^ 전체 문장" - |
" | - checkpoint : 2500 - |
16m | 71.6000% | |
- "# \ entity01개체명 \ entity01 # [SEP] @ ^ entity02 개체명 ^ entity02 @" + "#,@,\,^ 전체 문장" - |
" | - epoch : 5 checkpoint : 1500 - |
12m | 74.5000% | |
4/21 | - "entity01[SEP]entity02" + "[ENT]가 들어간 전체 문장" - xlmrobertaTokenizer (sentencePiece) - |
- xlm-roberta-large - |
" | 31m | 74.6000% |
- "# \ entity01개체명 \ entity01 # [SEP] @ ^ entity02 개체명 ^ entity02 @" + "#,@,\,^ 전체 문장" - |
" | - epoch : 10 checkpoint : 2400 batch_size : 32 label_smoothing_factor : 0.5 - |
51m | 76.3000% | |
" | " | - checkpoint : 2000 batch_size : 16 label_smoothing_factor:0.3 - |
31m | 77.6000% | |
" | " | - checkpoint : 2600 batch_size : 20 label_smoothing_factor : 0.4 |
46m | 78.5000% | |
1) xlm-roberta-large 모델 사용
큰 모델을 사용하는 것이 성능향상에 도움이 되는 것을 깨달았습니다.
tokenizer를 아무리 해도 BERT로는 성능 향상에 한계가 있었는데, large 모델로 변경하니 성능이 눈에 띄게 좋아졌습니다.
2) 차후 목표
- hyperparameter 찾기
- entity layer 추가 (대회 끝난 후)
model.bert.BertEmbeddings.set_entity_embeddings(entity) # 이렇게 수정해보기
'[P Stage 2] KLUE > 프로젝트' 카테고리의 다른 글
[Stage 2 - 07] 최적의 Hyperparameter 찾기 (0) | 2021.04.23 |
---|---|
[Stage 2 - 05] Pororo 라이브러리 사용하기 (0) | 2021.04.20 |
[Stage 2 - 04] Entity Special token (0) | 2021.04.20 |
[Stage 2 - 04] BERT MASK & 단일 문장 분류 (0) | 2021.04.16 |
[Stage 2 - 03] BERT (0) | 2021.04.15 |