[Day20] Self-supervised Pre-training Models

 

 

중요

BERT

BERT의 config, tokenizer, model을 각각 불러오고 확인

bert_name = 'bert-base-uncased'

config = BertConfig.from_pretrained(bert_name)
# model과 tokenizer는 무조건 같은 name를 불러와야 한다.
tokenizer = BertTokenizer.from_pretrained(bert_name)
model = BertModel.from_pretrained(bert_name)

여기서 tokenizer와 model이 다르게 되면 차원이 달라질 수 있어서 idx가 이상하게 될 수 있다. config를 보게 되면 max_position_embeddings가 있는데 이것은 입력 길이의 최대값이 된다.

 

 

Tokenizer 사용

sentence = "I want to go home."
output = tokenizer(sentence)
output
>>> {'input_ids': [101, 1045, 2215, 2000, 2175, 2188, 1012, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1]}
  • input_ids: 기존 문장을 vocab의 idx로 바꿔서 반환
  • token_type_ids: segment embedding이다. 우리는 한문장을 줬기때문에 0
  • atention_mask: input에 대한 masking한다. 이건 input에 pad가 있을때 활용한다.
  • 문장의 101: CLS 토큰의 idx 102: SEP 토큰의 idx

 

혹은 직접 tokenize함수를 호출할 수 있다.

tokenized = tokenizer.tokenize(sentence)
tokenized
>>> ['i', 'want', 'to', 'go', 'home', '.']

그러면 위 처럼 따로 idx로 반환하지 않고 자연어 상태로 보여 준다. 소문자 버전이라 I도 i로 나온 것을 확인 할 수 있다.

 

또한 vocabulary도 확인 가능

vocab = tokenizer.get_vocab()

print(vocab)
print(len(vocab))

>>> {'[PAD]': 0, '[unused0]': 1, '[unused1]': 2, '[unused2]': 3, '[unused3]': 4, ... }
>>> 30522

 

각각 여러 함수들이 존재 하므로 예시를 보고 익혀보자

# token
token_ids = [vocab[token] for token in tokenized]
print(token_ids)
>>> [1045, 2215, 2000, 2175, 2188, 1012]

# _convert_token_to_id
token_ids = [tokenizer._convert_token_to_id(token) for token in tokenized]
print(token_ids)
>>> [1045, 2215, 2000, 2175, 2188, 1012]

# convert_tokens_to_ids
token_ids = tokenizer.convert_tokens_to_ids(tokenized)
print(token_ids)
>>> [1045, 2215, 2000, 2175, 2188, 1012]

# encode
token_ids = tokenizer.encode(sentence)
print(token_ids)
>>> [101, 1045, 2215, 2000, 2175, 2188, 1012, 102]

# convert_tokens_to_string
sentence = tokenizer.convert_tokens_to_string(tokenized)
print(sentence)
>> i want to go home .

# convert_ids_to_tokens & convert_tokens_to_string
tokens = tokenizer.convert_ids_to_tokens(token_ids)
print(tokens)
>>> ['[CLS]', 'i', 'want', 'to', 'go', 'home', '.', '[SEP]']
sentence = tokenizer.convert_tokens_to_string(tokens)
print(sentence)
>>> [CLS] i want to go home . [SEP]

# 문장 2개를 넣으면 "[SEP]" token을 추가하여 자동으로 processing 
tokenizer("I want to go home.", "Me too.")
>>> {'input_ids': [101, 1045, 2215, 2000, 2175, 2188, 1012, 102, 2033, 2205, 1012, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}

 

 

 

GPT-2

GPT-2의 config, tokenizer, model을 각각 불러오고 확인

GPT-2도 마찬가지로 BERT와 같이 불러온다.

gpt_name = 'gpt2'

config = GPT2Config.from_pretrained(gpt_name)
tokenizer = GPT2Tokenizer.from_pretrained(gpt_name)
model = GPT2Model.from_pretrained(gpt_name)

여기도 tokenizer와 mode의 name은 같아야 한다. config를 확인해보면 BERT의 max_position_embeddings과 같이 n_ctx의 이름으로 입력의 최댓값을 표시한다.

 

BERT 에서 본 Tokenizer에서 본 함수들을 똑같이 사용할 수 있다. model에 따라 output값만 다르게 된다. 사용법은 같음.

 

아래 사이트를 이용해서 사용법을 익히자.

 

BERT, GPT-2에 다양한 head를 추가한 모델을 제공한다.

 

 

피어세션

  • 찰스

    • BLEU 스코어가 옳은 번역/ 옳지 않은 번역은 확실히 스코어링해주는데 비슷한 완성도의 번역은 잘 스코어링해주지 못한다.

    • git open 소개

      • 바로 원격저장소를 브라우저로 오픈해주는 역할을 한다.

         

  • 네오

 

+ Recent posts