本文根據平安人壽AI資深專家吳建軍老師在平安人壽&DataFunTalk算法主題技術沙龍 —「機器學習/深度學習在金融領域最新研究和應用實踐」中分享的《機器學習/深度學習工程實戰》編輯整理而成,在未改變原意的基礎上稍作整理。java
今天主要從如下幾個方面進行分享:平安人壽AI應用技術概覽,數據處理和編碼,模型應用與實時服務,算法與模型訓練。python
首先講一下平安人壽AI應用技術概覽,首先分一個大數據平臺開發,分爲平臺級的開發和應用級的開發。平臺級開發主要有離線計算平臺,實時計算平臺,以及多維分析引擎等;應用級開發有數據採集清洗,統計報表開發,畫像挖掘等。算法研究方面分爲三個方向,第一個統計分析,金融數據比較複雜,須要投入大量的人力財力作統計分析,用的比較多。還有就是機器學習、深度學習兩類方法,主要解決的問題有:機器學習主要解決分類與推薦、知識圖譜、天然語言處理,深度學習解決量化精算、視覺模型,強化學習正在研發當中。後臺系統分爲兩塊,一個是組件類開發,一個是服務類開發。組件主要是服務框架、訓練平臺、容器平臺,還有一些分佈式存儲組件。模型服務主要是針對這個應用來開發一些專用的系統,用專用的應用服務對接。c++
上圖是咱們的平臺架構,首先是數據蒐集,主要依靠Kafka,對於老系統自有一套收集機制,數據蒐集完成進入Hadoop和關係DB。數據清洗主要依靠hive和spark,hive實現hql,spark進行復雜的數據處理。除此以外還要作一些洞察分析,分爲兩塊一個是單錶快速實時分析,第二個是多表關聯實時分析。單表主要用Druid & ES作多維,多表關聯主要靠Presto & Impala。還有一些用matlab, SAS作精算量化模型,還用Tensorflow作深度學習,用Hbase,Redis主要作畫像存儲,提供實時查詢,還有一些容器平臺對外提供容器調用。redis
接下來說下咱們用AI技術幹嗎,AI在金融領域用的仍是很廣,不少業務都是靠數據推進,金融對數據依賴性很強。具體應用有代理人管理,平安有百萬級的代理人,利用AI算法管理代理人的招聘、銷售、升級,還有智慧客服、智慧續收、智慧理賠、坐席等應用於不少場景。算法
數據是核心,接下來說一下咱們的數據以及數據處理狀況。保險行業作數據挖掘遇到的挑戰不少,第一個挑戰就是決策週期長,低頻交互,好比保險非平常消費品/非必需,消費決策過程比較理性。所以模型有沒有效都要通過很長的週期檢驗,在這個週期內都將面臨很大的風險。再一個數據比較複雜,穩定性差。數據複雜體如今首先業務線不少,每一個業務線存儲介質也有不少,每一個數據產生的場景也不一樣,數據種類差別也很大,有文本、LBS,還有一些圖像的、天然語言的。還有一個成本比較高,互聯網所作的模型都要通過A/B text,可是保險行業不能這樣執行。docker
那麼如何解決這些問題呢,大體從如下三個方面解決畫像產生、質量檢驗、數據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