異常檢測(anomaly/ outlier detection)領(lǐng)域還有那些值得研究的問題?
點擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時間送達
本文來源于知乎話題“異常檢測(anomaly/ outlier detection)領(lǐng)域還有那些值得研究的問題?”
原文鏈接:https://www.zhihu.com/question/324999831
基于圖像的異常檢測,比如工業(yè)上用的表面瑕疵檢測(surface defect detection)發(fā)展到了哪一步?還有無進一步研究的必要?對訊號異常(series anomaly)的呢?
極市為大家精選了2位知乎大佬的高質(zhì)量回答,供大家參考。
微調(diào)@知乎
我覺得異常檢測可以被理解為一種在「無監(jiān)督或者弱監(jiān)督下的非平衡數(shù)據(jù)下的多分類,且要求一定的解釋性」的任務(wù),且往往異常點(不平衡數(shù)據(jù)中較少的部分)對我們更為重要。和非平衡學(xué)習(xí)(imbalanced learning)不同異常檢測一般是無監(jiān)督的,和普通的二分類問題也不大相同,因為異常檢測往往看似是二分類,但其實是多分類(造成異常的原因各不相同)。問題的核心就在于我們既不知道事實上有多少類別(class),也沒有真實的標(biāo)簽(ground truth),在這種情況下異常檢測的效果往往不盡人意。
說到異常檢測,一般會先從無監(jiān)督說起。傳統(tǒng)的方法就是衡量相似度(proximity)比如距離[1]、密度[2]、角度[3]、隔離所需的難度[4]、基于簇的方法[5]等,這些算法在低維上其實表現(xiàn)都接近,因為核心假設(shè)都是“異常點的表示與正常點不同,是少數(shù)派”。但大部分類似的算法都會面臨維數(shù)災(zāi)難(the curse of dimensionality),即常見的相似性度量(比如歐氏距離)在高維數(shù)據(jù)上往往會失效[6][7]。為了解決這個問題,人們提出了很多方法包括:
降維或者特征選擇[8]
subspace方法,比如在多個低維空間上做檢測再合并,比如random projection(隨機產(chǎn)生多個子空間并在每個子空間上單獨建模,feature bagging)和random forest很像
用graph來表示關(guān)系,提取特征[9],但往往維度會繼續(xù)升高
找intrinsic dimensionality以及其他度量方法,如reversenearest neighbors[10]
其實換句話說,對于高維數(shù)據(jù),核心目的都還是想找到一個好的空間/表示[11],之后找異常就變成了衡量相似度的簡單問題。高維數(shù)據(jù)所帶來的另一個問題是可擴展性(scalability)。眾所周知,衡量相似度的運算開銷是很大的,大部分距離度量的復(fù)雜度以上,在這種情況下利用數(shù)據(jù)結(jié)構(gòu)(比如kd tree)進行優(yōu)化或者dynamic programming來降低復(fù)雜度也是常見的探索方向。最理想的情況還是控制維度,找到更好的數(shù)據(jù)表示,因為這才是問題的根本。
為了找到好的表示(representation),或者單純只是更簡單的、tractable的表示,線性降維有用PCA的,非線性的有用autoencoder的[12],人們的核心假設(shè)都是降維模型所找到的低維空間主要受到正常點的影響,因此異常點距離所找到的低維空間的距離更遠。在這個基礎(chǔ)上人們也引入了variational autoencoder(VAE),后來也有用GAN的方法[13]。對于高維數(shù)據(jù)而言,往往一個模型是不夠的,比如前面的feature bagging(類比于監(jiān)督學(xué)習(xí)中的隨機森林)會建立多個模型[14],因此就會涉及到模型合并的問題,也就是集成學(xué)習(xí),這個話題主要是13年以后開始比較火。考慮到無監(jiān)督學(xué)習(xí)的特性,集成異常檢測(outlier ensembles)[15] 一般是平行式(parallellearning)的比如求平均,bagging類型為主流,而非序列式(sequential)如boosting。現(xiàn)在的主流集成異常檢測因此性能還是有限的,畢竟取多個模型的均值或者最大值是現(xiàn)階段的可行方法。如果要做序列式或者要在集成過程中做評估,那就需要生成偽標(biāo)簽[16],這類方法現(xiàn)在依然是heuristic的,缺乏性能保證。如果要做stacking可能更為復(fù)雜,現(xiàn)在只有一些非常初步的探索[11]。
前文說了,異常檢測往往是無監(jiān)督學(xué)習(xí),因此這些方法都是heuristic,一般缺乏性能保障。假設(shè)運氣特別好,我們發(fā)現(xiàn)了一個有效的異常檢測算法暫時不為性能擔(dān)憂,那么就會自然的想「異常檢測的規(guī)則是什么,如何解釋」。據(jù)我所知現(xiàn)在關(guān)于可解釋性的主流方法還是在局部空間或者contextual based 方法[17][18],也有提供直觀圖像的方法[19],也有通過找subspace的方法[20],通過找低維空間(或者特征)來解釋的(其實也屬于前面的方法)。大部分解釋性主要是考慮如何調(diào)整特征使得一個異常點成為正常點,那么這就是決定因素。另外一種思路就是不如我們讓人類幫著解釋吧,這就進入了眾包(crowd sourcing)和主動學(xué)習(xí)(active learning)的范圍,讓人類在修正錯誤預(yù)測的同時同時提供一定的解釋[21],未來和HCI的交叉是大趨勢。
在互動型異常檢測(interactive)的范疇下,我們也可以把異常檢測看做是一個排序問題(根據(jù)異常值/確定性的)排序,因此傳統(tǒng)的排序算法也被引入了這個范圍[22]。不難看出,這可以被看做是一個exploration和exploitation的問題,那么還可以考慮bandit的算法[23]比如UCB等等。
說到bandit問題,我們就會想到貝葉斯優(yōu)化,這就引入了另一個問題,就是我們用貝葉斯做自動調(diào)參,能不能把這個方法應(yīng)用在異常檢測調(diào)參中呢?難點在于如何在無監(jiān)督或者說半監(jiān)督的范疇下達成這個目標(biāo),可能需要和前面提到的interactive或者active learning相結(jié)合。
另一個常見的問題就是異常特征隨時間的變化,也就是在evolving data上的異常檢測[24][25]。在更傳統(tǒng)的機器學(xué)習(xí)領(lǐng)域,我們一般把這個叫做concept drift。
這些都是最純粹的異常檢測算法層面上的問題,拓展到文字[26]、結(jié)構(gòu)數(shù)據(jù)、圖像、時間序列[27]等不同的范疇上每個問題都又有大量的可做的內(nèi)容,所以可以做的方向很多。
以我粗淺的了解,異常檢測能做的方向很多,盡管大多都不容易啃,畢竟無監(jiān)督、不平衡的假設(shè)太強了,正如前文我提到了可以把異常檢測看做是一種「無監(jiān)督或者弱監(jiān)督下的非平衡數(shù)據(jù)多分類分體并要求一定的解釋性」。現(xiàn)階段無監(jiān)督的各個方向已經(jīng)有了很多探索,更大的機會可能在半監(jiān)督/強化學(xué)習(xí)/弱監(jiān)督上,畢竟監(jiān)督學(xué)習(xí)的成本對于異常檢測而言可能還是太高了一點。當(dāng)然,這只是我的個人理解,有很強的主觀性,請謹(jǐn)慎參考(且以防撞車)。
以上提到的所有文章(PDF)與參考均可以在GitHub的資料匯總Repo上找到,歡迎關(guān)注、訂閱、Star~
異常檢測資源匯總:https://github.com/yzhao062/anomaly-detection-resources
參考
張戎@知乎
筆者做異常檢測也有兩三年了,異常檢測在工業(yè)界中的案例是比較多的。之前使用的時候,主要在業(yè)務(wù)安全和業(yè)務(wù)運維兩個場景上面遇到過異常檢測,不過雖然都是異常檢測,但是他們所使用的技巧和方法是截然不同的。
通常來說,在業(yè)務(wù)安全領(lǐng)域通常是為了發(fā)現(xiàn)異常行為,異常用戶,防止詐騙等等,這種時候通常都會基于各種信息做出各種各樣的特征,然后通過異常檢測算法來判斷異常。在業(yè)務(wù)運維領(lǐng)域,有著各種各樣的服務(wù)器數(shù)據(jù),流量數(shù)據(jù),端口數(shù)據(jù),需要使用時間序列異常檢測來判斷是否出了故障。在業(yè)務(wù)運維領(lǐng)域,同樣有著多維的數(shù)據(jù),需要從多維數(shù)據(jù)里面定位出異常的根因,這就是所謂的“根因分析”。
如果是在單維度數(shù)據(jù)集下,大家能夠使用的就是 3-sigma 原理已經(jīng)它的一些變種形式,例如 Grubbs 算法,T Test 等等。在高維度領(lǐng)域,通常來說有兩種處理方式。一種是降低到單維度,然后使用 3-sigma 之類的算法判斷新的序列是否異常,從而推斷出原始序列是否異常。另外一種方法是在高維度上直接建立模型,然后判斷高維點集是否異常。
高維度異常檢測算法比較多,無論是 PCA 建立重構(gòu)誤差,還是 AutoEncoder 來算誤差分?jǐn)?shù),或者是 Isolation Forest,OneClass SVM 等算法,都能夠做到異常檢測。
不過,在業(yè)務(wù)的實際場景下,異常點的檢測有的時候只是一種輔助手段,幫助機器學(xué)習(xí)從業(yè)者迅速定位異常。但是,如果要保證效果和輸出的話,最好是在定位了異常之后,把數(shù)據(jù)保存下來當(dāng)做樣本和標(biāo)簽,然后建立一個有監(jiān)督學(xué)習(xí)的模型。這樣通常來說就能夠解決不少的問題。在業(yè)務(wù)安全領(lǐng)域或者業(yè)務(wù)運維領(lǐng)域,通常的套路都是:
原始數(shù)據(jù) -> 無監(jiān)督算法 -> 人工標(biāo)注 -> 特征工程 -> 有監(jiān)督算法
這樣的多層架構(gòu)體系。
通常來說,推薦系統(tǒng)只有特征工程和有監(jiān)督算法這樣的架構(gòu)體系,因為沒有人工標(biāo)注的成本。而業(yè)務(wù)安全和業(yè)務(wù)運維的話,其實標(biāo)注成本就會相對偏高,但是如果使用無監(jiān)督算法,就可以減緩人工標(biāo)注的成本。這里的無監(jiān)督算法不僅可以使用異常檢測算法,還可以使用各種各樣的聚類算法和圖算法。圖算法其實就包括 PageRank 和 FastUnfolding 等算法。
好消息!
小白學(xué)視覺知識星球
開始面向外開放啦??????
下載1:OpenCV-Contrib擴展模塊中文版教程 在「小白學(xué)視覺」公眾號后臺回復(fù):擴展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。 下載2:Python視覺實戰(zhàn)項目52講 在「小白學(xué)視覺」公眾號后臺回復(fù):Python視覺實戰(zhàn)項目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實戰(zhàn)項目,助力快速學(xué)校計算機視覺。 下載3:OpenCV實戰(zhàn)項目20講 在「小白學(xué)視覺」公眾號后臺回復(fù):OpenCV實戰(zhàn)項目20講,即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學(xué)習(xí)進階。 交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~

