"오늘의집" 은 커머스와 콘텐츠를 결합한 독특한 서비스로,
방대한 이미지 데이터를 활요하여 분석 및 추천 서비스를 제공한다.
그 중에서도 이미지 유사도를 이용한 콘텐츠 추천과 상품 추천 서비스를 제공한다.
이번 포스팅에서는 오늘의 집의 '이미지 유사도' 모델을 개발한 과정을 소개해보려고 한다.
비슷한 공간..
목표 : 주어진 인테리어 이미지와 유사한 다른 이미지 검색
두 가지의 서비스
- 유저가 선택한 사진과 비슷한 스타일의 콘텐츠를 추천해주는 '비슷한 공간' 서비스
- 유저가 선택한 비슷한 형태의 또 다른 제품을 소개해주는 서비스
이 두 개의 서비스는 유저가 클릭한 인테리어와 상품과 비슷한 이미지를 찾아줌으로써 더 많은 탐색을 할 수 있도록 돕는다.
"오늘의집" 에서 잡은 해당 두 기능의 목표
1. 정성적으로 비교했을 때, 정말 비슷한 콘텐츠와 제품을 추천해주는가?
2. 기존 baseline 대비 유저에게 비슷하거나 더 많은 클릭을 유도하는가?
한 마디로 하면 "유사성 계산을 잘해서 정말 비슷한 제품을 추천을 해주면 사용자에게 많은 접근을 유도할 수 있는가?"
인거 같다. 클릭을 유도하는지는 다른 인기 이커머스의 분석결과를 참고해보면 될 거 같고, 나는 어떻게 유사성 높은 이미지를 잘 검색할 수 있을 지 알아보는게 주 목표이다.
이미지 유사도 검색 문제
유사 이미지 검색 문제는 주어진 이미지와 타 이미지 사이의 유사도를 계산하여 전체 이미지 데이터 중 가장 비슷한 이미지를 검색하는 것이다.
이미지 간 유사도는 각각의 이미지를 고차원 벡터로 embedding 시키고 벡터 간의 거리를 측정하는 것이다.
이때, embedding 하는 방법을 이미지의 특징을 뽑아낸다는 의미에서 Feature Extraction이라고 칭하기도 한다.
다양한 Feature Extraction 방식 중에서 딥러닝 모델을 주로 사용하는데, 이커머스에 도메인에 따라 데이터 수집 방식부터 embedding하는 방식을 고려해야 한다.
비슷한 공간
오늘의 집 콘텐츠는 주로 인테리어, 방, 공간 등의 사진으로 구성되어 있다. 유저는 콘텐츠를 보면서 인테리어에 대한 영감을 엉고 선호하는 인테리어 스타일을 더 탐색하려고 한다. 따라서 "오늘의집"은 '비슷한 공간' 문제에서 '이미지 유사성'을 단순히 픽셀 단위의 유사성이 아닌 '비슷한 인테리어 스타일'로 정의하고, 인테리어 스타일 분류 모델을 개발하는 방향으로 나아간다.
데이터 정의 및 구축
분류 문제를 정의하기 위해서는 분류에 사용할 클래스 정의가 필요하기 때문에 오늘의집 콘텐츠를 대표하는 인테리어 스타일들을 활용하여 클래스를 정의했다. 오늘의집이 시도한 학습 방식은 Superviesd Learning 으로, 각 이미지가 11개의 클래스 중 어디에 속하는지 나와있는 정답 데이터 셋이 필요했다. 이때 raw 데이터셋에 정답을 구축하는 과정을 Data Labeling이라고 하는데, 내부적으로 태깅 환경을 구축(CVAT)을 이용하여 태깅 작업자들을 모집하여 오늘의집의 인테리어 사진을 분류했다고 한다.
분류 모델 개발
머신러닝에서 이미지 분류에서 사용되는 알고리즘은 다양하지만 그 중에서 VGGNet와 Vision Transformer(ViT) 을 사용했다.
이렇게 분류 모델을 개발하고, 이미지 간 유사도를 계산하기 위해 Feature Extraction을 진행하였다.
Feature Extraction 후, 두 벡터 간의 코싸인 유사도를 계산하여 유사 이미지를 검색하였다.
인덱싱 및 검색
FAISS(Facebook AI Similarity Search)는 페이스북 AI에서 개발한 유사도 기반의 효율적인 검색을 돕는 라이브러리라고 한다.
Feature Extraction을 통해 이미지의 Representation Vector 를 얻은 뒤 FAISS를 적용하여 추천할 이미지들의 vector에 인덱스를 생성한다. 그리고 query image에 대해 FAISS 인덱스를 적용하면 유사도가 높은 순서대로 이미지를 빠르게 찾을 수 있다고 한다.
결과
VGG16 대비 test accuracy가 16% 상승하는 결과를 보였다. 여러 모델로 테스트 해봐도 더 좋은 결과를 낳았다고 한다.
FAISS 란 무엇인가??
FAISS는 대규모 데이터셋에서 멀티미디어 문서를 효율적으로 검색할 수 있도록 돕는 라이브러리이다.
1. 기존 데이터베이스의 한계 극복
- FAISS는 특정 유형의 검색 작업을 표준 SQL 데이터베이스보다 훨씬 더 효율적이고 효과적으로 수행한다. 라이브러리 발표 당시, 기존 검색엔진 패키지의 성능을 유지하면서 약 8.5배 정보 빠른 성능을 보였다. 검색 성능과 속도는 trade-off관계를 가질 수밖에 없다. 종합적인 성느을 높이면서도 앞으로 데이터가 꾸준히 늘어날 환경을 커버하기 위해서는 이 trade-off관계를 유연하게 조절할 수 있어야 한다.
고차원 벡터 검색의 한계
1. 고차원 벡터 데이터
- 이미지나 비디오 같은 멀티미디어 데이터를 처리할 때는 각 데이터가 고차원 벡터로 표현된다. 이미지의 특징을 추출한 벡터는 수백 차원 이상의 고차원 벡터가 된다. 표준 SQL 데이터베이스는 이러한 고차원 벡터 데이터를 효율적으로 저장하고 검색하는 데 한계가 있다.
2. 최근접 이웃 검색
- 고차원 벡터 간의 유사성을 측정하여 가장 가까운 이웃을 찾는 작업은 매우 계산 집약적이다. 표준 데이터베이스에는 이러한 작업을 효율적으로 수행하기 위한 최적화가 부족하다. 따라서 대규모 데이터셋에서 빠른 검색이 어렵다.
2. 대규모 데이터셋 지원
- 수백만에서 수십억 개 규모의 데이터셋에 대한 최근접 이웃 검색을 구현하여 메모리, 속도, 정확도 간의 트레이드오프를 최적화한다. 특히 쿼리와 인덱스 크기가 점점 선형적으로 커지다 보니 brute-force하게 본다면 연산량이 exponential하게 증가할 수밖에 없어 조절 없이는 시스템을 지속시키기 어렵다. Faiass는 이런 데이터의 양에 따라 데이터를 적정 cell 단위로 나누어 연산하거나, Quantization. Gpu 가속화 등을 Util로 제공하고 있어 search space 증가에 따른 최적화는 물론 안정적으로 시스템을 운영할 수 있는 안정적인 대처가 가능한 라이브러리이다.
3. 다양한 벡터 크기 지원
- 크기에 상관없이 모든 벡터 집합을 검색할 수 있는 알고리즘을 포함하고 있다.
4. 평가 및 매개변수 조정 지원
- 검색 알고리즘을 평가하고 매개변수를 조정할 수 있는 지원 코드를 포함하고 있다.
5. GPU 가속
- 가장 유용한 알고리즘 중 일부는 GPU에서 구현되어 있어, CUDA를 통한 GPU 가속과 선택적 Python 인터페이스를 지원한다.
'A.I.(인공지능) & M.L.(머신러닝) > A.I. Information' 카테고리의 다른 글
[이론] 검색 증강 생성 RAG(Retrieval-Augmented Generation) (0) | 2024.06.26 |
---|---|
[검색엔진] Vector Store (1) | 2024.06.03 |
[이론] LLM GPU 학습 병렬처리 (DP, DDP, FSDP) (0) | 2024.04.18 |
[실습] Huggingface Leaderboard 올리기 전 평가 (0) | 2024.04.08 |
[실습] google gemini 테스트 [python] 10분컷 (1) | 2024.01.31 |