negative-sampleing : 학습시 오답이 context를 sampling하는 것
random 방식 : 무작위로 negative-sampling을 합니다. 이때 뽑히는 source는 open corpus
gold 방식 : question에 대한 알맞은 passage가 주어진 corpus에서 뽑는 방식
in-batch : 주어진 batch만큼의 dataset의 corpus를 이용한 방식
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. Elastricsearch로 가져온 random k개를 DPR 학습시키는 부분 적용하기
중요 : 최대한 기존 코드 재사용하기
✅ 기존의 gold 방식과 달라져야 하는 것들
p_seqs <- negative sampling으로 수집된 데이터들을 tokenizer한 결과(input_ids, attention_mask, token_type_ids 등) + p_seqs의 shape 신경써서 바꾸기
-> 이후 dataset, dataloader 등의 과정은 기존과 동일
학습시 p_inputs의 input_ids, attention_mask, token_type_ids 등의 shape을 잘 바꾸기
학습시 p_outputs의 shape 잘 바꾸기 <- AI Stage 게시판 글 참고하기
✅ 손 봐야하는 곳
Dense 클래스의 get_dataloader() 메소드 부분 <- 분기 해줘서 negative sampling시에는 다르게 처리해줘야 한다.
retrieval_train.py의 train_retrieval 함수 <- nagative sampling 시에는 다르게 학습시켜줘야 한다(passage의 input과 output의 shape이 기존과 다르게 처리가 된다).
elastic_search.py에서 retrieval 메소드가 top_k 만큼의 context를 join하여 가져온다. 하지만 학습을 위해서는 따로따로 가져와야 하므로 이 부분도 수정이 필요할 것 같다.
✅ 손 보고 있는 곳
AI stage 게시글을 보면서 train시 유사도를 구할때 shape를 주의해서 맞춰주고 있는중 < - 참고한 게시글
4. 결과 정리하기
학습에서의 validation에서 잘 학습되고 있는 것을 알 수 있었지만
top k개에 대한 testing을 했을때 성능이 매우 처참하였다.
뭔가 학습된 모델을 가져오지 않고 fine-tuning되지 않은 기본 pre-trained 모델로 testing된 것 같은 기분이 들지만 시간도 별로 없고 정확한 원인도 찾기 힘들 것 같아서 해당 작업은 여기서 마무리 할 것 같습니다.
저번에 실패해던 내용
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 방식과 달라져야 하는 것들
p_seqs <- negative sampling으로 수집된 데이터들을 tokenizer한 결과(input_ids, attention_mask, token_type_ids 등) + p_seqs의 shape 신경써서 바꾸기 -> 이후 dataset, dataloader 등의 과정은 기존과 동일
학습시 p_inputs의 input_ids, attention_mask, token_type_ids 등의 shape을 잘 바꾸기
학습시 p_outputs의 shape 잘 바꾸기 <- AI Stage 게시판 글 참고하기
✅ 손 봐야하는 곳
Dense 클래스의 get_dataloader() 메소드 부분 <- 분기 해줘서 negative sampling시에는 다르게 처리해줘야 한다.
retrieval_train.py의 train_retrieval 함수 <- nagative sampling 시에는 다르게 학습시켜줘야 한다(passage의 input과 output의 shape이 기존과 다르게 처리가 된다).
elastic_search.py에서 retrieval 메소드가 top_k 만큼의 context를 join하여 가져온다. 하지만 학습을 위해서는 따로따로 가져와야 하므로 이 부분도 수정이 필요할 것 같다.
✅ 손 보고 있는 곳
AI stage 게시글을 보면서 train시 유사도를 구할때 shape를 주의해서 맞춰주고 있는중 < - 참고한 게시글
4. 결과 정리하기
학습에서의 validation에서 잘 학습되고 있는 것을 알 수 있었지만
top k개에 대한 testing을 했을때 성능이 매우 처참하였다.
뭔가 학습된 모델을 가져오지 않고 fine-tuning되지 않은 기본 pre-trained 모델로 testing된 것 같은 기분이 들지만 시간도 별로 없고 정확한 원인도 찾기 힘들 것 같아서 해당 작업은 여기서 마무리 할 것 같습니다.