去年團隊在使用者端上進行了一些簡單的智能應用探索實踐,這裡記錄梳理下。
現在很多“智能”,是普通推薦算法借深度學習的風包裝的,核心也就是決策樹/随機森林/SVM這些90年代已經提出的算法,我們這裡的實踐也是這樣。在使用者端上,智能應用最廣泛的目前兩個點:個性化和多媒體識别,我們主要實踐是在個性化上,從原來所有使用者都用同一套或幾套規則,換成根據推薦算法給每個使用者制定符合他個性化特征的不同規則。
實際上簡單的個性化推薦也可以認為是規則,隻是這個規則很複雜,裡面的if/else/權重/機率計算不是人工寫的,而是算法算出來的,大多采用監督學習的方式,這種需求大體實作步驟是:
- 模組化,把問題轉化為三個點:輸入/輸出/算法。也就是挑選特征集X,确定輸出目标值标簽Y,挑選算法嘗試找出Y=f(X)。
- 取數,選擇一坨線上資料,清洗出需要的特征和對應的目标值。
- 訓練,不斷調整算法/參數/資料,找出使用者特征->目标值的一個靠譜轉化方式,輸出一個模型。
- 應用,部署線上應用,實時預測,分析效果輸入特征。
- 按這個套路,尋找了一些應用場景,做了一些嘗試。
金額推薦
金額推薦概念很簡單,我們作為理财業務,有很多場景是需要使用者填入金額的,例如工資理财(每月自動把錢存到理财),小星願(許願存入錢),基金定投,各種理财産品的購買等。目前這些填金額的地方不是空着,就是有一個固定的預設值,金額推薦想根據每個使用者的情況給推薦不同的金額,可以預填進輸入框或出提示供使用者選擇,提升體驗,甚至做出一些引導提升客單價。接下來套在上述步驟裡來看下大緻實施過程。
- 模組化:
- 輸入特征基本上先拍腦袋盡量多的選取可能有關的特征,比如年齡,城市,過去交易金額等,後期訓練疊代過程中會根據計算出的每個特征的重要性再進行幾輪篩選。
- 輸出标簽目标值是金額,但金額推薦這個需求不需要把每個使用者的金額預測精确到個位數,從使用者資料觀察多數金額集中在有限的一些整數上(比如100/500/1000/2000等),是以這裡隻需要把金額分成一些檔位,目标值是金額檔位。
- 算法,目标值是金額檔位,是一個分類問題,分類算法中選用了随機森林這種內建算法,簡單應用廣,過程中也試過其他算法,效果差不多。
- 取數:
- 進行一些資料預處理,例如把非數值類型的特征轉為數值,合并特征和标簽等。
- 把最近一次交易金額轉為對應金額檔次分類作為目标值标簽。
- 訓練:使用第二步的部分資料進行訓練,拟合出一個模型,再使用另一部分資料評估模型的預測效果。過程中通過各種調參/分析/資料處理,優化模型評估效果,例如:
- 提升資料品質,篩選出過去購買金額有一定規律的人群資料,比如多次購買的方差不超過某個數值。
- 參考随機森林特征重要性中的 entrophy 和 gini 指數,去除重要性較低的特征。
- 減少标簽金額檔次的個數,隻保留多數使用者會命中的幾個檔次。
- 應用:部署模型,不同的交易産品有不同的用法,可以把預測值直接預填進輸入框,也可以在旁邊出輸入提示顯示推薦的金額。然後就是一系列ABTest、性能優化、監控、資料效果分析的工作。
不同交易産品(工資理财/小星願)對特征和标簽的選取有一些小的不同,但大緻處理流程一緻。實踐中工資理财把固定的1000元引導改成推薦的金額,訂單平均金額提升60%,32%使用者直接使用了推薦的金額。小星願把金額推薦作為提示供使用者選擇,相比直接放一個該使用者曆史交易金額作為提示,點選率高十幾倍,使用者對推薦金額的接受程度較高。
智能push
智能push想做的是在合适的時間給人推push,提高點選率。基于一個假想:每個使用者都有不同時間段的活躍時間點,如果push不是統一固定時間下發,而是選擇每個使用者對應活躍的時間點下發,可以提高點選率。這裡的push是促活類的,例如資訊的push。這裡的問題可以轉化為:怎樣根據一個使用者已有資訊預測出他的活躍時間點。
- 模組化
- 輸入,選取可能跟使用者作息有關的年齡/收入/城市等基礎資訊,再加上使用者過去7天的push點選資料作為特征值。
- 輸出,使用者的活躍時間點,精确到小時,使用者一天可能在多個時間點活躍,需要輸出多個時間點。因為需求原因,push時間點限制在8-21點。
- 算法,8-21點共14個小時,14小時->14個分類,多個時間點活躍->屬于多個分類,是個多标簽分類問題,我們用多個二分類的方式實作,同樣用随機森林的算法,14個時間點每個點都單獨做一次二分類,每個二分類的計算結果都是0-1之間的數,可以當成這個使用者在這個時間點的活躍機率,最後合起來,得到每個時間點的機率。再根據指定門檻值确定是否活躍時間點,例如:
使用者端智能在螞蟻财富的應用實踐
- 取數:
- 對過去的push資料進行處理,根據8點-21點每個時間是否有點選push,合成多條特征資料,取過去8天的資料,1-7天的資料作為特征,第8天的資料作為目标值标簽。
- 清洗使用者基礎特征,資料轉換,拼接push特征。
- 訓練:根據第二步的資料分14個二分類(14個時間點)訓練,得到14個模型,每個時間點一個模型,最後合成一個。
- 應用:經過算法模型可以得到使用者每個時間點的活躍機率,有多種使用政策,可以通過門檻值得到幾個活躍時間點,也可以直接選用機率最高的時間點,還可以在業務發送push時,往後選取機率最大的時間點發送,例如業務12點發送push,選12點-21點之間機率最大的時間點,把push進隊列延遲到該時間點發送。
同樣是經過了多輪的資料分析、模型調整、特征優化、AB實驗、Android分鍊路優化等,最終同一條push内容,使用智能push鍊路和普通鍊路直接推送相比,點選率穩定在提升25%左右。
本地處理
push的優化上當時我們想做更多,除了活躍時間段,實際上影響使用者點選push的還有他目前手機的實時狀态,例如是否在看視訊/玩遊戲/放在口袋裡等狀态,在這些情況下使用者點選push機率一定很小,如果在收到push後顯示前能實時檢測到這些狀态,就可以推遲到更合适的時間顯示。為此我們在iOS上做了一些嘗試:
- 需要在使用者收到push後執行代碼邏輯,再決定是否顯示push,經調研 Notification Extension 沒有取消展示push的能力,VoIP 需要特殊權限,隻能用普通的靜默push去做。
- 每條push都改成靜默push,收到後喚起執行代碼,經過各種判斷後建立Local Notification,在指定時間展示push。
- iOS 無法直接判斷使用者正在運作的程式和手機狀态,隻能通過一些側面屬性判斷,包括橫豎屏狀态、耳機插入、記憶體情況、cpu情況、鎖屏情況、網絡狀态這些資訊,模糊猜測使用者目前所處環境,給出一條運算公式計算使用者目前是否适合展示push,公式可以動态下發,根據效果調整。
- 使用者本地儲存上面跑出來的每個時間點活躍機率資料,把push延遲到下一個較活躍的時間點顯示。
- Android 也實作了差不多的方案,不過iOS和Android的方案都有缺陷,iOS方面使用者手動kill掉的APP情況會收不到靜默push,會影響push的到達率,Android方面沒有可靠的延遲展示push手段,若延遲的時間點APP處于非活躍狀态,會無法展示,同樣也是會影響 push 到達率,這些缺陷導緻最後本地處理的方案實作後沒有很好地應用上。
其他
除了金額推薦、智能push,還做了一些其他智能的嘗試,包括
- 智能異常檢測:用戶端的一些異常很多時候無法通過代碼準确地檢測到,例如圖形引擎在一些安卓機器上的花屏,沒有報錯的白屏/黑屏,期望是有統一的手段檢測到這些顯示的異常。做法是在端上内置機器學習架構,雲端訓練模型,輸入是截屏圖檔,輸出是異常分類,我們挑了三種情況作為異常截屏樣本:白屏/黑屏/花屏,做一個簡單的圖形分類模型,典型的深度學習cnn入門級項目,壓縮模型下發到用戶端運作,使用者運作過程中根據一定的規則抽樣進行截屏檢測,有異常可能即上報。
- 股票OCR導入:自選股票從不同APP遷移時,需要逐個股票進行輸入->搜尋->添加自選,這裡要做的是在應用A自選清單截屏,在應用B導入截屏,OCR識别出截屏上的股票代碼。OCR是比較通用的識别能力,直接用現成模型,配合一些邏輯處理就能實作了。
還有像智能預加載/智能分頁/互動預測/交易流失歸因分析這些實踐,還沒有做完整,就不描述了。
感想
- 當智能基礎能力的基建(訓練平台,模型部署,資料打标等)做好了,要把智能能力應用到業務上時,需要的更多是業務了解和資料分析能力,多數精力會耗費在清洗資料、模型調優上,這個能力跟工程能力有很大不同。
- 簡單的“智能”需求,不需要了解具體算法實作也能做出來,隻是了解了算法可能對優化有幫助。
- 機器學習算法繁多,與過往計算機通用經驗複用度不高,要達到創造/改進算法的程度門檻太高。
- 使用者端體驗上的智能應用在多媒體、IoT、系統級優化上比較有空間,其他的并沒有找到特别大的應用場景。
- 即使做了幾個智能的應用,也沒法說已經入門了這個領域,隻是接觸到一點皮毛。