내가 보려고 만든 블로그
<Recommendation> AE 관련 모델 ( AE , CDAE , Mult-VAE ) 본문
Auto Encoder
Auto Encoder 느 input을 output이 모방하도록, input = output이 되도록 학습시키는 방법이다. 똑같은 output을 만들어내는 과정에서 학습된 latent vector를 사용하는 것으로. MF와 매우 유사하지만 비선형적으로 latent vector를 학습시키는 방법이라고 볼 수 있다.
추천에서는 user가 Item들에 대해 보인 implicit 정보를 다시 그대로 복원하도록 하는 방식으로 학습을 시킨다.
CDAE ( Collaborative Denoising Autoencoder)
기존 autoencoder 모델과 같이 input을 그대로 복원하는 모델이나 의도적으로 input에 noise를 추가하는 방식이다.
예를 들어 , input = [1,0,0,1,0] 을 통해 output = [1,0,0,1,0] 를 예측하도록하는 기존의 auto_encoder 방식에서 의도적으로
input = [0,0,0,1,0] -> output = [1,0,0,1,0] 을 예측하도록 하는 방식이다. 이렇게 일부로 noise를 추가하는 방법이 모델을 더 robust하게 만들어준다고 한다. 구현부분에서 auto encoder 와 조금 다른 점은 유저에 해당하는 임베딩 벡터를 추가로 넣어 준다.
위 그림에서 밝은 녹샌부분의 matrix = ( user가 Item에 반응한 implicit 정보 ) + (해당 유저의 임베딩) 으로 구해지는 것을 확인할 수 있다.
MultVAE
Autoencoder와 vae는 사실 매우 비슷하게 생겻지만 사실 그 결은 매우 다르다.
사실 Vae의 경우에는 처음 접한다면 정말 복잡하고 꽤 어려운 모델이기 때문에 깊게 설명하면 글이 너무 길어지니 간단히 설명하자면
Autoencode의 경우 잠재 벡터가 고정적으로 표현되는것과 달리 vae의 경우 분포의 형태로 표현된다고 볼 수 있다. ( 베이지안 approach) 여기서 분포는 흔히 정규분포를 가정한다. 기존에 autoencoder가 hidden_dimension의 크기 만큼 차원을 가지고 해당 차원에서 한 점을 표현했다면 vae는 hidden_dimension 만큼의 정규분포를 가정하고 각 정규분포에서 나온 임의의 값을 표현한다고 보면 되겠다.
input으로 들어간 벡터가 어떤 정규분포를 따르도록 학습되고 이 정규분포를 통해 생성된 벡터가 다시 input과 같도록 학습하는 것이 목표이다.
조금 어려운 점은 정규분포에서 샘플링을 통해 다시 벡터를 복원하는 과정에서 실제로 샘플링을 한다면 그라디언트를 계산할 수가 없어진다. 그래서 샘플링을 구현하기 위해 평균과 분산의 값을 가지는 각각의 matrix를 만들어 준 후 epsilon을 랜덤하게 만들어주어
u + epsilon * 표준편차 의 형식으로 정규분포에서 샘플링한 것과 같은 방식으로 구현을 해준다.
그래서 x가 관측 됬을때 세타에 대한 likelihood를 전개해보면 빨 ,파 ,초 형태로 분리 되는데
이는 다시 [ 빨간색 (reconstruction error) - 파란색 (kl- term) ] 을 최대로 하면 되면 부등식으로 바뀌게 된다.
추가로 구현 부분에서 KL_loss 가 그대로 들어가는 것이 아니라 KL_loss * beta 형태로 loss가 더해지는데 KL Annealing 이라하여 posterior collapse를 막기 위함이다.
https://github.com/todtjs92/Search_and_Recommendation/tree/master/AE_based_model
'Recommendation > 모델링' 카테고리의 다른 글
<Recommendation> Matrix Factorization 부터 Deepmf , DCN, wide&deep 까지 (0) | 2022.09.13 |
---|---|
<Recommendation> BPR , Bayesian Personalized Ranking 구현 (0) | 2022.08.16 |
<Recommendation> MF , Biased_MF 구현 (0) | 2022.07.23 |
Collaborative Filtering (user) 구현 (0) | 2022.07.11 |
Surprise 모듈들 간단 정리 (0) | 2022.06.24 |