今天我们来聊聊广告成本控制中常用的PID算法。

0.PID算法简介

首先我们可以看下维基百科中给PID算法的定义:由比例单元(Proportional)、积分单元(Integral)和微分单元(Derivative)组成。可以透过调整这三个单元的增益Kp, Ki和Kd来调定其特性。PID控制器主要适用于基本上线性,且动态特性不随时间变化的系统。PID算法可以用下面的公式表示:

好的,看完上面“好官方”的定义,我们急需一个简单的“栗子”来理解。假设我有一个水缸,最终的控制目的是要保证水缸里的水位永远的维持在1米的高度。假设初始时刻,水缸里的水位是0.2米,那么当前时刻的水位和目标水位之间是存在一个误差error,且error为0.8。这个时候,假设旁边站着一个人,这个人通过往缸里加水的方式来控制水位。如果单纯的用比例控制算法,就是指加入的水量u和误差error是成正比的,即u=Kp*error,Kp=0.5。当第一次对系统施加控制时,u=0.5*0.8=0.4即此时水位等于0.2+0.4=0.6米,接着第二次对系统施加控制,u=0.5*0.4=0.2即此时水位等于0.6+0.2=0.8米,以此类推,最终水位会达到我们所需要的1米。如下图所示:

但是如果单纯的只使用比例控制算法,相当于使用的是一种稳态误差,这与实际生活还是存在一定的距离,这时候我们考虑另外一种情况:

假设这个水缸在加水的过程中,存在漏水的情况,每次加水的过程,都会漏掉0.1米高度的水。仍然假设Kp取0.5,那么此时会发生一个神奇的状态,假设经过几次加水,水缸中的水位到0.8时,水位将不会再发生变换。因为,水位为0.8,则误差error=0.2. 所以每次往水缸中加水的量为u=0.5*0.2=0.1.同时,每次加水,缸里又会流出去0.1米的水。加入的水和流出的水相抵消,水位将不再变化。也就是说,我的目标是1米,但是最后系统达到0.8米的水位就不再变化了,且系统已经达到稳定。由此产生的误差就是稳态误差了。(在实际情况中,这种类似水缸漏水的情况往往更加常见,比如控制汽车运动,摩擦阻力就相当于是“漏水”,控制机械臂、无人机的飞行,各类阻力和消耗都可以理解为本例中的“漏水”,而广告系统中的稳态误差则可以认为是由于网络等问题引发的广告折损率)。如何解决这种情况呢,我们可以引入积分控件以及微分控件。

积分控件:

积分控制会考虑过去一段时间的误差,它对过去一段时间的误差值做积分然后再乘以常数Ki。Ki是系统的输出结果和预定值的平均误差。一个简单的比例会导致系统震荡,从而在预定值的附近来回变化,因为系统无法消除多余的纠正。通过加上负的平均误差值,平均系统误差值就会渐渐减少。所以,最终这个PID回路系统会在设定值稳定下来。

微分控件:

微分控制考虑将来误差,计算误差的一阶导,并和一个正值的常数Kd相乘。这个导数的控制会对系统的改变作出反应。导数的结果越大,那么控制系统就对输出结果作出更快速的反应。这个Kd参数也是PID被称为可预测的控制器的原因。Kd参数对减少控制器短期的改变很有帮助。当然在一些实际中的速度缓慢的系统可以不需要Kd参数。

1.PID算法在广告领域的使用姿势

以信息流广告投放为例,广告主通过采买媒体平台广告位进行广告投放。在广告投放前,综合考虑投放目标以及历史投放经验等,会对广告投放预算成本进行控制,希望能够以预先规划的价格拿到广告位资源(即控制广告成交价)。但由于广告投放系统中的出价优化模型以及二价成交机制等,广告主往往不能直接控制成交价,而需通过调整出价等方式间接控制成交价。

为了能够实现控制成交价的目的,我们实时监控成交价(输出)与预算成本(目标)间关系,并通过PID控制算法来动态调整出价,PID反馈控制环如下图所示:

PID算法在传统的工业系统中通常输入值都是从0开始,而在广告投放中,广告主的出价不可能从0开始,假如在初次出价时,成交价与目标值差值很小,这就导致PID算法的输出接近于0,因而直接使用其输出作为出价是不合理的。根据这个特点,我们对传统的PID算法做些改进,以第i次PID算法的输出作为变动量与第i-1次出价相加后作为最终出价,这样就会避免在算法运行初期,系统出现较大的波动。

PID算法中各项系数对系统的影响十分重要,因而在算法上线前,需要事先确定较为合理的系数,避免上线后算法性能不稳定,导致出价幅度波动较大,造成损失。此外,由于广告系统的不确定性因素,即使一直以相同的价格出价,也会呈现不同的成交价。

为了线下模拟广告出价与成交价关系,我们对历史出价与成交价数据进行分析。分析发现,出价与成交价均值呈现正相关,即在一定范围内,出价均值增大,成交价均值也随之增大。但对应到具体的数据点上,二者还会伴随一定的随机性。将出价与成交价关系分解为线性部分与随机波动部分。其中线性部分利用最小化均方误差拟合线性函数,得到线性函数表达式;随机波动部分根据相同出价时对应的不同成交价出现频率,生成与历史数据等概率分布随机模型。利用线性部分与随机部分叠加,得到给定出价对应的成交价。使用该模型输出的模拟结果与真实结果作对比,发现模型输出能够较为准确的还原数据真实分布。

在刚开始对PID控制器进行参数设定的时候,可以只考虑出价与成交价的线性关系,使用不同参数进行试验,观察不同参数对系统性能的影响,初步得到各项系数较为合理的参数的区间。由试验结果可以发现,当比例系数较大时系统振荡幅度较大,积分系数较大时系统达到稳态的时间较长,微分系数较大会导致系统持续振荡,难以达到稳定的状态。通常我们会引入随机项进行微调,得到较为理想的PID控制器。

使用PID控制算法动态调整出价能够很好的将广告平均成交价稳定在目标成交价,而使用固定出价策略,则会使得广告投放的实际平均成本偏离目标值,特别是当广告投放时间周期较短时,偏离程度会更大。由于实际投放场景中,对出价范围及出价时间有一定的约束,需根据业务场景对PID算法的输出做一定的处理,使得算法输出价格能够合理的参与到广告竞价系统中。

2.小结

本文主要给大家介绍了PID算法及其在广告成本控制领域的使用方式。当然,通过PID算法控制成本只是广告投放中特定场景下的一种手段,为了优化广告的投放效果,常常还需要做一些其他方面的工作,比如通过预估用户点击率和转化率,实现广告精准定向;使用媒体标签进行人群量级和价值的预估,对广告主的投放进行自动扩量等,其目的均是为了保证广告主的投放收益最大化。

欢迎关注微信公众号:计算广告那些事儿

广告成本控制-PID算法的更多相关文章

  1. PID算法通俗理解,平衡车,倒立摆,适合不理解PID算法的人来看!

    先插句广告,本人QQ522414928,不熟悉PID算法的可以一起交流学习,随时在线(PID资料再我的另一篇博客里) 倒立摆资料连接↓ https://www.cnblogs.com/LiuXinyu ...

  2. 线性控制原理——PID算法应用

    使用控制系统(PID)控制被控对象 PID控制的三要素:控制器,被控对象,反馈器.控制器就是一个数学模型,就PID来说,等同于PID算法.是对反馈量的一个处理与输出.通俗的说就是对于每个被控的量,我的 ...

  3. PID算法学习记录

    最近做项目需要用到PID算法,这个本来是我的专业(控制理论与控制工程),可是我好像是把这个东西全部还给老师了. 没办法,只好抽时间来学习了. 先占个座,后续将持续更新!

  4. 位置式PID与增量式PID算法

    位置式PID与增量式PID算法  PID控制是一个二阶线性控制器     定义:通过调整比例.积分和微分三项参数,使得大多数的工业控制系统获得良好的闭环控制性能.     优点             ...

  5. PID算法笔记2

    总所周知,PID算法是个很经典的东西.而做自平衡小车,飞行器PID是一个必须翻过的坎.因此本节我们来好好讲解一下PID,根据我在学习中的体会,力求通俗易懂.并举出PID的形象例子来帮助理解PID.一. ...

  6. PID算法

    所谓PID就是比例-积分-微分的英文缩写,但并不是必须同时具备这三种算法,也可以是 PD, PI,甚至只有 P算法控制,下面分别介绍每个参数的含义:首先需要明确一个事实就是,要实现PID算法,必须在硬 ...

  7. PID算法(c 语言)(转)

    PID算法(c 语言)(来自老外) #include <stdio.h> #include<math.h> //定义PID 的结构体 struct _pid { int pv; ...

  8. PID控制器开发笔记之一:PID算法原理及基本实现

    在自动控制中,PID及其衍生出来的算法是应用最广的算法之一.各个做自动控制的厂家基本都有会实现这一经典算法.我们在做项目的过程中,也时常会遇到类似的需求,所以就想实现这一算法以适用于更多的应用场景. ...

  9. 单片机之PID算法

    说到PID算法,想必大部人并不陌生,PID算法在很多方面都有重要应用,比如电机的速度控制,恒温槽的温度控制,四轴飞行器的平衡控制等等,作为闭环控制系统中的一种重要算法,其优点和可实现性都成为人们的首选 ...

随机推荐

  1. django学习-2.urls.py和view.py的相关知识点

    1.URL函数简单解析 1.1.url() 函数可以接收四个参数,分别是两个必选参数:regex.view,和两个可选参数:kwargs.name. def url(regex, view, kwar ...

  2. 死磕以太坊源码分析之EVM指令集

    死磕以太坊源码分析之EVM指令集 配合以下代码进行阅读:https://github.com/blockchainGuide/ 写文不易,给个小关注,有什么问题可以指出,便于大家交流学习. 以下指令集 ...

  3. DisplayFormat属性

    DataFormatString="{0:格式字符串}" 在DataFormatString 中的 {0} 表示数据本身,而在冒号后面的格式字符串代表所们希望数据显示的格式: 数字 ...

  4. Mybatis高级:Mybatis注解开发单表操作,Mybatis注解开发多表操作,构建sql语句,综合案例学生管理系统使用接口注解方式优化

    知识点梳理 课堂讲义 一.Mybatis注解开发单表操作 *** 1.1 MyBatis的常用注解 之前我们在Mapper映射文件中编写的sql语句已经各种配置,其实是比较麻烦的 而这几年来注解开发越 ...

  5. 第35天学习打卡(输入框 TextField监听 简易计算器,组合+内部类回顾复习 画笔 鼠标监听 窗口监听 键盘监听)

    1.输入框 TextField监听  package com.kuang.lesson02; ​ import java.awt.*; import java.awt.event.ActionEven ...

  6. pandas的数据筛选之isin和str.contains函数

    筛选是在平时的工作中使用非常频繁的功能,前文介绍了loc和iloc的筛选方法,现在继续介绍一些筛选的方法.   DataFrame列表 以>,<,==,>=,<=来进行选择(& ...

  7. React源码 commit阶段详解

    转: React源码 commit阶段详解 点击进入React源码调试仓库. 当render阶段完成后,意味着在内存中构建的workInProgress树所有更新工作已经完成,这包括树中fiber节点 ...

  8. MySQL之四 存储引擎

    1.介绍 存储引擎MySQL中的"文件系统" MySQL体系结构 InnoDB存储引擎介绍 My1SAM 和InnoDB区别  mysql MariaDB [(none)]> ...

  9. dubbo使用和配置讲解

    1. 分布式系统中相关概念 1.1 互联网项目特点及目标 1.1.1 特点: 用户多 流量大.并发高 海量数据 易受攻击 功能繁琐 变更快 1.1.2 指标及相关目标 互联网项目三高目标:高并发.高可 ...

  10. Hi3559AV100-自己编译了u-boot、kernel及rootfs后,出现烧写错误或者烧写后板载无法启动的解决思路

    这篇随笔主要给出了Hi3559AV100-自己编译了u-boot.kernel及rootfs后,出现烧写错误或者烧写后板载无法启动的解决思路. 问题 (1)对于 u-boot 为官方的,kernel ...