벡터 표현 방식
Dense Vector
Dense Vector는 대부분 차원에 값이 존재하는 밀집 벡터 표현이며,신경망 기반 임베딩에서 주로 사용된다. ex. [0.13, -0.82, 0.44, ...]
선형대수-벡터나 행렬에서 0이 대부분이면 sparse, 값이 대부분 차 있으면 dense라고 얘기한다. 0이 많다는 뜻은 정보가 없는 좌표가 많다—그 차원 방향으로의 기여가 없다는 뜻이다. 따라서 벡터 임베딩에서 n차원에 좌표 변환을 한다면 dense vector는 거의 모든 차원에 값이 있고, 밀도가 높다, 밀집하다고 해석할 수 있다.
Distributed Representation
신경망은 정보를 분산시키고, 어떤 문장이 있다면 그 의미는 여러 차원에 나눠 저장된다. 이를테면 ‘Ethereum nonce conflict’ 문장의 의미는 한 차원에서 1.0이 찍히는 게 아니라, 여러 축에서 조금씩 활성화된다. 즉, 분산 표현이므로 의미는 여러 차원에 걸쳐 표현되며, 그 결과 대부분의 차원에 값이 존재하게 되고, 그래서 밀집(dense)하다.
768차원이라고 해도 그 차원들이 ‘단어’를 의미하지 않는다. 개념적으로, n차원이 기술적 복잡성 정도, m차원이 금융 관련성, o차원이 절차적 설명성을 의미한다고 가정할 때, 이것은 정의된 게 아닌 신경망이 학습 과정에서 자동으로 만든 축이다. 그래서 ‘잠재(latent)’ 공간이라고 부르고, 좌표 하나가 ‘무엇’인지 dense는 설명하기 어렵다. dense 공간에서 개별 차원은 고정된 의미를 갖지 않는다. 의미는 벡터 간의 상대적 위치에 존재한다.
Semantic Search
argmax similarity(query_vector, doc_vector)의미 기반 검색은 잠재 의미 공간에서의 거리 계산이고, Dense 임베딩은 유사 의미를 갖는 문장을 공간상 가깝게 배치한다. 여기서 의미 검색이 되는 이유는 임베딩 모델이 의미적으로 가까운 것들을 가깝게 학습했기 때문이지, 유사도 계산 자체 때문은 아니다. 즉, 의미를 만드는 건 임베딩 모델의 학습 방식이다.
동의어를 잘 찾는 성질도 임베딩 모델이 동의어를 비슷한 벡터로 학습했기 때문이고, 유사도는 그저 거리 측정 도구다. 따라서 임베딩이 형편없다면 cosine similarity, dot product, L2(euclidean) distance 모두 아무런 의미가 없다.
Semantic Dilution(의미 희석)
vector = A 의미 + B 의미의 혼합 평균
vector = weighted(A 의미 + B 의미)Dense single-vector 구조의 한계는 문서 전체를 하나의 벡터로 표현하기 때문에 모든 정보가 평균화된다는 점이다. 따라서 예시에 따라 B 관련 질문을 던지면 문서가 완전히 B에 집중한 문서보다 점수가 떨어질 수 있다.
오버랩 청킹을 통해 어느 정도 개선될 수 있지만, 다음의 한계가 잔존한다.
- 청크 경계 문제 → 정보가 분리되면 맥락 손실
- 너무 많은 청크 → 문맥 부족
- 너무 큰 청크 → 의미 희석
- 질의가 여러 청크에 걸침 → 단일 벡터 매칭 열화
Sparse Vector
Sparse Vector는 문서를 명시적 어휘(단어, 토큰, n-gram 등) 기반 통계 벡터로 표현한다. 대부분의 차원이 0이고, 소수의 차원에만 값이 존재하는 명시적 표현 방식이다. 특정 단어, 토큰, n-gram, feature의 존재나 중요도가 특정 차원에 직접 대응된다.
Localized Representation
Sparse에서 한 차원은 추상적 의미가 아니라 명시적 토큰을 나타낸다. 가령 ‘ethereum’이라는 단어는 정확히 그 차원에 대응된다. 단어가 특정 차원에 고정된다.
Keyword Search
BM25 등을 통한 Sparse 검색은 다음을 계산한다.
- 같은 단어가 있는가?
- 그 단어가 얼마나 중요한가?
- 문서 길이에 비해 얼마나 특이한가?
따라서 exact lexical matching로, 정확히 같은 토큰이 존재해야 점수가 오른다. 자연어는 변형이 많지만, 어근만 남기는 stemming, 토큰화 방식, 동의어 사전 등 전처리를 통해 인위적 의미 확장도 가능하다. 전처리가 차원을 바꿔버린다.
숫자, 고유명사, 코드, 전문 용어 같은 것에 강한 구조다. dense는 특정 차원의 값이 그게 무엇을 뜻하는지 모르지만, sparse는 각 차원이 명시적 토큰과 대응되므로 해석 가능하다.
BM25
BM25는 term frequency, inverse document frequency, length normalization의 조합으로, sparse 표현 위의 scoring formula로 작용하며, 다음을 계산한다.
- 질의 단어가 문서에 있는가?
- 그 단어가 문서에서 몇 번 등장했는가?
- 그 단어가 전체 문서 집합에서 얼마나 희귀한가?
- 문서 길이는 어떤가?
SPLADE(Sparse Lexical and Expansion Model)
신경망이 sparse vector를 직접 생성하도록 학습한 모델로, dense처럼 신경망 기반이지만 결과는 sparse 표현이다. 단어의 중요도를 신경망이 예측하고 문서에 없는 단어도 확장(lexical expansion)이 가능하다.
BERT 등 Transformer에 넣으면 토큰마다 contextual embedding이 나오고, 각 토큰 임베딩을 잠재 공간이 아닌 vocabulary 크기의 로짓(logit) 공간으로 사영한다. 따라서 차원 수가 dense와 비교해도 매우 크다. 문서에는 여러 토큰이 있으니까 각 토큰에서 나온 vocab 점수를 집계한다. 즉, 특정 단어 차원에서, 문서 전체에서 가장 강한 신호를 채택한다. 그리고 L1 정규화 과정에서 많은 차원이 0이 되도록, 작은 값들을 0으로 밀어낸다. (학습 시 L1 regularization을 통해 벡터의 L1 norm을 최소화하도록 압박하여, 많은 차원의 값을 0에 가깝게 만든다.)
그 결과 대부분 차원은 0이 되고, 일부 단어 차원만 활성화되어 sparse 벡터가 된다. 이 값들은 단순 빈도가 아니라 모델이 학습한 중요도 점수가 되고, 문서에 없는 단어도 활성화(neural expansion)될 수 있다.
Hybrid search는 두 시스템을 병렬로 돌리는, 구조적으로 dense 점수와 sparse 점수를 결합하는 구조지만 SPLADE는 neural 기반으로 생성된 단일 sparse 표현 모델이다.