8.5 排序模型进阶-Wide&Deep

学习目标

  • 目标

  • 应用

8.5.1 wide&deep

  • Wide部分的输入特征:

    • raw input features and transformed features
    • notice: W&D这里的cross-product transformation:
    • 只在离散特征之间做组合,不管是文本策略型的,还是离散值的;没有连续值特征的啥事,至少在W&D的paper里面是这样使用的。
  • 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

代码:

import tensorflow as tf
from tensorflow.python import kerasclass WDL(object):"""wide&deep模型"""def __init__(self):pass@staticmethoddef read_ctr_records():# 定义转换函数,输入时序列化的def parse_tfrecords_function(example_proto):features = {"label": tf.FixedLenFeature([], tf.int64),"feature": tf.FixedLenFeature([], tf.string)}parsed_features = tf.parse_single_example(example_proto, features)feature = tf.decode_raw(parsed_features['feature'], tf.float64)feature = tf.reshape(tf.cast(feature, tf.float32), [1, 121])# 特征顺序 1 channel_id,  100 article_vector, 10 user_weights, 10 article_weights# 1 channel_id类别型特征, 100维文章向量求平均值当连续特征,10维用户权重求平均值当连续特征channel_id = tf.cast(tf.slice(feature, [0, 0], [1, 1]), tf.int32)vector = tf.reduce_sum(tf.slice(feature, [0, 1], [1, 100]), axis=1, keep_dims=True)user_weights = tf.reduce_sum(tf.slice(feature, [0, 101], [1, 10]), axis=1, keep_dims=True)article_weights = tf.reduce_sum(tf.slice(feature, [0, 111], [1, 10]), axis=1, keep_dims=True)label = tf.reshape(tf.cast(parsed_features['label'], tf.float32), [1, 1])# 构造字典 名称-tensorFEATURE_COLUMNS = ['channel_id', 'vector', 'user_weigths', 'article_weights']tensor_list = [channel_id, vector, user_weights, article_weights]feature_dict = dict(zip(FEATURE_COLUMNS, tensor_list))return feature_dict, labeldataset = tf.data.TFRecordDataset(["./train_ctr_201905.tfrecords"])dataset = dataset.map(parse_tfrecords_function)dataset = dataset.shuffle(buffer_size=10000)dataset = dataset.repeat(10000)return dataset.make_one_shot_iterator().get_next()def build_estimator(self):"""建立模型:param dataset::return:"""# 离散分类article_id = tf.feature_column.categorical_column_with_identity('channel_id', num_buckets=25)# 连续类型vector = tf.feature_column.numeric_column('vector')user_weigths = tf.feature_column.numeric_column('user_weigths')article_weights = tf.feature_column.numeric_column('article_weights')wide_columns = [article_id]# embedding_column用来表示类别型的变量deep_columns = [tf.feature_column.embedding_column(article_id, dimension=25),vector, user_weigths, article_weights]estimator = tf.estimator.DNNLinearCombinedClassifier(model_dir="./ckpt/wide_and_deep",linear_feature_columns=wide_columns,dnn_feature_columns=deep_columns,dnn_hidden_units=[1024, 512, 256])return estimatorif __name__ == '__main__':wdl = WDL()# dataset = wdl.read_ctr_records()# lwf.train(dataset)# lwf.train_v2(dataset)estimator = wdl.build_estimator()estimator.train(input_fn=wdl.read_ctr_records, steps=10000)# eval_result = estimator.evaluate(input_fn=wdl.read_ctr_records, steps=10000)# print(eval_result)

WDL模型导出

3.2 线上预估

线上流量是模型效果的试金石。离线训练好的模型只有参与到线上真实流量预估,才能发挥其价值。在演化的过程中,我们开发了一套稳定可靠的线上预估体系,提高了模型迭代的效率。

模型同步

我们开发了一个高可用的同步组件:用户只需要提供线下训练好的模型的HDFS路径,该组件会自动同步到线上服务机器上。该组件基于HTTPFS实现,它是美团离线计算组提供的HDFS的HTTP方式访问接口。同步过程如下:

  1. 同步前,检查模型md5文件,只有该文件更新了,才需要同步。
  2. 同步时,随机链接HTTPFS机器并限制下载速度。
  3. 同步后,校验模型文件md5值并备份旧模型。

同步过程中,如果发生错误或者超时,都会触发报警并重试。依赖这一组件,我们实现了在2min内可靠的将模型文件同步到线上。

模型计算

当前我们线上有两套并行的预估计算服务。

基于TF Serving的模型服务

TF Serving是TensorFlow官方提供的一套用于在线实时预估的框架。它的突出优点是:和TensorFlow无缝链接,具有很好的扩展性。使用TF serving可以快速支持RNN、LSTM、GAN等多种网络结构,而不需要额外开发代码。这非常有利于我们模型快速实验和迭代。

使用这种方式,线上服务需要将特征发送给TF Serving,这不可避免引入了网络IO,给带宽和预估时延带来压力。我们尝试了以下优化,效果显著。

  1. 并发请求。一个请求会召回很多符合条件的广告。在客户端多个广告并发请求TF Serving,可以有效降低整体预估时延。
  2. 特征ID化。通过将字符串类型的特征名哈希到64位整型空间,可以有效减少传输的数据量,降低使用的带宽。

导出代码:

# 导出serving_model
wide_columns = [tf.feature_column.categorical_column_with_identity('channel_id', num_buckets=25)]
deep_columns = [tf.feature_column.embedding_column(tf.feature_column.categorical_column_with_identity('channel_id', num_buckets=25), dimension=25),tf.feature_column.numeric_column('vector'),tf.feature_column.numeric_column('user_weigths'),tf.feature_column.numeric_column('article_weights')]columns = wide_columns + deep_columns
feature_spec = tf.feature_column.make_parse_example_spec(columns)
serving_input_receiver_fn = tf.estimator.export.build_parsing_serving_input_receiver_fn(feature_spec)
estimator.export_savedmodel("./serving_model/wdl/", serving_input_receiver_fn)

排序模型进阶-WideDeepWDL模型导出相关推荐

  1. 头条项目推荐的相关技术(十):排序模型进阶与总结

    1. 写在前面 这里是有关于一个头条推荐项目的学习笔记,主要是整理工业上的推荐系统用到的一些常用技术, 这是第八篇, 上一篇文章介绍了一些深度学习和TensorFlow框架相关的知识, 有了这些知识, ...

  2. Python黑马头条推荐系统第五天 头条排序模型进阶-神经网络

    黑马头条排序模型进阶 7.1 神经网络基础与原理 学习目标 目标 了解感知机结构.作用以及优缺点 了解tensorflow playground的使用 说明感知机与神经网络的联系 说明神经网络的组成 ...

  3. 排序模型进阶-FMFTRL

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 5.8 排序模型进阶-FM&FTRL 学习目标 目标 ...

  4. 「PyTorch自然语言处理系列」7. 自然语言处理的进阶序列模型

    来源 |  Natural Language Processing with PyTorch 作者 | Rao,McMahan 译者 | Liangchu 校对 | gongyouliu 编辑 | a ...

  5. 【Visual C++】游戏开发五十一 浅墨DirectX教程十九 网格模型进阶之路

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8770426 作者:毛星云(浅墨 ...

  6. 笔记︱风控分类模型种类(决策、排序)比较与模型评估体系(ROC/gini/KS/lift)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 本笔记源于CDA-DSC课程,由常国珍老师主讲 ...

  7. Matlab 2018a与SolidWorks联合仿真——如何将SolidWorks模型以xml格式导出至Matlab中

    Matlab 2018a与SolidWorks联合仿真--如何将SolidWorks模型以xml格式导出至Matlab中   要实现Solidworks与Matlab的联合仿真,需要在Solidwor ...

  8. 推荐系统-排序层:主流CTR模型综述【Click-Through-Rate,点击率预估,指精排层的排序】【CTR 模型的输入(即训练数据)是:大量成对的 (features, label)数据】

    一.CTR 模型建模 在讲 CTR 模型之前,我们首先要清楚 CTR 模型是什么,用来解决什么问题.所以我们先描述 CTR 问题,并对其进行数学建模. 一个典型的推荐系统架构如下图所示: 一般会划分为 ...

  9. PowerDesigner 将pdm模型表 用命令导出成Excel表格

    PowerDesigner 将pdm模型表 用命令导出成Excel表格 使用步骤: 打开PowerDesigner 快捷键 Ctrl+Shift+X 直接将代码复制进去即可. 代码: '******* ...

最新文章

  1. 区块链挖矿的钱从哪来 区块链挖矿怎么挣钱
  2. c语言中合法的字符型常量是,C语言习题库(带答案)-排版.doc
  3. 华为鸿蒙系统智能手机_华为鸿蒙2.0支持设备清单:真正的国产机系统,你的机型支持吗...
  4. Scala中心基金会成立
  5. 使用PIE/PIF值判断DVD刻录机的刻录品质
  6. QT-qevent 事件的accept()和ignore()
  7. Django(三)模板
  8. web前端之html从入门到精通
  9. Java StringBuffer 用法
  10. excel打开2个独立窗口_喜欢用华为手机拍照,记得打开这2个开关,能让照片更加清晰...
  11. Perl语言入门,第17章自写习题答案。
  12. linux 下压缩解压命令
  13. 微计算机原理与接口半期考试,最新南京邮电大学微型计算机原理与接口技术期末考试试卷...
  14. 618的优惠券去哪了?
  15. 数格子算面积的方法_数方格在平面图形面积公式推导教学中的妙用
  16. mongodb 使用场景
  17. 分享丨人脸数据集的史上最大规模调查
  18. JQuery——横纵向菜单设计
  19. 网络聊天中的英语简写
  20. python保存图片格式_python 存储网页图片格式

热门文章

  1. MySQL数据库授权备份恢复
  2. 微信小程序scroll-into-view实现页面定位
  3. 如何用pdf转jpg软件将pdf转换成图片
  4. 华为超融合一体机助力深圳海关业务性能大幅提升
  5. 怎么实现ZBrush 4R7中界面视窗的快速转换
  6. 【国产FPGA】国产FPGA搭建图像处理平台
  7. 浅谈“敏感信息泄露“
  8. 分布式存储系统 Ceph 介绍与环境部署
  9. 【笔记】三剑客之sed、grep sort uniq
  10. 面试中常问的TOPK