[Facebook 추천 시스템: DLRM] Deep Learning Recommendation Model for Personalization and Recommendation Systems

2020. 6. 30. 02:04Research

이번 포스팅에서는 2019년 페이스북에서 나온 추천 시스템 논문인 DLRM을 다룬다. 

 

Introduction

기존 personalization 및 recommendation 태스크에서 딥러닝이 활용된 연구들을 살펴보면 크게 두 부류로 구분할 수 있다.

 

1. 추천 시스템

  • 가장 원시적인 추천 시스템에서는 몇몇 전문가들이 상품들을 몇 개의 카테고리로 묶은 뒤, 유저들이 기호에 따라 카테고리를 선택하도록 하는 방식을 사용하였다.
  • 이것이 발전되어서 만들어진 것이 과거의 유저의 행동(상품을 장바구니에 넣는다든지, 구독을 한다든지, 좋아요를 누른다든지...)에 기반하여 추천을 하는 CF(collaborative filtering) 기법이다.
  • 그 밖에도 유저와 연관성이 높은 상품을 함께 grouping하여 추천을 하는 neighborhood method, 행렬 분해를 통해 유저와 상품을 latent vector로 표현하여 활용하는 방법 등이 존재한다.

 

2. Predictive Analysis

  • 주어진 데이터를 기반으로 확률을 예측하는 방법이다.
  • 과거에는 간단하게 linear regression, logistic regression 정도를 활용하였다.
  • 카테고리 데이터를 처리하기 위해서 one-hot, 또는 multi-hot 벡터를 dense representation으로 임베딩하여 사용한다.
  • word2vec 등에서 단어 임베딩을 통해 단어의 유사도와 같은 의미상 특징을 벡터 공간상에서 표현하듯이 상품의 특징, 유저의 특징 등을 벡터 공간에서 표현할 수 있게 된다. 

 

DLRM은 위에서 살펴본 두 부류의 방법들에서 유용한 부분을 잘 섞어서 만들어졌다.

 

 

Model Design and Architecture

1. DLRM의 구성요소

1.1. Embeddings

추천 시스템에서 왜 임베딩을 사용하는 이유는 NLP에서 워드 임베딩을 사용하는 이유와 동일하다고 볼 수 있다. NLP에서 감정분석, 개체명 인식, 문서 분류와 같은 문제들을 풀기 위해선 분류 대상의 특징을 수학적으로 표현하여 파악해야 한다. NLP 태스크에서 데이터가 되는 corpus를 가지고 word dictionary를 만든 뒤 이를 one-hot 벡터로 표현하면 어떤 단어가 몇 번째 위치에 있다는 것 외에는 아무런 유의미한 정보를 갖지 못한다. 각 단어가 가지는 '의미'를 표현하기 위해서는 해당 단어의 주변 단어들을 통해 그 단어의 의미를 파악해야 하고, 그를 위해 존재하는 것이 임베딩 기법이다. 임베딩을 거친 후에야 비로소 해당 단어에 대한 의미상 특징을 표현하는 dense 벡터를 얻을 수 있다.

 

추천 시스템에서도 마찬가지로 유저들의 리스트, 상품들의 리스트, 어떤 유저가 어떤 상품에 좋아요를 했는지에 대한 리스트 등이 있을 때, 이를 one-hot, multi-hot 벡터로 표현 한다면 의미를 가지지 못한다. 따라서 이러한 정보를 dense represention으로 임베딩할 필요가 있고, 이를 통해서 어떤 categorical feature의 관계적인 특징 등을 입체적으로 파악할 수 있게 된다.

 

DLRM에서는 categorical feature를 dense representation으로 매핑하기 위하여 임베딩 테이블을 활용한다. $W$라는 임베딩 테이블이 있을 때, $i$번째 아이템의 임베딩 벡터를 얻기 위해서는 단순히 $i$번째 인덱스만 1이고 나머지는 0인 one-hot 벡터 $e_i$를 $W$에 내적하기만 하면 된다.

 

 

한 개의 임베딩 벡터가 아니라 여러 개의 임베딩 벡터를 lookup하는 경우에도 마찬가지로 임베딩 테이블 $W$에 multi-hot 벡터 $a$를 내적하기만 하면 된다.

  • $a^T = [0, ..., a_{i_1}, ..., a_{i_k}, ..., 0]$
  • $A = [a_1, ..., a_t]$

 

 

1.2. Matrix Factorization

임베딩 테이블을 통해 얻은 임베딩 벡터를 활용하여 정확한 예측을 하기 위해선 introduction에서 잠시 언급한 latent factor method의 인사이트가 필요하다.

  • $w_i$: $i$번째 상품의 임베딩 벡터
  • $v_j$: $j$번째 유저의 임베딩 벡터
  • $r_{ij}$: $j$번째 유저의 $i$번째 아이템에 대한 평가

 

위와 같은 notation이 주어졌을 때 DLRM에서는 아래의 식을 objective function으로 활용하여 문제를 해결한다.

 

 

식의 의미를 생각해보자.

NLP에서는 두 단어에 대한 임베딩 벡터가 주어졌을 때, 두 벡터를 내적하여 두 단어 간의 의미상 유사도를 구할 수 있다. 마찬가지로 $i$번째 상품에 대한 임베딩 벡터 $w_i$와 $j$번째 유저에 대한 임베딩 벡터 $v_j$를 내적하면 해당 상품과 해당 유저의 연관도를 계산할 수 있다. 상품과 유저 간의 연관도는 곧 유저가 해당 상품을 구매할 확률, 또는 좋은 평가를 내릴 확률이라고 생각할 수 있다.  위의 식에서 $r_{ij}$는 $j$번째 유저가 실제로 $i$번째 상품에 대해 평가한 true label이고, 여기에서 $w_i$와 $v_j$를 내적한 값을 빼면, 실제 유저의 상품 평가와 모델이 예측한 유저의 상품 평가의 오차를 구할 수 있다. 이렇게 구해진 오차를 최소화 하는 방향으로 학습을 하면 유의미한 예측이 가능할 것이라고 생각할 수 있다.

 

 

1.3. Factorization Machine

일반적으로 예측 문제는 입력 데이터 $x \in \mathbb{R}^n$과 타겟 레이블 $y \in T$ 간의 매핑을 표현하는 예측 함수 $\phi: \mathbb{R} \to T$를 구하는 것이라고 할 수 있다. (이 때 클릭 확률을 나타내는 $T$는 $T = \{+1, -1\}$이며, $+1$은 '클릭을 함', $-1$은 '클릭을 하지 않음'을 의미한다.

 

Factorization mahcine(FM)은 유저와 상품 간의 상호작용을 추정하여 유저가 해당 상품을 클릭(또는 구매)할 확률을 예측하는데, 다음과 같은 식을 사용한다.

 

 

FM은 다음과 같은 장점을 갖는다.

 

  1. SVM과는 다르게 sparse data에서도 파라미터 추정이 가능하다.
  2. Linear complexity를 갖고 있기 때문에 효율적이다.

 

1.4. Multilayer Perceptron

딥러닝에서 가장 기본적인 레이어라고 할 수 있는 MLP는 fully connected layer와 활성화 함수 $\sigma: \mathbb{R} \to \mathbb{R}$로 이루어져 있으며, 아래의 식과 같이 표현할 수 있다. ($l$번째 레이어에 대해서 $W_l \in \mathbb{R}^{n_l \times n_{l-1}}$은 가중치 행렬을 나타내고, $b_l \in \mathbb{R}^{n_l}$은 bias를 나타낸다.)

 

 

MLP는 FM을 사용하는 경우보다도 복잡한 상호작용을 파악할 때 효과적이다. 그래서 NCF(Neural Collaborative Filtering)에서는 내적을 통해서 임베딩 벡터 간의 상호작용을 계산하지 않고 MLP를 사용한다.

 

 

2. DLRM Architecture

1.1~1.4에서는 recommendation system과 predictive analytics에서 일반적으로 사용되는 모델들에 대해서 살펴보았다. DLRM은 이러한 모델들에서 사용하는 기법들을 적절히 혼합하여 만들어진 SOTA personalization 모델이다.

 

일반적으로 어떤 대상을 수로 표현하는 경우에 그 대상의 특징을 표현하는 방식은 continuous할 수도 있고, categorical할 수도 있다. Continuous feature는 가격, 나이, 연봉 등과 같이 연속적인 값을 통해 표현되는 특징을 의미하고, categorical feature는 성별, 연령대와 같은 카테고리화된 특징을 의미한다. 추천 시스템에서 유저와 상품을 수로 표현할 때 여러 개의 categorical & continuous feature들로 표현이 되는데, categorical feature인지 continuous feature인지에 따라서 처리하는 방식이 달라진다.

 

  • Categorical feature의 경우, 각 feature는 임베딩을 통해 동일한 차원의 임베딩 벡터로 표현된다.
  • Continuous feature의 경우, 각 feature는 MLP를 통해 임베딩 벡터와 동일한 길이의 dense representation으로 변환된다.

 

위와 같은 방식으로 continuous & categorical feature를 처리하면 각각에 대해 임베딩 벡터와 dense representation을 얻을 수 있는데, 이 둘 간의 상호작용을 계산하기 위해서 내적을 한다.

 

내적을 한 뒤에는 내적을 하여 얻은 결과값 벡터와 내적 이전의 dense feature들을 concat하여 MLP를 거치게 한다. MLP를 거친 결과에 대해 sigmoid를 적용하면 최종 결과 값인 유저가 상품을 클릭할 확률을 얻을 수 있다.

 

아래는 DLRM PyTorch 구현에서의 forward 함수이다. 모델에서 사용하는 각각의 연산들은 Table 1에 제시된 것과 같이 프레임워크 상에서 제공하는 함수를 통해 구현되었다.

 

def sequential_forward(self, dense_x, lS_o, lS_i):
    # process dense features (using bottom mlp), resulting in a row vector
    x = self.apply_mlp(dense_x, self.bot_l)
 
    # process sparse features(using embeddings), resulting in a list of row vectors
    ly = self.apply_emb(lS_o, lS_i, self.emb_l)
  
    # interact features (dense and sparse)
    z = self.interact_features(x, ly)
  
    # obtain probability of a click (using top mlp)
    p = self.apply_mlp(z, self.top_l)

    # clamp output if needed
    if 0.0 < self.loss_threshold and self.loss_threshold < 1.0:
        z = torch.clamp(p, min=self.loss_threshold, max=(1.0 - self.loss_threshold))
    else:
        z = p
 
    return z

 

아래는 배치 크기가 1일 때 DLRM의 forward를 GPU 프로파일링한 결과이다.