본문 바로가기
Community/OSSCA

임베딩 벡터 간 유사도에 대한 오해

by mjk0618 2023. 7. 29.

개인 프로젝트를 진행하다가 LLM의 답변에 대한 정량적인 평가 지표 개발의 필요성을 느끼고 모델의 특징을 고려한 평가 지표를 만들어보려고 했습니다. 프로젝트 주제를 간단히 소개하면, 입력된 법률 분쟁 상황에 대한 조언을 하는 파인튜닝을 수행한 LLM입니다.

 

LLM 파인튜닝에 사용하는 학습 데이터는 다음과 같이 법적 상황에 대한 QA 형식으로 이루어져 있습니다.

 

질문: 남편이 가출하여 연락이 되지 않다가 3년 6개월 뒤 ‘실종자 찾아주기’ 운동의 일환으로 DNA검사를 했더니 남편은 3년 전에 이미 교통사고로 사망하였고, 신원미상자로 처리되었다고 합니다. 가출 전 남편이 들어놓은 사망보험금을 청구했더니 보험회사는 사망 후 3년이 경과하였기 때문에 소멸시효 완성을 주장하고 있습니다. 보험금은 못 받는건가요?

답변: 보험금청구권의 소멸시효는 특별한 다른 사정이 없는 한 보험사고가 발생한 때부터 진행하는 것이 원칙입니다. 그러나 객관적으로 보험사고가 발생한 사실을 확인할 수 없는 사정이 있는 경우에는 보험금청구권자가 보험사고의 발생을 알았거나 알 수 있었던 때부터 보험금청구권의 소멸시효가 진행합니다. 따라서 사례의 경우에는 보험금 청구가 가능합니다.

 

LLM 답변의 품질을 평가하려는 방식은 다음과 같이 진행하려고 하였습니다. 

먼저, 벡터 표현 간의 코사인 유사도는 문맥 유사도를 정량화할 수 있다는 것을 전제하였습니다.

 

1. 먼저 validation data의 답변 원본을 dense embedding으로 변환합니다.

2. validation data의 질문에 대한 LLM 출력을 dense embedding으로 변환합니다.

3. 위에서 변환한 두 벡터간의 코사인 유사도를 비교합니다.

4. 모델이나 데이터에 변경점이 있을 때마다, 이 방식을 사용하면 모델의 성능 변화를 확인할 수 있습니다.

 

이 평가 지표 설계에 논리적 결함이 없는지를 논하기 전에 먼저 현재까지 설명한 부분 중 평가 지표 자체가 갖는 한계에 대해서 설명해보겠습니다. 먼저 위에서 언급했듯, 이 평가 지표는 모델 성능의 변화만을 확인할 수 있을 뿐, 점수 자체가 갖는 절대적인 의미를 부여하기 어렵습니다. 그래서 새로운 방식을 고안하였습니다. Paraphrase 모델을 사용하여 validation data의 답변 원본을 한 차례 paraphrase하고, 그것에 대한 dense embedding을 원본 답변의 벡터와 비교합니다. 그리고 이 점수를 모델 답변이 가질 수 있는 점수의 최댓값이라고 생각합니다. 이렇게 하면, 유사도 자체에 대해서도 어느정도 의미를 부여할 수 있다고 생각했습니다.

 

문제는 실제로 벡터간의 코사인 유사도를 계산한 결과를 분석할 때 생겼습니다. 먼저 현 상황에서 사용할 수 있는 임베딩 중, 가장 방대한 정보를 이해하고 있을 것이라고 생각하는 OpenAI Embedding을 사용하여 텍스트를 Dense Embedding으로 변환하였습니다. 법률 질의에 대한 코사인 유사도를 구하기 전에, 코사인 유사도 점수가 문맥의 유사성을 잘 비교하는지 테스트하기 위하여 다음과 같은 문장을 비교해보았습니다.

 

sentence1 = "나는 독서를 좋아합니다."
sentence2 = "나는 책 읽는 것을 좋아합니다."
sentence3 = "나는 독서를 싫어합니다."

cosine_similarity(sentence1, sentence2) = 0.94 ...
cosine_similarity(sentence1, sentence3) = 0.96 ...

 

문제는 간단한 예시에서 알 수 있듯이 기대한 대로 문장이 담는 의미가 제대로 비교되고 있지 않았습니다. 원본 문장의 의미가 잘 담긴다면, 좋다와 싫다의 의미가 다름을 파악하여 유사도가 위와는 전혀 다른 결과가 나와야 한다고 생각했습니다. 그런데, 문장 구조가 유사하다는 것이 이유인지 오히려 더 높계 코사인 유사도가 계산되었습니다. 만약 문맥이 아닌 문장 구조가 유사도에 영향을 미친다면, sparse embedding을 사용하는 것과 큰 차이가 없게 되고 이 경우 동의어를 고려하지 않는 다는 문제점 때문에 일부러 dense embedding을 선택한 이유도 없어져버립니다. 그래서 이 지표 설계에 논리적 오류가 있는지 OSSCA의 HuggingFace 한글화 팀원들에게 질문을 하고 논의해보았습니다.

 

그리고 다음과 같이 새로운 지식을 알 수 있었습니다. 먼저, 코사인 유사도와 같은 유사도 알고리즘이 사람이 인식과는 동떨어진 부분이 많다는 것입니다. 그리고 일반적으로 제가 의도한 대로 문장간의 의미를 비교하려면, sentence transformer 계열의 모델을 contrastive learning 방식으로 파인튜닝하고, 그 모델을 사용하여 임베딩 벡터를 생성해야 한다는 것입니다.여러 멘토님들과 팀원 분들의 공통적인 조언을 참고하면 제가 갖고 있던 개념에 조금의 오류가 있던 것 같았고, 새롭게 개념을 정리할 수 있었습니다. 그리고 먼저 논의를 통해 새롭게 알게 된 개념에 대해서 조금 더 깊이 있게 이해한 후, 이를 바탕으로 임베딩 벡터를 새롭게 생성하고 유사도를 비교한다면 어떤 결과가 나타나는지 실제로 구현을 통해 확인해보려 합니다.

'Community > OSSCA' 카테고리의 다른 글

기술 문서 번역의 어려움  (0) 2023.07.22
2023 오픈소스 컨트리뷰션 아카데미 Review  (0) 2023.07.14

댓글