计算广告(六)
出价技术
PID算法
PID算法是工业应用中最广泛算法之一,在闭环系统的控制中,可自动对控制系统进行准确且迅速的校正。
PID算法已经有100多年历史,在四轴飞行器,平衡小车、汽车定速巡航、温度控制器等场景均有应用。
编辑
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
PID控制器(Proportional-Integral-Derivative Controller)是一种广泛应用于工程领域的控制算法,主要用于调节系统的输出,以便使其达到期望的状态。PID控制器通过对误差信号(期望值与实际值之间的差异)的比例、积分和微分进行调节,从而使系统达到稳定、快速响应的目标。PID控制器的组成部分如下:
比例(Proportional,P)控制:比例控制根据当前误差的大小来调节输出。输出与误差成正比,误差越大,输出越大。比例控制有助于快速响应系统误差,但很难完全消除误差。比例控制的增益(Kp)用于调节比例控制的强度。
积分(Integral,I)控制:积分控制对误差进行积累,随着时间推移调整输出。积分控制有助于消除系统的稳态误差,即使在比例控制不能完全消除误差的情况下。积分控制的增益(Ki)用于调节积分控制的强度。
微分(Derivative,D)控制:微分控制根据误差变化的速度来调节输出。微分控制有助于预测误差的发展趋势,并对其进行提前调节,从而提高系统的稳定性。微分控制的增益(Kd)用于调节微分控制的强度。
将这三个部分结合起来,PID控制器的输出可以表示为:
u(t) = Kp * e(t) + Ki * ∫e(t)dt + Kd * de(t)/dt
其中,u(t) 是控制器的输出,e(t) 是误差信号,t 是时间。
1
平衡车(例如,自平衡电动滑板车或双轮自平衡机器人)是一个经典的倒立摆问题。倒立摆是一个非线性、不稳定的系统,需要适当的控制策略来保持其竖直平衡。在这个例子中,我们可以使用PID控制器来调节平衡车的倾斜角度。
首先,我们需要确定控制目标:使平衡车保持竖直状态,即角度误差(期望角度与实际角度之差)趋近于零。为了实现这个目标,我们需要设计一个PID控制器,并通过调节平衡车的马达转速来保持竖直状态。
在这个例子中,P、I、D 的作用如下:
比例(Proportional,P)控制:比例控制根据当前角度误差的大小来调节马达转速。误差越大,马达转速调整幅度越大,这有助于快速响应角度误差。然而,仅仅使用比例控制很难完全消除误差,因为它不能消除静态误差,可能导致平衡车在接近竖直位置时仍有小幅摆动。
积分(Integral,I)控制:积分控制对角度误差进行累积,随着时间推移调整马达转速。积分控制有助于消除系统的静态误差,使平衡车在竖直位置时更稳定。然而,过大的积分增益可能导致控制器的响应过于敏感,从而引起震荡。
微分(Derivative,D)控制:微分控制根据角度误差变化的速度来调节马达转速。微分控制有助于预测误差的发展趋势,并对其进行提前调节,从而提高系统的稳定性。它可以减少震荡,提高响应速度。然而,微分控制对噪声敏感,可能放大高频噪声。
为了使平衡车保持稳定的竖直状态,我们需要仔细调整PID控制器的三个参数(Kp、Ki、Kd)。参数调节方法有很多种,如手动调节、Ziegler-Nichols方法等。通过合适的参数调整,我们可以实现一个快速响应、稳定的平衡车控制系统。
2
广告投放优化。PID控制器可以用于调整广告的投放策略,以便实现预定的广告目标,如点击率(CTR)、转化率(CVR)或者广告支出。
假设我们要使用PID控制器来优化广告支出与目标支出之间的差距。我们可以将广告支出看作是一个“控制系统”,而PID控制器则可以用于调整广告投放策略,以便实现目标支出。在这个场景中,P、I、D 的作用如下:
比例(Proportional,P)控制:根据广告支出与目标支出之间的差距(即误差),调整广告投放策略。误差越大,广告策略调整幅度越大。这有助于快速响应广告支出的变化。
积分(Integral,I)控制:对广告支出与目标支出之间的差距进行累积,并随着时间推移调整广告投放策略。这有助于消除长期的误差,确保广告支出在一段时间内接近目标支出。
微分(Derivative,D)控制:根据广告支出与目标支出之间差距的变化速度来调整广告投放策略。这有助于预测误差的发展趋势,并提前调整广告投放策略,从而提高广告投放效果的稳定性。
当然,这只是一个理论上的应用。在实际应用中,广告领域的问题往往更加复杂,涉及到多个目标、约束条件和不确定性。因此,实际广告投放优化可能需要更加复杂的算法和模型,如强化学习、多目标优化等。尽管如此,PID控制器在某些简化场景下仍然可能为广告投放优化提供一定的参考价值。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
Kp:比例增益
Ki:积分增益
Kd:微分增益
e:误差=设定值(SP)- 回授值(PV);
t:目前时间
Kp比例增益
Kp比例控制考虑当前误差,误差值和一个正值的常数Kp(表示比例)相乘。需要控制的量,比如水温,有它现在的当前值,也有我们期望的目标值。
当两者差距不大时,就让加热器“轻轻地”加热一下。
要是因为某些原因,温度降低了很多,就让加热器“稍稍用力”加热一下。
要是当前温度比目标温度低得多,就让加热器“开足马力”加热,尽快让水温到达目标附近。
实际写程序时,就让偏差(目标减去当前)与调节装置的“调节力度”,建立一个一次函数的关系,就可以实现最基本的“比例”控制
Kp越大,调节作用越激进,Kp调小会让调节作用更保守。
若你正在制作一个平衡车,有了P的作用,你会发现,平衡车在平衡角度附近来回“狂抖”,比较难稳住。
比例项的输出取决于误差及比例系数,比例系数越小,输出对误差的敏感度也越小,系统响应越慢。反之比例系数越大,控制作用也越强,系统响应会越快。但值得注意的是,过大会使系统产生较大超调和振荡,导致系统稳定性变差,下图演示了在其他参数相同的条件下,不同比例系数下系统振荡曲线
编辑切换为居中
添加图片注释,不超过 140 字(可选)
Kd微分增益
Kd微分控制考虑将来误差,计算误差的一阶导,并和一个正值的常数Kd相乘。
有了P的作用,不难发现,只有P好像不能让平衡车站起来,水温也控制得晃晃悠悠,好像整个系统不是特别稳定,总是在“抖动“
设想有一个弹簧:现在在平衡位置上,拉它一下,然后松手,这时它会震荡起来,因为阻力很小,它可能会震荡很长时间,才会重新停在平衡位置。
此时需要一个控制作用,让被控制的物理量的“变化速度”趋于0,即类似于“阻尼”的作用。
因为,当比较接近目标时,P的控制作用就比较小了,越接近目标,P的作用越温柔,有很多内在的或者外部的因素,使控制量发生小范围的摆动。
D的作用就是让物理量的速度趋于0,只要什么时候,这个量具有了速度,D就向相反的方向用力,尽力刹住这个变化。
Kd参数越大,向速度相反方向刹车的力道就越强,如果是平衡小车,加上P和D两种控制作用,如果参数调节合适,它应该可以站起来了。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
Ki积分增益
Ki积分控制考虑过去误差,将误差值过去一段时间和(误差和)乘以一个正值的常数Ki。
还是以热水为例,假如有个人把加热装置带到了非常冷的地方,开始烧水了,需要烧到50℃。在P的作用下,水温慢慢升高,直到升高到45℃时,他发现了一个不好的事情:天气太冷,水散热的速度,和P控制的加热的速度相等了
Kp作用:我和目标已经很近了,只需要轻轻加热就可以了。
Kd兄这样想:加热和散热相等,温度没有波动,我好像不用调整什么。
于是,水温永远地停留在45℃,永远到不了50℃。
这个时候,应该进一步增加加热的功率,可以设置一个积分量,只要偏差存在,就不断地对偏差进行积分(累加),并反应上。这样一来,即使45℃和50℃相差不是太大,但是随着时间的推移,只要没达到目标温度,这个积分量就不断增加,系统就会慢慢意识到:还没有到达目标温度,该增加功率啦!到了目标温度后,假设温度没有波动,积分值就不会再变动,这时,加热功率仍然等于散热功率,但是,温度是稳稳的50℃。
Ki的值越大,积分时乘的系数就越大,积分效果越明显,所以,I的作用就是,减小静态情况下的误差,让受控物理量尽可能接近目标值。
I在使用时还有个问题:需要设定积分限制,防止在刚开始加热时,就把积分量积得太大,难以控制。
在积分时间足够的情况下,可以完全消除静差,这时积分控制作用将维持不变。越大,积分速度越快,积分作用越强。积分作用太强会使系统超调加大,甚至使系统出现振荡。下图所示为其他参数相同的条件下,不同积分系数下的系统振荡曲线
在调节力度
编辑切换为居中
添加图片注释,不超过 140 字(可选)
在PID控制器中,积分环节的作用是通过累积误差来减少静态误差,使系统的输出尽可能接近目标值。积分环节的输出是误差与积分增益(Ki)的乘积累加:
I_output = Ki * ∫e(t)dt
在这个公式中,Ki是积分增益,e(t)是误差信号,t是时间。当Ki的值越大时,积分环节对累积误差的“敏感度”越高,这意味着在较短的时间内,积分环节对误差的累积会越快,从而更快地消除静态误差。
然而,过大的Ki值会导致一些问题。一个显著的问题是系统的超调和振荡。当积分作用过强时,系统可能会在达到目标值之前就产生过大的响应,导致系统在目标值附近发生振荡。为了避免这种情况,通常需要对积分环节的输出设定限制,防止积分值过大导致控制失效。
因此,在实际应用中,需要仔细调整Ki值,以在保证积分作用有效消除静态误差的同时,避免引入过大的超调和振荡。
PID程序
编辑
添加图片注释,不超过 140 字(可选)
Ki积分增益
编辑切换为居中
添加图片注释,不超过 140 字(可选)
PID对于广告出价的作用
任何一个广告投放体系在商业化的过程中必须考虑的两个因素就是:
投放成本:投放成本低于整个商业链条中可接受的成本,这个商业模式才能够成立
投放量:决定了这个模式能够有多大的规模
成本控制是衡量广告投放能力最直观的指标。广告主、业务人员,在使用广告投放系统时,与这个产品进行交互,设定成本,能够最直接感知到的就是实际投放成本,以cpc竞价来看,在实际投放过程中,由于模型预估ctr不可能非常精准,甚至会有量级的差异,再加上二价的机制,都会导致实际投放出的cpc和目标cpc严重不一致,导致成本不可控。而出价体系就是为了保证投放cpc符合预期。出价策略对于广告投放体系会直接影响了用户体验
pid在cpc竞价广告中的作用
ECPM是指每千次展示(Impressions)的平均收益
ecpm_cpc = (cpc_bid + lambda) * ctr * 1000
编辑切换为居中
添加图片注释,不超过 140 字(可选)
cpc为设置的目标cpc,lambda为使用pid来调整的系数, 假设每隔1h来调整一次,如果实际cpc偏低,那么就增大lambda,这样出价就会增大,反之亦然. 显然,这里的K_p,K_I 为正
在实际的广告投放过程中,广告主设定的目标CPC(cpc_bid)并不总是与实际支付的点击成本完全相同,原因有以下几点:
竞争环境:在广告投放平台中,往往有很多广告主都在竞争相同的广告展示位置。这些广告主可能会根据市场情况调整自己的出价,从而影响到你实际支付的点击成本。
用户行为:点击率(CTR)反映了用户对广告的兴趣程度,但用户行为是多变的,可能受到广告创意、时间、地域等因素的影响。这种波动性会导致实际支付的点击成本与目标CPC之间产生差距。
广告平台算法:广告平台会根据广告的质量、用户行为等多种因素来决定广告的展示次序和频率。这些因素可能会导致实际支付的点击成本与目标CPC不完全一致。
预算限制:广告主在设定广告预算时,可能会设定每日、每周等时间范围内的预算限制。当预算接近耗尽时,广告平台可能会调整广告的展示策略,从而影响实际支付的点击成本。
综上所述,由于竞争环境、用户行为、广告平台算法和预算限制等多种因素的影响,实际支付的点击成本可能会与目标CPC产生差距。这就是为什么需要通过调整系数(lambda)和PID控制策略来实时调整广告出价,以便尽量使实际支付的点击成本接近目标CPC。
CTR(点击率)的变动会影响到eCPM(有效千次展示成本),从而导致实际支付的点击成本与目标CPC(cpc_bid)之间产生差距。为了弥补这个差距,我们需要调整lambda这个系数。
CTR可能会因为广告创意、用户行为、时间、地域等因素发生波动。当CTR发生变化时,为了维持eCPM与目标CPC接近,我们需要相应地调整lambda。这样一来,我们可以在保持广告竞争力的同时,更好地控制广告成本。
总结一下,因为CTR的波动,我们需要调整lambda,以便使eCPM和cpc_bid保持接近。通过这种方式,我们可以实时调整广告出价,使实际支付的点击成本尽量接近目标CPC。
K_p是比例系数,假设目标cpc 0.4, 实际cpc 0.2 误差是0.2,K_p 越大,反应幅度就会越大,新的lambda 就会增加很多,出价就会增加很多,但是K_p不能够过大,不然会导致超调,出价过高. 所以K_p代表了 根据当前误差反应的比例
I的存在是为了解决稳态误差。假如cpc偏低,每小时我都在提高价格,但是市场价格(出价第二高的广告主出价)也在下降,所以,虽然每个小时我都在提价,但是由于市场价格在降价,导致我每次提价cpc都没有提上去. 像这种如果一直存在,我们称之为稳态误差. 积分的存在就是 通过过去差值的经验来调整出价,来消除这个稳态误差.
但是,实际投放过程中基本不会存在这样的稳态,因为竞价系统是动态的,只能说市场价格可能随着时间有些固定的变化,但是变化并不一定是稳定方向,所以 I值在实际使用中需要慎重,如果设置特别大,会导致上个小时已经不存在的误差,影响到当前小时,所以I即使要使用,最好设置的非常小
D项被称为微分项,当两次调控间隔十分小,(error_t - error_t-1) / 1, 计算的就是斜率,如果间隔十分小,那么这个斜率就可以一定程度体现出下次error的走向,这也是为什么说微分项代表未来。但是,如果两次间隔十分大、或者噪音非常多,微分项的作用就不大了。对于一个小时调控一次的PID调价,D项可以为0. 实际上, 很多PID控制器仅用PI就已经足够了
PID算法在传统的工业系统中通常输入值都是从0开始,而在广告投放中,广告主的出价不可能从0开始,假如在初次出价时,成交价与目标值差值很小,这就导致PID算法的输出接近于0,因而直接使用其输出作为出价是不合理的。根据这个特点,需要对传统的PID算法做些改进,以第i次PID算法的输出作为变动量与第i-1次出价相加后作为最终出价,这样就会避免在算法运行初期,系统出现较大的波动。
PID算法中各项系数对系统的影响十分重要,因而在算法上线前,需要事先确定较为合理的系数,避免上线后算法性能不稳定,导致出价幅度波动较大,造成损失。此外,由于广告系统的不确定性因素,即使一直以相同的价格出价,也会呈现不同的成交价。
使用PID控制算法动态调整出价能够很好的将广告平均成交价稳定在目标成交价,而使用固定出价策略,则会使得广告投放的实际平均成本偏离目标值,特别是当广告投放时间周期较短时,偏离程度会更大。由于实际投放场景中,对出价范围及出价时间有一定的约束,需根据业务场景对PID算法的输出做一定的处理,使得算法输出价格能够合理的参与到广告竞价系统中。
通过PID算法控制成本只是广告投放中特定场景下的一种手段,为了优化广告的投放效果,常常还需要做一些其他方面的工作,比如通过预估用户点击率和转化率,实现广告精准定向;使用媒体标签进行人群量级和价值的预估,对广告主的投放进行自动扩量等,其目的均是为了保证广告主的投放收益最大化
编辑切换为居中
添加图片注释,不超过 140 字(可选)