임베딩이란?
자연어처리에서 임베딩이란 사람의 언어를 컴퓨터가 이해할 수 있는 벡터로 변환한 것이다. 임베딩이 얼마나 잘 되어있는가에 따라서 성능이 달라질 수 있기 때문에 임베딩에 대한 연구는 자연어처리에서 활발히 연구되고 있는 분야 중 하나이다. 임베딩은 Word2Vec, GloVe, fastText 와 같은 단어 기반의 임베딩 기법과 InferSent, ELMO, BERT 등을 비롯한 문장 기반의 임베딩 기법으로 나뉘는데 이 중 문장 임베딩은 단어 임베딩이 상대적으로 취약했던 동음이의어나 문맥을 파악하는데 있어서 강점을 보였으며, 문장의 유사도를 비교하는 등 문장 기반의 태스크에서도 이점을 갖고 있다.
예를 들어, 단어를 해당 임베딩에 매핑하는 방법을 알려주는 간단한 표를 생각해봅시다
고양이 | [0.1, 0.2, 0.3, ...] |
개 | [0.2, 0.3, 0.4, ...] |
쥐 | [0.3, 0.4, 0.5, ...] |
각 단어는 고차원 벡터로 표현되며, 이를 "임베딩"이라고 합니다. 이 임베딩은 기계가 이해할 수 있는 방식으로 단어의 의미를 포착합니다.
→ 비슷한 단어는 벡터 공간에서 서로 가까이 위치하고, 다른 단어는 멀리 위치하게 됩니다.
- 검색: 결과가 쿼리 문자열과 관련된 순으로 정렬됩니다.
- 클러스터링: 텍스트 문자열이 유사성에 따라 그룹화됩니다.
- 추천: 관련된 텍스트 문자열이 있는 항목을 추천합니다.
- 이상 탐지: 관련성이 적은 이상치를 식별합니다.
- 다양성 측정: 유사성 분포가 분석됩니다.
- 분류: 텍스트 문자열이 가장 유사한 레이블로 분류됩니다.
"france"를 검색하면 "french : 0.70007~" "belgium: 0.69331~" "paris: 0.63349~" "germany: 0.62707~" 같은 값을 얻을 수 있음
이는 프랑스의(french) 것과 유럽의 지리가 혼합된 것
여기서 할 수 있는 정말 흥미로운 일은 이러한 벡터에 대해 산술 연산을 수행하는 것
"germany"에 대한 벡터에 "paris"를 추가하고 "france"를 빼면 결과 벡터는 "베를린"에 가장 가까움
💡 Embedding(King) - Embedding(Man) + Embedding(Woman) → Queen
사용 사례
자연어 처리 (NLP)
임베딩은 NLP 분야에서 많은 언어 관련 작업의 성능을 향상시키는 데 중요한 역할을 합니다.
- 감성 분석: 감성 분석은 텍스트에서 표현된 감성이나 감정을 이해하는 작업입니다. 임베딩은 단어의 의미를 포착할 수 있기 때문에 주어진 텍스트가 긍정적인 감정, 부정적인 감정, 중립적인 감정을 가지고 있는지를 판단하는 등의 작업에 유용하게 사용될 수 있습니다.
- 개체명 인식 (NER): NER에서는 텍스트 내에서 개체(예: 사람, 조직, 위치 등)를 식별하는 것이 목표입니다. 임베딩은 의미 정보를 포착하는 단어 표현을 제공하여 모델이 서로 다른 유형의 개체를 구분할 수 있도록 도움을 줄 수 있습니다.
- 기계 번역: 기계 번역은 텍스트를 한 언어에서 다른 언어로 번역하는 작업입니다. 임베딩은 다양한 언어의 단어와 구문의 의미를 포착할 수 있어 번역 품질을 향상시키는 데 활용될 수 있습니다.
검색 및 정보 검색
- 의미 검색: 의미 검색은 사용자의 의도를 문맥적 의미를 통해 이해하여 검색 정확성을 향상시키는 것을 목표로 합니다. 개념 일치를 통해 임베딩을 사용하면 키워드 일치뿐만 아니라 개념적으로 관련된 검색 결과를 검색 시스템이 검색할 수 있습니다.
- 문서 군집화: 문서 군집화는 문서를 유사성에 따라 그룹화하는 작업입니다. 임베딩을 사용하면 문서 전체를 벡터로 표현하여 유사성을 측정하고 그에 따라 문서를 군집화할 수 있습니다.
추천 시스템
- 개인화된 추천: 노래, 영화, 제품을 추천하는 시스템에서 임베딩을 사용하여 사용자의 선호도와 항목 속성을 나타낼 수 있습니다. 사용자 및 항목 임베딩 간의 유사성을 사용하여 사용자가 좋아할 만한 항목을 추천하는 데 사용할 수 있습니다.
임베딩 모델의 한계와 위험
임베딩 모델은 특정 상황에서 신뢰할 수 없거나 사회적 위험을 초래할 수 있으며, 완화 조치가 없을 경우 해를 입힐 수 있습니다.
한계: 모델은 스테레오타입이나 특정 그룹에 대한 부정적인 감정을 통해 사회적 편견을 인코딩합니다.
SEAT (May et al, 2019) 및 Winogender (Rudinger et al, 2018) 벤치마크를 통해 모델에서 편견의 증거를 발견했습니다. 이러한 벤치마크는 성별 이름, 지역 이름 및 일부 스테레오타입에 적용될 때 모델이 암시적인 편견을 포함하고 있는지를 측정하는 7가지 테스트로 구성됩니다.
예를 들어, 모델이 (a) 유럽계 미국인 이름을 아프리카계 미국인 이름보다 긍정적인 감정과 더 강하게 연관시키고, (b) 흑인 여성과 부정적인 스테레오타입을 연관시키는 경향이 있음을 발견했습니다.
따라서 이를 요약하자면 다음과 같습니다.
임베딩 모델이 특정 사회적 편견을 가질 수 있다는 것을 나타내는 초기 증거를 제공하지만, 이것이 모든 사용 사례나 상황에서 동일하게 나타날 것이라고 확정 짓지는 않습니다.
최근 사건에 대한 무지 모델은 2020년 8월 이후 발생한 사건에 대한 지식이 없습니다.
모델은 2020년 8월까지의 실제 세계 사건에 대한 일부 정보를 포함한 데이터셋으로 훈련됩니다. 최근 사건을 대표하는 데 모델을 의존한다면, 성능이 좋지 않을 수 있습니다.
코사인 유사도
코사인 유사도는 두 벡터 간의 코사인 각도를 이용하여 구할 수 있는 두 벡터의 유사도를 의미합니다. 두 벡터의 방향이 완전히 동일한 경우에는 1의 값을 가지며, 90°의 각을 이루면 0, 180°로 반대의 방향을 가지면 -1의 값을 갖게 됩니다. 즉, 결국 코사인 유사도는 -1 이상 1 이하의 값을 가지며 값이 1에 가까울수록 유사도가 높다고 판단할 수 있습니다. 이를 직관적으로 이해하면 두 벡터가 가리키는 방향이 얼마나 유사한가를 의미합니다.
문서1 : 저는 사과 좋아요
문서2 : 저는 바나나 좋아요
문서3 : 저는 바나나 좋아요 저는 바나나 좋아요
뛰어쓰기 기준 토큰화를 진행했다고 가정하고, 위의 세 문서에 대해서 문서 단어 행렬을 만들면 이와 같습니다.
바나나 | 사과 | 저는 | 좋아요 | |
문서1 | 0 | 1 | 1 | 1 |
문서2 | 1 | 0 | 1 | 1 |
문서3 | 2 | 0 | 2 | 2 |
Numpy를 사용해서 코사인 유사도를 계산하는 함수를 구현하고 각 문서 벡터 간의 코사인 유사도를 계산해보겠습니다.
import numpyas np
from numpyimport dot
from numpy.linalgimport norm
defcos_sim(A, B):
return dot(A, B)/(norm(A)*norm(B))
doc1 = np.array([0,1,1,1])
doc2 = np.array([1,0,1,1])
doc3 = np.array([2,0,2,2])
print('문서 1과 문서2의 유사도 :',cos_sim(doc1, doc2))
print('문서 1과 문서3의 유사도 :',cos_sim(doc1, doc3))
print('문서 2와 문서3의 유사도 :',cos_sim(doc2, doc3))
문서 1과 문서2의 유사도 : 0.67
문서 1과 문서3의 유사도 : 0.67
문서 2과 문서3의 유사도 : 1.00
문서1과 문서2의 코사인 유사도와 문서1과 문서3의 코사인 유사도가 같다는 점과 문서2와 문서3의 코사인 유사도가 1이 나온다는 것입니다. 앞서 1은 두 벡터의 방향이 완전히 동일한 경우에 1이 나오며, 코사인 유사도 관점에서는 유사도의 값이 최대임을 의미한다고 언급한 바 있습니다.
문서3은 문서2에서 단지 모든 단어의 빈도수가 1씩 증가했을 뿐입니다. 다시 말해 한 문서 내의 모든 단어의 빈도수가 동일하게 증가하는 경우에는 기존의 문서와 코사인 유사도의 값이 1이라는 것입니다.
💡 이것이 시사하는 점은 무엇일까요?
문서 A와 B가 동일한 주제의 문서. 문서 C는 다른 주제의 문서라고 해봅시다. 그리고 문서 A와 문서 C의 문서의 길이는 거의 차이가 나지 않지만, 문서 B의 경우 문서 A의 길이보다 두 배의 길이를 가진다고 가정하겠습니다. 이런 경우 유클리드 거리로 유사도를 연산하면 문서 A가 문서 B보다 문서 C와 유사도가 더 높게 나오는 상황이 발생할 수 있습니다. 이는 유사도 연산에 문서의 길이가 영향을 받았기 때문인데, 이런 경우 코사인 유사도가 해결책이 될 수 있습니다. 코사인 유사도는 유사도를 구할 때 벡터의 방향(패턴)에 초점을 두므로 코사인 유사도는 문서의 길이가 다른 상황에서 비교적 공정한 비교를 할 수 있도록 도와줍니다.
→ 코사인 유사도는 벡터 간 방향에 초점을 두기 때문에, 문서의 길이가 다른 상황에서도 비교적 공정하게 유사도를 측정합니다. 이처럼, 유클리드 거리는 문서의 길이에 영향을 받기 때문에 문서 유사도 측정 시 자주 활용되지 않습니다.
문서 벡터 간의 유클리드 거리 계산 결과는 다음과 같습니다:
- 문서 1과 문서 2의 유클리드 거리: 1.41
- 문서 1과 문서 3의 유클리드 거리: 2.65
- 문서 2와 문서 3의 유클리드 거리: 1.73
이 값들은 두 벡터 간의 직선 거리를 나타냅니다. 유클리드 거리가 작을수록 두 문서는 서로 유사하다고 볼 수 있습니다. 여기서, 문서 1과 문서 2, 그리고 문서 2와 문서 3 사이의 거리가 상대적으로 더 가깝다는 것을 알 수 있습니다.
def euclidean_distance(A, B):
return np.sqrt(np.sum(np.square(A - B)))
# 유클리드 거리 계산
euclidean_distance_doc1_doc2 = euclidean_distance(doc1, doc2)
euclidean_distance_doc1_doc3 = euclidean_distance(doc1, doc3)
euclidean_distance_doc2_doc3 = euclidean_distance(doc2, doc3)
euclidean_distance_doc1_doc2, euclidean_distance_doc1_doc3, euclidean_distance_doc2_doc3
(1.4142135623730951, 2.6457513110645907, 1.7320508075688772)