Naver Ai Boostcamp

[4/15] BERT 언어 모델 (2) + 나만의 BERT 만들기

잡담연구소 2021. 4. 16. 02:24

- BERT 학습의 단계

1. Tokenizer 만들기

2. 데이터셋 확보

3. Next sentence prediction(NSP)

4. Masking

- Domain-specific task의 경우 처음부터 직접 새로 학습하는 것이 성능이 더 좋다. 

 

가장 중요한 것은 개인정보가 없는! 저작권 문제가 해결된! 데이터 셋을 사용해야 한다. 

모델이 개인정보를 학습할 수가 있기 때문이다! 최근 이루다 이슈를 생각해보면 바로 느낌이 온다.

미국 전 대통령 오바마를 가지고 한 번 예시를 들어보자.

 

항상 tokenizer는 잘 되는지 확인 먼저! 

print(tokenizer('이순신은 조선 중기의 무신이다.'))

{'input_ids': [101, 9638, 119064, 25387, 10892, 59906, 9694, 46874, 9294, 25387, 11925, 119, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}

 

pipeline을 사용하면 inference를 한 번에 손쉽게 해결할 수 있다.

fill-mask라는 task를 진행할 것이며, score가 높은 순으로 5개만 출력해보자.

from transformers import pipeline
nlp_fill = pipeline('fill-mask', top_k=5, model=model, tokenizer=tokenizer)

오바마는 하와이 호놀룰루 출신인데, mask를 통해 모델이 예측을 한 결과를 살펴보면,,,,!

nlp_fill('Obama was born in [MASK], Hawaii.')

0.8이라는 아주 높은 확률로 모델은 오바마가 호놀룰루 출신이라고 예측하게 된다.

이 모델은 이미 오바마에 대해 학습이 됐기 때문에, 오바마의 신상을 다 아는 것이다!! 

[{'score': 0.8043822646141052,
  'sequence': 'Obama was born in Honolulu, Hawaii.',
  'token': 56348,
  'token_str': 'Honolulu'},
 {'score': 0.16055044531822205,
  'sequence': 'Obama was born in Hawaii, Hawaii.',
  'token': 21729,
  'token_str': 'Hawaii'},
 {'score': 0.001997554674744606,
  'sequence': 'Obama was born in County, Hawaii.',
  'token': 10886,
  'token_str': 'County'},
 {'score': 0.0016650909092277288,
  'sequence': 'Obama was born in Mesa, Hawaii.',
  'token': 25076,
  'token_str': 'Mesa'},
 {'score': 0.0008855907944962382,
  'sequence': 'Obama was born in Kai, Hawaii.',
  'token': 26387,
  'token_str': 'Kai'}]

이렇게 개인정보를 마스킹처리하지 않고 데이터셋으로 사용하게 된다면, 일반 사용자들의 개인정보 (계좌, 전화번호, 거주지, 직업 등)이 유출될 수 있으므로 데이터셋에 꼭꼭 신경쓰자! 

 

오늘의 실습은 나만의 Bert만들어보기!! 

👉 나만의 bert 만들어서 competition에 적용해보고 싶었는데,,,, 음,,,, 조교님한테 물어봤더니 gpu많은 조교님이라면 2~3일 걸려서 만들어보신다고 하셨는데,,,, 가진 게 p40 하나 뿐인 나는 대회 끝나야 완성일 거 같아서 고이 마음을 접었다. 자연어의 세계는 너무 어려운 거 같다;

 


1일 1제출하라는 약간의 화가 담긴 거 같은 운영진님의 말씀을 듣고 내가 너무 소홀했나;;; 싶어서 관심을 좀 가졌더니 벌써 새벽2시다. 코테 준비 언제하죠? ㅜㅜ 

 

1. 오늘 랜덤시드의 중요성을 깨달았다. 랜덤시드만 잘 골라도 2.5% 상승

2. tokenizer에 대해서 뭘 쓸까,,, 얘기가 많았는데,,, EDA아닌 EDA를 해보니 koelectra가 제일 좋은데,,,?

이런 당했다! 토론 글이 올라면 가만히 쪽쪽 꿀만 빨지 말고, 꿀인지 아닌지 꼭 확인하는 작업을 거치자!

 

koelectra를 썼을 때가 가장 좋게 나왔다.

한자 만자 정도만 추가해보는 건 어떨까!