POOOLING FOREST
인기 없는 웹사이트 100만 개를 지도로 그려보며 배운 것들 (Feat. SOM) - 인기 없는 100만 개의 웹사이트를 SOM 알고리즘으로 시각화하며 배운 기술적 통찰과, 문제 본질에 맞는 적
Engineering & Tech

인기 없는 웹사이트 100만 개를 지도로 그려보며 배운 것들 (Feat. SOM)

인기 없는 100만 개의 웹사이트를 SOM 알고리즘으로 시각화하며 배운 기술적 통찰과, 문제 본질에 맞는 적절한 도구 선택의 중요성에 대해 공유합니다.

김테크

8년차 개발자

안녕하세요. 풀링포레스트 풀스택 개발자 김테크입니다.

얼마 전 인터넷 서핑을 하다가 우연히 onemillionscreenshots.com이라는 사이트를 발견했습니다. 말 그대로 웹사이트 100만 개의 스크린샷을 모아놓은 곳인데, 표지만 보고 책을 판단하지 말라는 격언이 무색하게도, 꽤 훌륭한 탐색 도구였습니다. 하지만 한 가지 아쉬운 점이 있었습니다. 이 프로젝트가 수집한 대상이 커먼 크롤(Common Crawl) 기반의 '가장 인기 있는' 웹사이트들이었다는 점입니다.

솔직히 말해, 인기와 품질이 항상 비례하는 건 아닙니다. 맥도날드가 세계에서 가장 맛있는 치즈버거를 팔아서 1등이 된 게 아니잖아요? 가장 많은 사람에게 '최소한의 만족'을 줄 수 있는 지점, 즉 이익을 극대화하는 지역적 최적점(Local Maxima)을 찾았기 때문이죠. NYT 베스트셀러나 스포티파이 Top 50도 마찬가지입니다. 오히려 저에게 '인기'란, 피해야 할 것을 걸러내는 필터에 가깝습니다. 그래서 저는 수익화와 클릭률 경쟁에서 벗어난 인터넷의 청정 구역, 일명 '스몰 웹(Small Web)'에 주목했습니다.

마침 저는 스몰 웹을 탐색하는 도구를 개발 중이었고, 데이터는 이미 충분했습니다. 문제는 이 수많은 스크린샷을 어떻게 시각적으로 의미 있게 배치하느냐였습니다. 단순히 그리드로 나열하는 건 재미없으니까요. 그래서 시각적 임베딩(Visual Embedding)을 만들고, 차원 축소를 거쳐, 2차원 평면에 할당하는 과정을 거치기로 했습니다. 이 과정에서 저는 꽤 오래된 기술인 자기 조직화 지도(Self-Organizing Maps, SOM)를 꺼내 들었습니다.

최신 딥러닝 기법이 난무하는 시대에 웬 SOM이냐고 하실 수 있겠지만, 구현이 정말 간단하면서도 강력합니다. 파이토치(PyTorch)로 짜면 핵심 로직이 10줄도 안 됩니다. 원리는 단순합니다. 무작위 샘플을 고르고, 지도상의 모든 노드와 비교해 가장 유사한 녀석(BMU, Best Matching Unit)을 찾습니다. 그리고 그 BMU와 주변 이웃들을 샘플 쪽으로 살짝 당겨오는 겁니다. 마치 고무판 위의 점들을 데이터 분포에 맞춰 잡아당기는 것과 비슷하죠.

하지만 진짜 난관은 '무엇을 기준으로' 유사하다고 판단할 것인가였습니다. 처음에는 메타(Meta)의 최신 모델인 DinoV3를 사용해봤습니다. 그런데 결과가 실망스러웠습니다. 모델이 너무 똑똑했던 탓입니다. 저는 웹사이트의 전반적인 '미학'이나 '레이아웃'을 보고 싶은데, DinoV3는 이미지 속의 객체가 무엇인지(강아지인지 고양이인지)를 너무 잘 파악해버렸습니다. 제가 원하는 건 의미론적 정보가 아니라, "이 사이트가 주는 시각적 느낌"이었습니다.

그래서 저는 거창한 모델을 버리고, 오히려 아주 작은 인코더 모델에 Triplet Loss를 적용하는 방식으로 돌아갔습니다. 출력 차원도 64로 확 줄였죠. 이렇게 하니 제가 원하던 시각적 느낌이 잡히기 시작했습니다. 하지만 여전히 부족했습니다. 저는 비슷한 색감의 사이트끼리 모이길 원했는데, 모델은 형태에 더 집착했거든요.

결국 저는 두 개의 SOM을 병렬로 돌리는 전략을 택했습니다. 하나는 시각적 구조(Visual Encoder)를, 다른 하나는 색상 분포(Color Distribution)를 담당하게 했습니다. 그리고 학습 초기에는 색상 분포가 큰 틀(매크로)을 잡도록 하고, 세부적인 배치(마이크로)는 시각적 구조가 결정하도록 가중치를 조절했습니다. 결과적으로 전체적인 색감이 무지개처럼 펼쳐지면서도, 들여다보면 비슷한 레이아웃을 가진 사이트들이 옹기종기 모여 있는 지도가 완성되었습니다.

이번 작업을 하면서 뼈저리게 느낀 점이 있습니다. 우리는 종종 최신 기술, 가장 큰 모델, 가장 인기 있는 데이터셋에만 매몰되곤 합니다. 하지만 때로는 수십 년 된 알고리즘(SOM)이나 작은 모델이 훨씬 더 우아하고 효율적인 해결책이 될 수 있습니다. 마치 자전거가 발명된 지 오래되었지만 여전히 훌륭한 이동 수단인 것처럼 말이죠.

개발자로서 '최신'을 쫓는 것도 중요하지만, 문제의 본질에 맞는 '적절한' 도구를 선택하는 안목이 더 중요하다는 것을 다시금 깨닫습니다. 여러분도 오늘 하루는 복잡한 트랜스포머 모델 대신, 기본적이지만 강력한 알고리즘들이 주는 단순함의 미학을 느껴보시는 건 어떨까요?

지금 읽으신 내용, 귀사에 적용해보고 싶으신가요?

상황과 목표를 알려주시면 가능한 옵션과 현실적인 도입 경로를 제안해드립니다.