Andrew 機器學習課程筆記
完成 Andrew 的課程結束至今已有一段時間,課程介紹深刻淺出,很好的解釋了模型的基本原理以及應用。在我看來這是個很好的入門視頻,他老人家如今又出了一門 deep learning 的教程,雖然介紹的內容很淺,畢竟針對大部分初學者。無論學習到什麼程度,能將課程跟一遍,或多或少會對知識體系的全貌有一個大體的理解。若是有時間的話,強烈建議跟完課程的同時完成各項做業。但值得注意的是,機器學習除了須要適當的數理基礎以外,仍是一門實踐科學,只有經過不斷的深刻積累纔能有更好的成長。html
本文僅是對自身學習的一個 log,總結的順序有所調整,其中也加入了本身的一些總結與思考。本想在此基礎上進行更多的擴展,但越想發現內容越多,彷佛不是一篇博文能容納的,這或許要在之後分章節深刻。既然是日記,仍是點到爲止就好,要否則就沒辦法寫完了。python
筆記連接,每一個小結前面都有一個總結概述。git
目錄
Supervised Learninggithub
Unsupervised Learningweb
Application算法
Introduction
機器學習的定義
機器學習的定義,我以爲仍是 Tom Mitchell 的表述很到位:網絡
"Well-posed Learning Problem: A computer program is said to learn from experience E with respect to some task T and some performance P, if its performance on T, as measured by P, improves with experience E".多線程
以垃圾郵件分類爲例:
T : 基於郵件的內容,將郵件分爲垃圾郵件(1)和 正常郵件(0)。這是一個典型的二分類問題。
E : 歷史數據,每一個實例能夠是 [text, label] 這樣的元組,而 label = 1 or 0。
P : 被分正確的實例佔總實例的比例,accuracyapp
也就是說,在抽象一個實際問題時,咱們要弄明白任務(T)是什麼,要調研好咱們是否有足夠的 Experience 來供模型進行學習,最後還要選擇好的 matrics 來評價你當前模型的好壞。dom
其實這和咱們人類學習的過程是相似的,咱們總以某種目的去完成某個學習任務(T),此過程當中咱們能夠經過一些歷史的經驗(E,看書或從老師那裏獲取經驗性的知識),對於紛繁複雜的信息咱們須要有必定的判別能力(P)去度量咱們當前的學習狀況。
課程的主要內容
- 監督學習(supervised learning)(有 label,ground truth)
- 分類(classification):label 是離散的 (垃圾郵件分類)
- 迴歸(regression):label 是連續的 (房價預測)
- 非監督學習(unsupervised learning)
- 聚類(clustering)
- 降維(dimensionality reduction)
- 異常檢測(anomaly detection)
- 其餘話題:推薦系統,大規模機器學習任務的並行
- 一些關於模型選擇或參數選擇的經驗介紹
課程最開始以線性迴歸解決房價預測問題爲切入點,介紹了經常使用的監督學習方法(linear regression,logistic regression,svm,neural network),中間還穿插了優化方法(主要是 gradient decent)以及模型選擇和調優的一些經驗性建議(欠擬合/過擬合問題的發現和解決,模型選擇,參數選擇技巧等)。接下來過渡到非監督學習,每一個話題列舉了一個經常使用的算法,聚類(k-means),降維(PCA),異常檢測(density estimation)。在介紹各算法過程當中,不只介紹了基本原理,還適當介紹了算法的優缺點,適用場景,關鍵參數選擇等。
最後基於業界很火的商業介紹了幾個方向上的應用,好比推薦系統。以 OCR 爲例探討了如何運用機器學習解決實際問題。還討論了大規模數據中的優化問題(map-reduce)。
supervised learning
02. linear regression
核心思想:每一個實例能夠當作<features, y> 這樣的一個向量,簡單的線性迴歸就是直接構建多個 feature 和目標 y 的線性關係,權重直接表示了 feature 的重要性,此外還有一個殘差項/常數項 bias。基於此升級獲得多元迴歸,這裏主要是對 features 進行處理,對已有的 feature 進行更復雜的組合。
典型的例子:房價預測
線性迴歸:y = w1*x1 + ... + wm*xm + bias
多元迴歸:y = w1*x1 + w2*x2 + w3*x1*x2 (除了單個變量的係數以外,還有變量間的相互做用,實際上變量間的相互做用能夠看做是新生成的特徵)
loss function: 偏差平方和
求解方法:梯度降低,最小二乘法
python regression tutorial 很好的介紹了經常使用的線性迴歸模型
03. Logistic regression
LR 是廣義線性模型,用以解決二分類問題。目標是在空間中找到一個決策平面將兩個不一樣類別的實例分開,其核心是在決策邊界上經過 sigmoid 函數將 [-inf,inf] 的區間映射到 [0,1] 範圍內,能夠看做直接對後驗機率的估計,這一性質在不少場景中頗有用,好比在點擊率預估的應用中,LR 的輸出能夠直接表達爲點擊機率。
LR 的 loss function 能夠經過二項分佈結合最大似然推倒而得,同時也是交叉熵的特例。在實際優化過程當中每每還會加上 L1 或 L2 正則。
LR 解決的是二分類問題,一般採用 one-vs-all 的方式來解決多分類問題。對於 k 個類,咱們須要 k 個分類器,每一個分類器的對應一個類的識別,預測時將 k 個輸出中最大值對應的類標做爲預測結果。
- 優化方法:GD,或高級的優化算法
- 優勢:廣義線性模型,權重直接反應 feature 的重要性,可解釋性好;輸出爲機率值,在不少應用場景頗有用;sigmoid 函數到處可導,擁有很好的數學性質;容易實現,容易並行,效率高。
- 缺點:廣義線性模型,須要不少特徵工程,適用於大規模離散數據,由於離散後的高維空間中更容易找到線性可分的分類面。
很受工業界歡迎。
- 一些典型的應用:
- Email: Spam / Not Spam
- Online Transactions : Fraudulent (Yes/No)
- Tumor : Malignant / Benign
- 點擊率預估: click or not
04. Neural Network
神經網絡是一種類人腦的設計,在人腦中神經元之間經過突觸進行鏈接。當人的某個部位受到刺激以後,就會沿着這樣鏈接起來的神經元進行信號的傳遞,一個神經元接收來自多個神經元的信號做爲輸入,只有當這些信號的累計值超過某一個閾值時,當前的神經元纔會興奮。
由此可獲得神經網絡中的關鍵組件:
- neurons(神經元)
- activation (激活函數)
- bias / threshold (控制是否興奮的閾值)
- layer
- input layer (輸入層)
- hidden layer (隱藏層,能夠有多層,神經元帶有 activation function)
- out put layer :全鏈接層,對於多分類問題可使用 one-hot-vector 編碼,即對於 k 個類,可使用 k 個值的向量,預測的類對應的元素爲 1, 其餘位爲 0。還可使用 one-vs-all。
神經網絡在 80 到 90 年代早期獲得普遍的應用,以後因爲深層網絡優化困難而一度沉寂。後來在反向傳播這樣的有效優化算法出來後又再次復甦。神經網絡的層層鏈接,至關於函數的層層嵌套,整合起來就是一個複雜的非線性函數,具備很強大的學習能力,從理論上來講任何一個問題均可以被一個或多個這樣的函數逼近。值得注意的是,學習能力強大的同時致使了容易過擬合的問題。
簡單的例子:
- AND, OR 函數能夠經過一層神經網絡進行構造 (至關於感知機)
- XOR 須要兩層
神經網絡的訓練:
- 隨機初始值(最好多嘗試幾組)
- 執行前向傳播(forward propagation),計算預測值
- 計算預測值和 ground truth 的差別獲得偏差
- 執行反向傳播(backpropagation),將錯誤反向傳播,達到減少偏差的目的
- 注意:
- 檢查 GD 的正確性,可使用數值解來校驗近似解(驗證之後注意將數值解部分的代碼註釋掉)
- 使用 GD 或高級的優化方法經過反向傳播優化模型
05. SVM
SVM 有一套完整的嚴格的理論支持,在實際中獲得普遍應用,常常和Logistic regression 一塊兒出現。這裏只作一個直觀性的總結。SVM 的基本型是解決以下圖的線性可分問題,即找到一個分類平面使得兩個類別之間的 margin 最大化,margin 是支持向量間的距離,即結構風險最小化。其中支持向量(support vector)是那些落在距離決策平面距離爲 +/-1 的面上的點。
核技巧是 SVM 的一個關鍵技術。引入核技巧解決非線性可分問題,即將線性不可分問題的樣本空間映射到映射到高維空間中,在高維空間中更容易找到線性可分的分類面。
在應用方面。線性可分的狀況下使用 linear svm。非線性可分的狀況下,通常使用 Gaussian 核,還有其餘的核函數,String kernel, chi-square kernel, histogram intersection kernel 能夠嘗試。
訓練過程當中涉及的重要參數(一般使用 cross-validation 來進行參數選擇):
- C : 懲罰因子,是咱們常說的 regularization parameter 的倒數 (1/lamda),其值越大越容易過擬合
- 核函數和核參數的選擇
優化算法:SMO(Sequential Minimal Optimization)
對噪聲敏感,如何解決過擬合問題?
- noise: 加入鬆弛變量,在必定程度上允許錯誤的存在
- 使用 cross-validation 選擇合適的參數
標準型的 SVM 只針對二分類問題,解決多分類問題須要進一步調整,常常用的是 on-vs-all 的建模方式:
對於迴歸問題可使用 SVR。
06. some advice
對模型進行診斷和fine tune 每每是個耗時的過程,但倒是一個必須和有效的過程。
梯度降低(GD)優化算法
- gradient descendent
- 梯度的反方向是函數減少最大的方向
- loss function 對各個參數求偏導獲得梯度
- 參數初始化
- 參數沿着梯度的反方向,以某一個學習率迭代更新直到收斂
- 注意:
- 變量的規範化,加快 GD
- 注意 loss 隨着迭代的次數不增(plot 圖檢查訓練過程是否正確)
- 可調參數有:初始值,學習率,迭代更新的方式(batch, minibatch, stochastic)
- 其餘高級的優化方法有:BFGS, L-BFGS, Conjugate
- GD:
- batch GD : 每次迭代都使用完全部數據
- stochastic GD (SGD) : 每次迭代只須要一個實例
- 高效
- 崎嶇的往最優值逼近,可能存在收斂問題,能夠隨着時間逐漸減少學習率以保證最後收斂
- mini-batch GD : 介於 batch GD 和 SGD 之間,每次使用 b 個實例構成的小數據集
- checking for convergence
- 做圖,error vs number of iteration,偏差隨着迭代次數是不增函數
- Note: for SGD, error should be a mean error during a time section
欠擬合(underfitting) vs 過擬合(overffiting)
機器學習其實是求解 NP 問題近似解的過程,咱們總在以某種方式去逼近最優解。這個逼近的過程會產生兩個問題:underfitting(欠擬合) 和 overfitting(過擬合)。欠擬合是指模型的學習能力太弱,沒法很好的擬合曆史數據;而過擬合恰好相反,反應了模型學習能力太強,及時是歷史數據中的微小變化(噪聲)都能被模型捕捉到,以致於模型對未知的樣例預測能力很弱,即泛化能力差。
欠擬合的問題比較好解決,咱們能夠經過提升模型的複雜度和增長特徵等方式來提升模型的學習能力。而過擬合的問題比較麻煩,能夠說,咱們只能儘量下降過擬合的風險,卻不能絕對的避免過擬合。
欠擬合和過擬合的現象 (detection & analysis)
最小化泛化偏差是咱們最終的目的,然而真實的泛化偏差沒法被測量到,這個時候咱們一般將數據集分紅 trainning set, validation set, testing set。trainning set 用於訓練模型,validation set 用於模型選擇,而 testing set 用於測試最終模型的泛化能力。
基於這樣的數據劃分,咱們能夠經過 bias-variance analysis 來發現欠擬合和過擬合問題,進而對模型進行調整。
除此以外,咱們還能夠用學習曲線來發現問題。判斷「增長數據是否有效???」
正則化(regularization)
- 任何模型的 loss function 均可以分爲兩個部分:
- 偏差項: 衡量模型的 accuracy,即對歷史數據的擬合能力
- 正則項: 對模型的複雜程度的懲罰項,最經常使用的是 L1 和 L2 正則
- L2 : 又稱 ridge regression, 偏向於保留全部的 feature,但每一個 feature 權重較小,即你們都對目標 y 有貢獻,即便關係不大也能夠有很小的貢獻。
- L1 : 又稱 Lasso, 偏向於較少的 feature,將不太相關即全中很小的 feature 去掉,能夠進行 sparcity, feature selection.
- regularization parameter: (can be selected by cross validation)
- too large: underfitting
- too small: cann't address the overfitting problem
如何解決欠擬合問題
欠擬合的根本問題是模型的學習能力不足,這時一味的增長數據是不可行的,應該從提升模型學習能力的角度考慮。兩個方向,提升模型的複雜度或增長特徵。
- 嘗試增長特徵:
- 發現新的特徵
- 在原來的特徵上構建新的特徵(polynomial feature)
- 嘗試減少 regularization parameter (正則項是對模型複雜程度的懲罰,減少對應的闡述即提升模型的複雜程度,在必定程度上能夠認爲模型的複雜程度和模型的學習能力是成正比的)
如何解決過擬合問題
過擬合的核心問題在於模型太過於複雜,擬合能力(學習能力)太強,以致於即便數據有輕微的擾動都能被模型捕捉到,致使模型對未出現過的實例具備不好的泛化能力。思考的兩個方向:減小特徵和下降模型的複雜程度。
- 減少特徵:
- 手動選擇特徵
- 經過模型選擇算法(好比 L1 稀疏)
- 加入正則項:
- 增大 regularization parameter
- L2 保存全部的 feature,可是每一個 feature 的係數都很小,當存在不少 feature 而且每一個 feature 對目標變量都有或多或少的貢獻時。
- 獲取更多的數據(每每最有用)
對於神經網絡
一般使用 dropout 來防止過擬合,增長數據量也是一個方向。
unsupervised learning
07. Clustering
核心思想:最大化簇間距離,最小化簇內距離,將無類標數據聚成類似的幾個簇。
- 聚類的 cost funtion 是非凸的,對初始值和 k 值的選擇敏感
- 如何選擇參數:
- 嘗試多個不一樣的初始值進行訓練
- K 的選擇:
- 嘗試不一樣的K, 並做圖,K vs cost function,
- 通常 kmean 經常使用作預處理階段,能夠根據下游模型的結果來調整 K 的選擇。
- 核心思想與 EM 算法相似
- E: 估計新的中心 (hidden variable, random initialization in the beginning)
- M: maximization, <=> minimize Objective function
08. Dimensionality Reduction
PCA 是一種經常使用的降緯方法,在更低維度的空間中找到原數據的映射,並儘量保留原有數據的信息。通常可做爲模型前的特徵選擇過程使用。
- 動機:
- 對 PCA 很差的應用:
- 用於解決過擬合
- 可能有用,但!!!建議使用正則化來解決過擬合問題
- 算法描述:
- PCA:
- [U,S,V] = svd(Sigma), U_[n*n]
- U_reduce = U(1,2..,k), 1<=k<=n, n feature, z = U_reduce' * x , z_[k*1]
- Reconstruction: x = U_reduce * z
- 注意事項和建議:
- k 的選擇:決定了有多少信息可以獲得保留
- 對於 supervised learning,PCA 不只僅用於 training set,還應該用於 validating set 和 testing set
- 在使用 PCA 以前,最好在全集上進行訓練,方便評估 PCA 所起到的做用
- scale feature,使得各值之間都是可比的
- PCA != Linear regression
09. Anomaly Detection
核心思想:每一個數據集在正常狀況下都應該遵循某一未知的分佈,而異常檢測就是檢測哪些點違背了數據集隱含的分佈。咱們可使用單個高斯分佈或聯合高斯分佈對數據進行擬合,即估計數據集的隱含分佈。當某個數集明顯偏離給定的閾值時,可認爲異常發生。
- 密度估計(density estimation)
- 高斯分佈(guassian distribution)
- one variable
- multi-variable
- 參數估計(parameter estimation)
- 預測(prediction)
- calculate density for example x, p(x)
- p(x) large for normal examples
- p(x) small for anomalous examples
- 評估(evaluation)
- charateristic:
- very small number of postive examples
- larege number of negative
- many different 'types' of anomalies
- future anomalies may look nothing like any anomalous examples we've seen so far
- true positive, false positive, true negative, false negative
- precision / recall
- f-score
- 特徵選擇(choosing feature)
- non-guassian feature, (log transformation)
- error analysis
- 應用(application):
- fraud detection
- manufacturing monitor
application
10. Recommender Systems
推薦系統裏最經常使用的協同過濾算法核心思想是維護一個二維矩陣 R,行表示用戶 user,列表示物品 item,而每一個元素 R[i,j] 表示 user j 到 item i 的評分。
基於內容的推薦
- feature 是一些基於 item 的特性
- x[i],表示 item i 的分值向量,即在每一個 feature 上的得分 (已知的)
- theta[j],表示用戶 j 對每一個 feature 的關注程度 (從打分數據中學習而得)
- 那麼用戶 j 對 item i 的打分 rating[i,j] = x[i] .* theta[j]
協同過濾:
基於 CF 的類似性度量:
- user-based similarity:column[i] 和 column[j] 之間的類似性
- item-based similarity:row[i] 和 row[j] 之間的類似性
實現細節:
11. Large Scale Machine Learning
數據的做用:
每每比的不是算法,而是數據。當數據量足夠時,不一樣算法的效果趨於一致。
online learning
- shipping service website
- product search
- choosing special offers to show user
- customized selection of news articles
- product recommendation
large scale machine learning
- mini-bach
- map: divide training data and learn each part on parallel computer
- reduce: combine all error for model update
多機器 or 多線程
12. Application photo OCR
以 OCR 的應用爲例,介紹如何使用機器學習解決實際問題。
- 建模並創建一個 pipline
- for instance OCR: text detection -> character segmentation -> charater classification
- segmentation : sliding window
- win size
- classfication problem for each segmentation
- get more data
- artifical
- sythesis
- Note:
- make sure you have a low bias classification
- "how much work would it be to get 10x as much data as we currently have?"
- artificial data synthesis
- collect / label it yourself
- "crowd source"
- ceiling analysis
pipline
sliding window
get more data
一般是爲了下降過擬合的風險,若是經過對原有數據進行變換來增長數據?好比圖片中的變形。
ceiling analysis
每每一個大問題由幾個模塊構成,如何找出限制總體優化目標的局部模塊很關鍵。