또르르's 개발 Story

[Stage 2 - 06] xlm-roberta-large 사용하기 본문

[P Stage 2] KLUE/프로젝트

[Stage 2 - 06] xlm-roberta-large 사용하기

또르르21 2021. 4. 22. 12:04

 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 언어 모델

dororo21.tistory.com/144

 

[Stage 2 - 이론] GPT 언어 모델

GPT 언어 모델은 BERT와 다르게 단방향 모델입니다. 또한, BERT는 Transformer의 Encoder를 사용했고, GPT는 Transforemer의 Decoder를 사용했습니다. GPT는 현재 token을 토대로 다음에 나올 token을 예측하고,..

dororo21.tistory.com

 

2) 한국어 GPT-2 모델 학습하기

 

dororo21.tistory.com/145

 

[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 방식입니다.

 

https://huggingface.co/transformers/model_doc/xlmroberta.html

 

https://huggingface.co/transformers/model_doc/xlmroberta.html

 

두 개 모두 사용해보려고 합니다.

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) # 이렇게 수정해보기

 

Comments