벡터 임베딩 - 모든 데이터를 표현하다
우리가 매일 접하는 웹과 모바일에는 문서, 이미지, 음성, 영상, 숫자 등 다양한 형태의 데이터가 존재합니다. 각각 표현되는 방식이 다르고, 이에 따라 저장하는 방식이 달라지죠. 그렇다면 서로 다른 종류의 데이터들은 반드시 다른 방식으로 저장해야 할까요? 동일한 형태로 저장하여 비교 할 방법은 없을까요?
다른 형태의 데이터를 동일한 형태로 변환하여 비교가능한 상태로 만들어주기 위해 벡터임베딩이라는 개념이 등장합니다. 벡터임베딩은 [1, 4, 0]과 같이 숫자의 배열로 표현된 데이터 입니다. 즉, 이미지나 문서, 영상과 같은 모든 데이터를 숫자배열로 표현 할 수 있다는 것 이죠. 쉽게 설명하기 위해 색깔을 예로 들어보도록 하겠습니다.
모든 색은 빨간색, 초록색, 파란색의 수준을 조합한 RGB 형식으로 나타 낼 수 있습니다. 3가지 색깔을 0 에서부터 255까지 나타낼 수 있고 이를 조합하여 여러가지 색깔을 표현할 수 있습니다:
- 빨간색: [255, 0, 0]
- 초록색: [0, 255, 0]
- 파란색: [0, 0, 255]
즉, 색깔 데이터는 3개의 숫자로 표현된 3차원 벡터데이터로 나타낼 수 있습니다. 이것도 하나의 벡터임베딩입니다. 이렇게 숫자 배열로 표현된 벡터데이터는 데이터간 거리계산이 가능하고, 거리가 가까울수록 서로 유사한 개념이 되는 것입니다. (벡터의 거리계산을 하는 방법은 여러가지가 있습니다.)
정리하면 벡터임베딩은 사람들이 인식하는 대상(혹은 개념)들의 유사성을 벡터공간내의 근접성으로 치환하여 얼마나 유사한지 정량적인 측정을 가능하게 해줍니다. 자연어처리, 추천알고리즘의 핵심으로 머신러닝에서 가장 유용한 개념인 것이죠. 모든 데이터들은 각각의 Transformer 모델을 통해 벡터임베딩으로 변환 할 수 있습니다.
- 텍스트 데이터: 자연어 처리 작업에 주로 사용되며, 워드 임베딩을 통해 단어와 문장, 문서를 벡터로 변환합니다. Word2Vec이 가장 대표적인 임베딩 변환모델입니다.
- 이미지 데이터: 이미지를 고차원 벡터로 임베딩하여 유사성 및 패턴을 찾는 데 활용 할 수 있습니다.
- 음성 데이터: 음성신호를 음성임베딩으로 변환하여 음성 명령을 인식하거나 화자를 식별하는 데 사용할 수 있습니다.
- 영상 데이터: 영상프레임을 벡터로 변환하여 움직임, 객체 감지, 추적, 영상 검색을 할 수 있습니다.
한 가지 예를 더 살펴보겠습니다. 강아지, 고양이, 딸기, 수박 사진을 어떻게 분류 할 수 있을까요? 당연히 호랑이와 사자는 동물로, 수박과 딸기는 과일로 분류 할 수 있을 것입니다.
4개의 이미지를 2차원 벡터로 표현된다고 가정해보겠습니다:
- 고양이: [1, 1]
- 강아지: [1, 2]
- 딸기: [3, 4]
- 수박: [4, 3]
2차원 평면에 위의 숫자를 나타낼 경우 강아지와 고양이를 나타내는 점, 딸기와 수박을 나타내는 점 사이의 거리가 가깝게 표현된 것을 알 수 있습니다. 점 사이의 거리를 계산할 수 있고 이 거리를 기준으로 분류할 수 있는 것이죠.
위에서는 이미지라는 동일한 형태의 데이터를 벡터데이터로 변환하여 비교하는 것을 설명하였습니다. 그렇다면 서로 다른 형태의 데이터도 비교가 가능할까요? "고양이" 단어와, 고양이 사진을 벡터로 표현하여 서로 유사성을 측정 할 수 있을까요? 물론입니다! 텍스트와 이미지를 벡터 공간이라는 공통 공간에 임베딩하여 거리측정을 할 수 있습니다. 오로지 이미지 파일(태그, 설명이 전혀 없는)만 있더라도 검색문을 입력하여 원하는 이미지를 찾아낼 수 있죠.
Aeca Demo에서 직접 해볼까요? "강아지가 달리는 사진"을 입력해 보겠습니다.
사진에는 아무런 설명이 없는데, 검색어에 가장 적합한 이미지를 찾은 것입니다. 이렇게 텍스트로 이미지를 검색 하는 것 뿐만 아니라 영상에서 특정 이미지를 찾는 것도 가능하고, 반대로 이미지를 표현하는 문서도 찾아낼 수 있습니다. 이렇게 거리가 가장 가까운 벡터임베딩을 찾는 것이 벡터검색이고, 벡터임베딩을 저장하여 벡터검색을 가능하게 해주는 것이 벡터데이터베이스 입니다.
함께 보면 좋을 글
Aeca가 검색 개발을 쉽게 하는 방법
웹과 모바일 애플리케이션에서 검색은 긍정적인 사용자 경험을 형성하는 핵심기능 입니다. 특히 커머스 서비스에서 검색은 사용자 경험 향상을 넘어, 회사 매출에 직접적인 영향을 미치는 요소 입니다. 상품정보와 콘텐츠의 양이 폭발적으로 증가하는 상황에서 고객이 입력한 검색어에에 부합되는 정보를 적시에 제공하는 검색품질은 애플리케이션과 웹사이트의 성공과 실패를 가를 중요한 요인이 되었습니다. 일반적으로 커머스 서비스에서 상품을 검색하는 고객은 지불의사가 높은 강력한 잠재고객으로 판단합니다. 사용자들이 검색하는 행위와 검색결과에 반응하는 모든 행동에는 고객 자신들의 구매의도, 니즈, 지불의사가 모두 나타나 있다고 보고 있습니다. 통계상으로도 검색을 수행한 사용자의 구매전환율이 그렇지 않은 고객에 비해 2배 이상이며, Total MAU에서 검색을 사용하는 유저의 비율은 20% 이하지만 검색을 한 번 이상 수행한 사용자들에게서 발생하는 매출이 절반이상인 것으로 알려져 있습니다. 또한 첫 검색에 실패한 사용자의 이탈율이 높게 나타나며, 재검색 고객의 구매전환율은 매우 낮게 나타납니다. 즉, 검색은 고객의 지갑을 열기 위한 강력한 수단일 뿐만 아니라 서비스의 지속가능성에도 큰 영향을 미치는 요소 입니다. 그렇다면 검색은 구체적으로 어떻게 고객리텐션과 매출증대, 서비스 개선에 기여할까요?
By Tim Yang|2023-09-12
검색 기능 개발이 어려운 이유
현대 애플리케이션에서는 검색기능이 필수적입니다. 대표적으로 쿠팡, 배달의민족, 야놀자와 같은 앱들에서 사용자는 다양한 항목들을 검색합니다. 그러나 검색기능의 개발은 간단하지 않습니다. 특히 사용자가 구글과 같은 수준의 검색품질을 기대할 때 기술적 요구사항은 복잡해집니다. 검색기능을 개발하기 위한 두 가지 대표적인 방법은 데이터베이스의 쿼리기능을 사용하는 것과 별도의 검색엔진을 사용하는 것입니다. 데이터베이스의 쿼리기능은 간단한 검색에는 적합하지만, 복잡한 검색 요구사항에는 한계가 있습니다. 반면, 검색엔진을 사용하면 높은 수준의 검색기능을 제공할 수 있지만, 개발의 복잡도와 유지보수의 어려움이 증가합니다. 따라서 서비스 초기단계에서는 어떻게 고품질의 검색기능을 효과적으로 구현할 것인지에 대한 고민이 필요합니다.
By Tim Yang|2023-09-11