本文根據平安人壽AI資深專家吳建軍老師在平安人壽&DataFunTalk演算法主題技術沙龍 —“機器學習/深度學習在金融領域最新研究和應用實踐”中分享的《機器學習/深度學習工程實戰》編輯整理而成,在未改變原意的基礎上稍做整理。
今天主要從以下幾個方面進行分享:平安人壽AI應用技術概覽,資料處理和編碼,模型應用與實時服務,演算法與模型訓練。
首先講一下平安人壽AI應用技術概覽,首先分一個大資料平臺開發,分為平臺級的開發和應用級的開發。平臺級開發主要有離線計算平臺,實時計算平臺,以及多維分析引擎等;應用級開發有資料採集清洗,統計報表開發,畫像挖掘等。演算法研究方面分為三個方向,第一個統計分析,金融資料比較複雜,需要投入大量的人力財力做統計分析,用的比較多。還有就是機器學習、深度學習兩類方法,主要解決的問題有:機器學習主要解決分類與推薦、知識圖譜、自然語言處理,深度學習解決量化精算、視覺模型,強化學習正在研發當中。後臺系統分為兩塊,一個是元件類開發,一個是服務類開發。元件主要是服務框架、訓練平臺、容器平臺,還有一些分散式儲存元件。模型服務主要是針對這個應用來開發一些專用的系統,用專用的應用服務對接。
上圖是我們的平臺架構,首先是資料蒐集,主要依靠Kafka,對於老系統自有一套收集機制,資料蒐集完成進入Hadoop和關係DB。資料清洗主要依靠hive和spark,hive實現hql,spark進行復雜的資料處理。除此之外還要做一些洞察分析,分為兩塊一個是單錶快速實時分析,第二個是多表關聯實時分析。單表主要用Druid & ES做多維,多表關聯主要靠Presto & Impala。還有一些用matlab, SAS做精算量化模型,還用Tensorflow做深度學習,用Hbase,Redis主要做畫像儲存,提供實時查詢,還有一些容器平臺對外提供容器呼叫。
接下來講下我們用AI技術幹嘛,AI在金融領域用的還是很廣,很多業務都是靠資料推動,金融對資料依賴性很強。具體應用有代理人管理,平安有百萬級的代理人,利用AI演算法管理代理人的招聘、銷售、升級,還有智慧客服、智慧續收、智慧理賠、坐席等應用於很多場景。
資料是核心,接下來講一下我們的資料以及資料處理情況。保險行業做資料探勘遇到的挑戰很多,第一個挑戰就是決策週期長,低頻互動,比如保險非日常消費品/非必需,消費決策過程比較理性。因此模型有沒有效都要經過很長的週期檢驗,在這個週期內都將面臨很大的風險。再一個資料比較複雜,穩定性差。資料複雜體現在首先業務線很多,每個業務線儲存介質也有很多,每個資料產生的場景也不同,資料種類差異也很大,有文字、LBS,還有一些影像的、自然語言的。還有一個成本比較高,網際網路所做的模型都要經過A/B text,但是保險行業不能這樣執行。
那麼如何解決這些問題呢,大致從以下三個方面解決畫像產生、質量檢驗、資料embedding。首先就是畫像如何產生,接著對資料進行檢驗,因為獲取的資料並不一定可靠,然後對資料進行embedding,做embedding的原因就是資料比較複雜,需要對資料提供一種規範化的表示。
建立畫像生產首先建立資料分層(ODS、DW、DM、MM),這種資料分層主要是偏業務,雖然沒有技術難點但是將其建好不容易。然後做資料模式抽象統一,針對行為資料、事實資料和影像三類資料進行抽象統一。每天產生的行為資料很多,如保險打電話、理賠、網上點選按鈕等,歸類行為五要素,即什麼人在什麼時間對什麼物件做了什麼動作以及這個動作的強度。事實三元組即主語、謂語、賓語,對影像就做embedding。將資料抽象統一後做畫像,畫像有很多種做法,第一種就是作坊式生產,依據領導要求生存畫像,這樣比較累。目前標準是畫像需求格式要標準化,從而實現自動化的生產機制,這樣做的好處就是首先節省人力,需求可以重複利用。
接下來講一下資料質量如何檢驗,質量檢驗一直是個難點,其指標很複雜,時間很差,很難判斷計算是否準確。主要從三個方面入手,首先穩定性,給出的模型雖然很難判斷其穩定性但是需要知道其不穩定性多大。第二個觀察其重要性,有些指標現實中很重要但是模型中表現不重要,這種建模出問題,因此需要判斷變數在模型中的重要性,評價指標有IV值、卡方、變數重要性(線性模型中的權重、演算法中出現的頻率)。接著需要剔除相關變數,檢驗相關性的指標有相關性係數、PCA/RUFS、方差膨脹因子,除此之外還會降維(PCA不夠穩定,因此用了RUFS演算法)。為檢驗穩定性開發工具spark+python,實現數配置靈活,一鍵式輸出結果。
資料embedding方法有很多,如影像embedding、單詞embedding、圖節點embedding。首先將結構化資料人工組合,然後用GBDT做特徵組合,以及FM編碼,利用低置分解的向量來做特徵表示,現在可以利用KB編碼。對文字資料主要利用TF/IDF模型,word2vec,影像資料進行SITF以及CNN。主要的工作是對資料做embedding,與後面的資料結合起來,使其更加統一。
接下講一下如何進行演算法和模型的訓練,目前主要的還是基於分散式或者並行機器學習。在面對資料量大,模型複雜、引數大,並行執行平臺能解決這個問題,平臺要求通訊高效、容錯可靠、描述能力強,一個機器不能執行所有演算法的原因就是其無法描述這個演算法,因此需要一個描述能力強的平臺。目前並行的種類有模型並行、資料並行,還有混合並行。目前用的比較多的是資料並行,將資料先切分,分配到每個worker計算,得出一個梯度傳入模型,模型將其匯聚,返回一個worker,然後利用worker進行本地模型的更新。
分散式機器學習需要描述能力強,簡化下就是程式設計正規化問題。如程式導向、物件導向不同,這裡的正規化是這種正規化是否能完整描述演算法。正規化最早的是MP,主要實現是MPI,但是它只是提供基本的通訊原語,程式設計幾乎無限制,程式設計門檻高,沒有錯誤恢復機制。後來又MR,主要是研究Hadoop,程式設計簡單,能容錯,但是限定嚴格,不靈活,通過磁碟交換資料,效率低。接下來就DAG(有向無環圖),典型實現就是spark,記憶體計算,限定放寬,可以靈活實現複雜的演算法,不能有環,不能支援大量迭代,目的是容錯。再者就是計算圖,tensorflow是典型代表,好處就是自動求微分,支援任意迭代,可以實現絕大部分NN演算法;缺點就是容錯能力弱。後來出現了動態計算圖,主要代表有Torch,還有tensorflow也支援,支援計算中更改圖,而且很實用RNN。
引數更新模型解決的是在一個叢集中如何將worker同步起來,首先的方法是BSP,主要有Pregel(未開源)、Spark,如果有10個worker完成一輪將引數傳給中心節點,更新完再傳回來,這種方式比較慢,但是能夠保證收斂。然後就是ASP,全非同步,因此主要用來單機多核,利用共享型別儲存模型;這種方式是隨機更新無收斂保證,如果模型是高度稀疏,衝突較少,有一定的正則化效果。SSP的典型實現是petuum,最快的worker和最慢的worker的bound超過閾值時同步引數,好處是速度快,保證收斂。說道引數更新,就不得不說一下ps-lite,它是基於PS,特點是模型依靠分散式儲存,支援海量引數,再者支援以上三種更新模式。這是機器學習需要了解的兩個方面。
接下來分享一下我們是如何實現的。首先分散式機器學習叢集依靠spark,spark特點有:以DAG描述計算任務,以RDD抽象資料操作,基於記憶體的資料交換,同步引數更新(BSP),與生產環境無縫對接,主要採用資料並行。基於spark分散式叢集開發了很多包,MLlib包實現決策樹、SVN、LR;splash實現了MCMC,Gibbs Sampling,LDA, 比mllib快20倍;還有一個是Deep Learning4j,主要是在spark上做深度學習,支援GPU,但沒有TensorFlow靈活不能自動寫網路結構;接下來就是我們實現的PAMLkit,支援NB,Ada Grad+FM,FTRL+LR演算法。
基於spark分散式叢集實戰經驗首要的一點是要理解演算法,不能有偏差。接下來就是程式碼結構良好: 梯度類(Gradient),正則項類(Updater),優化器類(Optimizer)相互獨立。還有就是相關調優經驗,上面的都是我們實戰從坑裡面總結出來的。儘量使用稀疏向量,且以稀疏方式遍歷或計算,如果不注意會引起效能惡化。
接下來講一下在TensorFlow下如何做深度學習。TensorFlow應用主要是面向結構化資料,輔以視覺文字,DNN演算法應用廣泛,其他相關演算法(CNN、AE)已開始成功應用,強化學習正在研發中。TensorFlow分散式特點:編碼組建訓練叢集並分配任務; 需要手動在各個機器啟動程式;需要提前切分資料,並手拷貝到各個機器;基本沒有容錯機制。訓練方式經過了以下三個階段:單機單卡,整體一次性讀入資料,迭代時逐batch送入視訊記憶體;後來進入單機雙卡,採用輸入佇列,出隊後在GPU之間輪發資料。同步模式,每GPU的梯度做平均後更新引數;後來進入多機多卡,採用Between graph,準同步模式。提前切分資料,不用手動啟動程式,主要是基於pdsh分發資料,啟動服務。
很多時候是基於spark和TensorFlow聯合建模,spark主要依靠其並行能力,TensorFlow建立複雜模型。怎樣將兩者結合起來,例如GBDT+FM+DNN模型,GBDT+FM在spark上訓練,DNN在TensorFlow上。第一個階段是將spark的輸出直接拷貝到TensorFlow上,TensorFlow上切分資料然後拷貝到各個機器上去。目前是將spark訓練輸出的資料放到HDFS,然後利用PDSH啟動TensorFlow上各個worker程式,直接讀取hdfs上部分資料,繼續訓練。目前正在研發Spark與tensorflow叢集共存,每個RDD分割槽內啟動一個計算圖,一棧式程式設計。
模型訓練完需要提供服務,提供服務面臨的挑戰有:模型眾多,建模歷史悠久,業務需求寬廣,投入生產的模型多達數百個,分散執行,監控困難。另一個就是建模平臺很多,現有MATLAB,java,python,SAS,R,Spark,tensorflow等建模平臺;因為有很多量化和精算模型很重要。然後演算法策略複雜,包括決策樹類演算法,各種線性模型,深度學習模型,傳統時序演算法等,且常組合各類演算法。還有資料加工各異,資料加工很亂、個性化,模型同時包括歷史資料和實時資料,且需要線上join,不同模型對資料需要進行不同的加工。系統需要達到目標:集中管理、統一監控;第二個上線快速,節約資源,可伸縮高可靠;不能限制建模工程師,支援跨平臺;需要支援典型的模型格式轉換;需要定義典型的資料加工運算元。
為了實現目標藉助了很多開源元件開發。框架採用thrift,特點是:跨語言通訊,支援python,java,c++等;u成熟穩定,開源十年,使用廣泛;輕便簡單,有編譯器(不足3M)即可。服務協呼叫zookeeper,線上儲存用redis,對外通訊庫用Netty,執行容器用docker,負載均衡用Nginx等。
模型應用架構分為三層:模型處理層、資料計算層、介面層。模型處理層其核心是模型解析器實現跨平臺、跨語言,輸出格式三種PMML(線性模型)、protobuf(TensorFlow)、自定義格式。將模型訓練好形成模型檔案,線上演算法服務會載入這些檔案提供服務。業務應用器呼叫模型,支援http協議,利用負載均衡器定義到各個應用服務,應用服務就是對應資料計算層,定義的相關運算元是為資料處理開發,實現特徵組合,將其傳入模型路由器,模型路由器呼叫相關服務。還有一個管理監控平臺。
——END