最近在學習實時機器學習或者說增量學習相關的內容,目前中文資料相關的介紹非常少,今天借著creme這個庫介紹下Online Learning的原理,以及Online Learning和Batch Learning的一些區別。
Batch就是目前常用的計算模式,需要離線數據,離線訓練,離線評估,然後上線。
離線的好處就是比較穩定,可以用大的數據量去訓練和評估,如果模型效果不好也方便替換。
OnlineLearning更多地是一個實時運行的體系,實時有樣本產生,實時提取特徵並且和目標列拼接成樣本,實時評估和訓練。
Online Learning需要具備下述的幾個特點:
Online Learning優點很明顯,就是可以對訓練樣本做實時的反饋。所以應用的場景也主要是網際網路領域,對實時性要求很高的場景。在推薦廣告領域,Online Learning後續非常有發揮的空間。
Online Learning的優勢就是實時產出模型,數據的時效性強。之所以沒有大範圍普及,主要因為劣勢也很明顯,運維成本會比較高。比如如何保證實時樣本拼接的準確性、如何確保實時評估的準確、線上模型出現問題如何回滾等。所以,Online Learning還沒有非常好的開源解決方案,今天介紹的creme只能解決部分問題。
項目地址:https://github.com/creme-ml/creme
可以通過pip安裝:pip install creme
這是一個專注做Online Learning的庫,目前還沒有集成tf、pytorch的能力,所以現在creme是自己實現一些單機可運行的增量學習的算法,可以實現one sample粒度的訓練。
一些數據量不大,或者是想了解Online Learning機制的同學比較推薦,如果是企業生產的話,還是要等基於TensorFlow或者其它成熟框架的mini batch這樣訓練的能力。
creme的代碼可讀性很強,
from creme import linear_modelfrom creme import streamX_y = stream.iter_csv('some/csv/file.csv')model = linear_model.LogisticRegression()for x, y in X_y: model.fit_one(x, y)有一個stream庫可以實現流式的IO,這裡接Kafka也是可以的。單樣本訓練直接可以用fit_one,這個命名滿直接的。
from creme import linear_modelfrom creme import metricsfrom creme import streamX_y = stream.iter_csv('some/csv/file.csv')model = linear_model.LogisticRegression()metric = metrics.Accuracy()for x, y in X_y: y_pred = model.predict_one(x) model.fit_one(x, y) metric.update(y, y_pred)print(metric)在評估的時候可以直接用metric.update函數去計算準確率,評估指標是通過真實的y值和預測出來的y_pred做對比。
下圖展示的是creme已經支持的函數和算法:
總而言之,creme目前還是一個探索性的項目,在實際生產方面可能會有性能問題,不過是一個很好地了解Online Learning的材料。