Wide&Deep/DeepFM

本文探讨了推荐系统面临的记忆能力和泛化能力挑战,介绍了基于DNN的推荐算法如何通过Wide&Deep模型和DeepFM模型解决这些问题。Wide&Deep模型结合线性模型的记忆能力和深度神经网络的泛化能力,DeepFM模型进一步优化特征交叉,提高训练效率。

基于DNN的推荐算法引入背景

推荐系统的一大挑战是同时具备”记忆能力“和”泛化能力“。
”记忆能力“:学习那些经常同时出现的特征,发觉历史数据中存在的共现特性。
”泛化能力“:基于迁移相关性,探索之前几乎没出现过的新特征组合。

基于嵌入的模型(FM)对之前没出现过的特征具备二阶泛化能力,即为每个query和item特征学习一个低维稠密的嵌入向量。但FM很难有效学习低维表示,当query-item矩阵稀疏且高秩时,稠密嵌入会给所有item-query带来非零预测,可能过度泛化/给出完全不相关的推荐。

Wide&Deep

联合训练一个线性模型组件和一个深度神经网络组件得到Wide&Deep模型,该模型的Wide部分具备记忆能力,Deep部分具备泛化能力。
Wide&Deep Structure.jpg

Wide部分:基础特征和交叉特征构成的线性模型
y=wT[x,ϕ(x)]+by=\mathrm{w}^T [\mathrm{x},\phi(\mathrm{x})]+by=wT[x,ϕ(x)]+b
其中,基础特征x=(x1,x2,⋯ ,xi,⋯ ,xn)\displaystyle\mathrm{x}=(x_1,x_2,\cdots,x_i,\cdots,x_n)x=(x1,x2,,xi,,xn),叉乘特征
ϕ(x)=∏i=1dxicki,cki∈{0,1}\displaystyle\phi(\mathrm{x})=\prod\limits_{i=1}^d x^{c_{ki}}_i,c_{ki}\in\{0,1\}ϕ(x)=i=1dxickicki{0,1}

Deep部分:将一些sparse特征(e.g. ID类特征)转换成低维稠密向量,然后和一些原始dense特征一起作为网络的输入;激活函数是Relu的前馈神经网络
a(l+1)=f(W(l)a(l)+b(l))\mathrm{a}^{(l+1)}=f(\mathrm{W}^{(l)}\mathrm{a}^{(l)}+\mathrm{b}^{(l)})a(l+1)=f(W(l)a(l)+b(l))
其中,a(l)\mathrm{a}^{(l)}a(l)第l层输入,b(l)\mathrm{b}^{(l)}b(l)第l层偏置,W(l)\mathrm{W}^{(l)}W(l)第l层权重,fff激活函数

Wide&Deep联合预测输出:联合训练的Wide部分只需要作一小部分的特征叉乘来弥补Deep部分的不足,不需要一个full-size 的wide 模型。在论文中,作者通过梯度的反向传播,使用 mini-batch stochastic optimization 训练参数,并对wide部分使用带L1正则的Follow- the-regularized-leader (FTRL) 算法,对deep部分使用 AdaGrad算法。
P(y=1∣x)=sigmoid(wWideT[x,ϕ(x)]+wDeepTalf+b)P(y=1|\mathrm{x})=sigmoid(\mathrm{w}^T_{Wide}[\mathrm{x},\phi(\mathrm{x})]+\mathrm{w}^T_{Deep}\mathrm{a}^{l_f} + b)P(y=1x)=sigmoid(wWideT[x,ϕ(x)]+wDeepTalf+b)
其中,alf\mathrm{a}^{l_f}alf是NN最后一层激活值。

DeepFM

DeepFM采取Wide & Deep的框架,差异在于将Wide部分的LR替换为了FM,从而自动构造二阶特征叉乘,而非手工设计叉乘。FM算法负责提取一阶和二阶组合特征;DNN算法负责对输入一阶特征全连接提取高阶特征。FM和DNN共享相同输入和embedding向量,训练更高效。
DeepFM.png
左边就是刚才将的FM模型的神经网络表示,而右边的则为deep部分,为全连接的网络,用于挖掘高阶的交叉特征。整个模型共享embedding层,最后的结果就是把FM部分和DNN的部分做sigmoid:
Y=sigmoid(YFM+YDNN)Y=sigmoid(Y_{FM}+Y_{DNN})Y=sigmoid(YFM+YDNN)
DeepFM_embedding_FM交叉项.png

### Wide and Deep 模型的工作原理 Wide and Deep 模型是一种结合线性和神经网络技术的混合模型,旨在同时利用记忆能力和泛化能力来提升推荐系统的性能。其核心思想在于通过 **Wide 部分** 增强模型的记忆能力[^2],以及通过 **Deep 部分** 提升模型的泛化能力。 #### 1. Wide 和 Deep 的结合机制 Wide and Deep 模型的核心是将两个独立的部分——Wide 和 Deep 结合在一起,并共享相同的输入特征集。最终输出由两部分共同决定: - **Wide 部分**: 这是一个广义线性模型 (GLM),通常用于处理稀疏高维特征组合。它能够捕捉低阶交叉特征和显式的交互关系,从而增强模型的记忆能力。 - **Deep 部分**: 这是一组多层感知机 (MLP),主要用于学习复杂的非线性特征表示。它可以自动提取隐含的高阶特征交互,因此具有强大的泛化能力。 两者的结果会通过加权求和的方式融合到一起,形成最终预测值 \( \hat{y} = w_{\text{wide}} f_{\text{wide}}(X) + w_{\text{deep}} f_{\text{deep}}(H(X)) \)[^1]。 --- ### 2. 实现方式 以下是基于 TensorFlow 的一种典型实现方法,展示了如何构建 Wide and Deep 模型。 ```python import tensorflow as tf from tensorflow.keras import layers, models # 定义输入特征列 categorical_columns = [ tf.feature_column.categorical_column_with_identity('category', num_buckets=10), ] numerical_columns = [ tf.feature_column.numeric_column('price'), ] embedding_columns = [ tf.feature_column.embedding_column(col, dimension=8) for col in categorical_columns ] # 构建 Wide 部分 wide_columns = categorical_columns + numerical_columns # 构建 Deep 部分 deep_columns = embedding_columns + numerical_columns # 输入函数定义 def input_fn(): features = { 'category': [[1], [2]], 'price': [[10.0], [20.0]] } labels = [[1], [0]] return tf.data.Dataset.from_tensor_slices((features, labels)).batch(2) # 创建模型 feature_layer_wide = tf.keras.layers.DenseFeatures(wide_columns) feature_layer_deep = tf.keras.layers.DenseFeatures(deep_columns) model = models.Sequential() model.add(layers.Concatenate()([feature_layer_wide, feature_layer_deep])) model.add(layers.Dense(128, activation='relu')) model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(1, activation='sigmoid')) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) # 训练模型 train_data = input_fn() model.fit(train_data, epochs=5) ``` 上述代码片段实现了 Wide and Deep 模型的基本结构,其中 `DenseFeatures` 层分别负责宽和深部分的特征处理。 --- ### 3. 特征选择策略 在实际应用中,合理分配特征至 Wide 和 Deep 部分至关重要。一般来说: - 将已知有效的特征及其交叉项放入 **Wide 部分**,以便更好地捕获显式的关系。 - 对于复杂、未知或潜在关联较强的特征,则更适合放置在 **Deep 部分** 中进行深层次的学习[^3]。 此外,在某些情况下可以考虑引入因子分解机 (Factorization Machine, FM) 来预处理数据[^4],进一步优化特征表达形式。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值