去年團(tuán)隊(duì)在用戶端上進(jìn)行了一些簡單的智能應(yīng)用探索實(shí)踐,這里記錄梳理下。
現(xiàn)在很多“智能”,是普通推薦算法借深度學(xué)習(xí)的風(fēng)包裝的,核心也就是決策樹/隨機(jī)森林/SVM這些90年代已經(jīng)提出的算法,我們這里的實(shí)踐也是這樣。在用戶端上,智能應(yīng)用最廣泛的目前兩個點(diǎn):個性化和多媒體識別,我們主要實(shí)踐是在個性化上,從原來所有用戶都用同一套或幾套規(guī)則,換成根據(jù)推薦算法給每個用戶制定符合他個性化特征的不同規(guī)則。
實(shí)際上簡單的個性化推薦也可以認(rèn)為是規(guī)則,只是這個規(guī)則很復(fù)雜,里面的if/else/權(quán)重/概率計(jì)算不是人工寫的,而是算法算出來的,大多采用監(jiān)督學(xué)習(xí)的方式,這種需求大體實(shí)現(xiàn)步驟是:
建模,把問題轉(zhuǎn)化為三個點(diǎn):輸入/輸出/算法。也就是挑選特征集X,確定輸出目標(biāo)值標(biāo)簽Y,挑選算法嘗試找出Y=f(X)。
取數(shù),選擇一坨線上數(shù)據(jù),清洗出需要的特征和對應(yīng)的目標(biāo)值。
訓(xùn)練,不斷調(diào)整算法/參數(shù)/數(shù)據(jù),找出用戶特征->目標(biāo)值的一個靠譜轉(zhuǎn)化方式,輸出一個模型。
應(yīng)用,部署線上應(yīng)用,實(shí)時預(yù)測,分析效果輸入特征。
按這個套路,尋找了一些應(yīng)用場景,做了一些嘗試。
金額推薦
金額推薦概念很簡單,我們作為理財業(yè)務(wù),有很多場景是需要用戶填入金額的,例如工資理財(每月自動把錢存到理財),小星愿(許愿存入錢),基金定投,各種理財產(chǎn)品的購買等。目前這些填金額的地方不是空著,就是有一個固定的默認(rèn)值,金額推薦想根據(jù)每個用戶的情況給推薦不同的金額,可以預(yù)填進(jìn)輸入框或出提示供用戶選擇,提升體驗(yàn),甚至做出一些引導(dǎo)提升客單價。接下來套在上述步驟里來看下大致實(shí)施過程。
1.建模:
輸入特征基本上先拍腦袋盡量多的選取可能有關(guān)的特征,比如年齡,城市,過去交易金額等,后期訓(xùn)練迭代過程中會根據(jù)計(jì)算出的每個特征的重要性再進(jìn)行幾輪篩選。
輸出標(biāo)簽?zāi)繕?biāo)值是金額,但金額推薦這個需求不需要把每個用戶的金額預(yù)測精確到個位數(shù),從用戶數(shù)據(jù)觀察多數(shù)金額集中在有限的一些整數(shù)上(比如100/500/1000/2000等),所以這里只需要把金額分成一些檔位,目標(biāo)值是金額檔位。
算法,目標(biāo)值是金額檔位,是一個分類問題,分類算法中選用了隨機(jī)森林這種集成算法,簡單應(yīng)用廣,過程中也試過其他算法,效果差不多。
2.取數(shù):
進(jìn)行一些數(shù)據(jù)預(yù)處理,例如把非數(shù)值類型的特征轉(zhuǎn)為數(shù)值,合并特征和標(biāo)簽等。
把最近一次交易金額轉(zhuǎn)為對應(yīng)金額檔次分類作為目標(biāo)值標(biāo)簽。
3.訓(xùn)練:使用第二步的部分?jǐn)?shù)據(jù)進(jìn)行訓(xùn)練,擬合出一個模型,再使用另一部分?jǐn)?shù)據(jù)評估模型的預(yù)測效果。過程中通過各種調(diào)參/分析/數(shù)據(jù)處理,優(yōu)化模型評估效果,例如:
提升數(shù)據(jù)質(zhì)量,篩選出過去購買金額有一定規(guī)律的人群數(shù)據(jù),比如多次購買的方差不超過某個數(shù)值。
參考隨機(jī)森林特征重要性中的 entrophy 和 gini 指數(shù),去除重要性較低的特征。
減少標(biāo)簽金額檔次的個數(shù),只保留多數(shù)用戶會命中的幾個檔次。
4.應(yīng)用:部署模型,不同的交易產(chǎn)品有不同的用法,可以把預(yù)測值直接預(yù)填進(jìn)輸入框,也可以在旁邊出輸入提示顯示推薦的金額。然后就是一系列ABTest、性能優(yōu)化、監(jiān)控、數(shù)據(jù)效果分析的工作。
不同交易產(chǎn)品(工資理財/小星愿)對特征和標(biāo)簽的選取有一些小的不同,但大致處理流程一致。實(shí)踐中工資理財把固定的1000元引導(dǎo)改成推薦的金額,訂單平均金額提升60%,32%用戶直接使用了推薦的金額。小星愿把金額推薦作為提示供用戶選擇,相比直接放一個該用戶歷史交易金額作為提示,點(diǎn)擊率高十幾倍,用戶對推薦金額的接受程度較高。
智能push
智能push想做的是在合適的時間給人推push,提高點(diǎn)擊率?;谝粋€假想:每個用戶都有不同時間段的活躍時間點(diǎn),如果push不是統(tǒng)一固定時間下發(fā),而是選擇每個用戶對應(yīng)活躍的時間點(diǎn)下發(fā),可以提高點(diǎn)擊率。這里的push是促活類的,例如資訊的push。這里的問題可以轉(zhuǎn)化為:怎樣根據(jù)一個用戶已有信息預(yù)測出他的活躍時間點(diǎn)。
1.建模
輸入,選取可能跟用戶作息有關(guān)的年齡/收入/城市等基礎(chǔ)信息,再加上用戶過去7天的push點(diǎn)擊數(shù)據(jù)作為特征值。
輸出,用戶的活躍時間點(diǎn),精確到小時,用戶一天可能在多個時間點(diǎn)活躍,需要輸出多個時間點(diǎn)。因?yàn)樾枨笤?,push時間點(diǎn)限制在8-21點(diǎn)。
算法,8-21點(diǎn)共14個小時,14小時->14個分類,多個時間點(diǎn)活躍->屬于多個分類,是個多標(biāo)簽分類問題,我們用多個二分類的方式實(shí)現(xiàn),同樣用隨機(jī)森林的算法,14個時間點(diǎn)每個點(diǎn)都單獨(dú)做一次二分類,每個二分類的計(jì)算結(jié)果都是0-1之間的數(shù),可以當(dāng)成這個用戶在這個時間點(diǎn)的活躍概率,最后合起來,得到每個時間點(diǎn)的概率。再根據(jù)指定閾值確定是否活躍時間點(diǎn),例如:

2.取數(shù):
對過去的push數(shù)據(jù)進(jìn)行處理,根據(jù)8點(diǎn)-21點(diǎn)每個時間是否有點(diǎn)擊push,合成多條特征數(shù)據(jù),取過去8天的數(shù)據(jù),1-7天的數(shù)據(jù)作為特征,第8天的數(shù)據(jù)作為目標(biāo)值標(biāo)簽。
清洗用戶基礎(chǔ)特征,數(shù)據(jù)轉(zhuǎn)換,拼接push特征。
3.訓(xùn)練:根據(jù)第二步的數(shù)據(jù)分14個二分類(14個時間點(diǎn))訓(xùn)練,得到14個模型,每個時間點(diǎn)一個模型,最后合成一個。
4.應(yīng)用:經(jīng)過算法模型可以得到用戶每個時間點(diǎn)的活躍概率,有多種使用策略,可以通過閾值得到幾個活躍時間點(diǎn),也可以直接選用概率最高的時間點(diǎn),還可以在業(yè)務(wù)發(fā)送push時,往后選取概率最大的時間點(diǎn)發(fā)送,例如業(yè)務(wù)12點(diǎn)發(fā)送push,選12點(diǎn)-21點(diǎn)之間概率最大的時間點(diǎn),把push進(jìn)隊(duì)列延遲到該時間點(diǎn)發(fā)送。
同樣是經(jīng)過了多輪的數(shù)據(jù)分析、模型調(diào)整、特征優(yōu)化、AB實(shí)驗(yàn)、Android分鏈路優(yōu)化等,最終同一條push內(nèi)容,使用智能push鏈路和普通鏈路直接推送相比,點(diǎn)擊率穩(wěn)定在提升25%左右。
本地處理
push的優(yōu)化上當(dāng)時我們想做更多,除了活躍時間段,實(shí)際上影響用戶點(diǎn)擊push的還有他當(dāng)前手機(jī)的實(shí)時狀態(tài),例如是否在看視頻/玩游戲/放在口袋里等狀態(tài),在這些情況下用戶點(diǎn)擊push概率一定很小,如果在收到push后顯示前能實(shí)時檢測到這些狀態(tài),就可以推遲到更合適的時間顯示。為此我們在iOS上做了一些嘗試:
需要在用戶收到push后執(zhí)行代碼邏輯,再決定是否顯示push,經(jīng)調(diào)研 Notification Extension 沒有取消展示push的能力,VoIP 需要特殊權(quán)限,只能用普通的靜默push去做。
每條push都改成靜默push,收到后喚起執(zhí)行代碼,經(jīng)過各種判斷后創(chuàng)建Local Notification,在指定時間展示push。
iOS 無法直接判斷用戶正在運(yùn)行的程序和手機(jī)狀態(tài),只能通過一些側(cè)面屬性判斷,包括橫豎屏狀態(tài)、耳機(jī)插入、內(nèi)存情況、cpu情況、鎖屏情況、網(wǎng)絡(luò)狀態(tài)這些信息,模糊猜測用戶當(dāng)前所處環(huán)境,給出一條運(yùn)算公式計(jì)算用戶當(dāng)前是否適合展示push,公式可以動態(tài)下發(fā),根據(jù)效果調(diào)整。
用戶本地保存上面跑出來的每個時間點(diǎn)活躍概率數(shù)據(jù),把push延遲到下一個較活躍的時間點(diǎn)顯示。
Android 也實(shí)現(xiàn)了差不多的方案,不過iOS和Android的方案都有缺陷,iOS方面用戶手動kill掉的APP情況會收不到靜默push,會影響push的到達(dá)率,Android方面沒有可靠的延遲展示push手段,若延遲的時間點(diǎn)APP處于非活躍狀態(tài),會無法展示,同樣也是會影響 push 到達(dá)率,這些缺陷導(dǎo)致最后本地處理的方案實(shí)現(xiàn)后沒有很好地應(yīng)用上。
其他
除了金額推薦、智能push,還做了一些其他智能的嘗試,包括
智能異常檢測:客戶端的一些異常很多時候無法通過代碼準(zhǔn)確地檢測到,例如圖形引擎在一些安卓機(jī)器上的花屏,沒有報錯的白屏/黑屏,期望是有統(tǒng)一的手段檢測到這些顯示的異常。做法是在端上內(nèi)置機(jī)器學(xué)習(xí)框架,云端訓(xùn)練模型,輸入是截屏圖片,輸出是異常分類,我們挑了三種情況作為異常截屏樣本:白屏/黑屏/花屏,做一個簡單的圖形分類模型,典型的深度學(xué)習(xí)cnn入門級項(xiàng)目,壓縮模型下發(fā)到客戶端運(yùn)行,用戶運(yùn)行過程中根據(jù)一定的規(guī)則抽樣進(jìn)行截屏檢測,有異??赡芗瓷蠄?。
股票O(jiān)CR導(dǎo)入:自選股票從不同APP遷移時,需要逐個股票進(jìn)行輸入->搜索->添加自選,這里要做的是在應(yīng)用A自選列表截屏,在應(yīng)用B導(dǎo)入截屏,OCR識別出截屏上的股票代碼。OCR是比較通用的識別能力,直接用現(xiàn)成模型,配合一些邏輯處理就能實(shí)現(xiàn)了。
還有像智能預(yù)加載/智能分頁/交互預(yù)測/交易流失歸因分析這些實(shí)踐,但還沒有做完整,就不描述了。
感想
當(dāng)智能基礎(chǔ)能力的基建(訓(xùn)練平臺,模型部署,數(shù)據(jù)打標(biāo)等)做好了,要把智能能力應(yīng)用到業(yè)務(wù)上時,需要的更多是業(yè)務(wù)理解和數(shù)據(jù)分析能力,多數(shù)精力會耗費(fèi)在清洗數(shù)據(jù)、模型調(diào)優(yōu)上,這個能力跟工程能力有很大不同。
簡單的“智能”需求,不需要理解具體算法實(shí)現(xiàn)也能做出來,只是理解了算法可能對優(yōu)化有幫助。
機(jī)器學(xué)習(xí)算法繁多,與過往計(jì)算機(jī)通用經(jīng)驗(yàn)復(fù)用度不高,要達(dá)到創(chuàng)造/改進(jìn)算法的程度門檻太高。
用戶端體驗(yàn)上的智能應(yīng)用在多媒體、IoT、系統(tǒng)級優(yōu)化上比較有空間,其他的并沒有找到特別大的應(yīng)用場景。
即使做了幾個智能的應(yīng)用,也沒法說已經(jīng)入門了這個領(lǐng)域,只是接觸到一點(diǎn)皮毛,而且當(dāng)時去補(bǔ)的各種知識點(diǎn)在一段時間沒有接觸使用后,也很容易就遺忘了。