DeepFM
정의
DeepFM (Guo et al., 2017)은 FM component와 Deep component를 병렬로 결합하여, low-order feature interaction(explicit)과 high-order feature interaction(implicit)을 동시에 학습하는 CTR 예측 모델이다.
FM Component (Wide)
Factorization Machine과 동일한 2차 feature interaction:
Deep Component
Dense embedding을 입력으로 받는 feed-forward neural network:
핵심: Shared Embedding
FM component의 latent vector 와 Deep component의 embedding 가 동일한 파라미터를 공유한다. 이를 통해:
- 두 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을 보완한다.
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 & Deep | DeepFM |
|---|---|---|
| Wide 부분 | Cross-product (수동 설계) | FM (자동 학습) |
| Feature engineering | 필수 (전문가 지식) | 불필요 |
| Embedding 공유 | Wide/Deep 별도 | 공유 |
| Low-order interaction | 수동 정의된 조합만 | 모든 2차 조합 |
FM 계보에서의 위치
| 모델 | 구조 | Interaction |
|---|---|---|
| Factorization Machine | FM only | explicit 2차 |
| DeepFM | FM + DNN (parallel) | explicit 2차 + implicit high-order |
| xDeepFM | CIN + DNN | explicit high-order + implicit high-order |
| AutoInt | Self-attention + DNN | attention-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의 후속 발전