https://www.lizenghai.com/archives/42609.html
淺談廣告系統預算控制(Budget Pacing)
文來自OPPO互聯網技術團隊,轉載請注名作者。同時歡迎關注我們的公眾號:OPPO_tech,與你分享OPPO前沿互聯網技術及活動。
1. 背景
在實際廣告投放過程中,我們常常會碰到一個問題:媒體流量比較大,廣告主預算消耗過快,有些中小廣告主甚至在開始投放的幾分鍾內就把預算消耗完。這會導致廣告主早早退出后續流量的競爭,不僅會影響廣告主體驗(無法觸達到更多的優質用戶),也導致整個廣告不平穩(競爭都集中在早期,而后期又競爭不足)。
預算控制(Budget Pacing)的作用就是平穩花掉廣告主的預算,並幫助廣告主優化轉化效果。所以我們預算控制要完成如下目標:
-
廣告勻速播放:通過廣告日預算、當前消耗以及日曝光曲線來控制廣告投放速度
-
提升廣告主ROI:幫助廣告主以更低的價錢拿到更多優質曝光量。
2. 問題分析
預算控制的做法目前可分為兩大類:Probabilistic throttling 和 Bid modification,其中 Probabilistic throttling 通過一個概率值來決定是否參競來控制預算花費速率,而 Bid modification 則通過直接改價的方式來控制花費速率。
對比這兩個方案的差異點:
-
Probabilistic throttling 是通過調整參競概率調整預算消耗速度,而 Bid modification 則是通過改變bid,控制競價勝率來達到影響預算消耗速度,這種方式有可能導致預算消耗波動較大
-
bid landscape(競價環境) 一般會隨着時間變化而變化;另外對於那些快耗盡預算的廣告,bid 可修改的幅度很小,且bid一般存在着保留價,可調整的幅度很小,而且往往bid的變化與實際曝光量不成正比;以上兩點使得通過 bid modification 來達到預算勻速消耗比較困難
-
實際工程實踐中,我們希望廣告投放量(delivery的部分)與競價邏輯(uction的部分)是分開的, 使用 Probabilistic throttling 時能夠將 pacing control 與 bid optimization 解耦,能夠分別進行優化
對我們來說,廣告主最基本的訴求是讓廣告預算能夠均勻的消耗完,在這個基礎之上才考慮優化轉化成本。所以我們首選了Probabilistic throttling方案來實現勻速播放,在結合Bid modification來優化成本
3. 方案實現
3.1 階段一:實現廣告預算能夠均勻的消耗
為了這個目標我們參考了論文【1】,LinkedIn 在 2014 年發表的一篇論文,提出的預算控制策略並不復雜,並且具有很強的實踐性和工程性。
接下來介紹下我們的這個算法,其主要思想跟LinkedIn算法比較類似。我們的主要思路就是將推廣計划的消耗趨勢與大盤曝光趨勢保持一致,以天為時間單位,推廣計划為預算控制單位。
首先根據歷史數據,預測出當天大盤總曝光數。然后基於其曝光情況,在當前時間片,假如已消耗 / 當天預的比例大於大盤已曝光 / 大盤總曝光的比例,則說明預算已經消耗過快,需要減小消耗的速度,反之則要加快消耗的速度。
下面為算法原理:
對於某個campaign ,記其出價為
,當天預算為
。一天的時間被划分為
個時間窗口,
表示截止到第
個時間窗口時的累積預算,
與
對應,表示截止到第
個時間窗口開始的累積曝光(
是預測出來的,下式的
表示預測出來campaign
在當天的總曝光)。則在時間窗口
開始時,有
根據上面的比例,在每次競價開始時,為campaign 算出其參與這次競價的概率
,論文稱這個概率為PTR (pass through rate),計算方式如下:
上式中的稱作調整速率(adjustment rate)。
上面算法得到的PTR,即實際項目的參競概率,我們通過這個概率可以控制曝光速度。
3.2 階段二:實現預算均勻消耗后,嘗試優化成本
前文介紹的預算均勻消耗實現方案本質上是隨機丟棄,這個雖然可以滿足需求,但對成本優化上沒有任何考慮。所以這個方案一完成我們就在想,該如何做些優化?
我們做優化主要思路是:我們在放棄請求的時候可以選擇性放棄一些低質量(點擊率較低)的請求,而對應高質量的請求我們提高參與競價的概率,從而提升轉化率。
其實業界對這個問題成熟的優化方案有很多, 其中最直接方式是通過修改bid來優化,但這種方式挑戰比較大,工程實現比較復雜,與我們最初思路也不一致,我們后續介紹。再查找資料時我們看到yahoo的一篇論文【2】,該方案實現與我們思路類似,剛好給了我們很多啟發。
下面介紹下我們的算法實現:
(1) 首先我們會把每個廣告計划的所有請求會被分成 L 層,則在第 t-1 個時間片內各層的參競率記為:
各層消耗記為:
每一層的單次點擊成本在這里記為:
一天的總預算 B 會根據時間片划分成 K份小預算,即:
但是實際投放中不能保證每個時間片的消耗都剛好達到分配的預算值,因此如果前面的時間片中出現了少投或超投情況,就要把少投或超投那些部分均攤到后面的時間片中,所以每個時刻的預算需要根據前面的花費來調整,調整后的消耗記為:
上式中的表示經過了 m 個時間片后剩余的實際預算,分子
表示當前預算花費是否超過了預期(<0)或者不滿足預期(>0),並通過分母均攤到后面的 K−m 個時間片中。
則調整各層參競率的控制算法如下圖所示,圖中的, 表示如果按照前一時間片的參競率投放時,當前時間片的預算能否花完。則當 R>0 時,需要提高當前時間片的參競率,反之需要降低 這一時間片的參競率。
上面算法還有幾點細節需要注意:
-
L層表示參競率最大的層,
層表示參競率為非0的最小的層
-
當需要提升參競率最時,是從第 L層到
層進行的;而需要降低參競率時,是從第
層到第 L層進行的,其目的都是優先提升ctr高的層的參競率,優先降低ctr低的層的參競率,從而達到最小化成本的目的
-
trial rate 的目的是讓參競率非 0 的最小層的下一層以一個很小的參競率進行參競(參競率會隨着層數增加而增加),本來這一層的參競率應該是 0 的,但是這里給了一個很小的 trail rate,目的是為了方便后面加快預算花費做准備(代碼實現上也不用特殊處理)
超參選取
上面提過的算法的流程中涉及到多個超參數,如層數 L 以及 trial rate,下面介紹如何選取這兩個超參。
yahoo論文中給出決定其層數 L 的方法是,首先找到與這個新計划最相似的老計划 a, 並找到這個老計划最合適的參競率, 則新計划的層數可計算為
,計算的邏輯其實就是要找到這個計划最合適參競率對應的層數。
trail rate取值方法是:將當前時間片的預算划分一小部分,記為 λ(e.g λ = 1%), 假設當前層為第
層,則其trail rate =
,而
和
則是
層的歷史參競率和消耗。
為了簡化工程,我們先選取了固定值,然后通過實驗的方式來確認這兩參數。
4. 后續優化
目前的方案已經可以滿足勻速播放的,但其實我們可以結合Bid modification來對廣告成本做進一步優化。
-
從廣告計划維度看,流量充足時可以通過降低出價來減少曝光量,同時也能降低成本
-
對各層不同ctr的請求bid應該是有差異的,高ctr的請求出價應該更高,低ctr的請求出價可以低一些
前文也提到了Bid modification方案工程復雜度比較大,后續需要結合廣告競價,oCPX等相關模塊,爭取進一步優化成本。
參考文獻:
1.Budget Pacing for Targeted Online Advertisements at LinkedIn
2.Smart Pacing for Effective Online Ad Campaign Optimization
https://arxiv.org/abs/1506.05851
3.http://wulc.me/tags/計算廣告/page/2/