월간 데이콘 소설 작가 분류 AI 경진대회

알고리즘 | NLP | 분류 | 자연어 | LogLoss

  • moneyIcon Prize : 100만원+애플워치
  • 1,418명 마감

 

Private 17위(점수 : 0.19078) 솔루션입니다. (Bert)

2020.12.07 21:46 9,749 Views language

안녕하세요, 저는 이번 컴피티션에 Bert 바닐라 모델을 사용하였습니다.

외부 데이터가 사용된 pre-trained 모델이 아니라, 주어진 데이터만을 사용하여 pre-train과 fine-tuning을 진행하였습니다.

전처리는 개인 PC에서 진행하였고, 학습은 google colab의 tpu를 사용하였습니다.



특수문자 제거, stopword 제거 등의 전처리 없이 소문자 변환만 진행하였습니다.

Vocab은 Transformers의 BertWordPieceTokenizer를 사용하여 build했습니다.

모델 학습은 아래 구글의 코드를 사용하였습니다.
https://github.com/google-research/bert

모델 사전 학습 시 nsp loss는 포함하지 않고 mlm loss만 사용하여 사전학습하였습니다.

데이터 양이 상대적으로 적어, 기본 모델보다 파라미터 수를 줄인 모델을 사용했습니다.

아래는 기본 모델에서 변경한 config입니다.

intermediate_size : 3072 -> 2048
num_hidden_layers : 12 -> 8


두 개의 개별적 환경에서 모델 학습이 이루어져 두 개의 ipynb 파일이 존재하는데, 파일이 하나밖에 업로드되지 않아서
하나의 파일로 병합하여 공유합니다.

감사합니다.


   * 구글의 bert 코드 중 run_classifier.py 부분에 추가한 부분도 파일에 첨부했습니다.

Code
로그인이 필요합니다
0 / 1000
파이썬초보만
2020.12.08 16:05

잘 봤습니다 수고하셨습니다~

둘뤼
2020.12.10 09:25

코드 공유 감사합니다.

한가지 질문이 있는데, 모델 파라미터를 줄였다고 하셨는데, 그러면  공유되어 있는 bert모델을 쓴게 아니라, 기존의 공개되어 있는 모델을 기반으로 스스로 새로 구축한건가요?

Toona
2020.12.10 09:40

네, 공유되어 있는 학습된 bert 모델이 아니라 대회 데이터만을 사용해 기초부터 새로 학습한 모델입니다.
코드는 구글의 repo를 사용했습니다. (https://github.com/google-research/bert)

아무래도 데이터의 양이 기존 bert보다 현저히 적기 때문에 오버피팅 방지를 위해 일부 파라미터를 수정했습니다.

둘뤼
2020.12.11 23:01

네 감사드립니다.

hahaha
2020.12.10 22:36

코드 공유 감사합니다.

코드에 가중치를 불러와서 test data predict하는 과정이 없는 것 같은데,
마지막 줄에서 생성된 가중치 값만 load해서 bert layer에 classifier 달아서 사용하면 되는 건가요?

Toona
2020.12.10 23:32

마지막 줄에서 --do_predict를 True로 주시면 됩니다.
run_classifier.py 코드에 대회 데이터셋을 추가해야 하는데, 해당 코드도 첨부하였습니다.

Toona
2020.12.10 23:36

pretrain_corpus는 학습에 필요한 데이터를 tf_record 형태로 변환하여 저장된 파일입니다.
역시 구글 코드 중 create_pretraining_data.py를 이용하여 만드시면 됩니다.
제 환경 기준으로

python create_pretraining_data.py --input_file=pretrain_corpus.txt --vocab_file=vocab_20000-vocab --output_file=pretrain_corpus

명령어를 사용하시면 됩니다.

Toona
2020.12.10 23:38

model config 파일인 bert_config_20000.json는 아래와 같습니다.
{
  "attention_probs_dropout_prob": 0.1,
  "hidden_act": "gelu",
  "hidden_dropout_prob": 0.1,
  "hidden_size": 768,
  "initializer_range": 0.02,

Toona
2020.12.10 23:40

  "intermediate_size": 2048,
  "max_position_embeddings": 512,
  "num_attention_heads": 12,
  "num_hidden_layers": 8,
  "type_vocab_size": 2,
  "vocab_size": 20000,
  "num_labels": 5
}
댓글이 너무 길어서 한 번에 안올라가네요 ^^;
max_position_embeddings는 max_seq_length와 동일하게 적어주시면 됩니다.

hahaha
2020.12.11 00:09

와 감사합니다~^  hidden size조절해서 한번 해봐야 겠네요 구체적인 답변 다시한번 감사합니다ㅎㅎ