本文所討論的內容爲筆者對外文文獻的翻譯,並加入了筆者本身的理解和總結,文中涉及到的原始外文論文和相關學習連接我會放在reference裏,另外,推薦讀者朋友購買 Stephen Boyd的《凸優化》Convex Optimization這本書,封面一半橘黃色一半白色的,有國內學者翻譯成了中文版,淘寶能夠買到。這本書很是美妙,能讓你係統地學習機器學習算法背後蘊含的優化理論,體會數學之美。php
本文主要圍繞下面這篇paper展開內涵和外延的討論:html
[1] Siddiqui M A, Fern A, Dietterich T G, et al. Feedback-guided anomaly discovery via online optimization[C]//Proceedings of the 24th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining. ACM, 2018: 2200-2209.git
同時會在文章前半部分介紹這篇paper涉及到的2個主要理論:1)Active Learn;2)(online) Convex Optimization;3)isolation forest的相關內容請參閱另外一篇blog。github
筆者這裏先簡單歸納一下這篇筆者所理解的這篇paper的主要核心思想:算法
1. 主動學習思想的融合:spring
主動學習,也叫查詢學習,它要求算法在每輪學習迭代中可以基於某種策略,從當前樣本集中選擇出「最不肯定的一個或一組樣本」。從這個角度來思考,無監督異常檢測算法廣泛都能勝任這個目標,做者在paper中也提到了這個框架的可插拔性,paper中選擇了 isolation forest孤立森林算法,每一輪迭代中,經過不斷將 isolation tree 當前不肯定的數據(無監督模型發現的異常數據),也即最淺路徑葉節點輸出給外部反饋者並接受feedback label(正例 or 負例),以此得到一批打標樣本。安全
值得注意的是,這種反饋算法框架和具體的abnormal detection algorithm無關,無論是generalized linear anomaly detectors (GLADs)仍是tree-based anomaly detectors,均可以應用。相關的討論能夠參閱其餘的文章:網絡
Active Anomaly Discovery (AAD) algorithm https://www.onacademic.com/detail/journal_1000039828922010_bc30.html https://www.researchgate.net/publication/318431946_Incorporating_Feedback_into_Tree-based_Anomaly_Detection Loda: Lightweight on-line detector of anomalies https://link.springer.com/article/10.1007%2Fs10994-015-5521-0 SSAD (Semi-Supervised Anomaly Detection) Active learning for network intrusion detection https://www.deepdyve.com/lp/association-for-computing-machinery/active-learning-for-network-intrusion-detection-4Y5zwDUev5 Toward Supervised Anomaly Detection https://jair.org/index.php/jair/article/view/10802
可是僅僅融入和主動學習還不夠的, IF算法是無監督的,沒法處理這批打標樣本,咱們還須要引入有監督訓練過程,將外部反饋的新信息輸入到模型中被存儲以及記憶。框架
2. 凸優化框架的融合:機器學習
Isolation tree是一種樹狀結構,每一個樣本數據都是樹中的一個葉節點。做者創造性在原始 Isolation tree 的基礎上,將葉節點所在邊賦予了權重w的概念,並將feedback數據(至關於label有監督標籤)做爲目標label值。這樣,每次得到feedback反饋後,就能夠基於這批feedback數據(例如100個)進行多元線性迴歸的參數學習,即回到了有監督學習的範疇內。具體的涉及到Loss Function如何選擇,文章接下來會詳細討論。
主動學習(查詢學習),是機器學習的一個子領域。主要的思想是:經過必定的算法查詢最有用的未標記樣本,並交由專家進行標記,而後用查詢到的樣本訓練分類模型來提升模型的精確度。
1. 項目是冷啓動的,在冷啓動初期,標籤數據是很是稀少的,並且打標成本也相對比較高; 2. 項目雖然不是冷啓動,可是很難經過專家構建多元線性分類器,換句話說就是很難經過寫出一條條實值規則的邏輯組合。這在實際工做中也是很是常見的,典型地表現會是安全運營人員會發現本身的專家經驗「很難準肯定義」,每每是經過長時間地不斷調整邏輯組合以及判別閾值threshold後,可能依然沒法作到0誤報0漏報。 顯然,人腦不適合高維的、高精確度的複雜線性函數的處理。可是與此同時,人腦又善於根據複雜的高緯度特徵,得出一個模糊性的綜合判斷。例如,當一個安全專傢俱體拿到某個樣本的時候,他經過經驗仍是可以較快判斷出正例/負例,在大多數時候,這個判斷又是很是準確的。 筆者認爲,咱們須要經過機器學習輔助咱們進行安全數據分析的一個緣由就在於:人腦彷佛能夠進行很是複雜的邏輯判斷,可是卻很難數學化地準確表達出本身具體是怎麼獲得這個結果的。人的經驗在不少時候是很準的,可是你要是問他究竟是怎麼判斷的,他每每只能沉思片刻,而後露出一副堅決而微笑的表情,憑經驗判斷的!而經過機器學習的訓練過程,讓機器從數據中學習到人的模糊經驗,獲得一個數值化的、可穩定復現的決策系統。 3. 無監督算法獲得的異常未必就對應了業務場景中的一個真實異常事件,即算法層面的outlier和真實業務場景中的abnormal_target每每是存在一個gap的。 咱們知道,無監督異常檢測算法是根據特徵工程後的特徵向量進行數值計算後,獲得一個異常值排序,這就致使特徵工程的結果會極大影響以後的算法運行結果。 針對這一困難,傳統方法是須要模型開發者基於對業務的理解去優化特徵設計,甚至優化樣本集。這一優化一般是純粹基於經驗和嘗試的,過程當中因爲缺乏標籤指引,其迭代過程甚爲繁瑣。
主動學習的模型以下:
A = (C,Q,S,L,U)
只要是有監督學習算法便可。
通俗地理解:
Online active learning就是模型一次只輸出一個預測樣本給打標員,打標員經過檢視後將反饋結果輸入回模型,完成一次迭代。
Batch-size active learning是模型一次輸出一整批數據(例如128),打標員統一打標後,統一將結果輸入回模型。
理論上說,online learning更利於逼近全局最優,可是在實際工程中,online learning並不容易作到,由於人是不可能持續地一個樣本一個樣本的打標的,人畢竟不是機器,人會疲勞。所以,筆者在實際項目中,對原始論文中的Online部分修改成了Batch-size,經過一次積累一個batch樣本,而後依然流式地逐一輸入給原算法。
和online GD和batch-size GD問題同樣,batch-size能夠理解爲對online的一種近似模擬,通常狀況下,只要batch不要設置地太大(32-64),對最終結果的影響基本上能夠忽略不計。
論文原做者提出的是online active learning,在實際工業場景中,online active learning的部署成本很大,咱們通常採用small batch-size active learning代替,整體上效果影響有限。
即模型一次輸出top rank的異常數據,由打標員統一打標後再輸入回模型,以後將這批樣本所有輸入模型進行權重w的調整。接着進入下一輪的top rank異常點評選,如此循環。
Relevant Link:
https://blog.csdn.net/Jinpeijie217/article/details/80707978 https://www.jianshu.com/p/e908c3595fc0 https://www.cnblogs.com/hust-yingjie/p/8522165.html
凸優化在數學規劃領域具備很是重要的地位,一旦將一個實際問題表示爲一個凸優化問題,大致上意味着對應問題已經獲得完全解決。從理論角度看,用凸優化模型對通常非線性優化模型進行局部逼近,始終是研究非線性規劃問題的主要途徑。
從理論推演脈絡角度來講,凸優化理論是研究優化問題的一個重要分支。實際上,最小二乘以及現行規劃問題都屬於凸優化問題。
下圖展現在線凸優化的僞碼流程圖:
在一輪的迭代中,都要從凸集中選擇一組向量序列w,並選擇一個損失函數f()用於計算和目標值之間的差距。
算法的最終目標是:經過選擇一組權重w序列,以及一組損失函數
,並使整體的離差最小。
Relevant Link:
https://www.cnblogs.com/wzdLY/p/9569576.html https://www.cnblogs.com/wzdLY/p/9570843.html https://www.jianshu.com/p/e908c3595fc0
咱們在文章的開頭已經討論了FBIF的主要思想,下面經過一個圖例來講明,FBIF是如何具體解決傳統IF的缺陷的。
傳統IF檢測異常時一般會將頭部異常樣本集(一般不會太多)輸出給分析師,藉助他們的專家經驗斷定是否爲所要抓捕的風險,若準確率知足要求則進行生產部署,若不知足要求,則須要建模人員和分析師一塊兒嘗試修改特徵工程,或者經過白名單排除一些樣本集,這是一個將分析師的評估結果人工翻譯給IF算法的過程。
這樣方法的問題在於,outlier檢測算法模式是固定的,具體被檢出哪些是outlier,很大程度上依賴於特徵工程的設計。因此這個時候爲了提升異常發現的recall,算法設計者會盡量地將「領域經驗」融入到特徵工程的設計中。但如咱們前面所說,算法層面上的異常並不必定就是在業務場景下關注的目標事件,可能某個樣本向量從算法層面看,確實很是異常的「離羣」,可是從業務角度看卻偏偏是一個正常的數據點,並且最麻煩的問題是,當咱們不斷嘗試優化、調整、增長咱們的領域經驗特徵後,這個現象依然大量存在,每每這個時候,模型開發者就只能遺憾地宣佈:oh!no!個人這個業務場景不適合無監督異常發現,換別的方案吧。
FBIF做者的解決思路我這裏理解是這樣的:首先IF是一種生成式模型,IF訓練收斂過程沒有打標樣本的參與,最終生成的機率分佈決策函數(decision function)沒有有監督樣本的參與,經驗偏差天然會很大。做者將online learning框架思想融入模型中,將監督學習的思想和流程加入到這個無監督過程當中,使徹底的無監督算法變成半監督的算法。這樣獲得的綜合模型即擁有無監督異常算法的泛化能力,同時也能兼顧有監督學習的強擬合能力的特色。
FBIF省去了傳統利用IF作異常檢測模型中,反覆人工翻譯的過程,直接輸出,反饋,然後吸取的過程建模爲一個online learning過程。
FBIF本質上仍是一個異常點預測函數,模型產出的對應數據點的異常值,模型公式以下:,x表明待預測樣本點,w表明模型超參數。注意,這是一個半監督模型,超參數w是能夠不斷調整的。
這個函數是一個特徵映射函數(feature function),用於將輸入的樣本向量轉化到一個n維向量空間中,即:
。
這樣講可能有些抽象,以IF爲例,輸入樣本示例是一個咱們定義的向量(例如12維),經過IF以後造成了tree-based的結構,對IF中每棵樹的每一條邊e,定義:
這樣咱們將整個tree上的每一條邊按照ont-hot形式進行編碼,那麼能夠很容易想象,每個leaf節點都會通過必定數量的邊,例如一顆3層6個邊的樹,某個節點對應的樹結構向量可能就是【1,1,1,0,0,0】,以下圖所示:
那函數有什麼做用呢?咱們先來直觀理解一下,回到咱們上面舉得例子:
,同時看另外一個葉節點
從IF的算法理論來看,葉節點d的異常度是比葉節點b的異常度要高的。原始的IF算法也就是基於這點對「不一樣深度」的葉節點得出不一樣的異常度的。而且,原始IF,每一個邊的權重都相等,所以節點的異常值徹底取決於映射後獲得的向量,也即越淺層的葉節點越異常。
回到FBIF的公式上來:,FBIF給每一個邊一個權重
,同時知足
,即樹中全部的邊和權重w進行向量相乘和總的機率分配和爲1.
權重w是由feedback反饋(有監督標籤)驅動調整的,所以,score越大意味着異常度越高,score越小意味着異常度越小,這就構成了一個有監督線性迴歸模型(也即原文說的generalized linear anomaly detectors (GLADs))的迴歸訓練過程。
很顯然,IF算法是固定的這裏再也不贅述,讀者朋友能夠參閱另外一篇blog。 咱們本文主要討論的是權重w是如何調整的,這是FBIF的重點。
FBIF的主體框架採用了online convex optimization(OCO)框架來描述該過程,能夠理解爲:咱們是在一個對抗性的環境循環地一輪輪作遊戲的過程,其中每一輪咱們的行動(action)是選擇convex set S中的向量,在遊戲的第t步,過程以下:
詳細的算法流程以下:
咱們接下來逐個討論各個子環節。
注意,OCO是一個不斷迭代循環的過程,模型不只產出「suspicious abnormal instance」給反饋者,同時上一輪反饋者給的feedback也會影響這一輪的模型預測結果,是一個遞歸過程。
,w的維度等於樹中邊的數量。
特別的,,初始狀態和傳統IF是同樣的,全部邊的權重都相等。
OCO框架採用了正則化技術,使用L2範數進行差別評估,關於正則化技術的討論能夠參閱另外一篇blog。
另外,在論文中選用了tree-based的anomaly detect function,因此對權重w的限制是非負,這點在寫代碼的時候須要注意。
接下來按照IF的傳統過程獲得映射後向量,並乘上權重參數w,根據異常值score獲得一組top anomaly instance。
yt = +1:alien yt = −1:nominal
注意,上面算法流程圖中,,FBIF每輪反饋後的樣本點是不參與下一輪的反饋抽樣的。理論上說,不斷循環下去,全部的樣本都會獲得一次反饋,最終半監督過程完全演化爲徹底的有監督過程。
可是在實際工程項目中,基本上,樣本集D是一個天文數字,在筆者所在的網絡安全攻防場景更是屢見不鮮,因此人工反饋最多隻能完成最多上萬次的反饋,通常經過上千次的反饋後,FBIF模型就會完成收斂。
接下來的問題如何將反饋轉換爲可優化的數值函數,以便進行最優逼近,例如梯度降低。
基本上來講:
yt = +1:loss值要更小 yt = -1:loss值要相對更大
損失函數的整體目的是在整個比賽中(全部的t輪次)以後,整體的損失最小,因此這是一個符合貪婪模式的迭代式優化算法。
文章列舉了loss function function的兩種定義方式,這也是咱們很熟悉的線性迴歸中的損失函數,這部分的討論其實和線性迴歸沒有本質的原理區別。
,其中,
獲得了損失函數的形式和計算方法以後,經過梯度降低對權重參數進行更新。
該算法的時間複雜度很低,它的主要計算開銷集中在初始化訓練IF,在迭代過程當中得益於online setting能夠實現增量更新,其時間成本幾乎可忽略不計。
能夠看到,人工的反饋至關於加入了一種梯度方向,在原始Unsupervised Dection algorithm的基礎上,強行「影響」了訓練過程當中參數的調整方向,最終獲得的模型參數是「數據+人經驗」綜合影響的結果。這能夠理解爲是一種加入了先驗知識的模型訓練。
不太嚴謹地一個比喻,咱們能夠將本來IF預測函數有一個超判別面(超矩形),如今加入了feedback以後,又一隻手強行扭動這個超判別面的形狀,將其儘可能地扭成符合業務場景中關注的異常和正常的真值機率邊界位置,這個扭動的力度和程度就取決於feedback反饋進行的次數以及每次反饋的樣例數。
$ cd test $ ../iforest.exe -i datasets/anomaly/ann_thyroid_1v3/fullsamples/ann_thyroid_1v3_1.csv -o outtest/ann_thyroid_1v3_1 -t 100 -s 256 -m 1 -x 5 -f 10 -w 2 -l 2 -a 1 # Trees = 100 # Samples = 256 MaxHeight = 0 Orig Dimension = 3251,21 # Iterations = 128 # 迭代1024次 # Feedbacks = 10 # 返回10個top異常樣本的label結果 Loss type = logistic Update type = online Num Grad Upd = 1 Reg. Constant = 0 Learning Rate = 1 Variable LRate = 0 Positive W only = 0 ReInitWgts = 0 Regularizer type = L2
程序對一個數據集同時進行了IF和FBIF過程,注意,最好運行1024次以上,比較容易看出數據趨勢。運行結束後能夠獲得兩個不一樣的文件:
# IF運行結果 "ann_thyroid_1v3_1_summary_feed_0_losstype_logistic_updatetype_online_ngrad_1_reg_0_lrate_1_pwgt_0_inwgt_0_rtype_L2.csv" iter,feed1,feed2,feed3,feed4,feed5,feed6,feed7,feed8,feed9,feed10 1,0,1,1,1,1,2,3,3,4,4 2,1,1,2,2,2,2,3,3,4,5 3,0,0,1,1,1,2,2,2,2,2 4,0,0,1,2,2,2,3,4,4,5 5,1,1,1,1,1,1,2,2,2,2 6,1,1,1,1,2,2,2,2,2,3 7,1,1,1,1,1,1,1,1,2,2 8,0,0,0,1,1,2,3,3,3,3 9,0,0,0,1,2,2,2,2,2,2 10,0,1,1,1,1,1,1,1,1,1 11,1,1,1,1,2,2,2,2,2,2 12,0,1,1,1,1,2,2,2,2,2 13,0,0,1,2,2,2,2,2,3,3 14,0,1,1,1,1,2,2,2,2,2 15,0,0,0,0,1,1,1,1,1,2 16,0,1,1,2,2,2,2,2,2,2 17,0,1,1,2,2,2,2,2,2,2 18,1,1,2,2,2,2,3,3,3,3 19,0,1,1,1,1,1,1,1,2,2 20,0,0,0,0,1,1,1,1,1,1 21,0,0,1,2,2,2,3,3,4,5 22,0,1,1,1,1,1,1,1,1,1 # FBIF運行結果 "ann_thyroid_1v3_1_summary_feed_10_losstype_logistic_updatetype_online_ngrad_1_reg_0_lrate_1_pwgt_0_inwgt_0_rtype_L2.csv" iter,feed1,feed2,feed3,feed4,feed5,feed6,feed7,feed8,feed9,feed10 1,0,1,2,3,3,4,5,6,7,8 2,1,2,3,4,4,5,6,7,8,9 3,0,0,1,2,2,3,4,5,6,7 4,0,0,1,2,3,4,5,6,7,8 5,1,2,3,3,4,5,6,7,8,9 6,1,2,2,3,4,5,6,7,8,9 7,1,2,2,2,3,4,5,6,7,7 8,0,0,0,1,2,2,3,4,5,6 9,0,0,0,1,2,3,3,4,5,6 10,0,1,1,2,3,4,4,5,6,7 11,1,2,2,3,4,5,6,7,8,9 12,0,1,2,3,3,4,5,6,7,8 13,0,0,1,2,3,3,4,5,6,7 14,0,1,2,3,3,4,5,6,7,8 15,0,0,0,0,1,2,2,2,3,4 16,0,1,2,2,3,4,5,6,7,8 17,0,1,2,3,3,3,4,5,6,7 18,1,2,3,4,5,6,7,7,8,9 19,0,1,2,2,2,2,2,2,2,3 20,0,0,0,0,1,2,3,4,5,6 21,0,0,1,2,3,3,4,5,6,7 22,0,1,2,2,2,2,2,2,2,2 23,0,1,2,2,3,4,5,6,7,8 24,0,0,1,2,2,3,4,5,6,7 25,0,0,1,2,3,4,4,5,6,7 26,0,0,1,2,3,4,5,5,6,7
咋一看好像看不出有什麼區別,咱們接下來從幾個角度來分析一下結果數據:
咱們先對兩個文件進行unique處理,結果以下:
# IF過程 1024 -> 230:壓縮率 = 77.5% # FBIF過程 1024 -> 138:壓縮率 = 86.7%
壓縮率越低,意味着預測結果的機率分佈越分散,即不集中。
這個結果能夠這麼理解,IF是基於隨機過程進行特徵選擇和切分閾值選擇的,隨機性很高,不容易收斂。
而FBIF由於加入了feedback的擬合過程,隨着梯度降低的訓練,模型逐漸向feedback的梯度方向擬合,所以收斂速度更快。
再來看IF和FBIF的平均反饋值:
Avg: Baseline -> 2.31934 Feedback -> 6.70898
能夠看到,FBIF比IF的平均異常反饋要高不少,這意味着,FBIF算法產出的異常值,更有多是業務場景中關心的異常點(也即和label更靠近)。
再來看最後一次預測結果的召回對比:
# FBIF 1024,1,2,3,4,5,6,6,7,8,9 # IF 1024,1,2,2,2,2,2,2,2,2,3
FBIF的召回率已經比開始時有很大提高,而IF依然和初始時沒有太多變化。
從這裏也看出,IF算法不須要迭代運行屢次,一次運行和屢次運行的結果沒有太多區別。
Relevant Link:
https://github.com/siddiqmd/FeedbackIsolationForest
筆者在項目中,feedback不斷迭代以後,整個模型中線性部分w的影響力會逐漸佔統治地位,最終整個模型會逐漸和專家經驗過擬合。
尤爲是在原來機率分佈灰色地帶的樣本點,模型會趨向不告警。
這樣致使的效果是,總體模型的誤報確實少了,模型可能能夠上線了,可是漏報的潛在風險也大了,要用別的新的泛化方法來發現可能的漏報。
有興趣的讀者可使用阿里雲的公共機器學習平臺PAI平臺,咱們已經開放了相關算法組件的運算能力:
經過構建工做流,能夠不斷進行迭代feedback訓練,並最終獲得擬合於專家經驗的FBIF模型。