boostcampaitech2 / mrc-level2-nlp-04

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

negative - random k개로 DPR 학습시키기 #36

Open whatchang opened 2 years ago

whatchang commented 2 years ago

저번에 실패해던 내용

https://github.com/boostcampaitech2/mrc-level2-nlp-04/issues/8#issue-1029012251

요약 : negative in batch로 학습된 encoder를 가지고 question에 유사한 pasaage를 가져왔는데 똑같은 id의 passage를 가져오는 문제점이 있었고 이 passage의 내용도 question과 관련이 없었습니다.

작업순서

1. 개념 정리

gold보다 random방식이 negative-sampling을 위해서 context를 가져오는 source의 dataset이 더 큽니다. (현재 대회 데이터 상태일때 random방식은 wiki에서 가져오는 것이고 gold방식은 dataset의 train/validation에서 가져오는 방식입니다. 이때 train/validation의 context는 wiki에 포함됩니다.)

2. 코드 분석하기

✅ 희락님 코드

먼저 elasticsearch로 indexing 작업을 해주고 만들어진 index를 이용하여 주어진 question에 대해서 유사한 top-k개 만큼의 passage를 가져오는 것 같음

그래서 먼저 elasticsearch에서 사용할 index setting작업을 수행해주고 DPR negative sampling할때 ElasticSearchRetrieval 클래스의 retrieve 메소드를 이용하여 top-k개만큼의 유사한 negative sample을 추가하면 될 것 같다.

elasticsearch indexing작업시 알아서 preprocessing처리를 해주는 것 같다. <- preprocessing된 train pickle 파일이 없다면

✅ 스페셜 미션 3번

✅ AI stage 게시판 내용

https://stages.ai/competitions/77/discussion/talk/post/804

3. Elastricsearch로 가져온 random k개를 DPR 학습시키는 부분 적용하기

중요 : 최대한 기존 코드 재사용하기

✅ 기존의 gold 방식과 달라져야 하는 것들

  1. p_seqs <- negative sampling으로 수집된 데이터들을 tokenizer한 결과(input_ids, attention_mask, token_type_ids 등) + p_seqs의 shape 신경써서 바꾸기 -> 이후 dataset, dataloader 등의 과정은 기존과 동일

  2. 학습시 p_inputs의 input_ids, attention_mask, token_type_ids 등의 shape을 잘 바꾸기

  3. 학습시 p_outputs의 shape 잘 바꾸기 <- AI Stage 게시판 글 참고하기

✅ 손 봐야하는 곳

  1. Dense 클래스의 get_dataloader() 메소드 부분 <- 분기 해줘서 negative sampling시에는 다르게 처리해줘야 한다.

  2. retrieval_train.py의 train_retrieval 함수 <- nagative sampling 시에는 다르게 학습시켜줘야 한다(passage의 input과 output의 shape이 기존과 다르게 처리가 된다).

  3. elastic_search.py에서 retrieval 메소드가 top_k 만큼의 context를 join하여 가져온다. 하지만 학습을 위해서는 따로따로 가져와야 하므로 이 부분도 수정이 필요할 것 같다.

✅ 손 보고 있는 곳

AI stage 게시글을 보면서 train시 유사도를 구할때 shape를 주의해서 맞춰주고 있는중 < - 참고한 게시글

4. 결과 정리하기

학습에서의 validation에서 잘 학습되고 있는 것을 알 수 있었지만

스크린샷 2021-11-02 오전 10 44 53

top k개에 대한 testing을 했을때 성능이 매우 처참하였다.

스크린샷 2021-11-02 오전 10 45 48

뭔가 학습된 모델을 가져오지 않고 fine-tuning되지 않은 기본 pre-trained 모델로 testing된 것 같은 기분이 들지만 시간도 별로 없고 정확한 원인도 찾기 힘들 것 같아서 해당 작업은 여기서 마무리 할 것 같습니다.