電商領(lǐng)域A/B實驗平臺建設(shè)方法
一、A/B 實驗應(yīng)用
A/B 實驗應(yīng)用作為論證的黃金方法,目前已經(jīng)成為一個必然的選擇,但是實際上如何在企業(yè)內(nèi)部去建設(shè)實驗平臺,還充滿了很多選擇。目前的實驗平臺,包括在線實驗的數(shù)量,已經(jīng)成為衡量互聯(lián)網(wǎng)公司體量、業(yè)務(wù)量以及用戶量的一個隱藏指標。一些大廠的實驗平臺,同時在線實驗數(shù)量超過 10000,可能每個月新建的實驗數(shù)量都會大于 1000。
1、A/B 實驗是論證的黃金方法
?上圖列出了一些數(shù)據(jù)分析方法,比如案例研究、觀察研究、類實驗、隨機控制實驗,以及統(tǒng)合分析,即結(jié)合隨機實驗和觀察研究去做一些強分析。
這幾層分析方法中存在一些通用的因素,首先,樣本是定向的樣本還是隨機的樣本。第二個是有沒有控制,比如最下面的案例研究是沒有控制的,它可能針對一個群體做分析,而 A/B 實驗天然會分成對照組和實驗組,是有控制的。最后一個就是實驗結(jié)論是否可以復(fù)現(xiàn),是否科學(xué)。這三個因素的不同導(dǎo)致了整個分析方法可信度的差異。從下往上,可行度逐步提升。A/B 實驗是分析成本最低的一個方法,可以通過工程化的方法來提效,通過 A/B 產(chǎn)品化的方式來降低使用門檻。?
?A/B 實驗有三個主要的特點:
(1)第一個是先驗性,用事實說話,可以通過小流量低成本來得到一些結(jié)論。
(2)第二個是科學(xué)性,實驗分析時會用到假設(shè)檢驗的方法,相對來說是比較科學(xué)的。
(3)第三個是推斷性,通過隨機流量控制可以排除混雜因素的干擾,聚焦到我們的控制變量和實驗?策略上。
2、實驗平臺選擇
整個 A/B 平臺的建設(shè),主要有兩個思路,第一個就是直接采購第三方平臺;另外一個就是自建平臺。
國內(nèi)目前比較好的第三方產(chǎn)品,比如火山引擎,無論是產(chǎn)品 feature 還是整個應(yīng)用情況都比較好,因為它是基于自己內(nèi)部的最佳實踐。另外騰訊也開放了第三方平臺。熱云、神策數(shù)據(jù)也提供了 SaaS 的實驗平臺。國外的廠商也比較多,像 VWO 實驗測試平臺、谷歌的 Optimize、以及 Optimizely 等等,都是一些比較有競爭力的產(chǎn)品。
第三方平臺通常適用于用戶體量比較小,數(shù)據(jù)跟分析的基建還相對比較薄弱的公司。通過第三方平臺的使用,提升公司內(nèi)部數(shù)據(jù)以及分析的認知。
用戶行為分析和 A/B 實驗是緊密聯(lián)系的,因為它們都是基于用戶的行為,讓用戶來告訴我們答案,包括底層的一些分析引擎、存儲引擎的等基建也都是可以復(fù)用的,這也是火山引擎的 A/B 測試和分析能力,和用戶行為分析能力都是緊密耦合在一起的原因。
對于公司自建平臺,國內(nèi)主流的一些互聯(lián)網(wǎng)廠商也都有很好的實驗平臺,比如滴滴、美團、阿里、網(wǎng)易、新浪微博等,甚至有一些公司內(nèi)部有多個實驗平臺。國外的微軟、谷歌也都有非常有特色的實驗平臺。這些公司也都是用戶體量比較大,實驗場景多,數(shù)據(jù)分析基礎(chǔ)比較強的公司。在自建實驗平臺的時候,如果公司業(yè)務(wù)體量大的話,不同的業(yè)務(wù)可能結(jié)合自身的需求都建過一些實驗平臺了,這時候還要推動平臺從 N 到 1 的建設(shè)。在新建平臺時,就要考慮業(yè)界的最佳實踐,同時還要考慮業(yè)務(wù)方的獨特訴求。這樣在公司內(nèi)部推行實驗平臺的時候才能順暢,并且最終可能變成全公司通用的實驗平臺。
二、更多業(yè)務(wù)應(yīng)用
接下來介紹更多業(yè)務(wù)應(yīng)用。通常我們可以從實驗類型切入,比如產(chǎn)品類的實驗、服務(wù)端的實驗,算法模型或者策略的實驗、運營類的實驗或者營銷類的實驗等等,這些都需要在實驗平臺中有比較好的支持。
1、流量
在實驗中有三個要素,第一個就是流量,沒有流量也就不需要做實驗了,流量代表場景參與的用戶??赡懿煌臉I(yè)務(wù),不同的實驗類型,對整個流量的抽象是不同的。第二個是干預(yù),也就是控制。第三個是分析,所使用的業(yè)務(wù)指標能夠體現(xiàn)出做實驗的目的。
上圖是谷歌重疊實驗框架的一個簡單示意圖,分成了 ABCD 4 種不同復(fù)雜度的框架,可以結(jié)合自己的業(yè)務(wù)實際情況來選擇,如果公司業(yè)務(wù)比較多,比如有電商、內(nèi)容、游戲和支付等,就需要 C 或者 D 這種形態(tài)才能夠比較好的滿足業(yè)務(wù)需求。
2、聯(lián)合實驗
?接下來講一下聯(lián)合實驗的幾種場景。
其中一種是貫通實驗,在同一個業(yè)務(wù)的上下游之間做實驗,比如業(yè)務(wù)的客戶端、前端、服務(wù)端、算法測,整體要做一個順序的實驗。通常的做法是,在前端做實驗,通過傳參的方式來拉動后端去做響應(yīng),這是一種比較簡單的實驗方法。
第二種是聯(lián)合實驗,比如搜廣推場景,通常會分為召回、粗排、精排等環(huán)節(jié)。在做實驗的時候都會按實驗層來做實驗的控制。如果想做層與層之間的組合實驗,通常就叫聯(lián)合實驗,比如一個召回加排序的實驗,可能有些排序算法針對某些召回隊列是有效的,就可以做這種組合實驗。如上圖中的例子,層 a 和層 b 都在獨立的做實驗,如果想做 a 和 b 的聯(lián)合實驗,就需要建立一個虛擬的聯(lián)合層,原有的層 a 和層 b 的流量都會縮水,這是對業(yè)務(wù)影響最小的一種實現(xiàn)方式。
第三種實驗是跨業(yè)務(wù)的聯(lián)合實驗,比如搜廣推場景下如果想用 1% 的用戶做免廣告測試,就是跨業(yè)務(wù)的聯(lián)合實驗。也可以通過類似于優(yōu)先層,或者關(guān)聯(lián)實驗等方式來實現(xiàn)。?
所以在實際的實驗類型設(shè)計和實驗方案設(shè)計的過程中,要靈活考慮不同的業(yè)務(wù)訴求。
3、樣本獨立性
?接下來介紹樣本獨立性。在 O2O 業(yè)務(wù)中,比如直播、短視頻這種涉及到生產(chǎn)者和消費者雙邊市場的場景下,往往樣本的獨立性會受到一些影響,就不能很好地實現(xiàn)隨機控制。
對于涉及到雙邊甚至多邊的場景,比如買家、賣家以及騎手三方,如果很難滿足樣本獨立性,我們會通過類似版本翻轉(zhuǎn)實驗來做一些持續(xù)的觀測,也就是上個時間片用策略一,下個時間片用策略二,做足夠多的翻轉(zhuǎn),然后再總體上來看策略一與策略二的優(yōu)劣。比如運力調(diào)度策略,如果全局有多個調(diào)度策略同時生效,調(diào)度就亂了,可以通過給每個調(diào)度策略分一個時間片讓其生效的方法來論證其優(yōu)劣。
第二種是時間片輪轉(zhuǎn)實驗,在 O2O 場景中也比較常見,比如快遞或者外賣的 ETA(Estimated Time of Arrival)場景,我們可以通過時間片翻轉(zhuǎn)的方式來消除時間這種混雜因素的影響。因為在這種場景下,做 ETA 預(yù)估時,整個運力下所有的用戶之間是互相爭搶的,所以可以通過類似實驗片輪轉(zhuǎn)的方式來消除這種影響。當(dāng)然也有雙邊控制這種實驗。因為在做實驗的時候會有很重的網(wǎng)絡(luò)效應(yīng),比如分享這種沒有代價的溢出效應(yīng)。還有一種情況是剛才講到的運力在乘客之間的擠占效應(yīng),也會有一些影響。
針對不太敏感的場景,我們會做一些雙邊的控制,如果是一些有類似擠占效應(yīng)的強敏感場景,我們也會有類似于合成控制法等一些其他的方法來滿足樣本獨立性假設(shè),避免樣本出現(xiàn)干擾,以至影響最后的實驗結(jié)論。上面這三種案例,本質(zhì)都是確保分流的隨機性從而控制混雜因素對實驗結(jié)論的干擾。?
三、更快系統(tǒng)集成
這一部分將介紹如何更好地做工程集成。在做系統(tǒng)功能提升的時,通常有 4 個議題:
(1)實驗配置怎么分發(fā)?
(2)怎么做分流的執(zhí)行服務(wù)?
(3)實驗的參數(shù)怎么與平臺和業(yè)務(wù)代碼做集成?
(4)實驗日志怎么更好地支持分析師快速分析?
重點主要在后面兩部分,因為前兩部分的實驗平臺并沒有太多獨創(chuàng)的東西。關(guān)于配置,要么平臺自建配置中心然后做分發(fā);要么依托公司的配置中心做分發(fā)。分流服務(wù)這塊其實沒有太多差異點,既然做實驗平臺,比如 API、SDK、UDF 這些能力都是要具備的,下面重點講一下參數(shù)集成和實驗日志。
1、實驗參數(shù)
對參數(shù)集成的理解分為幾個層面。
?首先是參數(shù)如何控制。有三種控制方法,第一種是基于變體來控制,直接就是分組的名稱,這種控制法比較簡單,靈活性相對略差;第二種是基于參數(shù)來控制,參數(shù)有 key-value,比較適合于多選項的實驗控制,而且在后續(xù)也可以很好地做實驗參數(shù)的推全控制;第三種是基于配置的控制,所謂的配置是一系列參數(shù)的集合,往往基于配置來控制的時候在實驗平臺整合時會有一些優(yōu)勢。因為某些業(yè)務(wù)方過往都已經(jīng)有自己的實驗機制了,而且整個實驗配置也打包變成了一個配置。
如果是一個新平臺切入,比較好的對接方式是支持基于配置的方式來控制,這樣可以把一些打包的配置放到平臺上,然后分發(fā)給他,同時也可以去開發(fā)一些額外的特性,比如做一些沖突檢測,或是更好的工程適配等等。
第二個層面是參數(shù)的優(yōu)先級,比如實驗平臺的一個默認配置,再往上一個優(yōu)先級可能是普通實驗中的配置。如果想再增加優(yōu)先級,類似于在整個流量框架里,還可以給某些層去賦一個更高的權(quán)限,在這種層上的實驗參數(shù)可以有更高的權(quán)限。
當(dāng)然,隨著實驗越來越多,會發(fā)現(xiàn)好多 APP 包體會越來越大,在包體瘦身的過程中,做代碼推全也是一個很好的手段,我們也會做一些檢測,讓 APP 的包體能夠有效地減小。?
2、實驗日志
?實驗日志對分析師來說是非常重要的,我們提供了兩種實驗日志。
一種是分流日志,一般適用于服務(wù)端,因為服務(wù)端一般來說可以近似的理解為請求即觸發(fā),服務(wù)端也不會做太多的大規(guī)模緩存機制。
另外一種是觸發(fā)日志,比較適合于客戶端,一般來說為了減少實驗平臺的交互會采用緩存的機制,或者是我們很多實驗配置,希望 APP 啟動的時候就能夠生效,必須要做緩存。所以在客戶端會有一些緩存的機制,有緩存以后,如果我們拿到實驗配置以后就上報的話,往往進組的樣本量就被夸大了,所以這時候我們會做一些觸發(fā)的控制。比如在做實驗配置的時候,配置一些埋點事件,埋點事件觸發(fā)以后,才認為這個事件被觸發(fā)了,這樣可以更精準的拿到實驗效果。
上圖是一個簡單的示意圖,涉及到不同實驗日志類型是怎么產(chǎn)生的,怎么傳輸?shù)模趺磪R聚的,當(dāng)然涉及到日志的匯聚,包括后續(xù)的一個指標分析,大概我們就會有一個?數(shù)據(jù)的管道,比如實驗日志表,包括用戶行為表,包括逐層聚合后有更多業(yè)務(wù)數(shù)據(jù)產(chǎn)生的聚合表。一般來說聚合包括到分組粒度的聚合,到用戶粒度的聚合等等,支持后續(xù)不同情況的分析。
四、更好實驗分析
實驗分析的訴求是要保證實驗分析是可信的和科學(xué)的。為了保證分析是科學(xué)可信的,除了前面講的重疊流量框架,能夠保證整個流量是均勻與置信的以外,我們也會有適合于不同指標的各種檢驗方法。
1、流量質(zhì)檢
首先講一下實驗開始之前的 Pre AA 檢驗。不同流量平臺整個流量的感知是不一樣的,流量管理方式也不一樣。如果大家用過火山引擎,會發(fā)現(xiàn)它其實是一種弱感知的狀態(tài)?;趯嶒灥男枨螅憧梢詣?chuàng)建無限的流量層,而且這個層對你是隱藏的,但一般來說內(nèi)部自建的話,我們會把層都抽象出來。因為抽象出來有一些好處,比如像前面講的聯(lián)合實驗?zāi)欠N場景,可能我們在搜廣推的召回排序的時候,要做組合實驗,如果沒有一個很強的層感知就會無從組合。業(yè)界有些公司將流量層叫做 World/Flight/Cell 等等,又或者簡單就叫作 layer。所以流量管理的強感知和弱感知,是未來大家要做實驗平臺迭代需要考慮的點。
對于 Pre AA 驗證,上圖中右側(cè)展示了我們實現(xiàn)的一個截圖。如果 Pre AA 流量是平的,按照統(tǒng)計理論,對它做重復(fù)采樣,應(yīng)該發(fā)現(xiàn) AA 之間的 diff 顯著程度,p_value 分布應(yīng)該符合均勻分布。如果不平的話,就要懷疑整個分流是否是不均勻的。分流不均勻有兩種情況,一種是整個 layer 在做哈希分流時,seed 是一個壞種子,這個種子不太好,這時就需要選一個新的種子來保證流量分流的均勻性;另一種是 seed 是好的,實驗層上也有一些實驗在跑了,在使用剩余的流量做實驗的時候,又出現(xiàn)了 AA 不平,其實在做實驗的時候,會存在實驗的記憶效應(yīng),比如如果前期剛剛結(jié)束了一個實驗,這個實驗相對來說比較正向的組又分配到新實驗的某些組里,它可能本身天然就是有偏的,這時候我們也可以做 Pre AA 的這種驗證,但是這種驗證其實已經(jīng)不是在種子層面,而是 bucket 的層面,如果 DAU 能達到千萬,分桶一般會用千分桶,這時如果實驗桶是不均勻的,我們可以通過更隨機的 bucket 分配來有效縮減 AA diff。
這個功能往前再走一步,就變成所謂的流量自檢,我們平臺可以主動對一些重點的層、重點的業(yè)務(wù)去做一些流量質(zhì)檢,這樣我們可以事先發(fā)現(xiàn)問題,甚至可以干預(yù)用戶去創(chuàng)建實驗,這樣就不需要用戶手動觸發(fā)在層、桶或者實驗粒度上的檢驗。
同時這樣也規(guī)避了一個弱勢,如果不是基于實時引擎來做 Pre AA 計算,是有時間開銷的,這樣用戶也不需要等,相當(dāng)于前置計算中可以做到以空間換時間,前置做一些計算,能夠讓用戶使用流量的時候更放心。
2、校驗方法
?我們平臺目前有三種檢驗方法,第一種是在做分組樣本量均衡時的一個 SRM 檢驗,比如做了一個 50% VS 50% 的分組,如果分組之間進組的樣本量偏移比較大,那么就認為整個分流是不均勻的,這時有可能和 Pre AA 是類似的情況,就很難拿到一個相對比較自信的結(jié)論,所以這個地方是 SRM 檢驗。通常來說,對于這種比率類的,我們可以通過卡方檢驗去做論證。
另外一種,我們在做實驗分析的時候,人均時長、人均 gmv、人均訂單也是經(jīng)常要分析的指標,這時我們用了 Welch’s T 檢驗方法。
還有一種,像留存、用戶轉(zhuǎn)化率等轉(zhuǎn)化率指標,我們是用 Z 檢驗去做的。之所以用 Z 檢驗和 Welch’s T,是在于它們對數(shù)據(jù)集的要求會有一些差異, Z 檢驗可以用更低的成本去做,比如可以用基于主粒度的聚合表來做 Z 檢驗的分析,而像 Welch’s T 最好是要基于樣本粒度的表來做一些檢驗的計算。當(dāng)然其實沒有必要去追求更多的檢驗方法,而是應(yīng)該結(jié)合業(yè)務(wù)的需求來做。
上圖中右面是 Uber 實驗指標分析引擎的整個流程,它?從數(shù)據(jù)輸入到數(shù)據(jù)離線處理,到數(shù)據(jù)分布的判斷,包括針對不同的指標類型,會用到不同的檢驗方法或者計算方法。第一步是計算方差,后面才是應(yīng)用檢驗方法進行顯著性分析。
3、指標管理
?最后一部分簡單分享一下關(guān)于指標管理的一些經(jīng)驗。
整個指標體系會分為關(guān)鍵指標,業(yè)務(wù)的北極星指標,包括護欄指標,以及一些 OEC 指標。比如內(nèi)容產(chǎn)業(yè),判斷用戶時長更重要,還是生產(chǎn)者上傳更重要,還是廣告的收益更重要,往往這時候我們就需要引入 OEC 綜合評判指標來下結(jié)論。
另外,在指標設(shè)計的時候,我們需要考慮整個指標的靈敏性和魯棒性,所謂靈敏性是當(dāng)前時間它足夠靈敏,能夠幫我們下結(jié)論。所謂的魯棒性就是做一些護欄指標或平臺指標,也考慮一些指標的計算成本。
指標管理的實現(xiàn)路徑有三種,也是三個不同的階段。
第一個階段是業(yè)務(wù)驅(qū)動。實驗平臺前期是搭框架,后期做功能,再后期實驗平臺就變成一個指標的管理平臺了。實驗平臺指標上十萬是非常正常的。在第一階段可能并沒有很多資源,更多的是做規(guī)范,有了規(guī)范以后,不同業(yè)務(wù)方依照規(guī)范把指標導(dǎo)入進來,就可以用我們提供的實驗日志和檢驗方法,并且我們實驗報告能夠幫他做決策分析。
第二階段是任務(wù)驅(qū)動。隨著一些長尾的業(yè)務(wù)接入,可能業(yè)務(wù)方?jīng)]有數(shù)據(jù)開發(fā)資源,這時我們可以去基于一些標準的模板來支持他們更快的接入。這個模板可能包括離線的模板和實時的模板,使用模板指定自己的事件、指標口徑等等,能夠快速的實現(xiàn)指標接入,包括實驗報告。
最后一個階段是基于事件驅(qū)動。這也是很?多 SAAS 產(chǎn)品做的。主要有幾個好處,首先平臺抽象算子,算子用來規(guī)范指標的技術(shù)。另外業(yè)務(wù)方在定義指標的時候只需要選擇事件、算子,剩下的都是平臺托管的,火山引擎目前就已經(jīng)達到了這一階段。
五、問答環(huán)節(jié)
Q1:前面提到的實驗科學(xué)相關(guān)的書籍叫什么呢?
A1:《關(guān)鍵迭代-可信賴的線上對照實驗》,封面是一個河馬所以又稱河馬書,意指反數(shù)據(jù)驅(qū)動、實驗決策的 HIPPO 論。
Q2:客戶端首頁實驗,請求的時機可能是比較強的,等到分流的結(jié)果返回再渲染之后,可能會走一個兜底。這種情況下怎么能保證分流的均勻?
A2:其實前面講到了客戶端實驗怎么生效,可能是通過緩存方式來落后一個冷啟或熱啟的周期來生效,但是我沒有講到怎么保證分流的均勻。因為其實這一天中用戶的整個客戶端啟動,進組的節(jié)奏一定是有變化的,所以怎么來保證實際進組的均勻性,這時候要引入一個版本的概念了,在實驗配置的時候會有一個版本概念,通過版本來做一個強一致的控制。因為不同的用戶使用 APP 的頻次是不一樣的,重度用戶可能一天打開幾十次,一些相對非重度用戶可能兩三天才打開,和它整個進組的節(jié)奏是沒有辦法完全保障的,因為這時候單單用日期來做控制已經(jīng)不太科學(xué)了。比如一個相對低頻的用戶,他可能今天啟動了,但是他的實驗版本可能是一周之前的,這時候如果單純按日期來分析是不對的。
Q3:在流量管理的部分,強感知和弱感知的區(qū)別是什么?
A3:強感知,一個比較形象的說法是你在實驗平臺中實實在在能看到一個個的層,這個層上跑了多少個實驗都是能看得到的。弱感知就是整個平臺只有實驗沒有層,你看到的是一個個的實驗,但是實際上這個實驗是在哪個流量層上,沒有刻意的去展示給你,當(dāng)然在底層的工程框架一定是有一些設(shè)計的。
Q4:針對于總值類的指標,比如總播放的時長可能不服從正態(tài)分布,應(yīng)該用什么檢驗?
A4:首先總時長不滿足我剛才講的人均指標以及轉(zhuǎn)化率指標框架,所以對應(yīng)的檢驗方法就沒有辦法去做。但對于總播放時長以及 DAU 等,有一些公司的平臺使用 Bootstrap 等方法計算方差,然后緊接著也可以套 t 檢驗的公式來做這種置信度的分析。
Q5:在實驗指標波動的方向有沒有什么建議?
A5:涉及到實驗指標波動,如果是判斷波動的顯著性,業(yè)界通用做法是先看是否統(tǒng)計顯著,然后再看是否業(yè)務(wù)顯著。在計算指標波動的時候還需要注意分析單元和分流單元的一致性, 通常我們實驗分流一般都會基于用戶來去做分流,因為體驗的一致性會得到保證。也會存在按照會話分流或者請求分流等等的情況,這時候做波動分析的時候可能也會有一些挑戰(zhàn),你會發(fā)現(xiàn)其實整個方差的波動都會比較大需要進行一些消減,比如 DeltaMethod。
Q6:當(dāng)指標的數(shù)目眾多,比如成百上千的時候,會涉及到多種比較的問題,看實驗結(jié)果怎么好?
A6:對于想看的指標比較多的情況,有不同的解決辦法。首先從實驗?zāi)康纳鲜欠裼凶銐蚴諗康闹笜耍?dāng)然實際一般來說都是妥協(xié),可能我們這個實驗就是要觀察很多指標,這時候怎么辦?剛才我講到的,比如說把指標收斂變成一個統(tǒng)一的綜合分指標來去做評判,也是一個手段。當(dāng)然,如果很多指標也會涉及多重檢驗,要不要去做收斂,比如說是不是要求更強的置信度 p_value 等等。其實在目前我們的實驗平臺,我們提供一些選項,比如我們默認 p_value 是 0.05 幫用戶去做置信分析,但是用戶也可以去選擇 0.01 來做分析。我們來幫他做顯著性的判斷。所以我理解其實更多的還是結(jié)合業(yè)務(wù)的需求。