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)라고 합니다.
목적은 벡터의 크기를 모두 동일하게 만들어줘서,
코끼리든 사람이든 개미든 보편적으로 비교할 수 있도록 하기 위함입니다.
키와 몸무게 모두 동일한 비율로 줄어들어야 하니,
각각에 동일한 값을 나눠서 전개해보면 어떻게 할 지 알 수 있습니다.
먼저 최초 벡터의 거리를 구해봅시다.
이제 상수 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배 차이나진 않습니다.
그림을 보면 차이를 느낄 수 있죠.
필자가 수학을 보는 시각이 이렇습니다.
이런 상황에서 이런 수식을 써야된다는 건 솔직히 별로입니다.
왜 그런 수식을 써야되고, 얼마나 좋을 지 생각하는 걸 좋아하죠.
코사인 유사도나 내적도 마찬가지로
그냥 이런 게 있고 써왔다는 건... 지양해야 합니다.
왜 필요했고, 또 아는 게 얼마나 좋은 지 느껴봐야 할 맛이 나죠!
'기계 학습 (Machine Learning) > 수학 (Mathematics)' 카테고리의 다른 글
확률과 통계 3 - 베이즈 정리 (0) | 2024.08.06 |
---|---|
확률과 통계 2 - 조건부 확률 (0) | 2024.08.06 |
확률과 통계 1 - 확률 분포 (0) | 2024.08.05 |
선형대수 1 - 벡터와 행렬 (0) | 2024.08.02 |
기계 학습을 위한 수학 개요 (0) | 2024.08.02 |