使用EasyRec快速构建推荐模型

随着移动app的普及,个性化推荐和广告成为很多app不可或缺的一部分。他们在改善用户体验和提升app的收益方面带来了巨大的提升。深度学习在搜广推领域的应用也已经非常深入,并且给各种场景的效果带来了巨大的提升。针对推荐流程的各个阶段,业界已经有很多的模型,这些模型大部分也有开源的实现,但是这些实现通常散落在github的各个角落,其数据处理和特征构造的方式各有差异。如果我们想要在一个新的场景里面应用这些模型,通常需要做比较多的改动:

输入的改造,开源的实现的输入格式和特征构造通常和线上不一致,适配一个算法通常需要1-2周左右的时间,还难免因为对代码的不熟悉引入bug,如果要尝试5个算法的话,就需要5倍的改造时间。如果算法资源有限,这时候是不是就要忍痛割爱,放弃一些可能有效果的尝试了?

开源的实现很多只是在公开数据集上取得了比较好的效果,在公开数据集上的最优参数也不一定适合实际的场景,因此参数调优也需要较大的工作量;有时候效果不好,并不是因为方法不行,而是选的参数不太好。如果没有系统化的调参方法,很多算法也就是简单试一下,没有deep explore,哪来对算法的深入理解呢? 为什么看似简单的改进,你没有能够发现呢? 为什么你也尝试了类似的方向,但是没有搞出来效果呢? 效果通常都是用算力和数不尽的尝试堆出来的;

开源的实现用的是tensorflow 1.4,而线上用的tensorflow 2.3,好多函数的参数都变掉了(此处心里是不是想骂google一百遍,当初信誓旦旦说好的api不再变呢); 很多开源的实现由于没有在实际场景中验证过,所以其可靠性也是存疑的,可能就会少了个dropout,少了一个bn,效果相差甚远;

费了九牛二虎之力把模型效果调好了,发现上线也会有很多问题,比如训练速度太慢、内存占用太大、推理qps跟不上、离线效果好在线效果跪等等。遇到这么多问题,你还有精力去做你的下一个idea吗?你还能斗志昂扬,坚持不懈的去探索新方向吗?
这些问题搞得我们心有余而力不足、天天加班到深夜、不知何时是个头:想要验证一个简单的idea都要使出九牛二虎之力。所谓天下武功,唯快不破,对于搜广推领域的算法同学来说,尤其如此:通过快速迭代才能验证更多的想法,发现更多的问题,找出最优的特征和模型结构。速度慢了的话,可能你的模型还没调好,业务目标就变了,前端的布局也改了,你的业务方可能都不相信你了,你也就没机会上线了。

说到这里,我们的诉求就比较明确了,我们就是想少写代码,甚至不写代码就能验证我们的想法。针对这些问题和诉求,我们推出一个全新的、一步到位的推荐建模框架,致力于帮助大家解决在推荐建模、特征构造、参数调优、部署等方面的问题,让大家少写代码,少干重复的没有意义的脏活累活(这些EasyRec都承包了),少趟一些坑少踩一些雷(这些EasyRec都替你趟了),让大家能够快速上线验证新的idea,提升推荐模型的迭代效率。

优势

在这里插入图片描述

和其他建模框架相比,EasyRec在以下几个方面具备显著的优势:

支持多平台和多数据源训练

支持的平台包括: MaxCompute(原ODPS), DataScience(基于Kubernete), DLC(deep learning container), Alink, 本地;

支持的数据源包括: OSS, HDFS, HIVE, MaxCompute Table, Kafka, Datahub;

用户通常只需要定义自己的模型,在本地测试通过后,就可以在多种分布式平台上进行训练;

支持多种Tensorflow版本(>=1.12, <=2.4, PAI-TF),能够无缝的对接用户的环境,不需要对代码做迁移和改动;

支持主流的特征工程的实现,特别是显示交叉特征,能够显著得提升效果;

支持HPO自动调参,显著降低了用户的调参工作量,并在多个场景中提升了模型效果;

实现了主流的深度模型,覆盖召回、排序、粗排、重排、多目标、多兴趣等;

支持EarlyStop, BestExport, 特征重要性,特征选择、模型蒸馏等高级功能。

架构

在这里插入图片描述

EasyRec建模框架整体上是基于Estimator的数据并行训练方式,通过Parameter Server的结构支持多机多卡的训练。EasyRec的主要模块包括输入、特征构造、深度模型、Loss和Metric,每个模块都可以自定义。针对用户在用TF进行训练可能遇到的多种问题,如worker退出失败、使用num_epoch evaluator无法退出、auc计算不准确等,EasyRec做了深度优化。针对AdamOptimizer训练速度慢,异步训练慢机,hash冲突,大样本空间负采样等问题,EasyRec结合PAI TF(PAI优化过的tensorflow)和AliGraph也做了深度优化。

模型

EasyRec内置了业界领先的深度学习模型, 覆盖了推荐全链路的需求,包括召回、粗排、排序、重排、多目标、冷启动等。

在这里插入图片描述

同时EasyRec也支持用户自定义模型。如下所示,在EasyRec里面实现自定义模型,只需要定义模型结构、Loss、Metric三个部分,数据处理和特征工程是可以直接复用框架提供的能力的,因此能够显著节省用户的建模时间和成本,能够将精力focus在模型结构的探索上。针对常见的模型类型如RankModel、MultiTaskModel等,Loss和Metric部分也可以直接复用父类的定义。

class CustomModel(EasyRecModel):

  def __init__(self, model_config, feature_configs, features, 
               labels=None, is_training=False):
      super(CustomModel, self).__init__(model_config, feature_configs, 
                                        features, labels, is_training)
      # build wide features from feature_group with name "wide" 
      self._wide_features, _ = self._input_layer(self._feature_dict, "wide")
      # build deep features from feature_group with name "deep"
      self._deep_features, self._deep_feature_lst = self._input_layer(
        	self._feature_dict, "deep")

  def build_predict_graph(self):
      self._prediction_dict["logits"] = DNN(self._deep_features) + \
          LINEAR(self._wide_features)
      self._prediction_dict["probs"] = \
          tf.nn.sigmoid(self._prediction_dict["logits"])
      # it is necessary to return the prediction_dict, 
      # which is required by the framework
      return self._prediction_dict

  def build_loss_graph(self):
      # build losses
      loss = tf.losses.sigmoid_cross_entropy(self._labels[0], 
                                             self._prediction_dict['logits'])
      self._loss_dict["custom_loss"] = loss
      return self._loss_dict

  def build_metric_graph(self, eval_config):
      # build auc metric
      metric_dict = {}
      metric_dict["auc"] = tf.metrics.auc(self._labels[0], 
                                          self._prediction_dict["probs"])
      return metric_dict

自动调参和自动特征工程

EasyRec自动调参接入了PAI automl自动调参的能力,实现了对多种参数的自动调优。EasyRec里面定义的任意参数都是可以搜索的,常见的参数包括hash_bucket_size, embedding_dim, learning_rate,dropout, batch_norm, 特征选择等。当你对某些参数拿不准时,就可以启动自动调参来帮助你寻找最优的设置;通过自动寻优得到的参数通常会比拍脑袋设置的参数要好,有时候还会带来意外的惊喜。

特征工程通常是提升推荐效果的关键,做高阶的特征组合通常有助于提升模型效果,但是高阶组合的空间非常大,无脑组合会导致特征爆炸,拖累训练和推理的速度。因此,EasyRec引入了自动特征工程(AutoFeature)的能力,自动寻找有提升的高阶特征,进一步提升模型的效果。

在这里插入图片描述

搜索结果(top5):

在这里插入图片描述

查看本文全部内容,欢迎访问天池技术圈官方地址:https://tianchi.aliyun.com/forum/post/354303

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/452936.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的石头剪刀布手势识别系统详解(深度学习模型+UI界面代码+训练数据集)

摘要&#xff1a;本篇博客深入探讨了使用深度学习技术开发石头剪刀布手势识别系统的过程&#xff0c;并分享了完整代码。该系统利用先进的YOLOv8、YOLOv7、YOLOv6、YOLOv5算法&#xff0c;并对这几个版本进行性能对比&#xff0c;如mAP、F1 Score等关键指标。文章详细阐述了YOL…

【算法题解】Java算法题目解析

1. 数字三角形 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);int n scan.nextInt();int[][] dp new int[n 1][n 1];int max 0;for (int i 1; i < dp.length; i) {for (int j 1; j &l…

Android 生成SO - 基础工程创建

最近需要给小伙伴扫盲一下如何使用Android Studio 生成一个SO文件&#xff0c;网上找了很多都没有合适的样例&#xff0c;那只能自己来写一个了。 原先生成SO是一个很麻烦的事情&#xff0c;现在Android Studio帮忙做了很多的事情&#xff0c;基本只要管好自己的C代码即可。 …

第2篇【Docker项目实战】使用Docker部署Raneto知识库平台(转载)

【Docker项目实战】使用Docker部署Raneto知识库平台 一、Raneto介绍 1.1 Raneto简介 Raneto是一个免费、开放、简单的 Markdown 支持的 Node.js 知识库。 1.2 知识库介绍 知识库 知识库是指存储和组织知识的系统或库&#xff0c;它包括了各种类型的信息和知识&#xff0c;如…

【数学建模】熵权法 Python代码

熵权法是一种客观的赋权方法&#xff0c;它可以靠数据本身得出权重。 依据的原理&#xff1a;指标的变异程度越小&#xff0c;所反映的信息量也越少&#xff0c;其对应的权值也应该越低。 import numpy as np#自定义对数函数mylog&#xff0c;用于处理输入数组中的0元素 def m…

OpenCV和Mediapipe实现摸嘴或鼻检测

目录 引言 1.过程简介 2. 代码结构 2.1 导入库 2.2 初始化模型 2.3 读取视频流或摄像头 2.4 初始化FPS计算 2.5 主循环 2.6 转换BGR图像为RGB图像 2.7 运行姿势检测模型和手部检测模型 2.8 绘制姿势关键点及连接线 2.9 检测手部关键点 2.10 判断手部与鼻子、嘴的相对…

300分钟吃透分布式缓存-28讲:如何构建一个高性能、易扩展的Redis集群?

Redis 集群的分布式方案主要有 3 种。分别是 Client 端分区方案&#xff0c;Proxy 分区方案&#xff0c;以及原生的 Redis Cluster 分区方案。 Client 端分区 Client 端分区方案就是由 Client 决定数据被存储到哪个 Redis 分片&#xff0c;或者由哪个 Redis 分片来获取数据。…

DVWA靶场-暴力破解

DVWA是一个适合新手锻炼的靶机&#xff0c;是由PHP/MySQL组成的 Web应用程序&#xff0c;帮助大家了解web应用的攻击手段 DVWA大致能分成以下几个模块&#xff0c;包含了OWASP Top 10大主流漏洞环境。 Brute Force——暴力破解 Command Injection——命令注入 CSRF——跨站请…

职场中的创新思维与执行力

在职场中&#xff0c;创新思维和执行力是两个关键要素。创新思维能够帮助员工在工作中找到更好的解决方案&#xff0c;而执行力则是将想法付诸实践的能力。本文将探讨如何在职场中培养创新思维和提升执行力。 一、创新思维的重要性 在职场中&#xff0c;创新思维是推动企业发展…

Docker容器化技术(互联机制实现便捷互访)

容器的互联是一种让多个容器中的应用进行快速交互的方式。它会在源和接收容器之间创建连接关系&#xff0c;接收容器可以通过容器名快速访问到源容器&#xff0c;而不用指定具体的IP地址。 1.自定义容器命名 连接系统依据容器的名称来执行。因此&#xff0c;首先需要自定义一…

Django 模版基本语法

Django学习笔记 模版语法 本质&#xff1a;在HTML中写一些占位符&#xff0c;由数据对这些占位符进行替换和处理。 views.py def page2(request):#定义一些变量将变量传送给templates中的html文件name1 sallyname2 yingyinghobbys [swimming,badminton,reading]person {…

惬意上手Redis

Redis介绍 Redis&#xff08;全称为REmote Dictionary Server&#xff09;是一个开源的、内存中的数据存储结构&#xff0c;主要用作应用程序缓存或快速相应数据库。 REmote Dictionary Server: 有道翻译Redis是“远程字典服务”&#xff0c;远程不过是远程访问&#xff0c;而…

Ingress 实战:从零到一构建高可用服务

Ingress 是 Kubernetes 中一种用于控制流量进入集群的资源。它可以为集群内的服务提供统一的访问入口&#xff0c;并提供一些额外的功能&#xff0c;例如&#xff1a; 路由流量到不同的服务 提供基于路径的路由 提供基于主机的路由 提供 TLS 加密 使用身份验证和授权 Ing…

SQL: 触发器/存储过程/游标的操作

目录 触发器存储过程创建存储过程修改存储过程删除存储过程执行存储过程 游标待续、更新中 触发器 待更新存储过程 定义 是一组TSQL语句的预编译集合&#xff0c;能实现特定的功能 是一种独立的数据库对象&#xff0c;在服务器上创建和运行 类似于编程语言中的过程或函数分类…

SublimeText4 安装

Sublime Text 可以编写html&#xff0c;css&#xff0c;js&#xff0c;php等等&#xff0c;是一个轻量、简洁、高效、跨平台的编辑器。 图1&#xff1a;SublimeText官网 Sublime Text具有漂亮的用户界面和强大的功能&#xff0c;例如代码缩略图&#xff0c;Python的插件&#…

Java学习记录(十九)多线程(一)

线程 线程是操作系统能进行调度的最小单位&#xff0c;他是被包含在进程中的&#xff0c;一个运行的软件可以看作为一个进程&#xff0c;而在该软件中执行的各种功能自身可以理解为一个线程&#xff0c;可以理解为在软件中互相独立又可以同时进行的功能&#xff0c;他是进程中…

js视频上传的方法

一、视频上传于图片上传类似他们的上传方法一样。路径不同标签不同&#xff1b; 二、直接上效果 三、直接上代码 // // 上传图片 let urls "https://wwz.jingyi.icu/"; let a $("form img") // console.log(a);function fl() {let read document.getE…

计算机网络面经八股-解释一下HTTP长连接和短连接?

在HTTP/1.0中&#xff0c;默认使用的是短连接。也就是说&#xff0c;浏览器和服务器每进行一次HTTP操作&#xff0c;就建立一次连接&#xff0c;但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源&#xff0c;如JavaScript文件、图…

探索制氮机在农产品保鲜中的应用方式

在现代生活中&#xff0c;农产品保鲜成为老生常谈的话题&#xff0c;水果数次厂商总是在为如何使水果蔬菜能够保存时间长一点而发愁&#xff0c;而制氮机的出现则解决了这一难题&#xff0c;为农产品保鲜技术带来了革命性的变革。本期恒业通小编和您一起了解制氮机在水果,蔬菜保…

k8s+wordpress+zabbix+elastic+filebeat+kibana服务搭建以及测试

一&#xff0c;环境&#xff1a;docker&#xff0c;k8s&#xff0c;zabbix&#xff0c;以及搭建worpdress&#xff0c;elasticsearch&#xff0c;filebeat&#xff0c;kibana 二&#xff0c;主机分配&#xff1a; 名称host详述个人博客3192.168.142.133 搭配mysql8.0.36的数据…