使用者端智慧的應用實踐
去年團隊在使用者端上進行了一些簡單的智慧應用探索實踐,這裡記錄梳理下。
現在很多“智慧”,是普通推薦演算法借深度學習的風包裝的,核心也就是決策樹 / 隨機森林/SVM這些9 0 年代已經提出的演算法,我們這裡的實踐也是這樣。在使用者端上,智慧應用最廣泛的目前兩個點:個性化和多媒體識別,我們主要實踐是在個性化上,從原來所有使用者都用同一套或幾套規則,換成根據推薦演算法給每個使用者制定符合他個性化特徵的不同規則。
實際上簡單的個性化推薦也可以認為是規則,只是這個規則很複雜,裡面的 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 、系統級優化上比較有空間,其他的並沒有找到特別大的應用場景。
- 即使做了幾個智慧的應用,也沒法說已經入門了這個領域,只是接觸到一點皮毛,而且當時去補的各種知識點在一段時間沒有接觸使用後,也很容易就遺忘了。