02 AI를 읽는 수학·통계·8 min read

코사인 유사도는 무엇을 비교할까?AI가 벡터의 방향으로 비슷함을 계산하는 방법

코사인 유사도는 숫자로 표현한 두 대상의 방향이 얼마나 비슷한지 계산합니다. 화살표와 간단한 취향 예시로 각도와 점수의 관계, 내적을 길이로 나누는 이유, 문서 검색에서의 쓰임을 설명합니다. 점수 0.8이 정답 확률 80%가 아닌 이유와 영벡터·기준값 해석의 주의점도 정리합니다.

어두운 서재 책상 위 투명한 원형 황동 각도 장치에서 파란색과 보라색 지침의 방향 차이를 살펴보는 편집형 이미지
코사인 유사도는 벡터 끝점 사이의 거리 대신 두 벡터가 향하는 방향을 비교합니다. · DECHIVE

안녕하세요, DECHIVE입니다.

AI가 질문과 비슷한 문서를 찾았다고 할 때, ‘코사인 유사도’라는 말이 등장하곤 합니다. 이름은 어렵지만 처음 떠올릴 그림은 간단합니다.

같은 출발점에서 뻗어나가는 화살표 두 개입니다.

하나는 짧고 하나는 길어도 같은 방향을 향할 수 있습니다. 반대로 길이가 같아도 전혀 다른 방향을 향할 수 있습니다. 코사인 유사도는 이 중에서 방향의 차이에 주목합니다.

한 문장으로 먼저 정리하면

코사인 유사도는 같은 차원의, 0이 아닌 두 실수 벡터 사이의 각도에 코사인을 적용해, 방향이 얼마나 비슷한지 나타내는 값입니다. 내적을 두 벡터 길이의 곱으로 나누어 계산합니다.

값은 -1부터 1 사이입니다. 1이면 같은 방향, 0이면 직각, -1이면 정반대 방향입니다.

다만 이것은 먼저 숫자 공간에서의 관계입니다. 문장의 의미가 같은지, 검색 결과가 정답인지까지 자동으로 보증하지는 않습니다.

화살표의 길이와 방향은 다른 정보입니다

두 사람이 책과 영화에 쓴 가상의 관심 점수를 비교한다고 하겠습니다. 숫자의 순서는 [책, 영화]입니다.

  • A: [1, 2]
  • B: [2, 4]
  • C: [2, 1]

A와 B는 점수의 크기가 다릅니다. 하지만 책과 영화에 대한 비율은 모두 1:2입니다. 원점에서 화살표를 그리면 같은 방향을 향합니다.

A와 C는 두 값의 비율이 다릅니다. A는 영화 쪽 값이 더 크고, C는 책 쪽 값이 더 큽니다.

코사인 유사도는 A와 B에 1을, A와 C에는 0.8을 줍니다. 이 수치는 DECHIVE의 가상 벡터를 직접 계산한 예시입니다. 실제 사람의 취향이나 모델의 임베딩을 측정한 결과가 아닙니다.

여기서 배울 점은 ‘취향이 80% 같다’가 아닙니다. 길이가 달라도 방향이 같을 수 있고, 코사인 유사도는 그 방향을 비교한다는 것입니다.

왜 내적을 길이로 나눌까요?

두 벡터의 내적은 같은 자리의 값을 곱해 모두 더하는 계산입니다.

A와 B의 내적은 다음과 같습니다.

1×2 + 2×4 = 10

B를 두 배 늘려 [4, 8]로 만들면 내적은 20이 됩니다. 방향은 그대로인데 점수는 커집니다.

코사인 유사도는 이런 길이의 영향을 나누어 제거합니다.

코사인 유사도 = 내적 ÷ (첫 벡터의 길이 × 둘째 벡터의 길이)

A의 길이는 √5, B의 길이는 √20입니다. 따라서 10 ÷ (√5 × √20) = 1입니다. B를 양의 배수로 늘려도 방향이 그대로라면 코사인 유사도는 바뀌지 않습니다.[1]

수식을 외우기보다 내적에는 크기의 영향이 함께 들어가므로, 방향을 비교하려고 길이로 나눈다고 이해하면 됩니다.

각도가 달라지면 점수도 달라집니다

각도에 따른 코사인 유사도
두 벡터 사이의 각도코사인 유사도수학적 의미
0도1같은 방향
60도0.50도보다 방향 차이가 큼
90도0서로 직각
180도-1정반대 방향

숫자는 각도에 비례해서 일정하게 줄어들지 않습니다. 60도가 180도의 3분의 1이라고 해서 점수를 같은 비율로 해석할 수는 없습니다.

또한 0이 ‘내용상 아무 관련이 없다’, -1이 ‘반대 주장을 한다’는 뜻은 아닙니다. 그런 해석이 가능한지는 벡터를 만든 방식과 업무의 맥락을 따로 살펴야 합니다.

기준 벡터와 0도·60도·90도·180도를 이루는 단위 벡터를 원 위에 나타내고 코사인 유사도가 각각 1·0.5·0·마이너스 1임을 비교하는 도식
같은 방향은 1, 직각은 0, 정반대 방향은 -1입니다. 이해를 돕기 위해 길이를 1로 맞춘 2차원 벡터를 사용한 DECHIVE의 수학 예시입니다. · DECHIVE

문서 검색에서는 어떻게 사용할까요?

문서의 숫자 표현과 질문의 숫자 표현을 비교해 후보 문서의 순서를 정하는 데 사용할 수 있습니다. 전통적인 정보 검색에서는 단어의 가중치로 만든 벡터를, 의미 검색에서는 모델이 만든 임베딩을 비교할 수 있습니다.[2][3]

예를 들어 ‘비밀번호를 잊었어요’라는 질문과 ‘계정 비밀번호 재설정 방법’이라는 문서를 생각해 보겠습니다. 표현이 완전히 같지 않아도, 의미 관계를 잘 표현하도록 학습된 모델이라면 관련 후보로 찾는 데 도움이 될 수 있습니다.

하지만 코사인 공식 자체가 단어의 뜻을 이해하는 것은 아닙니다. 어떤 정보를 벡터에 담았는지가 먼저 중요합니다. 같은 계산식도 벡터 표현이 달라지면 다른 결과를 냅니다.

질문과 문서의 벡터는 서로 비교하도록 설계된 모델·설정을 사용해야 합니다. 서로 다른 모델이 만든 벡터를 길이가 같다는 이유만으로 비교하면, 점수의 의미를 보장하기 어렵습니다.

문서 길이가 달라도 항상 괜찮을까요?

정보 검색에서 길이 정규화는 긴 문서가 단어 수만 많다는 이유로 유리해지는 영향을 줄이는 데 쓰입니다.[2]

그렇다고 문서를 길게 늘려도 언제나 같은 점수가 나온다는 뜻은 아닙니다.

벡터를 단순히 양의 배수로 늘리는 것과 실제 문서에 문장을 추가하는 것은 다른 작업입니다. 내용이 추가되면 표현의 방향 자체가 바뀔 수 있고, 모델의 입력 길이 제한이나 문서 분할 방식도 영향을 줄 수 있습니다.

벡터 길이의 영향을 제거한다는 말과, 원문 길이의 영향을 모두 없앤다는 말은 구분해야 합니다.

정규화된 내적과는 어떤 관계일까요?

0이 아닌 각 벡터를 자기 길이로 나누면 길이가 1이 됩니다. 이를 L2 정규화라고 합니다.

두 벡터를 모두 이렇게 정규화한 뒤 내적을 계산하면 코사인 유사도와 같습니다. scikit-learn 공식 문서도 코사인 유사도를 정규화된 내적으로 설명합니다.[1]

이미 정규화된 임베딩이라면 내적으로 같은 점수를 얻을 수 있습니다. 다만 내적을 사용한다는 설명만 보고 정규화 여부까지 추정해서는 안 됩니다. 모델과 저장·검색 과정의 조건을 확인해야 합니다.

점수 0.8이면 정답 확률이 80%일까요?

아닙니다. 코사인 유사도는 각도에서 나온 비교 값입니다. 정답 여부에 대한 확률로 정의된 값이 아닙니다.

또한 ‘0.8 이상이면 관련 문서’처럼 모든 모델과 업무에 공통으로 적용할 기준도 없습니다. 모델, 자료의 종류, 질문, 전처리, 비교 후보가 달라지면 점수를 해석할 조건이 달라집니다.

실무에서는 실제 질문과 자료로 시험해야 합니다. 관련 문서를 놓치는 경우와 관계없는 문서를 가져오는 경우를 함께 보며 기준을 정해야 합니다.

가장 높은 점수를 가진 문서도 정답이 아닐 수 있습니다. 후보 전부가 질문과 무관해도 그중 1등은 존재하기 때문입니다.

유사한 내용과 검증된 근거는 다릅니다

같은 환불 규정을 다루는 문서라도 하나는 작년 기준이고 다른 하나는 올해 기준일 수 있습니다. 주제가 비슷하다고 적용 시점까지 같은 것은 아닙니다.

문서에 질문과 관련된 단어가 많이 나와도, 필요한 조건이나 예외가 빠져 있을 수 있습니다.

따라서 유사도로 후보를 찾은 다음에는 원문을 열어 날짜·대상·조건을 확인해야 합니다. 관련 자료를 찾는 단계와, 그 자료가 실제 주장을 뒷받침하는지 확인하는 단계는 이어지지만 서로 다릅니다.

0벡터와 코사인 거리는 주의해서 읽어야 합니다

모든 값이 0인 벡터는 길이도 0입니다. 따라서 위 공식에서는 분모가 0이 되어 코사인 유사도를 정의할 수 없습니다.

라이브러리가 이런 입력에 편의상 값을 반환할 수는 있습니다. 예를 들어 scikit-learn의 공식 예시에서는 0벡터와의 비교에 0이 반환됩니다.[1] 이를 수학적으로 ‘직각 방향’이 확인됐다는 뜻으로 해석하면 안 됩니다. 데이터가 비어 있거나 전처리에서 문제가 생겼는지 확인해야 합니다.

또한 코사인 거리라는 이름도 만날 수 있습니다. SciPy는 이를 1 − 코사인 유사도로 정의합니다.[4] 이 정의에서는 유사도가 클수록 거리는 작아집니다. 이름이 비슷해도 점수를 정렬하는 방향을 확인해야 합니다.

흔한 오해

“코사인 유사도 1이면 같은 문장이다.” 같은 방향의 벡터라는 뜻입니다. 원문이 동일하거나 모든 정보가 같다는 보장은 아닙니다.

“값은 항상 0부터 1 사이다.” 0이 아닌 실수 벡터에서는 -1부터 1 사이입니다. 다만 좌표가 모두 0 이상인 표현에서는 음수가 나오지 않습니다.

“벡터가 길수록 코사인 유사도가 높다.” 양의 배수로 길이만 바뀌면 점수는 같습니다. 방향의 차이를 비교하기 때문입니다.

“문장을 두 배 늘려도 점수는 같다.” 원문을 바꾸면 벡터의 방향도 달라질 수 있습니다. 벡터의 배수 조정과 문서 편집은 다릅니다.

“상위 문서만 가져오면 사실 확인은 끝난다.” 후보 순위와 사실의 검증은 다릅니다. 원문의 조건과 실제 주장을 대조해야 합니다.

그래서 무엇을 기억해야 할까요?

코사인 유사도는 벡터의 길이보다 방향에 집중하는 비교 방법입니다. 문서와 질문을 숫자로 표현한 뒤 관련 후보를 찾는 데 활용할 수 있습니다.

하지만 점수는 벡터 표현과 모델, 입력 조건에 기대어 의미를 갖습니다. 높은 값이 원문의 동일성이나 정답 확률, 근거의 충분함을 보증하지는 않습니다.

코사인 유사도는 어디를 먼저 살펴볼지 도와주는 점수입니다. 무엇을 믿어야 할지까지 대신 결정해주지는 않습니다.

어떤 모델과 자료에서 계산한 점수인지 확인하고, 찾은 원문이 실제 질문에 답하는지 다시 읽어야 합니다. 비교 계산과 검증의 역할을 구분할 때 이 숫자를 더 유용하게 사용할 수 있습니다.

확인한 자료

  1. scikit-learn — cosine_similarity: 정규화된 내적 정의, L2 정규화 관계, 0벡터 입력 예시 확인.
  2. Manning, Raghavan & Schütze — Introduction to Information Retrieval: Dot products: 문서 길이 정규화와 코사인 비교 설명 확인.
  3. Sentence Transformers — Semantic Textual Similarity: 문장 임베딩과 유사도 계산 사용 방식 확인.
  4. SciPy — scipy.spatial.distance.cosine: 코사인 거리의 정의 확인.

KEYWORDS

  • 코사인 유사도
  • Cosine Similarity
  • 벡터
  • 내적
  • 정규화
  • 임베딩
  • 의미 검색
  • 코사인 거리
← Knowledge 목록