多目标建模总结

1. 概述

在推荐系统中,通常有多个业务目标需要同时优化,常见的指标包括点击率CTR、转化率CVR、 GMV、浏览深度和品类丰富度等。为了能平衡最终的多个目标,需要对多个目标建模,多目标建模的常用方法主要可以分为:

  • 多模型的融合
  • 多任务学习 - 底层共享表示的优化 - 任务序列依赖关系建模

多模型的融合是根据不同的指标训练不同的模型,最终对多个模型的结果做融合;多任务学习是目前处理多目标建模使用较多的方法,相较于多模型的融合,多任务学习能做到端到端的学习,同时能够节约建模的时间,因为多个模型可以同时建模。在多任务学习中,又可以细分成底层共享表示的优化和任务序列依赖关键的建模。在底层共享表示的优化中,以MMoE(Multi-gate Mixture-of-Experts)[1]和PLE(Progressive Layered Extraction)[2]两种网络结构较为常用。在任务序列依赖关系建模中,以阿里的ESMM[3]较为典型。

在多目标的建模过程中,如果不同的学习任务之间较为相关时,多个任务之间可以共享一部分的信息,这样最终能够提升整体的模型学习效果。但是如果多个任务之间的相关性并不强,或者说多个任务之间存在某种冲突,这样通过部分的共享就会起到事与愿违的效果,这便是通常所说的在多任务建模中出现的负迁移(negative transfer)现象,即在相关性不强或者无相关性的多任务环境下进行信息共享,最终影响整体的网络效果;另一方面,在多任务建模过程中,还存在一种被称为跷跷板现象(seesaw phenomenon),简单来说就是在对多个目标进行优化的过程中,一个任务指标的提升伴随着另外一些任务指标的下降。出现这种现象的主要原因是多个任务之间出现较多的共享。因此,很多的改进算法都在致力于解决这两个问题。

2. 多目标建模的常用方法

2.1.多模型的融合

多模型的融合是指根据不同的任务单独训练不同的模型,最终根据最终的目标将各模型的结果相加或者相乘后进行融合排序。以CTR和CVR为例,最终的目标通常是CTCVR,因此,可以分别训练一个CTR模型和CVR模型,如下图所示:

通常在实际的任务中会根据不同任务的重要性,对该任务赋予不同的权重。这种方案最主要的优点是相对较为简单,每次单独训练一个模型,只需要调优该模型,不需要考虑其它目标。缺点也是很明显的,主要有如下的几个方面:

  • 多个模型结果的融合,这里面涉及到超参数的选择,通常可以采取grid search的方案确定超参;
  • 每次调优一个模型,而不更新组合并不一定会带来最终效果的提升;
  • 没有考虑两个数据之间的关系,如上述的CTR与CVR之间存在顺序的关系;

2.2. 多任务学习

对于多模型融合存在的问题,通过多任务学习能够在一定程度上解决这些问题,首先,在多任务学习中,由于将多个模型合并成一个模型,这样能够减少维护成本及减少资源;对于数据较为稀疏的任务,通过多任务学习的方式,能够提高模型的效果;

2.2.1. 底层共享表示的优化

在底层共享表示优化中,目前业界主流的多目标建模的网络结构是MMoE[1]和PLE[2]两种,其中MMoE的网络结构如下图c所示:

在上图a中是Shared-Bottom model,任务A和任务B共享部分的网络结构,假设这部分的共享网络结构由f\left ( x \right ) 表示,h^A\left ( f\left ( x \right ) \right ) 表示的是任务A的输出,h^B\left ( f\left ( x \right ) \right ) 表示的是任务B的输出,综上,Shared-Bottom Model可由下式表示:

y_k=h^k\left ( f\left ( x \right ) \right )

通过在底层共享网络,能够起到互相补充学习的作用,上层的任务之间相关性越高,对于模型的学习也会越充分,但是,如果上层的任务之间的相关性很差,这种情况对于最终的效果却是起到了抑制的作用,即上面提到的负迁移现象,这也是多任务学习难以训练的一个原因。在很多的图像相关的任务中,就存在这样的结构,以人脸检测任务为例,在人脸检测任务重包括了三个方面的目标,分别为face classification,bounding box regression和facial landmark localization,这三个任务可以共享底层的CNN网络,以MTCNN[4]模型为例,其中的O-Net的网络结构如下图所示:

最终的损失函数为:

min\; \sum_{i=1}^{N}\sum_{j\in \left \{ det,box,landmark \right \}}\alpha _j\beta _i^jL_i^j

其中,\alpha _j\beta _i^j 是两个超参,这两个超参在参考[4]中是根据经验值确定的,L_i^j 表示的是第j 个任务的损失函数。

上图b中是One-gate MoE model,相比于Shared-Bottom model,有两点优化,第一,引入多个Shared Bottom组成MoE结构;第二,引入门控网络Gate函数。One-gate MoE Model可由下式表示:

y_k=h^k\left ( \sum_{i=1}^{n}g\left ( x \right )_if_i\left ( x \right ) \right )

在底层共享网络的基础上,引入了多个Shared Bottom,对于不相关的任务联合学习效果不佳问题,能够通过类似集成方法的方式针对不同上层任务选择不同的底层共享网络,使得不同任务具有不同的底层网络。但是在One-gate的模型下,仍然存在一些问题,如多个任务对于底层的分布是一致的。

上图c中是Multi-gate MoE model,MMoE是在One-gate MoE Model的基础上,针对每一个任务独享一个门控网络,Multi-gate MoE Model可由下式表示:

y_k=h^k\left ( \sum_{i=1}^{n}g^k\left ( x \right )_if_i\left ( x \right ) \right )

MMoE针对每个任务有单独的门控网络g^k\left ( x \right )_i ,同时在底部共享几个专家网络,通过不同的门控网络去控制专家网络对于不同任务的权重贡献,这样不同的任务对于多个专家的分布是不同的,能够有效对任务之间的联系进行建模。然而,在MMoE模型中,只是强调对于上层任务的共性构建底层专家,对于上层任务的差异却没有区别对待,CGC便是基于这样的目的被提出的模型,CGC模型的结构如下图所示:

在CGC的网络结构中,其底层网络包括了shared experts和task-specific expert两个部分,且每一个expert部分都是由多个expert组成,上层针对每一个任务都有一个门控网络,且门控网络的输入是共享的experts和该任务对应的experts。由此可见,在CGC网络中,既包含了task-specific网络针对特定任务独有的信息,也包含了shared网络共享的信息。为了与MMoE中的表达式一致,修改在参考[2]中的表达式,因此CGC网络可以表示为:

y_k=h^k\left ( \sum_{i=1}^{m_k+m_s}g^k\left ( x \right )_if_i\left ( x \right ) \right )

其中,对于专家输出f_i\left ( x \right ) 中,包含了两个部分,一个是特定任务对应的专家,另一部分是共享的专家。为了能够得到更具有泛化能力的网络,可以将上述网络构建得更深,这便有了PLE结构,PLE是在CGC网络结构的基础上,由single-level衍生为multi-level。具体的PLE网络结构如下图所示:

除了第一个Extraction Network的输入是原始的Input,其余的Extraction Network的输入是上一个Extraction Network的输出,即包含两个大的部分,即特定任务对应的专家网络输出,如上图中的Experts A和Experts B的输出,另外一个是共享专家网络的输出,如上图中的Experts Shared的输出。在多任务重,其损失函数为各任务损失的加权求和,即为:

L_k\left ( \theta _1,\cdots ,\theta _K,\theta _s \right )=\sum_{k=1}^{K}\omega _kL_k\left ( \theta _k,\theta _s \right )

其中,\omega _k 为第k 个任务的权重,具体对于\omega _k 的设置可以见参考[2]。

2.2.2. 任务序列依赖关系建模

对于CTR,CVR这样的多任务情况下,两个任务之间是存在相互依赖关系的,假设\mathbf{x} 表示的是一条曝光样本,y\in \left\{ 0,1\right\} 表示的是该曝光样本是否被点击,z\in \left\{ 0,1\right\} 表示的是该样本在曝光点击后是否有转化,对点击率(CTR)建模是预估点击率:pCTR=p\left ( y=1\mid \mathbf{x} \right ) ,对CVR建模是预估转化率:pCVR=p\left ( z=1\mid y=1,\mathbf{x} \right ) 。然而上述的诸如MMoE或者PLE的模型中并未考虑任务之间的序列依赖关系。对于CVR的建模,在训练时只能利用点击后的样本,而预测时,是在整个样本空间,这样导致训练和预测样本分布不一致,即样本选择性偏差。同时点击样本只占整个样本空间的很小比例,存在样本稀疏性问题。

在CTR,CVR这个多任务场景下,ESMM(Entire space multi-task model)[3]模型就是为解决上述两个问题而提出,在ESMM模型的建模过程中引入两个辅助任务,即:CTR建模和CTCVR建模。对于点击转化率(CTCVR):pCTCVR=p\left ( y=1,z=1\mid \mathbf{x} \right ) ,pCTR,pCVR和pCTCVR三者之间的关系为:

p\left ( z=1\mid y=1,\mathbf{x} \right )=\frac{p\left ( y=1,z=1\mid \mathbf{x} \right )}{p\left ( y=1\mid \mathbf{x} \right )}

ESMM的网络结构如下图所示:

在ESMM模型结构中,有两个特点,第一,在ESMM结构中包含了两个塔,左侧是一个CVR任务的塔,右侧是一个CTR任务的塔,因为不直接对CVR建模,因此输入空间师整个曝光样本空间;第二,在两个塔的底层Embedding层是参数共享的,这样能缓解传统的CVR建模过程中面临的数据稀疏问题。ESMM的损失函数为:

\begin{align*}L\left ( \theta _{cvr},\theta _{ctr} \right ) &= \sum_{i=1}^{N}l\left ( y_i,f\left ( \mathbf{x}_i;\theta _{ctr} \right ) \right )\\ &+ \sum_{i=1}^{N}l\left ( y_i\&z_i,f\left ( \mathbf{x}_i;\theta _{ctr} \right )\times f\left ( \mathbf{x}_i;\theta _{cvr} \right ) \right )\end{align*}

其中,\theta _{cvr} 表示的是CVR塔中的参数,\theta _{ctr} 表示的是CTR塔中的参数,y_i 表示的是样本\mathbf{x}_i 在CTR任务上的label,z_i 表示的是样本\mathbf{x}_i 在CVR任务上的label,f\left ( \mathbf{x}_i;\theta _{ctr} \right ) 表示的样本\mathbf{x}_i 在CTR塔中的结果,f\left ( \mathbf{x}_i;\theta _{cvr} \right ) 表示的是样本\mathbf{x}_i 在CVR塔中的结果。

3. 总结

多目标建模已经成为当前推荐系统中的标配,在多目标建模过程中,需要考虑多个目标之间的相互关系,以选择合适的多目标建模方法,同时,在多目标的损失函数的设计上,也存在很多的优化方案,需要根据具体的应用场景选择合适的损失函数,以达到对具体任务的优化。

参考文献

[1] Ma J, Zhao Z, Yi X, et al. Modeling task relationships in multi-task learning with multi-gate mixture-of-experts[C]//Proceedings of the 24th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining. 2018: 1930-1939.

[2] Tang H, Liu J, Zhao M, et al. Progressive layered extraction (ple): A novel multi-task learning (mtl) model for personalized recommendations[C]//Fourteenth ACM Conference on Recommender Systems. 2020: 269-278.

[3] Ma X, Zhao L, Huang G, et al. Entire space multi-task model: An effective approach for estimating post-click conversion rate[C]//The 41st International ACM SIGIR Conference on Research & Development in Information Retrieval. 2018: 1137-1140.

[4] Zhang K, Zhang Z, Li Z, et al. Joint face detection and alignment using multitask cascaded convolutional networks[J]. IEEE signal processing letters, 2016, 23(10): 1499-1503.

[5] 网易严选跨域多目标算法演进

本文转载于网络 如有侵权请联系删除

相关文章

  • 学生个人html静态网页制作 基于HTML+CSS+JavaScript+jquery仿苏宁易购官网商城模板

    常见网页设计作业题材有个人、美食、公司、学校、旅游、电商、宠物、电器、茶叶、家居、酒店、舞蹈、动漫、服装、体育、化妆品、物流、环保、书籍、婚纱、游戏、节日、戒烟、电影、摄影、文化、家乡、鲜花、礼品、汽车、其他等网页设计题目,A+水平作业,可满足大学生网页大作业网页设计需求都能满足你的需求。原始HTML+CSS+JS页面设计,web大学生网页设计作业源码,画面精明,排版整洁,内容丰富,主题鲜明,非常适合初学者学习使用。一、网页介绍?1网页简介:此作品为学生个人主页网页设计题材,HTML+CSS布局制作,web前端期末大作业,大学生网页设计作业源码,这是一个不错的网页制作,画面精明,代码为简单学生水平,非常适合初学者学习使用。2.网页编辑:网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode、Sublime、Webstorm、Text、Notepad++等任意html编辑软件进行运行及修改编辑等操作)。3.知识应用:技术方面主要应用了网页知识中的:Div+CSS、鼠标滑过特效、Table、导航栏效果、Banner、表单、二级三级页面等,视

  • 如何分析一家店铺?

    【面试题】某店铺的商品信息表中记录了有哪些商品订单明细表中记录了商品销售的流水;"订单明细表"中的'商品ID'与"商品信息表"中的'商品ID'一一对应。 问题:计算商品A,商品B,在2019年的总销售额和每月销售额 【解题思路】我们来分析一下问题,销售额=商品单价*数量。其中,商品单价在商品信息表中,商品数量在订单明细表中。这涉及到两个表,要想到《猴子从零学会SQL》里讲过的要用到多表联结。用多维度拆解分析方法来拆解下问题,销售额需要满足:是商品A和商品B的销售,销售时间是19年,订单状态为已支付。要分别计算商品A和商品B的销售,需要使用分组统计。因此这个问题可以分成3步,下面来详细说明下每个步骤。1.多表联结要用哪种联结呢?因为要保留订单明细表中所有的数据,因此我们选择以订单明细表为左表,进行左联结。联结键为商品ID。select* from订单明细表asa1 leftjoin商品信息表asa2 ona1.商品ID=a2.商品ID;复制查询结果(t1):2.条件筛选问题中的限定条件有2个:1)商品名称为商

  • AcWing 1049. 大盗阿福 (线性dp,状态机)

    思路:dp[i][0]表示第i家店铺不行窃,dp[i][1]表示第i家店铺行窃,然后从两种状态中转移即可#include<bits/stdc++.h> usingnamespacestd; constintN=1e5+10; intt,a[N],n,dp[N][2]; intmain(){ cin>>t; while(t--){ scanf("%d",&n); for(inti=1;i<=n;i++)scanf("%d",&a[i]); for(inti=1;i<=n;i++){ dp[i][1]=dp[i-1][0]+a[i]; dp[i][0]=max(dp[i-1][1],dp[i-1][0]); } cout<<*max_element(dp[n],dp[n]+2)<<endl; } }复制

  • MySQL的insert into select 引发锁表

    又是被大佬嫌弃的一天,为了不卷铺盖走人,我决定去学习一下表备份的常见方法。MySQL一般我们在生产上备份数据通常会用到这两种方法:INSERTINTOSELECTCREATETABLEASSELECT注:本文仅针对MySQLinnodb引擎,事务是可重复读RR,数据库版本为5.51.INSERTINTOSELECTinsertintoTable2(field1,field2,...)selectvalue1,value2,...fromTable1 复制注意(1)要求目标表Table2必须存在,并且字段field,field2…也必须存在(2)注意Table2的主键约束,如果Table2有主键而且不为空,则field1,field2…中必须包括主键在执行语句的时候,MySQL是逐行加锁的(扫描一个锁一个),直至锁住所有符合条件的数据,执行完毕才释放锁。所以当业务在进行的时候,切忌使用这种方法。在RR隔离级别下,还会加行锁和间隙锁举个栗子吧:CREATETABLE`t`( `id`int(11)NOTNULLAUTO_INCREMENT, `c`int(11)DEFAULTNULL, `

  • SAP CDS view如何取得当前系统日期和系统时间戳

    取得当前系统日期-使用session变量$session.system_date@AbapCatalog.sqlViewName:'DEMO_CDS_DATTYM' @AbapCatalog.compiler.compareFilter:true @AccessControl.authorizationCheck:#NOT_REQUIRED @EndUserText.label:'DEMO' @VDM.viewType:#BASIC @Analytics.dataCategory:#FACT @Analytics.dataExtraction.enabled:true Defineviewdemo_cds_date_time asselectfromdemo { $session.system_dateassystemdate }复制取得当前系统时间戳@AbapCatalog.sqlViewName:'DEMO_CDS_DATTYM' @AbapCatalog.compiler.compareFilter:true @Acce

  • css实现圆形的四种方法

    CSS在网页上生成一个圆形的四种方法 border-radiusSVGclip-pathradial-gradient#border-radius是最简单的应用,并且得到了广泛的支持。该border-radius属性还将影响边框,阴影和元素的触摸/单击目标大小。<divclass="circle"></div>复制.circle{ background:#456BD9; border:0.1875emsolid#0F1C3F; border-radius:50%; box-shadow:0.375em0.375em00rgba(15,28,63,0.125); height:5em; width:5em; }复制效果: <br>#SVGSVG可以包含一个元素,该元素的样式可以类似于任何其他路径。它们得到了很好的支持,并且可以进行动画制作,但是与其他技术相比,它们需要更多的标记。为防止视觉上截断形状,请确保圆的半径(加上其笔触宽度的一半,如有)略小于SVG的半径viewBox。<svgviewBox="008080&

  • Hibernate第一个程序

    文章目录1.Hibernate第一个程序1.1.创建一个Maven项目1.2.创建一个实体类(JavaBean)1.3.创建这个实体类Student的映射文件1.4.核心配置文件(hibernate.cfg.xml)1.5.工具类(HibernateUtil)1.6.测试类1.7.总结Hibernate第一个程序创建一个Maven项目<dependencies> <!--hibernate核心jar包--> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.1.0.Final</version> </dependency> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artif

  • 使用Pygame在Python游戏中放置平台【Gaming】

    在本系列关于第6部分中从头开始构建Python游戏的,创建一些供角色旅行的平台。图片作者:Opensource.com这是正在进行的关于使用Pygame模块在Python3创建视频游戏的系列文章的第6部分。以前的文章有:学习如何用Python编写一个简单的骰子游戏使用Pygame模块用Python构建游戏框架如何将玩家添加到Python游戏中使用Pygame移动游戏角色没有坏人,英雄是什么?如何在Python游戏中添加一个坏人Platformer游戏需要平台。在Pygame中,平台本身就是精灵,就像你的可以用来玩的精灵一样。这一点很重要,因为有了作为对象的平台,玩家精灵就可以更容易地与它们进行交互。创建平台有两个主要步骤。首先,必须对对象进行编码,然后必须映射出要显示的对象的位置。编码平台上的对象要构建平台对象,可以创建一个名为的类。这是一个精灵,就像你的玩家精灵一样,有很多相同的属性。你的平台等级需要知道很多关于你想要的平台,它应该出现在游戏世界的什么地方,以及它应该包含什么图像的信息。很多信息可能还不存在,这取决于你计划了多少游戏,但没关系。就像你没有告诉你的玩家的精灵移动有多快,

  • 一文解决基本科研绘图需求(可视化神器ggstatsplot)(1)(概述)

    ggstatsplot介绍ggstatsplot是ggplot2包的扩展,主要用于创建美观的图片同时自动输出统计学分析结果,其统计学分析结果包含统计分析的详细信息,该包对于经常需要做统计分析的科研工作者来说非常有用。一般情况下,数据可视化和统计建模是两个不同的阶段。而ggstatsplot的核心思想很简单:将这两个阶段合并为输出具有统计细节的图片,使数据探索更简单,更快捷。 ggstatsplot在统计学分析方面:目前它支持最常见的统计测试类型:t-test/anova,非参数,相关性分析,列联表分析和回归分析。而在图片输出方面:(1)小提琴图(用于不同组之间连续数据的异同分析);(2)饼图(用于分类数据的分布检验);(3)条形图(用于分类数据的分布检验);(4)散点图(用于两个变量之间的相关性分析);(5)相关矩阵(用于多个变量之间的相关性分析);(6)直方图和点图/图表(关于分布的假设检验);(7)点须图(用于回归模型)。ggstatsplot包的常用函数ggbetweenstats函数此函数可创建小提琴图,箱形图或两者的混合,主要用于组间或条件之间的连续数据的比较,最简单的函数调

  • 木马手工查杀和隐藏控制技术分析

    实验条件:上兴远控、comodo防火墙、360安全卫士step1.生成木马step2.关闭360安全卫士、comodo防火墙。使用木马感染靶机后,靶机并无明显异常开启windows任务管理器,并无明显中毒特征,cpu使用率和内存占用率并无明显异常。使用netstat/an命令查看系统端口连接,无明显异常step2.采用COMODO防火墙安全软件killswitch观察进程和网络活动发现四个未知程序感染木马后并没有立即在服务项中发现异常查看网络连接,测试后发现如果木马控制端不进行耗费流量的操作,木马也很难发现运行comodoautorunanalyzer分析:发现未知程序,但未知程序很多,无法准确判定程序是否是恶意程序查看360Min.exe进程属性,也是未知标识,并无法准确判定程序的性质打开COMODOids入侵检测系统,发现可以检测出木马的操作。step3.360安全卫士的检测关闭靶机comodo防火墙,打开360安全卫士。在木马控制端开启靶机摄像头,提示如下图。360对于系统关键部分提供了特殊的保护,在360安全卫士的设置中找到了摄像头的控制开关。当开启靶机的屏幕实时显示时无论是3

  • 顶会ICML特别开设“怼日”Workshop,意见不同您尽管来

    安妮编译整理 量子位出品|公众号QbitAI 有真理的地方就有争论,在学术圈如此,在学术顶会上更是如此~前有NIPS获奖者登台开炮称机器学习是炼金术,怀念质疑各种想法不严谨的“学术警察”;后有马库斯NIPS研讨会上强硬质疑哈萨比斯,认为AlphaZero依赖了某些先验知识……可能是为了防止大会被破坏,也是为了守护大会的和平,今年,AI界的顶会ICML2018专有人开设了一个Workshop,为各大门派的代言人开设发声通道,特设“怼日”。大家有话好好说,意见不同您尽管来。辩论话题ICML2018将在今年7月10日至15日在斯德哥尔摩举办,目前论文、Workshop和Tutorial的提交均已截止,处于志愿者开放申请阶段。 在这场MachineLearning:TheGreatDebates(ML-GD)的单日辩论Workshop中,研究人员可以进行无手稿讨论,探讨领域内技术的现状、瓶颈及对社会的影响。 目前,组织人员在征集2-5页的研究论文或短片,无论是支持还是否定,只要是关于下面这些话题的都可以提交上来——“目前,深度学习的方法具有一定的固有局限性,将限制机器智能的提高和其对社会的影响

  • Datapump数据迁移前的准备工作(二)(r9笔记第59天)

    之前写了一篇文章分析了Datapump迁移数据的一些准备总结,反响还不错。Datapump数据迁移前的准备工作,最近碰到一个场景,根据评估还是使用Datapump比较好。主要的原因如下: 1.原来的环境在Solaris下,硬件资源老旧,需要迁移到Linux下,跨平台迁移使用逻辑迁移优先 2.原来的环境使用10gR2,现在需要顺带迁移到11gR2,充分解决备库“不中用”的情况 3.迁移的数据量不算大,在几百G以内,可以充分利用带宽和I/O吞吐量来达到预期的时间窗口。 而在这个方案之外,考虑到提高性能,我们采用了PCIE-SSD的方案加速I/O,当然使用了和源库不同的分区。 为了使应用的影响降低到最低,我们决定在迁移之后切换IP,使得新的数据库环境拥有原来的IP,这样应用端就无需做任何连接信息的修改了,DBLink的问题也能得到一并解决,无需确认更多的细节。 如果应用有重连机制,那么这种方案之外对于应用是完全透明的,就跟启停一下应用的效果一样。 这种方案使用Datapump迁移前看起来还是照葫芦画瓢,但是细细想来却有一些隐患和需要预先解决的地方,不知道大家看到我提供的背景是否有一些想法。

  • 腾讯云容器服务获取收藏列表容器服务API2.0

    说明: 当前页面接口为旧版API,未来可能停止维护。容器服务API3.0版本接口定义更加规范,访问时延下降显著,建议使用容器服务API3.0。 接口描述本接口(GetFavor)用于获取用户收藏仓库列表。接口请求域名: ccr.api.qcloud.com复制输入参数以下请求参数列表仅列出了接口请求参数,其它参数见公共请求参数。 参数名称 描述 类型 必选 offset 查询偏移量,默认为0 Uint 否 limit 查询数目,默认为20 Uint 否 输出参数 参数名称 描述 类型 code 公共错误码。0表示成功,其他值表示失败 Int codeDesc 业务侧错误码。成功时返回Success,错误时返回具体业务错误原因 String message 模块错误信息描述,与接口相关 String totalCount 查询结果数目 String repoInfo 镜像信息 ObjectArray 仓库信息字段: 参数名称 描述 类型 repona

  • 「干货」什么Linux是邮件服务器?

    每天我们都会收到很多的邮件,但是从来没有了解过邮件是怎么实现收发的,也没有自己配置过一台邮件服务器。 今天我们就来认识一下什么是邮件服务器。 常见的邮件服务器软件介绍 Sendmail:sendmail是最古老的MTA(MailTransferAgent,电子邮件系统)之一,最早它诞生的时候,Internet还没有被标准化,当时主机之间使用的是UUCP技术来交换邮件。它被设计得比较灵活,便于配置和运行于各种类型的机器。 Qmail:qmail是新生一代的MTA代表,它以速度快、体积小、易配置安装等特性而著称。作者D.J.Bernstein是一个数学教授,富有传奇色彩。他于1995年开发qmail,1996年发布0.70版,并使用了多种当时比较先进的技术,包括Maildir,与sendmail单个binary不同的模块化设计,权限分离,以及使用了大量由他编写的配套工具,如daemontool,ucsip-tcp等。qmai 迅速成为了Internet上最有名的 MTA,使用者众。 postfix:postfix 如今已经独树一帜,流水线、模块化的设计,兼顾了效率和功能。灵活的配置和扩展,

  • ASP.NET Core 中文文档 第四章 MVC(3.3)布局视图

    原文:Layout 作者:SteveSmith 翻译:娄宇(Lyrics) 校对:孟帅洋(书缘) 视图(View)经常共享视觉元素和编程元素。在本篇文章中,你将学习如何在你的ASP.NET应用程序中使用通用布局视图、共享指令以及在渲染视图前运行通用代码。 章节: 什么是布局视图 指定布局 导入共享指令 在视图之前运行代码 什么是布局视图 大部分Web应用程序在用户切换页面时,使用通用布局提供了一致的用户体验。通用布局通常包含页眉、导航栏(或菜单)以及页脚等通用UI元素。 在一个应用程序中,诸如脚本(scripts)和样式表(stylesheets)这样的通用HTML结构也频繁的被许多页面使用。所有的这些共享元素可以在layout文件中定义,这样应用程序中的任何视图都可以使用它们。布局视图减少了视图中的重复代码,帮助我们遵循Don'tRepeatYourself(DRY)原则。 按照惯例,ASP.NET应用程序的默认布局文件命名为_Layout.cshtml。VisualStudioASP.NETCoreMVC项目模板包含这个布局文件,位置在Views/Shared文件夹: 这个

  • leetcode 3

    0(n*n)时间复杂度 注意ASCII的取值范围 只需要确定起始位置即可,暴力 classSolution{ public: intlengthOfLongestSubstring(strings){ if(s.size()==0)return0; intmaxlength=0,length=0; intMapStr[500]; for(inti=0;i<s.size();i++){ length=0; memset(MapStr,0,sizeof(MapStr)); for(intj=i;j<s.size();j++){ if(MapStr[s[j]]==0){ MapStr[s[j]]=1; length++; } elsebreak; } if(length>maxlength) maxlength=length; } returnmaxlength; } };复制 0(n) 中间加了优化之间吧重复部分跳过相当于遍历两边 1classSolution{ 2public: 3intlengthOfLongestSubstring(strings){ 4if(

  • python大数据测试学习总结

    最近,工作中要测试数据加工结果表和原表,原先没接触过这块的知识,学习总结下相关知识和概念: 1.环境安装  Java(JDK8),python3.6.5,pycharm,idea,pyspark 2.jpuyter概念理解:    JupyterNotebook(此前被称为IPythonnotebook)是一个交互式笔记本,支持运行40多种编程语言。在本文中,我们将介绍Jupyternotebook的主要特性,以及为什么对于希望编写漂亮的交互式文档的人来说是一个强大工具。    JupyterNotebook的本质是一个Web应用程序,便于创建和共享文学化程序文档,支持实时代码,数学方程,可视化和markdown。用途包括:数据清理和转换,数值模拟,统计建模,机器学习等等 本地网页jpuyternew一个python时报错,多半是权限问题! 3.Anaconda与Pycharm的区别? python自身缺少numpy、matplotlib、scipy、scikit-learn....等一系列包,需要我们

  • android 手机 多分辨率适配

    近来在做android屏幕适配这方面的工作,今天总算有点眉目. 小记一下 基础知识就不科普了,网上一大堆.作为一个刚接触这方面人,最先进入我脑子的,是从小到大的各种屏,小到手表,大到街头上看到的广告牌.然后对这些不同大小的屏按使用方式来区分一下: 3.5英寸以下的.这个尺寸以下的手机比较少,穿戴设备比较多 3.5-7英寸 这个尺寸区间主要是手机 6英寸以下的平板.也是比较少的 6-11英寸这个区间主要是平板 手机和平板都是拿在手上的设备(当然也可以放在支架上看),以7英寸作为尺寸分割点.这个分割点决定了界面的布局,即,小于7英寸的屏用一套布局,大于7英寸的屏用另一套布局(因屏的大小或者横竖使用,得用到两到四套布局) 由于项目目前只考虑在手机上使用,所以目前就只要考虑7英寸以下的屏,就是说,只要写一套布局就行了. 后期要做平板的话,再写另外的布局.用到fragment. 这个有点离题了,不扯这个. layout_width&layout_height只用match_parent.用px显然是不行的.同样大小的屏,分辨率低的屏显示出来的控件大

  • 剑指offer 36. 二叉搜索树与双向链表

    二叉搜索树的先序遍历序列是递增序列设置pre指针来记录上一次访问结果1/* 2//DefinitionforaNode. 3classNode{ 4public: 5intval; 6Node*left; 7Node*right; 8 9Node(){} 10 11Node(int_val){ 12val=_val; 13left=NULL; 14right=NULL; 15} 16 17Node(int_val,Node*_left,Node*_right){ 18val=_val; 19left=_left; 20right=_right; 21} 22}; 23*/ 24classSolution{ 25private: 26Node*pre; 27Node*head; 28Node*last; 29 30public: 31Node*treeToDoublyList(Node*root){ 32if(root==NULL) 33returnNULL; 34pre=NULL; 35head=NULL; 36last=NULL; 37visit(root); 38head->

  • qt在linux下的报错 :-1: error: Unknown module(s) in QT: multimedia multimediawidgets

      在ubuntu中解决方法如下: sudoapt-getinstallqtmultimedia5-dev复制

  • C++仿Matlab的bsxfun函数

    在Opencv中实现了Matlab的bsxfun函数,只实现了加法plus、减法minus,其它的太耗时,有感兴趣的朋友也来做做,分享分享。 bsxfun函数的用法参考链接: https://blog.csdn.net/tina_ttl/article/details/51034773   #include<iostream> #include<string> #include<opencv2/opencv.hpp> usingnamespacecv; usingnamespacestd; //bsxfun函数的说明见链接:https://blog.csdn.net/tina_ttl/article/details/51034773 /* 1.a,b都是单行,a、b的列数必须相同 2.a,b都是单列,a、b的行数必须相同 3.a是单行,b是单列,a的列数与b的行数可以不同。输出为b.rows-by-a.cols矩阵。 4.a是单列,b是单行,a的行数与b的列数可以不同。输出为b.rows-by-a.cols矩阵。 5.a是单行,b是

相关推荐

推荐阅读