打造哈囉自動化增⻓算法閉環(上)

導讀:本次分享的主題是哈囉打造自動化增長算法閉環的實踐,上篇將主要介紹哈囉 C 端算法場景和挑戰及哈囉主動增長算法。

哈囉 C 端算法場景和挑戰

圖片

首先看一下哈囉的 C 端算法大概有哪些場景。哈囉 C 端算法最終的目的是要服務於我們出行業務的增長,同時也要扶持我們生活服務相關的業務。目前在端內流量類型有很多,包括我們常規的 banner、彈窗,還有一些組件。端外我們會對打車順風車大力投放廣告,主要是在公共的廣告平臺,包括在一些運營商的系統上投廣告。還有一些免費流量,主要是指在微信和抖音這樣的公域和私域流量。另外,有一塊特色就是我們線下的門店以及兩輪車,我們可以把它看成一些智能的硬件,或者說一些智慧的門店,通過我們的 AloT 平臺接入到公司系統中,也是一個重要的流量來源。

這些不同的流量類型和我們現在的各種業務交叉起來,就會發現哈囉的 C 端場景太多了,而對哈囉這樣一箇中等規模的公司來講,就出現了場景衆多和開發的人力十分有限的矛盾。同時我們自己團隊也會有一些技術追求,如果只支持業務,不僅對我們沒有成長,而且效果也未必會達到最好。所以業務支撐和技術深耕間也是一個矛盾。

圖片

既然搜廣推有這麼多服務場景和矛盾,我們在最初半年的實踐過程中,不斷形成如何解決這個矛盾的方法論,基本的思想就是不要重複造輪子。我們在提高算法開發效率的同時,各個域將行業最新經典的技術和自主創新相結合。

最初我們支撐業務還是用一些最簡單的定製的模型,包括 Tree 模型和 CTR 預估中的一些經典的模型,業務也只是從體量最大的出行業務開始,其中對兩輪這部分它的收入運營我們進行一個業務策略的高度抽象。

在 2021 年,我們開始按照一個新的方法論打造整個算法體系。首先我們要有統一的 C 端算法體系。C 端算法體系無論是搜廣推,還是我們說的營銷以及其他的流量分發等,它的基礎技術是高度同質的,是有可能做統一的。

另外我們在計算的過程中,想把哈囉增長引擎給打造出來。我們底層的機器學習平臺是我們自主研發的賈維斯 AI 平臺,所有算法同學都在上面工作。上層的話,我們在算法鋪量的過程中打造了搜推引擎和營銷引擎,對少部分的場景,也就是對兩輪收入運營開始做自動化運營的實踐。自動化運營,就是要對策略要做一個高度抽象。而策略也是分不同層級的,我們會參考 OKR 拆解的方法,把策略從一個目標級的策略,拆解到 KR 級的策略,再拆解到 Task 級的策略。因爲用戶運營的工作是相對標準化的,所以這個流程是完全可以自動化的拆解下來。

圖片

關於打造統一的 C 端算法體系,讓各個域不要重複造輪子,讓我們來看一張圖。最左邊一塊是哈囉所有的流量,最右邊一塊是哈囉所有投放的內容,包括一些營銷內容,以及我們傳統的社區,還有一些我們的電商商品和本地生活的一些服務商品的內容。

這些商品從流量側看,我們要提升流量效率,這個就是 eCPM。從業務側的視角看,我們要提升它的用戶增量以及收入,也就是 GMV,而用戶增長主要看 ROI。這幾個域都會用同一套的技術體系,也就是業界常用的多路召回和 Rank 算法。我們這裏面的各個模塊和業界會稍有不同,有些領域比如說 Rank 中我們會重點建設因果推斷及 L2R 的技術。在多路召回中,我們會建設 Graph Embedding,以及一些知識庫搜索這樣的召回體系。

我們會把基於流量的算法叫被動增長算法,因爲不需要我們額外造一些資源位,打擾用戶做一些推送。而我們將用戶增長和收入增長定義爲主動的增長算法。

哈囉主動增⻓算法

**    4w2h**

圖片

主動增長算法是我們對一個用戶希望進行一些營銷動作,也就是狹義的營銷算法。整個營銷它是一個鏈路,用的是一套 4w2h 的體系。第一,你要選擇什麼樣的人來做投放,就是精準定向。第二,你投放的內容是什麼,就是我們的素材,包括文案、圖片、賣點等等。第三,你要選擇什麼時機,選擇什麼素材來投放,這在我們這塊叫做智能觸達,包括 push 也是放在這一塊。第四,投放給一個用戶的營銷,基本上會通過活動的形式,或者說任務的形式等等,任務是可以自動化的生成。當然最重要的一塊是我們的補貼,因爲大部分的營銷它要是有一定的實實在在的開銷,才能把用戶給最終吸引過來,所以要有補貼,補貼在出行和本地生活領域是一個很核心的事情。

精準定向

圖片

精準定向,在哈囉這邊它有兩種模式。一種是從一個大的池子中挑選出少部分的精準用戶,我們這叫行業包。還有一種是 LookAlike,給一個種子人羣,根據相似度擴大它的規模,在我們這邊的主流方法是行業包。因爲和廣告領域不同,我們的用戶池子其實是已知的,主要是哈囉註冊的 5 億用戶,然後在池子中撈一部分人對各個不同的業務進行一些拉新促活。

最簡單的方式其實是有監督,但有監督會有很多的問題。比如說第一個問題,高潛的用戶會很快耗盡。像很多新業務,如果是用有監督的方式,如果這個池子比較小,可能一兩個月池子就被耗盡了,接下來就沒有高潛用戶可以營銷。另外,我們有很多動作是拉新,新用戶明顯特徵是比較稀疏的,可能樣本也比較少。但是最大的問題是在精準定向這個領域,它是沒有真正的負樣本的,比如一個用戶的營銷不起作用,不一定是他對這個業務不感興趣,有可能他是對營銷不感興趣。因爲人的心理特別複雜,大部分人看到一個營銷動作,本能其實不會有太大的反應。

我們的負樣本並不是一個真正負樣本,應該叫未知樣本。所以這裏的解決辦法就要用到半監督的方式。即從未知的樣本中,識別出真正的負樣本,我們會使用 PU- Learning 技術,最終的效果是在同等 ROI 的基礎上,把我們拉新的潛客規模擴大 2-10 倍。同時像特徵少的問題,基本上會用交叉業務的特徵,比如打車和酒店就是一個高度相關的業務,他們之間特徵就有很多可以複用。另外兩輪是我們用戶基數最大的一個業務,很多業務線在拉新建設的時候,都會複用兩輪的特徵。

圖片

接下來我們來看 PU- Learning 是怎麼做的。一開始我們用的是最傳統的 TSA 算法,也就是間諜樣本技術。我們首先會在正樣本中挑選出一些,假裝它是一個負樣本,混在未知樣本的池子裏,相當於人爲提高一個正負樣本區分的難度,然後在未知樣本和正樣本中選出來一些間諜樣本,假裝它是一個負樣本,和正樣本在一塊訓練一個分類模型,而這個分類模型我們是希望儘量把負樣本中的未知間諜樣本,也就是那部分正樣本和真正的負樣本給區分開來。

一旦分類器建立之後,我們就用第一步的分類器來給所有樣本打一個分,把其中分低的作爲真正的負樣本。然後再建第二個樣本池子,在這樣反覆的迭代過程中,直到我們把間諜樣本完全識別出來,做到一個收斂情況。通過這種方法,我們就能把未知樣本中真正的負樣本給識別出來。

後面我們又做了一些改進,因爲傳統 TSA 算法會有幾個問題。第一個問題是你正負樣本劃分的閾值,它其實是一刀切的,並不是一個合理的值。所以我們用 EM 算法把分佈給聚類起來,學到了它真正的正負樣本的閾值。這其實也是對正樣本進行了數據增強,因爲正樣本在我們這邊非常少。而另一個改進點,我們一開始用的 PU- Learning 基準模型其實是 GBM, GBM 套着 GBM,時間長了一定會實現信息繭房效應。所以我們在第一步和第二步的模型後面進行了一個區分,第二步模型改成 DeepFM,通過 GBM 和 DeepFM 的交叉迭代的學習,減少信息繭房的問題。

圖片

剛剛講的是第一種方式——行業包,即在一個大的池子中撈出一部分精準人羣。另一種方式是 LookAlike,這是更傳統的一種方式。我們用的技術是 Graph Embedding,通過用戶之間的行爲或者某種關聯給用戶作爲點,用戶有行爲關聯的建立一個邊,最後把用戶的 Embedding 給學習出來,從而通過這種向量,用相似度的計算能把用戶的人羣擴大。

Graph Embedding 現在已經相對成熟,但是在哈囉的主要挑戰是這個圖怎麼構建。因爲它和傳統電商不同,最重要的是識別出強的行爲,怎麼把用戶之間的邊給連接起來。

圖片

第一種我們會用時空,真實用戶在出行中的時空空間上的關聯給它建立圖,比如說同一個地塊,同一個時間段,兩個不同的用戶發生了同類行爲,如給單車開關鎖,這樣它就能連一個邊,但這種行爲還不夠強。我們參考了電商領域的行爲構建方式,我們在想是不是我們整個 APP 所有的事件,所有的物料的行爲都可以用來建圖,於是我們在首頁進行了探索。

這裏有一個圖,比如說上面的 icon,中間的 banner,還有下面的種種其他的營銷物料,其實在不同資源位置以及每一個物料,它都有一個物料 ID,同時它也是某個業務推出來的物料,這三者的結合就能唯一確定一個 item 是什麼東西。用戶在我們整個首頁點的所有 item 的一個序列,通過這種序列也可以來構造用戶之間的邊。

我們的技術模型選用的是 EGES,因爲哈囉還是一種偏工具的 APP,而且行爲確實沒有像電商的購買行爲這麼強,所以 SideInfo 對我們來講就會更加重要。

圖片

同時哈囉的用戶量還是很大的,當然我們選的是近幾天活躍的用戶作爲我們的向量池子來擴展,非活躍用戶的話也就給刨掉了。如果是全量的話,幾億的用戶算下來計算的性能耗不起。當時的向量引擎選的是 Milvus,一開始我們也實驗過其他向量引擎,但對比下來 Milvus 的性能是最好的。我們在幾千萬用戶以及幾十維向量這樣的規模下,可以做到小時級別的全量用戶的向量化。Milvus 線上的查詢也能達到近實時查詢的程度,最終的實驗效果通過向量的相似度進行量級的放大。我們可以擴大人羣的規模 10-1000 倍不等,同時保證 ROI 相比人工策略一直是提升的。當然放大規模越大,提升幅度也會越小。

圖片

我們在構圖的過程中用的是用戶的時間序列,但目前還沒有把一些非信息流的頁面的事件,或者說各個業務私域的一些事件序列給拉排進來。這需要更統一的數據埋點體系的建設,也會是今年的一個重點。

智能補貼

圖片

有了定向的人羣之後,我們就需要知道怎麼做補貼。補貼可以認爲是這幾個領域中對我們最核心的一個域。補貼這個域,基本上因果推斷已經逐漸成爲技術主流。一開始我們用的是 CTR 預估的方法,來看一個用戶喜不喜歡點券之類的東西。但實際上用戶並不是只有點和不喜歡點這兩類,而是有四類,包括營銷敏感、自然轉化、無動於衷和反作用類。因爲部分用戶其實你不營銷,他自己喜歡這個業務可能也會來,營銷並沒有帶來增量的作用。還有部分用戶對營銷比較反感,營銷之後他反而不來了,影響他的留存和活躍等等。

舉個具體的例子,假設我們有兩類用戶各 1 萬個人,賣一個商品是 10 元,券是 8 折券,現在想給這兩撥人來決定到底給誰發 8 折的券。比如說原本情況下 B 類用戶發券了之後的購買率是 1.5%,不發券是 1.4%,但實際上發券這個動作帶來的增量的購買率只有 0.1%,A 類用戶反而帶來的增量購買率更大,是 0.5%。所以並不是說 B 類用戶的購買率高,更應該給他發券,而是 A 類用戶發券帶來的增量效應更大,才更應該給他發券。

那 B 類用戶到底應不應該發券呢?其實還可以看收益的增量。如果把我們發過券之後,打折帶來的損失以及我們購買率提升帶來的增益,合起來算的話,B 類用戶甚至還是虧的。不發券能掙 1400 塊錢,但是發券之後因爲打了折,反而只能掙 1200 塊錢。所以對 B 類用戶就不應該發券,只用對 A 類用戶進行發券。

圖片

所以對因果效應的建模是我們的一個重點,我們用的是 Uplift model。第一版我們建了兩種 Uplift model,它適用的場景不同。第一種是基於 Tree 構建的,原始的 Uplift Tree 相當於是做一個增量轉化率的預估。增量轉化爲什麼選 Tree,第一它是對 Uplift 進行直接建模的,而不是說建兩個不同的模型,它的建模精度會比較好。另外 Tree 的可解釋性是相對強的,我們知道 Tree 基本上是通過分裂準則來模擬目標最大化的一個過程。我們可以對比一下普通的分裂準則和 Uplift Tree 的分裂準則有什麼區別,普通分裂準則就是信息增益最大化,Uplift Tree 最原始的方式是通過分佈散度最大,來讓我們的干預組和被幹預組,所謂干預組也就是發券組,這兩個組的分佈差異最大,從而達到 Uplift 最大的效果。下面是一個示意圖,通過 Uplift Tree 的分裂,我們最終可以把人羣真正區分成 4 類不同類型的人羣,最後只對營銷敏感的這部分人羣進行真正的營銷,而其他三類並不需要營銷。

當然這個原始的 Uplift Tree,它是針對轉化率做增量的,而我們現實的業務中大部分場景目標是收益,而不是轉化率。所以我們進行一個改進,把分裂準則改進成一種新的方式來做收益的最大化。

假設分裂前數據集是θ,我們就可以計算分裂前的收益是多少,也就是發券組和不發券組人均效益進行一個差,然後乘以一個平方,它其實是對歐氏距離分佈散度最大化的一個擴展的改進。然後是根據某個特徵對當前節點進行分裂,得到一個分裂後的因果效應,分裂前和分裂後的因果效應的差,其實就代替了我們之前的信息增益的最大化。通過分裂前和分裂後因果效應差值的最大化,來作爲我們的一個分裂準則,就這樣不斷選擇新的特徵,這是第一層的分裂。第二層就選另一個特徵接着分裂,不斷選擇這種迭代遞歸的過程,最終整個構建出來。這就是一個 TreeLift 的過程。

圖片

TreeLift 的難點是怎麼構造樣本,因爲現實中不存在平行時空,我們不可能對一個人同時發券又不發券。那怎麼樣讓模型學習發券相比不發券的增量收益呢?我們想到是用羣體來代替個體,如果是兩個同質的羣體,其實可以學習發券羣體和不發券羣體之間的增量收益。這就通過構造隨機實驗的方式,也是現在 Uplift 領域的一個主流方法。最終的效果,我們在自有的數據集和業界的公開數據集及傳統的經典方法做了一個對比,發現它的 Uplift 曲線是最大的,相比我們自己的響應模型,在場景下的收益大概有 4.7% 的提升。

圖片

另一個是我們的 DeepLift 的模型,DeepLift 模型是我們在 DragonNet 的基礎上進行改進的。DragonNet 有幾個優點,它不需要用隨機實驗,隨機實驗的構造成本是很高的,你的模型後面基本上沒有辦法做自動的更新。我們用 DragonNet 通過向量化模擬了一個隨機實驗,同樣它又構造了一個傾向分的子網絡,能夠做一個樣本篩選,可以把因果無關的一些特徵變量篩掉,而大量的特徵其實和因果並沒有關係。我們在 DragonNet 基礎上做了一些改進,第一是增加了模型的複雜度,第二是改變它的 loss,更加的貼近業務。因爲原始的 DragonNet 其實和原始的 Uplift Tree 一樣,並沒有以收益爲目標,而是以轉化率爲目標。因此我們各種 loss 增加了新的 G 的網絡,以及改變了它基礎的 loss 的方式。我們 DeepLift 模型的網絡結構可以看右邊,DeepLift 我們更多使用在一些需要自動更新的場景。

智能文案

圖片

知道了什麼人,也知道補貼多少錢,這個素材本身對用戶的衝擊力是更直接的。我們通過智能文案對整體的點擊率,不同樣式的點擊率,包括 banner、push、彈窗等等,形成了 30%-100% 不等。營銷領域的文案普遍都是比較短、比較正式的那種文字,和電商 title、視頻的標題不太一樣。另外相對於內容領域,我們的語料並沒有那麼充足,所以一開始它的文案生成用的是模板的方式,在模版中加上一些動態詞包。但在今年已經改造成了模板加上語句通順度的識別這樣的方式,大量擴充我們的文案候選集,增加多樣性,減少用戶的疲勞。

另外在有監督模型基礎上,我們增加了 EE 的模塊,因爲文案的多樣性,還有新文案,新素材的快速實驗是特別重要的。具體 EE 的算法,我們用的是最樸素的 Epsilon-Greedy 算法。

智能廣告外投

圖片

剛纔講的幾種營銷方法都是針對免費流量的,或者說主要針對我們端內的一些資源。而很多像端外,比如說像巨量引擎、廣點通這些,我們需要做智能的廣告外投。以前相當於我是作爲一個廣告平臺,來收廣告主的錢,而現在我作爲一個廣告主,要在平臺上投放,怎麼樣才能投的效果更好呢?

比如說我們場景主要是在四輪拉新,四輪拉新其實還有很多問題,第一個就是特徵少的問題,廣告計劃的馬太效應很嚴重,甚至配置可能一模一樣的計劃,有的計劃消耗很高,大部分的計劃消耗很低。所以大量消耗很低的計劃,如果數據又不多,你想提前識別這個計劃在未來表現的效果不好,給他做提前下線,而減少對未來的開銷的損失。那怎麼做呢?就是要在底層做用戶完單預估,這個計劃裏面的部分用戶已經發生了轉化,通過這部分的用戶完單預估來推算整個計劃的質量。另外計劃本身它有一些投放的效果反饋,雖然大部分計劃它的投放量還沒有那麼大。通過這兩個模型,我們能做到劣質計劃的預判,對它進行提前的關停。而對優質計劃我們能夠做自動的補預算,最終我們想實現通過自動投放,把整個廣告的預算、計劃、素材,還有定向條件等各個維度全部自動化。

圖片

廣告計劃的預估主要在特徵這一塊,它的特徵比較特殊。第一,ID 類的特徵特別多。廣告計劃的計劃廣告組以及下面的素材是一層一層的,有很強的語義關係,同一個組下面的廣告計劃基本上都是一個類型。這些 ID 類型有很多語義相似性,我們需要用 w2v 進行提前 embedding。同時它的數值特徵和廣告參數配置特徵又比較少,所以這裏需要通過大量的交叉來擴展這個特徵的表達。之後我們用一個傳統的 FM 模型進行寬深的預估。我們這裏預估用的是多分類,而不是二分類。當時我們對比了迴歸和多分類的效果,發現迴歸的難度,特別在廣告計劃缺數據的情況下,是非常難的,還是多分類的效果會比較好一點。

圖片

廣告計劃的投放,它更多是離線的投放,每天會對計劃做一次調整,並不是實時的干預廣告平臺的競價引擎。實施干預我們主要通過 RTA 和 RTB 的方式,用的技術也是因果推斷技術。我們把用戶分爲五類,對已經轉換的用戶直接通過規則屏蔽掉,不需要把已有的用戶再拉新一遍。剩下的用戶根據對我們平臺意向程度的不同,分成 uplift 幾檔,然後識別出不同用戶質量分,通過各大廣告平臺提供的 API 來干預它的競價引擎。最終我們通過這兩種方式,在打車的乘客以及順風車的車主上,投放成本會有顯著的降低。

下篇將介紹哈囉被動增長算法和哈囉增長引擎的實踐,敬請關注。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/M2oWzWkw-BxjKkAbrcRQ7g