機器學習中穩定性風險
參考資料:如何看待機器學習中的"“穩定性”"?2017-12-07 阿薩姆 AI研習社
1.下溢(Underflow)和上溢(Overflow)
屬于計算穩定性。顧名思義,溢出是代表内容超過了容器的極限。在機器學習當中,因為我們大量的使用機率(Probability),而機率的區間往往在0至1之間,這就導緻了下溢發生的可能性大大提高。
舉個簡單的例子,我們常常需要将多個機率相乘,從此可以看出,僅僅需要是個1%的機率相乘就可以得到一個極小的結果。而機器學習中往往是成百上千個數字相乘,類似的情況導緻計算機無法分辨0和和一個極小數之間的差別。在這種情況下,下溢可能導緻模型直接失敗。
相似的,上溢也是很容易發生的狀況。試想我們需要将多個較大的數相乘,很輕易的就可以超過計算機的上限。64位計算機的數值上限并沒有大家想象中那麼大。是以在實際模型中,我們會避免将多個機率相乘,而轉為求其對數(Log),舉例:這樣我們就成功的将多項連乘轉化為了多項加法,避免了可能發生的溢出。而對數還有更多優美的數學的性質,例如其單調遞增性,易轉化為機率模型,凸優化性等。
2.平滑(Smoothing)與0
屬于計算穩定性。和下溢和上溢類似,我們常常會發現機器學習中遇到“連乘式”中某個元素為0,導緻運算失去意義。
以樸素貝葉斯(Naive Bayes)為例:我們判别一個樣本點屬于某個分類的機率為其各項特征屬于分類的機率之乘積,即上式。但假設隻要有任何一項或者,那麼這個乘式的乘積就會為0。然而出現0往往并不是真的因為其機率為0,而僅僅是我們的訓練資料沒有出現過。
從某種意義上來說,這也屬于一種計算上的不穩定。常見的做法是用拉普拉斯平滑(Laplace Smoothing)來修正這種計算不穩。簡單的說就是人為的給每種可能性加一個例子,使其機率不再為0。
于是某個特征取特定值在分類下的機率就會被修正為:
在這種平滑處理後,我們所有乘子的取值都不會為0。相似的做法在自然語言處理(NLP)中也常常會用到,比如N-gram模型的語言模型也往往需要平滑來進行處理,此文中暫時不表。
3.算法穩定性(Algorithmic Stability)與擾動(Perturbation)
在機器學習或統計學習模型中,我們常常需要考慮算法的穩定性,即算法對于資料擾動的魯棒性。相信關注專欄的讀者應該已經聽我無數次提起過:“模型的泛化誤差由誤差(Bias)和方差(Variance)共同決定,而高方差是不穩定性的罪魁禍首”。
簡單的說就是,如果一個算法在輸入值發生微小變化時就産生了巨大的輸出變化,我們就可以說這個算法是不穩定的。此處的算法不僅僅是說機器學習算法,也代表“中間過程”所涉及的其他算法,
給出幾個具體的例子:
1)矩陣求逆(Inverting a Matrix)的過程就屬于不穩定的,我們常常會選擇避開矩陣求逆。有興趣的讀者可以進一步了解其原因。
2)另一個有趣的例子是神經網絡中的批量學習(Batch Learning),即訓練神經網絡時不一個個例子的訓練而是批量的學習訓練資料。在選擇對應的批量尺寸(Batch Size)和相對應的學習速率(Learning Rate)時需要特别小心,錯誤的學習率和尺寸會導緻不穩定的學習過程。當我們以小批量進行學習的時候,小樣本中的高方差(High Variance)導緻我們學到的梯度(Gradient)很不精确,在這種情況下,應該使用國小習速率防止我們步子邁得太大!相反的,當我們的批量尺寸選的較大時,可以放心的使用較大的速率。
3)決策樹(Decision Tree)的性質導緻它也屬于一種不穩定的模型。訓練資料中的微小變化甚至可以改變決策樹的結構,以至于我們對于決策樹的可信度總是畫上一個問号。為了解決其不穩定的問題,研究人員發明了內建學習(Ensemble Learning),其中的Bagging就通過降低其方差的方法來增強其穩定性。
4)于是為了友善,我們歸納出一部分穩定模型。比較常見的模型有各種支援向量機(SVM)的衍生模型,這也是SVM在本世紀初大火的原因的之一:)
4.獨立同分布(Independent Identically Distributed)與泛化能力(Generalization Ability)
一個機器學習模型的泛化能力指的是其在新樣本上的拟合能力。模型能夠獲得強泛化能力的資料保證就是其訓練資料是獨立同分布從母體分布上采樣而得。
假設我們有一個母體(Population),它的分布是1到100的正整數。假設我們有3個從其中中得到的采樣:我們會發現第一個采樣好像都是平方數,第二個采樣都是十的倍數,而第三個采樣似乎都是小于10的連續整數。在這種采樣下,我們可以大膽的猜測學習模型無法通過學習這三個資料集而得到良好的泛化能力…因為它們并不是獨立同分布的采樣。
那麼讀者會問了,那什麼才算是獨立同分布的采樣,首先:我們希望采樣的資料不是故意的挑選的,比如刻意挑出了一堆平方數;我們希望采樣的資料是從同一個分布裡面挑的,而不是從幾個分布中各挑幾個…
是以如何保證我們的訓練資料足夠穩定呢?筆者有幾句看起來像廢話的建議:
1)訓練資料越多越好…這樣可以降低資料中的偶然性,降低Variance
2)確定訓練資料和母體資料及預測資料來自于一個分布。舉例,你不能用統計學家的平均智商來預測生物學家的平均智商,這不公平…至于對哪一方不公平,留給讀者思考。
是以資料的穩定性的基本前提就是獨立同分布,且數量越多越好。穩定的資料可以保證模型的經驗誤差(Empirical Risk)約等于其泛化誤差(Generalization Risk)。
5.新常态: 類别不平衡
資料的穩定性(Data Stability)。越來越多的機器學習問題都會遭遇不平衡的資料分布,此處的不平衡可以指很多事情,比如二分類問題中的正例和反例數量懸殊。但需要注意的是,如果母體的分布本身就是不平衡的,千萬不要通過采樣來使其分布平衡。這樣就違反了獨立同分布的采樣!
面對天生不平衡的資料,我們有很多做法可以進行處理,比較常見的再平衡做法包括:
1)過采樣(Over-Sampling): 将資料量較少的的分類重複利用
2)欠采樣(Down-Sampling):将資料量較多的分類選擇性丢棄一部分。
在類似的情況下,往往內建學習的表現非常好,這都需要歸功于內建學習可以有效的降低Variance。讀者必須注意,無論是過采樣還是欠采樣都會帶來問題,比如過采樣容易導緻過拟合,但欠采樣其實浪費了資料。
是以不平衡往往也帶來了穩定性問題,而究其根本還是因為過高的Variance。
嚴格意義上說,資料穩定性往往特指的是時間序列(Time Series)的穩定性。而筆者此處指的是廣義上的資料,不僅僅是時間序列。從根本上說,資料的穩定性主要取決于其Variance。
評估機器學習模型的穩定性
評估機器學習模型的穩定性(Stability)和評估機器學習的表現(Performance)有本質上的不同,不能簡單的通過評估準确率這種名額來說一個機器學習穩定與否。舉個最簡單的例子,假設一個模型一會兒表現特别好,一會兒比較特别差,我們敢用這個模型于實際生産中嗎?說白了,穩定性還是由于資料的方差Variance決定。
那麼有小夥伴說了,我們或許可以用交叉驗證(cross-validation)來評估一個算法模型的穩定性。沒錯這是個正确的思路,但最大的問題,就是交叉驗證太慢了。不管是五折(5-fold)還是十折(10-fold)都需要較長的時間及重複運算。
是以我們一般通過計算學習理論(Computational Learning Theory)有時候也叫統計計算理論(Statistical Learning Theory)來對算法進行分析。介紹兩個架構供大家參考:
1)機率近似正确架構(Probably Approximately Correct, PAC)。PAC架構主要回答了一個問題:一個學習算法是否可以在多項式函數的時間複雜度下從樣本 中近似的學到一個概念,并保證誤差在一定的範圍之内。
2)界限出錯架構(Mistake Bound Framework, MBF)。MBF從另一個角度回答了一個問題,即一個學習模型在學習到正确概念前在訓練過程中會失誤多少次?