Zorba blog
BERT의 마스크드 언어 모델(Masked Language Model) 본문
구글 BERT의 마스크드 언어 모델
1. 마스크드 언어 모델과 토크나이저
- BERT는 이미 누군가가 학습해둔 모델을 사용하는 것이므로 우리가 사용하는 모델과 토크나이저는 항상 맵핑 관계.
- 아래 코드를 통해 마스크드 언어 모델과 토크나이저를 로드
from transformers import TFBertForMaskedLM
from transformers import AutoTokenizer
model = TFBertForMaskedLM.from_pretrained('bert-large-uncased')
tokenizer = AutoTokenizer.from_pretrained("bert-large-uncased")
2. BERT의 입력
- "Soccer is a really fun [MASK]" 라는 문장을 마스크드 언어 모델의 입력으로 넣으면, 마스크드 언어 모델은 [MASK]의 위치에 해당하는 단어를 예측.
- 토크나이저를 사용하여 해당 문장을 정수 인코딩. input_ids를 통해 정수 인코딩 결과를 확인.
inputs = tokenizer('Soccer is a really fun [MASK].', return_tensors='tf')
print(inputs['input_ids'])
tf.Tensor([[ 101 4715 2003 1037 2428 4569 103 1012 102]], shape=(1, 9), dtype=int32)
- 토크나이저로 변환된 결과에서 token_type_ids를 통해서 문장을 구분하는 세그먼트 인코딩 결과를 확인.
- 현재의 문장이 한 개이므로 여기서는 문장 길이만큼 0 시퀀스를 얻음.
print(inputs['token_type_ids'])
tf.Tensor([[0 0 0 0 0 0 0 0 0]], shape=(1, 9), dtype=int32)
print(inputs['attention_mask'])
tf.Tensor([[1 1 1 1 1 1 1 1 1]], shape=(1, 9), dtype=int32)
- attention_mask를 통해서 실제 단어와 패딩 토큰을 구분하는 용도인 어텐션 마스크를 확인.
- 현재의 입력에서는 패딩이 없으므로 여기서는 문장 길이 만큼의 1 시퀀스를 얻음.
- 만약 뒤에 패딩이 있었다면 패딩이 시작되는 구간부터는 0의 시퀀스가 나오게 됨.
3. [MASK] 토큰 예측하기
- FillMaskPipeline은 모델과 토크나이저를 지정하면 손쉽게 마스크드 언어 모델의 예측 결과를 정리해서 보여줌.
- FillMaskPipeline에 앞서 불러온 모델과 토크나이저를 지정.
from transformers import TFBertForMaskedLM
from transformers import AutoTokenizer
model = TFBertForMaskedLM.from_pretrained('bert-large-uncased')
tokenizer = AutoTokenizer.from_pretrained("bert-large-uncased")
from transformers import FillMaskPipeline
pip = FillMaskPipeline(model=model, tokenizer=tokenizer)
- pip를 통해 [MASK]의 위치에 들어갈 수 있는 상위 5개의 후보 단어들을 출력.
pip('Soccer is a really fun [MASK].')
[{'score': 0.762112021446228,
'sequence': 'soccer is a really fun sport.',
'token': 4368,
'token_str': 'sport'},
{'score': 0.2034197747707367,
'sequence': 'soccer is a really fun game.',
'token': 2208,
'token_str': 'game'},
{'score': 0.012208552099764347,
'sequence': 'soccer is a really fun thing.',
'token': 2518,
'token_str': 'thing'},
{'score': 0.0018630230333656073,
'sequence': 'soccer is a really fun activity.',
'token': 4023,
'token_str': 'activity'},
{'score': 0.001335485139861703,
'sequence': 'soccer is a really fun field.',
'token': 2492,
'token_str': 'field'}]
한국어 BERT의 마스크드 언어 모델
1. 마스크드 언어 모델과 토크나이저
- BERT는 이미 누군가가 학습해둔 모델을 사용하는 것이므로 우리가 사용하는 모델과 토크나이저는 항상 맵핑 관계.
- 아래 코드를 통해 마스크드 언어 모델과 토크나이저를 로드
from transformers import TFBertForMaskedLM
from transformers import AutoTokenizer
model = TFBertForMaskedLM.from_pretrained('klue/bert-base', from_pt=True)
tokenizer = AutoTokenizer.from_pretrained("klue/bert-base")
* from_pt=True 는 해당 모델이 기존에는 텐서플로우가 아니라 파이토치로 학습된 모델이지만 이를 텐서플로우에서 사용하겠다라는 의미.
2. BERT의 입력
- "축구는 정말 재미있는 [MASK]다" 라는 문장을 마스크드 언어 모델의 입력으로 넣으면, 마스크드 언어 모델은 [MASK]의 위치에 해당하는 단어를 예측.
- 토크나이저를 사용하여 해당 문장을 정수 인코딩. input_ids를 통해 정수 인코딩 결과를 확인.
inputs = tokenizer('축구는 정말 재미있는 [MASK]다.', return_tensors='tf')
print(inputs['input_ids'])
tf.Tensor([[ 2 4713 2259 3944 6001 2259 4 809 18 3]], shape=(1, 10), dtype=int32)
- 토크나이저로 변환된 결과에서 token_type_ids를 통해서 문장을 구분하는 세그먼트 인코딩 결과를 확인.
- 현재의 문장이 한 개이므로 여기서는 문장 길이만큼 0 시퀀스를 얻음.
print(inputs['token_type_ids'])
tf.Tensor([[0 0 0 0 0 0 0 0 0]], shape=(1, 9), dtype=int32)
print(inputs['attention_mask'])
tf.Tensor([[1 1 1 1 1 1 1 1 1]], shape=(1, 9), dtype=int32)
- attention_mask를 통해서 실제 단어와 패딩 토큰을 구분하는 용도인 어텐션 마스크를 확인.
- 현재의 입력에서는 패딩이 없으므로 여기서는 문장 길이 만큼의 1 시퀀스를 얻음.
- 만약 뒤에 패딩이 있었다면 패딩이 시작되는 구간부터는 0의 시퀀스가 나오게 됨.
3. [MASK] 토큰 예측하기
- FillMaskPipeline은 모델과 토크나이저를 지정하면 손쉽게 마스크드 언어 모델의 예측 결과를 정리해서 보여줌.
- FillMaskPipeline에 앞서 불러온 모델과 토크나이저를 지정.
from transformers import TFBertForMaskedLM
from transformers import AutoTokenizer
model = TFBertForMaskedLM.from_pretrained('bert-large-uncased')
tokenizer = AutoTokenizer.from_pretrained("bert-large-uncased")
from transformers import FillMaskPipeline
pip = FillMaskPipeline(model=model, tokenizer=tokenizer)
- pip를 통해 [MASK]의 위치에 들어갈 수 있는 상위 5개의 후보 단어들을 출력.
pip('축구는 정말 재미있는 [MASK]다.')
[{'score': 0.8963505625724792,
'sequence': '축구는 정말 재미있는 스포츠 다.',
'token': 4559,
'token_str': '스포츠'},
{'score': 0.02595764957368374,
'sequence': '축구는 정말 재미있는 거 다.',
'token': 568,
'token_str': '거'},
{'score': 0.010033931583166122,
'sequence': '축구는 정말 재미있는 경기 다.',
'token': 3682,
'token_str': '경기'},
{'score': 0.007924391888082027,
'sequence': '축구는 정말 재미있는 축구 다.',
'token': 4713,
'token_str': '축구'},
{'score': 0.00784421805292368,
'sequence': '축구는 정말 재미있는 놀이 다.',
'token': 5845,
'token_str': '놀이'}]
'자연어처리' 카테고리의 다른 글
한국어 임베딩(이기창 저. 2019) / Chapter 1. Introduction (0) | 2022.08.06 |
---|---|
Word Embedding(ELMo, BERT) (0) | 2022.06.22 |
버트(Bidirectional Encoder Representations from Transformers, BERT) (0) | 2022.06.07 |
NLP에서의 사전 훈련(Pre-Training) (0) | 2022.06.03 |
트랜스포머(Transformer) 모델 / 인코더, 포지션-와이즈 피드 포워드 신경망, 잔차 연결, 정규화 (0) | 2022.06.03 |