You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
doc_type_ids를 추가하여 수정된 BigBirdModel class와 Bartdecoder class를 EncoderDecoderModel class로 encoder-decoder 모델을 만듭니다.
2. Model 흐름
EncoderDecoderModel class/
├── BigBirdModelWithDoctype class
│ ├── BigBirdEmbeddingsWithDoctype class
│ ├── BigBirdEncoder class
├── BartDecoderWithDoctype class
│ ├── BartLearnedPositionalEmbedding class
│ ├── BartDecoderLayer class
3. modeling_kobigbird_bart.py 구조
BigBirdConfigWithDoctype class
기존 BigBirdConfig를 상속받아 doc_type_size를 추가한 class입니다.
기존 BigBirdEmbeddings class를 상속받아 기존에 word_embedding, token_type_embedding, position embedding을 이용하여 embedding을 구성한 것에 doc_type_embeddings을 추가한 class입니다.
# doc_type_embedding을 추가로 계산하는 코드 추가!!position_embeddings=self.position_embeddings(position_ids)
embeddings+=position_embeddingsifdoc_type_idsisnotNone :
doc_type_embeddings=self.doc_type_embeddings(doc_type_ids)
embeddings+=doc_type_embeddings
BigBirdModelWithDoctype class
기존 BigBirdPreTrainedModel class를 상속받아 BigBirdEmbeddings class 말고, BigBirdEmbeddingsWithDoctype class를 이용하기 위해 사용된 class입니다.
그리고 추가로 doc_type_ids를 추가해 사용합니다.
# BigBirdEmbeddingsWithDoctype class를 부른 코드 추가!!self.embeddings=BigBirdEmbeddingsWithDoctype(config)
self.encoder=BigBirdEncoder(config)
BartDecoderWithDoctype class
기존 BartDecoder class에 doc_type_embedding을 추가하기 위한 class입니다.
input_ids의 크기와 맞게, doc_type_ids을 넣고 나머지 부분은 pad_id를 추가적으로 붙입니다.
def preprocess_function(examples, tokenizer, data_args):
... # 생략
if data_args.use_doc_type_ids:
model_inputs = doc_type_marking(model_inputs, doc_type_id, pad_id)
model_inputs["labels"] = labels["input_ids"]
return model_inputs
# embedding에 필요한 doc_type_ids를 생성, input_ids와 길이 동일
def doc_type_marking(tokenizer_tmp_input, doc_type_id, pad_id):
doc_type_input_ids=[]
for i, input_ids_per_one_input in enumerate(tokenizer_tmp_input['input_ids']):
if pad_id not in input_ids_per_one_input:
marking = [doc_type_id[i]]*len(input_ids_per_one_input)
doc_type_input_ids.append(marking)
else:
marking = [doc_type_id[i]]*len(input_ids_per_one_input[:list(input_ids_per_one_input).index(0)])
tmp = [0] * len(input_ids_per_one_input[list(input_ids_per_one_input).index(0):])
doc_type_input_ids.append(marking+tmp)
tokenizer_tmp_input['doc_type_ids'] = doc_type_input_ids
return tokenizer_tmp_input
5. data_collator.py - doc_type embedding 관련 부분
그냥 data_collator를 사용할 시, doc_type_ids로 인해 batch마다 padding이 안 됩니다! 그래서 아래와 같은 코드를 추가하여 pad가 되도록 조정했습니다.
doc_type_ids = [feature["doc_type_ids"] for feature in features] if "doc_type_ids" in features[0].keys() else None
if doc_type_ids is not None:
max_label_length = max(len(l) for l in doc_type_ids)
padding_side = self.tokenizer.padding_side
for feature in features:
remainder = [0] * (max_label_length - len(feature["doc_type_ids"]))
if isinstance(feature["doc_type_ids"], list):
feature["doc_type_ids"] = (
feature["doc_type_ids"] + remainder if padding_side == "right" else remainder + feature["doc_type_ids"]
)
elif padding_side == "right":
feature["doc_type_ids"] = np.concatenate([feature["doc_type_ids"], remainder]).astype(np.int64)
else:
feature["doc_type_ids"] = np.concatenate([remainder, feature["doc_type_ids"]]).astype(np.int64)
6. train.py - BigBirdBart model 적용 부분
BigBirdBart Model을 쓰면 if문에 들어가 아래와 같이 각각 config을 불러와 줍니다.
BigBird encoder와 Bart decoder 연결하기!
1. 개요
doc_type_ids를 추가하여 수정된 BigBirdModel class와 Bartdecoder class를 EncoderDecoderModel class로 encoder-decoder 모델을 만듭니다.
2. Model 흐름
3. modeling_kobigbird_bart.py 구조
BigBirdConfigWithDoctype class
기존 BigBirdConfig를 상속받아 doc_type_size를 추가한 class입니다.
BartConfigWithDoctype class
기존 BartConfig를 상속받아 doc_type_size를 추가한 class입니다.
BigBirdEmbeddingsWithDoctype class
기존 BigBirdEmbeddings class를 상속받아 기존에 word_embedding, token_type_embedding, position embedding을 이용하여 embedding을 구성한 것에 doc_type_embeddings을 추가한 class입니다.
BigBirdModelWithDoctype class
기존 BigBirdPreTrainedModel class를 상속받아 BigBirdEmbeddings class 말고, BigBirdEmbeddingsWithDoctype class를 이용하기 위해 사용된 class입니다.
그리고 추가로 doc_type_ids를 추가해 사용합니다.
BartDecoderWithDoctype class
기존 BartDecoder class에 doc_type_embedding을 추가하기 위한 class입니다.
EncoderDecoderModel class
기존 EncoderDecoderModel class를 응용한 class입니다. 저희 BigBirdModelWithDoctype encoder class와 BartDecoderWithDoctype class를 받기 위해서 수정했습니다.
4. processor.py - doc_type embedding 관련 부분
input_ids의 크기와 맞게, doc_type_ids을 넣고 나머지 부분은 pad_id를 추가적으로 붙입니다.
5. data_collator.py - doc_type embedding 관련 부분
그냥 data_collator를 사용할 시, doc_type_ids로 인해 batch마다 padding이 안 됩니다! 그래서 아래와 같은 코드를 추가하여 pad가 되도록 조정했습니다.
6. train.py - BigBirdBart model 적용 부분
BigBirdBart Model을 쓰면 if문에 들어가 아래와 같이 각각 config을 불러와 줍니다.
BigBirdBart Model을 쓰면, 아래와 같이 config를 이용해 weight가 있는 모델을 각각 불러옵니다.
7. predict.py - BigBirdBart model 적용 부분
train.py를 통해 학습한 BigBirdBart model을 불러옵니다.
8. Argument 추가 부분
ModelArguments
kobigbird encoder와 bart decoder를 이용할 껀지에 대한 여부를 결정하는 args입니다.
DataTrainingArguments
tokenizer에 input이 들어갈 시, input_ids, attention_mask, token_type_ids만 나옵니다. 거기에 doc_type_ids를 쓰기 위해서, 따로 만들어 줄껀지에 대한 여부를 알려주는 args입니다.
9. Shell script example
Written by 기성, 유석
The text was updated successfully, but these errors were encountered: