boostcampaitech2 / mrc-level2-nlp-04

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

Dense Passage Retrieval 구현하기(진행중) #8

Open whatchang opened 2 years ago

whatchang commented 2 years ago

작업 시작일

2021.10.18

작업순서

3.5에서 학습을 시켰음에도 불구하고 top-k개의 paasage의 내용이 이상한 것만 가져오고 가져온 passage id도 똑같은 것만 가져온다. 해당 문제를 몇일 동안 해결하지 못해서 이것은 폐기하기 희락님 코드를 사용할 것 같습니다.

정리

1. MRC 5강 내용 및 구현할 것들 정리하기

DPR

Sparse Passage Retrieval보다 차원의 크기가 작음 -> SPR은 vacabulary size이지만 DPR은 model embedding size이기 때문이다.

DPR 동작 과정

  1. Query embedding을 수행하는 모델(Dense encoder)에 question sequence를 넣어주며 embedding 값이 나온다. -> Wq(CLS token)
  2. DB에 있는 각 passage를 input으로 넣어서 각 passage에 따른 embedding을 구해준다. -> Wp(CLS token)
  3. 위에서 구한 Wq와 Wp를 doc product를 해준다. 이때 Wp가 여러개일 수 있고 그러면 doc product의 값이 여러개 나올 것이다.
  4. Doc product의 결과를 내림차순으로 하여 top - n개를 선택하고 이것을 MRC의 input으로 넣어준다.

DPR을 하기 위해서 구현해야 하는 요소

2. 참고 자료 수집 및 분석하기(5강 실습코드, 스페셜 미션 3~4번, 구글링 자료)

5강 실습 코드

  1. Encoder 클래스

    스크린샷 2021-10-18 오후 10 01 37

    위의 부분과 같이 구현하면 될 것 같다. 그러나 huggingface의 Trainer 사용시 위의 커스텀모델의 forward의 부분을 수정해야 될 것 같다. 이유 : 아마도 Trainer 클래스 사용시 train에 맞는 output을 forward에서 출력해야 되지 않을까 싶다(형식 : loss, logits, hidden states, attentions).
    그래서 이 부분은 huggingface의 Trainer 사용유무에 따라서 조금의 차이가 있을 것 같다.

Trainer 사용 : forward의 output을 Trainer에 맞게 해야 됨. + loss 구하는 부분도 forward에 포함시켜야 된다. Trainer 사용 X : 커스텀 train 함수를 구현해야 된다.

train loss 구현

  1. 모델을 통한 output 얻어오기(Wq, Wp)
  2. Wq 와 Wp를 doc production 해준다. == 유사도 구하는 과정
  3. 2에서 얻은 값에 log_softmax를 취해준다.
  4. 3에서 얻은 결과에 negative log likelihoode loss를 적용시켜준다. => 이때 강의 설명에서는 대각 원소를 구해주고 이것을 nll에 2번째 인자로 넣어주는데 음... 왜 그렇게 하는지 잘 이해가 안된다. <- 이 부분은 추가적으로 공부해서 이해하기

loss 구하는 과정

스크린샷 2021-10-18 오후 10 33 00

스페셜 미션 3번

Negative sampling 과정

스페셜 미션에서 아래의 과정을 수행하면 baseline에 적용할 수 있는 DPR을 만들 수 있을 것 같다.

먼저 베이스라인 코드에 적용해보고 그 다음에 코드를 이해하는 걸로 해야겠다.

3. 베이스라인 코드에 적용

문제 발생 : gpu out memory 발생하여 device를 cpu로 하여 돌렸다. 해결 : encoder모델을 거쳐서 나온 embedding 값에 계산 그래프를 분리하고 cpu 주소로 복사하여 append를 하니까 잘 동작하였다. -> 희락님이 detach().cpu().numpy() 방법을 알려줬음

문제 : 아래와 같이 question embedding과 passage_embedding의 doc product의 결과가 매번 다르게 나오지만 정렬시 순서는 항상 같다. 그래서 question이 다른데도 항상 동일한 passage만 return하고 있다. 스크린샷 2021-10-21 오후 3 22 50

스크린샷 2021-10-21 오후 3 26 31

문제를 해결하기 위해서 살펴볼 것들

  1. test의 question과 wiki의 passage를 사용하는게 아니라 train/valid만 사용해서 잘 나오는지 확인해보기
    • 이때 train으로 encoder를 학습시키고 valid로 평가해보기 평가를 위한 metric도 정의하기
  2. wiki의 passage embedding하는 부분 살펴보기
  3. wiki의 passage embedding 저장 결과 load해서 확인해보기
  4. test의 question embedding시에 올바르게 코딩한 것인지 확인해보기
  5. 그래도 해결 안되면 멘토님에게 질문드리기

4. 결과 정리