Wide&Deep
记忆能力:模型直接学习并利用历史数据中物品或特征的“共现频率”的能力。
- 高频、常见的特征
泛化能力:模型传递特征的相关性,以及发掘稀疏甚至从未出现过的稀有特征与最终标签相关性的能力。
不应该进 DNN,进入 DNN 之后没有记忆性。
Wide 侧
-
人工特征工程
- 只输入已安装应用以及曝光应用
看Google如何实现Wide & Deep模型
-
稀疏的类别/ID类特征,稀疏地存储、传输、运算,提升运算效率
-
Google在其著名的《Ad Click Prediction: a View from the Trenches》一文中提到,因为稀疏/稠密的区别,CNN中效果良好的Dropout技术,运用到CTR预估、推荐领域反而会恶化性能。
-
即使有一些实数值特征,比如历史曝光次数、点击次数、CTR之类的,也往往通过bucket的方式,变成categorical特征,才喂进模型。
- 连续特征归一化后,再分段,粗粒化,增强泛化能力。
-
[[Linear Regression]] 和 [[DNN]] 在底层还是线性模型,增强非线性
-
标签y与特征x之间较少存在线性关系,而往往是分段的。
- 点击率~历史曝光次数,曝光低可能点击,曝光高后可能不点击。
-
-
单个特征表达能力弱、特征组合爆炸、分布不均匀导致受训程度不均匀的缺点
-
[[FTRL]] 快速预测
-
[[Parameter Server]]
-
TensorFlow Feature Column
-
-
特征交叉
-
[[Feature Column]] 自动处理 missing value 和 OOV
-
FeatureColumn
-
DenseColumn
-
CategoricalColumn
-
Numeric Column
数值特征 -
Bucketized Column
数值特征转化为 categorical 特征 -
Categorical vocabulary column
-
处理生僻字(Out-Of-Vocabulary, OOV) [[out of vocabulary]]
-
填充符(Padding)
-
-
Weighted categorical column
解决上面没有权重的遗憾 -
Hashed categorical column
结果 tag 太多以及不知道一个分类下有多少 tag -
Feature Cross
特征交叉
-
-
共享 embedding matrix 「相同的 variable scope + 相同 variable name」
[[Code]]
-
tf.estimator.DNNLinearCombinedClassifier
-
稀疏特征向量如何乘以一个稠密的权重矩阵
-
One-Hot-Encoding
-
Multi-Hot-Encoding
-
tf.sparse.SparseTensor(indices, values, dense_shape)
dense_shape 需要指定原始 tensor 的尺寸 -
[[Tensorflow]]
-
tf.sparse_tensor_dense_matmul(sp_a, b, ……)
- 特征权重默认为 1
-
tf.nn.embedding_lookup_sparse(params, sp_ids, sp_weights)
-
相同 id 取出权重后可以指定聚合方法
-
一个 feature 有多个
<tag, value>
-
实际使用
safe_embedding_lookup_sparse
-
和
embedding_lookup
区别- 处理离散特征只有一个取值的情况。无法处理多个 tag。
-
-
-
如何实现两部分使用不同的优化器
group
-
TODO [[ETA 模型]] 实现
-
-
特征
-
_CategoricalColumn
-
_WeightedCategoricalColumn
-
_DenseColumn
-
_EmbeddingColumn
-
[[Ref]]
-
为什么wide&deep模型用ftrl和adagrad两种优化方法? - 知乎
-
wide 部分看成传统的 lr,用 ftrl 可以得到稀疏权重,ftrl 考虑之前每一轮训练的梯度和。
- lr稀疏为了减少特征数量,可以降低计算复杂度
-
deep 部分是神经网络,权重是否稀疏不重要,过去样本提供的信息少于最近的样本提供的信息。
-
-
见微知著,你真的搞懂Google的Wide&Deep模型了吗? - 知乎
- Wide 部分大量 id 特征进行交叉,利用 [[FTRL]] 以及 L1 正则过滤稀疏特征。