boostcampaitech2 / mrc-level2-nlp-04

mrc-level2-nlp-04 created by GitHub Classroom
4 stars 5 forks source link

MRC에 Bi-LSTM 추가 #13

Open sangmandu opened 2 years ago

sangmandu commented 2 years ago

MRC 모델을 수정하기 위해 다음을 고민했습니다.

  1. Customized Model Class 생성

    class ModelAttachedLSTM(RobertaForQuestionAnswering):
    def __init__(self, config):
        super().__init__(config)
    
        self.lstm = nn.LSTM(input_size=config.hidden_size,
                            hidden_size=config.hidden_size,
                            num_layers=2,
                            batch_first=False,
                            bidirectional=True,)
        self.qa_outputs = nn.Linear(config.hidden_size*2,
                                    config.num_labels,)
    • 새로운 모델 클래스를 생성합니다.
    • 지금은 로버타forQA 모델을 상속합니다.
    • 이는 transformer가 모델들을 downstream task 모델로 변형하는 방식 때문에 이렇게 바로 로버타를 불러왔는데, 추후에는 입력받은 model_name에 따라 수정해야 할 수도 있습니다.
    • lstm은 2층으로 쌓았고, qa_outputs은 2*hidden size를 입력받아 2개의 output을 내뱉는 선형 레이어입니다.
  2. Attach

    def forward():
        outputs = self.roberta(
                    input_ids,
                    attention_mask=attention_mask,
                    token_type_ids=token_type_ids,
                    position_ids=position_ids,
                    head_mask=head_mask,
                    inputs_embeds=inputs_embeds,
                    output_attentions=output_attentions,
                    output_hidden_states=output_hidden_states,
                    return_dict=return_dict,
                )
    
                sequence_output = outputs[0]  ### (1) 
                hidden, (last_hidden, last_cell) = self.lstm(sequence_output)
                logits = self.qa_outputs(hidden)
    • roberta의 outputs을 얻고 차원을 하나 줄여줍니다. [[data]] 형태로 되어있어서 [data] 형태로 바꾸는 과정이다.
    • 이중 hidden 차원을 사용해 16 384 768 의 크기를 qa_outputs에 입력해서 logits을 얻는다.
  3. 결과 분석 image

    • 성능이 매우 안나옵니다. 아무래도 이번 대회에서는 사용을 해도 큰 성능 발전이 없을 것 같습니다. 적어도 몇십점대는 나와야 이후에 bi-direction attention 모델이나 qanet을 적용하려고 했는데 그러지 못하겠습니다.
    • 근데 이 부분은, 비판적으로 받아들여주세요. 추후에 성능이 잘 나온팀은 이 테크닉을 써서 성능이 올라올 수도 있으니까요.
    • 1) 너무 성능이 안나오는 점 2) 추후에 붙이는 additional layer들은 매우 복잡해서 많은 시간을 할애해야 한다는 점 3) 현재 로버타만을 돌려 얻은 valid 점수가 실제 벤치마크 점수와 매우 유사한점(MRC만 가정)을 보아, 제 판단에는 Addition model 실험을 더 가져가지 않는 것으로 결정했습니다.
  4. 피드백 적용 후 결과 분석

    self.roberta = AutoModel.from_pretrained("klue/roberta-small")

    본 roberta가 성능을 못 내는 이유는 사전학습이 되어있지 않기 때문이라는 피드백을 받고 이를 수정했습니다. 결과는 기존 모델 자체보다는 성능이 낮게 나왔지만, 그에 엇도는 성능이 나왔기 때문에 더욱더 발전된 additional layer를 추가할 수 있는 가능성을 보였습니다.

image

앞으로의 방향

읽어볼만한 논문

BERTNet을 읽어보니 Robert-Large가 가장 성능이 좋아서, additional layer가 큰 의미가 없는 것으로 느껴진다