1. 程式人生 > >Alink漫談(十三) :線上學習演算法FTRL 之 具體實現

Alink漫談(十三) :線上學習演算法FTRL 之 具體實現

# Alink漫談(十三) :線上學習演算法FTRL 之 具體實現 [Toc] ## 0x00 摘要 Alink 是阿里巴巴基於實時計算引擎 Flink 研發的新一代機器學習演算法平臺,是業界首個同時支援批式演算法、流式演算法的機器學習平臺。本文和上文一起介紹了線上學習演算法 FTRL 在Alink中是如何實現的,希望對大家有所幫助。 ## 0x01 回顧 書接上回 [Alink漫談(十二) :線上學習演算法FTRL 之 整體設計](https://www.cnblogs.com/rossiXYZ/p/13325308.html) 。到目前為止,已經處理完畢輸入,接下來就是線上訓練。訓練優化的主要目標是找到一個方向,引數朝這個方向移動之後使得損失函式的值能夠減小,這個方向往往由一階偏導或者二階偏導各種組合求得。 為了讓大家更好理解,我們再次貼出整體流程圖: ![在這裡插入圖片描述](https://img2020.cnblogs.com/blog/1850883/202007/1850883-20200717004657011-478442159.png#pic_center) ## 0x02 線上訓練 線上訓練主要邏輯是: - 1)載入初始化模型到 dataBridge;dataBridge = DirectReader.collect(model); - 2)獲取相關引數。比如vectorSize預設是30000,是否 hasInterceptItem; - 3)獲取切分資訊。splitInfo = getSplitInfo(featureSize, hasInterceptItem, parallelism); 下面馬上會用到。 - 4)切分高維向量。初始化資料做了特徵雜湊,會產生高維向量,這裡需要進行切割。 initData.flatMap(new SplitVector(splitInfo, hasInterceptItem, vectorSize,vectorTrainIdx, featureIdx, labelIdx)); - 5)構建一個 IterativeStream.ConnectedIterativeStreams iteration,這樣會構建(或者說連線)兩個資料流:反饋流和訓練流; - 6)用iteration來構建迭代體 iterativeBody,其包括兩部分:CalcTask,ReduceTask; - 6.1)CalcTask分成兩個部分。flatMap1 是分佈計算FTRL迭代需要的predict,flatMap2 是FTRL的更新引數部分; - 6.2)ReduceTask分為兩個功能:“歸併這些predict計算結果“ / ”如果滿足條件則歸併模型
& 向下遊運算元輸出模型“; - 7)result = iterativeBody.filter;基本是以時間間隔為標準來判斷(也可以認為是時間驅動),"時間未過期&向量有意義" 的資料將被髮送回反饋資料流,繼續迭代,**回到步驟 6),進入flatMap2**; - 8)output = iterativeBody.filter;符合標準(時間過期了)的資料將跳出迭代,然後演算法會呼叫WriteModel將LineModelData轉換為多條Row,轉發給下游operator(也就是線上預測階段);**即定時把模型更新給線上預測階段**。 ### 2.1 預置模型 前面說到,FTRL先要訓練出一個**邏輯迴歸模型**
作為FTRL演算法的初始模型,這是為了系統冷啟動的需要。 #### 2.1.1 訓練模型 具體邏輯迴歸模型設定/訓練是 : ```java // train initial batch model LogisticRegressionTrainBatchOp lr = new LogisticRegressionTrainBatchOp() .setVectorCol(vecColName) .setLabelCol(labelColName) .setWithIntercept(true) .setMaxIter(10); BatchOperator initModel = featurePipelineModel.transform(trainBatchData).link(lr); ``` 訓練好之後,模型資訊