wide & Deep 和 Deep & Cross 及tensorflow实现

本文介绍了Google的Wide&Deep Learning和Deep&Cross Network,探讨了深度网络在推荐和广告预测中的应用。文章讨论了Deep-Network用于表示高维抽象特征,Cross-Network解决组合特征数量爆炸的问题。并提供了TensorFlow实现Deep&Cross的注意事项,包括特征输入、embedding处理、数据读入等,同时提到了tf_debug的使用和github上的源码示例。

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

前言

  最近读了下Google的两篇文章《Wide&Deep Learning》和《Deep&Cross Network》,趁着热乎比较下,顺道写个demo,免得后面用的时候瞎搞。
  前者是用来给用户推荐潜在喜欢的APP;后者是用来预测用户可能点击的广告排序。基于用户基本信息和行为日志来做个性化的推荐,是商业化的重要一步,做得好,用户使用起来甚是满意,广告商支付更多费用;做得差,大家只能喝喝西风,吃点咸菜。

Why Deep-Network ?

  关于推荐,前面博文FTRL系列讲过,那是种基于基本特征和二维组合特征的线性推荐模型。其优点:模型简单明白,工程实现快捷,badcase调整方便。缺点也很明显:对更高维抽象特征无法表示,高维组合特征不全。而Deep-Network能够表达高维抽象特征,刚好可以弥补了线性模型这方面的缺点。

Why Cross-Network ?

  组合特征,为什么止步于两维组合?多维组合,不单说手挑组合特征费时费力,假设特征都组合起来,特征的数量非得彪上天不可。但是Cross-Network(参考5)则可以很好地解决组合特征的数量飙升的问题。所以说,并不是问题真难以解决,只不过牛人还没有解它而已。
结构比较
  啥都不如图明白,直接上图,左侧 Wide and Deep Network 右侧 Deep and Cross Network


  上面两个图清晰地表示了两种方法的框架结构。

特征输入

  1)W&D的特征包括三方面:
    User-Feature:contry, language, demographics.
    Contextual-Feature:device, hour of the day, day of the week.
    Impression-Feature:app age, historical statistics of an app.
  1.1)Wide部分的输入特征:
    raw input features and transformed features [手挑的交叉特征].
    notice: W&D这里的cross-product transformation:
    只在离散特征之间做组合,不管是文本策略型的,还是离散值的;没有连续值特征的啥事,至少在W&D的paper里面是这样使用的。
  1.2)Deep部分的输入特征: raw input+embeding处理
    对非连续值之外的特征做embedding处理,这里都是策略特征,就是乘以个embedding-matrix。在TensorFlow里面的接口是:tf.feature_column.embedding_column,默认trainable=True.
    对连续值特征的处理是:将其按照累积分布函数P(X≤x),压缩至[0,1]内。
    notice: Wide部分用FTRL+L1来训练;Deep部分用AdaGrad来训练。
  Wide&Deep在TensorFlow里面的API接口为:tf.estimator.DNNLinearCombinedClassifier
  2)D&C的输入特征及处理:
    所有输入统一处理,不再区分是给Deep部分还是Cross部分。
    对高维的输入(一个特征有非常多的可能性),加embeding matrix,降低维度表示,dense维度估算: 6(categorycardinality)1/4 6 ∗ ( c a t e g o r y − c a r d i n a l i t y ) 1 / 4
    notice:W&D和D&C里的embedding不是语言模型中常说的Word2Vec(根据上下文学习词的低维表示),而是仅仅通过矩阵W,将离散化且非常稀疏的one-hot形式词,降低维度而已。参数矩阵的学习方法是正常的梯度下降。
    对连续值的,则用log做压缩转换。
    stack上述特征,分别做deep-network和Cross-network的输入。
cross解释
  cross-network在引用5中有详细介绍,但是在D&C里面是修改之后的cross-network。

### 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],进一步优化特征表达形式。 ---
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值