retrieval_output_dir : '../retrieval_output' 이 default 로 설정되어있음 encoder 모델을 저장하는 경로
retrieval_run_name : 'bert-base' 이 default 로 설정되어 있음
per_device_retrieval_train_batch_size : 16 으로 설정
per_device_retrieval_eval_batch_size : 똑같이 16으로 설정 in-batch 방법에서는 loss 를 맞추기 위해서는 배치가 같아야 한다고 생각함
retrieval_model_name_or_path : 'klue/bert-base' 이 default 로 설정되어 있음 구현된 방법에서는 bert-base 가 가장 성능이 좋았음
use_trained_model : encoder 를 fine-tuning 해서 저장한 모델을 쓸지 말지를 선택하는 argument 로 default 가 True 로 되어있음 inference 시에는 True 가 기본으로 되어있어야하고 retrieval 모델을 train 할 시에는 False 로 바꿔줄 것
eval_retrieval : 기존에는 True 로 되어있었는데 이걸 string 으로 바꿔서 sparse or dense or both 로 사용하면 어떨까 싶어서 바꿈
top_k_retrieval : default 를 30으로 고정
retrieval_encoder.py
custom encoder 클래스 만들어진 파일
저장하는 방법과 불러오는 방법이 헷갈려서 시간을 많이 뺏겼지만 이제 좀 알것같음
AutoModel.from_pretrained() 해서 불러오는 모델을 train 해주고 save_pretrained() 해주는 데
RetrievalEncoder.encoder.save_pretrained() 해주면 우리가 불러오는 부분만 저장되는 것 같음
여기서 갑자기 의문이 드는데 저기에 nn.linear() 이런 선형변환을 하나 추가해주면 쟤만 부르면 또 안되겠다는 생각이들어서....
어찌해야 갑자기 생각이 드네요....
dense_retriaval.py
DenseRetrieval 이라는 클래스 선언된 파일
get_dense_embedding() : encoder 를 학습해서 미리 wiki data 를 vector 화 시켜놓는 작업
get_dataloader() : Question & Context 에 대한 tokenizing 및 DataLoader 로 바꿔줌
retrieve() : sparse 쪽 retrieve 함수와 바뀐게 없음
get_relevant_doc() : question 1 개에 대해서 wiki 전체에서 가장 관련있는 context 찾는 함수
get_relevant_doc_bulk() : question 여러개에 대해서 wiki 전체에서 가장 관련있는 context 찾는 함수
get_encoders() : retrieval 에 사용되는 p_encoder, q_encoder, tokenizer 선언하고 리턴해주는 함수
retrieval_train.py
scrach 로 retrieval train 하는 함수 구현해놓음
epoch 마다 validation score 계산하게 되어있음
custom encoder 클래스 만들어진 파일 저장하는 방법과 불러오는 방법이 헷갈려서 시간을 많이 뺏겼지만 이제 좀 알것같음 AutoModel.from_pretrained() 해서 불러오는 모델을 train 해주고 save_pretrained() 해주는 데 RetrievalEncoder.encoder.save_pretrained() 해주면 우리가 불러오는 부분만 저장되는 것 같음
여기서 갑자기 의문이 드는데 저기에 nn.linear() 이런 선형변환을 하나 추가해주면 쟤만 부르면 또 안되겠다는 생각이들어서.... 어찌해야 갑자기 생각이 드네요....
DenseRetrieval 이라는 클래스 선언된 파일
scrach 로 retrieval train 하는 함수 구현해놓음 epoch 마다 validation score 계산하게 되어있음
이런식으로 인자 주어지면 모델이 저장되는 위치는 "./retrival_output/roberta-small" 여기에 p_encoder, q_encoder 나눠서 저장됨
train_dataset 에 들어있는 train, validation 데이터를 모두 사용해서 retrieval 모델들이 얼마나 wiki 에서 정확한 문장을 잘 뽑아오는지 테스트하는 파일
k = 1, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100] 에 대해서 test 해줌
train 에서의 retrieval_run_name 과 retrieval_model_name_or_path 를 맞춰주면 학습했던 모델을 사용할 수 있음