概述
2021 - Anomaly Detection (1_7)_哔哩哔哩_bilibili
異常偵測就是、我們要讓機器可以知道、我不知道這件事情
那在這門課裡面呢、我們通常用上標、來表示一個完整的東西、用下标,來表示一個完整東西的其中一個部份,
novelty这个词汇, 顯然是要找一個新的東西,比较正面的意思
什麼叫做像訓練資料呢、这就是Anomaly Detection里需要探讨的问题。不同的方法,它就用不同的方式來定義similar,
这里强调一下,這個所謂的異常、我們到底要檢測出什麼東西、其實是取決於你提供給機器什么样的训练资料,
那可能正常的交易它的金額都比較小、頻率都比較低、那如果今天在短時間內連續非常高額的消費、他可能就是一個異常的行為、
你的訓練資料就是正常的細胞、正常細胞它長什麼樣子、它的細胞核的大小、它的分裂的頻率等等、
why not 二元分类?
- 反正不是寶可夢的東西太多了、无法穷举所有可能不是寶可夢的东西,你根本沒有辦法知道你整個class 2整個異常的資料的分佈,异常资料无法视为一个类别,因为它的变化太大了,
- 异常data难收集,
Anomaly Detection是一個獨立的研究主題、是一個仍然尚待研究的問題、
异常检测问题大致分成两类,
一类是有label的,
有label你就可以拿來訓練一個classifier、教機器說 看到這些x、能不能够预测出它對應的ŷ是什麼
怎么訓練一個classifier?我們上課有講過說 用generative model來做classification、也說過用logistic regression來做classification、还讲过用deep learning來做classification,就可以選一個你喜歡的技術,来訓練一個classifier,
但是在這邊的label裡面,並沒有任何一種label叫做unknown,
那如果 这个Classifier训练好后,如果看到训练数据中不存在的数据,那么可以为其打上【unknown】的标签。open-set recognition
那如果你是說 你有一個classifier,你希望這個classifier具有、看到不知道的東西 它會標上unknown的能力,那這個問題 它是異常偵測其中一種,又叫做open-set recognition
就是说,在做辨识的时候,你的model是open的、它可以辨識它沒有看過的東西、沒有看過的東西 它就貼上一個標籤說、这是没有看过的
另一类是有unlabel的,
又分为两类,clean和polluted,更多的時候 我們遇到的狀況是,我们手上的训练资料没有办法保证完全clean,可能有非常少量的訓練資料 比如說1%的、0.1%的訓練資料 它其實仍然是異常的
Case1:with classifier
判断卡通人物是否来自辛普森家庭
现在有数据及标签:
然后要训练分类器:
Source of model: https://www.kaggle.com/alexattia/the-simpsons-characters-dataset/
有人做了这个分类器,准确率还不错:96%:
修改这个分类器,输入人物,输出是属于辛普森家庭中的哪一个,还要输出对分类结果的信心分数 。
然后根据信心分数来进行异常检测,
估计信心分数
由于Classifier的输出实际上是一个分布(softmax),所以会有:
如果丢一张怪怪的图片:
也就是说softmax输出的最大值就是信心分数(上图中的红框)。
或者根据distribution就可以算乱度,算entropy,算分类机率的熵,熵越大说明越混乱,越无法确定分类。
其实用哪种方法没有很大差别,这里用第一种,方便:
一些例子:
剛才那kaggel連結裡面 ,附了一个辛普森家庭人物的testing set,裡面有數千張辛普森家族的人物
把所有数据丢到当前Classifier中得到的信心分数结果如下图:
可以看到结果是非常集中的,当然也有错误的地方(红色)
丢随意的动漫人物进去,丢了1万5千张,只有10%左右是识别为辛普森家族人物。多数输入的信心分数比较低。
上面用classifier的信心分数,方法简单实用,是实作的首选,
假如你今天要做異常偵測問題、你手上又有一個現成的classifier、其實這應該是你第一個要嘗試的baseline、雖然它非常簡單、但它不見得performance很差
当然还有其他更好的方法,舉例來說 你今天在訓練一個neural network的時候、你可以直接教neural network 输出 信心分数,这个技术参考文献,
文献:Terrance DeVries, Graham W. Taylor, Learning Confidence for Out-of-Distribution Detection in Neural Networks, arXiv, 2018
那在這篇paper裡面 它的想法是這樣、我們剛才是先訓練了一個classifier以後、从classifier的输出得到一個信心分數,有一些技术是我們在訓練那個classifier的時候,我们就训练这个classifier它不只是可以做分類這件事情,還會直接output一個分類的信心分數,
Example Framework
你今天需要development set 才能夠來調一些hyperparameter,你才不會overfit在你的testing data上
(图片x是要带标签的:是否来自辛普森家族)
特别强调,训练的数据都是辛普森家族,label是哪一個人物
但是development set要模仿testing set,label需要有,是和不是辛普森家族的人物,不需要知道具体是哪个人物,
train set(训练集),development set(开发集) ,test set(测试集)的区别
training set:训练集是用来训练模型的。遵循训练集大,开发,测试集小的特点,占了所有数据的绝大部分。
development set:用来对训练集训练出来的模型进行测试,通过测试结果来不断地优化模型。
test set:在训练结束后,对训练出的模型进行一次最终的评估所用的数据集。
注意:
所有数据之间都应该属于同分布,才能进行训练测试,如果不同分布,则不能进行训练测试
Evaluation
下面讲 如何计算一个异常侦测系统的效能好坏,
上面的Dev Set部分要根据performance of f(x)来调整 λ ,下面来看怎么做:
Dev Set:100 Simpsons,5 anomalies(红色).
我们看到 最右边魔法少女奈叶的信心分数是0.998,这个分类器很烂?但是 在1.0这个bar里,有75%以上的图,它的confidence都是高於0.998%的,你發現多數辛普森家族的人物,它可以得到的confidence都是1這樣,
在一个二元分类问题里,我们都是用正确率来衡量一个系统的好坏,给系统一张图,如果它的答案是對的 就得1分,如果是錯的 就得0分
但是在异常侦测系统里,正确率并不是一个好的评估方式,因为 往往異常的data和正常的data比例的分布是非常的懸殊的,
其他的例子里可能更悬殊,假設你今天是要做詐欺偵測,可能一百筆 一千筆 一萬筆交易裡面,都不見得有一筆是有詐欺的行為
在異常偵測的問題裡面 有兩種錯誤
如果现在λ在如下图所示的位置:
那么我们可以根据异常值和正常值,是否被发现来做表格,
(False alarm)正常判断为错误
(Missing)错误未判断
把λ 换个地方
这两个系统哪个好要取决我们对False alarm或是Missing的容忍度。
我们可以把容忍度做Cost table:
那在不同的情境下 不同的任務、其實你會有不同的cost table、例如癌症检测 可能就用table B比较合适。
所以今天anomaly detection的系統要怎麼衡量、取決於你今天要拿這個系統來做些什麼事
那在文獻上其實還有很多很多衡量異常偵測系統的measure,舉例來說 一個常用的measure叫做AUC,这种方式不需要決定threshold、它是看你把testing data裡面、所有的結果 根據分數做一個排序、由高分排到低分,由最可能是異常的排到最不可能是異常的,它直接根據這個排序,來決定說 這個結果到底是好還是不好
总之,异常侦测 没法用一般的方法来评估系统的好坏。
用classifier來做異常偵測的時候,有可能會遇到的問題
理想的分类器是这样子的,例如 猫狗分类器,
如果有些动物没有猫的特征也没有狗的特征:机器可能会把这些东西放在边界上,信心分数会比较低,你就知道說這些圖片不是貓跟狗,是异常的。
但是有些动物有虽然不是猫狗但是有猫狗的特征,例如老虎和狼。而且老虎比猫还要像猫,狼比狗还要像狗。所以老虎和狼在分类器上的信心分数比猫和狗还高。
回到辛普森分类的例子,如果把二次元人物和老师的头像改变一下,结果是:
意思就是如果分类器是按黄色来进行区分是否辛普森家族人物的时候,如果有些图片不是辛普森人物,但是也明显带有黄色的特征,就会分类出错,如何解决这个问题?列一些文献给大家参考。
那一個解決的方法是說、假設我們可以搜集到一些異常的資料、可以教机器,看到正常的資料的時候不要只學做分類這件事,要一边做分类,一边学看到正常的资料 confidence就高, 看到異常的資料给低的confidence,根據你怎麼計算confidence 比如說 如果你是用entropy來計算confidence 的話,看到異常的資料 你就要給他高的entropy,但问题是不容易搜集到anomaly的data,
所以,有人想出了神奇的解决方法,训练一个生成模型生成一些异常data。比如说GAN可以拿來生成data,为了防止生成的data太像正常的data,要做一些特别的限制,讓你生成出來的資料有點像真的,但是又要跟真的又沒有很像,之后就可以套用上面的方法,來訓練你的classifier
文献:
Kimin Lee, Honglak Lee, Kibok Lee, Jinwoo Shin, Training Confidencecalibrated Classifiers for Detecting Out-of-Distribution Samples, ICLR 2018)
Mark Kliger, Shachar Fleishman, Novelty Detection with GAN, arXiv, 2018)
Case 2: Without Labels
Twitch Plays Pokémon
這是一個2014年2月的時候开始的一个活动,有人在twitch上开了一个宝可梦的游戏,全世界的人都可以連上去一起玩,最高记录8w個人在同時玩,
網路小白英文發音叫做troll,Troll的英文意思 其實是山怪的意思,山怪其實在哈利波特裡面也有出現,小白通常長這個樣子
假设想要通关的玩家的操作是正常数据,能否使用异常检测找到Troll?
下面看如何解决这个问题
Problem Formulation
这里的训练资料x, 每个x 是一个玩家
要用 机器学习来解,首先 每一个玩家要先表示成一个feature vector,
例如第一维x_1 可以表示为说垃圾话的频率;
說垃圾話的意思就是說 在這個遊戲裡面,只有某些輸入可以操控游戏,比如說上下左右 AB start,講其他的都是多餘的 都是垃圾話,所以我們會統計一個玩家,他在過去某一段時間內說垃圾話的頻率,
第二维x_2 可以表示为无政府状态下的发言频率。
这个游戏里有两个mode,民主状态 和 无政府状态,
民主状态:每隔20秒 機器統計在這20秒內、最多人輸入的指令 然後執行那個指令。
無政府狀態(随机模式)就是系統不斷的選、他現在看到輸入的指令、隨機選一個他可以process的、
這個其實是一個熱門研究的問題、我就從github上找到一個資料、這個是叫 一個叫Albert的人提供的,李飞飞的学生,
现在我们有大量的输入,但是没有标签y,没有classifier了,我们可以建立一个几率模型P ( x ) ,用来表示某一个玩家操作发生的几率,然后根据P(x)来设置阈值看玩家是否是异常。
然后把所有玩家的x1,x2 的分布可视化出来:
有研究表明,在民主状态下,troll倾向于发起操作。洗掉别人发言,
从图中可以看到,P(x)大的玩家可能是正常玩家(左上角的点),反之是异常玩家。
下面要像更加精确的用数字来表达这个事情,就要用的MLE:
θ是probability density function的參數,θ的值决定了这个func.的形状,我们看到的这些数据,是由背后的probability density function生成出来的,现在是要找出这个背后的func.
所謂likelihood的意思是說,根據我現在手上的probability density function,如图的data set 被产生出来的几率有多大,
那這邊嚴格說起來、這個fθ(x) 它並不是機率、它的output是probability的density,其实他output值也不是介於0到1之間、它還是有可能大於1的、
那如果你機率都忘得差不多了、你就把它當作是機率就好、
这个likelihood是由θ控制的, 而我们要找θ,使得likelihood max
我们假设这个probability density function是Gaussian Distribution
它輸入這個空間裡面的一個向量x,它的輸出就是這一個x被sample到的機率
why用Gaussian Distribution?非常常用,有時候你覺得你的feature看起來even不是Gaussian,这里它的分佈還是有限制在0到1之間的,Gaussian才沒有這樣的限制
Andrew Ng 在講這個anomaly detection的時候,。明明data看起來分佈就不是Gaussian,
那它就把它的所有的feature都取log,或它去開根號,,讓它看起來變成像是Gaussian,花了一整段影片在讲,他怎么对那些feature做种种变化,讓它變成看起來像Gaussian(强假设)
注:当然,也可以假设参数θ 不是高斯分布产生的,可以是更加复杂的网络产生的。
μ∗,Σ∗可以直接根据MLE的公式算出来,直接贴结果:
最后就可以把x代入下面的判断条件,来决定是否是异常玩家。
λ其实就是图上等高线的其中一条线,threshold λ是根据development set決定的,
我们可以考虑不止两个维度,你可以把想到的,觉得可能跟判断一个玩家是正常的還是異常的,有關的各種feature 通通把它加進去:
由于一般算出来的分数都非常非常小,所以在前面加上log。
以上使用一个generative model,用一个高斯分布来做异常侦测,还有其他方法,比如 可以用deep learning based方法,可以訓練一個Auto-encoder来做这件事,
Outlook: Auto-encoder
这个Auto-encoder在训练时,它看過的都是辛普森的圖片、那它特別擅長還原辛普森的圖片
还原度越低,越有可能是异常的图片,
那其實其它machine learning的技術、也有做anomaly detection的方法、
那在SVM這樣的這系列技術裡面、有一招叫做one-class SVM、它只需要正常的data 就可以訓練一個SVM、讓你分類正常的data跟異常的data
或者在 大家很常用的random forest,在decision tree based的方法裡面有一招叫做Isolated Forest,它跟one-class SVM做的事很像,給它正常的資料、它可以訓練出一個模型告訴你說,異常資料長什麼樣子
最后
以上就是真实冰淇淋为你收集整理的2021 Anomaly Detection (李宏毅Case1:with classifierCase 2: Without Labels的全部内容,希望文章能够帮你解决2021 Anomaly Detection (李宏毅Case1:with classifierCase 2: Without Labels所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复