컴퓨터는 고양이 사진을 어떻게 '이해'할까
사진 검색이나 '비슷한 이미지 찾기' 기능, 한 번쯤 써보셨죠? 이게 어떻게 동작하는지 들여다보면 그 중심에 임베딩(embedding)이라는 게 있어요. 이번에 소개할 글은 이 비전 임베딩을 거창한 이론 없이 직접 코드로 만져보면서 "아, 이게 이렇게 되는 거구나"를 체감하게 해주는 실험기예요.
임베딩이 뭐냐면요, 어떤 대상을 숫자들의 목록(벡터)으로 바꾼 거예요. 예를 들어 고양이 사진 한 장을 모델에 넣으면 [0.12, -0.88, 0.34, ...] 이런 식으로 512개나 768개쯤 되는 숫자 묶음이 나와요. 이 숫자들은 그냥 아무 숫자가 아니라, 그 이미지의 '의미'를 좌표로 표현한 거예요. 비유하자면, 세상의 모든 이미지를 거대한 지도 위의 한 점으로 찍는다고 보면 돼요. 그러면 고양이 사진들끼리는 지도에서 가까운 곳에 모이고, 자동차 사진들은 저 멀리 다른 동네에 모이게 되는 거죠.
가까우면 비슷하다, 그게 전부예요
핵심 동작 원리는 의외로 단순해요. 두 이미지가 '얼마나 비슷한가'를 알고 싶으면, 두 벡터 사이의 거리나 각도를 재면 돼요. 보통 코사인 유사도(cosine similarity)라는 걸 쓰는데, 이게 뭐냐면 두 벡터가 같은 방향을 가리킬수록 1에 가깝고, 정반대면 -1에 가까워지는 값이에요. 그러니까 "이 사진이랑 가장 비슷한 사진 10개 찾아줘"는 결국 "내 벡터랑 코사인 유사도가 가장 높은 벡터 10개 골라줘"라는 계산으로 바뀌는 거예요.
글에서는 이 벡터들을 실제로 뽑아서 2차원 평면에 점으로 흩뿌려 보는 시각화를 해요. 768차원짜리 벡터를 사람 눈으로 볼 수 있게 2차원으로 납작하게 누르는 건데(UMAP이나 t-SNE 같은 기법을 써요), 그러면 신기하게도 비슷한 종류의 이미지들이 알아서 무리를 지어 모여 있는 게 눈에 보여요. 아무도 "이건 강아지야"라고 라벨을 안 붙였는데도 모델이 스스로 비슷한 것끼리 묶어둔 거예요.
더 재미있는 건, 이미지뿐 아니라 텍스트도 같은 공간에 넣을 수 있다는 점이에요. CLIP 같은 모델은 "노을 지는 바다"라는 글자와 실제 노을 사진을 거의 같은 좌표에 찍어줘요. 그래서 글로 검색하면 그 뜻에 맞는 사진이 튀어나오는, 우리가 흔히 쓰는 '의미 기반 검색(semantic search)'이 가능해지는 거죠.
업계에서는 이미 핵심 부품
이 비전 임베딩은 요즘 AI 서비스의 숨은 일꾼이에요. 쇼핑몰의 '이 옷이랑 비슷한 상품' 추천, 사진첩 앱의 자동 분류, 중복 이미지 검출, 그리고 요즘 뜨거운 RAG(검색 증강 생성)의 이미지 버전까지 다 이 원리를 써요. 벡터 데이터베이스(Pinecone, Qdrant, pgvector 같은 것들)가 우후죽순 생겨난 것도, 결국 이 임베딩 벡터를 빠르게 저장하고 '가까운 점 찾기'를 잘하기 위해서거든요.
예전 방식과 비교하면 차이가 확 느껴져요. 옛날엔 이미지를 분류하려면 '고양이/강아지/자동차' 카테고리를 사람이 정해두고 일일이 학습시켜야 했어요. 그런데 임베딩 방식은 카테고리를 미리 안 정해도, 그냥 벡터 공간에 던져두고 거리만 재면 되니까 훨씬 유연해요. 새로운 종류가 들어와도 다시 학습할 필요가 없죠.
한국 개발자에게
좋은 소식은, 이걸 시작하는 데 GPU 농장이 필요 없다는 거예요. 오픈소스 모델(CLIP, DINOv2 등)과 pgvector 같은 도구만 있으면 노트북에서도 충분히 따라 해볼 수 있어요. 사내에 쌓인 상품 이미지나 문서 스캔본으로 '비슷한 것 찾기' 프로토타입을 만들어보면, 임베딩이 추상적인 개념에서 손에 잡히는 도구로 바뀌는 경험을 하실 거예요.
핵심 한 줄: 임베딩은 '의미를 좌표로 바꾸는 기술'이고, 한번 좌표가 되면 검색·분류·추천이 전부 거리 계산 문제로 단순해져요. 여러분의 서비스에 쌓인 데이터 중에, 이 '비슷한 것 찾기'로 풀 수 있는 문제가 혹시 있지 않나요?
🔗 출처: Hacker News
"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"
실제 수강생 후기- 비전공자도 6개월이면 첫 수익
- 20년 경력 개발자 직강
- 자동화 프로그램 + 소스코드 제공