Vector Embedding and Similairy
벡터 임베딩 그리고 유사도 측정에 대해 공부하고 기록한 글 입니다.
벡터 임베딩
벡터 임베딩은 데이터의 수치화된 표현을 의미합니다. 자연어 혹은 특정 사물, 주제, 이미지 등 기타 데이터를 수치화한 값을 의미합니다. 예를들어 "나무" 라는 단어를 [ 0.04128048 0.02086734 -0.00774979 ] 이런 형태로 숫자로 표현한다면 이는
n차원의 벡터 공간에 "나무"라는 임베딩을 생성한 것 입니다.
해당 값은 사람이 보기엔 의미있는 수치가 아닙니다. 다만 AI 에겐 해당 수치가 유사성 판단의 근거가 됩니다.
유사도 측정
특정 데이터가 얼마나 유사한지 측정하는 과정을 의미합니다.
여러가지 유사도 측정 방식이 있지만 코사인유사도, 유클라디안 유사도 이렇게 두가지에 대해 설명하겠습니다.
코사인 유사도
벡터를 이루는 각도를 기반으로 유사도를 계산하고 벡터의 길이는 무시합니다. 벡터의 방향성에 초점을 맞춘 유사도 측정 방식입니다.
코사인 유사도는 아래와 같은 수식이 나온다고 하는데요.
너무 공포스럽습니다 :(
수학은 무서우니까 그림을 보며 설명해보겠습니다.
우선 숲, 자연 이라는 단어를 임베딩 하여 다음과 같은 결과가 나왔다고 가정하겠습니다.
- 숲 : [ 0.00157988 0.03076288 -0.04959789]
- 자연: [ 0.03841943 0.03524542 -0.04583116]
이전에 생성한 나무를 포함하여 숲과 자연 모두 벡터공간의 해당 위치에 임베딩을 생성합니다.
아래는 3차원 벡터 공간에 임베딩을 생성한 모습입니다.
각 점은 벡터공간에 있는 벡터를 의미하며 이 수치들은 AI 입장에서 나무, 숲, 자연을 의미합니다.
이 점들의 거리가 가까우면 유사도가 높다 라고 표현하고 거리가 멀면 유사도가 낮다 라고 판단합니다.
원점 ( 3차원 기준 0, 0, 0 ) 에서 비교할 두 벡터로 향하는 직선을 긋고 두직선 사이의 각도를 측정하는 형태 입니다.
나무, 자연간의 유사도를 측정 하려면 빨간색 직선과 파란색 직선 사이의 각도를 측정하고 이를 0~1 사이로 나타냅니다.
대충 아래와 같은 결과가 나온다고 합니다.
- 나무와 숲의 코사인 유사도: 0.3986
- 나무와 자연의 코사인 유사도: 0.8221
- 숲과 자연의 코사인 유사도: 0.8434
1에 가까울 수록 유사하다고 보는거고 멀어질 수록 유사하지 않다고 봅니다.
근데 각도를 어떻게 0~1 사이의 숫자로 계산하여 표현 하는건지 의문입니다. 이를 한번 알아보겠습니다.
코사인 유사도에 대해 찾아보니 두 벡터 간의 내적(dot product)을 각 벡터의 크기(norm)의 곱으로 나누어 계산합니다.
라고 하는군요 그리고 이런 수식이 나온다고 합니다.
아까 보았던 수학 수식이군요
무서우니까 그만 알아보겠습니다.
다음은 유클라디안 유사도 입니다.
유클라디안 유사도
코사인 유사도에서는 벡터간의 각도를 측정했다면 유클라디안 유사도는 두 벡터 사이의 최단거리를 구하는 방식입니다.
우선 계산식은 아래와 같습니다.
- 두 벡터의 좌표 차이 계산:
- 벡터 𝐴: (𝑥1,𝑦1,𝑧1)
- 벡터 𝐵: (𝑥2,𝑦2,𝑧2)
- 차이 벡터: (𝑥2−𝑥1,𝑦2−𝑦1,𝑧2−𝑧1)
- 차이 벡터의 각 요소를 제곱:
- (𝑥2−𝑥1)2,(𝑦2−𝑦1)2,(𝑧2−𝑧1)2
- 제곱된 값을 모두 더함:
- (𝑥2−𝑥1)2+(𝑦2−𝑦1)2+(𝑧2−𝑧1)2
- 제곱근을 취함:
- (𝑥2−𝑥1)2+(𝑦2−𝑦1)2+(𝑧2−𝑧1)2
이 수식은 별로 무섭지 않군요 ^^
- "나무 벡터: (0.04128048,0.02086734,−0.00774979)
- "숲" 벡터: (0.00157988,0.03076288,−0.04959789)
- 좌표 차이 계산:
- (0.00157988−0.04128048,0.03076288−0.02086734,−0.04959789−(−0.00774979))
- = (−0.0397006,0.00989554,−0.0418481)
- 차이 벡터의 각 요소를 제곱:
- (−0.0397006)2,(0.00989554)2,(−0.0418481)2
- = 0.00157614,0.00009791,0.00175143
- 제곱된 값을 모두 더함:
- 0.00157614+0.00009791+0.00175143=0.00342548
- 제곱근을 취함:
- 0.00342548=0.05851
그래서 데이터 임베딩은 그래서 어떻게 생성함?
Chat GPT api를 사용하면 데이터에 대한 임베딩을 쉽게 만들어 준다고 합니다.
https://platform.openai.com/docs/guides/embeddings
이를 통해 추천 시스템을 복잡한 알고리즘 없이도 수월하게 만들 수 있을 것 같다는 생각 입니다.