# '21. 10. 20 NLP 10조 피어세션 정리'
## Dense Retriever 구현 시도
### **Challenge**
1. 5강 실습에 올라와있는 Passage(Query) Encoding Model은 **"bert-base-multilingual-cased"** 이고, 다른 모델로 바꿔보고 싶었지만 실패함
- **BertModel**은 `BaseModelOutputWithPoolingAndCrossAttentions` type을 반환하는데, 그 중 `pooler_output`을 우리가 학습에 사용한다.
- 그러나 **KLUE/RoBERTa**는 output format이 BERT Model과 다르기 때문에 pooler layer를 따로 구현해주고 학습해줘야 한다.
- 성능에 상관없이 일단 Dense Retriever를 구현하는 것이 1차적 목표기 때문에 모델을 바꾸는 것은 나중에 따로 하도록 한다.
2. Batch size의 문제
- 전처리를 완료한 Dataset의 크기는 3952기 때문에 batch size를 3952의 약수로 해주어야 한다.
- `batch_size = 4` 의 경우 OOM 문제가 발생하며, `batch_size = 3`의 경우 3952의 약수가 아니기 때문에 input vector를 reshape 하는 과정에서 문제가 생긴다. 따라서 `batch_size = 2`로 하여 실험 중
- Dataset의 크기와 상관없이 general하게 batch_size를 조정할 수 있는 방법을 생각해봐야 할듯
3. dataset의 문제
- `wikipedia_document.json` 파일에는 약 5만 개의 unique document가 존재하지만, document encoder는 약 3천 개의 document밖에 학습하지 못했다. 이것 만으로 5만 개의 document 중에서 제대로 된 document를 뽑아낼 수 있을지 의문 :(
### To Be Done
1. `faiss` library를 사용하기 위해 embedding vector를 clustering할 때, Silhouette analysis를 통해 적절한 cluster 개수 k를 찾기 위한 연구
2. wikipedia document가 복수 개의 passage로 구분되어 있는데, 하나의 passage나 sentence로만 구성되도록 한 후에 sentence-level로 retrieve 도전
3. pooler layer를 구현하여 BERT 모델 외에 다양한 모델로 실험할 수 있도록 연구
## WandB에 EM 스코어 기록되게 변경
기존 wandb sweep에는 train loss가 최종 비교군으로 되어있었지만 이것보다는 Exact match로 비교하는 것이 좋다고 판단하여 train과 eval이 분리되어 있는 코드를 하나로 합치는 작업을 함
train이 끝나고 바로 eval이 진행되어 validation set에 대한 exact match와 f1 score를 기록할 수 있게 되었음
## BERT + GRU 모델에서 GRU를 Dense Layer로 변경
BERT 출력에 bidirectional GRU를 2 layer 쌓아야 하는데 **"dense layer로도 가능하지 않을까?"** 라고 생각하게 되어 linear를 먼저 올려보고 추후에 GRU 올려볼 생각