淺談線上廣告分配策略

Gopher指北發表於2021-12-12
來自公眾號:Gopher指北

線上廣告,也稱網路廣告、網際網路廣告,顧名思義,指的是線上媒體上投放的廣告。平時我們在刷資訊流、短視訊、新聞和微博均可以看見它的影子。對於比較大的廣告平臺,使用者定向後依舊會有大量的廣告可以下發,而從大量的廣告中選擇合適的廣告展現給使用者就是本篇要討論的主題——線上廣告分配策略。

名詞描述

為了更好的理解本文,先提前做一些名詞描述。

eCPM(Effective Cost Per Mille): 指的是每一千次展示可以獲得的廣告收入。此指標反映盈利能力,不代表實際收入。不同的廣告主會選擇CPC、CPM等不同出價方式,因此廣告分配時無法以純粹的出價進行比較,所以才有了ecpm這一指標用於評估不同出價方式的廣告可以給廣告平臺帶來的收益。

定向廣告:所謂"定向"實際上是對受眾的篩選,即廣告的顯示是根據訪問者來決定的,先進的廣告管理系統 能夠提供多種多樣的定向方式。

最好的一定合適嘛

對於廣告平臺而言收益最大化是優先事項。為了保證收益最大化,對於每一次廣告請求我們都選擇ecpm最高的廣告下發。這個邏輯從理論上來看是正確的,但在實際中就不一定了,那麼它到底會有什麼問題呢?

  1. ⼴告消耗超預算限額。
  2. 廣告預算消耗不盡。
  3. 空結果問題。
  4. 部分廣告消耗過快影響廣告主投放體驗和使用者產品體驗。

問題分析

問題1

對問題1進行分析時,我們需要先有這樣一個共識,廣告的點選、曝光等資料上報有一定的延時。

由於廣告分配策略未考慮預算消耗資訊,當消耗接近預算限額時未能及時減緩曝光速度,導致本應分配給其他廣告主的流量依舊分配給了預算受限的廣告主,這是對廣告平臺流量的浪費(流量越大的平臺浪費會愈加嚴重)。

問題2

部分中小廣告主競爭力弱(出價低),很難獲取足夠的曝光量,這種情形當廣告充裕時尤為明顯。

問題3

一方面可能是因為廣告資源不足,另外一方面也有可能是定向廣告消耗過快(詳見下面的例子)。

問題4

廣告按照ecpm排序,會導致廣告消耗速度差異較大直接影響廣告主的投放體驗,甚至於使用者反覆看到重複的廣告直接影響使用者產品體驗,再反過來影響到廣告的CVR。

為了進一步說明純按價高者得這一演算法的不足之處,請看下面的特殊例子。

廣告出價($)預算($)定向
A0.5100男,遊戲
B1100男,遊戲,運動

以上述廣告為例,現有男,遊戲男,運動請求各100。理想最大收益為150$,但是按照上述策略分配廣告時,會出現男,遊戲這100請求先到達時優先消耗B廣告,男,運動`這100請求達到時無廣告可消耗。按照ecpm排序的演算法又稱為Greedy演算法,該演算法會讓高價值廣告快速消耗。

合適的才是最好的

Balance演算法

與Greedy演算法不同的是,Kalyanasundaram和Pruhs提出的Balance演算法忽略單個bidder的出價,儘可能平衡所有bidder的預算消耗,使得其線上時間儘可能⻓,即儘量使得所有⼴告都保持勻速投放。其演算法描述如下:

當一個滿足一些定向廣告的請求到達時:
if 廣告預算消耗完 {
    continue
} else {
    選擇一個(消耗/預算)值最小的一個廣告
}

相比貪心演算法,Balance演算法平衡所有廣告的消耗速度,能夠有效解決貪心演算法廣告快速消耗的問題,但在廣告消耗不盡的問題上依舊不是最佳解決方案。我們看下面特殊例子:

廣告出價($)預算($)定向
A1100男,遊戲
B0.01100男,遊戲,運動

以上述廣告為例,現有男,遊戲男,運動請求各100。理想對最大收益為110$,根據balance演算法其總的預算消耗僅為幾美元。當男,遊戲這100請求先到達時,B廣告一定會先消耗完,當男,運動`100請求到達時依舊會無廣告可消耗。

那Balance演算法適用場景到底是什麼,下面我們以極限法來考慮這個問題。

假設一:如果廣告A和廣告B的出價分別為1000$和1$(CPC)

很明顯,廣告A具有更大的優勢理應優先展示。根據前面的例子,Balance演算法是無法解決這種極值場景的,而Greedy演算法則充分兼顧了平臺的利益以及廣告主急切花錢的心情。

假設二:如果所有廣告出價分別為10$(CPC)

Greedy演算法是和出價有關的,而Balance演算法僅和預算有關。根據控制變數法很容易知道Balance演算法正是為了這種場景而生。

小結:根據前面的假設以及論文中的描述我們總結如下結論:

  • Balance演算法更適用於廣告出價比較接近的場景
  • Greedy演算法則比較適用於廣告出價差異比較大的場景

MSVV演算法

只有小孩子才做選做題,我們成年人全都要。Balance演算法和Greedy演算法各有優劣且適用場景不同,那有沒有演算法能夠融合兩者的優點呢?這正式MSVV演算法的思路。

為了更清楚描述新演算法,先給出一些基本定義:

image.png

演算法描述如下:

當一個滿足一些定向廣告的請求到達時:
if 廣告預算消耗完 {
    continue
} else {
    選擇一個`縮放出價`值最大的廣告
}

上述的權衡函式為一個單調下降的函式,且\( v \)取值範圍為[0,1]。權衡函式分佈圖如下:

當所有廣告出價相等時,由於權衡函式是一個單調下降的函式,因此MSVV演算法就正好退化成Balance演算法。另一方面,如果出價差異非常大時,MSVV演算法在大多數情況都不會改變出價的順序,此時MSVV表現更接近Greedy演算法。考慮更極端的情況,當所有廣告預算都是無限時,MSVV演算法直接退化為Greedy演算法,因為此時權衡函式為常量\( 1 - {\frac 1 e} \)。

為了驗證MSVV演算法的適應性,我們看下面的程式碼:

type ad struct {
    cost  float64
    total float64
    price float64
}

func scaled(price, cost, total float64) float64 {
    return price * (1.0 - math.Pow(math.E, cost/total-1))
}

func main() {
    a := &ad{0, 100, 1}
    b := &ad{0, 100, 0.01}
    // 模擬`男,遊戲`到達時,a和b同時消耗
    for i := 0; i < 100; i++ {
        aCp := scaled(a.price, a.cost, a.total)
        bCp := scaled(b.price, b.cost, b.total)
        if a.cost >= a.total || b.cost >= b.total {
            break
        }
        if aCp >= bCp {
            a.cost += a.price
        } else {
            b.cost += b.price
        }
    }
    // 模擬`男,運動`到達時,僅b可消耗
    for i := 0; i < 100; i++ {
        if b.cost >= b.total {
            break
        }
        b.cost += b.price
    }
    fmt.Println(a.cost + b.cost)
}

MSVV演算法在前面的極值例子中收益分別為116.5101,其整體表現基本符合預期。

總結

現在回顧前面的問題,消耗過快以及減緩曝光速度都在Balance演算法的射程內(廣告資源不足只有通過其他手段解決了)。從廣告平臺的收益角度考慮Greedy演算法更佳。那麼結合兩者優點的MSVV演算法可謂是每個廣告平臺居家旅行之必備利器。

線上廣告老許也是初次接觸,而且正在努力儲備知識,以期日後可持續發展。如果文中有不正確的地方歡迎各位讀者指正和交流。

相關文章