임베딩 모델이 있다고 가정해 보겠습니다. 사용자를 고려하여 어떤 항목을 추천해야 할지 어떻게 결정하나요?
서빙 시간에 특정 쿼리가 주어지면 다음 중 하나를 실행합니다.
- 행렬 분해 모델의 경우 쿼리(또는 사용자) 임베딩은 정적으로 알려져 있으며, 시스템은 사용자 임베딩 행렬에서 쿼리(또는 사용자) 임베딩을 간단히 조회할 수 있습니다.
- DNN 모델의 경우 시스템은 특성 벡터 \(x\)에서 네트워크를 실행하여 제공 시점에 쿼리 임베딩 \(\psi(x)\)을 계산합니다.
쿼리 임베딩 \(q\)이 있으면 임베딩 공간에서 \(q\) 에 가까운\(V_j\) 항목 임베딩을 검색합니다. 이는 최근접 이웃 문제입니다. 예를 들어 유사성 점수 \(s(q, V_j)\)에 따라 상위 k개 항목을 반환할 수 있습니다.
관련 상품 추천에도 비슷한 접근 방식을 사용할 수 있습니다. 예를 들어 사용자가 YouTube 동영상을 시청하는 경우 시스템은 먼저 해당 항목의 임베딩을 조회한 다음 임베딩 공간에서 가까운 다른 항목\(V_j\) 의 임베딩을 찾을 수 있습니다.
대규모 검색
임베딩 공간에서 최근접 이웃을 계산하기 위해 시스템은 모든 잠재적 후보에 대해 철저하게 점수를 매길 수 있습니다. 매우 큰 코퍼스의 경우 포괄적인 점수가 비용이 많이 들 수 있지만 다음 전략 중 하나를 사용하여 더 효율적으로 만들 수 있습니다.
- 쿼리 임베딩이 정적으로 알려진 경우 시스템은 포괄적인 점수를 오프라인으로 실행하여 각 쿼리의 상위 후보 목록을 미리 계산하고 저장할 수 있습니다. 이는 관련 항목 추천에 일반적으로 사용되는 방법입니다.
- 근사 최근접 이웃을 사용합니다. Google은 GitHub에서 ScaNN(확장 가능한 근접 이웃)이라는 오픈소스 도구를 제공합니다. 이 도구는 대규모로 효율적인 벡터 유사성 검색을 실행합니다.