9月15日FMI-2018人工智慧與大數據高峯論壇圓滿落幕,獵聘網首席數據科學家單藝就A/B實驗的基本概念、A/B實驗的成本問題、開源的A/B實驗工具Macaw以及基於強化學習的A/B實驗自動化四個方面的內容進行了深入的分享。

獵聘網首席數據科學家單藝

飛馬網將其內容整理如下:

首先感謝FMI的邀請,今天很榮幸有這樣一個機會,跟大家交流我們最近開源的工具,Macaw,專門支持大規模在線A/B實驗。我主要會講一下它的原理和基本使用。先做一個簡單的個人介紹,我自己主要做機器學習和數據挖掘,現在在負責獵聘的AI和大數據技術研發。今天我的報告分五個部分,第一部分主要講一下A/B實驗的基本概念,然後講一下A/B實驗在現實中遇到哪些問題,第三,介紹一下開源的工具Macaw,後面講一下A/B實驗中基於強化學習的原理和使用,最後是總結。

這兩個頁面是我們在獵聘做的很重要

的A/B實驗。這個A/B實驗看上去很簡單,是我們的用戶註冊頁面。我們在互聯網網站上和搜索引擎上購買各種各樣的廣告,吸引用戶註冊。因為用戶是我們最核心的資產,我們在上面投入非常大的資源,包括資金去購買這些流量,這些流量來了以後要通過這麼一個頁面。這個頁面非常重要。這是我們做過的兩個版本,這兩個版本看著挺像的,右邊是註冊,左邊是不同的在我們企業上的招聘的情況,證明獵聘上有很多很好的職位,值得你試一試。這兩個頁面看著沒有太大的區別,但是註冊轉化率有明顯的區別。

我們通過優化這個頁面使得我們註冊成本明顯下降。而這裡面的方法是不斷做A/B實驗。臺下的朋友中有了解A/B實驗的請舉手。看來A/B實驗沒有得到大規模普及,但是它是非常有價值的。 

我介紹一下A/B實驗的基本概念,A/B實驗的來源是統計學裡做因果關係的研究。世界上有很多東西是有關聯的,但不是有因果關係的,我們要確定因果關係,最常用的方法就是A/B實驗,上面這個用戶是A版本,是老的版本,我們把一部分用戶繼續使用現有的版本,這部分叫Control,對照組,沒有什麼變化的,我們把另一半的用戶試用B版本,這個叫實驗組,這兩個版本的用戶是隨機挑選出來的,保證這兩個用戶羣是可比同質的。我們衡量的效果是轉化率,下面的新版本要好,上面的舊版本只有30%,上面有60%。轉化率在不同應用場景裏目標不一樣,他有一個通用的名稱叫OEC(Overall Evaluation Criterion),OEC是要跟業務方達成一致的目標,我們最主要的目標是什麼,最核心的目標是什麼,在註冊頁是註冊轉化率,這是比較淺層的,如果看長期的需要看一下註冊用戶帶來的價值是多少,比如帶來多少訂單,LTV是多少,這些是需要跟業務方達成一致。 

這個聽起來很簡單,但是要達成一致是不容易的,因為業務方常常有多個目標,不同的業務團隊有不同的目標。拿獵聘來講,有時候業務方說就剛才那個頁面你多註冊,註冊的人越多越好,轉化率越高越好,但是企業產品團隊裏要的是我想要的人,比如我招一個工程師,你來了一堆產品經理,用這個頁面註冊,對於我們的招聘網價值是有限的,甚至沒有用。所以需要跟各個業務方達成一致,確認最終衡量頁面成功的標準是什麼。這是在實際工作中需要注意的。 

做完了這個之後放兩個版本上去,讓實驗跑起來,三天以後看一下結果,哪個OEC結果好用哪個。但這是一個錯誤的做法。這個時候就需要有統計背景的分析師或者專門的統計學家過來做基於假設檢驗的分析。這裡面有一張經典的圖,用來做A/B測試結果統計分析。這個圖裡有兩部分曲線,左邊CRA是A版本假設的轉化率,2%,B是新版本的,轉化率是2.12%,我們是不是可以說B比A好。不能簡單這麼說,因為這兩個值都是隨機變數,你可能今天看到2.0,明天看到2.1,這邊是2.12,明天是2.0,甚至1.9。怎麼樣從隨機現象裏找到真實可靠的結論,這個要靠做統計分析,統計裏的假設檢驗分析。

這裡要關注幾個重要的值,第一,算它的提升多少,我做了一個新版本,它給我帶來多少提升,然後關注P Value。假設原來版本並沒有實質改變的前提下,我們觀察到2.12的概率可能性多少,如果可能性很小,說明我們之前的假設是錯的,這時候應該拒絕新版本跟原來的版本沒有本質區別,那就是說我們認為它比原來的版本不同,在這個情況下表現出的結果高,就是我們會認為B版本比A版本要優,要更好一些。另外要注意左邊那個Observed Power。超過這個閾值之後,我們才認為,這個B版本是很大可能比A好。我們算出來P Value是0.45,如果是5%的一類錯誤,這個已經通過了檢驗,我們認為B版本的確有改進。 

沒有經驗的產品經理會犯錯誤:上線一兩天,他只要看到一個新版本比舊版本好,他做的東西有成績出來了,很容易就把這個數據發出去了。再過了幾天發現這個指標掉下來了,他覺得很惱火:為什麼是這樣的?因為他沒有受過統計學的訓練。 

還有一個關鍵的點,我們判斷P Value是多少的時候,經常用一個統計量是Z-Score。我要提醒的是為了檢測的靈敏度,標準誤要小。比較小的標準誤則要求樣本量要比較大,標準誤與樣本量的平方根成反比。因為版本不斷迭代,優化空間越來越小,優化空間越來越小,他會要求樣本量成平方關係的增長。所以這個時候對於很多網站是一個考驗,流量沒有那麼大,怎麼有效的做實驗。比如一天只有幾千個訪客,可能達不到這個標準,可能要很長的時間才能達到最小的樣本量的要求。 

這個時候要想辦法充分利用流量,這也是我們自己開發A/B測試系統的主要原因。我在雅虎工作的時候,每天有很多實驗在跑,為了檢測這麼小的差異,我們對於樣本量的要求很大,即使一天有幾億訪客也不夠用,一定要想辦法合理的分配流量才能做好這個實驗。 

為什麼A/B實驗不是所有人都在用?第一,開發成本,做A/B實驗至少兩個版本,工程師多開發一個版本,設計多開發一個版本,他們就不樂意了。第二,實驗的上下線,這是很麻煩的事情,如果這個實驗很差,可能第二天就要下掉,因為有一個註冊頁面上了一個版本很糟糕,第二天業務完全不幹了,不要再做實驗了,這個太差了,不用檢測了。經常來回的上下線折騰。前面講到流量是很寶貴的,怎麼合理方便的分配流量,可能我想給這個實驗多分點流量,可能之前得到的量比較少,這個分配也是需要做工作的。還有一個,風險控制,如果上來一個版本,這個版本有Bug了,或者就是效果不好,我不能讓他消耗50%的流量,這個樣明顯的損失是不行的。最後需要不斷的迭代優化,不斷地做實驗。真正數據驅動的產品需要不斷的用數據研究分析產品怎麼樣做的更好,是不斷的優化。所有這些增加了很多工作,的確有比較高的成本。

還有一個,文化上還有一個挑戰,很多公司裏做決策的領導認為自己是最牛X的,我的想法最重要,我的洞察,我的直覺非常的牛逼,非常的好。你要上A/B實驗他還覺得你多此一舉,這也是A/B在很多地方沒有用起來的原因。這在英文裏有一個名字叫HIPPOS,賺錢最多的人那個觀念可能壓過你的A/B實驗。有時候我們要繞著走。 

但是我們想不斷的提升,就需要不斷的做實驗做優化,所以需要做一些事情讓做實驗變的更容易一點。因為獵聘很多關鍵的數據驅動的產品,比如給求職者推職位,給獵頭推簡歷。這些產品的形態比較穩定,我們做的是不斷的優化演算法,優化界面。這個時候需要大量做實驗,為了提高做實驗的效率,減少做實驗的錯誤,我們開發了一個系統,Macaw,它實現了幾個關鍵的點。注意的是它不是一個完整的實驗+分析的平臺,這個太複雜了,尤其後端做分析,往往把數據取下來由分析師產品經理自己做,也有報表系統的。但是我們這次開源的技術包括四大塊:流量隨機化,通過演算法實現隨機化抽樣;然後分層分域,怎麼充分運用流量;還有配置管理,做實驗的時候怎麼做實驗的上下線,怎麼調配它的資源分佈;最後,我們有時候不想自己手動調,由演算法幫我們調。 

前三部分在很多大公司裏比較常見,最後一部分,我目前看到Macaw是開源的A/B實驗系統裏唯一獨有自動分配的方法。首先講一下應用的場景,也是流量分配的基本概念。你可以看到整個用戶在上面進來,有不同的層,第一層是UI,接下來是做推薦系統排序的那一層,最底下一層是做基礎策略,做召回的一層。系統由不同層組成,不同層沒有直接關聯關係,每一個層都有不同的方案策略。不同的策略,他們之間必須相互分割,不可能有一個用戶在某一層裏既通過A策略也通過B策略,這是不行的。這裡面有一層一層,我們還會把用戶做一些分割,根據某些條件做分割,縱向的分割叫域,比如北上廣深一線用戶放在一起做實驗,還可以指定一些用戶,比如特殊用戶不讓他參加某些實驗。

以前如果做這樣的工作挺麻煩的,一個公司裏有不同的應用,這個應用要自己實現一套邏輯,顯然是不划算的。用了我們這個庫後連產品經理都可以做。例如,我們把流量分成一千個桶,隨機分配的時候,用戶的ID進來,他會隨機散列到一千個桶中。接下來定義不同的種類,然後定義不同的策略,某一個用戶進入這個種類,比如他的積分小於三千的進入這個種類,然後再一層一層的定義,比如第一層做幾個實驗,佔多少流量,佔多少份,他的一些參數是什麼,第二層是什麼樣子,這樣把這個文件寫好了,由A/B測試框架讀取,然後就生效了,就這麼簡單。 

如果系統是分散式的,我們可以把配置放在ZooKeeper裡面,通過客戶端可以不斷的得到新的更新。像上面的實驗,在中央控制的界面上把配置更新,所有伺服器幾秒鐘之內拿到新的配置。接下來通過這個類把不同的配置,每一層的配置全部放進來,當一個請求進來,一個用戶過來我們通過下面簡單的調用,先把這個Policy Model調起來,把用戶ID一傳,知道哪一層,知道當前層的策略,然後把流量分配,分配完了之後根據策略ID,知道相應的代碼就可以了。 

剛才的Macaw通過配置文件實現了流量的隨機化,流量分層分域的分配,配置的管理都可以完成。有時候我們會說這個流量分配要怎麼做,比如我同事有幾十個實驗,以前做廣告的時候同時上幾十個實驗,這個流量怎麼調,有時候是比較靠經驗的方式,也比較費時間。要定期看一下結果,把好的版本都給他流量,其餘版本還不確定,流量的變化也會隨著季節變,比如今天是這樣的,過了兩周就變了,結果不一樣了。這種手動的比較麻煩,比如過國慶節的時候我不希望再手動的調流量分配的參數,我們就想辦法怎麼自動做這件事,我們想到了用強化學習裏的演算法,多臂老虎機的演算法。

強化學習是機器學習中的分支,60年代就有人開始研究,但是它一直不溫不火的,直到最近阿爾法Go通過強化學習,還有AI Agent打魔獸的工作得到很大的成功,它又重新熱起來了。傳統的機器學習中,監督式的學習需要獲得帶標註的數據。但是強化學習的想法是,我是一個小老鼠,被丟到一個很大的迷宮,這個迷宮裡什麼都沒有,除了一些乳酪,喫到就可以活命,甚至還有一個陷井。在這個殘酷的環境中,老鼠要找到這個乳酪首先要探索,要猜這個乳酪在什麼地方,他不斷的探索學習,他可能零星的碰到一些乳酪,發現乳酪分佈有一些規律,往左拐是對的,還是往右拐是對的,這樣一個機制告訴他是否有一個方法策略或者思路。通過這個方式學出來一個模型,做我未來最有利的行動,這是強化學習基本的思想。我們在做自動化管理的時候也是這個思路,不知道策略哪一個好,我要試,試完了之後猜哪一個策略對我最優,我要儘可能的利用他,這是基本的自動化管理的思路。 

具體來講,我們做了三種演算法,比如我們同時上線了M個策略,就像我去一個賭場,這個賭場有一臺老虎機,每個老虎機產生的獎勵有一定的概率,有的老虎機得獎概率多一點,另外的少一點。這個老虎機是非平穩的,賭場的人可能在後面調。我希望儘可能的多贏錢,累計到最大的獎勵,因為我每次要花成本,我希望失敗的次數越少越好,這是一個很經典的,也是比較簡單的強化學習的問題。解決這個問題最簡單的演算法是?-Greedy:我現在還不知道,我先試,一共有100個幣,拿出5個去試,我試一下不同的老虎機,看哪個贏錢最多的,接下來把所有的賭注都壓在這個上面,就像做實驗的時候把5%的做實驗,然後找出最優的,把剩下的流量都壓在最優上,這是一個非常簡單的方法,但是很有效。 

因為我們專門做實驗,一千個流量用完了,下一個又拿出50個做實驗,我發現以前選的不是最優的,可能通過這一輪找到最優的,利用最優的方案幫我掙得最大的利益,這是很簡單的思路。 

接下來一個方案要深入一些,既然每一個方案的回報是隨機變數,那我可以通過歷史數據找到它的均值和置信區間,就像這裡面ABCD四個方塊,縱軸是它的轉化率的度量,A的均值是最高的。我們採用一個比較樂觀的策略,我要關注最有可能給我帶來最大收益的方案,這個時候應該選擇C,因為C的方差比較大,不確定性高一些,它的上限比較高。通過蒐集歷史數據,算它的均值,方差,假設它是一個正態分佈的,我可以用它的正態分佈的兩倍方差算出來最樂觀的估計,這個時候演算法會選擇這個C方案。這是它的一個思路。他不會傻傻的做實驗,他會做統計的計算,做出最樂觀的選擇。 

UCB是很好用的方案,但是對系統有要求。如果沒有流式計算,或者不能每個小時更新一下統計,可能我只能一天算一次。假如運氣不好,B方案的情況不太好,B方案就出不來,老選C方案,而這不是最優的。那怎麼表現得更聰明一點,不用等數據的完全更新?有人提出了這個方法,Thompson Sampling,這個演算法在30年代就有人提出了,機器學習沒有出現之前就有人研究到這個問題。這是Bayes的方法。假設說這邊有三臺老虎機,開始我的信息比較少,只能做很簡單的分佈,我用假設的均勻分佈隨機採樣,按照這個分佈拋一個隨機數出來,即在這個分佈假設下你得到的收益是多少。根據這一輪選取最大的做下一輪的實驗。比如ABC三個,這一次A分佈裏採樣的值最大,我選A,有可能是B就直接選B。然後我會得到更多的信息,因為我做了實驗了。比如A方案出去做實驗了,效果怎麼樣,很快就知道了,拿回來信息更新一下,我們就得到新的分佈,這個新的分佈因為有新的數據,比原來更加準確的刻畫不同實驗的效果,接下來大家再來隨機的抽一把,看誰在新的分佈底下抽的收益最大,再選一個,這樣不斷迭代下去。 

你會看到隨著歷史數據的收集,原來什麼值都有可能,慢慢的像藍色的收益很高,方差也很小,說明他是一個很穩定的,不斷帶來高產出的方案,因為每次他的均值大方差小,所以每次抽樣的時候他常常是最大的,系統會自然傾向於選擇最後這個藍色的方案。通過這樣一個方法,我們不斷的更新概率模型,選擇新的方案。通過這樣一個方式,我們可以讓系統自動進行流量的分配。 

這些演算法不是很複雜,但實現起來還是要寫一些代碼。我們在系統裏直接支持了。我們要根據不同的場景選擇不同的強化學習的方法,我們用的最多的還是Thompson Sampling,因為它對系統要求沒有那麼嚴格。系統如果能夠快速更新,我們的統計是可能幾秒鐘以後就出現了,我們就上UCB,精確度可能高一些。前幾年,大概在2013年2014年的時候,美國做這方面的人曾經有一個大的論戰,Bandit演算法到底是不是比A/B的好。A/B有比較好的透明度,可以比較好的控制,如果想快速得到一些結論,比如你有兩個方案,快速可以統計出哪個方案是好的,然後用好的方案就行了。像基於這個演算法來講,風險小一點,但是要用好,統計分析複雜一些。根據自己的業務需而和演算法知識掌握能力選擇,兩個方案都可以用。 

我們在這個系統裏通過簡單的配置,把域設置好,初始化一些參數這個系統就可以跑起來,我們再更新這個參數,他不斷根據新的信息做自動化的調配,這是他的用法,比較簡單。 

這個系統我們自己用的還是不錯的,也做了很多打磨。三個月前把它開源了,這是我們開源的網址,總體來講,這是一個簡單可用的實驗管理工具,能夠幫助大家更好的優化自己的產品,給用戶更好的體驗,把大家的工作業績做的更好,今天的報告就到這裡謝謝大家。

PS:

想要獲取大會PPT的朋友可以掃碼關注公眾號。

獲取方式:

掃碼進入公眾號——底部導航欄回復關鍵詞"

ppt

"進行查閱哦!

關注後回復「ppt」

往期福利

關注飛馬會公眾號,回復對應關鍵詞打包下載學習資料;

回復「入羣」,加入飛馬網AI、大數據、項目經理學習羣,和優秀的人一起成長!

微軟大牛人工智慧系列課

(掃碼試聽或訂閱)

資深程序員想轉行嗎?點擊

「閱讀原文」


推薦閱讀:
相關文章