{"about":{"site":"https://codewithpapers.app","non_affiliation":"Code with Papers and Syntology are not affiliated with, endorsed by, or sponsored by Papers with Code, Meta, or the pwc-archive mirror.","licence":"CC BY-SA 4.0","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","attribution":"https://codewithpapers.app/attribution","modified":"archive material modified by Syntology; see the attribution page"},"url":"/paper/finalmlp-an-enhanced-two-stream-mlp-model-for-1","title":"FinalMLP: An Enhanced Two-Stream MLP Model for CTR Prediction","arxiv_id":"2304.00902","date":"2023-04-03","proceeding":null,"authors":["Kelong Mao","Jieming Zhu","Liangcai Su","Guohao Cai","Yuru Li","Zhenhua Dong"],"abstract":"Click-through rate (CTR) prediction is one of the fundamental tasks for online advertising and recommendation. While multi-layer perceptron (MLP) serves as a core component in many deep CTR prediction models, it has been widely recognized that applying a vanilla MLP network alone is inefficient in learning multiplicative feature interactions. As such, many two-stream interaction models (e.g., DeepFM and DCN) have been proposed by integrating an MLP network with another dedicated network for enhanced CTR prediction. As the MLP stream learns feature interactions implicitly, existing research focuses mainly on enhancing explicit feature interactions in the complementary stream. In contrast, our empirical study shows that a well-tuned two-stream MLP model that simply combines two MLPs can even achieve surprisingly good performance, which has never been reported before by existing work. Based on this observation, we further propose feature gating and interaction aggregation layers that can be easily plugged to make an enhanced two-stream MLP model, FinalMLP. In this way, it not only enables differentiated feature inputs but also effectively fuses stream-level interactions across two streams. Our evaluation results on four open benchmark datasets as well as an online A/B test in our industrial system show that FinalMLP achieves better performance than many sophisticated two-stream CTR models. Our source code will be available at MindSpore/models.","url_abs":"https://arxiv.org/abs/2304.00902v4","url_pdf":"https://arxiv.org/pdf/2304.00902v4.pdf","source":{"archive":"pwc-archive (Hugging Face), CC BY-SA 4.0","snapshot":"2025-07-28","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","row_kind":"abstracts"},"code_links":[{"paper_slug":"finalmlp-an-enhanced-two-stream-mlp-model-for-1","repo_url":"https://github.com/reczoo/RecZoo/tree/main/ranking/ctr/FinalMLP","is_official":1,"mentioned_in_paper":0,"mentioned_in_github":0,"framework":"pytorch","reach":null},{"paper_slug":"finalmlp-an-enhanced-two-stream-mlp-model-for-1","repo_url":"https://github.com/clabrugere/final-mlp","is_official":0,"mentioned_in_paper":0,"mentioned_in_github":1,"framework":"pytorch","reach":null},{"paper_slug":"finalmlp-an-enhanced-two-stream-mlp-model-for-1","repo_url":"https://github.com/reczoo/FuxiCTR","is_official":0,"mentioned_in_paper":0,"mentioned_in_github":1,"framework":"pytorch","reach":null},{"paper_slug":"finalmlp-an-enhanced-two-stream-mlp-model-for-1","repo_url":"https://github.com/caesarjuly/reginx/blob/master/trainer/models/final_mlp.py","is_official":0,"mentioned_in_paper":0,"mentioned_in_github":0,"framework":"tf","reach":null}],"tasks":[{"task_slug":"click-through-rate-prediction","task_name":"Click-Through Rate Prediction"},{"task_slug":"two","task_name":"Vocal Bursts Valence Prediction"},{"task_slug":"feature-selection","task_name":"feature selection"}],"methods":[{"method_slug":"feature-selection","method_name":"Feature Selection"},{"method_slug":"test","method_name":"Test"}],"datasets_introduced":[],"methods_introduced":[],"results":[{"leaderboard":"/sota/click-through-rate-prediction-on-criteo","task":"Click-Through Rate Prediction","dataset":"Criteo","model":"FinalMLP","rank_in_archive_order":7,"of":39,"metrics":{"AUC":"0.8149"},"uses_additional_data":false},{"leaderboard":"/sota/click-through-rate-prediction-on-frappe","task":"Click-Through Rate Prediction","dataset":"Frappe","model":"FinalMLP","rank_in_archive_order":2,"of":5,"metrics":{"AUC":"0.9861"},"uses_additional_data":false},{"leaderboard":"/sota/click-through-rate-prediction-on-movielens-1","task":"Click-Through Rate Prediction","dataset":"MovieLens","model":"FinalMLP","rank_in_archive_order":2,"of":3,"metrics":{"AUC":"0.9720"},"uses_additional_data":false}],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=2304.00902","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2304.00902"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-24T18:15:14+00:00","read_at_is":"when the build read Syntology's graph, not when any sample ran","claim":"Per-sample execution status on synthesized fixtures; not a correctness claim about the paper. Samples come from repositories linked to the paper, official or community; repo_kind says which.","repos":[{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/reczoo/FuxiCTR","reach":null},{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/reczoo/RecZoo/tree/main/ranking/ctr/FinalMLP","reach":null},{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/clabrugere/final-mlp","reach":null},{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/caesarjuly/reginx/blob/master/trainer/models/final_mlp.py","reach":null}],"summary":{"ran":10,"ran_draft_wrong":1,"ran_honours":1,"ran_violates":1,"unverified":3},"by_repo_kind":{"listed":{"samples":16,"ran":13,"repositories":2}},"repo_kind_vocabulary":{"official":"The archive marks this repository official for the paper","named_in_paper":"The archive records that the paper mentions this repository; it is not marked official","listed":"In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper","found_in_text":"Syntology found this repository in the paper's own text; whether it is the authors' implementation is not asserted","community":"Not in the archive's code links for this paper; a community repository Syntology harvested"},"n_pointer_only_for_licence":0,"samples":[{"code_sha256_prefix":"d5e892b1d0d28990","entry":"Aggregation","repo":"clabrugere/final-mlp","repo_kind":"listed","path":"model/pytorch/final_mlp.py","file_url":"https://github.com/clabrugere/final-mlp/blob/HEAD/model/pytorch/final_mlp.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"d5e892b1d0d28990"}},{"code_sha256_prefix":"07f45f16e61c0ae2","entry":"FeatureSelection","repo":"clabrugere/final-mlp","repo_kind":"listed","path":"model/pytorch/final_mlp.py","file_url":"https://github.com/clabrugere/final-mlp/blob/HEAD/model/pytorch/final_mlp.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"deterministic","behaviour_fingerprint":true,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"07f45f16e61c0ae2"}},{"code_sha256_prefix":"0a00a4a1ea6c8870","entry":"FinalMLP","repo":"clabrugere/final-mlp","repo_kind":"listed","path":"model/pytorch/final_mlp.py","file_url":"https://github.com/clabrugere/final-mlp/blob/HEAD/model/pytorch/final_mlp.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"0a00a4a1ea6c8870"}},{"code_sha256_prefix":"0ab1e9e21b122c6e","entry":"InteractionAggregation","repo":"reczoo/FuxiCTR","repo_kind":"listed","path":"model_zoo/FinalMLP/src/FinalMLP.py","file_url":"https://github.com/reczoo/FuxiCTR/blob/HEAD/model_zoo/FinalMLP/src/FinalMLP.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"invariant","behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"0ab1e9e21b122c6e"}},{"code_sha256_prefix":"51a52dde5114fedf","entry":"MLP","repo":"clabrugere/final-mlp","repo_kind":"listed","path":"model/pytorch/final_mlp.py","file_url":"https://github.com/clabrugere/final-mlp/blob/HEAD/model/pytorch/final_mlp.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"deterministic","behaviour_fingerprint":true,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"51a52dde5114fedf"}},{"code_sha256_prefix":"499d39b01f527cf2","entry":"Monitor","repo":"reczoo/FuxiCTR","repo_kind":"listed","path":"model_zoo/FinalMLP/src/FinalMLP.py","file_url":"https://github.com/reczoo/FuxiCTR/blob/HEAD/model_zoo/FinalMLP/src/FinalMLP.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"well_formed","behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"499d39b01f527cf2"}},{"code_sha256_prefix":"3bdff5f3c936a29e","entry":"evaluate_block","repo":"reczoo/FuxiCTR","repo_kind":"listed","path":"model_zoo/FinalMLP/src/FinalMLP.py","file_url":"https://github.com/reczoo/FuxiCTR/blob/HEAD/model_zoo/FinalMLP/src/FinalMLP.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"3bdff5f3c936a29e"}},{"code_sha256_prefix":"35e81e110e77d460","entry":"evaluate_metrics","repo":"reczoo/FuxiCTR","repo_kind":"listed","path":"model_zoo/FinalMLP/src/FinalMLP.py","file_url":"https://github.com/reczoo/FuxiCTR/blob/HEAD/model_zoo/FinalMLP/src/FinalMLP.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"35e81e110e77d460"}},{"code_sha256_prefix":"d84794ade6798b01","entry":"get_device","repo":"reczoo/FuxiCTR","repo_kind":"listed","path":"model_zoo/FinalMLP/src/FinalMLP.py","file_url":"https://github.com/reczoo/FuxiCTR/blob/HEAD/model_zoo/FinalMLP/src/FinalMLP.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"OUTPUT_MISDECLARED","metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"d84794ade6798b01"}},{"code_sha256_prefix":"ea1739926fa16075","entry":"get_loss","repo":"reczoo/FuxiCTR","repo_kind":"listed","path":"model_zoo/FinalMLP/src/FinalMLP.py","file_url":"https://github.com/reczoo/FuxiCTR/blob/HEAD/model_zoo/FinalMLP/src/FinalMLP.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"ea1739926fa16075"}},{"code_sha256_prefix":"f4900d192f5425d4","entry":"get_optimizer","repo":"reczoo/FuxiCTR","repo_kind":"listed","path":"model_zoo/FinalMLP/src/FinalMLP.py","file_url":"https://github.com/reczoo/FuxiCTR/blob/HEAD/model_zoo/FinalMLP/src/FinalMLP.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"f4900d192f5425d4"}},{"code_sha256_prefix":"9bc88c320ce26df9","entry":"get_regularizer","repo":"reczoo/FuxiCTR","repo_kind":"listed","path":"model_zoo/FinalMLP/src/FinalMLP.py","file_url":"https://github.com/reczoo/FuxiCTR/blob/HEAD/model_zoo/FinalMLP/src/FinalMLP.py","link_basis":"first_harvest_node","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"9bc88c320ce26df9"}},{"code_sha256_prefix":"c8d2350eac52fbd6","entry":"not_in_whitelist","repo":"reczoo/FuxiCTR","repo_kind":"listed","path":"model_zoo/FinalMLP/src/FinalMLP.py","file_url":"https://github.com/reczoo/FuxiCTR/blob/HEAD/model_zoo/FinalMLP/src/FinalMLP.py","link_basis":"first_harvest_node","language":"python","status":"ran_violates","verification_level":1,"contract_check":"VIOLATES","metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"c8d2350eac52fbd6"}},{"code_sha256_prefix":"50a4a3e87fa74c6f","entry":"BaseModel","repo":"reczoo/FuxiCTR","repo_kind":"listed","path":"model_zoo/FinalMLP/src/FinalMLP.py","file_url":"https://github.com/reczoo/FuxiCTR/blob/HEAD/model_zoo/FinalMLP/src/FinalMLP.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"50a4a3e87fa74c6f"}},{"code_sha256_prefix":"fd88018841000e9e","entry":"FeatureSelection","repo":"reczoo/FuxiCTR","repo_kind":"listed","path":"model_zoo/FinalMLP/src/FinalMLP.py","file_url":"https://github.com/reczoo/FuxiCTR/blob/HEAD/model_zoo/FinalMLP/src/FinalMLP.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"fd88018841000e9e"}},{"code_sha256_prefix":"443355df7a417c7f","entry":"FinalMLP","repo":"reczoo/FuxiCTR","repo_kind":"listed","path":"model_zoo/FinalMLP/src/FinalMLP.py","file_url":"https://github.com/reczoo/FuxiCTR/blob/HEAD/model_zoo/FinalMLP/src/FinalMLP.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"443355df7a417c7f"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}