PLDA와 Cosine Similarity 차이점

Sujin Koo·2026년 6월 7일

최근에 화자 분리 태스크를 보곤 했는데 음성 인식, 화자 인증, 얼굴 인식, 임베딩 검색 같은 분야를 보다 보면 자주 등장하는 비교 방식이 있습니다. 바로 Cosine SimilarityPLDA입니다.

둘 다 “두 벡터가 얼마나 비슷한가?”를 판단하는 데 쓰이지만 차이가 있기 때문에 그 부분은 간단하게 정리하고자 합니다.

결론을 미리 말씀 드리자면, Cosine Similarity는 두 벡터의 방향이 얼마나 비슷한지 보는 단순한 거리 기반 방법이고, PLDA는 데이터의 통계적 분포를 학습해서 두 샘플이 같은 클래스에서 나왔을 가능성을 계산하는 확률 모델 기반 방법입니다.

최근 딥러닝 방법론에서 유사도를 구할 때는 cosine similarity 를 더 많이 사용하는 것 같다고 느끼긴 했습니다만, 화자 인증 분야에서는 x-vector, i-vector 같은 임베딩을 비교할 때는 둘 다 많이 사용되는 것 같습니다.


1. Cosine Similarity란?

Cosine Similarity는 두 벡터 사이의 각도를 이용해서 유사도를 계산하는 방법입니다. 두 벡터가 같은 방향을 바라보면 유사도가 높고, 서로 다른 방향을 바라보면 유사도가 낮습니다.

cosine_similarity(a,b)=abab\text{cosine\_similarity}(\mathbf{a}, \mathbf{b}) = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \|\mathbf{b}\|}

여기서 중요한 점은 벡터의 크기보다는 방향을 본다는 것입니다.

예를 들어 두 임베딩 벡터가 있다고 해보겠습니다.

A = [0.2, 0.5, 0.8]
B = [0.21, 0.49, 0.79]

두 벡터가 거의 같은 방향을 향하고 있다면 cosine similarity 값은 1에 가깝게 나옵니다.
반대로 방향이 많이 다르면 0 또는 음수에 가까워질 수 있습니다.


2. Cosine Similarity의 특징

Cosine Similarity의 가장 큰 장점은 간단함입니다. 그냥 두 벡터만 있으면 바로 계산할 수 있다보니 다음과 같은 상황에서 많이 씁니다.

문장 임베딩 검색
이미지 임베딩 검색
얼굴 임베딩 비교
화자 임베딩 간단 비교
추천 시스템의 벡터 유사도 계산

구현도 쉽습니다.

import numpy as np

def cosine_similarity(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

하지만 단점도 있습니다. Cosine Similarity는 데이터가 어떤 분포를 가지는지, 클래스 내부 변동이 얼마나 큰지, 클래스 간 차이가 어느 정도인지 전혀 고려하지 않습니다. 즉, “두 벡터의 방향성이 비슷한가?”만 봅니다.


3. PLDA란?

PLDA는 Probabilistic Linear Discriminant Analysis의 약자입니다.

이름에서 알 수 있듯이 확률 모델입니다.

PLDA는 단순히 두 벡터의 각도만 보는 것이 아니라, 학습 데이터를 이용해서 다음과 같은 정보를 모델링합니다.

같은 사람의 임베딩들은 어느 정도 변할 수 있는가?
다른 사람의 임베딩들은 보통 얼마나 떨어져 있는가?
전체 임베딩 공간에서 클래스 간 분산과 클래스 내부 분산은 어떻게 다른가?

화자 인증 예시로 보면 더 이해하기 쉽습니다.

같은 사람이 말해도 녹음 환경, 마이크, 감정, 발화 내용, 잡음 때문에 임베딩이 매번 완전히 같지는 않습니다.

같은 화자:
- 조용한 방에서 말한 음성
- 시끄러운 카페에서 말한 음성
- 전화로 말한 음성
- 감기 걸렸을 때 말한 음성

이런 경우 같은 사람이어도 임베딩이 조금씩 달라집니다.

PLDA는 이런 within-class variation, 즉 같은 클래스 내부의 변동을 학습합니다.

동시에 서로 다른 화자들이 보통 얼마나 다르게 나타나는지도 학습합니다. 이것은 between-class variation, 즉 클래스 간 변동입니다.


4. PLDA의 기본 아이디어

PLDA는 관측된 임베딩 벡터를 대략 이렇게 봅니다.

x=μ+Fh+ϵx = \mu + Fh + \epsilon

각 항의 의미는 다음과 같습니다.

의미
xx관측된 임베딩 벡터
μ\mu전체 평균
FhFh클래스, 예를 들어 화자 고유의 특성
ϵ\epsilon세션, 잡음, 환경 등으로 인한 변동

즉 PLDA는 임베딩을 이렇게 나눠서 생각합니다.

임베딩 = 공통 평균 + 사람 고유 특성 + 녹음 환경/잡음/세션 변동

이게 Cosine Similarity와 가장 큰 차이입니다.

Cosine Similarity는 두 벡터를 그냥 비교한다면 PLDA는 “이 정도 차이는 같은 사람끼리도 충분히 날 수 있는 차이인가?”, “아니면 다른 사람이라고 보는 게 더 자연스러운 차이인가?”를 확률적으로 판단합니다.


5. PLDA는 유사도가 아니라 likelihood ratio를 계산한다

Cosine Similarity는 두 벡터 사이의 유사도 점수를 바로 계산합니다.

반면 PLDA는 보통 다음 두 가설을 비교합니다.

H_same: 두 임베딩은 같은 클래스, 예를 들어 같은 화자에서 나왔다.
H_diff: 두 임베딩은 서로 다른 클래스에서 나왔다.

그리고 다음과 같은 점수를 계산합니다.

logP(x1,x2Hsame)P(x1,x2Hdiff)\log \frac{P(x_1, x_2 \mid H_\text{same})}{P(x_1, x_2 \mid H_\text{diff})}

이 값이 크면 “같은 사람일 가능성이 높다”고 보고, 작으면 “다른 사람일 가능성이 높다”고 봅니다. 즉 PLDA score는 단순 유사도가 아니라 같은 클래스일 가능성과 다른 클래스일 가능성의 비율에 가깝습니다.


6. 결론

가장 중요한 차이를 표로 정리하면 이렇습니다.

구분Cosine SimilarityPLDA
방식벡터 간 각도 비교확률 모델 기반 비교
학습 필요 여부필요 없음필요함
고려하는 정보두 벡터의 방향클래스 내부/클래스 간 분산
출력값유사도 점수log-likelihood ratio 성격의 점수
데이터 의존성낮음높음
대표 사용처임베딩 검색, 간단 매칭화자 인증, 얼굴 인증, 바이오메트릭 인증

profile
AI 😎

0개의 댓글