一、機器學習的四個分支
前邊我們已經學習了深度學習的分類問題,其目標是通過學習輸入的訓練數據和標簽,來學習兩者之間的關系,這是典型的監督學習。
機器學習算法大致可以分為四類
* 監督學習
監督學習將輸入的樣本數據映射到標注的標記,是目前最常見的機器學習類型。
目前廣受關注的深度學習幾乎都屬於監督學習,例如光學字符識別、語音識別、圖像分類、語言翻譯。
監督學習主要包括分類和回歸,但是有很多變體,例如序列生成、語法樹預測、目標檢測、圖像分割等。
現實中的業務場景都是有明確的業務目標的,也就是錯綜復雜的原始數據,都是有最終的業務目標的,也就是數據之間會有比較明確的關系;
* 無監督學習
無監督學習是在沒有標記數據的情況下尋找輸入數據的有趣變換,其目標在於數據可視化、數據壓縮或者更好的理解數據的相關性。
降維和聚類是無監督學習的方法。
* 自監督學習
自監督學習是監督學習的一個特例;
自監督學習通常使用啟發式算法從輸入數據中自動生成標簽;
自編碼器的輸出未經修改的輸入,也就是以輸入作為監督;
預測視頻的下一幀及預測文本下一個詞也是自監督學習,它們將未來的輸入作為監督;
自監督學習通過將訓練數據的一部分作為監督的目標,來自動的學習數據之間的關聯關系,避免了人為標注的干預,有利於完成沒有標記的大量數據的訓練;
* 強化學習
在強化學習中,智能體接收環境有關信息,並學會選擇使某種獎勵最大化的的行動;
強化學習處於發展期,成熟的應用不多,但是潛力很大,例如自動駕駛、機器人、教育等領域;
二、機器學習模型評估
機器學習的目的是得到可以泛化的模型,但是隨着訓練的進行,模型在訓練數據上的准確性不斷的提高,就存在過擬合問題,導致模型在未知數據上的預測能力變差。
評估機器學習模型的重點是將數據划分為訓練集、驗證集、測試集,在訓練集上訓練模型,在驗證集上評估模型,一旦找到最佳參數后就在測試集上測試模型。
將數據集划分為三個集合的原因跟機器學習的特點緊密相關
模型的訓練過程中,我們需要不斷的調整模型的配置來改善模型的性能,同時結合模型在驗證集上的性能作為反饋信號來獲得最佳的模型,那么這個模型在訓練集上很容易產生過擬合的問題,
同理在驗證集上也很容易產生過擬合問題,所以還需要使用測試集進行模型的評估來保證在模型在未知數據上的預測能力。
對訓練數據集的划分,可以采用以下三種方法進行划分
簡單留出驗證
留出一定比例的數據作為測試集和測試集,然后在訓練集中留出一部分作為驗證集。此方法比較簡單,但是如果遇到數據量比較少的情況,就需要使用下邊兩種方法了。
K折驗證
K折驗證將數據划分為大小相同的K個分區。依次選擇分區i作為測試集,在剩余的K-1個分區作為訓練集,最終計算K個分數的平均值。
帶有打亂數據的重復K折驗證
如果在較少可用數據的情況下,盡可能可能精確地評估模型,我們可以使用帶有打亂數據的重復K折驗證。具體做法是多次使用K折驗證,在每次將數據划分為K個分區之前都先將數據打亂。最終分數是每次K折驗證分數的平均值。注意,這種方法一共要訓練和評估P×K個模型(P是重復次數),計算代價很大。
進行數據划分是需要注意以下幾點
盡量避免每個數據集只包含局部數據,尤其是有排序的數據要隨機打亂,確保各個數據集都可以反應整體的數據樣本分布;
對於通過過去預測未來的情況,例如天氣預報、股市走勢等,需要確保測試集數據要晚於訓練集數據;
為了提高模型的准確行,要避免訓練集和測試集包含相同的數據;
三、數據處理
在將數據輸入到神經網絡之前,必須對數據進行預處理來適應神經網絡對輸入數據的要求,其中包括向量化、值標准化、處理缺失值、特征提取。
無論什么類型的數據,都需要進行向量化將輸入和目標轉化為張量。
為了避免取值相對較大的數據或異質數據輸入神經網絡,導致網絡無法收斂,需要對數據進行標准化。標准化之后,數據大部分值都應該在0-1的范圍內,同時所有特征的取值都應該在大致相同的范圍內。
如果數據有缺失值,就需要格式化缺失值,一般來說會將缺失值設置為0。如果數據有缺失值,那么各個數據集都應該包含有缺失值的樣本。
特征工程(feature engineering)是指將數據輸入模型之前,利用你自己關於數據和機器學習算法(這里指神經網絡)的知識對數據進行硬編碼的變換(不是模型學到的),以改善模型的效果。多數情況下,一個機器學習模型無法從完全任意的數據中進行學習。呈現給模型的數據應該便於模型進行學習。
特征工程的本質:用更簡單的方式表述問題,從而使問題變得更容易。它通常需要深入理解問題。
良好的特征可以讓我們用更少的資源更少的數據更優雅地解決問題。
四、過擬合
隨着訓練過程和優化的不斷深入,模型會不斷的學習到訓練數據更多的特征,最終必然會導致模型的過擬合問題,從而導致模型在未知數據上的泛化能力的不佳。為了獲得一個可以更好預測未知數據的最佳模型,我們需要在優化和泛化之間需求一個最優的平衡點。
為了防止過擬合的最優方法是獲取更多的訓練數據,從統計學上來看,越多的數據越可以更好的反應數據的分布規律,自然就提高了模型的泛化能力。而在現實的情況中,往往是在訓練數據確定並且已經產生過擬合的情況下,自然是模型記住了太多的訓練數據的自有特征,導致模型泛化能力減弱只能識別訓練數據的尷尬,所以需要降低模型記錄的信息量。
減小網絡規模
深度網絡的層數和參數的多少,直接反映了模型可記憶數據信息的能力,理論上來說,層數或者參數越多,模型的學習能力越強,但是為了獲得一個更好的模型,需要在層數及參數的過多和過少之間尋求一個平衡。一般開始的時候選擇一個相對較少的層數和參數,隨着訓練過程不斷的增加層數和參數,直到這種增加對驗證損失的影響很小。
添加權重正則化
一種常見的降低過擬合的方法就是強制讓模型權重只能取較小的值,從而限制模型的復雜度,這使得權重值的分布更加規則(regular)。這種方法叫作權重正則化(weightregularization),其實現方法是向網絡損失函數中添加與較大權重值相關的成本(cost)。這里常用的有L1、L2正則化。
添加dropout正則化
在訓練過程中Dropout不再依賴特定的神經元,使得神經網絡難以記憶輸入/輸出對。這促使神經網絡學習通用、魯棒的特征,而不是學習一次性、特定的東西來對應訓練的實例。
五、機器學習開發流程
定義問題
我們使用機器學習解決問題基於的假設,所以我們需要明確了輸入輸出以及所使用的數據,方便定義需要解決的問題和模型。
已有的數據需要足夠豐富並且可以用來預測輸出
訓練數據承載的規律在過去和未來都是相同的
選擇評價指標
對於平衡分類問題(每個類別的可能性相同),使用精度和接收者操作特征曲線下面積作為指標。
對於類別不平衡的問題,可以使用准確率和召回率。
對於排序問題或多標簽分類,可以使用平均准確率均值。
確定評估方法
留出驗證集。數據量很大時可以采用這種方法。
K折交叉驗證。如果留出驗證的樣本量太少,無法保證可靠性,那么應該選擇這種方法。
重復的K折驗證。如果可用的數據很少,同時模型評估又需要非常准確,那么應該使用這種方法。
數據預處理
格式化輸入數據為張量。
張量的取值通常應該縮放為較小的值,比如在[-1, 1]區間或[0, 1]區間。
針對不同特征不同取值范圍的數據進行標准化。
針對小數據問題做特征工程。
確認模型
計算的模型必須比純隨機的概率要高才行,否則就是我們基於的假設訓練數據出了問題。
根據實際要處理的問題來確定最后一層的激活函數、損失函數、優化器等。
訓練模型
通過調整網絡的層數、參數及訓練的輪次,時刻檢測訓練損失和驗證損失,尋找欠擬合和過擬合的折中點。
調整模型
通過不斷的調整模型及添加正則化、dropout、特征工程等並進行訓練最終得到理想的可用於生產環境的模型。