Tae Hyun Kim (Lowell)

DeepFM

정의

DeepFM (Guo et al., 2017)은 FM component와 Deep component를 병렬로 결합하여, low-order feature interaction(explicit)과 high-order feature interaction(implicit)을 동시에 학습하는 CTR 예측 모델이다.

y^=σ(yFMlow-order+yDNNhigh-order)\hat{y} = \sigma\big(\underbrace{y_{\text{FM}}}_{\text{low-order}} + \underbrace{y_{\text{DNN}}}_{\text{high-order}}\big)

FM Component (Wide)

Factorization Machine과 동일한 2차 feature interaction:

yFM=w0+i=1nwixi+i=1nj=i+1nvi,vjxixjy_{\text{FM}} = w_0 + \sum_{i=1}^{n} w_i x_i + \sum_{i=1}^{n} \sum_{j=i+1}^{n} \langle \mathbf{v}_i, \mathbf{v}_j \rangle x_i x_j

Deep Component

Dense embedding을 입력으로 받는 feed-forward neural network:

a(0)=[e1,e2,,em]\mathbf{a}^{(0)} = [\mathbf{e}_1, \mathbf{e}_2, \ldots, \mathbf{e}_m] a(l)=ReLU(W(l)a(l1)+b(l))\mathbf{a}^{(l)} = \text{ReLU}(\mathbf{W}^{(l)} \mathbf{a}^{(l-1)} + \mathbf{b}^{(l)}) yDNN=wTa(L)+by_{\text{DNN}} = \mathbf{w}^T \mathbf{a}^{(L)} + b

핵심: Shared Embedding

FM component의 latent vector vi\mathbf{v}_i와 Deep component의 embedding ei\mathbf{e}_i동일한 파라미터를 공유한다. 이를 통해:

  • 두 component가 서로의 학습 신호를 강화
  • Feature engineering 없이 raw feature만으로 end-to-end 학습
  • 파라미터 수 절감

직관적 이해

CTR 예측에서 feature interaction은 두 종류가 있다:

  • Low-order: “남성 + 슈팅게임 → 클릭 확률 높음” — 명시적이고 해석 가능한 2차 조합
  • High-order: “20대 남성 + 금요일 저녁 + 모바일 + 신작 RPG → 클릭” — 여러 feature의 복합적 상호작용

Google의 Wide & Deep은 Wide(memorization) + Deep(generalization) 결합을 제안했지만, Wide 부분에 수동 feature engineering(cross-product)이 필요했다. DeepFM은 Wide를 FM으로 대체하여 자동으로 2차 interaction을 학습하면서, Deep이 고차 interaction을 보완한다.

DeepFM

Mermaid source (click to expand)
> flowchart LR
>     Input["Sparse Input"] --> Emb["Shared Embedding Layer"]
>     Emb --> FM_comp["FM Component<br/>(2nd-order interaction)"]
>     Emb --> DNN["Deep Component<br/>(high-order interaction)"]
>     FM_comp --> Add(("+"))
>     DNN --> Add
>     Add --> Sigmoid["σ(·)"] --> Output["CTR"]
>

Wide & Deep과의 비교

기준Wide & DeepDeepFM
Wide 부분Cross-product (수동 설계)FM (자동 학습)
Feature engineering필수 (전문가 지식)불필요
Embedding 공유Wide/Deep 별도공유
Low-order interaction수동 정의된 조합만모든 2차 조합

FM 계보에서의 위치

모델구조Interaction
Factorization MachineFM onlyexplicit 2차
DeepFMFM + DNN (parallel)explicit 2차 + implicit high-order
xDeepFMCIN + DNNexplicit high-order + implicit high-order
AutoIntSelf-attention + DNNattention-weighted high-order

DeepFM의 한계는 high-order interaction이 DNN의 implicit 학습에만 의존한다는 점이다. xDeepFM은 CIN(Compressed Interaction Network)으로 explicit high-order interaction을 추가하여 이를 보완했다.

장단점

장점:

  • Feature engineering 불필요: raw feature만으로 end-to-end 학습
  • Shared embedding으로 FM과 DNN이 상호 보완적 학습
  • Wide & Deep 대비 일관된 성능 향상 (Criteo, Company 데이터셋)
  • 구현이 비교적 단순하며, 산업계에서 CTR baseline으로 널리 사용

단점:

  • High-order interaction이 DNN의 implicit 학습에 의존 (explicit하지 않음)
  • DNN 깊이·너비에 따른 하이퍼파라미터 튜닝 필요
  • Embedding 차원이 모든 feature에 동일 (field별 최적 차원이 다를 수 있음)
  • Sequential pattern (user behavior sequence)을 직접 모델링하지 못함

구현

DeepFM 핵심 구조 (PyTorch):

import torch
import torch.nn as nn

class DeepFM(nn.Module):
    def __init__(self, field_dims: list[int], embed_dim: int, mlp_dims: list[int]):
        super().__init__()
        num_fields = len(field_dims)
        total_dims = sum(field_dims)

        # Shared Embedding
        self.embedding = nn.Embedding(total_dims, embed_dim)
        self.offsets = torch.tensor([0] + field_dims[:-1]).cumsum(0)

        # FM: 1차 + 2차
        self.linear = nn.Embedding(total_dims, 1)
        self.bias = nn.Parameter(torch.zeros(1))

        # Deep
        mlp_input = num_fields * embed_dim
        layers = []
        for dim in mlp_dims:
            layers += [nn.Linear(mlp_input, dim), nn.ReLU(), nn.Dropout(0.2)]
            mlp_input = dim
        layers.append(nn.Linear(mlp_input, 1))
        self.mlp = nn.Sequential(*layers)

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        # x: (batch, num_fields) — field별 feature index
        x = x + self.offsets.to(x.device)
        embed = self.embedding(x)  # (batch, fields, embed_dim)

        # FM component
        linear_out = self.linear(x).sum(dim=1)      # 1차항
        sum_sq = embed.sum(dim=1) ** 2               # (Σe_i)²
        sq_sum = (embed ** 2).sum(dim=1)             # Σe_i²
        fm_out = 0.5 * (sum_sq - sq_sum).sum(dim=1, keepdim=True)  # 2차항

        # Deep component
        deep_out = self.mlp(embed.view(embed.size(0), -1))  # flatten → MLP

        return torch.sigmoid(self.bias + linear_out + fm_out + deep_out).squeeze(1)

관련 개념

  • Factorization Machine - DeepFM의 Wide 부분; 2차 feature interaction 기초
  • Wide and Deep - DeepFM이 개선한 선행 모델; Wide에 feature engineering 필요
  • FNN - FM pre-training + DNN; DeepFM과 달리 end-to-end 학습 불가
  • PNN - Product layer로 interaction 학습; low-order 항 부재
  • Hybrid-Expert Adaptor - KAR에서 DeepFM을 backbone 추천 모델로 사용
  • Multi-Task Learning - FM/Deep의 병렬 학습을 multi-task 관점으로 해석 가능

참고 논문

  • guoDeepFMFactorizationMachineBased2017 - DeepFM 원논문
  • rendleFactorizationMachines2010 - FM 원논문; DeepFM의 이론적 기반
  • Cheng, H., et al. (2016). Wide & deep learning for recommender systems. DLRS 2016. — DeepFM이 개선한 선행 연구
  • Lian, J., et al. (2018). xDeepFM: Combining explicit and implicit feature interactions. KDD 2018. — DeepFM의 후속 발전

연결 그래프