Wide& Deep

  1. 排序系统的发展:

  • LR-->GBDT+LR

  • FM-->FFM-->GBDT+FM|FFM

  • FTRL-->GBDT+FTRL

  • Wide&DeepModel

  • Deep Neural Networks for YouTube Recommendations

  • Reinforce Learning

  1. Wide and deep 模型是 TensorFlow 在 2016 年 6 月左右发布的一类用于分类和回归的模型,并应用到了 Google Play 的应用推荐中 [1]。wide and deep 模型的核心思想是结合线性模型的记忆能力(memorization)和 DNN 模型的泛化能力(generalization),在训练过程中同时优化 2 个模型的参数,从而达到整体模型的预测能力最优。论文见 Wide & Deep Learning for Recommender Systems。

  • 记忆(memorization) 通过特征叉乘对原始特征做非线性变换,输入为高维度的稀疏向量。通过大量的特征叉乘产生特征相互作用的“记忆(Memorization)”,高效且可解释,但要泛化需要更多的特征工程。

  • 泛化(generalization)只需要少量的特征工程,深度神经网络通过embedding的方法,使用低维稠密特征输入,可以更好地泛化训练样本中未出现过的特征组合。但当user-item交互矩阵稀疏且高阶时,容易出现“过泛化(over-generalize)”导致推荐的item相关性差。

  • 在推荐场景中是相关性和多样性的融合。

  1. Wide & Deep的模型结构:

 

wide and deep模型中使用的特征包括两大类: 一类是连续型特征,主要用于deep模型的训练,包括real value类型的特征以及embedding类型的特征等;一类是离散型特征,主要用于wide模型的训练,包括sparse类型的特征以及cross类型的特征等。

  • 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.    2.1)Wide部分的输入特征:      raw input features and transformed features [手挑的交叉特征].      notice: W&D这里的cross-product transformation:      只在离散特征之间做组合,不管是文本策略型的,还是离散值的;没有连续值特征的啥事,至少在W&D的paper里面是这样使用的。    2.2)Deep部分的输入特征: raw input+embeding处理      对非连续值之外的特征做embedding处理,这里都是策略特征,就是乘以个embedding-matrix。在TensorFlow里面的接口是:tf.feature_column.embedding_column,默认trainable=True.      对连续值特征的处理是:将其按照累积分布函数P(X≤x),压缩至[0,1]内。      notice1: Wide部分用FTRL+L1来训练;Deep部分用AdaGrad来训练。 使用BP算法采用joint train的方式训练。

                   notice2特征工程部分:1)连续特征归一化。2)离散特征去掉出现次数过少的特征,减少计算量。

             notice3:tf.clip_by_global_norm防止梯度消失和爆炸。   2.3)  Wide&Deep在TensorFlow里面的API接口为:tf.estimator.DNNLinearCombinedClassifier 

2.4)FM&DNN vs LR: FM 和 DNN 都算是这样的模型,可以在很少的特征工程情况下,通过学习一个低纬度的 embedding vector 来学习训练集中从未见过的组合特征。

FM 和 DNN 的缺点在于: 当 query-item 矩阵是稀疏并且是 high-rank 的时候(比如 user 有特殊的爱好,或 item 比较小众),很难非常效率的学习出低维度的表示。这种情况下,大部分的 query-item 都没有什么关系。但是 dense embedding 会导致几乎所有的 query-item 预测值都是非 0 的,这就导致了推荐过度泛化,会推荐一些不那么相关的物品。

相反,linear model 却可以通过 cross-product transformation 来记住这些 exception rules,而且仅仅使用了非常少的参数。

总结一下:

线性模型无法学习到训练集中未出现的组合特征;FM 或 DNN 通过学习 embedding vector 虽然可以学习到训练集中未出现的组合特征,但是会过度泛化

  • W&D的模型的训练:

模型训练采用的是联合训练(joint training),模型的训练误差会同时反馈到线性模型和DNN模型中进行参数更新。相比于ensemble learning中单个模型进行独立训练,模型的融合仅在最终做预测阶段进行,joint training中模型的融合是在训练阶段进行的,单个模型的权重更新会受到wide端和deep端对模型训练误差的共同影响。因此在模型的特征设计阶段,wide端模型和deep端模型只需要分别专注于擅长的方面,wide端模型通过离散特征的交叉组合进行memorization,deep端模型通过特征的embedding进行generalization,这样单个模型的大小和复杂度也能得到控制,而整体模型的性能仍能得到提高。

  • Joint Training vs Ensemble

    • Joint Training 同时训练 wide & deep 模型,优化的参数包括两个模型各自的参数以及 weights of sum

    • Ensemble 中的模型是分别独立训练的,互不干扰,只有在预测时才会联系在一起

  1. 问题思考:目前的CTR预估模型,实质上都是在“利用模型”进行特征工程上狠下功夫。为什么线性模型有记忆能力,而DNN模型有泛化能力?文章指出,wide端模型通过离散特征的交叉组合进行memorization, deep端模型通过特征的embedding进行generalization. 同时wide and deep模型中使用的特征包括两大类:一类是连续型特征,主要用于deep模型的训练,包括real value 类型的特征及embedding类型的特征等;一类是离散型特征,主要用于wide模型的训练,包括sparse类型的特征以及cross类型的特征等。所有特征的汇总图如下:

 

图中类与类的关系除了 inherit(继承)之外,同时我们也标出了特征类之间的构成关系:_BucketizedColumn 由_RealValueColumn 通过对连续值域进行分桶构成,_CrossedColumn 由若干_SparseColumn 或者_BucketizedColumn 或者_CrossedColumn 经过交叉组合构成。图中左边部分特征属于离散型特征,右边部分特征属于连续型特征。

tf.contrib.layers.feature_column进行特征处理接口:

(1)sparse column from keys

  (2)  sparse column from vocabulary file

  (3)  sparse column with hash bucket

  (4)  crossed column (笛卡尔积)

(5)我们在实际使用的时候,通常情况下是调用 TensorFlow 提供的接口来构建特征的。以下是构建各类特征的接口:

 

sparse_column_with_integerized_feature() --> _SparseColumnIntegerized

sparse_column_with_hash_bucket() --> _SparseColumnHashed

sparse_column_with_keys() --> _SparseColumnKeys

sparse_column_with_vocabulary_file() --> _SparseColumnVocabulary

weighted_sparse_column() --> _WeightedSparseColumn

one_hot_column() --> _OneHotColumn

embedding_column() --> _EmbeddingColumn

shared_embedding_columns() --> List[_EmbeddingColumn]

scattered_embedding_column() --> _ScatteredEmbeddingColumn

real_valued_column() --> _RealValuedColumn

bucketized_column() -->_BucketizedColumn

crossed_column() --> _CrossedColumn

  1. 优缺点

    缺点:Wide 部分还是需要人为的特征工程。优点:实现了对 memorization 和 generalization 的统一建模

  2. ref:

    1. 模型代码讲解:https://blog.youkuaiyun.com/heyc861221/article/details/80131369

    2. 模型代码及特征工程详解2:https://blog.youkuaiyun.com/kwame211/article/details/78015498

    3. 官方代码:https://github.com/tensorflow/models/tree/master/official/wide_deep

    4. https://zhuanlan.zhihu.com/p/28202287

    5. https://zhuanlan.zhihu.com/p/31589565

    6. https://www.zhihu.com/question/56474891

### 关于 Wide & Deep Learning for Recommender Systems 的出处 Wide & Deep 学习框架首次被提出是在由 Google 发表的一篇重要论文中,这篇论文名为《Wide & Deep Learning for Recommender Systems》[^1]。此论文主要探讨了一种新的机器学习架构——宽深网络(Wide & Deep Network),其目的是为了在推荐系统中更好地平衡记忆化(Memorization)和泛化能力(Generalization)。这种架构通过联合训练广度模型(Wide Model)和深度神经网络模型(Deep Neural Network, DNN Model),从而实现了短期收益最大化的同时兼顾长期探索的可能性。 具体而言,Wide 部分负责处理高频特征及其组合的记忆功能,而 Deep 部分则专注于捕捉低频甚至未见过的特征组合,以此增强系统的泛化性能[^4]。这一设计使得该模型特别适合应用于数据稀疏性较高的场景下,例如个性化推荐服务等领域。 因此,《Wide & Deep Learning for Recommender Systems》可以被认为是原始文献的主要来源之一,并且已经被广泛认可为推荐算法研究领域内的经典之作。 ```python # 示例代码片段用于说明如何实现基本的 Wide&Deep 架构 import tensorflow as tf def build_wide_deep_model(wide_columns, deep_columns): feature_columns = wide_columns + deep_columns # 定义输入层 inputs = { col.name: tf.keras.layers.Input(name=col.name, shape=(1,), dtype=tf.float32) for col in feature_columns } # 广度部分 (线性模型) wide = tf.feature_column.input_layer(inputs, wide_columns) # 深度部分 (DNN 模型) deep = tf.feature_column.input_layer(inputs, deep_columns) for units in [128, 64]: deep = tf.keras.layers.Dense(units)(deep) deep = tf.keras.layers.BatchNormalization()(deep) deep = tf.keras.layers.ReLU()(deep) # 合并两部分输出 combined_output = tf.keras.layers.concatenate([wide, deep]) output = tf.keras.layers.Dense(1, activation='sigmoid')(combined_output) model = tf.keras.Model(inputs, output) return model ``` #### 参考上述内容总结得出结论: 综上所述,《Wide & Deep Learning for Recommender Systems》一文出自谷歌团队的研究成果,它是当前许多实际生产环境中所采用的技术基础理论依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值