從業這麼久了,作了不少項目,一直對機器學習的基礎課程鄙視已久,如今回頭看來,系統的基礎知識整理對我如今思路的整理頗有利,寫完這個基礎篇,開始把AI+cv的也總結完,而後把這麼多年作的項目再寫好總結。算法
學習路線
第一步:數學
主要爲微積分、機率統計、矩陣、凸優化
第二步:數據結構/算法
常見經典數據結構(好比字符串、數組、鏈表、樹、圖等)、算法(好比查找、排序)
同時,輔助刷leetcode,提升編碼coding能力
第三步:Python數據分析
掌握Python這門語言、和基本的數據分析、數據處理知識
第四步:機器學習
掌握常見經典的模型/算法(好比迴歸、決策樹、SVM、EM、K近鄰、貝葉斯、主題模型、機率圖模型,及特徵處理、模型選擇、模型選擇等等)
同時,輔助刷kaggle,培養對數據、特徵的敏銳
第五步:深度學習
掌握神經網絡、CNN、RNN、LSTM等常見經典模型、以及三大DL框架
同時,配套課程利用TensorFlow等開源框架作作DL等相關實驗:http://blog.csdn.net/v_JULY_v/ ... 61301
第六步:CV應用擴展數組
幾個基礎的概念:網絡
一個機器學習一般應該包括的基本要素有:訓練數據,帶參數的模型,損失函數,訓練算法。訓練數據做用自沒必要說;帶參數的模型是用來逼近f();損失函數是衡量模型優劣的一個指標,好比模型識別分類的準確度;訓練算法也能夠叫作優化函數,用於不斷更新模型的參數來最小化損失函數,獲得一個較好的模型,或者叫作學習機。接下來將介紹一些機器學習中的基本概念,可能沒有很強的連貫性。數據結構
樣本數據
樣本數據就是咱們上文提到的(x,y),其中x叫作輸入數據(input data),y叫作輸出數據(output data)或者叫作一個更加專業的名字——標籤(label)。一般x和y都是高維矩陣,以x爲例:
框架
其中xi表示第i個輸入樣本,好比第i個文字,第i張圖片,xi能夠是一維文字向量,二維圖片矩陣,三維視頻矩陣,或者更加高維的數據類型,以一維向量爲例:
機器學習
其中xni表示xi數據的第n個元素的值,好比把圖像展平以後第n個像素的灰度值等等。
標籤y根據需求不一樣有各類形式,以最簡單的n分類問題爲例,yi就是一個n維的one-hot,其中一個值爲1,其他的元素都爲0,第幾個元素爲1就代表屬於第幾個類別。函數
數據集
完整的數據集表示爲T={(x1,y1),(x2,y2),(x2,y2),...,(xi,yi)},對於一個學習機而言,不是全部的數據都用於訓練學習模型,而是會被分爲三個部分:訓練數據、交叉驗證數據、測試數據。工具
- 訓練數據(training data):顧名思義,訓練數據用於訓練學習模型,一般比例不低於總數據量的一半。
- 交叉驗證數據(cross validation data):交叉驗證數據用於衡量訓練過程當中模型的好壞,由於機器學習算法大部分都不是經過解析法獲得的,而是經過不斷迭代來慢慢優化模型,因此交叉驗證數據就能夠用來監視模型訓練時候的性能變化。
- 測試數據(testing data):在模型訓練好了以後,測試數據用於衡量最終模型的性能好壞,這也是模型性能好壞的衡量指標,交叉驗證的指標只能用於監視和輔助模型訓練,不能用來表明模型好壞,因此哪怕交叉驗證的準確度是100%而測試數據的準確度是10%,那麼模型也是不能被承認的。一般交叉驗證和測試數據的比例各佔一小半。
特徵
特徵是機器學習和模式識別領域一個比較特有的名詞,在傳統機器學習算法中,因爲計算性能和參數的限制,因此輸入的數據維數不能過高。咱們手機隨隨便便一張照片就有幾個MB的數據量,可能會有幾百萬個像素,這麼高維的數據量咱們是不能直接輸入給學習機的,所以咱們須要針對特別的應用提取相對應的特徵向量,特徵向量的做用主要有兩個:性能
- 下降數據維度:經過提取特徵向量,把原始數據的維度大大較低,簡化模型的參數數量。
- 提高模型性能:一個好的特徵,能夠提早把原始數據最關鍵的部分提取出來,所以能夠提升學習機的性能。
在傳統的機器學習領域,如何提取一個好的特徵是你們最關心的,因此機器學習的研究很大程度變成了尋找好的特徵,所以也誕生了一個學科叫作特徵工程。如下是一個用hog特徵進行行人檢測的例子,hog特徵主要是檢測物體的輪廓信息,因此能夠用於行人檢測。
模型
這裏的模型可能用詞不許確,但我想表達的是指:帶有一些待訓練參數,用於逼近前文提到的f()的參數集合。在參數空間,f()只是一個點,而我提到的模型也是一個點,而且因爲參數能夠變,因此我要作的只是讓我模型的這個點儘量的接近真實f()的那個點。機器學習的模型算法有不少,可是比較經常使用的模型能夠歸納爲三種:
- 基於網絡的模型:最典型的就是神經網絡,模型有若干層,每一層都有若干個節點,每兩個節點之間都有一個能夠改變的參數,經過大量非線性的神經元,神經網絡就能夠逼近任何函數。
- 基於核方法的模型:典型的是SVM和gaussian process,SVM把輸入向量經過一個核映射到高維空間,而後找到幾個超平面把數據分紅若干個類別,SVM的核是能夠調整。
- 基於統計學習的模型:最簡單的例子就是貝葉斯學習機,統計學習方法是利用數理統計的數學工具來實現學習機的訓練,一般模型中的參數是一些均值方差等統計特徵,最終使得預測正確機率的指望達到最大。
一個好的學習機模型應該擁有出色的表達逼近能力、易編程實現、參數易訓練等特性。
監督與非監督學習
按照任務的不一樣,學習機能夠分爲監督學習(supervised learning)和非監督學習(unsupervised)兩種,從數學角度來看二者的區別在於前者知道數據的標籤y然後者不知道樣本的標籤y,因此非監督學習的難度要大一點。
舉個通俗的例子,一個母親交孩子認識數字,當母親拿到一個數字卡片,告訴孩子這個是數字4是數字6,而後通過大量的教導以後,當目前拿到一個卡片問孩子這個是數字幾,這個就是監督學習。若是母親那一堆數字卡片,讓孩子把卡片按照不一樣數字進行分堆,母親告訴孩子他分的好很差,可能通過大量的訓練,孩子就知道如何把卡片進行正確分堆了,這個就是無監督學習的例子。用一個不那麼貼切的名詞解釋就是,監督學習能夠看作分類問題,而無監督能夠看作是聚類的問題。
固然還有兩種特殊的類型,叫作半監督學習和強化學習,半監督學習是指部分樣本是知道標籤的,可是其餘的樣本是不知道標籤。強化學習是另一個特例,爲了避免混淆你們理解,這裏不作解釋,感興趣的能夠自行查閱,以後我會單獨經過一篇博客來介紹。
監督學習是簡單高效的,可是非監督學習是更加有用的,由於人工標註樣本標籤的代價是很是昂貴耗時的。
損失函數
損失函數(loss function)更嚴謹地講應該叫作目標函數,由於在統計學習中有一種目標函數是最大化預測正確的指望機率,咱們這裏只考慮常見的損失函數。
損失函數是用來近似衡量模型好壞的一個很重要的指標,損失函數的值越大說明模型預測偏差越大,因此咱們要作的就是不斷更新模型的參數,使得損失函數的值最小。經常使用的損失函數有不少,最簡單的如0-1損失函數:
這個損失函數很好理解,預測對了損失爲0,預測錯了就爲1,因此最完美的學習機的損失函數值就應該是0。固然最小二乘偏差、交叉熵偏差等損失函數也是很經常使用的,訓練時用的損失函數是全部訓練樣本數據的損失值的和。有了損失函數,模型的訓練就變成了一個很典型的優化問題。
優化函數
咱們又了目標函數,也就是損失函數,如今我須要一個東西根據損失值來不斷更新模型參數,這個東西就叫作優化函數。優化函數的做用就是在參數空間找到損失函數的最優解。梯度降低法是最熟知的優化函數,你們都用下山來形象描述這個算法。假如咱們在山上,咱們的目標是找到這座山的最低處(最小化損失函數),一個很簡單的思路就是我找到當前位置下山角度最大的方向,而後朝着這個方向走,以下圖所示
固然這種方法有個問題就是會陷入局部最優勢(局部凹坑)出不來,因此各類更加好的優化函數逐漸被你們發現。一個好的優化函數應該有兩個性能指標:擁有跳出局部最優解找到全局最優解的能力;擁有更快的收斂速度。
泛化能力、欠擬合和過擬合
泛化能力(generalization ability)是指機器學習模型對未知數據的預測能力,是學習方法本質上重要的性質,現實中採用最多的辦法是經過偏差來評價學習方法的泛化能力。可是這種評價是依賴測試數據集的,由於測試數據集是有限的,因此這種思路也不能說是徹底靠譜,所以有人專門研究泛化偏差來更好的表達泛化能力。
欠擬合(underfitting)和過擬合(overfitting)是兩種要儘量避免的模型訓練現象,出現這兩種現象就說明模型沒有達到一個比較理想的泛化能力。欠擬合是指模型複雜度過低,使得模型能表達的泛化能力不夠,對測試樣本和訓練樣本都沒有很好的預測性能。過擬合則相反,是模型複雜度過高,使得模型對訓練樣本有很好的預測性能,可是對測試樣本的預測性能不好,最終泛化能力也不行。以下圖所示,1和4展現的欠擬合,3和6展現的過擬合現象。而一個好的模型應該是如2和5同樣,複雜度正合適,泛化能力較強。
欠擬合與過擬合
1.欠擬合:生成的擬合函數過於簡單(例如 h(θ)=θ0+θ1x1)
2.過擬合:生產的擬合函數過於精確(例如h(θ)=θ0+θ1x1+...+θ6x6)
上圖中,左圖就是欠擬合的狀況,曲線不可以很好的反映出數據的變化趨勢;而右圖是過擬合的狀況,由於曲線通過了每個樣本點,雖然在訓練集上偏差小了,可是曲線的波動很大,每每在測試集上會有很大的偏差。而中間圖則是比較好的曲線。
當訓練數據量不多時,容易發生過擬合,由於曲線會擬合這些少許數據點,而這些數據點每每不能表明數據的整體趨勢,致使曲線波動大以及發生嚴重偏離。
欠擬合時,模型在訓練集和測試集上都有很大偏差(高誤差);過擬合時,模型在訓練集上可能偏差很小,可是在測試集上偏差很大(高方差)。若是模型在訓練集上偏差很大,且在測試集上的偏差要更大的多,那麼該模型同時有着高誤差和高方差。
防止欠擬合方法:不要選用過於簡單的模型
防止過擬合方法:不要選用過於複雜的模型;數據集擴增(能夠是尋找更多的訓練集,也能夠是對原訓練集作處理,好比對原圖片翻轉縮放裁剪等);正則化;Early stopping(在測試集上的偏差率降到最低就中止訓練,而不是不斷下降在訓練集上的偏差)
L1正則化和L2正則化
L1正則化:在偏差函數的基礎上增長L1正則項:
L2正則化:在偏差函數的基礎上增長L2正則項:
L1正則化和L2正則化都可以防止過擬合。簡單的來講,權值w越小,模型的複雜度越低(當w全爲0時模型最簡單),對數據的擬合剛恰好(也就是奧卡姆剃刀法則)。若是從更加數學的解釋來看,咱們看下圖:
能夠看出,過擬合的時候,曲線要顧及每個點,最終造成的擬合函數波動很大。這就意味着函數在某些小區間裏的導數值(絕對值)很是大。而因爲自變量值可大可小,因此只有係數足夠大,才能保證導數值很大。
L1正則化對應着Lasso迴歸模型,L2正則化對應着嶺迴歸模型。Lasso(L1正則化)獲得的w每每比較稀疏,會出現不少0,所以可以剔除無用特徵(降維)。
分類和迴歸
分類:輸入新樣本特徵,輸出類別(離散)。常見模型有:Logistic迴歸,softmax迴歸,因子分解機,支持向量機,決策樹,隨機森林,BP神經網絡,等等
迴歸:輸入新樣本特徵,輸出預測值(連續)。常見模型有:線性迴歸,嶺迴歸,Lasso迴歸,CART樹迴歸,等等
參數學習算法和非參數學習算法
參數學習算法:模型有固定的參數列表θ0,θ1...(好比線性迴歸)
非參數學習算法:模型中參數的數目會隨着訓練集的增長而線性增加,或者參數的值會隨着測試集的變化而變化(好比局部加權迴歸LWR就屬於非參數學習算法)
誤差和方差
誤差:描述的是預測值(估計值)的指望與真實值之間的差距。誤差越大,越偏離真實數據。 高誤差對應的是欠擬合。高誤差時,模型在訓練集和測試機上都有很大偏差。
方差:描述的是預測值的變化範圍,離散程度,也就是離其指望值的距離。方差越大,數據的分佈越分散。 高方差對應的是過擬合。高方差時,模型在訓練集上的偏差很小,可是在測試集上的偏差很大。
若是模型在訓練集上偏差很大,且在測試集上的偏差要更大的多,那麼該模型同時有着高誤差和高方差。
監督學習和無監督學習
監督學習:訓練集中的每一個樣本既有特徵向量x,也有標籤y。根據樣本的y來對模型進行「監督」,調整模型的參數。監督學習對應的是分類和迴歸算法。
無監督學習:訓練集中的每一個樣本只有特徵向量x,沒有標籤y。根據樣本之間的類似程度和彙集分佈來對樣本進行聚類。無監督學習對應的是聚類算法。
分類和聚類
分類:事先定義好了類別,類別數不變。當訓練好分類器後,輸入一個樣本,輸出所屬的分類。分類模型是有監督。
聚類:事先沒有定義類別標籤,須要咱們根據某種規則(好比距離近的屬於一類)將數據樣本分爲多個類,也就是找出所謂的隱含類別標籤。聚類模型是無監督的。
判別模型和生成模型
判別模型:由數據直接學習決策函數Y=f(X)或者條件機率分佈P(Y|X)做爲預測的模型,即判別模型。
生成模型:由數據學習聯合機率密度分佈P(X,Y),而後求出條件機率分佈P(Y|X)做爲預測的模型,即生成模型:P(Y|X)= P(X,Y)/ P(X)。
歸一化與標準化
歸一化方法:
- 把數變爲(0,1)之間的小數
主要是爲了數據處理方便提出來的,把數據映射到0~1範圍以內處理,更加便捷快速。
- 把有量綱表達式變爲無量綱表達式
歸一化是一種簡化計算的方式,即將有量綱的表達式,通過變換,化爲無量綱的表達式,成爲純量。
標準化方法:
-
數據的標準化是將數據按比例縮放,使之落入一個小的特定區間。因爲信用指標體系的各個指標度量單位是不一樣的,爲了可以將指標參與評價計算,須要對指標進行規範化處理,經過函數變換將其數值映射到某個數值區間。
歸一化,通常的方法是 (x-min(x))/(max(x)-min(x)) 。 標準化,通常方法是(x-mean(x))/std(x) 。 其中mean(x)表明樣本均值,std(x)表明樣本標準差。這兩種方法都是屬於線性轉換,都是按比例縮放的。
歸一化和標準化的好處:
- 歸一化的依據很是簡單,不一樣變量每每量綱不一樣,歸一化能夠消除量綱對最終結果的影響,使不一樣變量具備可比性。好比兩我的體重差10KG,身高差0.02M,在衡量兩我的的差異時體重的差距會把身高的差距徹底掩蓋,歸一化以後就不會有這樣的問題。
- 標準化的原理比較複雜,它表示的是原始值與均值之間差多少個標準差,是一個相對值,因此也有去除量綱的功效。同時,它還帶來兩個附加的好處:均值爲0,標準差爲1。
協方差和相關係數
協方差:表示兩個變量在變化過程當中的變化趨勢類似程度,或者說是相關程度。
當X增大Y也增大時,說明兩變量是同向變化的,這時協方差就是正的;當X增大Y卻減少時,說明兩個變量是反向變化的,這時x協方差就是負的。協方差越大,說明同向程度越高;協方差越小,說明反向程度越高。
相關係數:也表示兩個變量在變化過程當中的變化類似程度。可是進行了歸一化,剔除了變化幅度數值大小的的影響,僅單純反映了每單位變化時的類似程度。
翻譯一下:相關係數就是協方差分別除以X的標準差和Y的標準差。
當相關係數爲1時,兩個變量正向類似度最大,即X變大一倍,Y也變大一倍;當相關係數爲0時,兩個變量的變化過程徹底沒有類似度;當相關係數爲-1時,兩個變量的負向類似度最大,即X變大一倍,Y縮小一倍。
誤差,偏差和方差
Bias(誤差),Error(偏差),和Variance(方差)三者是容易混淆的概念,首先
Error反映的是整個模型的準確度,Bias反映的是模型在樣本上的輸出與真實值之間的偏差,即模型自己的精準度,Variance反映的是模型每一次輸出結果與模型輸出指望之間的偏差,即模型的穩定性。以下圖所示,隨着模型的複雜度增長,模型預測的誤差會愈來愈小,可是方差愈來愈大,預測結果的分佈會散開來。
機器學習和深度學習
目前所說的深度學習一般是指基於神經網絡改進的深度學習網絡,相比於傳統的神經網絡,深度學習網絡擁有更加高的模型複雜度,因此能夠直接把原始數據輸入到學習機,不須要人工提取特徵。因此若是不從數理角度考慮,傳統機器學習和深度學習的最本質區別在於,深度學習擁有訓練高複雜度模型能力,因此能夠不用人工提取特徵,即
深度學習=人工提取特徵+傳統機器學習方法