這一節(jié)我們主要討論機器學(xué)習(xí)具體應(yīng)用中的一些建議辣往,大部分內(nèi)容都不會涉及到數(shù)學(xué)市栗,但卻可能是最難理解的一部分。另外本文的部分內(nèi)容可能有一些爭議项棠,部分內(nèi)容也不適用于學(xué)術(shù)研究。
機器學(xué)習(xí)算法的診斷
我們來思考如下這個問題:在垃圾郵件分類問題中挎峦,我們從50000+的詞匯表中選擇了100個單詞作為特征香追,然后選擇貝葉斯邏輯回歸(Bayesian logistic regression)模型,利用梯度下降法進行訓(xùn)練坦胶,但是訓(xùn)練得到的結(jié)果有20%的誤差透典,這顯然是不能接受的。
這個模型的目標(biāo)函數(shù)如下:
那么我們下一步應(yīng)該如何優(yōu)化呢顿苇?通常我們可以有如下多個改進方式:
- 增加訓(xùn)練數(shù)據(jù)
- 嘗試更小的特征集合
- 嘗試更大的特征集合
- 嘗試改變特征(比如使用郵件的標(biāo)題和正文部分)
- 增加梯度下降的迭代次數(shù)
- 嘗試用牛頓方法
- 改變正則化參數(shù)λ
- 嘗試其他模型峭咒,比如SVM
這些方法都可能有用,但是挨個進行實驗非常耗時纪岁,如果碰巧解決問題也可能只是運氣好凑队。因此更好的方法是我們對算法進行診斷,并根據(jù)診斷結(jié)果進行針對性的改進幔翰。
第一個的診斷方法是判斷算法是過擬合還是欠擬合漩氨。過擬合意味著高方差,欠擬合意味著高偏差遗增。我們可以通過學(xué)習(xí)曲線(learning curve)來診斷模型到底是高方差還是高偏差的叫惊。
下圖展示的是高偏差模型的學(xué)習(xí)曲線:
可以看出,當(dāng)訓(xùn)練集個數(shù)增加時做修,測試誤差逐步減少霍狰,但是測試誤差和訓(xùn)練誤差之間仍存在較大的間隔抡草。因此增加訓(xùn)練數(shù)據(jù)可以改善模型。
下圖展示的是高方差模型的學(xué)習(xí)曲線:
可以看出蔗坯,測試誤差和訓(xùn)練誤差之間的間隔很小康震,但是它們的誤差率與理想值相差很遠。
第二個診斷方法是關(guān)于優(yōu)化算法和優(yōu)化目標(biāo)宾濒。這里我們繼續(xù)接著剛才的例子討論:假設(shè)通過BLR(貝葉斯邏輯回歸)算法在垃圾郵件上的誤差是2%签杈,在正常郵件上的誤差也是2%(對于正常郵件來說,這個誤差是不可接受的)鼎兽,而通過SVM算法在垃圾郵件上的誤差是10%,在正常郵件上的誤差是0.01%(對于正常郵件來說铣除,這個誤差是可以接受的)谚咬,但是我們傾向于使用BLR算法,因為BLR的計算效率更高尚粘。我們接下來應(yīng)該怎么辦择卦?
令SVM的參數(shù)為θSVM,BLR的參數(shù)為θBLR郎嫁。其實我們真正在乎的是加權(quán)準(zhǔn)確率(weighted accuracy):
在上面的例子中秉继,我們有:a(θSVM) > a(θBLR)
BLR的優(yōu)化目標(biāo)J(θ)是:
所以我們接下來診斷的方法就是比較J(θSVM)和J(θBLR)的大小。
第一種情況:a(θSVM) > a(θBLR)泽铛,J(θSVM) > J(θBLR)尚辑。BLR的目標(biāo)是最大化J(θ),但是現(xiàn)在BLR沒能做到這點盔腔,因此問題在于優(yōu)化算法杠茬,有可能算法還沒有達到收斂。
第二種情況:a(θSVM) > a(θBLR)弛随,J(θSVM) <= J(θBLR)瓢喉。BLR確實做到了最大化J(θ),但是BLR的加權(quán)準(zhǔn)確率不如SVM舀透,因此問題在于優(yōu)化目標(biāo)栓票,J(θ)并不能很好地代表a(θ)。
因此回過頭來看之前列的改進方式愕够,每個改進方式其實都是在優(yōu)化某一方面走贪,具體描述如下:
- 增加訓(xùn)練數(shù)據(jù):解決高方差
- 嘗試更小的特征集合:解決高方差
- 嘗試更大的特征集合:解決高偏差
- 嘗試改變特征(比如使用郵件的標(biāo)題和正文部分):解決高偏差
- 增加梯度下降的迭代次數(shù):解決優(yōu)化算法問題
- 嘗試用牛頓方法:解決優(yōu)化算法問題
- 改變正則化參數(shù)λ:解決優(yōu)化目標(biāo)問題
- 嘗試其他模型,比如SVM:解決優(yōu)化目標(biāo)問題
通過對算法進行診斷惑芭,我們可以有針對性地提出解決方案厉斟,從而避免無意義地進行錯誤的嘗試。
誤差分析和銷蝕分析
很多機器學(xué)習(xí)應(yīng)用中會包含多個組成部分强衡,各個部分之間形成一個整體的“管道(pipeline)”擦秽。比如下圖展示了一個從圖像中進行面部識別的管道圖:
那么我們?nèi)绾沃谰烤鼓膫€組件(component)對整體的貢獻率最大呢?
我們可以使用兩種方法來分析這個問題。第一個方法是誤差分析(error analysis)感挥,誤差分析是指從最基礎(chǔ)的模型開始缩搅,依次增加一個組件,看每個組件對準(zhǔn)確率的提升情況触幼。比如對這個例子來說硼瓣,我們可以分析如下:
組件 | 準(zhǔn)確率 |
---|---|
整體系統(tǒng) | 85% |
預(yù)處理(去除背景) | 85.1% |
面部識別 | 91% |
分割眼睛 | 95% |
分割鼻子 | 96% |
分割嘴巴 | 97% |
邏輯回歸 | 100% |
由此可見,面部識別和分割眼睛這兩個組件對整體的貢獻率較大置谦。
第二個方法是銷蝕分析(ablative analysis)堂鲤。銷蝕分析的步驟剛好相反,每次從完整系統(tǒng)中去除一個組件媒峡,看每個組件對準(zhǔn)確率的降低情況瘟栖。比如在一個垃圾郵件分類系統(tǒng)里,我們可以做如下分析:
組件 | 準(zhǔn)確率 |
---|---|
整體系統(tǒng) | 99.9% |
拼寫檢查 | 99.0% |
發(fā)送方主機特征 | 98.9% |
郵件頭部特征 | 98.9% |
郵件文本解析器特征 | 95% |
Javascript解析器 | 94.5% |
圖像特征 | 94% |
由此可見谅阿,郵件文本解析器特征極大地提升了準(zhǔn)確率半哟,而郵件頭部特征則對準(zhǔn)確率幾乎沒有什么幫助。
如何上手一個機器學(xué)習(xí)問題
通常我們面對一個機器學(xué)習(xí)問題签餐,可以有如下兩種思路:
思路1:仔細設(shè)計(Careful design)
- 花較長的時間設(shè)計出最好的特征寓涨,收集到最好的數(shù)據(jù),建造出最好的算法架構(gòu)
- 實現(xiàn)這個算法并希望它可以成功
- 優(yōu)點:可能找到更新氯檐,更優(yōu)雅的學(xué)習(xí)算法戒良;適合用于學(xué)術(shù)研究
思路2:快速迭代(Build-and-fix)
- 先快速做一個可用版本
- 對算法進行誤差分析和診斷,找到優(yōu)化的方向并進行優(yōu)化
- 優(yōu)點:可以更快地將算法應(yīng)用到實際場景中
另外還有一個建議:在項目的早期階段冠摄,我們通常并不清楚系統(tǒng)每個部分的實現(xiàn)難度蔬墩,因此我們需要避免進行過早優(yōu)化(premature optimization)。
總結(jié)
- 通過對算法進行診斷耗拓,可以幫助我們確定優(yōu)化方向拇颅,從而避免無意義地進行錯誤的嘗試
- 誤差分析和銷蝕分析可以幫助我們確定一個系統(tǒng)中哪個組件的貢獻率最大
- 應(yīng)用機器學(xué)習(xí)的兩種方法:仔細設(shè)計和快速迭代;仔細設(shè)計適合用于學(xué)術(shù)研究乔询,但是要避免過早優(yōu)化的風(fēng)險