代码编织梦想

前言

笔者是名半吊子算法工程师,毕业专业是物理类学科,标准半路出家。所以,基础薄弱,技术能力颇为捉急。到现在,从事推荐算法岗位也算有一段时日,勉强积攒了一些关于这一领域的浅显知识,不少还是谬误。因此,有空就来分享一下,共同交流,共同进步。错误之处,恳请大家不吝指出,感谢。

摘要

广告,这个现代社会无处不在的手法,极大的提高了传播效率,让我们迅速了解最新产品。当然,广告也是需要成本的,因此,在资本的利益驱动下,我们追求更高效率的广告。本文中,将会介绍几种主要的广告形式,并着重介绍其中效果广告的相关技术。

主要的几种广告形式

  • 传统广告
  • 品牌广告
  • 效果广告

传统广告

这个是笔者自己杜撰的概念,主要是指在互联网时代之前的各种流行广告形式,例如,民国时代上海街头贴出的各类海报,电影院里面前置的广告,以及电视台的各类购物广告等等。这一类的广告,通常

  • 运营方式比较粗糙
  • 基于播出时间长度计费
  • 时间段比较固定
  • 曝光用户流量波动性大
  • 转化效率难以精确量化
  • 广告主和平台方意见常常不一致

这一类广告,曾经也是风靡一时的风景,但在现在,已经被大多数中小广告主所无视。其中有个重要的原因,就是目标人群常常受到当前播出节目的影响,导致不同节目后的流量是差异很大的,比如说,两部电视剧的接续情况下,由于热度不同,同一广告在电视剧的同一后续时刻里,转化数差异很大,却保持同一收费水平。这个问题的存在,常常会导致双方对原先定价的不满。并且,当今的社会人,娱乐的主要平台早已被手机、电脑所占据。考虑到运营成本问题,精打细算的广告商,自然把视线转向提供精细化运营的互联网平台。

品牌广告

品牌广告(Brand advertising),是以树立产品品牌形象,提高品牌的市场占有率为直接目的,突出传播品牌在消费者心目中确定的位置的一种方法。(来自度娘)
此类广告,其实和传统广告有很多重合,不过这里就只介绍互联网的品牌广告。它的特点:

  • 根据曝光计费
  • 需要平台方合理的预估、分配可用库存
  • 广告主对曝光维度、曝光频次等参数进行约束,实现精细化运营
  • 平台方需要构建精细的人群画像

这里解释一下具体的含义。基于曝光计费,是指广告主根据其广告对用户的曝光次数和之前确定的单价,付给平台方对应的费用。也就是说,用户每看到一次广告,广告主就出一次钱。毫无疑问,平台方需要先预测好未来的曝光总数(也称“库存总量”),然后基于预测值进行分配。否则,就会导致可用曝光量和合同曝光量出现较大差异,导致平台方进行赔款。
并且,由于精细化运营的需求,广告主会更加精打细算,提出对曝光维度、曝光频次等参数进行约束。例如,某奶茶广告就会提出要求,每天曝光5千万次,但必须曝光给来自于北上广深四大城市的、18~25岁、苹果手机用户,对于单个用户每天曝光不能超过3次。因此,平台方将需要基于这些维度,计算可用的对应的维度库存,以及建立频次统计。
上面的例子所要求的维度,是比较简单的,是可以直接线上获取到的。然而,有的广告主会要求更加的“精细”,比如说,研究生学历,喜爱浏览甜品、近期购买过蛋糕、晚上较为活跃的女性用户。这一类的标签,线上很难实时确定,但线下则是比较容易。因此,对于用户留存率较高的平台,可以线下构建好用户画像,选出合适的维度用户,线上存储其和对应的广告映射,从而可以线上对其进行精准曝光。
相应的技术(均为平台方):

  • 库存预估。通常是先预估总量,然后基于分开预估的维度占比,计算分维度库存。总量的预估,对历史数据的依赖较大,通常是基于近几年的库存变化,得出整体的变化曲线(包括固定节假日的变动);然后基于近期的库存变化,进行回归算法预估,得出预估的库存总量,并基于历史的变化进行调整。这里顺便说一下,工作人员的人为预判,也是很重要的。比如说,即将上线一部电视剧,产品经理根据历史经验,判断即将是部热剧,人为要求调整到原先的1.2倍。维度占比的预估流程,和其近似,不过,这就基本不用考虑历史的整体曲线问题。因为维度的分布比例,通常来说,和历史的整体分布关系不大。
  • 库存分配。这个是自动化售卖广告的核心,需要合理的更新各广告订单的优先级别,以及分配概率。基于剩余库存的占比(比如说,北上广深-库存还剩50%,但上海-白领-女只剩10%了),以及广告的定价,合理分配,并考虑合理的合并维度(有的维度太细,可以考虑合并在一起作为一块进行考虑)
  • 用户画像构建。这个主要是用来作为高精细化推送广告。因此,对应的用户标签大多数也都是对应的精细化标签。考虑到数量级,通常的做法都是,线下自动化按天级别生成用户ID+各色用户标签+历史曝光数,然后构建对应索引加载入缓存数据库。广告主定制好标签后,即可生成对应的用户ID列表(也称“人群包”),类似的,基于该人群包,基于历史曝光数,预估该人群包未来的库存(“询量”),一样的进行库存分配、下单。(这一类广告也称**“DMP广告**”)

效果广告

顾名思义,只看效果。也就是指,广告主只根据可衡量的结果付费。这类广告,是互联网平台下诞生的新型广告形式。其中,最常见的就是CPC广告(Cost Per Click, 按点击收费)。
基于点击进行收费的机制,意味着随意的曝光是低效率的。不导致进一步点击行为的曝光,并不能从广告主那里收到钱。因此,平台方需要给用户展示出用户最有可能点击的广告,从而最大概率的获取收益。这种高效的广告形式,因而被大多数广告商所采纳。它的主要特点是:

  • 根据点击进行收费
  • 追求高效率转化,而不是尽快树立形象(因此与品牌广告目标不同)
  • 竞价机制的存在,使得广告主可以尽快提升早期的展示概率
  • 第二阶段(转化)的存在,使得广告主可以调整广告形式
  • 合理的多路召回候选集
  • 准确预估点击率,是其中的核心

这里解释一下。由于广告历史点击率本身的差异,某些广告的预估点击率本身会有很大的差别。比如说,教育类的广告,点击率自然是低于游戏类的广告,如果单纯按照点击率进行候选排序地话,毫无疑问被选出来进行展示的必然是游戏类的。这个自然不是平台希望看到的结果,因此,竞价机制的存在,有着重大意义。因此,排序的依据切换为“点击定价 * 预估点击率”(可以看作是期望收益),从而,广告主可以灵活调价,当没有什么点击的时候,提高价格,当点击数上来的时候,调低价格,实现利益均衡。类似的,当广告主要求优化转化成本时,可以调整其为CPA广告(Cost Per Action),排序的依据将切换为“下单定价 * 预估转化率”(也可看作是期望收益),和CPC广告合在一起进行排序。从中可以看出,准确的预估点击率(预估转化率过程类似,通过“预估点击率 * 预估点击到下单转化率”,或者直接预估“下单转化率”),是其中最重要的环节。
相关的技术:

  • 候选广告集生成(也称“召回”)
  • 广告报价系统
  • 点击率、转化率的线上预估(基于模型)
  • 用户行为数据(曝光、点击)清洗、落地
  • 线下各类数据关联
  • 粗排模型(较为简单的排序)
  • 特征工程
  • 基于算法线下训练预估模型
  • 模型线上迭代
  • 线下模型推送、线上模型分发
  • AB test模块

由于笔者曾经的工作与其相关,所以了解的细化模块比较多。这里先解释一下线上的工作流程。当用户触发一个请求时,比如说,当其点击打开“最新新闻”按钮,会触发一个上下文广告请求。服务器接收到这个请求,调用召回模块,从所有广告里,选取出可用的若干广告;然后调用粗排模型,对上一步的选取广告候选集进行排序,选取出TOP N广告,同时从报价系统获取到实时报价(此步骤有时会包括在召回模块内);接着,调用预估模型,对TOP N广告进行点击率预估,并结合报价对**“收益期望**”进行排序(也称“精排”),选取TOP 1广告作为最终结果,和新闻一起被加载出来,展示给用户(如下图所示)。为了避免影响到用户体验,这一系列的总过程耗时需要控制在很短的时间数量级之内(可能是0.2秒以内)。
某条广告

顺便补充一下,在工程上的经验里,我们有时候会发现使用TOP 2广告的效果会更好一些,原因可能是TOP 1的广告容易出现异常值。并且,考虑到大流量下访问超时的问题,使用“保底模型”作为默认排序的依据是很有必要的。
线上工作流的简化步骤主要就是这些,但是,线上使用的预估模型是怎么来的呢?这个则是来自于线下的模型训练(主体部分可以这么认为)。这部分的简化流程如下所示:

  • 关联落地数据,生成包含“是否被点击”标签的训练数据
  • 基于“是否被点击”标签进行监督式学习,获取模型
  • 检验模型的离线指标,无误后复制到各台服务器
  • 各台服务器加载模型,替换掉原先模型

以上就是粗略的流程。考虑到篇幅,这边准备在下一篇博文里较详细的讲述效果广告的具体环节。

后续章节

下一章节,将会对效果广告的具体环节进行说明,并结合具体算法,对迭代公式进行推导。
PS: 相关图片为网上搜集,若有侵权,通知删除。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/qq_31319099/article/details/112968132

贪心算法中的区间调度问题-爱代码爱编程

一、问题概述 经典问题,给出形如 [ begin,end ]的闭区间,设计一个算法,求出这些区间中最多有几个互不相交的区间。 比如说,这四个区间,[1,2], [2,3], [3,4], [1,3],最多有三个互不相交,区间边界相交并不算重叠。那么这个问题是可以用贪心来解决的, 这个问题看起来可以用几个贪心策略解决,但都是有问题的

OOM问题原理解析(二):JVM内存回收机制与GC算法解析-爱代码爱编程

jvm想必大家听说过,毕竟在工作当中时不时的蹦出了什么OOM…这些东西,让很多的程序员都无从下手,甚至小的互联网公司都流行出了这样的一句话:“性能不够,机器来凑”! 那么在此,在工作之余就和大家一起探讨一下jvm调优的一些相关的实战操作,在分析jvm调优之前,你首先要明白java截止今天jdk的版本已经升级到了13的版本,当然我们要了解一下jvm底层的一些

OD学习4-基于相似度的异常检测-爱代码爱编程

基于相似度的异常检测 ①基于距离度量 代表算法:KNN算法(K近邻【在本人的博客OD学习1中有提及】) ②基于密度度量 代表算法:LOF以及基于lof算法优化的loci等算法 以下给出赵越老师的lof算法实例 # -*- coding: utf-8 -*- """Example of using LOF for outlier detection

二分查找法的实现及原理-爱代码爱编程

二分搜索法 原理:折半查找,直到查找到的元素与目标元素相等,查找终止 二分搜索法的实现 剖析: 注: 1.基于排序的代码才能使用该方法2.查找的终止条件:——> 中间的那个元素恰巧 等于 要查找的元素假定现有一个数组arr = [20,21,22,23,24,25,26,27,28,29]; 使用二分搜索法查找该数组中的某一个元素 实现原

统计输入字符串中单词个数算法-爱代码爱编程

//统计输入字符中的单词个数 #include<stdio.h> int main(){ printf("请输入:\n"); char string[81];//写string=...是错误的,可用函数来进行赋值 gets(string); int i,word=0,num=0; char c; for(i=0;(c=string

LeetCode-165-比较版本号-爱代码爱编程

给你两个版本号 version1 和 version2 ,请你比较它们。 版本号由一个或多个修订号组成,各修订号由一个 ‘.’ 连接。每个修订号由 多位数字 组成,可能包含 前导零 。每个版本号至少包含一个字符。修订号从左到右编号,下标从 0 开始,最左边的修订号下标为 0 ,下一个修订号下标为 1 ,以此类推。例如,2.5.33 和 0.1 都是有效的

2021年春招,Java后端最全面试攻略,吃透25个技术栈-爱代码爱编程

前言 小编分享的这份春招Java后端开发面试总结包含了JavaOOP、Java集合容器、Java异常、并发编程、Java反射、Java序列化、JVM、Redis、Spring MVC、MyBatis、MySQL数据库、消息中间件MQ、Dubbo、Linux、ZooKeeper、 分布式&数据结构与算法等25个专题技术点,都是小编在各个大厂总结出来

springboot 连接redis-爱代码爱编程

安装文章https://blog.csdn.net/yeluo_vinager/article/details/103680059 问题:   F:\soft\Redis-x64-3.2.100>redis-server.exe --service-start --Service-name RedisServer1 [14752] 21

redis对象编码笔记-爱代码爱编程

redis通过encoding属性来设定对象使用的编码,而不是特定的指定某一个类型的对象固定一个编码,可以提高redis的灵活性和效率。 1、字符串对象 字符串对象有int,raw,embstr三种编码,编码会根据字符串类型和长度来改变,且可以配置这个长度 如果是整数值,则用long类型,使用int编码如果是字符串值,且长度大于32个字节,则使用

什么?别人3分钟就能完成的Redis主从复制搭建,你连原理都还没弄明白?-爱代码爱编程

前言 今天我们来讲讲Redis的主从复制如何实现。 Redis主从复制 概念 Redis的主从复制概念和MySQL的主从复制大概类似。一台主机master,一台从机slaver。master主机数据更新后根据配置和策略,自动同步到slaver从机,Master以写为主,Slave以读为主。 主要用途 读写分离:适用于读多写少的应用,增加多

REDIS(七)-集群模式的实现-爱代码爱编程

REDIS集群模式介绍 文章目录 REDIS集群模式介绍1.1 节点1.1.1 启动节点1.1.2 集群数据结构1.1.3 CLUSTER MEET命令的实现1.2 槽指派1.2.1 记录节点的槽指派信息1.2.2 传播节点的槽指派信息1.2.3 记录集群所有槽的指派信息1.2.4 cluster addslots命令的实现1.3 在集群中执

SpringCache的简单应用-爱代码爱编程

常用注解 @Cacheable:将数据保存到缓存中@CacheEvict:将数据从缓存中删除@CachePut:不影响当前方法执行的情况下,更新缓存@Caching:组合以上的多个操作@CacheConfig:在类级别共享缓存的相同配置1.简单整合 1. Maven坐标 <dependency> <gro