boostcampaitech7 / level2-mrc-nlp-14

level2-mrc-nlp-14 created by GitHub Classroom
1 stars 1 forks source link

`<no_answer>`에 판단에 대한 로직 개선 및 args로 동작 여부 조정 가능하게 개선 #19

Closed jagaldol closed 1 month ago

jagaldol commented 1 month ago

Summary

기존 정답이 찾을 수 없음에 대한 로직을 개선하였으며 <no_answer> 출력 여부를 --use_no_answer로 설정 가능하게 개선하였습니다.

Description

로직 개선

하나의 데이터로 부터 최대길이 문제로 인해 여러개로 나눠진 context에 대한 처리가 기존 로직은 다음과 같습니다.

개선한 로직은 다음과 같습니다.

성능 평가

train.py를 사용하여 mrc에 대해서만 evaluation을 했을 때의 성능 비교입니다.

inference.py를 사용하여 전체 파이프라인에 대해 train_dataset 전체를 평가할 때의 결과입니다.

모델이 no_answer라고 판단을 내렸더라도 그다음으로 예측된 단어를 결과로 가져오는게 점수 측면에서는 당연하게도 도움이 됩니다. 따라서 --use_no_answer를 사용하면 score가 내려가게됩니다.

이외에 로직 개선 후 --use_no_answer에서의 성능 증가를 기대하였지만, 현재 데이터셋으로는 해당 edge case는 발생하지 않아 성능 변화를 확인 할 수 없었습니다.

--use_no_answer

잘못된 문서를 가져왔을 때의 MRC 모델의 예측 결과 분석을 하고 싶어 를 출력하게 하고 싶다면 아래와 같이 실행할 수 있습니다.

python train.py --output_dir ./outputs/train_dataset --model_name_or_path ./models/train_dataset/ --do_eval --use_no_answer

단순히 기존 명령어에 --use_no_answer를 붙이기만 하면 <no_answer> 모드로 동작하게됩니다.

Related Issue

Issue Number: #11

jagaldol commented 1 month ago

postprocess_qa_predictions 함수의 작동 과정을 완벽하게 숙지한건 아닌데

�수정하신 부분은, 모든 features에 대해 null prediction이 나와야 no answer를 최종 예측값으로 내보내는 것으로 이해했습니다.

일단 approve하고 나중에 시간될 때 더 자세히 확인해도 괜찮을까요?

로직 이해하신거 맞습니다.

만약 features가 2개 있고, 각 결과가 다음과 같습니다.

첫번째의 null: 100점
첫번째의 최고 pred: 95점
---
두번째의 null: 90점
두번째의 최고 pred: 80점

기존 로직은 위와 같은 상황에서 전부 features를 전부 합쳐 계산하기 때문에 min_null이 90점이 되고, max_pred는 95점이 되어 no_answer이 아닌 첫번째의 최고 pred를 최종예측으로 판단합니다.

개선한 로직은 위와 같은 상황에서 각각의 feature를 확인하기 때문에 첫번째에서 null이 우세함을 파악, 두번째에서도 null이 우세함을 파악하여 최종적으로 no_answer이라고 판단 내립니다.