The synthetic data includes a memorizable pattern (specific user-item cross-feature co-occurrences strongly predict install) and a generalizable pattern (embedding-based similarity predicts install).
Vocabulary mapping: each categorical feature string mapped to an integer ID.
Train/test split: 80/20 stratified by label.
3. Feature Engineering — Wide Component
Cross-product features: Manually construct AND combinations of key categorical features, e.g.:
AND(user_country=US, app_category=games)
AND(device_type=phone, app_price_tier=free)
AND(age_group=young, app_category=social)
These cross-product features are one-hot encoded and concatenated with raw one-hot features to form the wide input vector.
The wide input is a sparse binary vector of raw features + cross-product features.
4. Model Definitions
4a. WideModel (Wide-Only Baseline)
Class WideModel: Linear layer over the wide feature vector (raw + cross-product features).
Input: sparse binary wide features → linear → sigmoid.
This is the generalized linear model with cross-product transformations from the paper.
4b. DeepModel (Deep-Only Baseline)
Class DeepModel: Embedding tables for each categorical feature → concatenate embeddings + dense features → stacked ReLU hidden layers → sigmoid.
Each categorical feature has its own embedding table (dimension 16).
Embeddings concatenated with normalized continuous features → 3 hidden layers (128, 64, 32) with ReLU.
This is the feed-forward neural network with embeddings from the paper.
4c. WideDeepModel (Joint Model)
Class WideDeepModel: Combines WideModel and DeepModel.
Wide part: same linear layer over cross-product features → wide_logit.
Dataset: Synthetic recommendation dataset (~10K examples) instead of Google Play’s 500 billion examples. The synthetic data is designed with both memorizable and generalizable patterns to demonstrate the paper’s core claim.
Optimizer: Adam for all components instead of FTRL Proximal (wide) + AdaGrad (deep). FTRL with L1 produces sparser wide weights, but Adam works fine for this scale.
Cross-product features: Manually defined 6-8 key cross-product combinations instead of the full automated cross-product enumeration. The paper’s Google Play deployment used cross-products of user_installed_app × impression_app.
Embedding size: 16-dimensional embeddings (paper used 32). Sufficient for our small vocabulary.
Deep layers: 3 hidden layers [128, 64, 32] (paper used 3 ReLU layers with ~1200 input dim). Scaled down for our smaller feature space.
No warm-starting: The paper describes a warm-starting system for incremental retraining. We train from scratch each time.
No serving optimization: We don’t implement multithreaded batch inference. The paper’s 14ms latency optimization is an engineering detail beyond the model architecture.
Fusion weights: We learn scalar fusion weights (w_wide, w_deep) rather than the paper’s vector-level weighting, which is sufficient at our scale.