선형대수 2 - 코사인 유사도와 곱셈

2024. 8. 3. 13:04기계 학습 (Machine Learning)/수학 (Mathematics)

 

 

 


Similarity

 

혹시 코사인 유사도라는 제목을 보고

시작부터 머리가 아플 것 같아 걱정이신가요.

 

걱정하지 마세요.

뭘 대단한 걸 하진 않습니다.

우선 저번에 예시로 든 몸무게와 키 행렬을 살펴보죠.

 

질문입니다.

첫 번째 사람은 몸무게가 70kg에 키가 170cm입니다.

그리고 두 번째 사람은 몸무게가 91kg에 키가 185cm이죠.

그럼 두 사람 중 누가 체형이 더 클까요?

 

 

 

 

두 번째 사람이 체형이 더 크다고 생각하셨나요?

그렇다면 놀랍지만 설명할 필요도 없이

이미 여러분은 머리 속으로 코사인 유사도를 성공적으로 계산해내셨습니다.

(설명 끝?)

 

 

사실 이 직관은 머리속으로 생각해봤을 때, 

몸무게가 더 많이 나가면 옆으로 더 크고

키가 더 크면 위로 더 크다고 생각했기 때문이죠.

 

질문을 다르게 바꿔보면 이해가 더 잘 됩니다.

두 사람 모두 몸무게가 70kg에 키가 170cm입니다.

누가 더 체형이 클까요?

 

뭐, 비슷하겠죠.

 

 

이런 질문은 어떤가요?

첫 번째 사람은 몸무게가 60kg 뿐이지만 키가 180cm입니다.

그리고 두 번째 사람은 몸무게가 80kg에 키가 160cm이죠.

 

이럴 땐 위로 큰 걸 체형이 크다라고 생각할 수도 있고

옆으로 큰 걸 체형이 크다라고 생각할 수도 있고,

둘이 너무 달라서 기준을 쉽게 생각하지 못할 수 있습니다.

 

어쨌든 모두 코사인 유사도를 알게 모르게 머리속에서 계산해낸 것입니다.

 

 

 

 

 

다음 그림은 어떨까요?

몸의 형상은 비슷하지만 두 번째 사람이 몸이  거대하죠.

이 비슷하다는 말은 = 저 화살표의 방향이 서로 비슷하다 와 같고

거대하다는 말은 = 저 화살표가 더 멀리 뻗어나갔다 와 같습니다.

이 그림과 원리를 꼭 잊지 않아야 됩니다.

 

 

 

그래서 얼마나 차이 나는데요?

 

이제 여기서 수학이 등장하는 이유입니다.

내 머리속으로 생각한 결과를 다른 사람에게 표현할 차례입니다.

그냥 대략 누가 더 크겠죠 라는 설명은 안 됩니다.

치킨 두 마리 시켰는데 주방장이 '이 정도면 되겠죠?'하고

그냥 손에 짚이는 만큼 넣어서 준다면

난리법석 떨 것이면서 이건 대충 넘어가면 안되죠.

 

 

 

 

한 번 생각해봅시다.

화살표의 길이는 서로 같은 상황에서,

저 화살표의 방향이 비슷하면 몸의 형상도 비슷합니다.

다르면 누군가는 옆이든 위로든 더 뻗어나가겠죠.

 

화살표의 방향은 서로 같은 상황에서,

저 화살표의 길이가 서로 비슷하면 몸의 크기도 비슷합니다.

다르면 누군가는 몸이 더 커보이겠죠.

 

 

그렇습니다.

화살표의 방향이나 길이

바로 우리가 두 사람의 체형을 판별하는 중요한 요소였습니다.

방향과 길이가 아예 다르면 아예 딴 사람으로 보이겠지만

서로 같으면 그냥 똑같은 사람으로 보일 것입니다.

 

그리고 화살표는 벡터(vector)를 표현한 것에 불과합니다.

화살표의 방향은 벡터의 방향(direction)

화살표의 길이는 벡터의 크기(magnitude)

라고 부릅니다.

 

 

 

 


Distance

 

먼저 두 벡터 간 방향부터 비교해보죠.
두 사람의 체형을 생각하면서 이해하면 더 좋습니다.

3명의 몸무게와 키를 벡터들로 그려봤습니다.

검은색인 x3 벡터와 유사한 건 x1일까요? x2일까요?

당연히 x2입니다.

 

두 벡터의 방향이 얼마나 다르냐는 건 간단히 거리로 판단할 수 있죠.

빨간색인 x1 벡터가 압도적으로 멉니다.

 

하지만 이렇게 사용할 수는 없습니다.

첫 번째로 각 벡터 간의 길이가 서로 다릅니다.

예를 들어 아래처럼 방향은 서로 같지만 길이가 다르면

두 벡터 간 거리가 비교적 큽니다.

 

 

두번째로는 기준이 없습니다.

실제 계산해보면 약 36 vs 7 처럼 29라는 거리 차이가 나오는 데,

이게 어느 정도인지 실감할 수 없죠.

 

만일 코끼리를 가지고 비교했을 때,

위와 같은 그림이라도 1톤, 2톤 씩 차이가 난다면 29보다 훨씬 더 커집니다.

즉 이 방법은 대상에 따라서 차이의 기준이 바뀌기 때문에

보편적으로 사용할 수 없습니다.

 

 

 

 

그렇기에 우리는 이를 0과 1 사이에 있도록 만들어 줄 것입니다.

이를 바로 정규화(normalization)라고 합니다.

 

목적은 벡터의 크기를 모두 동일하게 만들어줘서,

코끼리든 사람이든 개미든 보편적으로 비교할 수 있도록 하기 위함입니다.

굳이 1? 아니어도 됩니다 ㅎㅎ 하지만 계산이 복잡해지죠.

 

 

키와 몸무게 모두 동일한 비율로 줄어들어야 하니,

각각에 동일한 값을 나눠서 전개해보면 어떻게 할 지 알 수 있습니다.

 

먼저 최초 벡터의 거리를 구해봅시다.

거리 표현은 ❘ ❘ 안에 벡터를 집어 넣어서 표현합니다.

 

이제 상수 C를 곱해서, 거리가 1이라고 가정해서 전개해보면

 

거리의 역수를 곱해주면 된다는 결론이 나옵니다!

 

 

 

 

 

 

 

 

 

 


Dot Product

 

거리의 역수를 곱함으로써

이제 우리는 그 어떤 대상이 오든

보편적으로 거리를 구할 수 있게 되었습니다.

여러분의 시간을 아끼기위해 미리 계산해뒀습니다.

 

x1이 0.15만큼 더 멀었네요.

 

자 이제 벡터의 방향이 유사한 지 판단하는 공식을 꺼낼 차례입니다.

다음과 같이 두 벡터가 있다면

 

이렇게 구합니다

 

당황하지 말고

이를 조금 더 전개해보면 다음과 같이 나옵니다

어려워 하지마세요. 전개만 한 것입니다.

 

 

주목할 부분은 바로 이 부분입니다.

이 부분이 크면 클수록 두 벡터의 방향은 다르고,

작으면 작을 수록 비슷해지죠.

 

 

 

이제 수식을 잘 한 번 살펴봅시다.

분모는 각 x1의 크기, x2의 크기를 곱한 것입니다.

이전에 크기는 || 안에 벡터를 넣어서 표기한다고 했죠?

 

자 이제, 저 a1a2+b1b2 차례입니다.

만일 벡터의 차원이 2라 단순히 보기 쉽지만,

만일 수 백 차원까지 확장된다면 수식을 쓰기 참 난감합니다.

 

여기서 벡터의 내적(dot product) 연산 표기를 사용합니다.

그 이름답게 점으로 표현합니다.

 

 

두 벡터 간 방향의 유사도를 내적으로 표현하니 깔끔해졌습니다!

 

 

 

 

 

 

 

 


Cosine Similarity

 

자, 한 번 두 벡터의 방향이 완전히 다른 예시를 들고 와보겠습니다.

 

거리를 구하려면 지금까지 배운 수식을 써먹어도 되지만,

그냥 피타고라스 정리로 생각해봐도 루트2 이죠.

거리가 1.414... 이므로 1보다 큽니다.

 

 

1보다 크다고?

 

그렇습니다.

거리가 0 ~ 1 에 있는 게 깔끔?하다고 생각하는 사람이 있죠.

 

그 노력 중에 가장 널리 쓰이는 방법이 바로 코사인 유사도입니다.

 

저 코사인 값을 코사인 유사도 값이라고 합니다.

보시다시피 거리는 0 ~ 1 에 있죠.

 

 

이미 우리는 벡터를 정규화하고 (크기를 1로 만들고)

두 벡터 간 거리를 구하는 걸 알아보았으니 유도하는 건 너무 쉽습니다.

코사인 법칙을 통해 유도해보면 다음과 같습니다.

 

이를 전개하면 몇 줄 안되게 정리됩니다.

 

 

 

코사인 유사도는 1을 넘지 않는다는 점에서 장점을 가지고 있지만,

무엇보다 계산량이 적어서 거의 표준으로 사용하고 있죠.

 

 

그러나 코사인 유사도를 마냥 생각없이 사용하겠다는 건 조금 지나치죠.

아래 각도에 따른 코사인 유사도를 보면 

각도가 단순히 2배 벌어졌다고 해서 유사도가 2배 차이나진 않습니다.

그림을 보면 차이를 느낄 수 있죠.

 

 

필자가 수학을 보는 시각이 이렇습니다.

이런 상황에서 이런 수식을 써야된다는 건 솔직히 별로입니다.

왜 그런 수식을 써야되고, 얼마나 좋을 지 생각하는 걸 좋아하죠.

 

코사인 유사도나 내적도 마찬가지로

그냥 이런 게 있고 써왔다는 건... 지양해야 합니다.

왜 필요했고, 또 아는 게 얼마나 좋은 지 느껴봐야 할 맛이 나죠!