[RecSys] Recommender System with GNN 2 (NGCF : Neural Graph Collaborative Filtering, Light GCN)

mincheol2·2022년 3월 15일
0

RecSys

목록 보기
17/23
post-thumbnail

이 글은 부스트캠프 AI Tech 3기 강의를 듣고 정리한 글입니다.

NGCF

Neural Graph Collaborative Filtering 논문 링크

NGCF은 유저-아이템 상호작용(Collaborative Signal)을 GNN으로 임베딩 과정에서 인코딩하는 접근법을 제시한 논문으로 처음으로 GCN이 추천문제를 잘 풀 수 있다는 공헌을 한 논문이다.

이전의 학습가능한 CF 모델(MF같은)은 유저와 아이템의 임베딩, 상호작용의 선형적 모델링의 특징을 가지고 있었다.
신경망을 적용한 기존 CF모델들을 유저-아이템의 상호작용을 임베딩 단계에서 접근하지 못하였는데 Latent Factor 추출을 interaction function에만 의존하기 때문에 sub-optimal한 임베딩을 사용하였기 때문이다.
이는 부정확한 추천의 원인이 될 수 있다.


NGCF의 기본적인 아이디어는 GCN을 통해 High-order Connectivity(경로가 1보다 큰 연결)를 임베딩 하는 것이다. 이는 유저 아이템 개수가 많아질수록 모든 상호작용을 표현하기엔 한계가 존재하였기 때문이다.

그림예시를 통해 이해해 보도록 하자.

위 그림은 단순히 유저와 아이템의 상호작용 그래프를 나타낸 것으로 u1u_1i1,i2,i3i_1,i_2,i_3을 소비한 것을 알 수 있다.(Node : 유저 or 아이템 / Edge : 소비함을 의미)

이런식으로 자료구조를 생성하게 되면 유저와 아이템이 많아질 수록 모든 상호작용을 표현하기 어렵다는 한계점이 존재한다.


첫번째 그래프의 문제점을 해결하기 위해 다음과 같이 High-order Connectivity로 구성한다.
그림은 u1u_1이 소비한 아이템이 i1,i2,i3i_1,i_2,i_3 일 때 High-order Connectivity를 나타낸 것으로 ll은 길이를 나타낸다.
l=1l = 1 은 다이렉트로 연결된 edge가 1개
l=2l = 2i1,i2,i3i_1,i_2,i_3 를 소비한 u2,u3u_2,u_3로 확장
l=3l = 3u2,u3u_2,u_3 가 소비한 i4,i5i_4,i_5로 확장 함을 보여준다.

그림에서 표시한 번호는 다음과 같은 의미를 가진다.

  1. u1,u2u_1,u_2i2i_2를 가지고 상호작용 -> u1u_1u2u_2 높은 유사도를 가짐
  2. u2u_2가 소비한 i4,i5i_4,i_5의 signal이 u1u_1에게 전달되어 i4,i5i_4,i_5 가 추천될 확률이 높아짐
  3. u2,u3u_2,u_3 모두 i4i_4를 가지고 있으므로 u1u_1에는 최종적으로 i4i_4가 2번 전달되어 i4i_4의 추천확률이 높아짐



NGCF 구조

NGCF는 총 3가지 레이어로 이루어져 있다.

  1. 임베딩 레이어(Embedding Layer)
    : 유저 - 아이템의 초기 임베딩 제공(기존 NCF와 동일)

  2. 임베딩 전파 레이어(Embedding Propagation Layer)
    : (★가장 중요★) high-order connectivity 학습

  3. 유저-아이템 선호도 예측 레이어(Prediction Layer)
    :서로 다른 전파 레이어에서 refine된 임베딩 concat

각 레이어 별로 어떤 일을 하는지 자세히 알아보자.


임베딩 레이어(Embedding Layer)

임베딩 레이어에서는 다음과 같이 각 유저와 아이템에 대한 임베딩을 생성한다.

E=[eu1,,euNusers embeddings ,ei1,,eiMitem embeddings ]\mathbf{E}=[\underbrace{\mathbf{e}_{u_{1}}, \cdots, \mathbf{e}_{u_{N}}}_{\text {users embeddings }}, \underbrace{\mathbf{e}_{i_{1}}, \cdots, \mathbf{e}_{i_{M}}}_{\text {item embeddings }}]
( eu\mathbf{e}_{u} : 유저 uu 에 대한 임베딩, ei\mathbf{e}_{i} : 아이템 ii 에 대한 임베딩)


MF, NCF 같은 기존의 CF 모델에서는 임베딩을 곧바로 interaction function에 입력되었지만, NGCF에서는 이 임베딩을 바로 사용하지 않고 GNN 상에서 전파시켜 refine한다.

이는 Collaborative Signal을 명시적으로 임베딩 레이어에서 주입하기 위한 과정이다.

임베딩 전파 레이어(Embedding Propagation Layer)

임베딩 전파 레이어는 생성된 임베딩을 전파시키는 레이어로 유저-아이템의 Collaborative signal을 담을 message를 구성하고 결합하는 단계이다.

수식으로 어떻게 전개되는지 살펴보자.

  • Message Construction
    : 유저-아이템 간 affinity를 고려할 수 있도록 메시지를 구성 (weight sharing)
    mui=1NuNi(W1ei+W2(eieu))\mathbf{m}_{u \leftarrow i}=\frac{1}{\sqrt{\left|\mathcal{N}_{u}\right|\left|\mathcal{N}_{i}\right|}}\left(\mathbf{W}_{1} \mathbf{e}_{i}+\mathbf{W}_{2}\left(\mathbf{e}_{i} \odot \mathbf{e}_{u}\right)\right)
    ( W1,W2W_{1}, W_{2} : weight matrix / \odot : element-wise production Nu,Ni\mathcal N_{u}, \mathcal N_{i} : 유저, 아이템의 이웃한 유저,아이템 집합 )

    mui\mathbf{m}_{u\leftarrow i}ii(아이템) 에서 uu(유저)로 전달되는 메시지를 의미한다 (mui\mathbf{m}_{u\leftarrow i} 은 Message Aggregation에서 합쳐저 최종 유저 임베딩을 구함).
    1NuNi\frac{1}{\sqrt{\left|\mathcal{N}_{u}\right|\left|\mathcal{N}_{i}\right|}} 은 이웃노드(유저,아이템)의 갯수로 나눠주는 것을 의미하는데 유저 uu를 기준으로 연결된 아이템이 많을수록 시그널은 점점 커지기 때문에 Normalization 하는 것이다.


  • Message Aggregation
    : uu 의 이웃 노드로부터 전파된 message들을 결합하면 1-hop 전파를 통한 임베딩 완료
    eu(1)=LeakyReLU(muu+iNumui)\mathbf{e}_{u}^{(1)}=\operatorname{LeakyReLU}\left(\mathbf{m}_{u \leftarrow u}+\sum_{i \in \mathcal{N}_{u}} \mathbf{m}_{u \leftarrow i}\right)
    유저기준으로 유저는 여러개 아이템과 상호작용 하기 때문에 Message(mui\mathbf{m}_{u\leftarrow i})는 여러개가 되어 eu(1)\mathbf{e}_{u}^{(1)}로 Aggregation된다. Aggregation은 자기자신으로부터 전달되는 메시지muu\mathbf{m}_{u \leftarrow u} 와 위에서 계산한 인접 노드들의 메시지의 합 iNumui\sum_{i \in \mathcal{N}_{u}} \mathbf{m}_{u \leftarrow i}을 더한 것에 LeakyReLU를 통과시킨 형태이다.
    이때 eu(1)\mathbf{e}_{u}^{(1)} 에서 1이 뜻하는 것은 첫번째 전파 layer라는 뜻이다.

이번엔 eu(1)\mathbf{e}_{u}^{(1)} 의 1을 ll로 바꿔서 생각해보자(Layer를 쌓아보자)

ll개의 임베딩 전파레이어를 쌓으면, 유저 노드는 ll-차 이웃으로부터 전파된 메시지를 이용 가능하다.
이때 ll 단계에서 유저 uu의 임베딩은 (l1)(l-1)단계의 임베딩을 통해 재귀적으로 형성한다(임배딩이 여러개 쌓이기 때문에 High Order Conectivity이다).

재귀적으로 형성되는 수식은 다음과 같이 점화식으로 표현이 가능하다.

eu(l)=LeakyReLU(muu(l)+iNumui(l))\mathbf{e}_{u}^{(l)}=\operatorname{LeakyReLU}\left(\mathbf{m}_{u \leftarrow u}^{(l)}+\sum_{i \in \mathcal{N}_{u}} \mathbf{m}_{u \leftarrow i}^{(l)}\right) \\ \\

이떄 muu(l)\mathbf{m}_{u \leftarrow u}^{(l)}mui(l)\mathbf{m}_{u \leftarrow i}^{(l)}는 다음과 같이 구해진다.

{mui(l)=pui(W1(l)ei(l1)+W2(l)(ei(l1)eu(l1))),muu(l)=W1(l)eu(l1)\{\begin{array}{l} \mathbf{m}_{u \leftarrow i}^{(l)}=p_{u i}\left(\mathbf{W}_{1}^{(l)} \mathbf{e}_{i}^{(l-1)}+\mathbf{W}_{2}^{(l)}\left(\mathbf{e}_{i}^{(l-1)} \odot \mathbf{e}_{u}^{(l-1)}\right)\right), \\ \mathbf{m}_{u \leftarrow u}^{(l)}=\mathbf{W}_{1}^{(l)} \mathbf{e}_{u}^{(l-1)} \end{array}

ll이 3일때의 그림은 다음과 같다.



선호도 예측 레이어(Prediction Layer)

선호도 예측 레이어는 다음의 식과 같이 LL차 까지의 임베딩 벡터를 concat하여 최종 임베딩 벡터를 계산한 후, 유저-아이템 벡터를 내적하여 최종 선호도 예측값을 계산한다.

eu=eu(0)eu(L),  ei=ei(0)ei(L)( 는 concat 연산자) y^NGCF(u,i)=euei.\begin{gathered} \mathbf{e}_{u}^{*}=\mathbf{e}_{u}^{(0)}\|\cdots\| \mathbf{e}_{u}^{(L)}, \ \ \quad \mathbf{e}_{i}^{*}=\mathbf{e}_{i}^{(0)}\|\cdots\| \mathbf{e}_{i}^{(L)} \\ (\| \text { 는 concat 연산자) } \\ \\ \hat{y}_{\mathrm{NGCF}}(u, i)=\mathbf{e}_{u}^{* \top} \mathbf{e}_{i}^{*} . \end{gathered}

eu와  ei\mathbf{e}_{u}^{*}와 \ \ \mathbf{e}_{i}^{*}는 차원이 같기 때문에 내적이 가능하다.

결과 및 요약

다음의 표는 각 데이터 셋마다 Embeeding Probagation Layer 개수에 따른 성능(recall, ndcg)를 나타낸 표이다.

표에서 볼 수 있듯이 임베딩 전파 레이어가 많아질수록 모델의 추천 성능이 향상되었는데, 다만 너무 많이 쌓이면 overfitting이 발생 할 수 있기 때문에 논문에서는 실험결과 3~4개의 Layer를 쌓았을 때 가장 좋은 성능을 보인다고 한다.

임베딩 학습과 유저-아이템 상호작용이 분리되어 있기 때문에 MF보다 더 빠르게 수렴하고 recall도 높다.
이는 Model Capacity가 크고 임베딩 전파를 통해 representation power가 좋아졌기 때문이다.


시각화 그림을 보면 MF와 비교하였을 때 유저-아이템이 임베딩 공간에서 더 명확하게 구분됨을 알 수 있다.




LightGCN

Light GCN 논문

LightGCN은 GCN의 가장 핵심적인 부분만 사용하여 더 정확하고 가벼운 추천모델을 제시한 논문이다.

LightGCN의 아이디어는 두가지이다.

  • Light Graph Convolution
    : 이웃 노드의 임베딩을 가중합 하는 것이 Conv의 전부 -> 학습 파라미터 , 연산량 대폭 감소
    <-> NGCG : 임베딩 전파 레이어에서 Conv시 매번 학습파라미터 WW를 임베딩에 곱하고 LeakyReLU 사용

  • Layer Combination
    : 레이어가 깊어질수록 강도가 약해질 것이라는 아이디어를 적용해 모델을 단순화

Light GCN 구조 (vs NGCF)

그림으로 비교해보면 다음과 같다.

집중적으로 봐야할 곳은 임베딩 전파 레이어인데 LightGCN은 단순 가중합으로 Convolution을 진행하고 있다.
또한 Prediction Layer에서는 NGCF가 concat을 하여 내적한 것과 다르게 단순 weighted sum을 하였다.
이 두가지를 통해 Light GCN은 연산량을 크게 줄일 수 있었다.

이제 수식을 통해 어떤 변화가 있는지 알아보자.

Propagation Rule (vs NGCF)

 <기존 NGCF 임베딩 벡터>   < LightGCN 임베딩 벡터 > eu(k+1)=σ(W1eu(k)+iNu1NuNi(W1ei(k)+W2(ei(k)eu(k)))),eu(k+1)=iNu1NuNiei(k),ei(k+1)=σ(W1ei(k)+uNi1NuNi(W1eu(k)+W2(eu(k)ei(k)))),ei(k+1)=uNi1NiNueu(k).\begin{aligned} &\quad\quad\quad\quad\quad\quad\quad\quad\quad\text { <기존 NGCF 임베딩 벡터> } \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\ \text { < LightGCN 임베딩 벡터 > }\\ &\mathbf{e}_{u}^{(k+1)}=\sigma\left(\mathbf{W}_{1} \mathbf{e}_{u}^{(k)}+\sum_{i \in \mathcal{N}_{u}} \frac{1}{\sqrt{\left|\mathcal{N}_{u}\right|\left|\mathcal{N}_{i}\right|}}\left(\mathbf{W}_{1} \mathbf{e}_{i}^{(k)}+\mathbf{W}_{2}\left(\mathbf{e}_{i}^{(k)} \odot \mathbf{e}_{u}^{(k)}\right)\right)\right), \quad \mathbf{e}_{u}^{(k+1)}=\sum_{i \in \mathcal{N}_{u}} \frac{1}{\sqrt{\left|\mathcal{N}_{u}\right|} \sqrt{\left|\mathcal{N}_{i}\right|}} \mathbf{e}_{i}^{(k)},\\ &\mathbf{e}_{i}^{(k+1)}=\sigma\left(\mathbf{W}_{1} \mathbf{e}_{i}^{(k)}+\sum_{u \in \mathcal{N}_{i}} \frac{1}{\sqrt{\left|\mathcal{N}_{u}\right|\left|\mathcal{N}_{i}\right|}}\left(\mathbf{W}_{1} \mathbf{e}_{u}^{(k)}+\mathbf{W}_{2}\left(\mathbf{e}_{u}^{(k)} \odot \mathbf{e}_{i}^{(k)}\right)\right)\right), \quad \mathbf{e}_{i}^{(k+1)}=\sum_{u \in \mathcal{N}_{i}} \frac{1}{\sqrt{\left|\mathcal{N}_{i}\right|} \sqrt{\left|\mathcal{N}_{u}\right|}} \mathbf{e}_{u}^{(k)} . \end{aligned}

수식에서 볼 수 있듯이 LightGCN 임베딩 벡터는 Feature transformation이나 nonlinear activation function을 제거하고 가중합으로 GCN을 적용한다.
이때 단순히 연결된 노드만 사용하였기 때문에 self-connection이 없는 것을 볼 수 있다 (eu\mathbf{e}_{u} 를 구할 때 eu\mathbf{e}_{u}를 사용하지 않고 ei\mathbf{e}_{i}만을 이용; 유저의 경우 연결된 아이템만 사용).

Prediction Layer (vs NGCF)

최종 예측을 위한 각 레이어의 임베딩을 결합하는 방법도 NGCF와 다르다.

<기존NGCF최종임베딩벡터>eu=eu(0)eu(L),ei=ei(0)ei(L)< 기존 NGCF 최종 임베딩 벡터 >\\ \\ \mathbf{e}_{u}^{*}=\mathbf{e}_{u}^{(0)}\|\cdots\| \mathbf{e}_{u}^{(L)}, \quad \mathbf{e}_{i}^{*}=\mathbf{e}_{i}^{(0)}\|\cdots\| \mathbf{e}_{i}^{(L)}



<LightGCN최종임베딩벡터>eu=k=0Kαkeu(k);ei=k=0Kαkei(k)< LightGCN 최종 임베딩 벡터 >\\ \mathbf{e}_{u}=\sum_{k=0}^{K} \alpha_{k} \mathbf{e}_{u}^{(k)} ; \quad \mathbf{e}_{i}=\sum_{k=0}^{K} \alpha_{k} \mathbf{e}_{i}^{(k)}

LightGCN 최종 임베딩 벡터는 kk-층으로 된 레이어의 임베딩을 각각 αk\alpha_k배 하여 가중합으로 최종 임베딩 벡터를 계산한다.
이때 αk\alpha_k는 임베딩 벡터의 가중치인데, 학습파라미터로 설정해도 되고 하이퍼파라미터로 설정해도 괜찮다.(별차이는 없기 때문에 학습파라미터를 최대한 줄이는 의미에서 하이퍼파라미터로 설정한다.)
논문에서는 αk=\alpha_k= (k+1)1(k+1)^{-1}로 설정 하였는데 이는 깊어질수록(멀어질수록) 가중치는 작아진다는 의미이다.

결과 및 요약

학습을 통한 손실함수와 추천성능 모두 NGCF보다 뛰어나다.
training loss가 낮으면서 추천성능이 좋기 때문에 모델의 generalization power가 크다는 것을 나타낸다.

모델구조를 단순화 하였지만 Convolution이라는 핵심 아이디어는 놓치지 않았기 때문에 정보를 잘 압축하여 성능을 향상 시킨 것으로 볼 수 있다.

LightGCN은 네이버, 왓챠에서 활용된다고 한다.

profile
옹오옹오오오옹ㅇㅇ

0개의 댓글