本文為StockX公司Sam Bean與Nic Roberts II撰寫的客座文章。援引他們的表述,“StockX是一家來自底特律的初創(chuàng)公司,希望以獨特的競價/出價市場革新電子商務體系。我們平臺的設計靈感源自紐約證券交易所,并將運動鞋與街頭潮牌服飾等商品視為高價值可交易商品。憑借運營透明化的市場交易體驗,StockX將幫助消費者以真實市場價購買備受追捧的真品?!?/em>
2019年,StockX公司正經(jīng)歷高速增長,我們的機器學習(ML)工程師小組也開始嘗試使用Amazon Personalize在主頁上添加“為您推薦”產(chǎn)品推薦行。最終,這項新功能成了主頁上最受歡迎的部分。在本文中,我們將分享StockX使用Amazon Personalize的整個過程,探討如何借此提供出色的定制化用戶體驗。
我們的市場動態(tài)需要提供個性化的用戶體驗。StockX網(wǎng)站的流量激增,在很大程度上源自相關商品市場供應量的下降。沒錯,在運動鞋與街頭潮牌服飾市場上,最受歡迎的一定是那些需要提前預訂的限量版產(chǎn)品。雖然客戶對于產(chǎn)品多樣性的追求一直在增加,但是客戶經(jīng)常搜索的還是那些最新發(fā)布的特定熱門款式。最終,我們的平臺開始經(jīng)歷一波又一波強度幾乎接近DDoS的合法流量,讓我們意識到再不擴大后端的規(guī)模伸縮能力、我們將無法順利開展自身業(yè)務。另外,我們的團隊還計劃在黑色星期五之前上線“為您推薦”功能。這項功能的基礎,自然是強大的推薦引擎——我們希望該引擎同樣擁有強大的擴展能力,可以實時調(diào)整以適應不斷變化的客戶意圖。
在公司成立的三年當中,我們逐漸將用戶體驗的個性化視為核心發(fā)展目標。我們的客戶群體已經(jīng)從單純的運動鞋愛好者,逐步發(fā)展為越來越多休閑及抱有好奇心的新用戶。感恩節(jié)購物季則為我們提供絕佳機會,以更具個性化的體驗吸引這些新客戶,最終提高整體客戶忠誠度。盡管即將到來的2019年假期為我們的計劃增加了額外的時間限制,但Amazon Personalize切實幫助我們?yōu)椴粩喟l(fā)展的用戶群體打造精心設計且引人入勝的體驗,最終順利應對季節(jié)性流量激增帶來的一系列挑戰(zhàn)。
早期階段
我們的團隊最初打算尋求第三方供應商來填補平臺中的個性化缺失環(huán)節(jié)。但是,購買現(xiàn)成解決方案不僅成本高昂,而且對于我們獨特的電商業(yè)務而言也缺少靈活性。我們需要更大的靈活施展空間,但又不太可能單純依靠內(nèi)部解決方案搞定全部難題。
接下來,我們開始考慮構(gòu)建起與Amazon Personalize核心推薦引擎(分層遞歸神經(jīng)網(wǎng)絡,簡稱HRNN)類似的自定義神經(jīng)網(wǎng)絡。雖然我們的團隊具備一定的自主建模能力,但卻難以處理一系列令人頭痛的變量:健壯性、可擴展性以及開發(fā)周期等等。我們需要爭分奪秒地構(gòu)建優(yōu)質(zhì)服務,為我們的客戶提供引人入勝的體驗并在假期購物季來臨前及時將其上線。為了確定到底是該自建模型、還是直接選擇現(xiàn)成解決方案,我們列舉了構(gòu)建機器學習微服務架構(gòu)的基本要求。經(jīng)過整理,我們的具體要求如下:
1.數(shù)據(jù)收集——建立高性能推薦程序的第一步,自然是對網(wǎng)站進行正確跟蹤。除了通過調(diào)查、評級以及偏好設置等方式收集明確的客戶喜好指標之外,我們還需要考慮從原始點擊流中提取隱式證據(jù),借此建立起更加精彩的使用體驗。而收集點擊流數(shù)據(jù),自然成為創(chuàng)建高性能推薦程序的重要基礎。
2.數(shù)據(jù)位置——在收集到正確的數(shù)據(jù)類型之后,下一步就是為該數(shù)據(jù)確定準確的存儲位置。為此,我們需要找到點擊流與產(chǎn)品目錄數(shù)據(jù)所在的位置,并獲取訪問權(quán)限。
3.數(shù)據(jù)整理與特征工程——在找到數(shù)據(jù)源與存儲位置之后,接下來需要找到其中真正有價值的部分。這是一項高度依賴于經(jīng)驗的過程,因為在進行實際嘗試之前,我們往往很難預判算法如何從數(shù)據(jù)當中提取信號。
4.模型開發(fā)——這一步也是整個開發(fā)生命周期當中,數(shù)據(jù)科學元素最為密集的部分。大多數(shù)團隊會以notebook中的原型為起點,逐步嘗試解決業(yè)務問題,而后以面向?qū)ο蟮姆绞竭M行模型訓練。這一步驟與之前各步驟相互依存,前者中的數(shù)據(jù)可用性也將直接影響候選模型集的實際組成。
5.模型測試與評估——在完成模型訓練之后,必須啟用快速健全性檢查以執(zhí)行定性分析,借此補充訓練指標。我們建議大家先創(chuàng)建一個小規(guī)??梢暬瘧贸绦颍糜谠谀P吞岢龅慕ㄗh內(nèi)容旁邊提示用戶正在與哪些產(chǎn)品進行交互。這能讓我們更直觀地審視不同算法以及超參數(shù)設置對建議結(jié)果產(chǎn)生的影響,同時結(jié)合業(yè)務經(jīng)驗對結(jié)果做出比較。
6.ETL開發(fā)——在確定數(shù)據(jù)中的主要特征之后,我們還應該建立一套自動化ETL體系,用于提取原始數(shù)據(jù)、執(zhí)行特征工程,并將數(shù)據(jù)放置在生產(chǎn)訓練程序能夠輕松訪問的位置。這一步至關重要,因為ETL中的任何細微錯誤都可能拉低輸入數(shù)據(jù)質(zhì)量、最終影響輸出結(jié)果的置信度。更可怕的是,這類錯誤往往很難在訓練結(jié)束后、輸出可視化之前被檢測出來。
7.后端服務開發(fā)——將模型推理機制與后端服務打包在一起,可以顯著改善監(jiān)控、穩(wěn)定性與抽象性水平。對我們來說,這也是一條重要的“護堤”,防止流量的過度涌入。我們在AWS Lambda中選擇了無服務器解決方案,將getRecommendations API打包在Amazon Personalize當中。
8.生產(chǎn)部署——CI/CD等自動化流程,用于訓練并部署模型的最新版本,保證建議結(jié)果始終符合客戶的實際需求。一旦這一步驟出現(xiàn)問題,可能導致建議結(jié)果過時,最終降低客戶參與度。在完成這一部分之后,我們的機器學習微服務架構(gòu)也就構(gòu)建完成了。
構(gòu)建本地解決方案,意味著我們需要從頭開始完成以上八個具體步驟。Amazon Personalize提供自動化特征工程與模型開發(fā)(步驟3和4)功能,幫助我們快速搞定這兩個最為耗時的環(huán)節(jié)。使用Amazon Personalize提供的標準HRNN(一套由Amazon本身使用過的、經(jīng)過重重考驗的實踐模型),我們的用例只需要一套僅包含五列數(shù)據(jù)的簡單數(shù)據(jù)集即可開始訓練。將這兩個步驟交由Amazon Personalize之后,我們得以專注于實現(xiàn)強大的ETL、后端與生產(chǎn)部署系統(tǒng)。此外,我們還省下了更多時間用于實現(xiàn)第5步中提到的可視化流程——這是以往需要開發(fā)完整技術(shù)棧時,我們根本不敢想象的。當然,直接使用Amazon Personalize也會帶來一定妥協(xié),意味著我們將無法對標準算法中的具體杠桿做出針對性調(diào)整。
這自然在我們的團隊內(nèi)部引發(fā)激烈討論:我們到底是該承擔起高昂的成本,以換取對模型的完全控制;還是以可調(diào)整性為代價,完全信任AWS提供的解決方案?最終,我們決定信任AWS在構(gòu)建企業(yè)級機器學習模型方面的專業(yè)水平。我們的團隊預見到,內(nèi)部開發(fā)的深度學習推理引擎在可擴展性方面一定會帶來巨大風險。如果不拿出時間進行負載測試,我們將很難衡量大規(guī)模流量涌入時系統(tǒng)的實際彈性,這將把StockX的整體業(yè)務置于隨時可能崩潰的危險境地。另外,生產(chǎn)型深度學習微服務架構(gòu)是個相對較新的議題,與此相關的文獻資料并不完備,這同樣令問題變得更加復雜。
開發(fā)
在決定將推薦程序的核心模型開發(fā)與生產(chǎn)推理擴展交由AWS負責之后,我們開始使用Amazon Personalize進行開發(fā),并很快感受到將其集成至全擴展機器學習工作流所帶來的卓越便捷性。下圖所示,為這套解決方案的基本架構(gòu)。
我們將Amazon Personalize插入兩部分代碼庫當中,這兩套代碼庫分別用于創(chuàng)建數(shù)據(jù)集以及配置Amazon Personalize基礎設施。以此為基礎,我們成功實現(xiàn)了由Amazon Personalize驅(qū)動的實時推薦引擎的創(chuàng)建、部署與重新訓練流程的全面自動化。
創(chuàng)建數(shù)據(jù)集
Amazon Personalize為用戶提供多種選項,能夠根據(jù)用戶特征與推薦引擎的特定應用方式進行選擇。部分recipe選項允許您在模型訓練過程中考量用戶特征(例如HRNN元數(shù)據(jù)),另一部分recipe則只關注平臺上各用戶間的交互(與單一特征/HRNN無關)。我們對具體recipe的選擇,決定了訓練數(shù)據(jù)集的實際構(gòu)建方式、以及最終將向Amazon Personalize提供多少訓練數(shù)據(jù)集以建立模型解決方案。
我們首先開發(fā)出用于訓練及測試所有三種HRNN變體(純文本、元數(shù)據(jù)以及冷啟動)的基礎,并對結(jié)果做出比較。在添加元數(shù)據(jù)集時,我們剛開始并未發(fā)現(xiàn)推薦內(nèi)容獲得任何重大改進;而且發(fā)現(xiàn)HRNN-冷啟動在未進行額外特征工程開發(fā)的情況下,并不能生成更為有機的推薦結(jié)果。雖然我們懷疑在元數(shù)據(jù)特征工程方面投入更多精力也許能最終提高性能,但我們?nèi)詻Q定嘗試其他更為簡單、且同樣有望提供高質(zhì)量建議的解決方案。
要使用Amazon Personalize HRNN recipe,我們需要為其提供單一數(shù)據(jù)集,并在其中包含任意時段之內(nèi)的用戶交互數(shù)據(jù)。這套交互數(shù)據(jù)集將包含并定義影響核心推薦算法的訓練特征。對于像StockX這樣的電子商務平臺,這種交互特征可能表現(xiàn)為產(chǎn)品頁面瀏覽量、搜索結(jié)果點擊流或者與購買行為相關的操作等指標。
為了構(gòu)建起交互數(shù)據(jù)集,我們創(chuàng)建了一條自動化Python ETL工作流以查詢我們的點擊流數(shù)據(jù)源與產(chǎn)品目錄、處理交互數(shù)據(jù)以提取所需特征,并最終執(zhí)行CSV格式化操作以支持Amazon Personalize的攝取要求。由于Amazon Personalize原生支持從Amazon Simple Storage Service(Amazon S3)導入數(shù)據(jù)集,因此創(chuàng)建這樣的自動化管道并不困難,我們可以節(jié)約下大量時間和精力來考慮如何選擇最佳recipe以及最佳交互時段。
自動創(chuàng)建Amazon Personalize基礎設施
接下來,我們開始著手對Amazon Personalize整體基礎設施進行自動化創(chuàng)建。大家當然可以在AWS管理控制臺上手動建立Amazon Personalize服務,但配合AWS SDK for Java,我們能夠在規(guī)模更大的推薦服務管道中實現(xiàn)全自動化與可重復性能力。在這里,我們選擇Scala作為客戶端以創(chuàng)建Amazon Personalize基礎設施,具體包含以下內(nèi)容:
·數(shù)據(jù)集組
·數(shù)據(jù)集
·導入任務
·解決方案
·解決方案版本
·實時活動
對于一次性訓練來說,在控制臺上構(gòu)建基礎設施確實更為簡單;但要打造出一套真正的全自動化可復用管道,SDK絕對是不二之選。
部署策略
更重要的是,我們的Scala客戶端還承擔起對生產(chǎn)部署流程進行仲裁的額外責任,負責保證在推薦模型在重新訓練過程中不會造成停機狀況。隨著用戶與平臺的持續(xù)交互,我們當然有必要對模型進行重新訓練,從而及時包含新的交互信息并據(jù)此提供最新的推薦。當每天用最新的交互數(shù)據(jù)重新訓練模型時會導致長時間服務中斷,因為在此期間活動端點將不可用。我們可以建立兩個獨立的實時活動端點(以及解決方案版本)來緩解這個問題,但相關成本過高——意味著即使不提供任何實時流量,我們都需要為各端點支付相應的AWS費用。
為了解決這項部署挑戰(zhàn)并建立起更具成本效益的微服務架構(gòu),我們圍繞中間Lambda函數(shù)建立起獨特的部署策略。該函數(shù)負責響應活動端點并向前端客戶端提供推薦內(nèi)容。我們還將一套特殊的數(shù)據(jù)集組標簽(下圖最左側(cè)的兩個框體)打包至Lambda環(huán)境變量當中,用于指示當前處于活動狀態(tài)并服務于生產(chǎn)流量的活動端點。
每天夜間,Scala客戶端都會啟動新的訓練任務,并首先檢查實時數(shù)據(jù)集組中產(chǎn)生的Lambda環(huán)境變量??蛻舳藢⒓虞d新的交互數(shù)據(jù)集,重建休眠的數(shù)據(jù)集組,而后在端點上執(zhí)行心跳檢查以保證端點創(chuàng)建成功。接下來,客戶端會指示Lambda函數(shù)更新其活動的相關環(huán)境變量并指向新的端點。最后,不再使用的Amazon Personalize基礎設施將被撤銷。
通過這種方式,我們的微服務架構(gòu)能夠自動高效對Amazon Personalize模型進行重新訓練,每天按時更新用戶推薦內(nèi)容,且不會帶來昂貴的冗余支出或者任何服務停機問題。另外,使用Lambda函數(shù)還允許我們啟用自定義指標對系統(tǒng)進行跟蹤與故障監(jiān)控,及時提醒模型訓練的問題或活動端點的錯誤。這種圍繞Amazon Personalize精心設計的強大微服務部署策略,在公司發(fā)展歷史中最為繁忙的購物季期間為StockX推薦引擎帶來了近乎完美的可用性。下圖所示,為這套解決方案的基本架構(gòu)。
實時功能
在完成了訓練與部署流程的設計之后,我們只剩下最后一個問題需要解決:如何在不同訓練運行輪次之間,隨用戶興趣的變化更新推薦內(nèi)容。Amazon Personalize在這方面提供一套簡單的解決方案,即事件交互數(shù)據(jù)集。我們使用Amazon Personalize putEvents API將點擊流事件添加到模型當中。此點擊流源將把各項事件實時推送至Lambda函數(shù),該函數(shù)又將事件編組為Amazon Personalize能夠處理的既定格式。事件被添加至數(shù)據(jù)集后的幾秒內(nèi),建議內(nèi)容即可獲得快速體現(xiàn)。下圖所示,為這一工作流的基本架構(gòu)。
測試與部署
我們的發(fā)布方案現(xiàn)在已經(jīng)成為StockX公司的內(nèi)部標準——“向您推薦”主頁集合被部署在用于A/B測試的功能標記后面,內(nèi)部團隊能夠安全地將該功能推廣至1%的用戶以執(zhí)行初始金絲雀測試。最終,我們的測試范圍將涵蓋60%的用戶——其中30%的用戶繼續(xù)獲得舊有體驗,30%的用戶則獲得個性化首頁體驗,另外40%用戶不受測試影響。在逐步擴大功能涵蓋范圍的過程中,我們發(fā)現(xiàn)錯誤率或延遲并沒有隨之增長。為了保證萬全,我們進行了為期兩周的測試。
盡管“向您推薦”顯示在首頁中的第二行位置,但其點擊率卻超過了顯示在最頂端的“最受歡迎”行。按百分比計算,“向您推薦”已經(jīng)成為我們表現(xiàn)最好的購買通道。而在其支持下,我們整個主頁的總體客戶參與度提高了50%,這證明個性化、甚至只是單一頁面的個性化,也足以提高業(yè)務體系的總體使用感受。
時至今日,個性化已經(jīng)成為企業(yè)高管團隊的一大核心戰(zhàn)略目標。而我們打造的推薦引擎,正是其中一項關鍵成果。與負責產(chǎn)品發(fā)現(xiàn)體驗的產(chǎn)品負責人共同制定出戰(zhàn)術(shù)決策之后,作為獨角獸初創(chuàng)企業(yè)的我們深刻意識到個性化的重要性,并通過A/B測試實際證明了個性化的強大能力。在獲得初步成果之后,困擾我們的已經(jīng)不再是要不要推廣個性化,而是如何保證個性化元素能夠滲透至StockX客戶體驗的每一個角落。機器學習團隊一直是StockX內(nèi)部最具數(shù)據(jù)驅(qū)動能力的工程團隊之一,而此次進行的實驗也證明我們完全有能力通過可量化的KPI改善客戶的實際體驗。
總結(jié)
在項目實施期間,機器學習團隊學到關于構(gòu)建機器學習微服務架構(gòu)的許多知識。我們將這些心得體會總結(jié)如下:
·盡早集成——在項目生命周期中盡早發(fā)布演示方案非常重要。即使是簡單的推薦算法,也會給各相關方留下深刻的印象,并幫助我們順利爭取到內(nèi)部資源與更高的項目優(yōu)先級。
·可視化——可視化工具對于機器學習模型的測試至關重要。單純將原始產(chǎn)品ID作為健全性檢查對象還遠遠不夠,我們需要并行提供推薦產(chǎn)品的圖片與隱性關聯(lián)證據(jù),借此評估推薦程序的實際效果。
·預防過度復雜——Amazon Personalize提供多種機器學習框架選項,各選項在復雜度方面也有著巨大差異。我們也曾嘗試從復雜的recipe起步,并發(fā)現(xiàn)很難理解其為何會提出一些奇怪的建議。而從簡單的HRNN recipe起步,我們得以快速開發(fā)出令人印象深刻的工作示例。
·估算成本——機器學習成本高昂。請保證對于工程決策的對應預算需求擁有明確的估計。除了云基礎設施使用成本之外,開發(fā)人員為此投入的時間也是一種重要的成本構(gòu)成元素。
·了解擴展特性——要構(gòu)建自己的深度學習推薦系統(tǒng),請首先保證對推理任務的擴展特性擁有充分了解。忙活了半天,卻發(fā)現(xiàn)自己的解決方案跟不上流量峰值期間的業(yè)務要求,絕對會令人陷入崩潰。
·徹底消除手動操作——相較于傳統(tǒng)后端服務架構(gòu),機器學習微服務架構(gòu)包含有更多活動部件。因此,請務必自動處理工作流中的所有內(nèi)容——只要還有任何一部分ETL或者部署流程需要人工干預,即代表著項目失敗。機器學習的工程部分已經(jīng)相當困難了,沒人愿意同時再承擔一部分運營壓力。
“為您推薦”成為我們團隊乃至整個StockX公司的一次巨大勝利。我們開始迅速將機器學習技術(shù)整合至企業(yè)中的各個層面。而我們獲得成功的秘密,在于企業(yè)決策者同意將Amazon Personalize集成至更多StockX體驗當中,并不斷擴大我們在機器學習領域投入的精力??梢钥隙ǖ刂v,個性化如今已經(jīng)成為StockX內(nèi)部的頭等大事。
我們的團隊在這場假期購物季的幾周之前著手項目開發(fā),并在購物季到來時及時將其上線??梢宰院赖卣f,在Amazon Personalize的幫助下,我們的微服務架構(gòu)在整個假期當中都表現(xiàn)出近乎完美的可用性。
原文鏈接:https://amazonaws-china.com/cn/blogs/machine-learning/pioneering-personalized-user-experiences-at-stockx-with-amazon-personalize/