合約廣告中的流量分配算法


上傳到博客上公式沒法看了,感興趣的同學到我的github博客上去看吧 http://tongming.github.io

轉載請注明來源

 

簡介

合約廣告是一種基於合約的廣告模式,在線廣告中的一種主流方式是擔保式投放(Guaranteed Delivery,GD)。GD是一種量優於質的廣告投放方式,需要保證廣告主能夠獲得在合約中約定的受眾用戶的流量。GD中,媒體的流量按照屬性划分,媒體要給不同的廣告主按照合同分配約定好的流量。Ad Server的准則是希望在每一次展現滿足多個合約時,選擇合適的廣告主,以使得每個廣告主效果最好,同時能夠更有效的分配流量。如下圖所示,supply為媒體方,提供流量,媒體的流量可以按照性別、年齡、地域划分;demand為廣告主,不同的廣告主需要不同細分的流量(或者說流量背后的用戶),比如第一個廣告主需要200K的男性流量。流量分配問題就是把不同細分的流量分配給不同的廣告主,盡可能滿足所有廣告主的需求。比如下圖中的問題,怎樣把六部分流量分配給三個廣告主才能滿足所有廣告合約的需求了?我們可以先分配CA的流量都給第二個廣告主,然后就比較容易分配流量給另外兩個廣告主了。

clip_image002[4]

對於上述問題的求解,已經有較多的工作展開,並且有一些不錯的方法。為了理解不同方法的優點與弱點,需要先了解兩個基本概念。第一個概念是流量到達順序(input order),由於在實際廣告分配中,我們不知道流量按照什么順序達到,也不清楚會有哪些流量到達。顯而易見的是,不同流量到達順序對算法最終效果有很強的影響。為了更加客觀的衡量不同算法的效果,需要比較在相同的流量到達順序時,不同算法的效果。一般來講對於流量到達順序的模型有四種:

一、流量以最壞情況的順序到達。這種流量到達模型假設有一個對手已經知道你的流量分配算法,並且對手可以操縱流量到達的順序,從而產生一個使得你的流量分配算法效果最差的流量到達序列。

二、流量以隨機的順序到達。

三、流量以未知的獨立同分布(IID)方式到達。

四、流量以已知的獨立同分布(IID)方式到達。

第二個概念是競爭率(Competitive Ratio),競爭率是衡量算法效果的指標。競爭率的定義是算法得到的目標值與最優分配算法得到的目標值的比值。如果流量是以IID方式到達,則為目標值期望的比值。有了流量到達順序以及競爭率的概念,就可以分析不同算法的優劣。下面我們由簡單到復雜考察一些已有算法的特性。

貪心分配算法

第一個考察的算法是貪心分配算法,貪心分配算法運行方式如下:

每一次請求,找到能夠匹配的廣告中,出價最高的廣告投放。

現在需要考慮的是貪心分配算法最終效果如何,可以證明在流量輸入順序為最壞情況時,貪心算法的競爭率為0.5,並且只能到達0.5。這里對結果不加以證明,舉一個例子說明貪心算法的競爭率最多為0.5。

clip_image003[4]

如上圖,黑點代表一個流量,流量到達順序由上而下,兩個廣告主需要的流量單元都為1,對流量的出價分別是1與M。當M大於1時,貪心算法的分配方案使得媒體最終收入是M,而最優分配方案媒體的收入為1+M,因此在這種順序下,貪心分配算法的競爭率為clip_image005[4]。因此當M無限接近1時,貪心分配算法的競爭率無限接近為0.5,而當M遠大於1,貪心分配算法的競爭率接近1,分配效率接近最優分配算法。因此貪心分配算法在廣告主出價差異大的時候,是一種比較好的分配算法

上面考察的是流量到達序列的順序在最差情況下,貪心分配算法的競爭率。在真實環境中,流量到達順序一般不會是最差情況。因此考察流量到達序列為IID分布時,貪心分配算法的競爭率更符合真實應用場景。Goel等在他們的論文(Online budgeted matching in random input models with applications to adwords)中證明了在輸入序列為隨機情況下,貪心算法對Adwords問題的競爭率為clip_image007[6]。需要注意的是Adwords問題與GD流量分配問題並不等價,很多問題的結論並非一致,因此對與流量分配問題,在輸入序列為隨機時,貪心算法的競爭率依然沒有明確的答案,感興趣的同學可以仿照Goel的思路,看是否能得到相同的結論。下面一種出價縮放算法中,Adwords問題與展示廣告的流量分配問題的結論也非常不一樣,展示廣告的流量分配算法相對於Adwords問題要更加困難。

另外一種和貪心算法同樣簡單的算法是隨機算法。隨機算法對每一次廣告請求,從滿足要求的合約廣告中隨機選擇一個展現。大家可以思考一下,對於隨機算法,在不同流量到達模型時,競爭率分別是多少。在何種輸入情況下,隨機算法表現比貪心算法的表現要好。

出價縮放算法(bid scaling)

下面需要考察的是一種更加一般的算法,可以把這種算法稱為出價縮放算法。出價縮放算法顧名思義就是每一次廣告請求,對每一個符合要求的廣告的出價乘以/減去一個縮放因子(對於Adwords問題是乘以一個因子,對於Display Ad是減去一個因子),選擇值最大的廣告投放。為了理解bid scaling算法,需要對問題進行數學的形式化描述:

clip_image009[4]

如上公式,左邊為原問題,右邊為對偶問題。其中clip_image011[4]為流量V分配給廣告主U的量(值為1或0),clip_image013[4]為廣告主U對流量V的出價,clip_image015[4]為廣告主U一共需要的流量。現在的問題是流量V未知,我們需要在線求解上述問題。由KKT條件,可知上述問題的最優解clip_image017[4]需要滿足如下條件:

clip_image019[4]

由上述KKT條件可以知道,當流量v分配給clip_image021[6]最大的廣告主時,可以得到最優解。因此,bid scaling的算法如下:

對每一個廣告請求,對於滿足要求的廣告主計算clip_image021[7],將流量分配給值最大的廣告主。(對於Adwords問題,此時計算的是clip_image023[4]

Bid scaling算法的核心是怎么選擇clip_image025[10]。貪心算法也可以看作是一種bid scaling算法,該算法選擇當廣告主預算未消耗完時clip_image027[4],當預算消耗完后clip_image025[11]clip_image029[4]

J. Feldman等在文章Online ad assignment with free disposal中提出了一種選擇clip_image025[12]的方式,這種方式在最壞情況下,並滿足廣告主預算較大的條件時,競爭率為clip_image007[7],他們的選擇方式如下:

clip_image031[4]

SHALE算法

之前考察的算法都沒有考慮流量到達的分布。在現實環境中,我們對流量具有一定的預測能力,SHALE算法試圖通過預測的流量,線下算法流量分配方法,從而指導在線的流量分配。另外SHALE算法對於流量分配問題的建模也與bid scaling算法有一定的差別(不過其本質依然可以將其歸類為bid scaling算法),SHALE算法的收益不再考慮廣告主的出價,更多的考慮未完成合約的損失,其數學模型如下:

clip_image033[4]

在上式中,把流量按照屬性划分為不同的單元,線下預測不同的流量單元的流量大小,式中clip_image035[4]為預測的流量單元i的流量,clip_image037[4]為廣告主j的合約流量數目。clip_image039[4],其中clip_image041[4]為符合廣告主j要求的流量總和,clip_image043[4]用來衡量對廣告主j的流量分配是否均勻。需要求解的為clip_image045[12],表示流量單元i分配給廣告主j的流量比例。

因此,SHALE算法包括兩部分,一部分為線下計划部分,利用預測的每個流量單元的流量,求出clip_image045[13],另一部分為online serve部分,利用clip_image045[14]指導流量的分配。需要指出來的是對於bid scaling算法,對於每個廣告主只需要保存一個數,就可以進行在線分配,而naïve的SHALE算法需要保存clip_image045[15],這樣對每個廣告主需要的數大大增加,增大的內存的消耗。為了解決這個問題,SHALE算法借鑒了bid scaling算法的思想,利用KKT條件,實現了只需要對每個廣告主保存一個值,在線求出clip_image045[16],從而使得分配過程不需要消耗大量內存。

對SHALE算法而言,如果流量預測算法能夠精確的預測流量單元中的流量數目,那么SHALE算法的解為最優解。因此主要的問題是,如果預測算法有誤差,SHALE算法是否具有魯棒性呢?這里,對於流量到達順序可以看作是已知分布的IID序列,實際上,我們可以把每個單元的流量數目看作是高斯分布,我們能夠預測到流量的期望值,但是對於一些流量單元流量波動較大(方差較大),可能也會有較大的預測誤差。SHALE算法考慮到預測的誤差,一般如果線下計划部分計算間隔縮短,同時使用反饋校正的算法(如PID控制器)能夠在很大程度上降低預測誤差對於算法的影響。遺憾的是,並沒有理論分析能夠給出在這種情況下SHALE算法能夠達到的競爭率。J.Feldman等在文章Online stochastic matching: Beating 1-1/e中給出了一種利用線下計划指導在線分配的二分圖匹配的算法,給出的競爭率是0.67,但是從J.Feldman的理論分析推廣的SHALE算法幾乎不可能,因此到目前為止還沒有關於SHALE算法競爭率的理論分析。

模式生成算法

SHALE算法的模型中有一個缺陷:沒有考慮頻次控制的影響,因此SHALE算法離線計划即使在預測算法精確預測流量的前提下,也不是一個最優的分配方案。有一些在線的改進方案,能夠改進SHALE算法在具有頻次要求的情況下的效果。下面介紹一種利用模式生成算法來對SHALE算法進行改進的方法。模式生成算法產生一些投放廣告的模式,對每一個用戶按照模式進行廣告投放,從而保證廣告主的頻次要求。這里說的模式即是一段廣告投放序列,如:

clip_image046[4]

上圖為兩個廣告投放模式,如果一個用戶被分配按照模式1投放,當用戶第一次到達時展示廣告A,第二次為B,第三次為C,第四次為A,第五次為B。模式生成算法假設能夠預測每個用戶在頻次控制時間段內訪問網站的次數,通過生成模式控制廣告的頻次。模式生成算法的數學模型與SHALE的數學模型類似,如下:

clip_image048[4]

其中clip_image050[4]為所有的模式庫,clip_image052[4]clip_image054[4]分別表示在流量單元i中用戶訪問類型clip_image056[6](用戶訪問類型由用戶在一段時間內的訪問次數決定)的流量數目與獨立用戶數目;clip_image058[6]表示流量單元i中用戶訪問類型為clip_image056[7]中用模式n作為廣告投放模式的用戶數目;clip_image060[4]表示廣告j在模式n中出現的次數,clip_image062[4]表示在模式n中,廣告j出現的次數是否在要求的頻次數目范圍內;clip_image064[4]表示廣告主j要求的獨立用戶數。clip_image066[4]用來描述模式n的好壞,比如廣告的多樣性、頻次控制等。還可以根據業務需求對上述數學模型進行修改。

現在的問題在於怎么求解上述數學模型,和SHALE算法相同,我們利用預測的流量進行線下計划。但是和SHALE不同的是,模式生成算法不僅要求預測每個流量單元的流量,還要求預測每個流量單元中每種用戶類型的數目以及每個用戶屬於哪種類型。另外模式生成算法的目標函數比SHALE算法復雜很多,SHALE算法只是一個二次規划問題,離線計划非常容易求解。然而在模式生成算法中,目標函數包含整數規划,我們需要去構造一個模式庫,然后再優化整個目標函數。在模式庫中構造所有的模式顯然是不可行的(指數復雜度),幸運的是已經有成熟的算法求解此類型的優化問題,感興趣的同學可以去查看列生成算法,這里不詳細敘述。總之,借助列生成算法,可以產生所有有用的模式,並且對每一個類型的用戶分配不同的模式。

在線投放廣告時,當用戶當天第一次訪問網站時,通過用戶類型以及所處的流量單元,查找clip_image058[7],可以得到用戶投放模式n的比例為clip_image068[4]。按照比例選擇模式n作為用戶的廣告投放模式,並記下模式n,當用戶第二次訪問時,按照模式n繼續給用戶投放廣告。

模式生成算法並沒有解決廣告投放中的所有問題,一個問題是利用模式生成算法需要對每一個用戶記住一個廣告投放模式,非常消耗內存。另外一個問題是,模式生成算法假設用戶只屬於一個流量單元,實際中用戶有可能屬於多個流量單元。對於模式生成算法的理論分析也非常復雜,因此目前對於模式生成算法的競爭率仍然是未知的。

結語

對於廣告分配算法領域,研究工作一直都很活躍,每年都會有新的工作發表。本文總結的是展示廣告guaranteed delivery中應用到的分配算法。其中有一些算法,由於理論方面過於復雜,我並沒有包含(如利用強化學習的算法學習到bid scaling算法中的clip_image025[13]值,從而得到一個接近最優的分配算法)。另外Adwords problem領域的廣告分配算法也有很多重要的工作,有一些方法可以擴展到展示廣告中,但是另外一些擴展起來並不是很簡單,雖然兩個問題看起來非常類似。以后有時間或者等我把這幾個問題都弄明白了,再擴展這個算法文檔。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM