AutoEncoder (for Recommend System)

2024. 2. 19. 13:27ML model/Generative Model

AutoEncoder 구조

 

 

AutoEncoder는 기본적으로 주어진 벡터(이미지)를 가장 잘 표현하는 저차원을 구하기 위한 모델로 이해하면 좋다.

 

즉 encoder를 통해 생성된 compressed representation는 decoder를 통해 원래의 벡터(이미지)로 복원되며, 가장 loss가 적은 최적의 표현이 되도록 학습된다.

 

 

 

추천 시스템에서 AutoEncoder는 어떻게 사용될 수 있을까?

user-item interaction matrix를 생성하여 접근해볼 수 있다.

- 이때 interaction으로 구매 내역, 방문 페이지, 검색 기록 등 Implicit feedback 정보를 사용하기도 한다.

import torch.nn as nn
import torch.nn.functional as F
import torch
import numpy as np 

class AutoEncoder(nn.Module):
    """
    input : encoder_dims

        encoder = [n_items, dim1, dim2]
        decoder_dims = [dim2, dim1, n_items]
    """
    
    def __init__(self, config, encoder_dims, decoder_dims=None): 
        super(AutoEncoder, self).__init__()
        self.encoder_dims = encoder_dims
        if decoder_dims:
            assert decoder_dims[0] == encoder_dims[-1], "In and Out dimensions must equal to each other"
            assert decoder_dims[-1] == encoder_dims[0], "Latent dimension for p- and q- network mismatches."
            self.decoder_dims = decoder_dims
        else:
            self.decoder_dims = encoder_dims[::-1]
        
        self.encoder = self.build_layers(self.encoder_dims, config['activate_function'])
        self.decoder = self.build_layers(self.decoder_dims, config['activate_function'])

    def build_layers(self, dims, activate_function = 'ReLU'):
        """
        Helper function to build layers based on the provided dimensions.

        Parameters:
            - dims (list): List of dimensions for the layers.

        Returns:
            - nn.Sequential: Sequential container for the layers.
        """
        layers = []
        for i in range(1, len(dims)):
            layers.append(nn.Linear(dims[i-1], dims[i]))
            if i == len(dims)-1:
                pass
            else:
                if activate_function == 'ReLU':
                    layers.append(nn.ReLU())
                elif activate_function == 'Sigmoid':
                    layers.append(nn.Sigmoid())
                elif activate_function == 'Tanh':
                    layers.append(nn.Tanh())
                else:
                    pass

        return nn.Sequential(*layers)
        
    def forward(self, input):
        h = F.normalize(input)

        h = self.encoder(h)
        h = self.decoder(h)
        
        return h
  
    def get_codes(self, x):
        return self.encoder(x)

 

 

'ML model > Generative Model' 카테고리의 다른 글

Variational AutoEncoder(VAE, Multi-VAE)  (0) 2024.02.21
Denoising AutoEncoder(DAE, Multi-DAE)  (0) 2024.02.19