標籤:

美麗聯合(蘑菇街)業務升級下的機器學習應用

通常機器學習在電商領域有三大應用,推薦、搜索、廣告,這次我們聊聊三個領域裡都會涉及到的商品排序問題。從業務角度,一般是在一個召回的商品集合里,通過對商品排序,追求GMV或者點擊量最大化。進一步講,就是基於一個目標下,如何讓流量的利用效率最高。很自然的,如果我們可以準確的預估每個商品的gmv轉化率或者點擊率,就可以最大化的利用流量,從而收益最大

2014年中旬來到蘑菇街,那時候蘑菇街剛剛開始嘗試機器學習,在這3年中經歷了很多變化,從模型的角度來講,大致可以分為打造爆款、追求效率、提升品質。雖然在過程中經常和業務方互相challenge,但我們的理念始終是技術服務於業務,模型本身的迭代需配合業務目標才能發揮出最大的價值,因此選擇模型迭代的路線,必須全盤考慮業務的情況。

在蘑菇街,機器學習的工程師不叫演算法工程師,而叫策略工程師。因為這種流量分配和策略問題不單單是演算法問題,而是涉及到生態的流量分配和生態建設的問題,所以我們把自己定位為策略工程師。所以在做任何一個模型優化或者是演算法迭代的時候,除了線上ABTest 要拿到結果之外,還要對整個公司的定位、產品的形態、未來商家用戶對你的策略的反應,有自己的定位和分析。

今天的主要內容會從三個階段展開:

圖 1

一、 導購到電商:爆款模型VS公式

一開始蘑菇街是導購平台,我們會把淘寶上很多好的商品,通過買手或者商家自己報名的方式挑出來,用瀑布流的方式展示,用戶只要是從蘑菇街導過去,淘寶就會給我們分成。當時我們做得不錯,活得很滋潤。後來因為某些原因,被淘寶掐掉了。

後來被迫轉型到垂直電商,剛開始做平台的時候,商家資源比較稀缺,我們為了讓用戶在平台剛開始起步的時候,不會因為我們做得不好而對用戶造成傷害,做了買手優選。買手優選其實是一件很重的事情,我們當時有一個買手團隊全是妹子,她們會把蘑菇街上的主要商品讓商家寄送過來,然後做好幾道的人工篩選,確保商品質量符合當前的品質和定位。在這樣重成本的投入情況下,我們的流量買過來之後(大家知道,互聯網很多公司早期的流量都是靠買的),我們希望能夠得到足夠的回報和利潤,能夠讓商家願意和我們玩下去,所以我們希望能挑出一些爆款,就是把質量比較好和賣的比較好的款挑出來。當時的情況並不是很理想,第一個階段我們稱之為小米加步槍的時代,如圖 2 所示。

圖 2

註:GMV,全稱 Gross Merchandise Volume,指的是商品交易總量

一個很簡單的問題,為什麼我們要用機器學習的方式做流量分配或者說是流量排序,而不用銷量直接排呢?比如,要讓新商品排上來,直接按照上架時間排就可以了,為什麼要用模型的方式去排呢?其實這就是策略問題,和策略工程師有關。它如果是一個生態,會有好幾方的行為去相互影響。也就是說一個商品,如果只按歷史銷量去排序,這個歷史銷量可能是因為你給了它流量的情況下得到的這個銷量。在機器學習里這種情況即是,它是有 bias 的,這種 bias 用一個公式是去不了的。如果你想做得好一些的話,需要考慮多種因素,比如說商家的質量、銷量、商品的退貨退款率等一起考慮,通過一堆的因素去看商品排第幾名。這時就帶來一個明顯的問題,這麼多因素每個應該佔比佔多少,而這個是人拍不出來的。而模型則非常適合解決這個問題。

當時在第一個產品上線的時候,公司比較偏業務驅動,在技術上沒有太多的積累,沒有集群,沒有全鏈路打點系統。這裡的集群是指高性能計算集群,比如你要搭 spark 是沒有的,比如說你要做一些好的數據統計或者是數據分析,你要從用戶進你的網站或者進你的 APP 到他整個決策過程中有一個完整的鏈路打點,而這個並不是一個很簡單的事情。在這樣幾個比較困難的背景下,我們把問題做了一些簡化——把排序問題轉化為分類問題,就是轉化為挑好商品的問題。這是什麼意思呢?本來有 200 多萬個商品需要排序,需要打分,不知道哪些是好的,哪些是壞的。這時候,我可以通過成交額、點擊量等幾個關鍵指標,把前面 TOP500 或者 TOP1000 的商品挑出來做正樣本,然後再挑已經有足夠曝光數量的商品,已經給用戶展示過但是各方面表現並不是很好的商品當做負樣本。這樣就把排序的問題當成分類問題,這樣學出來的模型,就是爆款模型。這個爆款模型它會告訴我每一個商品根據它的feature 的情況,它會成為爆款的概率是多少,根據概率值對全體的商品做排序的事情。建了這個模型之後,在 ABTEST 的情況下,整個 GMV 有 10% 以上的提升。

二、 做大做強:轉化率模型+個性化

隨著平台的快速發展,商家數、用戶數增加很快,商品集合快速提升,這時候帶來了很多問題。比如原來的買手團隊 hold 不住這個量。大家把淘寶叫「萬能的淘寶」,在淘寶上可以搜索到任何東西,商品豐富度非常大,它的生態非常強大。一個生態非常強大,它對用戶的留存率就會非常高。我們作為一個垂直電商,如果想做得好,必須能夠在一個領域裡滿足得比較好。比如我們是一個女性服裝市場,服裝本是一個非標品,如果款式不足就無法持續。這時候人工優選慢慢退出歷史舞台,因為沒有辦法應對商家那麼多商品。放棄了買手優選之後,商品就直接流進來了,以前我們關心爆款模型的時候,不需要關心商品的質量和商家的服務質量,而現在這就變成了比較嚴重的問題。

另外一個問題是以前的爆款很集中,很集中的時候商家馬太非常嚴重,流量買過來之後集中被頭部商家吃掉了。平台想做大的時候情況下,必須花更多的錢買流量,整體的效率是變低的。另外一個點,我們模型本身的 AUC 指標在當時已經到了 0.95 了,基本上沒有任何的提升空間了。

另外一個問題可以比較直觀的感受到,我只預測頭部的,但有些商家一天賣幾十單也可以活得很好,這種商品就很難有準確的概率去預估。把這個問題再細化一點,其實它是機器學習領域或者與互聯網結合最緊密的問題,叫 CTR 預估問題。如果大家了解整個互聯網的發展的話,可以說 CTR 是能夠讓谷歌或者阿里巴巴有今天高收入的一個重要技術,其實它是原來的互聯網流量廣告里的一個非常核心的技術。當時有一個笑話,就是因為有太多優秀的學生都去做 CTR 預估問題了,人工智慧在才沒有什麼進展,但做這個除了賺錢還能做什麼呢?這個領域在國外發展比較成熟,而且這幾年還在不斷的發展。

圖 3

這個在業界一般有兩條路:一種是大規模高維離散特徵+LR;第二個是中低維連續特徵+非線性模型。前者典型的代表是百度、Google,他們是能在千億維度的特徵去做模型,後面中低維度的代表是雅虎。不能說哪種更好,因為在機器學習領域有個 no free lunch 的原則。高維離散的優勢很明顯,它對模型的刻畫非常細緻,比如說它會把商品 ID 都丟進去,它基本上能對它歷史上見過的東西全部都放進去。但它的劣勢也非常明顯,千億維或者是千萬維的特徵,國內也沒有幾家公司可以讓它跑起來。它對線上打分的系統也有非常高的要求,線上搜索引擎的一個 Query 過來,你需要在這麼高維度的去查詢出你相關的 feature,再去把這個商品或者文本的分數打出來,這不是一個簡單的事情,還要涉及到特徵的存儲,另外它的可解釋性也不是很好,因為維度太多了,很多文本編碼都不知道它是幹嘛的。

另外一個是中低維連續特徵加上非線性模型,根據我們的了解,最近阿里也是偏這個方向。這個優點很明顯,非線性模型對比 LR 在特徵工程上有天然的優勢,LR 非常依賴特徵工程做得怎麼樣,但非線性模型這方面稍微好一點。我們自己和引擎做一些解耦,可以通過批量推分數的方式和引擎做解耦,這樣線上打分系統的問題就可以部分被解決。但是劣勢是預估速度慢,模型確定比較困難,調參困難,因為線性模型人是可以理解他是做什麼的,但是非線性模型不知道它在幹什麼。尤其是現在的深度學習模型,理解起來就是偏黑盒的東西。

介紹完業界通用的兩種技術之後,蘑菇街選擇的是偏後一種,因為我們的系統在做模型或者做策略選擇的時候,會考量當前的場景和系統工程團隊對你支持的粒度,當時我們選擇了中低維度連續特徵和 LR。因為我們對非線性模型的掌控度比較低,所以選擇了折中的模型。

接下來我們進行一個比較標準的機器學習的套路,從樣本到特徵到模型。

(1) 樣本

圖 4

工業界有 2 種常用的方式,第一種叫 ponitwise,另一種是 pairwise。point 是排序的時候,商品是單獨的去考慮的,比如 A 就是A,不會去和 B 考慮,而 pair 是更接近用戶真實的行為,比如說進淘寶搜索「連衣裙」,會出現一批商品,它是前後或者一組商品對比會對你造成決策上的影響,所以它是把兩個兩個的商品組合成樣本,區分正副樣本。第三種是 listwise,更真實,一次 query 看到 10 個,就是 10 個一起去做組,這種會更複雜。

前面這 2 種,我們在選擇時對比了優劣勢:第一種 point 樣本構建比較簡單,如果做 CTR 預估,這條日誌如果被點了就是正樣本,沒有被點就是負樣本,不需要考慮更多的東西。如果用 pair,一次出來假設 10 個商品,10 個商品每個兩兩組 pair,樣本數就會爆炸,會產生很多噪音,因為用戶不是每 2 種商品都會去組 pair 對。第二個好處是機器學習的訓練樣本里的 loss function 不需要修改,因為每個樣本只是針對A,LR 或者 Xgboost 都是一條一條樣本進來,如果你想組 pair,要麼走 cheek,比如說把兩個 pair 之間的樣本,A 減 B,減出來的 feature 去做訓練,去學習它的 loss function,另外一個就是改 loss function,這個成本會比較高一點。如果是改 loss function 的方式,它是通過支持 pair 對的方式去做,這個成本就會稍微偏高一些。然後如果你改 pair 對的 loss function 的話,你會帶來預測的時候,因為離線訓練沒有關係,兩個A-B、C-D 都可以減出來它的 feature,但如果真的線上打分的時候,一個 query 過來出現 10 個商品,你去排序,每個 pair 組一下,再去 A-B、C-D 的話,你的 RT 基本不用玩了,因為用戶等半天你的結果都出不來。這個地方就會帶來,如果你訓練用 pair,預測用 point,又會有不一致,lambdamart 這方面有比較好的解決方案。當時我們評估了整體優勢之後,還是選擇 pointwise 這種方式。Pointwise 刻畫樣本的時候,是不考慮商品之間的關係的,也不考慮用戶真實有沒有比過其他,在信息上就會有丟失。

(2)特徵

因為電商領域的特徵比較可以分類。首先,電商領域基本是商品、店鋪、用戶三大類特徵。如果說得細一點,比如說可以分為統計類,比如說這個商品歷史上的點擊率、曝光值、點擊成交是偏連續值,它是有業務含義的用戶行為的統計值。還有一些離散類,比如商品 ID,大家可能理解商品 ID 是毫無意義的東西,實際上它是一個非常有用的 feature。然後 Query 分詞之後的 ID,然後它的價格、標籤。其他還有一些沒有歸類,比如商品的描述——標題、描述,有一些商品在詳情頁面有一些特殊的描述,比如說圖片,都可以放到裡面。對特徵處理的話,其實有一些常見的手段,比如說取個 log,做個平滑。平滑是很關鍵的,一般常見的有貝葉斯平滑和拉布拉斯平滑兩種,剩下的就是交叉和離散化。交叉是因為我們是線性模型,本身模型在非線性空間是沒有優勢的。其實很多特徵之間是有非線性關係的,但是我們人肉地去做一些交叉的事情,讓模型去學習一些非線性的信息。

(3)模型

圖 5

這裡可以進一步講整個模型是怎麼做的。這裡有兩個模型,我們都做了。第一個模型是 LR(Logistic regression),它是線性的,用的非常多。百度在 14 年之前,在深度學習沒有像現在應用出來之前,LR 效果是最好的。業界上有各種模型各種迭代,但他們的 LR 是最好的,他們的 LR 做到千億維度的 feature,在鳳巢那邊。它有一個好處是,它支持你調試,可解釋性強,非常適合你通過這樣的模型去理解業務分布是怎樣的。它的劣勢是你要做非常多的特徵工程的事情,如果特徵工程做得不好,這個模型就不太好。第二個的 Xgboost+LR 的模型,是 Facebook 在 15 年提出來的,他們說效果非常好。我們拿過來用了之後確實比較好,它有一個非常好的地方,它是開源工具,它背後是實現了 gbm 的演算法,它可以自動幫你找到一些非常多的特徵,一些高維的抽象的特徵,在人肉做一些特徵事情上減少很多工作量,這樣就可以在樣本上或者其他地方發力。這其實是一個效率問題,並不是說 LR 不可以做出這樣的模型,但你付出的成本是有本質的差距的。Xgboost+LR 我們遇到的問題是,它的泛化能力偏弱,因為它模型的原理是算殘差的值,所以它的數位元組點切得非常細。在切的過程中,如果突然有一天數據分布突然變化比較大的時候,很多切出來的 feature 的特徵是不對的,這時候用它有一些問題。它的模型也比較複雜,如果兩百多棵樹,每棵樹有 4 層,這是非常典型的 Xgboost 的結構,這時候要很難理解這個模型到底幫你做出了什麼事情。所以調試要困難一些,很多時候你是通過自己設計 case了解這個模型是什麼情況。

這兩個模型,第一個模型 LR 是概率模型,預估轉化率概率模型去替換爆款模型,它的線下AUC 可以漲 0.17%,線上轉化率可以增長 8%。而我們用 Xgboost+LR,線下 AUC 漲 5%,線上轉化率可以漲 5%,而且帶來個性化的特徵加入變得比較容易。

這裡還有一些思考可以和大家分享。我們把數據挖掘和機器學習理解為挖礦的行為,如果對挖礦有一些了解的話,大家可以知道不是說前期挖得越快越好,如果說前期挖的太猛,把礦搞塌了,後面的東西其實就挖不出來了。為什麼這麼說呢?你在設計你的策略的時候,你要考慮對你的生態的影響,對你當時情況的了解,有沒有把目前的數據挖到比較細緻的狀態,這樣子可以去調整。如果整個生態都玩壞了,大家都沒得玩了。幾種做法,像樣本、特徵和模型是互相影響,比如把 point 升級到 pair,要不要升級到 pair,或者說要不要把模型從 LR 升級到 Xgboost+LR,這裡都是有權衡的。一個比較直觀的標準是,它會有一些離線評估。比如說當前的樣本分布它的 AUC 是多少,比如在爆款模型中,它的 AUC 已經到 0.95 了,那我設計的那套樣本已經對線上沒有價值了,我需要進一步的讓我的樣本里含有更多的信息,讓它變得複雜,更接近用戶真實的行為,這樣子 AUC 會降下來,模型就有空間了。模型如果用LR 做,我發現我的 AUC 是漲了,但是加特徵加的很累。但是我用 Xgboost,我會發現不停的加特徵還是會漲 AOC,那麼我會評估一下兩邊的工作的優缺點。比如說我用 LR,其實我一直知道我是做什麼的,但是我用 Xboost,我不知道這些加進去做對線上造成的影響,這時候監控就要做得更好。所以,我把它整體理解成一個互相影響的動態過程。

為了讓我們的流量效率變得更高,我們還做了個性化的事情。個性化的方案一般有2種事情,一種是標籤類個性化,一種是偏推薦的行為粒度相似個性化,比如你買了又買,看了又看。第一種是業務方非常喜歡的,比如你給了他一批高購買力用戶,他很開心,比如說新進來的商家,品類比較高,就定位到高品類的用戶上,然後直接推給他了。但標籤類涉及到準確率和召回的問題,如果想做得准,用戶覆蓋率就不夠,比如在蘑菇街的平台上大部分是女性,偏可愛或者是偏韓版。但你出一個波希米亞風格,你 tag 是打出了了,但是用戶只有幾千個,你招一批這樣的商家,這些用戶流量不足以支撐它在蘑菇街的發展,這樣很快會遇到這樣的瓶頸,你想做得准覆蓋的量不夠,覆蓋量夠的時候又不準,效果又沒有了。

另外一種是不管它的解釋性是什麼,因為你用戶的行為會自己幫我做個性化,你看了這個商品或者你買了這個商品然後我給你推薦這個商品,這種偏推薦的做法。這樣刻畫非常細緻,因為這就是淘寶以前說的千人千面的技術,而且技術場景和推薦是一樣的,是互相遷移,一套技術支撐了好幾個場景。但問題是業務方不喜歡,你做出來的東西,線上效果很好,但他不知道怎麼用。蘑菇街選擇的第 2 種方案,因為在快速發展的階段,我們希望能夠讓我們的流量回報率更高一些,推薦這種個性化的方式效果會更明顯,在全局上的指標會更好看。推薦和這種個性化的方式結合是可以有 2 種方式的,第一種是初排,用排序系統出排,然後再用個性化做一層二次排序。第二種就是把個性化的特徵打包,直接扔到初排的模型里,讓模型學完就是一個個性化模型。但是第二種模式的成本會高一些,至今為止我們還沒有上線。第一種我們迭代了半年的樣子,累計 GMV 帶來 10% 以上的收益。

圖 6

簡單介紹一下初排模型的架構,最下面是數據源,上來之後主要是 Hadoop 的生態,HDFS 到 hive,再上來就是 spark。通過spark 模型產出之後,有特徵的管理平台。再根據我們搜索引擎去把分數推上去,搜索引擎在前端有流量分發和 query 的改寫。個性化加入之後,有個用戶行為(接 kafka 存儲東西),這邊有一個 UPS,這裡有個精排系統,和引擎是兩層。也就是說引擎出牌召回之後,會在精排里做一些個性化的設置,用戶的設置是從精排里去取得的,這樣就完成了個性化的排序框架。

圖 7

三、品質升級:人群個性+EE

接下來會講一下品質升級,主要是人群個性和 EE。EE 又叫多臂老虎機,是一種賭博的策略。經過快速成長到一年 GMV 成長到百億級別的平台之後,一個問題是商家怎麼玩蘑菇街的行為形成了,但有一些行為是我們不太想要的。另外用戶對平台的認知逐步形成,會認為蘑菇街價格偏低廉,年紀比較輕,比較可愛。當時我們公司基於一個判斷,整體中國的消費者習慣會升級。如果繼續走爆款、性價比,將來很難從百億級別突破再上一個台階。在這樣的情況下想做品質的升級,這對我們比較明顯的衝擊就是不能通過策略的短期的 ABtest 看出效果,比如說以前的平台上 T 恤都是幾十塊錢,現在非要引進出賣 300 塊錢的 T 恤,這時候這些品牌商能做得好才奇怪了。但為了品牌提升,要把品牌商家引進來,需要讓平台的生態變得更健康,這時候如果做 ABtest,必然看到全局的 GMV 有下降。這時候要有權衡,這時候我們策略組和業務方有一些偏差,我們策略組會比較數據導向,但業務方會比較偏哲學,但是這些問題不是不可以平衡的。在講哲學的公司,哲學是老闆講的,但業務團隊,需求方說哲學可以拍回去。高層定哲學,這時候要看每個階段應該用什麼數據指標來看,如果再吹一吹,可以理解為蘑菇街在做一些供給側改革的事情。就是說我們做這些事情的時候,雖然有損失,但是方向是對的,是有希望的。

當時做的第一個方案是實時人群個性化引導, 剛才提到 tag 的個性化作用不是很大,是基於說你想在全局上拿到收益,如果只是想讓生態引入更多更有趣的用戶行為時,你是可以這樣做的,比如你可以給用戶打上一些標籤,根據實時進行標籤的分類,比如說購買力,找到高、中、低檔的用戶,比如說有些對商品質量特別敏感的商戶,比如有些用戶喜歡逛但不喜歡買,有些用戶不喜歡逛但喜歡買的,這些都可以分出來。

圖 8

圖 9

然後我們針對這種情形做了系統設計,前面這個是基於 kafka,它是 spark stream 做的,基於流式處理,有 kafka 的用戶數據接入進來之後,有一個實時統計和離線統計的用戶分群的演算法。依靠一個 UPS 系統,我們可以通過一些概率引導他可能偏好的商品。這可以有效減少用戶升級帶來的損失。很多用戶進來看到的排序,除了他本身的個性化之外,還會被一些我們希望扶持的店,引導他希望關注的人群。

收益評估

當時我們設計了幾個評估指標,分了人群,總要知道是否設置對。重要的指標是這個人群回來的時候,是否還是這個指標,也就是說分群的穩定性、流失率是怎樣的,我們看這些指標在未來一段時間內趨於穩定的狀態,就是兩者之間的差距在逐漸減少。在幾次模型的迭代之後,流失率在持續減少,最後,我們發現我們 APP 的大部分用戶都可以分群了。在這種策略下,我們可以做到全局 gvm,c?t?r 在一些損失的情況下,讓我們需要扶持的對象的流量漲 30%。

另外一種策略叫 explore 和 exploit,就是 EE,這個策略核心要解決的爆光bias,即你以前沒看過或者沒有買,不能說這個用戶就是不買高價,那是因為你沒有給他看高價商品。他把一個事情分 2 個階段,一個是展示,試一試,另外一個是通過試的結果收割現在的收益。有幾種比較常見的做法:一是把做AB的流量切入到一些小桶,讓這些小桶通過EE的模式走策略,這樣模型里就有很多EE的樣本,是無偏的,進來之後會影響模型的整體迭代,這樣你的生態會因為策略被改進;另外一種是把業務方定的新款,扶持新款的業務放到EE的流量上,讓它快速迭代出哪些新品是真正有效的。EE 最直接策略就是隨機,讓每個商品展示 5 分鐘,這就是隨機的人群策略。用得很多的是 UCB,會根據每次展示的時間、收益、測速去算出下一次能展現的概率。

未來的話,現在我們已經在做了,但還沒有結果。比如我們在深度學習和 CTR 預估和排序,還有就是強化學習和業務的結合,我們也會做更多嘗試。比如說剛才的 EE 就是強化學習業務當中的一塊,這一塊阿里已經比我們走在前面了,我們會投入更多的精力做這方面的事情。

aHR0cDovL3dlaXhpbi5xcS5jb20vci9aenFGbmF6RTVQR2JyZWpfOTI5MQ== (二維碼自動識別)

更多流量、廣告、搜索、演算法相關內容, 敬請關注「美麗聯合數據技術」公眾號


推薦閱讀:

為什麼梯度下降能找到最小值?
機器學習之Logistic回歸(五)
Learn R | SVM of Data Mining(四)

TAG:机器学习 |