1. 程式人生 > 其它 >第三門課 結構化機器學習專案-筆記

第三門課 結構化機器學習專案-筆記

正交化(Orthogonalization)

正交化的概念是指,你可以想出一個維度,這個維度你想做的是控制轉向角,還有另一個維度來控制你的速度,那麼你就需要一個旋鈕儘量只控制轉向角,另一個旋鈕,在這個開車的例子裡其實是油門和剎車控制了你的速度。但如果你有一個控制旋鈕將兩者混在一起,比如說這樣一個控制裝置同時影響你的轉向角和速度,同時改變了兩個性質,那麼就很難令你的車子以想要的速度和角度前進。然而正交化之後,正交意味著互成90度。設計出正交化的控制裝置,最理想的情況是和你實際想控制的性質一致,這樣你調整引數時就容易得多。可以單獨調整轉向角,還有你的油門和剎車,令車子以你想要的方式運動。

單一數字評估指標(Single number evaluation metric)

調和平均數.\(\frac{2}{\frac{1}{P} +\frac{1}{R}}=F_{1}\) F1分數

滿足和優化指標(Satisficing and optimizing metrics)

比如模型的精準度和速度。優化指標就是精準度,當然是越高越好(不過擬合的情況下),速度也很重要,但是達到一定的範圍內就好了。比如一個模型執行10秒才能出結果你覺得太慢了。1秒以內出結果這樣體驗比較好,但至於1秒內是800ms 600ms 甚至是10ms其實差距不大,都在可接受(1秒內)的範圍內所以不一定要優化那麼極致(夠用就行),這種就是滿足指標,滿足一個閾值就好。
所以更一般地說,如果你要考慮\(N\)個指標,有時候選擇其中一個指標做為優化指標是合理的。所以你想盡量優化那個指標,然後剩下\(N-1\)

個指標都是滿足指標,意味著只要它們達到一定閾值,例如執行時間快於100毫秒,但只要達到一定的閾值,你不在乎它超過那個門檻之後的表現,但它們必須達到這個門檻。

訓練/開發/測試集劃分(Train/dev/test distributions)

訓練集(training set)用於執行你的學習演算法。
開發(dev)集也叫做開發集(development set),有時稱為保留交叉驗證集(hold out cross validation set)。然後,機器學習中的工作流程是,你嘗試很多思路,用訓練集訓練不同的模型,然後使用開發集來評估不同的思路,然後選擇一個,然後不斷迭代去改善開發集的效能,直到最後你可以得到一個令你滿意的成本,然後你再用測試集去評估。
測試集(test set)用於評估演算法的效能,但不會據此改變學習演算法或引數。

  1. 開發集和測試集來自同一分佈
  2. 在設立開發集和測試集時,要選擇這樣的開發集和測試集,能夠反映你未來會得到的資料

設立開發集以及評估指標,真的就定義了你要瞄準的目標。我們希望通過在同一分佈中設立開發集和測試集,你就可以瞄準你所希望的機器學習團隊瞄準的目標。而設立訓練集的方式則會影響你逼近那個目標有多快.

開發集和測試集的大小(Size of dev and test sets)

測試集的目的是評估你最終的成本偏差,你只需要設立足夠大的測試集,可以用來這麼評估就行了
比如說你有1百萬個訓練樣本,這樣分可能更合理,98%作為訓練集,1%開發集,1%測試集

什麼時候該改變開發/測試集和指標?(When to change dev/test sets and metrics)

根據實際業務需求。總體方針就是,如果你當前的指標和當前用來評估的資料和你真正關心必須做好的事情關係不大,那就應該更改你的指標或者你的開發測試集,讓它們能更夠好地反映你的演算法需要處理好的資料。指標也一樣。

為什麼是人的表現?(Why human-level performance?)

首先有個概念貝葉斯最優錯誤率一般認為是理論上可能達到的最優錯誤率,就是說沒有任何辦法設計出一個\(X\)\(Y\)的函式,讓它能夠超過一定的準確度。
例如,對於語音識別來說,如果\(X\)是音訊片段,有些音訊就是這麼嘈雜,基本不可能知道說的是什麼,所以完美的準確率可能不是100%。或者對於貓圖識別來說,也許一些影象非常模糊,不管是人類還是機器,都無法判斷該圖片中是否有貓。所以,完美的準確度可能不是100%。
人類相當擅長的任務,包括看圖識別事物,聽寫音訊,或閱讀語言,人類一般很擅長處理這些自然資料。對於人類擅長的任務,錯誤率和貝葉斯最優錯誤率很接近,所以,當演算法超越人類的表現之後也許沒有太多的空間繼續改善了。但第二個原因是,只要你的表現比人類的表現更差,那麼實際上可以使用某些工具來提高效能。一旦你超越了人類的表現,這些工具就沒那麼好用了。
只要你的機器學習演算法比人類差,你就可以從讓人幫你標記資料,你可以讓人幫忙或者花錢請人幫你標記例子,這樣你就有更多的資料可以餵給學習演算法。而一旦你的演算法做得比人類好,這三種策略(人為提供標註資料,分析演算法錯誤為什麼人可以做對,偏差方差優化分析)就很難利用了。所以這可能是另一個和人類表現比較的好處,特別是在人類做得很好的任務上。

可避免偏差(Avoidable bias)

錨定一個貝葉斯錯誤率,貝葉斯錯誤率可以錨定一個人類,或者人類專家,或者人類專家組。具體的錨定物件根據業務需求。
然後這個錨定的貝葉斯錯誤率減去訓練誤差就是可避免偏差。如果偏差過大就優化偏差(欠擬合,修改優化演算法,更大的神經網路。)
如果開發集的誤差和訓練的誤差的差更大就是方差更大,優化方差(過擬合,採用更多訓練資料,Dropout,正則化。)

理解人的表現(Understanding human-level performance)

錨定一個貝葉斯錯誤率,貝葉斯錯誤率可以錨定一個人類,或者人類專家,或者人類專家組。具體的錨定物件根據業務需求。
對人類水平有大概的估計可以讓你做出對貝葉斯錯誤率的估計,這樣可以讓你更快地作出決定是否應該專注於減少演算法的偏差,或者減少演算法的方差。這個決策技巧通常很有效,直到你的系統性能開始超越人類,那麼你對貝葉斯錯誤率的估計就不再準確了,但這些技巧還是可以幫你做出明確的決定。

超過人的表現(Surpassing human- level performance)

一個人類專家團和單個人類專家的表現和以前一樣,但你的演算法可以得到0.3%訓練錯誤率,還有0.4%開發錯誤率。現在,可避免偏差是什麼呢?現在其實很難回答,事實上你的訓練錯誤率是0.3%,這是否意味著你過擬合了0.2%,或者說貝葉斯錯誤率其實是0.1%呢?或者也許貝葉斯錯誤率是0.2%?或者貝葉斯錯誤率是0.3%呢?你真的不知道。但是基於本例中給出的資訊,你實際上沒有足夠的資訊來判斷優化你的演算法時應該專注減少偏差還是減少方差,這樣你取得進展的效率就會降低。還有比如說,如果你的錯誤率已經比一群充分討論辯論後的人類專家更低,那麼依靠人類直覺去判斷你的演算法還能往什麼方向優化就很難了。所以在這個例子中,一旦你超過這個0.5%的門檻,要進一步優化你的機器學習問題就沒有明確的選項和前進的方向了。這並不意味著你不能取得進展,你仍然可以取得重大進展。但現有的一些工具幫助你指明方向的工具就沒那麼好用了。

改善你的模型的表現(Improving your model performance)

監督學習的兩個基本假設:

  1. 模型可以很好地適應訓練集。
  2. 訓練集的效能可以很好地推廣到開發/測試集。

所以我想要讓一個監督學習演算法達到實用,基本上希望或者假設你可以完成兩件事情。首先,你的演算法對訓練集的擬合很好,這可以看成是你能做到可避免偏差很低。還有第二件事你可以做好的是,在訓練集中做得很好,然後推廣到開發集和測試集也很好,這就是說方差不是太大。
就是期望泛化誤差 = 偏差 + 方差 + 噪聲
至於怎麼改善,手段很多。。。

如果你想用盡一切辦法減少可避免偏差,我建議試試這樣的策略:比如使用規模更大的模型,這樣演算法在訓練集上的表現會更好,或者訓練更久。使用更好的優化演算法,比如說加入momentum或者RMSprop,或者使用更好的演算法,比如Adam。你還可以試試尋找更好的新神經網路架構,或者說更好的超引數。這些手段包羅萬有,你可以改變啟用函式,改變層數或者隱藏單位數,雖然你這麼做可能會讓模型規模變大。或者試用其他模型,其他架構,如迴圈神經網路和卷積神經網路。在之後的課程裡我們會詳細介紹的,新的神經網路架構能否更好地擬合你的訓練集,有時也很難預先判斷,但有時換架構可能會得到好得多的結果。

另外當你發現方差是個問題時,你可以試用很多技巧,包括以下這些:你可以收集更多資料,因為收集更多資料去訓練可以幫你更好地推廣到系統看不到的開發集資料。你可以嘗試正則化,dropout正則化或者我們在之前課程中提到的資料增強。同時你也可以試用不同的神經網路架構,超引數搜尋,看看能不能幫助你,找到一個更適合你的問題的神經網路架構。