構(gòu)建機器學習項目1

Introduction to ML Strategy

  • Why ML Strategy

image.png
  • Orthogonalization

建立機器學習系統(tǒng)的挑戰(zhàn)之一是,有太多可以嘗試和改變的東西,最高效的機器學習人員,都非常清楚需要調(diào)整什么來實現(xiàn)一個預期效果, 我們稱這一過程為正交化

為保證有監(jiān)督機制的的學習系統(tǒng)良好地運行 通常你需要保證四件事準確無誤


image.png

Setting up your goal

  • Single number evaluation metric

無論你是選擇超參調(diào)優(yōu) 或是選擇不同的機器學習算法 還是在構(gòu)建機器學習系統(tǒng)時 嘗試不同的配置項 你都會發(fā)現(xiàn) 如果你有單一的量化評估指標 可以讓你知道新的方法比上一次是更好還是更糟 那么整個進程會加快很多 所以當團隊在啟動一個機器學習項目時 我常常建議 設置一個單一的量化評估指標


image.png

許多機器學習的團隊都有一個很好的驗證集 來評估精準率和召回率 和一個單一量化評估指標 有時候我們會稱之為single row number,這個評估指標可以幫你快速判斷哪個分類器更好 所以一個好的驗證集和單一量化評估指標 可以提高迭代的效率,它加速整個流程 讓你的機器學習算法不斷改進

image.png
  • Satisficing and Optimizing metric

假設除了準確率之外你還關(guān)心運行時間也就是對一個圖像分類需要多少時間,這個表中分類器A需要80毫秒(millisecond) B需要95毫秒 C需要1,500毫秒 也就是1.5秒才能甄別一個圖像 你當然可以將準確率和運行時間組合成一個 整體評價指標(overall evaluation metric) 比如說整體代價是 準確率-0.5*運行時間 但是將準確率和運行時間用這樣的公式整合 看起來有些刻意 這就像二者的線性加權(quán)和


image.png

你可能想要選擇一個分類器 它在確保運行時間的前提下提供最大準確率 比如說它甄別圖像所花費的時間 必須<=100毫秒 在這個例子中我們說準確率是優(yōu)化指標 因為你想要最大化準確率 你希望準確率盡可能的高 但是運行時間是我們我們所說的滿足指標 意味著它必須足夠好 必須<100毫秒 一旦超出即不予考慮 至少不大考慮 所以用這種方式對準確率和運行時間進行權(quán)衡或者說通盤考慮相當合理

通過定義優(yōu)化指標和滿足指標 你就有了挑選"最優(yōu)"分類器的明確方向
更一般的說 如果你有N個關(guān)心的指標 有時候選擇其中的一個加以優(yōu)化是個合理的策略 你想要它的表現(xiàn)盡可能的好 那么剩下的N-1就是滿足指標 意味著他們只要達到某種閾值(threshold)就可以了

  • Train/dev/test distributions

設置訓練集開發(fā)集的方法 或開發(fā)集和測試集, 將會對你或者你的團隊在 構(gòu)建機器學習應用的進展 中產(chǎn)生巨大的影響

例如,分類器的數(shù)據(jù)要使用這四個國家,它可能是隨機選擇的地區(qū)。 我們讓前四個地區(qū)的數(shù)據(jù)作為開發(fā)集 另外四個地區(qū)的數(shù)據(jù), 也可能是隨機選擇的 作為測試集 事實證明,這是一個非常糟糕的想法 因為在這個例子中 你的開發(fā)集和測試集來自不同的分布。
把所有數(shù)據(jù)隨機打亂然后分為開發(fā)和測試集 這樣開發(fā)和測試集都擁有了八個地區(qū)的數(shù)據(jù) 這樣開發(fā)和測試集就來自相同的分布了 分布在你擁有的所有數(shù)據(jù)中

image.png

記住一個重要的地方 設定開發(fā)集時和 你的評估方法 就像放置一個目標然后 告訴你的團隊你們的目標是什么 因為你一旦確定了開發(fā)集和評估方法 團隊就可以很快嘗試各種不同的方法 并進行實驗 很快利用開發(fā)集 和評估方法來評估選擇器并選取最好的一個

image.png

image.png

推薦的設置開發(fā)集和測試集的方法是,選擇的開發(fā)集和測試集能夠反映出 將來預計得到的數(shù)據(jù),和你認為重要的數(shù)據(jù) 特別地 這里的開發(fā)和測試集 應該來自相同的分布所以無論未來你需要預測什么樣的數(shù)據(jù) 一旦你 試著獲取這樣的數(shù)據(jù) 無論這個數(shù)據(jù)是什么 把它同時放進你的開發(fā)和測試集中 因為這樣你就瞄準了 實際上你想要瞄準的目標 團隊也可以有效的開發(fā) 可以在同一目標上表現(xiàn)良好

  • Size of the dev and test sets

深度學習中 我們擁有更大量的數(shù)據(jù) 因此使用遠小于20%或30%的數(shù)據(jù) 作為開發(fā)集或測試集是非常合理的 而且因為深度學習算法極度需要數(shù)據(jù) 在擁有大量數(shù)據(jù)的問題中 訓練集會占有更高的比例

image.png

深度學習算法極度需要數(shù)據(jù) 在擁有大量數(shù)據(jù)的問題中 訓練集會占有更高的比例 那么 測試集應該多大呢 測試集的作用 是在系統(tǒng)開發(fā)完成后 幫我們評估最終系統(tǒng)的性能 因此 測試集的大小只要足夠能 保證對系統(tǒng)整體性能評估的高置信度即可

image.png
  • When to change dev/test sets and metrics

在這種情況下 當你的評估指標 無法正確地對算法的優(yōu)劣進行排序時 就像此例中錯誤地判斷算法A更優(yōu)秀 這時你就應該 修改評估指標 可能也要修改開發(fā)集或測試集


image.png

需要記住的是 當你發(fā)現(xiàn)評估指標 無法對算法的優(yōu)劣給出正確的排序時 那么就需要考慮定義一個新的評估指標

image.png
image.png

整體的方針是 如果在你當前使用的指標和數(shù)據(jù)上 獲得很好的性能 并不對應于做好你真正關(guān)心的事情 那就需要修改你的指標 和/或你的開發(fā)集和測試集 讓它們能更好地反應 你真正需要算法做好的事情 通過評估指標和開發(fā)集 你可以 更快地對算法A還是算法B更好做出決定 可以確實地提高你和你的團隊進行迭代的速度 所以我的建議是 即便你無法定義一個完美的評估指標和開發(fā)集 你也應該盡快將它們確定下來 以此來驅(qū)動你們團隊的迭代速度 如果之后發(fā)現(xiàn)選的不好 你有了更好的想法 你完全可以再進行修改 對于大對數(shù)團隊 我不建議 在沒有任何評估指標和開發(fā)集的情況下 進行長時間的開發(fā) 因為這實際上會 降低你們團隊進行迭代和改善算法的效率

Comparing to huma-level performance

  • Why human-level performance

image.png

你若超越了人類的表現(xiàn),有時反而慢下來 我認為有兩個主要原因 為什么當你超越人類級別的表現(xiàn)時進展往往放慢

原因之一,人類級別的表現(xiàn) 在許多任務中都離貝葉斯最優(yōu)誤差不遠 人非常擅長看著圖像去分辨是否有一只貓 或收聽音頻并寫出字幕 因此,可能算法超越人類級別的表現(xiàn)之后并沒有 那么大的改善空間

第二個原因,只要你的表現(xiàn)還不如人類水平 那么實際上你可以用某些工具來提高 而當你超越了人類的水平后,就很難再有工具來提高了 就是這樣子


image.png
  • Avoidable bias

image.png
  • Understanding human-level performance

image.png

你的訓練誤差和貝葉斯誤差的差距告訴你 可以避免的偏差問題有多大 而訓練誤差和開發(fā)集誤差的差距 告訴你方差問題有多大 你的算法是否可以做到更好的泛化 我們這里討論的和 之前把訓練集誤差和0%比較有很大的不同

image.png

之前的評估了訓練集誤差 并且把它和0做了比較 那時的目的只是為了理解我們的偏差有多大 而且這只是適用于那些貝葉斯誤差本就差不多為0的問題 比如貓的識別 人類在這個問題上的表現(xiàn)幾乎完美 所以貝葉斯誤差也幾乎就是0 在這個情況下我們的分析沒有問題 但是對于哪些有噪聲的數(shù)據(jù) 比如嘈雜環(huán)境下的語音識別 甚至很難聽清楚說的是什么 并準確的轉(zhuǎn)錄出來 對于這樣的問題 有一個好的貝葉斯誤差估計 可以很好的幫助你評估可避免的偏差和方差 從而更利于做決定究竟是專注于偏差降低技術(shù) 還是方差降低技術(shù)

image.png

概括一下 人類水平表現(xiàn)的值給你提供了 對貝葉斯誤差的估計 這讓你可以更快速的決定你的算法 更應該降低偏差還是方差,這個方法在你超越人類水平表現(xiàn)之前是一直有效的 那是你可能找不到一個好的貝葉斯誤差估計了 仍然可以讓你的判斷更容易

  • Surpassing human-level performance

如果你的誤差已經(jīng)比 人類團隊通過討論和辯論才能達到的誤差還小 那么你就更難以依靠人類的直覺 來判斷還能從哪些方面來優(yōu)化 算法的性能了 在這個例子里 一旦超過了這個0.5%的閾值 對這個機器學習問題進行優(yōu)化的 方法和方向就變得不明確了 這并不意味著你無法取得任何進展 你仍然可能取得重大進展 只是用于指明方向的 工具不那么好用了

image.png
image.png
  • Improving your model performance

image.png

如果想要改善你的機器學習系統(tǒng) 建議看看你的訓練誤差和貝葉斯誤差估計值間的差距 這能讓你估計可避免偏差 換句話說 就是你需要試著在訓練集優(yōu)化到什么程度 然后再看看你的開發(fā)集誤差 和訓練集誤差間的差距 來估計你的方差問題有多大 換句話說 你需要付出多大的努力 來把你訓練集的結(jié)果推廣到開發(fā)集

image.png

無論你想把可避免偏差降低到什么程度 我會嘗試用一些策略,比如 訓練一個更大的模型 這樣你的訓練集結(jié)果會更好,又或者 訓練更長的時間 用更好的優(yōu)化算法 比如,加入Momentum或者RMS Prop 或者用更好的算法 比如Adam算法 又或者 你可以試試尋找 更好的神經(jīng)網(wǎng)絡架構(gòu)或者更準確來說 超參數(shù) 這可能包括從改變激活函數(shù) 到改變層數(shù)或者隱含單元數(shù)的各個方面 雖然你這么做可能會增大模型的規(guī)模 因為要訓練其他模型 或者模型架構(gòu) 比如循環(huán)神經(jīng)網(wǎng)絡(RNN)或者卷積神經(jīng)網(wǎng)絡(CNN)

下一步你會發(fā)現(xiàn)方差是主要問題 有很多方法你可以嘗試 包括 嘗試獲得更多的數(shù)據(jù),因為用更多的數(shù)據(jù)來訓練 可以幫助你更好地把結(jié)果推廣到開發(fā)集那些你沒有遇到過的數(shù)據(jù)上 你可以試試正則化 包括L2正則化 隨機失活法(dropout) 或者我們之前講過的數(shù)據(jù)集擴增 又或者 同樣地你還可以試試不同的神經(jīng)網(wǎng)絡架構(gòu) 或者超參數(shù)搜索 看看是否能幫你 找到一個更好的構(gòu)架更適合這個問題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容