1. 程式人生 > >簡要介紹Active Learning(主動學習)思想框架,以及從IF(isolation forest)衍生出來的演算法:FBIF(Feedback-Guided Anomaly Discovery)

簡要介紹Active Learning(主動學習)思想框架,以及從IF(isolation forest)衍生出來的演算法:FBIF(Feedback-Guided Anomaly Discovery)

1. 引言

本文所討論的內容為筆者對外文文獻的翻譯,並加入了筆者自己的理解和總結,文中涉及到的原始外文論文和相關學習連結我會放在reference裡,另外,推薦讀者朋友購買 Stephen Boyd的《凸優化》Convex Optimization這本書,封面一半橘黃色一半白色的,有國內學者翻譯成了中文版,淘寶可以買到。這本書非常美妙,能讓你係統地學習機器學習演算法背後蘊含的優化理論,體會數學之美。

本文主要圍繞下面這篇paper展開內涵和外延的討論:

[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.

同時會在文章前半部分介紹這篇paper涉及到的2個主要理論:1)Active Learn;2)(online) Convex Optimization;3)isolation forest的相關內容請參閱另一篇blog。

筆者這裡先簡單概括一下這篇筆者所理解的這篇paper的主要核心思想:

1. 主動學習思想的融合:

主動學習,也叫查詢學習,它要求演算法在每輪學習迭代中能夠基於某種策略,從當前樣本集中選擇出“最不確定的一個或一組樣本”。從這個角度來思考,無監督異常檢測演算法普遍都能勝任這個目標,作者在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如何選擇,文章接下來會詳細討論。

 

2. Active Learning(主動學習)

0x1:主動學習基本概念

主動學習(查詢學習),是機器學習的一個子領域。主要的思想是:通過一定的演算法查詢最有用的未標記樣本,並交由專家進行標記,然後用查詢到的樣本訓練分類模型來提高模型的精確度。

0x2:什麼場景下需要主動學習

1. 專案是冷啟動的,在冷啟動初期,標籤資料是非常稀少的,而且打標成本也相對比較高;

2. 專案雖然不是冷啟動,但是很難通過專家構建多元線性分類器,換句話說就是很難通過寫出一條條實值規則的邏輯組合。這在實際工作中也是非常常見的,典型地表現會是安全運營人員會發現自己的專家經驗“很難準確定義”,往往是通過長時間地不斷調整邏輯組合以及判別閾值threshold後,可能依然無法做到0誤報0漏報。
顯然,人腦不適合高維的、高精確度的複雜線性函式的處理。但是與此同時,人腦又善於根據複雜的高緯度特徵,得出一個模糊性的綜合判斷。例如,當一個安全專傢俱體拿到某個樣本的時候,他通過經驗還是能夠較快判斷出正例/負例,在大多數時候,這個判斷又是非常準確的。
筆者認為,我們需要通過機器學習輔助我們進行安全資料分析的一個原因就在於:人腦似乎可以進行非常複雜的邏輯判斷,但是卻很難數學化地準確表達出自己具體是怎麼得到這個結果的。人的經驗在很多時候是很準的,但是你要是問他到底是怎麼判斷的,他往往只能沉思片刻,然後露出一副堅定而微笑的表情,憑經驗判斷的!而通過機器學習的訓練過程,讓機器從資料中學習到人的模糊經驗,得到一個數值化的、可穩定復現的決策系統。

3. 無監督演算法得到的異常未必就對應了業務場景中的一個真實異常事件,即演算法層面的outlier和真實業務場景中的abnormal_target往往是存在一個gap的。
我們知道,無監督異常檢測演算法是根據特徵工程後的特徵向量進行數值計算後,得到一個異常值排序,這就導致特徵工程的結果會極大影響之後的演算法執行結果。
針對這一困難,傳統方法是需要模型開發者基於對業務的理解去優化特徵設計,甚至優化樣本集。這一優化通常是純粹基於經驗和嘗試的,過程中由於缺少標籤指引,其迭代過程甚為繁瑣。

0x3:主動學習演算法模型框架

主動學習的模型如下:

A = (C,Q,S,L,U)

其中 L 是用於訓練已標註的樣本; C 為一組或者一個演算法模型,使用者接收上一輪的標記樣本集,通過負反饋調整模型引數,並輸出對應的預測結果向量集; Q 是查詢函式,用於從當前剩餘的未標註樣本池(未標記樣本會逐漸減少)U 中查詢資訊量最大(最不確定)的top樣本; S是督導者,可以為 U 中樣本標註正確的標籤; active learning模型通過少量初始標記樣本 L 開始學習,通過一定的查詢函式 Q 選擇出一個或一批最有用的樣本,並向督導者詢問標籤,然後利用獲得的新知識來訓練分類器和進行下一輪查詢。主動學習是一個迴圈的過程,直至達到某一停止準則為止。 需要注意的是,active learning是一個演算法框架,上圖中的單個模組具備可替換性(alternative),我們接下來討論具體每個子模組的選擇原則。

1. 機器學習模型C

只要是有監督學習演算法即可。

2. 查詢函式Q

查詢函式的設計最常用的策略是:不確定性準則(uncertainty)和差異性準則(diversity)。

1)不確定性準則對於不確定性,我們可以藉助資訊熵的概念來進行理解。我們知道資訊熵是衡量資訊量的概念,也是衡量不確定性的概念。資訊熵越大,就代表不確定性越大,包含的資訊量也就越豐富。

不確定性策略就是要想方設法地找出不確定性高的樣本,因為這些樣本所包含的豐富資訊量,對我們訓練模型來說就是有用的。

2)差異性準則(diversity)

查詢函式每次迭代中,查詢一個或者一批樣本。我們希望所查詢的樣本提供的資訊是全面的,各個樣本提供的資訊不重複不冗餘,即樣本之間具有一定的差異性(概率分佈儘量全面)。 在每輪迭代抽取單個資訊量最大的樣本加入訓練集的情況下,每一輪迭代中模型都被重新訓練,以新獲得的知識去參與對樣本不確定性的評估可以有效地避免資料冗餘。但是如果每次迭代查詢一批樣本,那麼就應該想辦法來保證樣本的差異性,避免資料冗餘。

0x4:Online Active learning or Batch-size Active learning?

通俗地理解,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代替,總體上效果影響有限。

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

 

3. (Online) Convex Optimization Framework

0x1:凸優化簡介

凸優化在數學規劃領域具有非常重要的地位,一旦將一個實際問題表示為一個凸優化問題,大體上意味著對應問題已經得到徹底解決。從理論角度看,用凸優化模型對一般非線性優化模型進行區域性逼近,始終是研究非線性規劃問題的主要途徑。

從理論推演脈絡角度來說,凸優化理論是研究優化問題的一個重要分支。實際上,最小二乘以及現行規劃問題都屬於凸優化問題。

0x2:線上凸優化演算法流程

下圖展示線上凸優化的偽碼流程圖:

 

在一輪的迭代中,都要從凸集中選擇一組向量序列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

  

4. Feedback-Guided Anomaly Discovery via Online Optimization

0x1:FBIF和傳統IF(isolation forest)的區別

我們在文章的開頭已經討論了FBIF的主要思想,下面通過一個圖例來說明,FBIF是如何具體解決傳統IF的缺陷的。

1. 傳統IF問題

傳統IF檢測異常時通常會將頭部異常樣本集(通常不會太多)輸出給分析師,藉助他們的專家經驗判定是否為所要抓捕的風險,若準確率滿足要求則進行生產部署,若不滿足要求,則需要建模人員和分析師一起嘗試修改特徵工程,或者通過白名單排除一些樣本集,這是一個將分析師的評估結果人工翻譯給IF演算法的過程。

這樣方法的問題在於,outlier檢測演算法模式是固定的,具體被檢出哪些是outlier,很大程度上依賴於特徵工程的設計。所以這個時候為了提高異常發現的recall,演算法設計者會盡可能地將“領域經驗”融入到特徵工程的設計中。但如我們前面所說,演算法層面上的異常並不一定就是在業務場景下關注的目標事件,可能某個樣本向量從演算法層面看,確實非常異常的“離群”,但是從業務角度看卻恰恰是一個正常的資料點,而且最麻煩的問題是,當我們不斷嘗試優化、調整、增加我們的領域經驗特徵後,這個現象依然大量存在,往往這個時候,模型開發者就只能遺憾地宣佈:oh!no!我的這個業務場景不適合無監督異常發現,換別的方案吧。

2. FBIF的解決思路

FBIF作者的解決思路我這裡理解是這樣的:首先IF是一種生成式模型,IF訓練收斂過程沒有打標樣本的參與,最終生成的概率分佈決策函式(decision function)沒有有監督樣本的參與,經驗誤差自然會很大。作者將online learning框架思想融入模型中,將監督學習的思想和流程加入到這個無監督過程中,使完全的無監督演算法變成半監督的演算法。這樣得到的綜合模型即擁有無監督異常演算法的泛化能力,同時也能兼顧有監督學習的強擬合能力的特點。

FBIF省去了傳統利用IF做異常檢測模型中,反覆人工翻譯的過程,直接輸出,反饋,而後吸收的過程建模為一個online learning過程。

0x2:FBIF演算法模型  

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的重點。 

0x3:online convex optimization(OCO) - 有監督引數調整過程

FBIF的主體框架採用了online convex optimization(OCO)框架來描述該過程,可以理解為:我們是在一個對抗性的環境迴圈地一輪輪做遊戲的過程,其中每一輪我們的行動(action)是選擇convex set S中的向量,在遊戲的第t步,過程如下: 

  • 1. 我們選擇
  • 2. 環境選擇一個凸函式
  • 3. 我們得到損失 

詳細的演算法流程如下:

我們接下來逐個討論各個子環節。

1. Select a vector wt for the abnormal detector

注意,OCO是一個不斷迭代迴圈的過程,模型不僅產出“suspicious abnormal instance”給反饋者,同時上一輪反饋者給的feedback也會影響這一輪的模型預測結果,是一個遞迴過程。

,w的維度等於樹中邊的數量。

特別的,,初始狀態和傳統IF是一樣的,所有邊的權重都相等。

 

OCO框架採用了正則化技術,使用L2範數進行差異評估,關於正則化技術的討論可以參閱另一篇blog。

另外,在論文中選用了tree-based的anomaly detect function,所以對權重w的限制是非負,這點在寫程式碼的時候需要注意。

2. Find top anomaly score's instance

接下來按照IF的傳統過程得到對映後向量,並乘上權重引數w,根據異常值score得到一組top anomaly instance。 

3. Get feedback

yt = +1:alien
yt = −1:nominal

4. 無放回反饋

注意,上面演算法流程圖中,,FBIF每輪反饋後的樣本點是不參與下一輪的反饋抽樣的。理論上說,不斷迴圈下去,所有的樣本都會得到一次反饋,最終半監督過程徹底演化為完全的有監督過程。

但是在實際工程專案中,基本上,樣本集D是一個天文數字,在筆者所在的網路安全攻防場景更是家常便飯,所以人工反饋最多隻能完成最多上萬次的反饋,一般通過上千次的反饋後,FBIF模型就會完成收斂。

5. Use yt to calculate Loss Function 

接下來的問題如何將反饋轉換為可優化的數值函式,以便進行最優逼近,例如梯度下降。

基本上來說:

yt = +1:loss值要更小
yt = -1:loss值要相對更大

損失函式的總體目的是在整個比賽中(所有的t輪次)之後,總體的損失最小,所以這是一個符合貪婪模式的迭代式優化演算法。

文章列舉了loss function function的兩種定義方式,這也是我們很熟悉的線性迴歸中的損失函式,這部分的討論其實和線性迴歸沒有本質的原理區別。

1)Linear Loss

2)Log-likelihood Loss

,其中,

6. Update the weight vector

得到了損失函式的形式和計算方法之後,通過梯度下降對權重引數進行更新。

0x4:演算法執行過程概述 

  • 初始化(只執行一次):基於資料集訓練初始化IF,根據樹結構得到對映函式,並初始化邊權重。
  • 迴圈執行OCO反饋過程,並不斷調整權重w。在OCO優化過程中,樹結構是不變的,也即對映函式是不變的,變動的只有權重w。
  • 達到收斂條件,例如反饋人員精疲力竭、全部樣本都反饋一遍了、達到設定的最大迭代次數。

該演算法的時間複雜度很低,它的主要計算開銷集中在初始化訓練IF,在迭代過程中得益於online setting可以實現增量更新,其時間成本幾乎可忽略不計。  

可以看到,人工的反饋相當於加入了一種梯度方向,在原始Unsupervised Dection algorithm的基礎上,強行“影響”了訓練過程中引數的調整方向,最終得到的模型引數是“資料+人經驗”綜合影響的結果。這可以理解為是一種加入了先驗知識的模型訓練。

不太嚴謹地一個比喻,我們可以將原本IF預測函式有一個超判別面(超矩形),現在加入了feedback之後,又一隻手強行扭動這個超判別面的形狀,將其儘量地扭成符合業務場景中關注的異常和正常的真值概率邊界位置,這個扭動的力度和程度就取決於feedback反饋進行的次數以及每次反饋的樣例數。

 

5. 通過一個例子來看FBIF的直觀效果

$ 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

咋一看好像看不出有什麼區別,我們接下來從幾個角度來分析一下結果資料:

0x1:演算法收斂速度對比

我們先對兩個檔案進行unique處理,結果如下:

# IF過程
1024 -> 230:壓縮率 = 77.5%

# FBIF過程
1024 -> 138:壓縮率 = 86.7%

壓縮率越低,意味著預測結果的概率分佈越分散,即不集中。

這個結果可以這麼理解,IF是基於隨機過程進行特徵選擇和切分閾值選擇的,隨機性很高,不容易收斂。

而FBIF因為加入了feedback的擬合過程,隨著梯度下降的訓練,模型逐漸向feedback的梯度方向擬合,因此收斂速度更快。

0x2:演算法擬合能力對比

再來看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

&n