Alink漫談(十三) :線上學習演算法FTRL 之 具體實現
阿新 • • 發佈:2020-07-23
# 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);
```
訓練好之後,模型資訊