推荐系统Part4:Wide&Deep

Wide&Deep模型结合了线性模型的记忆能力和深度神经网络的泛化能力,被应用于Google Play的推荐系统中。Wide部分为线性模型,用于捕捉特征交互,Deep部分是前馈网络,用于特征转换和非线性表达。两者通过加权合并并使用logistic loss训练,以优化整体预测。推荐系统首先召回相关items,然后基于用户特征、上下文特征和印象特征进行排序,最后推荐给用户。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.介绍

Wide and deep 模型是 TensorFlow 在 2016 年 6 月左右发布的一类用于分类和回归的模型,并应用到了 Google Play 的应用推荐中。wide and deep 模型的核心思想是结合线性模型的记忆能力(memorization)和 DNN 模型的泛化能力(generalization),在训练过程中同时优化 2 个模型的参数,从而达到整体模型的预测能力最优。
记忆(memorization)即从历史数据中发现item或者特征之间的相关性。
泛化(generalization)即相关性的传递,发现在历史数据中很少或者没有出现的新的特征组合。

论文链接:https://arxiv.org/pdf/1606.07792.pdf


2.原理

2.1 W&D模型的网络结构

在这里插入图片描述

● Wide部分就是基础的线性模型。

● Deep部分就是个前馈网络模型。

1.Wide部分:
Wide部分就是基础的线性模型,表示为y=WX+b。X特征部分包括基础特征和交叉特征。交叉特征在wide部分很重要,可以捕捉到特征间的交互,起到添加非线性的作用。
交叉特征可表示为:
在这里插入图片描述


2.Deep部分
Deep部分就是个前馈网络模型。特征首先转换为低维稠密向量,维度通常O(10)-O(100)。向量随机初始化,经过最小化随时函数训练模型。激活函数采用Relu。前馈部分表示如下:

### DeepFM 模型参数详解 #### FM 组件与 DNN 组件的参数配置 DeepFM 结合了因子分解机(Factorization Machine, FM) 和深度神经网络(Deep Neural Network, DNN),其中FM组件用于捕捉特征之间的二阶交互效应,而DNN则能够挖掘更高阶的组合关系[^1]。 对于FM部分而言,主要涉及如下几个重要超参数: - **Embedding维度(k)**:决定了隐向量的空间大小。较大的k有助于表达更复杂的模式,但也增加了过拟合的风险。 - **正则化系数(lambda_w, lambda_v)**:控制一阶项权重w和二阶交叉项V矩阵中的各元素v_i_j 的L2惩罚力度,防止过拟合现象的发生。 至于深层网络方面,则需关注以下设置选项: - **隐藏层数目(Layers Count)**:定义了整个架构中有多少层全连接层参与运算过程;更多层次理论上能增强表征能力,但同样面临梯度消失等问题。 - **每层节点数(Nodes per Layer)**:影响着每一级的信息处理容量及其非线性变换强度。 - **激活函数(Activation Function)**:ReLU是最常见的选择之一,它可以在保持计算效率的同时引入必要的非线性因素。 - **Dropout比率(Dropout Rate)**:作为一种有效的随机失活机制,在训练阶段按一定概率丢弃某些神经元来减少协适应(co-adaptation),从而提升泛化性能。 另外值得注意的是,尽管两个分支共用了相同的原始输入特征集,但在实际部署过程中往往会对它们采取差异化的调优策略以达到最佳效果。 ```python import tensorflow as tf from tensorflow.keras.layers import Dense, Dropout, Embedding, Flatten, Input from tensorflow.keras.models import Model def build_deepfm_model(feature_columns, embedding_dim=8): inputs = {} for feature_name in feature_columns: inputs[feature_name] = Input(shape=(1,), name=feature_name) # Wide part (FM component) fm_embeddings = [] for col in feature_columns: emb_layer = Embedding(input_dim=vocab_sizes[col], output_dim=embedding_dim)(inputs[col]) fm_embeddings.append(Flatten()(emb_layer)) pairwise_interactions = ... # Compute all possible pair-wise interactions between embeddings wide_output = Dense(units=1, activation='sigmoid')(pairwise_interactions + sum(fm_embeddings)) # Deep part (DNN component) concatenated_inputs = Concatenate(axis=-1)(list(inputs.values())) deep_input = Dense(embedding_dim * len(feature_columns), activation="relu")(concatenated_inputs) hidden_layers = [ Dense(64, activation='relu'), Dropout(rate=0.5), Dense(32, activation='relu') ] for layer in hidden_layers: deep_input = layer(deep_input) deep_output = Dense(units=1, activation='sigmoid')(deep_input) final_output = Add()([wide_output, deep_output]) model = Model(inputs=list(inputs.values()), outputs=[final_output]) return model ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值